diff --git a/.DS_Store b/.DS_Store index 5a41ba40..6e5220d6 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.angular/cache/14.2.11/angular-webpack/4dda6ce5f878764cd5f01978d697c7af51df34dc/0.pack b/.angular/cache/14.2.11/angular-webpack/4dda6ce5f878764cd5f01978d697c7af51df34dc/0.pack new file mode 100644 index 00000000..18058dc1 Binary files /dev/null and b/.angular/cache/14.2.11/angular-webpack/4dda6ce5f878764cd5f01978d697c7af51df34dc/0.pack differ diff --git a/.angular/cache/14.2.11/angular-webpack/4dda6ce5f878764cd5f01978d697c7af51df34dc/index.pack b/.angular/cache/14.2.11/angular-webpack/4dda6ce5f878764cd5f01978d697c7af51df34dc/index.pack new file mode 100644 index 00000000..561f9a01 Binary files /dev/null and b/.angular/cache/14.2.11/angular-webpack/4dda6ce5f878764cd5f01978d697c7af51df34dc/index.pack differ diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index e89330a6..00000000 --- a/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# Editor configuration, see https://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -max_line_length = off -trim_trailing_whitespace = false diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml deleted file mode 100644 index d7187e00..00000000 --- a/.github/workflows/node.js.yml +++ /dev/null @@ -1,28 +0,0 @@ -# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: Node.js CI - -on: - push: - branches: [master] - pull_request: - branches: [master] - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [14.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm i - - run: npm run build-prod diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a90dbb72..00000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -dist/ -.angular/ -package-lock.json \ No newline at end of file diff --git a/.runner.sh.swp b/.runner.sh.swp deleted file mode 100644 index 84201818..00000000 Binary files a/.runner.sh.swp and /dev/null differ diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 4adaab11..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "ng e2e", - "skipFiles": [ - "/**" - ], - "program": "${workspaceFolder}\\node_modules\\protractor\\bin\\protractor", - "args": [ - "${workspaceFolder}\\e2e\\protractor.conf.js" - ], - "outFiles": [ - "${workspaceFolder}/dist/out-tsc/**/*.js" - ] - }, - { - "type": "node", - "request": "launch", - "name": "ng e2e mac", - "skipFiles": [ - "/**" - ], - "program": "${workspaceFolder}/node_modules/protractor/bin/protractor", - "args": [ - "${workspaceFolder}/e2e/protractor.conf.js" - ], - "outFiles": [ - "${workspaceFolder}/dist/out-tsc/**/*.js" - ] - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 3ea9afe0..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "debug.node.autoAttach": "on" -} \ No newline at end of file diff --git a/angular.json b/angular.json deleted file mode 100644 index 779e398c..00000000 --- a/angular.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "ng-visuall": { - "root": "", - "sourceRoot": "src", - "projectType": "application", - "prefix": "app", - "schematics": {}, - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist/ng-visuall", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.app.json", - "assets": [ - "src/favicon.ico", - "src/assets", - "src/app/custom" - ], - "styles": [ - "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", - "node_modules/bootstrap/dist/css/bootstrap.min.css", - "src/styles.css", - "node_modules/cytoscape-panzoom/font-awesome-4.0.3/css/font-awesome.css", - "node_modules/cytoscape-panzoom/cytoscape.js-panzoom.css", - "node_modules/cytoscape-navigator/cytoscape.js-navigator.css", - "node_modules/cytoscape-context-menus/cytoscape-context-menus.css", - "node_modules/flatpickr/dist/flatpickr.min.css", - "node_modules/angular2-draggable/css/resizable.min.css" - ], - "scripts": [ - "node_modules/jquery/dist/jquery.js", - "node_modules/cytoscape-navigator/cytoscape-navigator.js", - "node_modules/bootstrap/dist/js/bootstrap.bundle.min.js" - ], - "aot": false, - "vendorChunk": true, - "extractLicenses": false, - "buildOptimizer": false, - "sourceMap": true, - "optimization": false, - "namedChunks": true - }, - "configurations": { - "production": { - "fileReplacements": [{ - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - }], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [{ - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" - }] - }, - "heroku": { - "fileReplacements": [{ - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.heroku.ts" - }] - } - }, - "defaultConfiguration": "" - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "ng-visuall:build" - }, - "configurations": { - "production": { - "browserTarget": "ng-visuall:build:production", - "proxyConfig": "proxy.conf.json" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "ng-visuall:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.spec.json", - "karmaConfig": "src/karma.conf.js", - "styles": [ - "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", - "src/styles.css" - ], - "scripts": [], - "assets": [ - "src/favicon.ico", - "src/assets" - ] - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" - ], - "exclude": [ - "**/node_modules/**" - ] - } - } - } - }, - "ng-visuall-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "ng-visuall:serve" - }, - "configurations": { - "production": { - "devServerTarget": "ng-visuall:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } - } - }, - "defaultProject": "ng-visuall", - "cli": { - "analytics": false - } -} diff --git a/docs/assets/.DS_Store b/assets/.DS_Store similarity index 100% rename from docs/assets/.DS_Store rename to assets/.DS_Store diff --git a/docs/assets/figure1.png b/assets/figure1.png similarity index 100% rename from docs/assets/figure1.png rename to assets/figure1.png diff --git a/docs/assets/figure3.png b/assets/figure3.png similarity index 100% rename from docs/assets/figure3.png rename to assets/figure3.png diff --git a/docs/assets/figure5.png b/assets/figure5.png similarity index 100% rename from docs/assets/figure5.png rename to assets/figure5.png diff --git a/docs/assets/figure8.png b/assets/figure8.png similarity index 100% rename from docs/assets/figure8.png rename to assets/figure8.png diff --git a/docs/assets/figure9.png b/assets/figure9.png similarity index 100% rename from docs/assets/figure9.png rename to assets/figure9.png diff --git a/docs/assets/logo.ico b/assets/logo.ico similarity index 100% rename from docs/assets/logo.ico rename to assets/logo.ico diff --git a/docs/assets/logo.png b/assets/logo.png similarity index 100% rename from docs/assets/logo.png rename to assets/logo.png diff --git a/docs/assets/logo.svg b/assets/logo.svg similarity index 100% rename from docs/assets/logo.svg rename to assets/logo.svg diff --git a/autopull.sh b/autopull.sh deleted file mode 100755 index 1d991b84..00000000 --- a/autopull.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/expect -# execute git pull and then enter username, personel access token using 'expect' -spawn ./gitpull.sh -expect -exact "Username for 'https://github.com': " -send -- "laramerdol\r" -expect -exact "Password for 'https://laramerdol@github.com':" -send -- "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\r" -expect eof diff --git a/autopull.sh.save b/autopull.sh.save deleted file mode 100755 index 21f03440..00000000 --- a/autopull.sh.save +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/sh -# execute git pull and then enter username, personel access token using 'expect' -spawn ./gitpull.sh -expect -exact "Username for 'https://github.com': " -send -- "laramerdol\r" -expect -exact "Password for 'https://laramerdol@github.com':" -send -- "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\r" -expect eof diff --git a/autopull.sh.save.1 b/autopull.sh.save.1 deleted file mode 100644 index 33122c98..00000000 --- a/autopull.sh.save.1 +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/expect -# execute git pull and then enter username, personel access token using 'expectspawn ./gitpull.sh -expect -exact "Username for 'https://github.com': " -send -- "laramerdol\r" -expect -exact "Password for 'https://laramerdol@github.com':" -send -- "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\r" -expect eof diff --git a/bash-script.log b/bash-script.log deleted file mode 100644 index 419c0284..00000000 --- a/bash-script.log +++ /dev/null @@ -1,2594 +0,0 @@ -starting runner Paz 13 Kas 2022 20:07:23 +03 -removed 1 package and audited 1187 packages in 6.053s - -119 packages are looking for funding - run `npm fund` for details - -found 7 vulnerabilities (1 moderate, 2 high, 4 critical) - run `npm audit fix` to fix them, or `npm audit` for details - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 6.40 MB | -polyfills.js | polyfills | 966.24 kB | -main.js | main | 653.41 kB | -scripts.js | scripts | 386.59 kB | -styles.css | styles | 214.69 kB | -runtime.js | runtime | 6.37 kB | - -| Initial Total | 8.58 MB - -Build at: 2022-11-13T17:07:42.594Z - Hash: 35ca0acbb5aaaa15 - Time: 9350ms -server listening port: 4400 -starting runner Prş 16 Şub 2023 15:23:45 +03 - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - -runner ended Prş 16 Şub 2023 15:23:48 +03 -starting runner Prş 16 Şub 2023 15:26:28 +03 - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - -runner ended Prş 16 Şub 2023 15:26:31 +03 -starting runner Prş 16 Şub 2023 17:02:10 +03 - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - -runner ended Prş 16 Şub 2023 17:02:13 +03 -starting runner Prş 16 Şub 2023 17:34:46 +03 -audited 1201 packages in 6.068s - -136 packages are looking for funding - run `npm fund` for details - -found 1 moderate severity vulnerability - run `npm audit fix` to fix them, or `npm audit` for details - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 6.49 MB | -polyfills.js | polyfills | 964.76 kB | -main.js | main | 741.76 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 245.20 kB | -runtime.js | runtime | 6.37 kB | - -| Initial Total | 8.78 MB - -Build at: 2023-02-16T14:35:29.585Z - Hash: 81876fa7a7e77e2f - Time: 33376ms -server listening port: 4400 -runner ended Prş 16 Şub 2023 17:36:02 +03 -starting runner Prş 16 Şub 2023 17:36:36 +03 -removed 1 package and audited 1201 packages in 6.077s - -136 packages are looking for funding - run `npm fund` for details - -found 1 moderate severity vulnerability - run `npm audit fix` to fix them, or `npm audit` for details - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 6.49 MB | -polyfills.js | polyfills | 964.76 kB | -main.js | main | 741.76 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 245.20 kB | -runtime.js | runtime | 6.37 kB | - -| Initial Total | 8.78 MB - -Build at: 2023-02-16T14:37:05.806Z - Hash: 108f089a31520be1 - Time: 19001ms -server listening port: 4400 -runner ended Prş 16 Şub 2023 17:37:06 +03 -starting runner Prş 16 Şub 2023 17:42:58 +03 -audited 1201 packages in 6.12s - -136 packages are looking for funding - run `npm fund` for details - -found 1 moderate severity vulnerability - run `npm audit fix` to fix them, or `npm audit` for details - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 6.49 MB | -polyfills.js | polyfills | 964.76 kB | -main.js | main | 741.76 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 245.20 kB | -runtime.js | runtime | 6.37 kB | - -| Initial Total | 8.78 MB - -Build at: 2023-02-16T14:43:26.175Z - Hash: 108f089a31520be1 - Time: 18080ms -server listening port: 4400 -starting runner Cum 17 Şub 2023 14:50:02 +03 -audited 1201 packages in 6.105s - -136 packages are looking for funding - run `npm fund` for details - -found 1 moderate severity vulnerability - run `npm audit fix` to fix them, or `npm audit` for details - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 6.49 MB | -polyfills.js | polyfills | 964.76 kB | -main.js | main | 741.76 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 245.20 kB | -runtime.js | runtime | 6.37 kB | - -| Initial Total | 8.78 MB - -Build at: 2023-02-17T11:50:20.680Z - Hash: 108f089a31520be1 - Time: 8553ms -server listening port: 4400 -starting runner Cum 17 Şub 2023 14:50:38 +03 -audited 1201 packages in 6.088s - -136 packages are looking for funding - run `npm fund` for details - -found 1 moderate severity vulnerability - run `npm audit fix` to fix them, or `npm audit` for details - -> ng-visuall@1.0.0 ng /home/ivis/visuall/software-artifact-analyzer -> ng "build" - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 6.49 MB | -polyfills.js | polyfills | 964.76 kB | -main.js | main | 741.76 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 245.20 kB | -runtime.js | runtime | 6.37 kB | - -| Initial Total | 8.78 MB - -Build at: 2023-02-17T11:50:56.658Z - Hash: 108f089a31520be1 - Time: 8329ms -server listening port: 4400 -runner ended Cum 17 Şub 2023 14:50:56 +03 -starting runner Mon May 8 20:37:51 +03 2023 -runner ended Mon May 8 20:37:56 +03 2023 -starting runner Mon May 8 20:38:18 +03 2023 -runner ended Mon May 8 20:38:18 +03 2023 -starting runner Mon May 8 20:38:48 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T17:38:59.975Z - Hash: 1568fa2b04b4c402 - Time: 7970ms -server listening port: 4400 -starting runner Mon May 8 20:48:11 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 20:48:45 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 20:49:33 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T17:49:39.833Z - Hash: 1568fa2b04b4c402 - Time: 3464ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 21:04:38 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:04:44.881Z - Hash: 1568fa2b04b4c402 - Time: 3063ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 21:09:26 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:09:32.679Z - Hash: 1568fa2b04b4c402 - Time: 3034ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 21:12:46 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:12:53.138Z - Hash: 1568fa2b04b4c402 - Time: 3003ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 21:27:48 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:27:55.525Z - Hash: 1568fa2b04b4c402 - Time: 3258ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 21:38:21 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:38:28.382Z - Hash: 1568fa2b04b4c402 - Time: 3214ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 21:54:58 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:55:04.230Z - Hash: 1568fa2b04b4c402 - Time: 2840ms -runner ended Mon May 8 21:55:04 +03 2023 -starting runner Mon May 8 21:55:31 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:55:36.943Z - Hash: 1568fa2b04b4c402 - Time: 2818ms -runner ended Mon May 8 21:55:37 +03 2023 -starting runner Mon May 8 21:56:03 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:56:08.605Z - Hash: 1568fa2b04b4c402 - Time: 2766ms -runner ended Mon May 8 21:56:08 +03 2023 -starting runner Mon May 8 21:56:19 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:56:24.740Z - Hash: 1568fa2b04b4c402 - Time: 2753ms -runner ended Mon May 8 21:56:24 +03 2023 -starting runner Mon May 8 21:58:43 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:58:48.651Z - Hash: 1568fa2b04b4c402 - Time: 2987ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 21:59:08 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T18:59:14.033Z - Hash: 1568fa2b04b4c402 - Time: 2873ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 22:10:53 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T19:11:00.178Z - Hash: 1568fa2b04b4c402 - Time: 3114ms -[HPM] Proxy created: / -> [object Object] -server listening port: 4400 -starting runner Mon May 8 22:18:09 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T19:18:17.110Z - Hash: 1568fa2b04b4c402 - Time: 3041ms -[HPM] Proxy created: / -> [object Object] -server listening port: 4400 -starting runner Mon May 8 22:20:59 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T19:21:05.568Z - Hash: 1568fa2b04b4c402 - Time: 3112ms -[HPM] Proxy created: / -> [object Object] -server listening port: 4400 -starting runner Mon May 8 22:42:37 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T19:42:44.262Z - Hash: 1568fa2b04b4c402 - Time: 3134ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 23:00:51 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:00:57.813Z - Hash: 1568fa2b04b4c402 - Time: 3130ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Mon May 8 23:05:21 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:05:27.726Z - Hash: 1568fa2b04b4c402 - Time: 3092ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "" -server listening port: 4400 -starting runner Mon May 8 23:08:43 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:08:49.844Z - Hash: 1568fa2b04b4c402 - Time: 3067ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "http://saanalyzer.atlassian.net/rest" -server listening port: 4400 -starting runner Mon May 8 23:19:22 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:19:29.395Z - Hash: 1568fa2b04b4c402 - Time: 3307ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "" -server listening port: 4400 -starting runner Mon May 8 23:30:03 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:30:09.949Z - Hash: 1568fa2b04b4c402 - Time: 3078ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest/" ~> "http://saanalyzer.atlassian.net/rest/" -server listening port: 4400 -starting runner Mon May 8 23:41:38 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:41:45.927Z - Hash: 1568fa2b04b4c402 - Time: 3598ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "/rest" -server listening port: 4400 -starting runner Mon May 8 23:49:28 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:49:35.410Z - Hash: 1568fa2b04b4c402 - Time: 3089ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "" -server listening port: 4400 -starting runner Mon May 8 23:52:40 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:52:47.747Z - Hash: 85f63cf2bf4e3b25 - Time: 3987ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "" -server listening port: 4400 -starting runner Mon May 8 23:57:31 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T20:57:38.619Z - Hash: 1568fa2b04b4c402 - Time: 3544ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Tue May 9 00:00:35 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T21:00:42.191Z - Hash: 1568fa2b04b4c402 - Time: 3215ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Subscribed to http-proxy events: [ 'error', 'close' ] -server listening port: 4400 -[HPM] PUT /rest/api/2/issue/SAA-5 -> https://saanalyzer.atlassian.net -starting runner Tue May 9 00:30:34 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - -server listening port: 4400 -starting runner Tue May 9 00:33:04 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T21:33:10.309Z - Hash: 1568fa2b04b4c402 - Time: 3098ms -server listening port: 4400 -starting runner Tue May 9 00:36:48 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build proxy.conf.json - -server listening port: 4400 -starting runner Tue May 9 00:37:38 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T21:37:44.942Z - Hash: 1568fa2b04b4c402 - Time: 3115ms -server listening port: 4400 -starting runner Tue May 9 00:41:41 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T21:41:48.712Z - Hash: 1568fa2b04b4c402 - Time: 4092ms -server listening port: 4400 -starting runner Tue May 9 01:09:46 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T22:09:53.964Z - Hash: 1568fa2b04b4c402 - Time: 3709ms -server listening port: 4400 -starting runner Tue May 9 01:17:58 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T22:18:04.637Z - Hash: 1568fa2b04b4c402 - Time: 3088ms -runner ended Tue May 9 01:18:04 +03 2023 -starting runner Tue May 9 01:21:18 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T22:21:25.107Z - Hash: 1568fa2b04b4c402 - Time: 3180ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "/rest" -server listening port: 4400 -starting runner Tue May 9 01:23:02 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T22:23:08.783Z - Hash: 1568fa2b04b4c402 - Time: 3285ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.netdd -[HPM] Proxy rewrite rule created: "^/rest" ~> "/rest" -server listening port: 4400 -starting runner Tue May 9 01:25:20 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 high severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-08T22:25:26.942Z - Hash: 1568fa2b04b4c402 - Time: 3458ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "/rest" -server listening port: 4400 -starting runner Wed May 10 16:54:39 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-10T13:54:45.843Z - Hash: 1568fa2b04b4c402 - Time: 2975ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "/rest" -server listening port: 4400 -starting runner Wed May 10 17:05:29 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-10T14:05:35.950Z - Hash: 1568fa2b04b4c402 - Time: 3355ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "/rest" -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "" -server listening port: 4400 -starting runner Wed May 10 17:08:27 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-10T14:08:33.545Z - Hash: 1568fa2b04b4c402 - Time: 3049ms -[HPM] Proxy created: / -> https://saanalyzer.atlassian.net -runner ended Wed May 10 17:08:33 +03 2023 -starting runner Wed May 10 17:09:18 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-10T14:09:23.771Z - Hash: 1568fa2b04b4c402 - Time: 2906ms -[HPM] Proxy created: /rest -> https://saanalyzer.atlassian.net -server listening port: 4400 -starting runner Wed May 10 20:32:23 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-10T17:32:29.563Z - Hash: 1568fa2b04b4c402 - Time: 3009ms -[HPM] Proxy created: /rest -> https://saanalyzer.atlassian.net -[HPM] Proxy rewrite rule created: "^/rest" ~> "/rest" -server listening port: 4400 -starting runner Wed May 10 20:37:08 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-10T17:37:14.505Z - Hash: 1568fa2b04b4c402 - Time: 2957ms -[HPM] Proxy created: /rest -> https://saanalyzer.atlassian.net -server listening port: 4400 -Rewriting path from /rest/api/2/issue/SAA-2 to /rest/api/issues/2/api/2/issue/SAA-2 - ClientRequest { - _events: [Object: null prototype] { - socket: [Function (anonymous)], - error: [ [Function: onerror], [Function: proxyError] ], - unpipe: [Function: onunpipe], - close: [Function: bound onceWrapper] { listener: [Function: onclose] }, - finish: [Function: bound onceWrapper] { listener: [Function: onfinish] }, - response: [Function (anonymous)] - }, - _eventsCount: 6, - _maxListeners: undefined, - outputData: [], - outputSize: 0, - writable: true, - destroyed: false, - _last: true, - chunkedEncoding: false, - shouldKeepAlive: false, - maxRequestsOnConnectionReached: false, - _defaultKeepAlive: true, - useChunkedEncodingByDefault: true, - sendDate: false, - _removedConnection: false, - _removedContLen: false, - _removedTE: false, - strictContentLength: false, - _contentLength: null, - _hasBody: true, - _trailer: '', - finished: false, - _headerSent: false, - _closed: false, - socket: TLSSocket { - _tlsOptions: { - allowHalfOpen: undefined, - pipe: false, - secureContext: [SecureContext], - isServer: false, - requestCert: true, - rejectUnauthorized: true, - session: undefined, - ALPNProtocols: undefined, - requestOCSP: undefined, - enableTrace: undefined, - pskCallback: undefined, - highWaterMark: undefined, - onread: undefined, - signal: undefined - }, - _secureEstablished: false, - _securePending: false, - _newSessionPending: false, - _controlReleased: true, - secureConnecting: true, - _SNICallback: null, - servername: null, - alpnProtocol: null, - authorized: false, - authorizationError: null, - encrypted: true, - _events: [Object: null prototype] { - close: [Array], - end: [Array], - newListener: [Function: keylogNewListener], - connect: [Array], - secure: [Function: onConnectSecure], - session: [Function (anonymous)], - free: [Function: onFree], - timeout: [Function: onTimeout], - agentRemove: [Function: onRemove], - error: [Function: socketErrorListener], - data: [Function: socketOnData], - drain: [Function: ondrain] - }, - _eventsCount: 12, - connecting: true, - _hadError: false, - _parent: null, - _host: 'saanalyzer.atlassian.net', - _closeAfterHandlingError: false, - _readableState: ReadableState { - objectMode: false, - highWaterMark: 16384, - buffer: BufferList { head: null, tail: null, length: 0 }, - length: 0, - pipes: [], - flowing: true, - ended: false, - endEmitted: false, - reading: true, - constructed: true, - sync: false, - needReadable: true, - emittedReadable: false, - readableListening: false, - resumeScheduled: true, - errorEmitted: false, - emitClose: false, - autoDestroy: true, - destroyed: false, - errored: null, - closed: false, - closeEmitted: false, - defaultEncoding: 'utf8', - awaitDrainWriters: null, - multiAwaitDrain: false, - readingMore: false, - dataEmitted: false, - decoder: null, - encoding: null, - [Symbol(kPaused)]: false - }, - _maxListeners: undefined, - _writableState: WritableState { - objectMode: false, - highWaterMark: 16384, - finalCalled: false, - needDrain: false, - ending: false, - ended: false, - finished: false, - destroyed: false, - decodeStrings: false, - defaultEncoding: 'utf8', - length: 0, - writing: false, - corked: 0, - sync: true, - bufferProcessing: false, - onwrite: [Function: bound onwrite], - writecb: null, - writelen: 0, - afterWriteTickInfo: null, - buffered: [], - bufferedIndex: 0, - allBuffers: true, - allNoop: true, - pendingcb: 0, - constructed: true, - prefinished: false, - errorEmitted: false, - emitClose: false, - autoDestroy: true, - errored: null, - closed: false, - closeEmitted: false, - [Symbol(kOnFinished)]: [] - }, - allowHalfOpen: false, - _sockname: null, - _pendingData: null, - _pendingEncoding: '', - server: undefined, - _server: null, - ssl: TLSWrap { - _parent: [TCP], - _parentWrap: undefined, - _secureContext: [SecureContext], - reading: false, - onkeylog: [Function: onkeylog], - onhandshakestart: {}, - onhandshakedone: [Function (anonymous)], - onocspresponse: [Function: onocspresponse], - onnewsession: [Function: onnewsessionclient], - onerror: [Function: onerror], - [Symbol(owner_symbol)]: [Circular *1] - }, - _requestCert: true, - _rejectUnauthorized: true, - parser: HTTPParser { - '0': null, - '1': [Function: parserOnHeaders], - '2': [Function: parserOnHeadersComplete], - '3': [Function: parserOnBody], - '4': [Function: parserOnMessageComplete], - '5': null, - '6': null, - _headers: [], - _url: '', - socket: [Circular *1], - incoming: null, - outgoing: [Circular *2], - maxHeaderPairs: 2000, - _consumed: false, - onIncoming: [Function: parserOnIncomingClient], - joinDuplicateHeaders: undefined, - [Symbol(resource_symbol)]: [HTTPClientAsyncResource] - }, - _httpMessage: [Circular *2], - [Symbol(res)]: TLSWrap { - _parent: [TCP], - _parentWrap: undefined, - _secureContext: [SecureContext], - reading: false, - onkeylog: [Function: onkeylog], - onhandshakestart: {}, - onhandshakedone: [Function (anonymous)], - onocspresponse: [Function: onocspresponse], - onnewsession: [Function: onnewsessionclient], - onerror: [Function: onerror], - [Symbol(owner_symbol)]: [Circular *1] - }, - [Symbol(verified)]: false, - [Symbol(pendingSession)]: null, - [Symbol(async_id_symbol)]: 5944, - [Symbol(kHandle)]: TLSWrap { - _parent: [TCP], - _parentWrap: undefined, - _secureContext: [SecureContext], - reading: false, - onkeylog: [Function: onkeylog], - onhandshakestart: {}, - onhandshakedone: [Function (anonymous)], - onocspresponse: [Function: onocspresponse], - onnewsession: [Function: onnewsessionclient], - onerror: [Function: onerror], - [Symbol(owner_symbol)]: [Circular *1] - }, - [Symbol(lastWriteQueueSize)]: 0, - [Symbol(timeout)]: null, - [Symbol(kBuffer)]: null, - [Symbol(kBufferCb)]: null, - [Symbol(kBufferGen)]: null, - [Symbol(kCapture)]: false, - [Symbol(kSetNoDelay)]: false, - [Symbol(kSetKeepAlive)]: false, - [Symbol(kSetKeepAliveInitialDelay)]: 0, - [Symbol(kBytesRead)]: 0, - [Symbol(kBytesWritten)]: 0, - [Symbol(connect-options)]: { - rejectUnauthorized: true, - ciphers: undefined, - checkServerIdentity: [Function: checkServerIdentity], - minDHSize: 1024, - port: 443, - host: 'saanalyzer.atlassian.net', - hostname: 'saanalyzer.atlassian.net', - socketPath: undefined, - pfx: undefined, - key: undefined, - passphrase: undefined, - cert: undefined, - ca: undefined, - secureProtocol: undefined, - method: 'PUT', - headers: [Object], - agent: false, - localAddress: undefined, - path: null, - _defaultAgent: [Agent], - noDelay: true, - servername: 'saanalyzer.atlassian.net', - _agentKey: 'saanalyzer.atlassian.net:443::::::::true:::::::::::::', - encoding: null, - singleUse: true - } - }, - _header: null, - _keepAliveTimeout: 0, - _onPendingData: [Function: nop], - agent: Agent { - _events: [Object: null prototype] { - free: [Function (anonymous)], - newListener: [Function: maybeEnableKeylog] - }, - _eventsCount: 2, - _maxListeners: undefined, - defaultPort: 443, - protocol: 'https:', - options: [Object: null prototype] { noDelay: true, path: null }, - requests: [Object: null prototype] {}, - sockets: [Object: null prototype] { - 'saanalyzer.atlassian.net:443::::::::true:::::::::::::': [Array] - }, - freeSockets: [Object: null prototype] {}, - keepAliveMsecs: 1000, - keepAlive: false, - maxSockets: Infinity, - maxFreeSockets: 256, - scheduling: 'lifo', - maxTotalSockets: Infinity, - totalSocketCount: 1, - maxCachedSessions: 100, - _sessionCache: { map: {}, list: [] }, - [Symbol(kCapture)]: false - }, - socketPath: undefined, - method: 'PUT', - maxHeaderSize: undefined, - insecureHTTPParser: undefined, - joinDuplicateHeaders: undefined, - path: '/rest/api/issues/2/api/2/issue/SAA-2', - _ended: false, - res: null, - aborted: false, - timeoutCb: null, - upgradeOrConnect: false, - parser: HTTPParser { - '0': null, - '1': [Function: parserOnHeaders], - '2': [Function: parserOnHeadersComplete], - '3': [Function: parserOnBody], - '4': [Function: parserOnMessageComplete], - '5': null, - '6': null, - _headers: [], - _url: '', - socket: TLSSocket { - _tlsOptions: [Object], - _secureEstablished: false, - _securePending: false, - _newSessionPending: false, - _controlReleased: true, - secureConnecting: true, - _SNICallback: null, - servername: null, - alpnProtocol: null, - authorized: false, - authorizationError: null, - encrypted: true, - _events: [Object: null prototype], - _eventsCount: 12, - connecting: true, - _hadError: false, - _parent: null, - _host: 'saanalyzer.atlassian.net', - _closeAfterHandlingError: false, - _readableState: [ReadableState], - _maxListeners: undefined, - _writableState: [WritableState], - allowHalfOpen: false, - _sockname: null, - _pendingData: null, - _pendingEncoding: '', - server: undefined, - _server: null, - ssl: [TLSWrap], - _requestCert: true, - _rejectUnauthorized: true, - parser: [Circular *3], - _httpMessage: [Circular *2], - [Symbol(res)]: [TLSWrap], - [Symbol(verified)]: false, - [Symbol(pendingSession)]: null, - [Symbol(async_id_symbol)]: 5944, - [Symbol(kHandle)]: [TLSWrap], - [Symbol(lastWriteQueueSize)]: 0, - [Symbol(timeout)]: null, - [Symbol(kBuffer)]: null, - [Symbol(kBufferCb)]: null, - [Symbol(kBufferGen)]: null, - [Symbol(kCapture)]: false, - [Symbol(kSetNoDelay)]: false, - [Symbol(kSetKeepAlive)]: false, - [Symbol(kSetKeepAliveInitialDelay)]: 0, - [Symbol(kBytesRead)]: 0, - [Symbol(kBytesWritten)]: 0, - [Symbol(connect-options)]: [Object] - }, - incoming: null, - outgoing: [Circular *2], - maxHeaderPairs: 2000, - _consumed: false, - onIncoming: [Function: parserOnIncomingClient], - joinDuplicateHeaders: undefined, - [Symbol(resource_symbol)]: HTTPClientAsyncResource { - type: 'HTTPINCOMINGMESSAGE', - req: [Circular *2] - } - }, - maxHeadersCount: null, - reusedSocket: false, - host: 'saanalyzer.atlassian.net', - protocol: 'https:', - [Symbol(kCapture)]: false, - [Symbol(kBytesWritten)]: 0, - [Symbol(kEndCalled)]: false, - [Symbol(kNeedDrain)]: false, - [Symbol(corked)]: 0, - [Symbol(kOutHeaders)]: [Object: null prototype] { - 'accept-language': [ 'accept-language', 'tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7' ], - 'accept-encoding': [ 'accept-encoding', 'gzip, deflate, br' ], - referer: [ 'referer', 'http://localhost:4400/' ], - 'sec-fetch-dest': [ 'sec-fetch-dest', 'empty' ], - 'sec-fetch-mode': [ 'sec-fetch-mode', 'cors' ], - 'sec-fetch-site': [ 'sec-fetch-site', 'same-origin' ], - origin: [ 'origin', 'http://localhost:4400' ], - 'sec-ch-ua-platform': [ 'sec-ch-ua-platform', '"macOS"' ], - 'user-agent': [ - 'user-agent', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' - ], - authorization: [ - 'authorization', - 'Basic c2FhbmFseXplckBnbWFpbC5jb206QVRBVFQzeEZmR0YwZVN4a3RXeU5VNUVWZDNFaG51enY0MTJUWDJ0S3d4cnBYaVhGN1I2UmxpeUV2V3lxeGJYRE5hNHY2TjRwNFJybld1cUhadmJYNzNJeTlIcjgxTWlLMGhhdHY3NEJXcFNtTTduQ0VKRWRqdXluZmRISUZGS0lCeFpnaFVhdFdkcnZqVkQzZkpBLXlLXzFLX2JMSHI1QVdUV1U3dEhiQ3B4Yk82M1RCLU80MkFvPThDRjJEOURB' - ], - 'sec-ch-ua-mobile': [ 'sec-ch-ua-mobile', '?0' ], - 'content-type': [ 'content-type', 'application/json' ], - accept: [ 'accept', 'application/json, text/plain, */*' ], - 'sec-ch-ua': [ - 'sec-ch-ua', - '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"' - ], - 'content-length': [ 'content-length', '288' ], - connection: [ 'connection', 'close' ], - host: [ 'host', 'saanalyzer.atlassian.net' ], - 'access-control-allow-origin': [ 'Access-Control-Allow-Origin', '*' ], - 'x-atlassian-token': [ 'X-Atlassian-Token', 'no-check' ] - }, - [Symbol(errored)]: null, - [Symbol(kUniqueHeaders)]: null -} -starting runner Wed May 10 20:39:22 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-10T17:39:28.269Z - Hash: 1568fa2b04b4c402 - Time: 3004ms -[HPM] Proxy created: /rest -> https://saanalyzer.atlassian.net -server listening port: 4400 -Rewriting path from /rest/api/2/issue/SAA-1 to /rest/api/2/issue/SAA-1 - ClientRequest { - _events: [Object: null prototype] { - socket: [Function (anonymous)], - error: [ [Function: onerror], [Function: proxyError] ], - unpipe: [Function: onunpipe], - close: [Function: bound onceWrapper] { listener: [Function: onclose] }, - finish: [Function: bound onceWrapper] { listener: [Function: onfinish] }, - response: [Function (anonymous)] - }, - _eventsCount: 6, - _maxListeners: undefined, - outputData: [], - outputSize: 0, - writable: true, - destroyed: false, - _last: true, - chunkedEncoding: false, - shouldKeepAlive: false, - maxRequestsOnConnectionReached: false, - _defaultKeepAlive: true, - useChunkedEncodingByDefault: true, - sendDate: false, - _removedConnection: false, - _removedContLen: false, - _removedTE: false, - strictContentLength: false, - _contentLength: null, - _hasBody: true, - _trailer: '', - finished: false, - _headerSent: false, - _closed: false, - socket: TLSSocket { - _tlsOptions: { - allowHalfOpen: undefined, - pipe: false, - secureContext: [SecureContext], - isServer: false, - requestCert: true, - rejectUnauthorized: true, - session: undefined, - ALPNProtocols: undefined, - requestOCSP: undefined, - enableTrace: undefined, - pskCallback: undefined, - highWaterMark: undefined, - onread: undefined, - signal: undefined - }, - _secureEstablished: false, - _securePending: false, - _newSessionPending: false, - _controlReleased: true, - secureConnecting: true, - _SNICallback: null, - servername: null, - alpnProtocol: null, - authorized: false, - authorizationError: null, - encrypted: true, - _events: [Object: null prototype] { - close: [Array], - end: [Array], - newListener: [Function: keylogNewListener], - connect: [Array], - secure: [Function: onConnectSecure], - session: [Function (anonymous)], - free: [Function: onFree], - timeout: [Function: onTimeout], - agentRemove: [Function: onRemove], - error: [Function: socketErrorListener], - data: [Function: socketOnData], - drain: [Function: ondrain] - }, - _eventsCount: 12, - connecting: true, - _hadError: false, - _parent: null, - _host: 'saanalyzer.atlassian.net', - _closeAfterHandlingError: false, - _readableState: ReadableState { - objectMode: false, - highWaterMark: 16384, - buffer: BufferList { head: null, tail: null, length: 0 }, - length: 0, - pipes: [], - flowing: true, - ended: false, - endEmitted: false, - reading: true, - constructed: true, - sync: false, - needReadable: true, - emittedReadable: false, - readableListening: false, - resumeScheduled: true, - errorEmitted: false, - emitClose: false, - autoDestroy: true, - destroyed: false, - errored: null, - closed: false, - closeEmitted: false, - defaultEncoding: 'utf8', - awaitDrainWriters: null, - multiAwaitDrain: false, - readingMore: false, - dataEmitted: false, - decoder: null, - encoding: null, - [Symbol(kPaused)]: false - }, - _maxListeners: undefined, - _writableState: WritableState { - objectMode: false, - highWaterMark: 16384, - finalCalled: false, - needDrain: false, - ending: false, - ended: false, - finished: false, - destroyed: false, - decodeStrings: false, - defaultEncoding: 'utf8', - length: 0, - writing: false, - corked: 0, - sync: true, - bufferProcessing: false, - onwrite: [Function: bound onwrite], - writecb: null, - writelen: 0, - afterWriteTickInfo: null, - buffered: [], - bufferedIndex: 0, - allBuffers: true, - allNoop: true, - pendingcb: 0, - constructed: true, - prefinished: false, - errorEmitted: false, - emitClose: false, - autoDestroy: true, - errored: null, - closed: false, - closeEmitted: false, - [Symbol(kOnFinished)]: [] - }, - allowHalfOpen: false, - _sockname: null, - _pendingData: null, - _pendingEncoding: '', - server: undefined, - _server: null, - ssl: TLSWrap { - _parent: [TCP], - _parentWrap: undefined, - _secureContext: [SecureContext], - reading: false, - onkeylog: [Function: onkeylog], - onhandshakestart: {}, - onhandshakedone: [Function (anonymous)], - onocspresponse: [Function: onocspresponse], - onnewsession: [Function: onnewsessionclient], - onerror: [Function: onerror], - [Symbol(owner_symbol)]: [Circular *1] - }, - _requestCert: true, - _rejectUnauthorized: true, - parser: HTTPParser { - '0': null, - '1': [Function: parserOnHeaders], - '2': [Function: parserOnHeadersComplete], - '3': [Function: parserOnBody], - '4': [Function: parserOnMessageComplete], - '5': null, - '6': null, - _headers: [], - _url: '', - socket: [Circular *1], - incoming: null, - outgoing: [Circular *2], - maxHeaderPairs: 2000, - _consumed: false, - onIncoming: [Function: parserOnIncomingClient], - joinDuplicateHeaders: undefined, - [Symbol(resource_symbol)]: [HTTPClientAsyncResource] - }, - _httpMessage: [Circular *2], - [Symbol(res)]: TLSWrap { - _parent: [TCP], - _parentWrap: undefined, - _secureContext: [SecureContext], - reading: false, - onkeylog: [Function: onkeylog], - onhandshakestart: {}, - onhandshakedone: [Function (anonymous)], - onocspresponse: [Function: onocspresponse], - onnewsession: [Function: onnewsessionclient], - onerror: [Function: onerror], - [Symbol(owner_symbol)]: [Circular *1] - }, - [Symbol(verified)]: false, - [Symbol(pendingSession)]: null, - [Symbol(async_id_symbol)]: 5945, - [Symbol(kHandle)]: TLSWrap { - _parent: [TCP], - _parentWrap: undefined, - _secureContext: [SecureContext], - reading: false, - onkeylog: [Function: onkeylog], - onhandshakestart: {}, - onhandshakedone: [Function (anonymous)], - onocspresponse: [Function: onocspresponse], - onnewsession: [Function: onnewsessionclient], - onerror: [Function: onerror], - [Symbol(owner_symbol)]: [Circular *1] - }, - [Symbol(lastWriteQueueSize)]: 0, - [Symbol(timeout)]: null, - [Symbol(kBuffer)]: null, - [Symbol(kBufferCb)]: null, - [Symbol(kBufferGen)]: null, - [Symbol(kCapture)]: false, - [Symbol(kSetNoDelay)]: false, - [Symbol(kSetKeepAlive)]: false, - [Symbol(kSetKeepAliveInitialDelay)]: 0, - [Symbol(kBytesRead)]: 0, - [Symbol(kBytesWritten)]: 0, - [Symbol(connect-options)]: { - rejectUnauthorized: true, - ciphers: undefined, - checkServerIdentity: [Function: checkServerIdentity], - minDHSize: 1024, - port: 443, - host: 'saanalyzer.atlassian.net', - hostname: 'saanalyzer.atlassian.net', - socketPath: undefined, - pfx: undefined, - key: undefined, - passphrase: undefined, - cert: undefined, - ca: undefined, - secureProtocol: undefined, - method: 'PUT', - headers: [Object], - agent: false, - localAddress: undefined, - path: null, - _defaultAgent: [Agent], - noDelay: true, - servername: 'saanalyzer.atlassian.net', - _agentKey: 'saanalyzer.atlassian.net:443::::::::true:::::::::::::', - encoding: null, - singleUse: true - } - }, - _header: null, - _keepAliveTimeout: 0, - _onPendingData: [Function: nop], - agent: Agent { - _events: [Object: null prototype] { - free: [Function (anonymous)], - newListener: [Function: maybeEnableKeylog] - }, - _eventsCount: 2, - _maxListeners: undefined, - defaultPort: 443, - protocol: 'https:', - options: [Object: null prototype] { noDelay: true, path: null }, - requests: [Object: null prototype] {}, - sockets: [Object: null prototype] { - 'saanalyzer.atlassian.net:443::::::::true:::::::::::::': [Array] - }, - freeSockets: [Object: null prototype] {}, - keepAliveMsecs: 1000, - keepAlive: false, - maxSockets: Infinity, - maxFreeSockets: 256, - scheduling: 'lifo', - maxTotalSockets: Infinity, - totalSocketCount: 1, - maxCachedSessions: 100, - _sessionCache: { map: {}, list: [] }, - [Symbol(kCapture)]: false - }, - socketPath: undefined, - method: 'PUT', - maxHeaderSize: undefined, - insecureHTTPParser: undefined, - joinDuplicateHeaders: undefined, - path: '/rest/api/2/issue/SAA-1', - _ended: false, - res: null, - aborted: false, - timeoutCb: null, - upgradeOrConnect: false, - parser: HTTPParser { - '0': null, - '1': [Function: parserOnHeaders], - '2': [Function: parserOnHeadersComplete], - '3': [Function: parserOnBody], - '4': [Function: parserOnMessageComplete], - '5': null, - '6': null, - _headers: [], - _url: '', - socket: TLSSocket { - _tlsOptions: [Object], - _secureEstablished: false, - _securePending: false, - _newSessionPending: false, - _controlReleased: true, - secureConnecting: true, - _SNICallback: null, - servername: null, - alpnProtocol: null, - authorized: false, - authorizationError: null, - encrypted: true, - _events: [Object: null prototype], - _eventsCount: 12, - connecting: true, - _hadError: false, - _parent: null, - _host: 'saanalyzer.atlassian.net', - _closeAfterHandlingError: false, - _readableState: [ReadableState], - _maxListeners: undefined, - _writableState: [WritableState], - allowHalfOpen: false, - _sockname: null, - _pendingData: null, - _pendingEncoding: '', - server: undefined, - _server: null, - ssl: [TLSWrap], - _requestCert: true, - _rejectUnauthorized: true, - parser: [Circular *3], - _httpMessage: [Circular *2], - [Symbol(res)]: [TLSWrap], - [Symbol(verified)]: false, - [Symbol(pendingSession)]: null, - [Symbol(async_id_symbol)]: 5945, - [Symbol(kHandle)]: [TLSWrap], - [Symbol(lastWriteQueueSize)]: 0, - [Symbol(timeout)]: null, - [Symbol(kBuffer)]: null, - [Symbol(kBufferCb)]: null, - [Symbol(kBufferGen)]: null, - [Symbol(kCapture)]: false, - [Symbol(kSetNoDelay)]: false, - [Symbol(kSetKeepAlive)]: false, - [Symbol(kSetKeepAliveInitialDelay)]: 0, - [Symbol(kBytesRead)]: 0, - [Symbol(kBytesWritten)]: 0, - [Symbol(connect-options)]: [Object] - }, - incoming: null, - outgoing: [Circular *2], - maxHeaderPairs: 2000, - _consumed: false, - onIncoming: [Function: parserOnIncomingClient], - joinDuplicateHeaders: undefined, - [Symbol(resource_symbol)]: HTTPClientAsyncResource { - type: 'HTTPINCOMINGMESSAGE', - req: [Circular *2] - } - }, - maxHeadersCount: null, - reusedSocket: false, - host: 'saanalyzer.atlassian.net', - protocol: 'https:', - [Symbol(kCapture)]: false, - [Symbol(kBytesWritten)]: 0, - [Symbol(kEndCalled)]: false, - [Symbol(kNeedDrain)]: false, - [Symbol(corked)]: 0, - [Symbol(kOutHeaders)]: [Object: null prototype] { - 'accept-language': [ 'accept-language', 'tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7' ], - 'accept-encoding': [ 'accept-encoding', 'gzip, deflate, br' ], - referer: [ 'referer', 'http://localhost:4400/' ], - 'sec-fetch-dest': [ 'sec-fetch-dest', 'empty' ], - 'sec-fetch-mode': [ 'sec-fetch-mode', 'cors' ], - 'sec-fetch-site': [ 'sec-fetch-site', 'same-origin' ], - origin: [ 'origin', 'http://localhost:4400' ], - 'sec-ch-ua-platform': [ 'sec-ch-ua-platform', '"macOS"' ], - 'user-agent': [ - 'user-agent', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' - ], - authorization: [ - 'authorization', - 'Basic c2FhbmFseXplckBnbWFpbC5jb206QVRBVFQzeEZmR0YwZVN4a3RXeU5VNUVWZDNFaG51enY0MTJUWDJ0S3d4cnBYaVhGN1I2UmxpeUV2V3lxeGJYRE5hNHY2TjRwNFJybld1cUhadmJYNzNJeTlIcjgxTWlLMGhhdHY3NEJXcFNtTTduQ0VKRWRqdXluZmRISUZGS0lCeFpnaFVhdFdkcnZqVkQzZkpBLXlLXzFLX2JMSHI1QVdUV1U3dEhiQ3B4Yk82M1RCLU80MkFvPThDRjJEOURB' - ], - 'sec-ch-ua-mobile': [ 'sec-ch-ua-mobile', '?0' ], - 'content-type': [ 'content-type', 'application/json' ], - accept: [ 'accept', 'application/json, text/plain, */*' ], - 'sec-ch-ua': [ - 'sec-ch-ua', - '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"' - ], - 'content-length': [ 'content-length', '227' ], - connection: [ 'connection', 'close' ], - host: [ 'host', 'saanalyzer.atlassian.net' ], - 'access-control-allow-origin': [ 'Access-Control-Allow-Origin', '*' ], - 'x-atlassian-token': [ 'X-Atlassian-Token', 'no-check' ] - }, - [Symbol(errored)]: null, - [Symbol(kUniqueHeaders)]: null -} -starting runner Thu May 11 20:02:18 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-11T17:02:25.803Z - Hash: 1568fa2b04b4c402 - Time: 2967ms -server listening port: 4400 -starting runner Thu May 11 20:50:50 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-11T17:51:01.224Z - Hash: 0271e84927e40cff - Time: 7895ms -server listening port: 4400 -starting runner Thu May 11 20:52:24 +03 2023 - -up to date, audited 1138 packages in 2s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-11T17:52:30.900Z - Hash: 0271e84927e40cff - Time: 3247ms -server listening port: 4400 -starting runner Thu May 11 20:53:09 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-11T17:53:15.122Z - Hash: 0271e84927e40cff - Time: 2881ms -server listening port: 4400 -starting runner Thu May 11 20:55:32 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.01 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-11T17:55:38.451Z - Hash: de6b1a8107658200 - Time: 3617ms -server listening port: 4400 -starting runner Thu May 11 22:28:36 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.02 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-11T19:28:43.250Z - Hash: dc803112aa757a17 - Time: 3610ms -server listening port: 4400 -starting runner Thu May 11 22:30:59 +03 2023 - -up to date, audited 1138 packages in 1s - -135 packages are looking for funding - run `npm fund` for details - -1 moderate severity vulnerability - -To address all issues, run: - npm audit fix - -Run `npm audit` for details. - -> ng-visuall@1.0.0 ng -> ng build - - -Initial Chunk Files | Names | Raw Size -vendor.js | vendor | 7.46 MB | -main.js | main | 1.02 MB | -polyfills.js | polyfills | 971.32 kB | -scripts.js | scripts | 393.86 kB | -styles.css | styles | 323.21 kB | -runtime.js | runtime | 7.12 kB | - -| Initial Total | 10.13 MB - -Build at: 2023-05-11T19:31:05.846Z - Hash: 4dcef3239e8b875c - Time: 3288ms -server listening port: 4400 diff --git a/docs/coding.html b/coding.html similarity index 100% rename from docs/coding.html rename to coding.html diff --git a/cypress.config.ts b/cypress.config.ts deleted file mode 100644 index 4a6075c7..00000000 --- a/cypress.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'cypress' - -export default defineConfig({ - viewportWidth: 1200, - viewportHeight: 1000, - video: false, - e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index.js')(on, config) - }, - }, -}) diff --git a/cypress/downloads/Visuall_User_Profile.vall b/cypress/downloads/Visuall_User_Profile.vall deleted file mode 100644 index ec747fa4..00000000 --- a/cypress/downloads/Visuall_User_Profile.vall +++ /dev/null @@ -1 +0,0 @@ -null \ No newline at end of file diff --git a/cypress/downloads/visuall.json b/cypress/downloads/visuall.json deleted file mode 100644 index 1856214a..00000000 --- a/cypress/downloads/visuall.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"data":{"end_t":567907200000,"primary_profession":["soundtrack","actor","miscellaneous"],"death_year":1987,"nconst":"nm0000001","primary_name":"Fred Astaire","start_t":-2240524800000,"birth_year":1899,"id":"n0"},"position":{"x":188.83259702708386,"y":225.82575020906478},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":17,"production_end_date":170035200000,"original_title":"The Lion Roars Again","start_year":1975,"rating":5.3,"count_votes":97,"primary_title":"The Lion Roars Again","shooting_end_date":170035200000,"title_type":"short","is_adult":0,"production_start_date":169948800000,"shooting_start_date":169948800000,"genres":["Documentary","Short"],"tconst":"tt0360744","id":"n1059218"},"position":{"x":268.43858155261023,"y":153.73193952597708},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":110,"production_end_date":-1072742400000,"original_title":"Follow the Fleet","start_year":1936,"rating":7.2,"count_votes":3797,"primary_title":"Follow the Fleet","shooting_end_date":-1072742400000,"title_type":"movie","is_adult":0,"production_start_date":-1078358400000,"shooting_start_date":-1078358400000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0027630","id":"n1040429"},"position":{"x":310.01671981126407,"y":93.77833437023031},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":134,"production_end_date":-339811200000,"original_title":"On the Beach","start_year":1959,"rating":7.2,"count_votes":11391,"primary_title":"On the Beach","shooting_end_date":-339811200000,"title_type":"movie","is_adult":0,"production_start_date":-347155200000,"genres":["Drama","Romance","Sci-Fi"],"shooting_start_date":-347155200000,"tconst":"tt0053137","id":"n1044463"},"position":{"x":150.32983211271124,"y":87.16596074910831},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":108,"production_end_date":-776822400000,"original_title":"Yolanda and the Thief","start_year":1945,"rating":6,"count_votes":802,"primary_title":"Yolanda and the Thief","shooting_end_date":-776822400000,"title_type":"movie","is_adult":0,"production_start_date":-787708800000,"shooting_start_date":-787708800000,"genres":["Fantasy","Musical","Romance"],"tconst":"tt0038262","id":"n1042671"},"position":{"x":273.06069380247436,"y":197.92971314917438},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":109,"production_end_date":-668131200000,"original_title":"The Barkleys of Broadway","start_year":1949,"rating":7,"count_votes":2614,"primary_title":"The Barkleys of Broadway","shooting_end_date":-668131200000,"title_type":"movie","is_adult":0,"production_start_date":-675302400000,"shooting_start_date":-675302400000,"genres":["Comedy","Musical"],"tconst":"tt0041158","id":"n1043092"},"position":{"x":224.0299959180377,"y":117.32742895632393},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":109,"production_end_date":-1034467200000,"original_title":"Shall We Dance","start_year":1937,"rating":7.5,"count_votes":6194,"primary_title":"Shall We Dance","shooting_end_date":-1034467200000,"title_type":"movie","is_adult":0,"production_start_date":-1042070400000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-1042070400000,"tconst":"tt0029546","id":"n1040763"},"position":{"x":352.1098241705182,"y":329.9747422436066},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":101,"production_end_date":-1016496000000,"original_title":"A Damsel in Distress","start_year":1937,"rating":6.8,"count_votes":1673,"primary_title":"A Damsel in Distress","shooting_end_date":-1016496000000,"title_type":"movie","is_adult":0,"production_start_date":-1023926400000,"shooting_start_date":-1023926400000,"genres":["Comedy","Music","Romance"],"tconst":"tt0028757","id":"n1040628"},"position":{"x":-9.778468383295007,"y":253.85750616313828},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":107,"production_end_date":-1116720000000,"original_title":"The Gay Divorcee","start_year":1934,"rating":7.5,"count_votes":6527,"primary_title":"The Gay Divorcee","shooting_end_date":-1116720000000,"title_type":"movie","is_adult":0,"production_start_date":-1120694400000,"shooting_start_date":-1120694400000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0025164","id":"n1040008"},"position":{"x":70.94620924078757,"y":221.03181659730058},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":97,"production_end_date":-864777600000,"original_title":"You Were Never Lovelier","start_year":1942,"rating":7.3,"count_votes":3055,"primary_title":"You Were Never Lovelier","shooting_end_date":-864777600000,"title_type":"movie","is_adult":0,"production_start_date":-870480000000,"shooting_start_date":-870480000000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0035583","id":"n1042130"},"position":{"x":363.3083305802662,"y":276.3814372629362},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":-424569600000,"original_title":"Funny Face","start_year":1957,"rating":7,"count_votes":25226,"primary_title":"Funny Face","shooting_end_date":-424569600000,"title_type":"movie","is_adult":0,"production_start_date":-433296000000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-433296000000,"tconst":"tt0050419","id":"n1044197"},"position":{"x":83.44848807837886,"y":335.9343255353259},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":84,"production_end_date":-923184000000,"original_title":"Second Chorus","start_year":1940,"rating":5.8,"count_votes":1224,"primary_title":"Second Chorus","shooting_end_date":-923184000000,"title_type":"movie","is_adult":0,"production_start_date":-928627200000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-928627200000,"tconst":"tt0033029","id":"n1041601"},"position":{"x":234.04381053869122,"y":279.58307540500925},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":110,"production_end_date":-800150400000,"original_title":"Ziegfeld Follies","start_year":1945,"rating":6.5,"count_votes":2759,"primary_title":"Ziegfeld Follies","shooting_end_date":-789004800000,"title_type":"movie","is_adult":0,"production_start_date":-815356800000,"shooting_start_date":-820540800000,"genres":["Comedy","Musical"],"tconst":"tt0039116","id":"n1042802"},"position":{"x":225.79009882456094,"y":323.23228975871456},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":999216000000,"original_title":"Nelson Freire","start_year":2003,"rating":7.9,"count_votes":152,"primary_title":"Nelson Freire","shooting_end_date":999216000000,"title_type":"movie","is_adult":0,"production_start_date":957139200000,"genres":["Biography","Documentary","Music"],"shooting_start_date":957139200000,"tconst":"tt0360833","id":"n1059229"},"position":{"x":263.25258062555105,"y":362.2874269935385},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":106,"production_end_date":-31622400000,"original_title":"Midas Run","start_year":1969,"rating":5.5,"count_votes":99,"primary_title":"Midas Run","shooting_end_date":-31622400000,"title_type":"movie","is_adult":0,"production_start_date":-52185600000,"genres":["Adventure","Comedy","Crime"],"shooting_start_date":-52185600000,"tconst":"tt0064664","id":"n1045297"},"position":{"x":69.14035079996424,"y":283.05126173958536},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-949536000000,"original_title":"Broadway Melody of 1940","start_year":1940,"rating":7.3,"count_votes":2018,"primary_title":"Broadway Melody of 1940","shooting_end_date":-949536000000,"title_type":"movie","is_adult":0,"production_start_date":-957312000000,"shooting_start_date":-957312000000,"genres":["Musical"],"tconst":"tt0032284","id":"n1041408"},"position":{"x":379.41069644290997,"y":229.18701540742143},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":-1054684800000,"original_title":"Swing Time","start_year":1936,"rating":7.6,"count_votes":11613,"primary_title":"Swing Time","shooting_end_date":-1054684800000,"title_type":"movie","is_adult":0,"production_start_date":-1061683200000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-1061683200000,"tconst":"tt0028333","id":"n1040544"},"position":{"x":132.46244474821523,"y":185.31126687858426},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":83,"production_end_date":-992476800000,"original_title":"Carefree","start_year":1938,"rating":7.1,"count_votes":3135,"primary_title":"Carefree","shooting_end_date":-992476800000,"title_type":"movie","is_adult":0,"production_start_date":-1000944000000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-1000944000000,"tconst":"tt0029971","id":"n1040874"},"position":{"x":291.86131529212787,"y":306.3593268559256},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":117,"production_end_date":-407635200000,"original_title":"Silk Stockings","start_year":1957,"rating":6.8,"count_votes":3374,"primary_title":"Silk Stockings","shooting_end_date":-407635200000,"title_type":"movie","is_adult":0,"production_start_date":-414979200000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-414979200000,"tconst":"tt0050972","id":"n1044256"},"position":{"x":140.0590183273713,"y":142.3981902225176},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-881107200000,"original_title":"Holiday Inn","start_year":1942,"rating":7.4,"count_votes":12504,"primary_title":"Holiday Inn","shooting_end_date":-881107200000,"title_type":"movie","is_adult":0,"production_start_date":-887414400000,"genres":["Comedy","Drama","Music"],"shooting_start_date":-887414400000,"tconst":"tt0034862","id":"n1041995"},"position":{"x":74.88785819112115,"y":169.27431713397195},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":112,"production_end_date":-534124800000,"original_title":"The Band Wagon","start_year":1953,"rating":7.5,"count_votes":9465,"primary_title":"The Band Wagon","shooting_end_date":-534124800000,"title_type":"movie","is_adult":0,"production_start_date":-543715200000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-543715200000,"tconst":"tt0045537","id":"n1043654"},"position":{"x":357.66480375738786,"y":183.66546117541318},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":101,"production_end_date":-1091145600000,"original_title":"Top Hat","start_year":1935,"rating":7.8,"count_votes":16402,"primary_title":"Top Hat","shooting_end_date":-1091145600000,"title_type":"movie","is_adult":0,"production_start_date":-1096761600000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-1096761600000,"tconst":"tt0027125","id":"n1040348"},"position":{"x":198.36700595212875,"y":167.31839439264596},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":93,"production_end_date":-976147200000,"original_title":"The Story of Vernon and Irene Castle","start_year":1939,"rating":6.9,"count_votes":2163,"primary_title":"The Story of Vernon and Irene Castle","shooting_end_date":-976147200000,"title_type":"movie","is_adult":0,"production_start_date":-982800000000,"genres":["Biography","Drama","Musical"],"shooting_start_date":-982800000000,"tconst":"tt0031983","id":"n1041321"},"position":{"x":134.86899878205526,"y":255.3853499301934},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":93,"production_end_date":-607219200000,"original_title":"Royal Wedding","start_year":1951,"rating":6.7,"count_votes":4510,"primary_title":"Royal Wedding","shooting_end_date":-607219200000,"title_type":"movie","is_adult":0,"production_start_date":-615081600000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-615081600000,"tconst":"tt0043983","id":"n1043476"},"position":{"x":285.2011665926003,"y":242.33214765733248},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":88,"production_end_date":-897523200000,"original_title":"You'll Never Get Rich","start_year":1941,"rating":6.8,"count_votes":2038,"primary_title":"You'll Never Get Rich","shooting_end_date":-897523200000,"title_type":"movie","is_adult":0,"production_start_date":-902620800000,"shooting_start_date":-902620800000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0034409","id":"n1041911"},"position":{"x":145.58882738563238,"y":300.58893695805074},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-627868800000,"original_title":"Three Little Words","start_year":1950,"rating":6.9,"count_votes":1532,"primary_title":"Three Little Words","shooting_end_date":-627868800000,"title_type":"movie","is_adult":0,"production_start_date":-633312000000,"shooting_start_date":-633312000000,"genres":["Biography","Comedy","Musical"],"tconst":"tt0043044","id":"n1043362"},"position":{"x":72.39960590641374,"y":109.06553325228073},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":-690940800000,"original_title":"Easter Parade","start_year":1948,"rating":7.4,"count_votes":8062,"primary_title":"Easter Parade","shooting_end_date":-690940800000,"title_type":"movie","is_adult":0,"production_start_date":-697507200000,"genres":["Musical","Romance"],"shooting_start_date":-697507200000,"tconst":"tt0040308","id":"n1042965"},"position":{"x":154.30277537543333,"y":353.1960391581133},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":82,"production_end_date":-575856000000,"original_title":"The Belle of New York","start_year":1952,"rating":6.2,"count_votes":793,"primary_title":"The Belle of New York","shooting_end_date":-575856000000,"title_type":"movie","is_adult":0,"production_start_date":-585100800000,"shooting_start_date":-585100800000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0044408","id":"n1043522"},"position":{"x":360.27593426740077,"y":136.85335492834733},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":96,"production_end_date":220838400000,"original_title":"The Amazing Dobermans","start_year":1976,"rating":5.2,"count_votes":340,"primary_title":"The Amazing Dobermans","shooting_end_date":220838400000,"title_type":"movie","is_adult":0,"production_start_date":205977600000,"shooting_start_date":205977600000,"genres":["Comedy","Crime","Family"],"tconst":"tt0074130","id":"n1047031"},"position":{"x":-16.017383801737623,"y":193.8981631317572},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":133,"production_end_date":189216000000,"original_title":"That's Entertainment, Part II","start_year":1976,"rating":7.4,"count_votes":1933,"primary_title":"That's Entertainment, Part II","shooting_end_date":189216000000,"title_type":"movie","is_adult":0,"production_start_date":172713600000,"genres":["Documentary","Family","Musical"],"shooting_start_date":172713600000,"tconst":"tt0075323","id":"n1047278"},"position":{"x":-8.216127485204112,"y":145.0794364186402},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":165,"production_end_date":148089600000,"original_title":"The Towering Inferno","start_year":1974,"rating":6.9,"count_votes":37230,"primary_title":"The Towering Inferno","shooting_end_date":148089600000,"title_type":"movie","is_adult":0,"production_start_date":136598400000,"shooting_start_date":137289600000,"genres":["Action","Drama","Thriller"],"tconst":"tt0072308","id":"n1046713"},"position":{"x":0.6324317074309818,"y":310.7931234980899},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_t":1419984000000,"primary_profession":["actress","soundtrack"],"death_year":2014,"nconst":"nm0000002","primary_name":"Lauren Bacall","start_t":-1451692800000,"birth_year":1924,"id":"n1"},"position":{"x":-346.69606902082194,"y":-20.952474484381526},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":86,"production_end_date":930355200000,"original_title":"The Venice Project","start_year":1999,"rating":5.7,"count_votes":103,"primary_title":"The Venice Project","shooting_end_date":930355200000,"title_type":"movie","is_adult":0,"production_start_date":928713600000,"shooting_start_date":928713600000,"genres":["Drama"],"tconst":"tt0211719","id":"n1054989"},"position":{"x":-273.97799788552936,"y":24.873481806174482},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-686534400000,"original_title":"Key Largo","start_year":1948,"rating":7.8,"count_votes":35392,"primary_title":"Key Largo","shooting_end_date":-686534400000,"title_type":"movie","is_adult":0,"production_start_date":-696988800000,"genres":["Action","Crime","Drama"],"shooting_start_date":-696988800000,"tconst":"tt0040506","id":"n1043000"},"position":{"x":-490.01738380173765,"y":-10.267919945094604},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":95,"production_end_date":331171200000,"original_title":"The Fan","start_year":1981,"rating":5.7,"count_votes":1817,"primary_title":"The Fan","shooting_end_date":331171200000,"title_type":"movie","is_adult":0,"production_start_date":323395200000,"genres":["Drama","Horror","Thriller"],"shooting_start_date":323395200000,"tconst":"tt0082362","id":"n1048164"},"position":{"x":-267.7223619358904,"y":-31.677478894974996},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":118,"production_end_date":-765417600000,"original_title":"Confidential Agent","start_year":1945,"rating":6.5,"count_votes":911,"primary_title":"Confidential Agent","shooting_end_date":-765417600000,"title_type":"movie","is_adult":0,"production_start_date":-775872000000,"shooting_start_date":-775872000000,"genres":["Drama","Thriller"],"tconst":"tt0037610","id":"n1042563"},"position":{"x":-189.71740094995886,"y":35.59671390650763},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":121,"production_end_date":-134265600000,"original_title":"Harper","start_year":1966,"rating":6.9,"count_votes":7770,"primary_title":"Harper","shooting_end_date":-134265600000,"title_type":"movie","is_adult":0,"production_start_date":-142128000000,"genres":["Crime","Drama","Mystery"],"shooting_start_date":-142128000000,"tconst":"tt0060490","id":"n1044930"},"position":{"x":-398.97050102067453,"y":-88.88623036923636},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":106,"production_end_date":-723254400000,"original_title":"Dark Passage","start_year":1947,"rating":7.5,"count_votes":16761,"primary_title":"Dark Passage","shooting_end_date":-723254400000,"title_type":"movie","is_adult":0,"production_start_date":-733795200000,"genres":["Film-Noir","Thriller"],"shooting_start_date":-733795200000,"tconst":"tt0039302","id":"n1042827"},"position":{"x":-474.3705228071692,"y":-83.06754846433306},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":110,"production_end_date":-465696000000,"original_title":"Blood Alley","start_year":1955,"rating":6.3,"count_votes":2692,"primary_title":"Blood Alley","shooting_end_date":-465696000000,"title_type":"movie","is_adult":0,"production_start_date":-473385600000,"genres":["Action","Adventure"],"shooting_start_date":-473385600000,"tconst":"tt0047889","id":"n1043926"},"position":{"x":-340.69460257840103,"y":63.14375002297297},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":95,"production_end_date":-526176000000,"original_title":"How to Marry a Millionaire","start_year":1953,"rating":6.9,"count_votes":19550,"primary_title":"How to Marry a Millionaire","shooting_end_date":-526176000000,"title_type":"movie","is_adult":0,"production_start_date":-530668800000,"genres":["Comedy","Drama","Romance"],"shooting_start_date":-530668800000,"tconst":"tt0045891","id":"n1043696"},"position":{"x":-254.54404018825602,"y":79.01087304228452},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":114,"production_end_date":-757468800000,"original_title":"The Big Sleep","start_year":1946,"rating":7.9,"count_votes":75983,"primary_title":"The Big Sleep","shooting_end_date":-787968000000,"title_type":"movie","is_adult":0,"production_start_date":-820540800000,"genres":["Crime","Film-Noir","Mystery"],"shooting_start_date":-796089600000,"tconst":"tt0038355","id":"n1042682"},"position":{"x":-216.12620100462786,"y":-72.94492949796162},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":110,"production_end_date":-628560000000,"original_title":"Bright Leaf","start_year":1950,"rating":6.6,"count_votes":1070,"primary_title":"Bright Leaf","shooting_end_date":-628560000000,"title_type":"movie","is_adult":0,"production_start_date":-636422400000,"genres":["Drama","Romance"],"shooting_start_date":-636422400000,"tconst":"tt0042285","id":"n1043251"},"position":{"x":-410.5187591928593,"y":31.903103200386454},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":178,"production_end_date":1015113600000,"original_title":"Dogville","start_year":2003,"rating":8,"count_votes":131554,"primary_title":"Dogville","shooting_end_date":1015113600000,"title_type":"movie","is_adult":0,"production_start_date":1010620800000,"genres":["Crime","Drama"],"shooting_start_date":1010620800000,"tconst":"tt0276919","id":"n1057224"},"position":{"x":-340.0390714077949,"y":-104.07551106604757},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":108,"production_end_date":1167523200000,"original_title":"The Walker","start_year":2007,"rating":5.8,"count_votes":5118,"primary_title":"The Walker","shooting_end_date":1167523200000,"title_type":"movie","is_adult":0,"production_start_date":1143763200000,"genres":["Crime","Drama","Mystery"],"shooting_start_date":1143763200000,"tconst":"tt0783608","id":"n1063144"},"position":{"x":-403.3910894964025,"y":-136.31807873853532},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":91,"production_end_date":646704000000,"original_title":"A Star for Two","start_year":1991,"rating":5.4,"count_votes":196,"primary_title":"A Star for Two","shooting_end_date":646704000000,"title_type":"movie","is_adult":0,"production_start_date":642211200000,"genres":["Drama","Romance"],"shooting_start_date":642211200000,"tconst":"tt0166817","id":"n1053931"},"position":{"x":-426.49184561169716,"y":-39.95101071876998},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-809308800000,"original_title":"To Have and Have Not","start_year":1944,"rating":7.8,"count_votes":29330,"primary_title":"To Have and Have Not","shooting_end_date":-809308800000,"title_type":"movie","is_adult":0,"production_start_date":-815443200000,"shooting_start_date":-815443200000,"genres":["Adventure","Comedy","Film-Noir"],"tconst":"tt0037382","id":"n1042518"},"position":{"x":-263.12286038644316,"y":-114.00964010912708},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":93,"production_end_date":567907200000,"original_title":"Mr. North","start_year":1988,"rating":5.9,"count_votes":1160,"primary_title":"Mr. North","shooting_end_date":567907200000,"title_type":"movie","is_adult":0,"production_start_date":553737600000,"genres":["Comedy","Drama"],"shooting_start_date":553737600000,"tconst":"tt0095665","id":"n1049683"},"position":{"x":-469.6810531704257,"y":42.95131641742984},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":197078400000,"original_title":"The Shootist","start_year":1976,"rating":7.6,"count_votes":21104,"primary_title":"The Shootist","shooting_end_date":197078400000,"title_type":"movie","is_adult":0,"production_start_date":190339200000,"genres":["Drama","Romance","Western"],"shooting_start_date":190339200000,"tconst":"tt0075213","id":"n1047255"},"position":{"x":-405.3184875251619,"y":88.72889510677831},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"primary_profession":["actress","soundtrack","producer"],"nconst":"nm0000003","primary_name":"Brigitte Bardot","start_t":-1136073600000,"birth_year":1934,"id":"n2"},"position":{"x":385.4772774226966,"y":-91.48970202228784},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":120,"production_end_date":-126316800000,"original_title":"Viva Maria!","start_year":1965,"rating":6.3,"count_votes":3135,"primary_title":"Viva Maria!","shooting_end_date":-126316800000,"title_type":"movie","is_adult":0,"production_start_date":-155606400000,"genres":["Adventure","Comedy","Romance"],"shooting_start_date":-155606400000,"tconst":"tt0059956","id":"n1044899"},"position":{"x":486.34716806514166,"y":-133.77525282046204},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":113,"production_end_date":-31622400000,"original_title":"Shalako","start_year":1968,"rating":5.6,"count_votes":2583,"primary_title":"Shalako","shooting_end_date":-31622400000,"title_type":"movie","is_adult":0,"production_start_date":-63158400000,"genres":["Western"],"shooting_start_date":-63158400000,"tconst":"tt0063592","id":"n1045152"},"position":{"x":295.1503597667331,"y":-31.144568312445955},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"production_start_date":-94694400000,"runtime_minutes":180,"production_end_date":-44409600000,"original_title":"Faces of Paris","shooting_start_date":-94694400000,"genres":["Family"],"tconst":"tt4981286","start_year":1968,"primary_title":"Faces of Paris","shooting_end_date":-42163200000,"title_type":"tvMiniSeries","is_adult":0,"id":"n1076797"},"position":{"x":378.9181718072197,"y":-180.87403925089166},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":91,"production_end_date":31449600000,"original_title":"Les novices","start_year":1970,"rating":5.1,"count_votes":197,"primary_title":"Les novices","shooting_end_date":31449600000,"title_type":"movie","is_adult":0,"production_start_date":22723200000,"genres":["Comedy","Drama"],"shooting_start_date":22723200000,"tconst":"tt0066164","id":"n1045573"},"position":{"x":487.5173838017376,"y":-49.368926400996216},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":86,"production_end_date":-86400000,"original_title":"Les femmes","start_year":1969,"rating":5.5,"count_votes":322,"primary_title":"Les femmes","shooting_end_date":-86400000,"title_type":"movie","is_adult":0,"production_start_date":-24451200000,"genres":["Comedy"],"shooting_start_date":-24451200000,"tconst":"tt0064324","id":"n1045238"},"position":{"x":278.4826161982624,"y":-114.44416507466212},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_t":410140800000,"primary_profession":["actor","soundtrack","writer"],"death_year":1982,"nconst":"nm0000004","primary_name":"John Belushi","start_t":-662688000000,"birth_year":1949,"id":"n3"},"position":{"x":-292.6641378161322,"y":311.9568204270337},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":103,"production_end_date":349747200000,"original_title":"Continental Divide","start_year":1981,"rating":6.2,"count_votes":4413,"primary_title":"Continental Divide","shooting_end_date":349747200000,"title_type":"movie","is_adult":0,"production_start_date":340848000000,"shooting_start_date":340848000000,"genres":["Comedy","Romance"],"tconst":"tt0082200","id":"n1048145"},"position":{"x":-257.592740384437,"y":396.5340392508917},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":133,"production_end_date":315446400000,"original_title":"The Blues Brothers","start_year":1980,"rating":7.9,"count_votes":173882,"primary_title":"The Blues Brothers","shooting_end_date":318211200000,"title_type":"movie","is_adult":0,"production_start_date":283996800000,"shooting_start_date":303350400000,"genres":["Adventure","Comedy","Crime"],"tconst":"tt0080455","id":"n1047965"},"position":{"x":-298.3898245641278,"y":222.65596074910832},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":105,"production_end_date":247104000000,"original_title":"Goin' South","start_year":1978,"rating":6.2,"count_votes":6009,"primary_title":"Goin' South","shooting_end_date":247104000000,"title_type":"movie","is_adult":0,"production_start_date":239241600000,"genres":["Comedy","Crime","Romance"],"shooting_start_date":239241600000,"tconst":"tt0077621","id":"n1047612"},"position":{"x":-397.51738380173765,"y":300.39000788110434},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":94,"production_end_date":378604800000,"original_title":"Neighbors","start_year":1981,"rating":5.6,"count_votes":7133,"primary_title":"Neighbors","shooting_end_date":362620800000,"title_type":"movie","is_adult":0,"production_start_date":352252800000,"genres":["Comedy"],"shooting_start_date":356572800000,"tconst":"tt0082801","id":"n1048215"},"position":{"x":-361.04538703739684,"y":383.07333497690047},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":283910400000,"original_title":"Old Boyfriends","start_year":1979,"rating":5.4,"count_votes":229,"primary_title":"Old Boyfriends","shooting_end_date":283910400000,"title_type":"movie","is_adult":0,"production_start_date":258595200000,"genres":["Drama"],"shooting_start_date":258595200000,"tconst":"tt0079660","id":"n1047880"},"position":{"x":-184.11190002334558,"y":304.5726472395021},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_t":410140800000,"primary_profession":["actress","soundtrack","producer"],"death_year":1982,"nconst":"nm0000006","primary_name":"Ingrid Bergman","start_t":-1735689600000,"birth_year":1915,"id":"n4"},"position":{"x":11.148771061844513,"y":-282.1758200250565},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":113,"production_end_date":-906768000000,"original_title":"Dr. Jekyll and Mr. Hyde","start_year":1941,"rating":6.8,"count_votes":7910,"primary_title":"Dr. Jekyll and Mr. Hyde","shooting_end_date":-906768000000,"title_type":"movie","is_adult":0,"production_start_date":-912211200000,"shooting_start_date":-912211200000,"genres":["Drama","Horror","Sci-Fi"],"tconst":"tt0033553","id":"n1041718"},"position":{"x":96.36088384080887,"y":-387.82299392166175},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":120,"production_end_date":-284083200000,"original_title":"Goodbye Again","start_year":1961,"rating":7,"count_votes":2254,"primary_title":"Goodbye Again","shooting_end_date":-284083200000,"title_type":"movie","is_adult":0,"production_start_date":-292982400000,"genres":["Drama","Romance"],"shooting_start_date":-292982400000,"tconst":"tt0054936","id":"n1044585"},"position":{"x":157.02221939958312,"y":-207.49286314264563},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":114,"production_end_date":-820627200000,"original_title":"Gaslight","start_year":1944,"rating":7.8,"count_votes":22520,"primary_title":"Gaslight","shooting_end_date":-820627200000,"title_type":"movie","is_adult":0,"production_start_date":-833760000000,"genres":["Crime","Drama","Film-Noir"],"shooting_start_date":-833760000000,"tconst":"tt0036855","id":"n1042398"},"position":{"x":-138.09457201048372,"y":-340.7621876905607},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":145,"production_end_date":-689558400000,"original_title":"Joan of Arc","start_year":1948,"rating":6.4,"count_votes":2606,"primary_title":"Joan of Arc","shooting_end_date":-689558400000,"title_type":"movie","is_adult":0,"production_start_date":-703555200000,"genres":["Biography","Drama","War"],"shooting_start_date":-703555200000,"tconst":"tt0040491","id":"n1042996"},"position":{"x":68.6933843525205,"y":-344.1055530312496},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-347241600000,"original_title":"Indiscreet","start_year":1958,"rating":6.8,"count_votes":7280,"primary_title":"Indiscreet","shooting_end_date":-347241600000,"title_type":"movie","is_adult":0,"production_start_date":-378691200000,"genres":["Comedy","Romance"],"shooting_start_date":-378691200000,"tconst":"tt0051773","id":"n1044341"},"position":{"x":28.149313570454154,"y":-215.07317869581817},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":98,"production_end_date":-86400000,"original_title":"A Walk in the Spring Rain","start_year":1970,"rating":6.1,"count_votes":618,"primary_title":"A Walk in the Spring Rain","shooting_end_date":-86400000,"title_type":"movie","is_adult":0,"production_start_date":-22032000000,"shooting_start_date":-22032000000,"genres":["Drama","Romance"],"tconst":"tt0066542","id":"n1045655"},"position":{"x":-64.90725313591315,"y":-316.0606794688485},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":135,"production_end_date":-836956800000,"original_title":"Saratoga Trunk","start_year":1945,"rating":6.5,"count_votes":1111,"primary_title":"Saratoga Trunk","shooting_end_date":-820627200000,"title_type":"movie","is_adult":0,"production_start_date":-847497600000,"genres":["Drama","Romance","Western"],"shooting_start_date":-849398400000,"tconst":"tt0038053","id":"n1042640"},"position":{"x":67.87877913614065,"y":-170.77773814403668},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":120,"production_end_date":-730598400000,"original_title":"Arch of Triumph","start_year":1948,"rating":6.4,"count_votes":1293,"primary_title":"Arch of Triumph","shooting_end_date":-730598400000,"title_type":"movie","is_adult":0,"production_start_date":-740534400000,"shooting_start_date":-740534400000,"genres":["Drama","Romance","War"],"tconst":"tt0040109","id":"n1042940"},"position":{"x":-1.499021370366421,"y":-367.7573280085444},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":170,"production_end_date":-857433600000,"original_title":"For Whom the Bell Tolls","start_year":1943,"rating":6.9,"count_votes":7939,"primary_title":"For Whom the Bell Tolls","shooting_end_date":-857433600000,"title_type":"movie","is_adult":0,"production_start_date":-867974400000,"shooting_start_date":-867974400000,"genres":["Adventure","Drama","History"],"tconst":"tt0035896","id":"n1042189"},"position":{"x":-47.478048366307945,"y":-408.0440392508917},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":111,"production_end_date":-796953600000,"original_title":"Spellbound","start_year":1945,"rating":7.6,"count_votes":40960,"primary_title":"Spellbound","shooting_end_date":-796953600000,"title_type":"movie","is_adult":0,"production_start_date":-804816000000,"genres":["Film-Noir","Mystery","Romance"],"shooting_start_date":-804816000000,"tconst":"tt0038109","id":"n1042647"},"position":{"x":87.48920564696712,"y":-223.58559050624405},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-190684800000,"original_title":"The Visit","start_year":1964,"rating":7.5,"count_votes":1397,"primary_title":"The Visit","shooting_end_date":-190684800000,"title_type":"movie","is_adult":0,"production_start_date":-199238400000,"genres":["Drama"],"shooting_start_date":-199238400000,"tconst":"tt0058724","id":"n1044824"},"position":{"x":-78.15389196528776,"y":-362.4381253812861},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":105,"production_end_date":94608000000,"original_title":"From the Mixed-Up Files of Mrs. Basil E. Frankweiler","start_year":1973,"rating":6.3,"count_votes":452,"primary_title":"From the Mixed-Up Files of Mrs. Basil E. Frankweiler","shooting_end_date":94608000000,"title_type":"movie","is_adult":0,"production_start_date":81388800000,"shooting_start_date":81388800000,"genres":["Comedy","Drama","Family"],"tconst":"tt0070079","id":"n1046299"},"position":{"x":229.63289034426884,"y":-292.9760283209233},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":81,"production_end_date":-919296000000,"original_title":"Adam Had Four Sons","start_year":1941,"rating":6.6,"count_votes":797,"primary_title":"Adam Had Four Sons","shooting_end_date":-919296000000,"title_type":"movie","is_adult":0,"production_start_date":-923011200000,"shooting_start_date":-923011200000,"genres":["Drama","Romance"],"tconst":"tt0033314","id":"n1041661"},"position":{"x":151.87239178936952,"y":-332.4546776171385},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":85,"production_end_date":-912556800000,"original_title":"Rage in Heaven","start_year":1941,"rating":6.4,"count_votes":935,"primary_title":"Rage in Heaven","shooting_end_date":-912556800000,"title_type":"movie","is_adult":0,"production_start_date":-917827200000,"genres":["Drama","Thriller"],"shooting_start_date":-917827200000,"tconst":"tt0034078","id":"n1041829"},"position":{"x":-149.40934989147692,"y":-280.81879186794083},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-865123200000,"original_title":"Casablanca","start_year":1942,"rating":8.5,"count_votes":497036,"primary_title":"Casablanca","shooting_end_date":-865123200000,"title_type":"movie","is_adult":0,"production_start_date":-871171200000,"genres":["Drama","Romance","War"],"shooting_start_date":-871171200000,"tconst":"tt0034583","id":"n1041946"},"position":{"x":-15.365285688613454,"y":-173.56762811146052},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":-86400000,"original_title":"Cactus Flower","start_year":1969,"rating":7.2,"count_votes":8909,"primary_title":"Cactus Flower","shooting_end_date":-86400000,"title_type":"movie","is_adult":0,"production_start_date":-28080000000,"genres":["Comedy","Romance"],"shooting_start_date":-28080000000,"tconst":"tt0064117","id":"n1045207"},"position":{"x":145.85982176584375,"y":-263.244363694233},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":97,"production_end_date":197078400000,"original_title":"A Matter of Time","start_year":1976,"rating":5.2,"count_votes":499,"primary_title":"A Matter of Time","shooting_end_date":197078400000,"title_type":"movie","is_adult":0,"production_start_date":176083200000,"shooting_start_date":176083200000,"genres":["Drama","Fantasy","Romance"],"tconst":"tt0074878","id":"n1047184"},"position":{"x":-92.17584051860456,"y":-185.53534004859313},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-756000000000,"original_title":"Notorious","start_year":1946,"rating":7.9,"count_votes":88094,"primary_title":"Notorious","shooting_end_date":-756000000000,"title_type":"movie","is_adult":0,"production_start_date":-764553600000,"genres":["Drama","Film-Noir","Romance"],"shooting_start_date":-764553600000,"tconst":"tt0038787","id":"n1042751"},"position":{"x":83.36528072371229,"y":-293.65922479666256},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":78,"production_end_date":-993772800000,"original_title":"Dollar","start_year":1938,"rating":5.5,"count_votes":252,"primary_title":"Dollar","shooting_end_date":-993772800000,"title_type":"movie","is_adult":0,"production_start_date":-998956800000,"genres":["Comedy"],"shooting_start_date":-998956800000,"tconst":"tt0030066","id":"n1040897"},"position":{"x":-84.86635423699296,"y":-263.54777546970604},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-898041600000,"original_title":"The Maltese Falcon","start_year":1941,"rating":8,"count_votes":144303,"primary_title":"The Maltese Falcon","shooting_end_date":-898041600000,"title_type":"movie","is_adult":0,"production_start_date":-901411200000,"shooting_start_date":-901411200000,"genres":["Film-Noir","Mystery"],"tconst":"tt0033870","id":"n1041791"},"position":{"x":-52.87743237227767,"y":-6.640509939550583},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5"},"position":{"x":-108.04396127098647,"y":-114.4849897967377},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":105,"production_end_date":-578707200000,"original_title":"The African Queen","start_year":1951,"rating":7.7,"count_votes":68711,"primary_title":"The African Queen","shooting_end_date":-578707200000,"title_type":"movie","is_adult":0,"production_start_date":-589248000000,"shooting_start_date":-589248000000,"genres":["Adventure","Drama","Romance"],"tconst":"tt0043265","id":"n1043382"},"position":{"x":-176.18108922293348,"y":-214.05893759038202},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":126,"production_end_date":-708739200000,"original_title":"The Treasure of the Sierra Madre","start_year":1948,"rating":8.2,"count_votes":108196,"primary_title":"The Treasure of the Sierra Madre","shooting_end_date":-708739200000,"title_type":"movie","is_adult":0,"production_start_date":-717638400000,"genres":["Adventure","Drama","Western"],"shooting_start_date":-717638400000,"tconst":"tt0040897","id":"n1043065"},"position":{"x":87.18404701029496,"y":-87.25659646221382},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":97,"production_end_date":-946857600000,"original_title":"It All Came True","start_year":1940,"rating":6.7,"count_votes":933,"primary_title":"It All Came True","shooting_end_date":-946857600000,"title_type":"movie","is_adult":0,"production_start_date":-949622400000,"shooting_start_date":-949622400000,"genres":["Comedy","Crime","Drama"],"tconst":"tt0032643","id":"n1041509"},"position":{"x":-44.05790621324003,"y":-221.2430120410956},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-1009929600000,"original_title":"Kid Galahad","start_year":1937,"rating":7.2,"count_votes":2824,"primary_title":"Kid Galahad","shooting_end_date":-1009929600000,"title_type":"movie","is_adult":0,"production_start_date":-1041379200000,"genres":["Crime","Drama","Romance"],"shooting_start_date":-1041379200000,"tconst":"tt0029080","id":"n1040689"},"position":{"x":-193.31989255151814,"y":-23.416867784168147},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":94,"production_end_date":-633830400000,"original_title":"In a Lonely Place","start_year":1950,"rating":8,"count_votes":23875,"primary_title":"In a Lonely Place","shooting_end_date":-633830400000,"title_type":"movie","is_adult":0,"production_start_date":-637027200000,"shooting_start_date":-637027200000,"genres":["Drama","Film-Noir","Mystery"],"tconst":"tt0042593","id":"n1043296"},"position":{"x":-122.87870427925927,"y":-45.65491014648879},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":107,"production_end_date":-888969600000,"original_title":"All Through the Night","start_year":1942,"rating":7.1,"count_votes":3605,"primary_title":"All Through the Night","shooting_end_date":-888969600000,"title_type":"movie","is_adult":0,"production_start_date":-896832000000,"shooting_start_date":-896832000000,"genres":["Action","Comedy","Crime"],"tconst":"tt0034449","id":"n1041918"},"position":{"x":49.54268100050476,"y":-33.26990837106332},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":71,"production_end_date":-1041465600000,"original_title":"The Great O'Malley","start_year":1937,"rating":6.8,"count_votes":505,"primary_title":"The Great O'Malley","shooting_end_date":-1041465600000,"title_type":"movie","is_adult":0,"production_start_date":-1057276800000,"shooting_start_date":-1057276800000,"genres":["Drama"],"tconst":"tt0028955","id":"n1040666"},"position":{"x":-36.52421478962094,"y":-66.61157260539817},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":88,"production_end_date":-1041465600000,"original_title":"China Clipper","start_year":1936,"rating":6.3,"count_votes":474,"primary_title":"China Clipper","shooting_end_date":-1041465600000,"title_type":"movie","is_adult":0,"production_start_date":-1062547200000,"genres":["Drama"],"shooting_start_date":-1062547200000,"tconst":"tt0027445","id":"n1040400"},"position":{"x":-255.6126010799586,"y":-174.3609510601329},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":109,"production_end_date":-823305600000,"original_title":"Passage to Marseille","start_year":1944,"rating":6.9,"count_votes":3773,"primary_title":"Passage to Marseille","shooting_end_date":-823305600000,"title_type":"movie","is_adult":0,"production_start_date":-836438400000,"shooting_start_date":-836438400000,"genres":["Adventure","Drama","War"],"tconst":"tt0037166","id":"n1042473"},"position":{"x":-7.7561931014761,"y":-121.51093282016687},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-924307200000,"original_title":"High Sierra","start_year":1941,"rating":7.5,"count_votes":14244,"primary_title":"High Sierra","shooting_end_date":-924307200000,"title_type":"movie","is_adult":0,"production_start_date":-927158400000,"genres":["Action","Adventure","Crime"],"shooting_start_date":-927158400000,"tconst":"tt0033717","id":"n1041749"},"position":{"x":-189.01563138091285,"y":-159.43283329300354},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}],"edges":[{"data":{"characters":["Self"],"end":170035200000,"job":"","begin":169948800000,"id":"e1427802","source":"n0","target":"n1059218"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"SELF"},{"data":{"characters":["Bake Baker"],"act_end":-1072742400000,"act_begin":-1078358400000,"job":"","id":"e1489323","source":"n0","target":"n1040429"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Roy Earle"],"act_end":-924307200000,"act_begin":-927158400000,"job":"","id":"e1492525","source":"n5","target":"n1041749"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Johnny Parkson Riggs"],"act_end":-776822400000,"act_begin":-787708800000,"job":"","id":"e1494624","source":"n0","target":"n1042671"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Josh Barkley"],"act_end":-668131200000,"act_begin":-675302400000,"job":"","id":"e1495672","source":"n0","target":"n1043092"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Peter P. Peters aka Petrov"],"act_end":-1034467200000,"act_begin":-1042070400000,"job":"","id":"e1490117","source":"n0","target":"n1040763"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Jerry Halliday"],"act_end":-1016496000000,"act_begin":-1023926400000,"job":"","id":"e1489789","source":"n0","target":"n1040628"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Guy Holden"],"act_end":-1116720000000,"act_begin":-1120694400000,"job":"","id":"e1488352","source":"n0","target":"n1040008"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Robert Davis"],"act_end":-864777600000,"act_begin":-870480000000,"job":"","id":"e1493414","source":"n0","target":"n1042130"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Jean Matrac"],"act_end":-823305600000,"act_begin":-836438400000,"job":"","id":"e1494171","source":"n5","target":"n1042473"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Danny O'Neill"],"act_end":-923184000000,"act_begin":-928627200000,"job":"","id":"e1492167","source":"n0","target":"n1041601"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Fred Astaire ('Here's to the Ladies')","Raffles ('This Heart of Mine')","Tai Long ('Limehouse Blues')"],"act_end":-789004800000,"act_begin":-820540800000,"job":"","id":"e1494954","source":"n0","target":"n1042802"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Self"],"end":999216000000,"job":"","begin":957139200000,"id":"e1701191","source":"n0","target":"n1059229"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ARCHIVE_FOOTAGE"},{"data":{"characters":["John Pedley"],"act_end":-31622400000,"act_begin":-52185600000,"job":"","id":"e1500677","source":"n0","target":"n1045297"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Johnny Brett"],"act_end":-949536000000,"act_begin":-957312000000,"job":"","id":"e1491682","source":"n0","target":"n1041408"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Lucky Garnett"],"act_end":-1054684800000,"act_begin":-1061683200000,"job":"","id":"e1489588","source":"n0","target":"n1040544"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Tony Flagg"],"act_end":-992476800000,"act_begin":-1000944000000,"job":"","id":"e1490382","source":"n0","target":"n1040874"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Steve Canfield"],"act_end":-407635200000,"act_begin":-414979200000,"job":"","id":"e1498333","source":"n0","target":"n1044256"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Ted Hanover"],"act_end":-881107200000,"act_begin":-887414400000,"job":"","id":"e1493095","source":"n0","target":"n1041995"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Tony Hunter"],"act_end":-534124800000,"act_begin":-543715200000,"job":"","id":"e1496955","source":"n0","target":"n1043654"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Jerry Travers"],"act_end":-1091145600000,"act_begin":-1096761600000,"job":"","id":"e1489138","source":"n0","target":"n1040348"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Vernon Castle"],"act_end":-976147200000,"act_begin":-982800000000,"job":"","id":"e1491474","source":"n0","target":"n1041321"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Tom Bowen"],"act_end":-607219200000,"act_begin":-615081600000,"job":"","id":"e1496560","source":"n0","target":"n1043476"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Robert Curtis"],"act_end":-897523200000,"act_begin":-902620800000,"job":"","id":"e1492900","source":"n0","target":"n1041911"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Hap Stuart"],"act_end":-1041465600000,"act_begin":-1062547200000,"job":"","id":"e1489262","source":"n5","target":"n1040400"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Don Hewes"],"act_end":-690940800000,"act_begin":-697507200000,"job":"","id":"e1495338","source":"n0","target":"n1042965"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Charlie Hill"],"act_end":-575856000000,"act_begin":-585100800000,"job":"","id":"e1496667","source":"n0","target":"n1043522"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Daniel Hughes"],"act_end":220838400000,"act_begin":205977600000,"job":"","id":"e1504533","source":"n0","target":"n1047031"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Self - Co-Host","Narrator"],"end":189216000000,"job":"","begin":172713600000,"id":"e1426468","source":"n0","target":"n1047278"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"SELF"},{"data":{"source":"n0","target":"n1044463","id":"collapsedEdge_n0_n1044463_unknown_927335402835","collapsedEdges":[{"data":{"characters":["Julian Osborn"],"act_end":-339811200000,"act_begin":-347155200000,"job":"","id":"e1498791","source":"n0","target":"n1044463"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":-339811200000,"begin":-347155200000,"id":"e0","source":"n0","target":"n1044463"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"source":"n0","target":"n1044197","id":"collapsedEdge_n0_n1044197_unknown_1497372106241","collapsedEdges":[{"data":{"characters":["Dick Avery"],"act_end":-424569600000,"act_begin":-433296000000,"job":"","id":"e1498199","source":"n0","target":"n1044197"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":-424569600000,"begin":-433296000000,"id":"e3","source":"n0","target":"n1044197"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"end":148089600000,"begin":136598400000,"id":"e1","source":"n0","target":"n1046713"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"},{"data":{"characters":["Philip Marlowe"],"act_end":-787968000000,"act_begin":-796089600000,"job":"","id":"e1494653","source":"n5","target":"n1042682"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Countess Camilla Volta"],"act_end":930355200000,"act_begin":928713600000,"job":"","id":"e1645096","source":"n1","target":"n1054989"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Nora Temple"],"act_end":-686534400000,"act_begin":-696988800000,"job":"","id":"e1630681","source":"n1","target":"n1043000"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Sally Ross"],"act_end":331171200000,"act_begin":323395200000,"job":"","id":"e1636754","source":"n1","target":"n1048164"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Rose Cullen"],"act_end":-765417600000,"act_begin":-775872000000,"job":"","id":"e1630108","source":"n1","target":"n1042563"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Mrs. Sampson"],"act_end":-134265600000,"act_begin":-142128000000,"job":"","id":"e1633073","source":"n1","target":"n1044930"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Irene Jansen"],"act_end":-723254400000,"act_begin":-733795200000,"job":"","id":"e1630455","source":"n1","target":"n1042827"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Cathy Grainger"],"act_end":-465696000000,"act_begin":-473385600000,"job":"","id":"e1631811","source":"n1","target":"n1043926"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Schatze Page"],"act_end":-526176000000,"act_begin":-530668800000,"job":"","id":"e1631562","source":"n1","target":"n1043696"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["John Phillips"],"act_end":-1041465600000,"act_begin":-1057276800000,"job":"","id":"e1489883","source":"n5","target":"n1040666"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Sonia Kovac"],"act_end":-628560000000,"act_begin":-636422400000,"job":"","id":"e1630987","source":"n1","target":"n1043251"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Ma Ginger"],"act_end":1015113600000,"act_begin":1010620800000,"job":"","id":"e1646794","source":"n1","target":"n1057224"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Natalie Van Miter"],"act_end":1167523200000,"act_begin":1143763200000,"job":"","id":"e1652253","source":"n1","target":"n1063144"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Edwige"],"act_end":646704000000,"act_begin":642211200000,"job":"","id":"e1643907","source":"n1","target":"n1053931"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"source":"n4","target":"n1042751","id":"collapsedEdge_n4_n1042751_unknown_1561609472164","collapsedEdges":[{"data":{"characters":["Alicia Huberman"],"act_end":-756000000000,"act_begin":-764553600000,"job":"","id":"e1630342","source":"n4","target":"n1042751"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-756000000000,"begin":-764553600000,"id":"e10","source":"n4","target":"n1042751"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Mrs. Cranston"],"act_end":567907200000,"act_begin":553737600000,"job":"","id":"e1638692","source":"n1","target":"n1049683"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Bond Rogers"],"act_end":197078400000,"act_begin":190339200000,"job":"","id":"e1635676","source":"n1","target":"n1047255"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"source":"n1","target":"n1042682","id":"collapsedEdge_n1_n1042682_unknown_28278535991","collapsedEdges":[{"data":{"characters":["Vivian Rutledge"],"act_end":-787968000000,"act_begin":-796089600000,"job":"","id":"e1630253","source":"n1","target":"n1042682"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-757468800000,"begin":-820540800000,"id":"e4","source":"n1","target":"n1042682"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"source":"n0","target":"n1043362","id":"collapsedEdge_n0_n1043362_unknown_1287532024673","collapsedEdges":[{"data":{"characters":["Bert Kalmar"],"act_end":-627868800000,"act_begin":-633312000000,"job":"","id":"e1496279","source":"n0","target":"n1043362"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":-627868800000,"begin":-633312000000,"id":"e2","source":"n0","target":"n1043362"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["'Gloves' Donahue"],"act_end":-888969600000,"act_begin":-896832000000,"job":"","id":"e1492918","source":"n5","target":"n1041918"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Irina Lazaar"],"act_end":-31622400000,"act_begin":-63158400000,"job":"","id":"e1633338","source":"n2","target":"n1045152"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Self"],"end":-44409600000,"job":"","begin":-94694400000,"id":"e1433263","source":"n2","target":"n1076797"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"SELF"},{"data":{"characters":["Agnès"],"act_end":31449600000,"act_begin":22723200000,"job":"","id":"e1633839","source":"n2","target":"n1045573"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Clara"],"act_end":-86400000,"act_begin":-24451200000,"job":"","id":"e1633451","source":"n2","target":"n1045238"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"source":"n1","target":"n1042518","id":"collapsedEdge_n1_n1042518_unknown_881651445229","collapsedEdges":[{"data":{"characters":["Marie 'Slim' Browning"],"act_end":-809308800000,"act_begin":-815443200000,"job":"","id":"e1630050","source":"n1","target":"n1042518"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-809308800000,"begin":-815443200000,"id":"e5","source":"n1","target":"n1042518"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Ernie Souchak"],"act_end":349747200000,"act_begin":340848000000,"job":"","id":"e1507091","source":"n3","target":"n1048145"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Dixon Steele"],"act_end":-633830400000,"act_begin":-637027200000,"job":"","id":"e1496124","source":"n5","target":"n1043296"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Deputy Hector"],"act_end":247104000000,"act_begin":239241600000,"job":"","id":"e1505831","source":"n3","target":"n1047612"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Earl Keese"],"act_end":362620800000,"act_begin":356572800000,"job":"","id":"e1507251","source":"n3","target":"n1048215"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Eric Katz"],"act_end":283910400000,"act_begin":258595200000,"job":"","id":"e1506457","source":"n3","target":"n1047880"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"source":"n2","target":"n1044899","id":"collapsedEdge_n2_n1044899_unknown_1515761405837","collapsedEdges":[{"data":{"characters":["Maria I"],"act_end":-126316800000,"act_begin":-155606400000,"job":"","id":"e1633037","source":"n2","target":"n1044899"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-126316800000,"begin":-155606400000,"id":"e6","source":"n2","target":"n1044899"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Ivy Peterson"],"act_end":-906768000000,"act_begin":-912211200000,"job":"","id":"e1629013","source":"n4","target":"n1041718"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Paula Tessier"],"act_end":-284083200000,"act_begin":-292982400000,"job":"","id":"e1632623","source":"n4","target":"n1044585"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Turkey Morgan"],"act_end":-1009929600000,"act_begin":-1041379200000,"job":"","id":"e1489936","source":"n5","target":"n1040689"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Joan of Arc"],"act_end":-689558400000,"act_begin":-703555200000,"job":"","id":"e1630675","source":"n4","target":"n1042996"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Anna Kalman"],"act_end":-347241600000,"act_begin":-378691200000,"job":"","id":"e1632302","source":"n4","target":"n1044341"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Libby Meredith"],"act_end":-86400000,"act_begin":-22032000000,"job":"","id":"e1633938","source":"n4","target":"n1045655"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Clio Dulaine"],"act_end":-820627200000,"act_begin":-849398400000,"job":"","id":"e1630208","source":"n4","target":"n1042640"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Joan Madou"],"act_end":-730598400000,"act_begin":-740534400000,"job":"","id":"e1630607","source":"n4","target":"n1042940"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["María"],"act_end":-857433600000,"act_begin":-867974400000,"job":"","id":"e1629634","source":"n4","target":"n1042189"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Grasselli","Chips Maguire"],"act_end":-946857600000,"act_begin":-949622400000,"job":"","id":"e1491939","source":"n5","target":"n1041509"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Karla Zachanassian"],"act_end":-190684800000,"act_begin":-199238400000,"job":"","id":"e1632936","source":"n4","target":"n1044824"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Mrs. Frankweiler"],"act_end":94608000000,"act_begin":81388800000,"job":"","id":"e1634685","source":"n4","target":"n1046299"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Emilie Gallatin"],"act_end":-919296000000,"act_begin":-923011200000,"job":"","id":"e1628936","source":"n4","target":"n1041661"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Stella Bergen"],"act_end":-912556800000,"act_begin":-917827200000,"job":"","id":"e1629164","source":"n4","target":"n1041829"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Ilsa Lund"],"act_end":-865123200000,"act_begin":-871171200000,"job":"","id":"e1629315","source":"n4","target":"n1041946"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Stephanie Dickinson"],"act_end":-86400000,"act_begin":-28080000000,"job":"","id":"e1633411","source":"n4","target":"n1045207"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Contessa Sanziani"],"act_end":197078400000,"act_begin":176083200000,"job":"","id":"e1635600","source":"n4","target":"n1047184"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Fred C. Dobbs"],"act_end":-708739200000,"act_begin":-717638400000,"job":"","id":"e1495596","source":"n5","target":"n1043065"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Julia Balzar"],"act_end":-993772800000,"act_begin":-998956800000,"job":"","id":"e1627942","source":"n4","target":"n1040897"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"source":"n4","target":"n1042647","id":"collapsedEdge_n4_n1042647_unknown_978192010635","collapsedEdges":[{"data":{"characters":["Dr. Constance Petersen"],"act_end":-796953600000,"act_begin":-804816000000,"job":"","id":"e1630216","source":"n4","target":"n1042647"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-796953600000,"begin":-804816000000,"id":"e9","source":"n4","target":"n1042647"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"source":"n4","target":"n1042398","id":"collapsedEdge_n4_n1042398_unknown_472961376331","collapsedEdges":[{"data":{"characters":["Paula Alquist"],"act_end":-820627200000,"act_begin":-833760000000,"job":"","id":"e1629887","source":"n4","target":"n1042398"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-820627200000,"begin":-833760000000,"id":"e8","source":"n4","target":"n1042398"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"source":"n3","target":"n1047965","id":"collapsedEdge_n3_n1047965_unknown_363825569668","collapsedEdges":[{"data":{"characters":["Joliet Jake"],"act_end":318211200000,"act_begin":303350400000,"job":"","id":"e1506660","source":"n3","target":"n1047965"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":315446400000,"begin":283996800000,"id":"e7","source":"n3","target":"n1047965"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"end":-898041600000,"begin":-901411200000,"id":"e11","source":"n5","target":"n1041791"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"},{"data":{"end":-809308800000,"begin":-815443200000,"id":"e12","source":"n5","target":"n1042518"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"},{"data":{"end":-865123200000,"begin":-871171200000,"id":"e13","source":"n5","target":"n1041946"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"},{"data":{"source":"n5","target":"n1043382","id":"collapsedEdge_n5_n1043382_unknown_1331086016415","collapsedEdges":[{"data":{"characters":["Charlie Allnutt"],"act_end":-578707200000,"act_begin":-589248000000,"job":"","id":"e1496331","source":"n5","target":"n1043382"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":-578707200000,"begin":-589248000000,"id":"e14","source":"n5","target":"n1043382"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"}]} \ No newline at end of file diff --git a/cypress/downloads/visuall.png b/cypress/downloads/visuall.png deleted file mode 100644 index 5c9839fb..00000000 Binary files a/cypress/downloads/visuall.png and /dev/null differ diff --git a/cypress/e2e/app.cy.js b/cypress/e2e/app.cy.js deleted file mode 100644 index 3f98d4b5..00000000 --- a/cypress/e2e/app.cy.js +++ /dev/null @@ -1,26 +0,0 @@ -import { open, navbarAction } from '../helper'; - -context('Global properties about Visuall', () => { - - beforeEach(open); - - it('TC1: Can show object properties by selecting', () => { - navbarAction('Data', 'Sample Data'); - cy.window().then((win) => { - win.cy.nodes()[0].select(); - }); - - cy.get('div#prop-tab.collapse.show').should('be.visible'); - }); - - it('TC2: Should maintain settings when "Store user profile" is checked (true by default)', () => { - cy.get('a.nav-link').contains('Settings').click(); - cy.get('label').contains('Emphasize on hover').siblings('input[type="checkbox"]').first().should('not.to.be.checked'); - cy.get('label').contains('Emphasize on hover').siblings('input[type="checkbox"]').first().check(); - open(); - cy.get('a.nav-link').contains('Settings').click(); - cy.get('label').contains('Emphasize on hover').siblings('input[type="checkbox"]').first().should('be.checked'); - cy.get('label').contains('Emphasize on hover').siblings('input[type="checkbox"]').first().should('be.checked'); - }); - -}); \ No newline at end of file diff --git a/cypress/e2e/filterByType.cy.js b/cypress/e2e/filterByType.cy.js deleted file mode 100644 index 823d97d5..00000000 --- a/cypress/e2e/filterByType.cy.js +++ /dev/null @@ -1,34 +0,0 @@ -import { open, navbarAction } from '../helper'; - -context('Filter By Node/Edge Type', () => { - - beforeEach(open); - - it('TC1: Filter by node/edge type should show or hide based on type', () => { - navbarAction('Data', 'Sample Data'); - // hide 'Person' node type - cy.get('a.filter-node-class').contains('Person').click(); - cy.window().then((win) => { - expect(win.cy.$('node:visible').filter('.Person').length == 0).to.eq(true); - }); - - // show 'Person' node type - cy.get('a.filter-node-class').contains('Person').click(); - cy.window().then((win) => { - expect(win.cy.$('node:visible').filter('.Person').length > 0).to.eq(true); - }); - - // hide 'ACTOR' edge type - cy.get('a.filter-edge-class').contains('ACTOR').click(); - cy.window().then((win) => { - expect(win.cy.$('edge:visible').filter('.ACTOR').length == 0).to.eq(true); - }); - - // show 'ACTOR' edge type - cy.get('a.filter-edge-class').contains('ACTOR').click(); - cy.window().then((win) => { - expect(win.cy.$('edge:visible').filter('.ACTOR').length > 0).to.eq(true); - }); - }); - -}); \ No newline at end of file diff --git a/cypress/e2e/generalQueries.cy.js b/cypress/e2e/generalQueries.cy.js deleted file mode 100644 index c485b5e1..00000000 --- a/cypress/e2e/generalQueries.cy.js +++ /dev/null @@ -1,110 +0,0 @@ -import { open, navbarAction, openSubTab, openTab, click2options } from '../helper'; - -context('General Queries implemented in the backend side', () => { - - beforeEach(open); - - it('TC1: "Get Neigborhood" query should bring some nodes and edges', () => { - navbarAction('Data', 'Sample Data'); - openTab('Database'); - - cy.get('select.form-select:visible').select('Get neighborhood'); - - cy.get('img[title="Select nodes to add"]').click(); - - cy.window().then((win) => { - win.cy.nodes()[0].select(); - }); - - cy.get('img[title="Complete selection"]').click(); - - navbarAction('Data', 'Clear Data'); - cy.wait(1000); - - cy.get('input#isGraph.form-check-input:visible').eq(0).check(); - cy.get('input[value="Execute"]:visible').click(); - - cy.wait(3000); - - cy.window().then((win) => { - expect(win.cy.nodes().length > 3).to.eq(true); - expect(win.cy.edges().length > 3).to.eq(true); - }); - }); - - - it('TC2: "Get graph of interest" query should bring some nodes and edges', () => { - navbarAction('Data', 'Sample Data'); - openTab('Database'); - - cy.get('select.form-select:visible').select('Get graph of interest'); - - cy.get('img[title="Select nodes to add"]').click(); - - cy.window().then((win) => { - win.cy.$id('n1').select(); - win.cy.$id('n4').select(); - }); - - cy.get('img[title="Complete selection"]').click(); - - navbarAction('Data', 'Clear Data'); - cy.wait(1000); - - click2options(); - cy.get('input.form-control.inp-3-char:visible').clear(); - cy.get('input.form-control.inp-3-char:visible').type(4); - // uncheck directed - cy.get('input[type="checkbox"].form-check-input:visible').uncheck(); - click2options(); - - // check graph - cy.get('input#isGraph.form-check-input:visible').eq(0).check(); - cy.get('input[value="Execute"]:visible').click(); - - cy.wait(3000); - - cy.window().then((win) => { - expect(win.cy.nodes().length > 2).to.eq(true); - expect(win.cy.edges().length > 2).to.eq(true); - }); - }); - - - it('TC3: "Get common targets/regulators" query should bring some nodes and edges', () => { - navbarAction('Data', 'Sample Data'); - openTab('Database'); - - cy.get('select.form-select:visible').select('Get common targets/regulators'); - - cy.get('img[title="Select nodes to add"]').click(); - - cy.window().then((win) => { - win.cy.$id('n1').select(); - win.cy.$id('n4').select(); - }); - - cy.get('img[title="Complete selection"]').click(); - - navbarAction('Data', 'Clear Data'); - cy.wait(1000); - - click2options(); - - // uncheck directed - cy.get('input[type="checkbox"].form-check-input:visible').uncheck(); - click2options(); - - // check graph - cy.get('input#isGraph.form-check-input:visible').eq(0).check(); - cy.get('input[value="Execute"]:visible').click(); - - cy.wait(3000); - - cy.window().then((win) => { - expect(win.cy.nodes().length > 2).to.eq(true); - expect(win.cy.edges().length > 2).to.eq(true); - }); - }); - -}); \ No newline at end of file diff --git a/cypress/e2e/graphTheoreticProperty.cy.js b/cypress/e2e/graphTheoreticProperty.cy.js deleted file mode 100644 index 92cded1f..00000000 --- a/cypress/e2e/graphTheoreticProperty.cy.js +++ /dev/null @@ -1,20 +0,0 @@ -import { open, navbarAction, openSubTab } from "../helper"; - -context("Calculate Theoretic Property", () => { - beforeEach(open); - - it("TC1: Can calculate degree centrality and set widths", () => { - navbarAction("Data", "Sample Data"); - openSubTab("Calculate Theoretic Property"); - - cy.get("select.form-select.tight-select:visible").select( - "Degree Centrality" - ); - cy.get('input[value="Execute"]:visible').click(); - - cy.window().then((win) => { - expect(win.cy.$id("n0").width() == 60).to.eq(true); - expect(win.cy.$id("n4").width() > 45).to.eq(true); - }); - }); -}); diff --git a/cypress/e2e/groupNodes.cy.js b/cypress/e2e/groupNodes.cy.js deleted file mode 100644 index 58dfabe3..00000000 --- a/cypress/e2e/groupNodes.cy.js +++ /dev/null @@ -1,17 +0,0 @@ -import { open, navbarAction, openSubTab, groupBy } from '../helper'; - -context('Group Nodes', () => { - - beforeEach(open); - - it('TC1: Can group with Louvain using compounds', () => { - navbarAction('Data', 'Sample Data'); - openSubTab('Group Nodes'); - - groupBy('By the Louvain modularity algorithm', true); - groupBy('None', false); - groupBy('By the Markov clustering algorithm', true); - groupBy('None', false); - }); - -}); \ No newline at end of file diff --git a/cypress/e2e/navbar.cy.js b/cypress/e2e/navbar.cy.js deleted file mode 100644 index e9753d6d..00000000 --- a/cypress/e2e/navbar.cy.js +++ /dev/null @@ -1,277 +0,0 @@ -import { open, navbarAction, openSubTab, openTab, groupBy } from '../helper'; - -context('Navbar buttons', () => { - - beforeEach(open); - - /** - * @param {boolean} isSaveSettings - * @param {boolean} isSaveFilteringRules - * @param {boolean} isSaveTimebarMetrics - */ - function click2saveUserProfile(isSaveSettings, isSaveFilteringRules, isSaveTimebarMetrics) { - if (!isSaveSettings) { - cy.get('#save-profile-cb0').click(); - } - if (!isSaveFilteringRules) { - cy.get('#save-profile-cb1').click(); - } - if (!isSaveTimebarMetrics) { - cy.get('#save-profile-cb2').click(); - } - cy.get('button.btn.btn-primary.va-text').contains('OK').click(); - } - - it('TC1: should have at least 7 buttons on navbar', () => { - cy.get('button.dropdown-toggle').its('length').should('eq', 7); - }); - - it('TC2: Can save as JSON and PNG', () => { - navbarAction('Data', 'Sample Data'); - navbarAction('File', 'Save'); - - cy.window().then((win) => { - win.cy.$().select(); - navbarAction('File', 'Save Selected Objects'); - - navbarAction('File', 'Save as PNG...'); - cy.get('button#save-png-btn1').click(); - navbarAction('File', 'Save as PNG...'); - win.cy.zoom(3); - cy.get('button#save-png-btn2').click(); - }); - }); - - it('TC3: Can save user profile', () => { - for (let i = 0; i < 2; i++) { - for (let j = 0; j < 2; j++) { - for (let k = 0; k < 2; k++) { - navbarAction('File', 'Save User Profile...'); - click2saveUserProfile(i == 0, j == 0, k == 0); - } - } - } - }); - - it('TC4: Can add/remove group manually, delete selected', () => { - navbarAction('Data', 'Sample Data'); - - cy.window().then((win) => { - win.cy.$().select(); - }); - - navbarAction('Edit', 'Add Group for Selected'); - cy.window().then((win) => { - expect(win.cy.$(':parent').length).to.eq(1); - win.cy.$().unselect(); - win.cy.$(':parent').select(); - }); - navbarAction('Edit', 'Remove Group for Selected'); - cy.window().then((win) => { - expect(win.cy.$(':parent').length).to.eq(0); - }); - openTab('Map'); - openSubTab('Group Nodes'); - groupBy('By the Louvain modularity algorithm', true); - cy.window().then((win) => { - expect(win.cy.$(':parent').length > 2).to.eq(true); - }); - navbarAction('Edit', 'Remove All Groups'); - - cy.window().then((win) => { - expect(win.cy.$(':parent').length == 0).to.eq(true); - }); - - // delete selected - let cntBefore = -1; - cy.window().then((win) => { - cntBefore = win.cy.$().length; - win.cy.$().slice(0, 10).select(); - }); - navbarAction('Edit', 'Delete Selected'); - cy.window().then((win) => { - const cntAfter = win.cy.$().length; - expect(cntAfter <= cntBefore + 10).to.eq(true); - }); - }); - - it('TC5: Use history to go back and forth', () => { - navbarAction('Data', 'Sample Data'); - let cnt0 = 0; - openSubTab('Query by Rule'); - cy.window().then((win) => { - cnt0 = win.cy.$().length; - }); - cy.get('img[alt="Add Rule"]:visible').click(); - cy.get('button').contains('Condition').click(); - cy.get('img[title="Add/Update"]:visible').click(); - cy.get('input.cb-is-load-graph').check(); - cy.get('input[value="Execute"]:visible').click(); - cy.wait(5000); - let cnt1 = -1; - cy.window().then((win) => { - cnt1 = win.cy.$().length; - expect(cnt1 >= 5 + cnt0).to.eq(true); - }); - - navbarAction('Edit', 'Query History'); - cy.get('button.list-group-item').eq(0).click(); - let cnt2 = -1; - cy.window().then((win) => { - cnt2 = win.cy.$().length; - expect(cnt2 == cnt0).to.eq(true); - }); - - cy.get('button.list-group-item').eq(1).click(); - let cnt3 = -1; - cy.window().then((win) => { - cnt3 = win.cy.$().length; - expect(cnt3 == cnt1).to.eq(true); - }); - }); - - it('TC6: Hide and/or show elements', () => { - navbarAction('Data', 'Sample Data'); - let cnt0 = 0; - cy.window().then((win) => { - cnt0 = win.cy.$(':visible').length; - win.cy.$().slice(0, 10).select(); - }); - - navbarAction('View', 'Hide Selected'); - cy.window().then((win) => { - const cnt1 = win.cy.$(':visible').length; - expect(cnt1 < cnt0).to.eq(true); - }); - - navbarAction('View', 'Show All'); - let cnt2 = 0; - cy.window().then((win) => { - cnt2 = win.cy.$(':visible').length; - // some collapsed edges might be expanded. So cnt2 can be greater. - expect(cnt2 >= cnt0).to.eq(true); - }); - }); - - it('TC7: Expand/collapse nodes and edges', () => { - navbarAction('Data', 'Sample Data'); - openSubTab('Group Nodes'); - groupBy('By the Louvain modularity algorithm', true); - let compoundCount = -1; - cy.window().then((win) => { - compoundCount = win.cy.$(':parent').length; - expect(compoundCount > 2).to.eq(true); - }); - - navbarAction('View', 'Collapse All Nodes'); - cy.window().then((win) => { - const collapsedCount = win.cy.$('.cy-expand-collapse-collapsed-node').length; - expect(collapsedCount == compoundCount).to.eq(true); - }); - - navbarAction('View', 'Expand All Nodes'); - let compoundEdgeCnt = -1; - cy.window().then((win) => { - const compoundCount2 = win.cy.$(':parent').length; - expect(compoundCount2 == compoundCount).to.eq(true); - compoundEdgeCnt = win.cy.$('.cy-expand-collapse-collapsed-edge').length; - expect(compoundEdgeCnt > 0).to.eq(true); - }); - - navbarAction('View', 'Expand All Edges'); - cy.window().then((win) => { - const compoundEdgeCnt2 = win.cy.$('.cy-expand-collapse-collapsed-edge').length; - expect(compoundEdgeCnt2 == 0).to.eq(true); - }); - - navbarAction('View', 'Collapse All Edges'); - cy.window().then((win) => { - const compoundEdgeCnt3 = win.cy.$('.cy-expand-collapse-collapsed-edge').length; - expect(compoundEdgeCnt == compoundEdgeCnt3).to.eq(true); - }); - }); - - it('TC8: Can highlight by seleting or searching', () => { - navbarAction('Data', 'Sample Data'); - - let sumClassCnt = -1; - cy.window().then((win) => { - sumClassCnt = win.cy.$().map(x => x.classes().length).reduce((s, x) => s + x, 0); - }); - - navbarAction('Highlight', 'Search...'); - const inpId = 'highlight-search-inp'; - cy.focused().should('have.attr', 'id').and('equal', inpId); - - cy.get('#' + inpId).type('a'); - cy.get('body').type('{enter}'); - - cy.window().then((win) => { - const sumClassCnt2 = win.cy.$().map(x => x.classes().length).reduce((s, x) => s + x, 0); - expect(sumClassCnt2 > sumClassCnt).to.eq(true); - }); - - navbarAction('Highlight', 'Remove Highlights'); - cy.window().then((win) => { - const sumClassCnt3 = win.cy.$().map(x => x.classes().length).reduce((s, x) => s + x, 0); - expect(sumClassCnt3 == sumClassCnt).to.eq(true); - win.cy.$()[0].select(); - }); - navbarAction('Highlight', 'Selected'); - cy.window().then((win) => { - const sumClassCnt4 = win.cy.$().map(x => x.classes().length).reduce((s, x) => s + x, 0); - expect(sumClassCnt4 == sumClassCnt + 1).to.eq(true); - }); - - navbarAction('Highlight', 'Remove Highlights'); - cy.window().then((win) => { - const sumClassCnt5 = win.cy.$().map(x => x.classes().length).reduce((s, x) => s + x, 0); - expect(sumClassCnt5 == sumClassCnt).to.eq(true); - win.cy.$()[0].select(); - }); - - navbarAction('Highlight', 'Neighbors of Selected'); - cy.window().then((win) => { - const sumClassCnt6 = win.cy.$().map(x => x.classes().length).reduce((s, x) => s + x, 0); - expect(sumClassCnt6 >= sumClassCnt + 2).to.eq(true); - }); - - }); - - it('TC9: Can show help modals', () => { - navbarAction('Help', 'Quick Help'); - cy.get('div.modal-title').contains('Quick Help').should('be.visible'); - cy.get('button.btn-close:visible').click(); - - navbarAction('Help', 'About'); - cy.get('div.modal-title').contains('About').should('be.visible'); - cy.get('button.btn-close:visible').click(); - }); - - it('TC10: Can clear data', () => { - navbarAction('Data', 'Sample Data'); - navbarAction('Data', 'Clear Data'); - }); - - it('TC11: Can load graph from JSON file', () => { - navbarAction('File', 'Load...'); - cy.get('input[type="file"]').eq(1).attachFile('visuall_sample_graph.json'); - cy.wait(50); - cy.window().then((win) => { - const cntCollapsedNodes = win.cy.$('.cy-expand-collapse-collapsed-node').length; - const cntParentNodes = win.cy.$(':parent').length; - const cntClusterNodes = win.cy.$('.Cluster').length; - expect(cntCollapsedNodes == 3).to.eq(true); - expect(cntClusterNodes == 7).to.eq(true); - expect(cntParentNodes == 4).to.eq(true); - }); - }); - - it('TC12: Can load user profile from JSON file', () => { - navbarAction('File', 'Load User Profile...'); - cy.get('input[type="file"]').eq(0).attachFile('Visuall_User_Profile.vall'); - cy.wait(100); - cy.get('div.modal-body').should('not.exist'); - }); - -}); \ No newline at end of file diff --git a/cypress/e2e/queryByRule.cy.js b/cypress/e2e/queryByRule.cy.js deleted file mode 100644 index cb107b16..00000000 --- a/cypress/e2e/queryByRule.cy.js +++ /dev/null @@ -1,226 +0,0 @@ -import { open, openTab, openSubTab, navbarAction, addPropertyRule } from '../helper'; - -context('Query By Rule', () => { - - beforeEach(open); - - function beginQueryByRule() { - openSubTab('Query by Rule'); - cy.get('img[alt="Add Rule"]:visible').click(); - cy.wait(250); - } - - function queryByConditionRuleGetAll(type, isEdge) { - beginQueryByRule(); - cy.get('button:visible').contains('Condition').click(); - selectClass4QueryRule(type); - cy.get('img[title="Add/Update"]').click(); - - click2Execute(true); - cy.wait(4000); - - if (isEdge) { - cy.window().then((win) => { - expect(win.cy.$(`.${type}`).length > 0).to.eq(true); - }); - } else { - cy.window().then((win) => { - expect(win.cy.$(`.${type}`).length > 0 && win.cy.$().not(`.${type}`).length == 0).to.eq(true); - }); - } - } - - function selectClass4QueryRule(type) { - cy.get('select.rule-class:visible').select(type); - } - - function click2Execute(isCheckLoadGraph) { - if (isCheckLoadGraph) { - cy.get('input.cb-is-load-graph').check(); - } - cy.get('input[value="Execute"]:visible').click(); - } - - it('TC1: rule for "birth > 1994 AND death < 2020"', () => { - beginQueryByRule(); - cy.get('button:visible').contains('AND').click(); - addPropertyRule('birth_year', '≥', '1994'); - cy.get('img[title="Add"]:visible').click(); - cy.get('button:visible').contains('Condition').click(); - addPropertyRule('death_year', '≤', '2020'); - click2Execute(true); - cy.wait(4000); - - cy.window().then((win) => { - const isAllInRange = win.cy.$("[birth_year<1994],[death_year>2020]").length == 0 && win.cy.$("[birth_year>=1994],[death_year<=2020]").length > 0; - expect(isAllInRange).to.eq(true); - }); - }); - - it('TC2: Condition get All Persons', () => { - queryByConditionRuleGetAll('Person', false); - }); - - it('TC3: Condition get All COMPOSER', () => { - queryByConditionRuleGetAll('COMPOSER', true); - }); - - it('TC4: Edit Rule Condition', () => { - beginQueryByRule(); - cy.get('button:visible').contains('Condition').click(); - addPropertyRule('primary_name', 'contains', 'John'); - click2Execute(true); - - cy.window().then((win) => { - const canGetAllJohns = win.cy.$(".Person").filter("[primary_name *='John']").length == win.cy.$().length; - expect(canGetAllJohns).to.eq(true); - }); - - cy.get('img[title="Edit"]').click(); - addPropertyRule('primary_name', 'contains', 'Tom'); - click2Execute(false); - - cy.window().then((win) => { - const canGetAllJohnsAndToms = win.cy.$(".Person").filter("[primary_name *='John'],[primary_name *='Tom']").length === win.cy.$().length; - expect(canGetAllJohnsAndToms).to.eq(true); - }); - }); - - it('TC5: Should be able to delete rule and change class of the rule', () => { - beginQueryByRule(); - cy.get('button:visible').contains('Condition').click(); - addPropertyRule('primary_name', 'contains', 'John'); - cy.get('img[title="Delete"]:visible').click(); - selectClass4QueryRule('EDITOR'); - cy.get('b').contains('EDITOR').should('be.visible'); - }); - - it('TC6: Should be able to run a nested rule', () => { - beginQueryByRule(); - cy.get('button:visible').contains('AND').click(); - addPropertyRule('primary_name', 'contains', 'Jo'); - - // start inner OR - cy.get('img[title="Add"]:visible').click(); - cy.get('button:visible').contains('OR').click(); - cy.get('img[title="Add"]:visible').eq(0).click(); - cy.get('button:visible').contains('Condition').click(); - addPropertyRule('ACTRESS', '>', '3'); - - // second rule of inner OR - cy.get('img[title="Add"]:visible').eq(0).click(); - cy.get('button:visible').contains('Condition').click(); - addPropertyRule('ACTOR', '>', '3'); - click2Execute(true); - - cy.window().then((win) => { - const canGetAllJos = win.cy.$("[.Person][primary_name *='Jo']").length == win.cy.$().length; - expect(canGetAllJos).to.eq(true); - }); - - }); - - it('TC7: Test if table works', () => { - beginQueryByRule(); - cy.get('button:visible').contains('Condition').click(); - cy.get('img[title="Add/Update"]').click(); - click2Execute(false); - cy.wait(3000); - - cy.window().then((win) => { - expect(win.cy.$().length == 0).to.eq(true); - }); - - cy.get('input[placeholder="Search..."]').clear(); - cy.get('input[placeholder="Search..."]').type('T'); - - // order by - cy.get('a.table-header').contains('birth year').click(); - - // merge selected to graph - cy.get('input.cb-table-all').check(); - cy.get('img[title="Merge selected to graph"]').click(); - cy.wait(3000); - - // download as CSV - cy.get('img[title="Download selected objects"]').click(); - - cy.window().then((win) => { - const cntElem1 = win.cy.$().length; - expect(cntElem1 == 15).to.eq(true); - }); - cy.get('input.cb-is-load-graph').check(); - cy.get('a.page-link').last().click(); - cy.window().then((win) => { - const cntElem2 = win.cy.$().length; - const hasAllToms = win.cy.$("[primary_name *= 'T']").length > 0 && win.cy.$("[primary_name *= 'T']").length == win.cy.$().length; - expect(hasAllToms).to.eq(true); - expect(20 == cntElem2).to.eq(true); - }); - - navbarAction('Data', 'Clear'); - - // uncheck "Merge" - cy.get('input.cb-is-merge-graph').uncheck(); - cy.get('a.page-link').first().click(); - - cy.window().then((win) => { - const cntElem3 = win.cy.$().length; - expect(cntElem3 == 15).to.eq(true); - }); - - }); - - it('TC8: Client-side filtering should work properly', () => { - navbarAction('Data', 'Sample Data'); - openTab('Settings'); - - // show query results with "selected" - cy.get('input[name="optradio1"]').eq(1).click(); - openTab('Map'); - - beginQueryByRule(); - cy.get('button:visible').contains('Condition').click(); - addPropertyRule('ACTOR', '>', '3'); - cy.get('input.cb-is-on-db').uncheck(); - click2Execute(false); - - cy.window().then((win) => { - const cntFiltered = win.cy.$(':selected').filter(x => x.connectedEdges('.ACTOR').length > 3).length; - const cntSelected = win.cy.$(':selected').length; - expect(cntFiltered > 0).to.eq(true); - expect(cntSelected === cntFiltered).to.eq(true); - }); - }); - - it('TC9: Can add/remove query', () => { - beginQueryByRule(); - cy.get('button:visible').contains('Condition').click(); - cy.get('img[title="Add/Update"]').click(); - - cy.get('input[value="Add"]').click(); - // reload the page, the new rule should be also reloaded - open(); - - openSubTab('Query by Rule') - cy.get('span.pointer').contains('New rule').should('be.visible'); - cy.get('img[title="Delete query rule"]').click(); - cy.get('span.pointer').should('not.exist'); - }); - - // checks https://github.com/ugurdogrusoz/visuall/issues/341 - it('TC10: Highlight graph element and corresponding table row on hover', () => { - openTab('Settings'); - cy.get('input[type="checkbox"]:visible').eq(2).click(); - openTab('Map'); - queryByConditionRuleGetAll('Person', false); - - cy.window().then((win) => { - win.cy.nodes()[0].emit('mouseover'); - const isHigh = win.cy.nodes()[0].classes().join().includes('emphasize'); - expect(isHigh).to.eq(true); - }); - cy.get('tr.highlighted-row').should('be.visible'); - }); - -}); \ No newline at end of file diff --git a/cypress/e2e/timebar.cy.js b/cypress/e2e/timebar.cy.js deleted file mode 100644 index 2e1dfe4d..00000000 --- a/cypress/e2e/timebar.cy.js +++ /dev/null @@ -1,30 +0,0 @@ -import { open, openTab, openSubTab, navbarAction, addPropertyRule } from '../helper'; - -context('Timebar', () => { - - beforeEach(open); - - it('TC1: Timebar metric as AND rule birth > 1994 && death < 2020', () => { - openTab('Settings'); - // click to close 'General' settings - // cy.wait(3000); - openSubTab('General'); - // click to open 'Timebar' settings - openSubTab('Timebar'); - cy.get('span.va-heading3').contains('Configure Statistics').click(); - cy.get('b.timebar-metric-name').contains('new').click(); - cy.get('select[title="Type"]').select('Person'); - - cy.get('img[alt="Add Rule"]:visible').click(); - cy.get('button.dd-item.dropdown-item').contains('AND').click(); - addPropertyRule('birth_year', '≥', '1994'); - - cy.get('img[title="Add"]:visible').click(); - cy.get('button.dd-item.dropdown-item').contains('Condition').click(); - addPropertyRule('death_year', '≤', '2020'); - - cy.get('input[value="Add"]:visible').click(); - - }); - -}); \ No newline at end of file diff --git a/cypress/fixtures/Visuall_User_Profile.vall b/cypress/fixtures/Visuall_User_Profile.vall deleted file mode 100644 index 87787118..00000000 --- a/cypress/fixtures/Visuall_User_Profile.vall +++ /dev/null @@ -1 +0,0 @@ -{"userPref":{"isAutoIncrementalLayoutOnChange":true,"isHighlightOnHover":true,"isShowOverviewWindow":false,"isShowEdgeLabels":true,"isTileDisconnectedOnLayout":true,"isIgnoreCaseInText":false,"isOnlyHighlight4LatestQuery":true,"isStoreUserProfile":true,"isCollapseEdgesBasedOnType":false,"isCollapseMultiEdgesOnLoad":true,"isLimitDbQueries2range":true,"dbQueryTimeRange":{"start":946677600000,"end":2524597200000},"savedLists":{"numberLists":[],"stringLists":[],"enumLists":[]},"dataPageSize":15,"dataPageLimit":15,"queryHistoryLimit":10,"dbTimeout":90,"tableColumnLimit":3,"highlightStyles":[{"wid":3,"color":"#FCE903"},{"wid":3,"color":"#00ffff"},{"wid":3,"color":"#04f06a"}],"currHighlightIdx":0,"selectionColor":"#6c757d","selectionWidth":4.5,"groupingOption":0,"mergedElemIndicator":2,"nodeLabelWrap":0,"compoundPadding":"5%","edgeCollapseLimit":2,"avgNodeSize":40,"objectInclusionType":0,"queryResultPagination":"Client","tilingPadding":4,"timebar":{"isEnabled":false,"playingStep":50,"playingPeriod":1350,"zoomingStep":50,"statsInclusionType":0,"isHideDisconnectedNodesOnAnim":false,"isMaintainGraphRange":false,"graphRangeRatio":0.33}},"timebarMetrics":[{"className":"Title","name":"y rated comedies","rules":{"r":{"ruleOperator":"AND"},"children":[{"r":{"propertyOperand":"genres","propertyType":"list","rawInput":"Comedy","inputOperand":"Comedy","ruleOperator":null,"operator":"In"},"children":[],"parent":null},{"r":{"propertyOperand":"rating","propertyType":"float","rawInput":"5.5","inputOperand":"5.5","ruleOperator":null,"operator":"<="},"children":[],"parent":null}],"parent":null},"color":"#3366cc","isEditing":false},{"className":"Title","name":"highly rated comedies","rules":{"r":{"ruleOperator":"AND"},"children":[{"r":{"propertyOperand":"genres","propertyType":"list","rawInput":"Comedy","inputOperand":"Comedy","ruleOperator":null,"operator":"In"},"children":[],"parent":null},{"r":{"propertyOperand":"rating","propertyType":"float","rawInput":"7.5","inputOperand":"7.5","ruleOperator":null,"operator":">="},"children":[],"parent":null}],"parent":null},"color":"#ff9900","isEditing":false}],"queryRules":[{"isEditing":true,"isLoadGraph":false,"isMergeGraph":true,"isOnDb":true,"name":"New rule","rules":{"className":"Person","isEdge":false,"rules":{"r":{"propertyOperand":null,"rawInput":"","inputOperand":"","ruleOperator":null},"children":[],"parent":null}}}]} \ No newline at end of file diff --git a/cypress/fixtures/visuall_sample_graph.json b/cypress/fixtures/visuall_sample_graph.json deleted file mode 100644 index 2cd44b2b..00000000 --- a/cypress/fixtures/visuall_sample_graph.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"data":{"end_datetime":0,"begin_datetime":0,"name":"","id":"c2","expandcollapseRenderedStartX":260.84056058780703,"expandcollapseRenderedStartY":179.92225163820325,"expandcollapseRenderedCueSize":12},"position":{"x":-122.98284841721022,"y":-181.70522619652678},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Cluster"},{"data":{"end_datetime":0,"begin_datetime":0,"name":"","id":"c1","expandcollapseRenderedStartX":353.2615196708407,"expandcollapseRenderedStartY":142.73030725303428,"expandcollapseRenderedCueSize":12,"position-before-collapse":{"x":237.9305943358121,"y":-368.996346107557},"size-before-collapse":{"w":273.7318159232014,"h":254.37605288723398},"collapsedChildren":[{"data":{"characters":["Bond Rogers"],"act_end":197078400000,"act_begin":190339200000,"job":"","id":"e1635676","source":"n1","target":"n1047255"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Mrs. Cranston"],"act_end":567907200000,"act_begin":553737600000,"job":"","id":"e1638692","source":"n1","target":"n1049683"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Edwige"],"act_end":646704000000,"act_begin":642211200000,"job":"","id":"e1643907","source":"n1","target":"n1053931"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Natalie Van Miter"],"act_end":1167523200000,"act_begin":1143763200000,"job":"","id":"e1652253","source":"n1","target":"n1063144"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Ma Ginger"],"act_end":1015113600000,"act_begin":1010620800000,"job":"","id":"e1646794","source":"n1","target":"n1057224"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Sonia Kovac"],"act_end":-628560000000,"act_begin":-636422400000,"job":"","id":"e1630987","source":"n1","target":"n1043251"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Schatze Page"],"act_end":-526176000000,"act_begin":-530668800000,"job":"","id":"e1631562","source":"n1","target":"n1043696"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Cathy Grainger"],"act_end":-465696000000,"act_begin":-473385600000,"job":"","id":"e1631811","source":"n1","target":"n1043926"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Irene Jansen"],"act_end":-723254400000,"act_begin":-733795200000,"job":"","id":"e1630455","source":"n1","target":"n1042827"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Mrs. Sampson"],"act_end":-134265600000,"act_begin":-142128000000,"job":"","id":"e1633073","source":"n1","target":"n1044930"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Rose Cullen"],"act_end":-765417600000,"act_begin":-775872000000,"job":"","id":"e1630108","source":"n1","target":"n1042563"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Sally Ross"],"act_end":331171200000,"act_begin":323395200000,"job":"","id":"e1636754","source":"n1","target":"n1048164"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Nora Temple"],"act_end":-686534400000,"act_begin":-696988800000,"job":"","id":"e1630681","source":"n1","target":"n1043000"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Countess Camilla Volta"],"act_end":930355200000,"act_begin":928713600000,"job":"","id":"e1645096","source":"n1","target":"n1054989"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end_t":1419984000000,"primary_profession":["actress","soundtrack"],"death_year":2014,"nconst":"nm0000002","primary_name":"Lauren Bacall","start_t":-1451692800000,"birth_year":1924,"id":"n1","parent":"c1"},"position":{"x":221.56335840306576,"y":-355.83762846209436},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":86,"production_end_date":930355200000,"original_title":"The Venice Project","start_year":1999,"rating":5.7,"count_votes":103,"primary_title":"The Venice Project","shooting_end_date":930355200000,"title_type":"movie","is_adult":0,"production_start_date":928713600000,"shooting_start_date":928713600000,"genres":["Drama"],"tconst":"tt0211719","id":"n1054989","parent":"c1"},"position":{"x":147.46158709799326,"y":-408.2810072030311},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-686534400000,"original_title":"Key Largo","start_year":1948,"rating":7.8,"count_votes":35392,"primary_title":"Key Largo","shooting_end_date":-686534400000,"title_type":"movie","is_adult":0,"production_start_date":-696988800000,"genres":["Action","Crime","Drama"],"shooting_start_date":-696988800000,"tconst":"tt0040506","id":"n1043000","parent":"c1"},"position":{"x":341.8996015736309,"y":-332.48471741472133},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":95,"production_end_date":331171200000,"original_title":"The Fan","start_year":1981,"rating":5.7,"count_votes":1817,"primary_title":"The Fan","shooting_end_date":331171200000,"title_type":"movie","is_adult":0,"production_start_date":323395200000,"genres":["Drama","Horror","Thriller"],"shooting_start_date":323395200000,"tconst":"tt0082362","id":"n1048164","parent":"c1"},"position":{"x":142.2498275923692,"y":-346.4204978525493},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":118,"production_end_date":-765417600000,"original_title":"Confidential Agent","start_year":1945,"rating":6.5,"count_votes":911,"primary_title":"Confidential Agent","shooting_end_date":-765417600000,"title_type":"movie","is_adult":0,"production_start_date":-775872000000,"shooting_start_date":-775872000000,"genres":["Drama","Thriller"],"tconst":"tt0037610","id":"n1042563","parent":"c1"},"position":{"x":239.72505214918124,"y":-271.40404885373033},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":121,"production_end_date":-134265600000,"original_title":"Harper","start_year":1966,"rating":6.9,"count_votes":7770,"primary_title":"Harper","shooting_end_date":-134265600000,"title_type":"movie","is_adult":0,"production_start_date":-142128000000,"genres":["Crime","Drama","Mystery"],"shooting_start_date":-142128000000,"tconst":"tt0060490","id":"n1044930","parent":"c1"},"position":{"x":300.350405373975,"y":-268.5352203877219},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":106,"production_end_date":-723254400000,"original_title":"Dark Passage","start_year":1947,"rating":7.5,"count_votes":16761,"primary_title":"Dark Passage","shooting_end_date":-723254400000,"title_type":"movie","is_adult":0,"production_start_date":-733795200000,"genres":["Film-Noir","Thriller"],"shooting_start_date":-733795200000,"tconst":"tt0039302","id":"n1042827","parent":"c1"},"position":{"x":296.5130927495917,"y":-366.96460093992835},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":110,"production_end_date":-465696000000,"original_title":"Blood Alley","start_year":1955,"rating":6.3,"count_votes":2692,"primary_title":"Blood Alley","shooting_end_date":-465696000000,"title_type":"movie","is_adult":0,"production_start_date":-473385600000,"genres":["Action","Adventure"],"shooting_start_date":-473385600000,"tconst":"tt0047889","id":"n1043926","parent":"c1"},"position":{"x":178.92943336257844,"y":-281.8208411781937},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":95,"production_end_date":-526176000000,"original_title":"How to Marry a Millionaire","start_year":1953,"rating":6.9,"count_votes":19550,"primary_title":"How to Marry a Millionaire","shooting_end_date":-526176000000,"title_type":"movie","is_adult":0,"production_start_date":-530668800000,"genres":["Comedy","Drama","Romance"],"shooting_start_date":-530668800000,"tconst":"tt0045891","id":"n1043696","parent":"c1"},"position":{"x":292.5606910266322,"y":-415.14772152245706},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":110,"production_end_date":-628560000000,"original_title":"Bright Leaf","start_year":1950,"rating":6.6,"count_votes":1070,"primary_title":"Bright Leaf","shooting_end_date":-628560000000,"title_type":"movie","is_adult":0,"production_start_date":-636422400000,"genres":["Drama","Romance"],"shooting_start_date":-636422400000,"tconst":"tt0042285","id":"n1043251","parent":"c1"},"position":{"x":238.74697615093663,"y":-423.4291697646745},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":178,"production_end_date":1015113600000,"original_title":"Dogville","start_year":2003,"rating":8,"count_votes":131554,"primary_title":"Dogville","shooting_end_date":1015113600000,"title_type":"movie","is_adult":0,"production_start_date":1010620800000,"genres":["Crime","Drama"],"shooting_start_date":1010620800000,"tconst":"tt0276919","id":"n1057224","parent":"c1"},"position":{"x":343.89623265243716,"y":-394.50256448646184},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":108,"production_end_date":1167523200000,"original_title":"The Walker","start_year":2007,"rating":5.8,"count_votes":5118,"primary_title":"The Walker","shooting_end_date":1167523200000,"title_type":"movie","is_adult":0,"production_start_date":1143763200000,"genres":["Crime","Drama","Mystery"],"shooting_start_date":1143763200000,"tconst":"tt0783608","id":"n1063144","parent":"c1"},"position":{"x":290.99662861019846,"y":-316.60976553628973},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":91,"production_end_date":646704000000,"original_title":"A Star for Two","start_year":1991,"rating":5.4,"count_votes":196,"primary_title":"A Star for Two","shooting_end_date":646704000000,"title_type":"movie","is_adult":0,"production_start_date":642211200000,"genres":["Drama","Romance"],"shooting_start_date":642211200000,"tconst":"tt0166817","id":"n1053931","parent":"c1"},"position":{"x":190.93269368515254,"y":-452.51932396400275},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":93,"production_end_date":567907200000,"original_title":"Mr. North","start_year":1988,"rating":5.9,"count_votes":1160,"primary_title":"Mr. North","shooting_end_date":567907200000,"title_type":"movie","is_adult":0,"production_start_date":553737600000,"genres":["Comedy","Drama"],"shooting_start_date":553737600000,"tconst":"tt0095665","id":"n1049683","parent":"c1"},"position":{"x":246.02508832723478,"y":-470.1574718273921},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":197078400000,"original_title":"The Shootist","start_year":1976,"rating":7.6,"count_votes":21104,"primary_title":"The Shootist","shooting_end_date":197078400000,"title_type":"movie","is_adult":0,"production_start_date":190339200000,"genres":["Drama","Romance","Western"],"shooting_start_date":190339200000,"tconst":"tt0075213","id":"n1047255","parent":"c1"},"position":{"x":302.9952856341372,"y":-460.8774260826565},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}]},"position":{"x":-238.5251433369209,"y":-39.101657078929236},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Cluster cy-expand-collapse-collapsed-node"},{"data":{"end_datetime":0,"begin_datetime":0,"name":"","id":"c5"},"position":{"x":220.50850832299182,"y":-242.08482449235484},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Cluster"},{"data":{"end_datetime":0,"begin_datetime":0,"name":"","id":"c4"},"position":{"x":249.4407730413712,"y":79.66931354314895},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Cluster"},{"data":{"runtime_minutes":100,"production_end_date":-924307200000,"original_title":"High Sierra","start_year":1941,"rating":7.5,"count_votes":14244,"primary_title":"High Sierra","shooting_end_date":-924307200000,"title_type":"movie","is_adult":0,"production_start_date":-927158400000,"genres":["Action","Adventure","Crime"],"shooting_start_date":-927158400000,"tconst":"tt0033717","id":"n1041749","parent":"c2"},"position":{"x":-230.43847654719093,"y":-207.79607119806474},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":94,"production_end_date":-633830400000,"original_title":"In a Lonely Place","start_year":1950,"rating":8,"count_votes":23875,"primary_title":"In a Lonely Place","shooting_end_date":-633830400000,"title_type":"movie","is_adult":0,"production_start_date":-637027200000,"shooting_start_date":-637027200000,"genres":["Drama","Film-Noir","Mystery"],"tconst":"tt0042593","id":"n1043296","parent":"c2"},"position":{"x":-178.55748267375793,"y":-264.17385682048047},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":126,"production_end_date":-708739200000,"original_title":"The Treasure of the Sierra Madre","start_year":1948,"rating":8.2,"count_votes":108196,"primary_title":"The Treasure of the Sierra Madre","shooting_end_date":-708739200000,"title_type":"movie","is_adult":0,"production_start_date":-717638400000,"genres":["Adventure","Drama","Western"],"shooting_start_date":-717638400000,"tconst":"tt0040897","id":"n1043065","parent":"c2"},"position":{"x":-111.16761391450285,"y":-260.15281984085726},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_datetime":0,"begin_datetime":0,"name":"","id":"c0","expandcollapseRenderedStartX":49.22182124197241,"expandcollapseRenderedStartY":566.21631834927,"expandcollapseRenderedCueSize":12,"position-before-collapse":{"x":396.7253053572268,"y":311.0628860773082},"size-before-collapse":{"w":371.97149990438106,"h":330.1935836671713},"collapsedChildren":[{"data":{"end":148089600000,"begin":136598400000,"id":"e1","source":"n0","target":"n1046713"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"},{"data":{"characters":["Self - Co-Host","Narrator"],"end":189216000000,"job":"","begin":172713600000,"id":"e1426468","source":"n0","target":"n1047278"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"SELF"},{"data":{"characters":["Daniel Hughes"],"act_end":220838400000,"act_begin":205977600000,"job":"","id":"e1504533","source":"n0","target":"n1047031"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Charlie Hill"],"act_end":-575856000000,"act_begin":-585100800000,"job":"","id":"e1496667","source":"n0","target":"n1043522"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Don Hewes"],"act_end":-690940800000,"act_begin":-697507200000,"job":"","id":"e1495338","source":"n0","target":"n1042965"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"source":"n0","target":"n1043362","id":"collapsedEdge_n0_n1043362_unknown_630435115132","collapsedEdges":[{"data":{"characters":["Bert Kalmar"],"act_end":-627868800000,"act_begin":-633312000000,"job":"","id":"e1496279","source":"n0","target":"n1043362"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":-627868800000,"begin":-633312000000,"id":"e2","source":"n0","target":"n1043362"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Robert Curtis"],"act_end":-897523200000,"act_begin":-902620800000,"job":"","id":"e1492900","source":"n0","target":"n1041911"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Tom Bowen"],"act_end":-607219200000,"act_begin":-615081600000,"job":"","id":"e1496560","source":"n0","target":"n1043476"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Vernon Castle"],"act_end":-976147200000,"act_begin":-982800000000,"job":"","id":"e1491474","source":"n0","target":"n1041321"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Jerry Travers"],"act_end":-1091145600000,"act_begin":-1096761600000,"job":"","id":"e1489138","source":"n0","target":"n1040348"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Tony Hunter"],"act_end":-534124800000,"act_begin":-543715200000,"job":"","id":"e1496955","source":"n0","target":"n1043654"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Ted Hanover"],"act_end":-881107200000,"act_begin":-887414400000,"job":"","id":"e1493095","source":"n0","target":"n1041995"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Steve Canfield"],"act_end":-407635200000,"act_begin":-414979200000,"job":"","id":"e1498333","source":"n0","target":"n1044256"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Tony Flagg"],"act_end":-992476800000,"act_begin":-1000944000000,"job":"","id":"e1490382","source":"n0","target":"n1040874"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Lucky Garnett"],"act_end":-1054684800000,"act_begin":-1061683200000,"job":"","id":"e1489588","source":"n0","target":"n1040544"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Johnny Brett"],"act_end":-949536000000,"act_begin":-957312000000,"job":"","id":"e1491682","source":"n0","target":"n1041408"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["John Pedley"],"act_end":-31622400000,"act_begin":-52185600000,"job":"","id":"e1500677","source":"n0","target":"n1045297"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Self"],"end":999216000000,"job":"","begin":957139200000,"id":"e1701191","source":"n0","target":"n1059229"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ARCHIVE_FOOTAGE"},{"data":{"characters":["Fred Astaire ('Here's to the Ladies')","Raffles ('This Heart of Mine')","Tai Long ('Limehouse Blues')"],"act_end":-789004800000,"act_begin":-820540800000,"job":"","id":"e1494954","source":"n0","target":"n1042802"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Danny O'Neill"],"act_end":-923184000000,"act_begin":-928627200000,"job":"","id":"e1492167","source":"n0","target":"n1041601"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"source":"n0","target":"n1044197","id":"collapsedEdge_n0_n1044197_unknown_177700869917","collapsedEdges":[{"data":{"characters":["Dick Avery"],"act_end":-424569600000,"act_begin":-433296000000,"job":"","id":"e1498199","source":"n0","target":"n1044197"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":-424569600000,"begin":-433296000000,"id":"e3","source":"n0","target":"n1044197"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Robert Davis"],"act_end":-864777600000,"act_begin":-870480000000,"job":"","id":"e1493414","source":"n0","target":"n1042130"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Guy Holden"],"act_end":-1116720000000,"act_begin":-1120694400000,"job":"","id":"e1488352","source":"n0","target":"n1040008"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Jerry Halliday"],"act_end":-1016496000000,"act_begin":-1023926400000,"job":"","id":"e1489789","source":"n0","target":"n1040628"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Peter P. Peters aka Petrov"],"act_end":-1034467200000,"act_begin":-1042070400000,"job":"","id":"e1490117","source":"n0","target":"n1040763"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Josh Barkley"],"act_end":-668131200000,"act_begin":-675302400000,"job":"","id":"e1495672","source":"n0","target":"n1043092"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Johnny Parkson Riggs"],"act_end":-776822400000,"act_begin":-787708800000,"job":"","id":"e1494624","source":"n0","target":"n1042671"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"source":"n0","target":"n1044463","id":"collapsedEdge_n0_n1044463_unknown_1030798248394","collapsedEdges":[{"data":{"characters":["Julian Osborn"],"act_end":-339811200000,"act_begin":-347155200000,"job":"","id":"e1498791","source":"n0","target":"n1044463"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":-339811200000,"begin":-347155200000,"id":"e0","source":"n0","target":"n1044463"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Bake Baker"],"act_end":-1072742400000,"act_begin":-1078358400000,"job":"","id":"e1489323","source":"n0","target":"n1040429"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Self"],"end":170035200000,"job":"","begin":169948800000,"id":"e1427802","source":"n0","target":"n1059218"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"SELF"},{"data":{"end_t":567907200000,"primary_profession":["soundtrack","actor","miscellaneous"],"death_year":1987,"nconst":"nm0000001","primary_name":"Fred Astaire","start_t":-2240524800000,"birth_year":1899,"id":"n0","parent":"c0"},"position":{"x":388.0839399845462,"y":311.05190567880476},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":17,"production_end_date":170035200000,"original_title":"The Lion Roars Again","start_year":1975,"rating":5.3,"count_votes":97,"primary_title":"The Lion Roars Again","shooting_end_date":170035200000,"title_type":"short","is_adult":0,"production_start_date":169948800000,"shooting_start_date":169948800000,"genres":["Documentary","Short"],"tconst":"tt0360744","id":"n1059218","parent":"c0"},"position":{"x":337.72151616972945,"y":286.3231319726532},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":110,"production_end_date":-1072742400000,"original_title":"Follow the Fleet","start_year":1936,"rating":7.2,"count_votes":3797,"primary_title":"Follow the Fleet","shooting_end_date":-1072742400000,"title_type":"movie","is_adult":0,"production_start_date":-1078358400000,"shooting_start_date":-1078358400000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0027630","id":"n1040429","parent":"c0"},"position":{"x":424.3992053449243,"y":420.2127454048466},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":134,"production_end_date":-339811200000,"original_title":"On the Beach","start_year":1959,"rating":7.2,"count_votes":11391,"primary_title":"On the Beach","shooting_end_date":-339811200000,"title_type":"movie","is_adult":0,"production_start_date":-347155200000,"genres":["Drama","Romance","Sci-Fi"],"shooting_start_date":-347155200000,"tconst":"tt0053137","id":"n1044463","parent":"c0"},"position":{"x":305.4513680305121,"y":326.12664182653293},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":108,"production_end_date":-776822400000,"original_title":"Yolanda and the Thief","start_year":1945,"rating":6,"count_votes":802,"primary_title":"Yolanda and the Thief","shooting_end_date":-776822400000,"title_type":"movie","is_adult":0,"production_start_date":-787708800000,"shooting_start_date":-787708800000,"genres":["Fantasy","Musical","Romance"],"tconst":"tt0038262","id":"n1042671","parent":"c0"},"position":{"x":471.14375702850845,"y":203.2241845003747},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":109,"production_end_date":-668131200000,"original_title":"The Barkleys of Broadway","start_year":1949,"rating":7,"count_votes":2614,"primary_title":"The Barkleys of Broadway","shooting_end_date":-668131200000,"title_type":"movie","is_adult":0,"production_start_date":-675302400000,"shooting_start_date":-675302400000,"genres":["Comedy","Musical"],"tconst":"tt0041158","id":"n1043092","parent":"c0"},"position":{"x":412.7486932135065,"y":374.7060125099572},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":109,"production_end_date":-1034467200000,"original_title":"Shall We Dance","start_year":1937,"rating":7.5,"count_votes":6194,"primary_title":"Shall We Dance","shooting_end_date":-1034467200000,"title_type":"movie","is_adult":0,"production_start_date":-1042070400000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-1042070400000,"tconst":"tt0029546","id":"n1040763","parent":"c0"},"position":{"x":301.844660973216,"y":412.45845315985787},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":101,"production_end_date":-1016496000000,"original_title":"A Damsel in Distress","start_year":1937,"rating":6.8,"count_votes":1673,"primary_title":"A Damsel in Distress","shooting_end_date":-1016496000000,"title_type":"movie","is_adult":0,"production_start_date":-1023926400000,"shooting_start_date":-1023926400000,"genres":["Comedy","Music","Romance"],"tconst":"tt0028757","id":"n1040628","parent":"c0"},"position":{"x":432.77793877917264,"y":242.7135264383865},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":107,"production_end_date":-1116720000000,"original_title":"The Gay Divorcee","start_year":1934,"rating":7.5,"count_votes":6527,"primary_title":"The Gay Divorcee","shooting_end_date":-1116720000000,"title_type":"movie","is_adult":0,"production_start_date":-1120694400000,"shooting_start_date":-1120694400000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0025164","id":"n1040008","parent":"c0"},"position":{"x":379.9669728230823,"y":177.57843514846715},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":97,"production_end_date":-864777600000,"original_title":"You Were Never Lovelier","start_year":1942,"rating":7.3,"count_votes":3055,"primary_title":"You Were Never Lovelier","shooting_end_date":-864777600000,"title_type":"movie","is_adult":0,"production_start_date":-870480000000,"shooting_start_date":-870480000000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0035583","id":"n1042130","parent":"c0"},"position":{"x":470.89558004219856,"y":429.89212454707143},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":-424569600000,"original_title":"Funny Face","start_year":1957,"rating":7,"count_votes":25226,"primary_title":"Funny Face","shooting_end_date":-424569600000,"title_type":"movie","is_adult":0,"production_start_date":-433296000000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-433296000000,"tconst":"tt0050419","id":"n1044197","parent":"c0"},"position":{"x":388.1042688172028,"y":263.43357067687623},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":84,"production_end_date":-923184000000,"original_title":"Second Chorus","start_year":1940,"rating":5.8,"count_votes":1224,"primary_title":"Second Chorus","shooting_end_date":-923184000000,"title_type":"movie","is_adult":0,"production_start_date":-928627200000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-928627200000,"tconst":"tt0033029","id":"n1041601","parent":"c0"},"position":{"x":511.6226928881114,"y":336.05297555474766},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":110,"production_end_date":-800150400000,"original_title":"Ziegfeld Follies","start_year":1945,"rating":6.5,"count_votes":2759,"primary_title":"Ziegfeld Follies","shooting_end_date":-789004800000,"title_type":"movie","is_adult":0,"production_start_date":-815356800000,"shooting_start_date":-820540800000,"genres":["Comedy","Musical"],"tconst":"tt0039116","id":"n1042802","parent":"c0"},"position":{"x":278.84954337199395,"y":369.43382436939027},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":999216000000,"original_title":"Nelson Freire","start_year":2003,"rating":7.9,"count_votes":152,"primary_title":"Nelson Freire","shooting_end_date":999216000000,"title_type":"movie","is_adult":0,"production_start_date":957139200000,"genres":["Biography","Documentary","Music"],"shooting_start_date":957139200000,"tconst":"tt0360833","id":"n1059229","parent":"c0"},"position":{"x":483.9440709360438,"y":294.7264215816589},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":106,"production_end_date":-31622400000,"original_title":"Midas Run","start_year":1969,"rating":5.5,"count_votes":99,"primary_title":"Midas Run","shooting_end_date":-31622400000,"title_type":"movie","is_adult":0,"production_start_date":-52185600000,"genres":["Adventure","Comedy","Crime"],"shooting_start_date":-52185600000,"tconst":"tt0064664","id":"n1045297","parent":"c0"},"position":{"x":386.2464914894884,"y":444.4688351068496},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-949536000000,"original_title":"Broadway Melody of 1940","start_year":1940,"rating":7.3,"count_votes":2018,"primary_title":"Broadway Melody of 1940","shooting_end_date":-949536000000,"title_type":"movie","is_adult":0,"production_start_date":-957312000000,"shooting_start_date":-957312000000,"genres":["Musical"],"tconst":"tt0032284","id":"n1041408","parent":"c0"},"position":{"x":324.8178128825941,"y":197.043604568577},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":-1054684800000,"original_title":"Swing Time","start_year":1936,"rating":7.6,"count_votes":11613,"primary_title":"Swing Time","shooting_end_date":-1054684800000,"title_type":"movie","is_adult":0,"production_start_date":-1061683200000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-1061683200000,"tconst":"tt0028333","id":"n1040544","parent":"c0"},"position":{"x":330.2438301391543,"y":366.8100608473061},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":83,"production_end_date":-992476800000,"original_title":"Carefree","start_year":1938,"rating":7.1,"count_votes":3135,"primary_title":"Carefree","shooting_end_date":-992476800000,"title_type":"movie","is_adult":0,"production_start_date":-1000944000000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-1000944000000,"tconst":"tt0029971","id":"n1040874","parent":"c0"},"position":{"x":456.6603024728739,"y":337.6016261324054},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":117,"production_end_date":-407635200000,"original_title":"Silk Stockings","start_year":1957,"rating":6.8,"count_votes":3374,"primary_title":"Silk Stockings","shooting_end_date":-407635200000,"title_type":"movie","is_adult":0,"production_start_date":-414979200000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-414979200000,"tconst":"tt0050972","id":"n1044256","parent":"c0"},"position":{"x":423.7393942073113,"y":199.32438433639032},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-881107200000,"original_title":"Holiday Inn","start_year":1942,"rating":7.4,"count_votes":12504,"primary_title":"Holiday Inn","shooting_end_date":-881107200000,"title_type":"movie","is_adult":0,"production_start_date":-887414400000,"genres":["Comedy","Drama","Music"],"shooting_start_date":-887414400000,"tconst":"tt0034862","id":"n1041995","parent":"c0"},"position":{"x":369.8256515077192,"y":399.6511507586234},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":112,"production_end_date":-534124800000,"original_title":"The Band Wagon","start_year":1953,"rating":7.5,"count_votes":9465,"primary_title":"The Band Wagon","shooting_end_date":-534124800000,"title_type":"movie","is_adult":0,"production_start_date":-543715200000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-543715200000,"tconst":"tt0045537","id":"n1043654","parent":"c0"},"position":{"x":278.50589153732494,"y":238.26286355258992},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":101,"production_end_date":-1091145600000,"original_title":"Top Hat","start_year":1935,"rating":7.8,"count_votes":16402,"primary_title":"Top Hat","shooting_end_date":-1091145600000,"title_type":"movie","is_adult":0,"production_start_date":-1096761600000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-1096761600000,"tconst":"tt0027125","id":"n1040348","parent":"c0"},"position":{"x":373.26542594230597,"y":220.95197600822968},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":93,"production_end_date":-976147200000,"original_title":"The Story of Vernon and Irene Castle","start_year":1939,"rating":6.9,"count_votes":2163,"primary_title":"The Story of Vernon and Irene Castle","shooting_end_date":-976147200000,"title_type":"movie","is_adult":0,"production_start_date":-982800000000,"genres":["Biography","Drama","Musical"],"shooting_start_date":-982800000000,"tconst":"tt0031983","id":"n1041321","parent":"c0"},"position":{"x":289.60189630978084,"y":282.21186058426053},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":93,"production_end_date":-607219200000,"original_title":"Royal Wedding","start_year":1951,"rating":6.7,"count_votes":4510,"primary_title":"Royal Wedding","shooting_end_date":-607219200000,"title_type":"movie","is_adult":0,"production_start_date":-615081600000,"genres":["Comedy","Musical","Romance"],"shooting_start_date":-615081600000,"tconst":"tt0043983","id":"n1043476","parent":"c0"},"position":{"x":343.3435173572933,"y":445.10733700614924},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":88,"production_end_date":-897523200000,"original_title":"You'll Never Get Rich","start_year":1941,"rating":6.8,"count_votes":2038,"primary_title":"You'll Never Get Rich","shooting_end_date":-897523200000,"title_type":"movie","is_adult":0,"production_start_date":-902620800000,"shooting_start_date":-902620800000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0034409","id":"n1041911","parent":"c0"},"position":{"x":527.8487144046727,"y":288.9162735571314},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-627868800000,"original_title":"Three Little Words","start_year":1950,"rating":6.9,"count_votes":1532,"primary_title":"Three Little Words","shooting_end_date":-627868800000,"title_type":"movie","is_adult":0,"production_start_date":-633312000000,"shooting_start_date":-633312000000,"genres":["Biography","Comedy","Musical"],"tconst":"tt0043044","id":"n1043362","parent":"c0"},"position":{"x":463.80918154225,"y":383.0635936995046},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":-690940800000,"original_title":"Easter Parade","start_year":1948,"rating":7.4,"count_votes":8062,"primary_title":"Easter Parade","shooting_end_date":-690940800000,"title_type":"movie","is_adult":0,"production_start_date":-697507200000,"genres":["Musical","Romance"],"shooting_start_date":-697507200000,"tconst":"tt0040308","id":"n1042965","parent":"c0"},"position":{"x":256.50554248959844,"y":322.9174828100219},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":82,"production_end_date":-575856000000,"original_title":"The Belle of New York","start_year":1952,"rating":6.2,"count_votes":793,"primary_title":"The Belle of New York","shooting_end_date":-575856000000,"title_type":"movie","is_adult":0,"production_start_date":-585100800000,"shooting_start_date":-585100800000,"genres":["Comedy","Musical","Romance"],"tconst":"tt0044408","id":"n1043522","parent":"c0"},"position":{"x":442.44212104459666,"y":284.2135700014118},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":96,"production_end_date":220838400000,"original_title":"The Amazing Dobermans","start_year":1976,"rating":5.2,"count_votes":340,"primary_title":"The Amazing Dobermans","shooting_end_date":220838400000,"title_type":"movie","is_adult":0,"production_start_date":205977600000,"shooting_start_date":205977600000,"genres":["Comedy","Crime","Family"],"tconst":"tt0074130","id":"n1047031","parent":"c0"},"position":{"x":505.4549596648799,"y":377.9548553062424},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":133,"production_end_date":189216000000,"original_title":"That's Entertainment, Part II","start_year":1976,"rating":7.4,"count_votes":1933,"primary_title":"That's Entertainment, Part II","shooting_end_date":189216000000,"title_type":"movie","is_adult":0,"production_start_date":172713600000,"genres":["Documentary","Family","Musical"],"shooting_start_date":172713600000,"tconst":"tt0075323","id":"n1047278","parent":"c0"},"position":{"x":489.7918787450152,"y":246.62167879444283},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":165,"production_end_date":148089600000,"original_title":"The Towering Inferno","start_year":1974,"rating":6.9,"count_votes":37230,"primary_title":"The Towering Inferno","shooting_end_date":148089600000,"title_type":"movie","is_adult":0,"production_start_date":136598400000,"shooting_start_date":137289600000,"genres":["Action","Drama","Thriller"],"tconst":"tt0072308","id":"n1046713","parent":"c0"},"position":{"x":329.7797164277807,"y":242.21910493044533},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}]},"position":{"x":-282.52514333692096,"y":213.57599791857342},"group":"nodes","removed":false,"selected":true,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Cluster cy-expand-collapse-collapsed-node"},{"data":{"end_datetime":0,"begin_datetime":0,"name":"","id":"c1611575415904","parent":"c2","expandcollapseRenderedStartX":356.5118036568988,"expandcollapseRenderedStartY":196.39558094869633,"expandcollapseRenderedCueSize":12,"position-before-collapse":{"x":-5.463432740063695,"y":-180.75892440476403},"size-before-collapse":{"w":211.7337169033126,"h":171.36696478438148},"collapsedChildren":[{"data":{"end":-809308800000,"begin":-815443200000,"id":"e12","source":"c1611575428222","target":"n1042518","originalEnds":{"source":{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5","parent":"c1611575428222"},"position":{"x":-71.79250695766993,"y":-127.2015872537342},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":100,"production_end_date":-809308800000,"original_title":"To Have and Have Not","start_year":1944,"rating":7.8,"count_votes":29330,"primary_title":"To Have and Have Not","shooting_end_date":-809308800000,"title_type":"movie","is_adult":0,"production_start_date":-815443200000,"shooting_start_date":-815443200000,"genres":["Adventure","Comedy","Film-Noir"],"tconst":"tt0037382","id":"n1042518","parent":"c1611575415904"},"position":{"x":50.824620397805674,"y":-241.9036014831678},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR cy-expand-collapse-meta-edge"},{"data":{"runtime_minutes":100,"production_end_date":-809308800000,"original_title":"To Have and Have Not","start_year":1944,"rating":7.8,"count_votes":29330,"primary_title":"To Have and Have Not","shooting_end_date":-809308800000,"title_type":"movie","is_adult":0,"production_start_date":-815443200000,"shooting_start_date":-815443200000,"genres":["Adventure","Comedy","Film-Noir"],"tconst":"tt0037382","id":"n1042518","parent":"c1611575415904"},"position":{"x":50.824620397805674,"y":-241.9036014831678},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"characters":["Jean Matrac"],"act_end":-823305600000,"act_begin":-836438400000,"job":"","id":"e1494171","source":"c1611575428222","target":"n1042473","originalEnds":{"source":{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5","parent":"c1611575428222"},"position":{"x":-71.79250695766993,"y":-127.2015872537342},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":109,"production_end_date":-823305600000,"original_title":"Passage to Marseille","start_year":1944,"rating":6.9,"count_votes":3773,"primary_title":"Passage to Marseille","shooting_end_date":-823305600000,"title_type":"movie","is_adult":0,"production_start_date":-836438400000,"shooting_start_date":-836438400000,"genres":["Adventure","Drama","War"],"tconst":"tt0037166","id":"n1042473","parent":"c1611575415904"},"position":{"x":-64.75148587793306,"y":-118.98424732636023},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR cy-expand-collapse-meta-edge"},{"data":{"runtime_minutes":109,"production_end_date":-823305600000,"original_title":"Passage to Marseille","start_year":1944,"rating":6.9,"count_votes":3773,"primary_title":"Passage to Marseille","shooting_end_date":-823305600000,"title_type":"movie","is_adult":0,"production_start_date":-836438400000,"shooting_start_date":-836438400000,"genres":["Adventure","Drama","War"],"tconst":"tt0037166","id":"n1042473","parent":"c1611575415904"},"position":{"x":-64.75148587793306,"y":-118.98424732636023},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_datetime":0,"begin_datetime":0,"name":"","id":"c1611575428222","parent":"c1611575415904","expandcollapseRenderedStartX":338.5438814731229,"expandcollapseRenderedStartY":198.74003764355706,"expandcollapseRenderedCueSize":12,"position-before-collapse":{"x":-59.4852240365775,"y":-104.631903547402},"size-before-collapse":{"w":268.09327563808637,"h":209.063746191414},"collapsedChildren":[{"data":{"end":-898041600000,"begin":-901411200000,"id":"e11","source":"n5","target":"n1041791"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"},{"data":{"runtime_minutes":100,"production_end_date":-898041600000,"original_title":"The Maltese Falcon","start_year":1941,"rating":8,"count_votes":144303,"primary_title":"The Maltese Falcon","shooting_end_date":-898041600000,"title_type":"movie","is_adult":0,"production_start_date":-901411200000,"shooting_start_date":-901411200000,"genres":["Film-Noir","Mystery"],"tconst":"tt0033870","id":"n1041791","parent":"c1611575428222"},"position":{"x":-46.55473319883445,"y":-30.897852277189656},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"characters":["Hap Stuart"],"act_end":-1041465600000,"act_begin":-1062547200000,"job":"","id":"e1489262","source":"n5","target":"n1040400"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["John Phillips"],"act_end":-1041465600000,"act_begin":-1057276800000,"job":"","id":"e1489883","source":"n5","target":"n1040666"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["'Gloves' Donahue"],"act_end":-888969600000,"act_begin":-896832000000,"job":"","id":"e1492918","source":"n5","target":"n1041918"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Turkey Morgan"],"act_end":-1009929600000,"act_begin":-1041379200000,"job":"","id":"e1489936","source":"n5","target":"n1040689"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Grasselli","Chips Maguire"],"act_end":-946857600000,"act_begin":-949622400000,"job":"","id":"e1491939","source":"n5","target":"n1041509"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"source":"n5","target":"n1043382","id":"collapsedEdge_n5_n1043382_unknown_1030342149568","collapsedEdges":[{"data":{"characters":["Charlie Allnutt"],"act_end":-578707200000,"act_begin":-589248000000,"job":"","id":"e1496331","source":"n5","target":"n1043382"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":-578707200000,"begin":-589248000000,"id":"e14","source":"n5","target":"n1043382"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5","parent":"c1611575428222"},"position":{"x":-71.79250695766993,"y":-127.2015872537342},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":105,"production_end_date":-578707200000,"original_title":"The African Queen","start_year":1951,"rating":7.7,"count_votes":68711,"primary_title":"The African Queen","shooting_end_date":-578707200000,"title_type":"movie","is_adult":0,"production_start_date":-589248000000,"shooting_start_date":-589248000000,"genres":["Adventure","Drama","Romance"],"tconst":"tt0043265","id":"n1043382","parent":"c1611575428222"},"position":{"x":28.42081034437085,"y":-128.65840940602624},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":97,"production_end_date":-946857600000,"original_title":"It All Came True","start_year":1940,"rating":6.7,"count_votes":933,"primary_title":"It All Came True","shooting_end_date":-946857600000,"title_type":"movie","is_adult":0,"production_start_date":-949622400000,"shooting_start_date":-949622400000,"genres":["Comedy","Crime","Drama"],"tconst":"tt0032643","id":"n1041509","parent":"c1611575428222"},"position":{"x":8.079512685697772,"y":-31.760248581426776},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-1009929600000,"original_title":"Kid Galahad","start_year":1937,"rating":7.2,"count_votes":2824,"primary_title":"Kid Galahad","shooting_end_date":-1009929600000,"title_type":"movie","is_adult":0,"production_start_date":-1041379200000,"genres":["Crime","Drama","Romance"],"shooting_start_date":-1041379200000,"tconst":"tt0029080","id":"n1040689","parent":"c1611575428222"},"position":{"x":-97.5979520395766,"y":-26.78063388978984},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":107,"production_end_date":-888969600000,"original_title":"All Through the Night","start_year":1942,"rating":7.1,"count_votes":3605,"primary_title":"All Through the Night","shooting_end_date":-888969600000,"title_type":"movie","is_adult":0,"production_start_date":-896832000000,"shooting_start_date":-896832000000,"genres":["Action","Comedy","Crime"],"tconst":"tt0034449","id":"n1041918","parent":"c1611575428222"},"position":{"x":4.616102995176622,"y":-80.12678162867829},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":71,"production_end_date":-1041465600000,"original_title":"The Great O'Malley","start_year":1937,"rating":6.8,"count_votes":505,"primary_title":"The Great O'Malley","shooting_end_date":-1041465600000,"title_type":"movie","is_adult":0,"production_start_date":-1057276800000,"shooting_start_date":-1057276800000,"genres":["Drama"],"tconst":"tt0028955","id":"n1040666","parent":"c1611575428222"},"position":{"x":-146.39125841752585,"y":-70.64514650584022},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":88,"production_end_date":-1041465600000,"original_title":"China Clipper","start_year":1936,"rating":6.3,"count_votes":474,"primary_title":"China Clipper","shooting_end_date":-1041465600000,"title_type":"movie","is_adult":0,"production_start_date":-1062547200000,"genres":["Drama"],"shooting_start_date":-1062547200000,"tconst":"tt0027445","id":"n1040400","parent":"c1611575428222"},"position":{"x":-0.5826895926363367,"y":-183.11317320501416},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}]},"position":{"x":-74.48190383882589,"y":-212.29645795980184},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Cluster cy-expand-collapse-collapsed-node"}]},"position":{"x":-142.5017185803963,"y":-175.59320046508572},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Cluster cy-expand-collapse-collapsed-node"},{"data":{"runtime_minutes":78,"production_end_date":-993772800000,"original_title":"Dollar","start_year":1938,"rating":5.5,"count_votes":252,"primary_title":"Dollar","shooting_end_date":-993772800000,"title_type":"movie","is_adult":0,"production_start_date":-998956800000,"genres":["Comedy"],"shooting_start_date":-998956800000,"tconst":"tt0030066","id":"n1040897","parent":"c5"},"position":{"x":284.9467562561615,"y":-283.51239639804174},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":114,"production_end_date":-757468800000,"original_title":"The Big Sleep","start_year":1946,"rating":7.9,"count_votes":75983,"primary_title":"The Big Sleep","shooting_end_date":-787968000000,"title_type":"movie","is_adult":0,"production_start_date":-820540800000,"genres":["Crime","Film-Noir","Mystery"],"shooting_start_date":-796089600000,"tconst":"tt0038355","id":"n1042682","parent":"c2"},"position":{"x":-149.73229857645748,"y":-99.16659557257307},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_datetime":0,"begin_datetime":0,"name":"","id":"c3"},"position":{"x":-57.60283841001647,"y":155.31940202552565},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Cluster"},{"data":{"primary_profession":["actress","soundtrack","producer"],"nconst":"nm0000003","primary_name":"Brigitte Bardot","start_t":-1136073600000,"birth_year":1934,"id":"n2","parent":"c3"},"position":{"x":-64.76830180994035,"y":163.52593922010854},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":120,"production_end_date":-126316800000,"original_title":"Viva Maria!","start_year":1965,"rating":6.3,"count_votes":3135,"primary_title":"Viva Maria!","shooting_end_date":-126316800000,"title_type":"movie","is_adult":0,"production_start_date":-155606400000,"genres":["Adventure","Comedy","Romance"],"shooting_start_date":-155606400000,"tconst":"tt0059956","id":"n1044899","parent":"c3"},"position":{"x":1.9595787406802287,"y":227.15280613247796},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":113,"production_end_date":-31622400000,"original_title":"Shalako","start_year":1968,"rating":5.6,"count_votes":2583,"primary_title":"Shalako","shooting_end_date":-31622400000,"title_type":"movie","is_adult":0,"production_start_date":-63158400000,"genres":["Western"],"shooting_start_date":-63158400000,"tconst":"tt0063592","id":"n1045152","parent":"c3"},"position":{"x":-149.10514333692092,"y":165.03905651852392},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"production_start_date":-94694400000,"runtime_minutes":180,"production_end_date":-44409600000,"original_title":"Faces of Paris","shooting_start_date":-94694400000,"genres":["Family"],"tconst":"tt4981286","start_year":1968,"primary_title":"Faces of Paris","shooting_end_date":-42163200000,"title_type":"tvMiniSeries","is_adult":0,"id":"n1076797","parent":"c3"},"position":{"x":24.399466516887983,"y":156.63083186737887},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":91,"production_end_date":31449600000,"original_title":"Les novices","start_year":1970,"rating":5.1,"count_votes":197,"primary_title":"Les novices","shooting_end_date":31449600000,"title_type":"movie","is_adult":0,"production_start_date":22723200000,"genres":["Comedy","Drama"],"shooting_start_date":22723200000,"tconst":"tt0066164","id":"n1045573","parent":"c3"},"position":{"x":-13.496605361666752,"y":92.2542875225507},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":86,"production_end_date":-86400000,"original_title":"Les femmes","start_year":1969,"rating":5.5,"count_votes":322,"primary_title":"Les femmes","shooting_end_date":-86400000,"title_type":"movie","is_adult":0,"production_start_date":-24451200000,"genres":["Comedy"],"shooting_start_date":-24451200000,"tconst":"tt0064324","id":"n1045238","parent":"c3"},"position":{"x":-86.98089218542972,"y":82.92599791857333},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_t":410140800000,"primary_profession":["actor","soundtrack","writer"],"death_year":1982,"nconst":"nm0000004","primary_name":"John Belushi","start_t":-662688000000,"birth_year":1949,"id":"n3","parent":"c4"},"position":{"x":244.3726354905211,"y":79.04859125613643},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":103,"production_end_date":349747200000,"original_title":"Continental Divide","start_year":1981,"rating":6.2,"count_votes":4413,"primary_title":"Continental Divide","shooting_end_date":349747200000,"title_type":"movie","is_adult":0,"production_start_date":340848000000,"shooting_start_date":340848000000,"genres":["Comedy","Romance"],"tconst":"tt0082200","id":"n1048145","parent":"c4"},"position":{"x":267.6332736263879,"y":163.92262916772455},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":133,"production_end_date":315446400000,"original_title":"The Blues Brothers","start_year":1980,"rating":7.9,"count_votes":173882,"primary_title":"The Blues Brothers","shooting_end_date":318211200000,"title_type":"movie","is_adult":0,"production_start_date":283996800000,"shooting_start_date":303350400000,"genres":["Adventure","Comedy","Crime"],"tconst":"tt0080455","id":"n1047965","parent":"c4"},"position":{"x":328.56668941966325,"y":74.28951632576846},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":105,"production_end_date":247104000000,"original_title":"Goin' South","start_year":1978,"rating":6.2,"count_votes":6009,"primary_title":"Goin' South","shooting_end_date":247104000000,"title_type":"movie","is_adult":0,"production_start_date":239241600000,"genres":["Comedy","Crime","Romance"],"shooting_start_date":239241600000,"tconst":"tt0077621","id":"n1047612","parent":"c4"},"position":{"x":159.31485666307913,"y":72.13437066292582},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":94,"production_end_date":378604800000,"original_title":"Neighbors","start_year":1981,"rating":5.6,"count_votes":7133,"primary_title":"Neighbors","shooting_end_date":362620800000,"title_type":"movie","is_adult":0,"production_start_date":352252800000,"genres":["Comedy"],"shooting_start_date":356572800000,"tconst":"tt0082801","id":"n1048215","parent":"c4"},"position":{"x":239.43126883496996,"y":-5.00400208142665},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":283910400000,"original_title":"Old Boyfriends","start_year":1979,"rating":5.4,"count_votes":229,"primary_title":"Old Boyfriends","shooting_end_date":283910400000,"title_type":"movie","is_adult":0,"production_start_date":258595200000,"genres":["Drama"],"shooting_start_date":258595200000,"tconst":"tt0079660","id":"n1047880","parent":"c4"},"position":{"x":198.47781712693197,"y":150.90080458125684},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"end_t":410140800000,"primary_profession":["actress","soundtrack","producer"],"death_year":1982,"nconst":"nm0000006","primary_name":"Ingrid Bergman","start_t":-1735689600000,"birth_year":1915,"id":"n4","parent":"c5"},"position":{"x":223.62809551517876,"y":-239.87140632186498},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},{"data":{"runtime_minutes":113,"production_end_date":-906768000000,"original_title":"Dr. Jekyll and Mr. Hyde","start_year":1941,"rating":6.8,"count_votes":7910,"primary_title":"Dr. Jekyll and Mr. Hyde","shooting_end_date":-906768000000,"title_type":"movie","is_adult":0,"production_start_date":-912211200000,"shooting_start_date":-912211200000,"genres":["Drama","Horror","Sci-Fi"],"tconst":"tt0033553","id":"n1041718","parent":"c5"},"position":{"x":279.85583532860215,"y":-334.32914112585695},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":120,"production_end_date":-284083200000,"original_title":"Goodbye Again","start_year":1961,"rating":7,"count_votes":2254,"primary_title":"Goodbye Again","shooting_end_date":-284083200000,"title_type":"movie","is_adult":0,"production_start_date":-292982400000,"genres":["Drama","Romance"],"shooting_start_date":-292982400000,"tconst":"tt0054936","id":"n1044585","parent":"c5"},"position":{"x":279.15128857880484,"y":-132.80471659989647},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":114,"production_end_date":-820627200000,"original_title":"Gaslight","start_year":1944,"rating":7.8,"count_votes":22520,"primary_title":"Gaslight","shooting_end_date":-820627200000,"title_type":"movie","is_adult":0,"production_start_date":-833760000000,"genres":["Crime","Drama","Film-Noir"],"shooting_start_date":-833760000000,"tconst":"tt0036855","id":"n1042398","parent":"c5"},"position":{"x":336.09139336112196,"y":-191.09623079120098},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":145,"production_end_date":-689558400000,"original_title":"Joan of Arc","start_year":1948,"rating":6.4,"count_votes":2606,"primary_title":"Joan of Arc","shooting_end_date":-689558400000,"title_type":"movie","is_adult":0,"production_start_date":-703555200000,"genres":["Biography","Drama","War"],"shooting_start_date":-703555200000,"tconst":"tt0040491","id":"n1042996","parent":"c5"},"position":{"x":225.6195491136871,"y":-307.0087563624151},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-347241600000,"original_title":"Indiscreet","start_year":1958,"rating":6.8,"count_votes":7280,"primary_title":"Indiscreet","shooting_end_date":-347241600000,"title_type":"movie","is_adult":0,"production_start_date":-378691200000,"genres":["Comedy","Romance"],"shooting_start_date":-378691200000,"tconst":"tt0051773","id":"n1044341","parent":"c5"},"position":{"x":286.87870035569307,"y":-178.5316737501033},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":98,"production_end_date":-86400000,"original_title":"A Walk in the Spring Rain","start_year":1970,"rating":6.1,"count_votes":618,"primary_title":"A Walk in the Spring Rain","shooting_end_date":-86400000,"title_type":"movie","is_adult":0,"production_start_date":-22032000000,"shooting_start_date":-22032000000,"genres":["Drama","Romance"],"tconst":"tt0066542","id":"n1045655","parent":"c5"},"position":{"x":118.39949640373428,"y":-242.7756179611503},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":135,"production_end_date":-836956800000,"original_title":"Saratoga Trunk","start_year":1945,"rating":6.5,"count_votes":1111,"primary_title":"Saratoga Trunk","shooting_end_date":-820627200000,"title_type":"movie","is_adult":0,"production_start_date":-847497600000,"genres":["Drama","Romance","Western"],"shooting_start_date":-849398400000,"tconst":"tt0038053","id":"n1042640","parent":"c5"},"position":{"x":220.21685831118026,"y":-127.79564690328304},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":120,"production_end_date":-730598400000,"original_title":"Arch of Triumph","start_year":1948,"rating":6.4,"count_votes":1293,"primary_title":"Arch of Triumph","shooting_end_date":-730598400000,"title_type":"movie","is_adult":0,"production_start_date":-740534400000,"shooting_start_date":-740534400000,"genres":["Drama","Romance","War"],"tconst":"tt0040109","id":"n1042940","parent":"c5"},"position":{"x":169.41158688873378,"y":-151.93981751493533},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":170,"production_end_date":-857433600000,"original_title":"For Whom the Bell Tolls","start_year":1943,"rating":6.9,"count_votes":7939,"primary_title":"For Whom the Bell Tolls","shooting_end_date":-857433600000,"title_type":"movie","is_adult":0,"production_start_date":-867974400000,"shooting_start_date":-867974400000,"genres":["Adventure","Drama","History"],"tconst":"tt0035896","id":"n1042189","parent":"c5"},"position":{"x":291.6585434098413,"y":-231.28333070685466},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":111,"production_end_date":-796953600000,"original_title":"Spellbound","start_year":1945,"rating":7.6,"count_votes":40960,"primary_title":"Spellbound","shooting_end_date":-796953600000,"title_type":"movie","is_adult":0,"production_start_date":-804816000000,"genres":["Film-Noir","Mystery","Romance"],"shooting_start_date":-804816000000,"tconst":"tt0038109","id":"n1042647","parent":"c5"},"position":{"x":229.85814290307886,"y":-355.60400208142664},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":100,"production_end_date":-190684800000,"original_title":"The Visit","start_year":1964,"rating":7.5,"count_votes":1397,"primary_title":"The Visit","shooting_end_date":-190684800000,"title_type":"movie","is_adult":0,"production_start_date":-199238400000,"genres":["Drama"],"shooting_start_date":-199238400000,"tconst":"tt0058724","id":"n1044824","parent":"c5"},"position":{"x":175.4249949221317,"y":-332.25564403733813},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":105,"production_end_date":94608000000,"original_title":"From the Mixed-Up Files of Mrs. Basil E. Frankweiler","start_year":1973,"rating":6.3,"count_votes":452,"primary_title":"From the Mixed-Up Files of Mrs. Basil E. Frankweiler","shooting_end_date":94608000000,"title_type":"movie","is_adult":0,"production_start_date":81388800000,"shooting_start_date":81388800000,"genres":["Comedy","Drama","Family"],"tconst":"tt0070079","id":"n1046299","parent":"c5"},"position":{"x":227.4791964753498,"y":-174.3202301390603},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":81,"production_end_date":-919296000000,"original_title":"Adam Had Four Sons","start_year":1941,"rating":6.6,"count_votes":797,"primary_title":"Adam Had Four Sons","shooting_end_date":-919296000000,"title_type":"movie","is_adult":0,"production_start_date":-923011200000,"shooting_start_date":-923011200000,"genres":["Drama","Romance"],"tconst":"tt0033314","id":"n1041661","parent":"c5"},"position":{"x":165.52480601878983,"y":-266.4084314077728},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":85,"production_end_date":-912556800000,"original_title":"Rage in Heaven","start_year":1941,"rating":6.4,"count_votes":935,"primary_title":"Rage in Heaven","shooting_end_date":-912556800000,"title_type":"movie","is_adult":0,"production_start_date":-917827200000,"genres":["Drama","Thriller"],"shooting_start_date":-917827200000,"tconst":"tt0034078","id":"n1041829","parent":"c5"},"position":{"x":329.46870858080104,"y":-303.47085112114576},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-865123200000,"original_title":"Casablanca","start_year":1942,"rating":8.5,"count_votes":497036,"primary_title":"Casablanca","shooting_end_date":-865123200000,"title_type":"movie","is_adult":0,"production_start_date":-871171200000,"genres":["Drama","Romance","War"],"shooting_start_date":-871171200000,"tconst":"tt0034583","id":"n1041946","parent":"c2"},"position":{"x":-16.527220287229525,"y":-207.07575933633194},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":103,"production_end_date":-86400000,"original_title":"Cactus Flower","start_year":1969,"rating":7.2,"count_votes":8909,"primary_title":"Cactus Flower","shooting_end_date":-86400000,"title_type":"movie","is_adult":0,"production_start_date":-28080000000,"genres":["Comedy","Romance"],"shooting_start_date":-28080000000,"tconst":"tt0064117","id":"n1045207","parent":"c5"},"position":{"x":339.6175202422494,"y":-249.6417447757489},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":97,"production_end_date":197078400000,"original_title":"A Matter of Time","start_year":1976,"rating":5.2,"count_votes":499,"primary_title":"A Matter of Time","shooting_end_date":197078400000,"title_type":"movie","is_adult":0,"production_start_date":176083200000,"shooting_start_date":176083200000,"genres":["Drama","Fantasy","Romance"],"tconst":"tt0074878","id":"n1047184","parent":"c5"},"position":{"x":145.8187386393289,"y":-197.44993739976104},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"},{"data":{"runtime_minutes":102,"production_end_date":-756000000000,"original_title":"Notorious","start_year":1946,"rating":7.9,"count_votes":88094,"primary_title":"Notorious","shooting_end_date":-756000000000,"title_type":"movie","is_adult":0,"production_start_date":-764553600000,"genres":["Drama","Film-Noir","Romance"],"shooting_start_date":-764553600000,"tconst":"tt0038787","id":"n1042751","parent":"c5"},"position":{"x":124.0470439052244,"y":-306.01238521203015},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}],"edges":[{"data":{"characters":["Paula Tessier"],"act_end":-284083200000,"act_begin":-292982400000,"job":"","id":"e1632623","source":"n4","target":"n1044585"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Ivy Peterson"],"act_end":-906768000000,"act_begin":-912211200000,"job":"","id":"e1629013","source":"n4","target":"n1041718"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Philip Marlowe"],"act_end":-787968000000,"act_begin":-796089600000,"job":"","id":"e1494653","source":"c1611575415904","target":"n1042682","originalEnds":{"source":{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5","parent":"c1611575428222"},"position":{"x":-71.79250695766993,"y":-127.2015872537342},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":114,"production_end_date":-757468800000,"original_title":"The Big Sleep","start_year":1946,"rating":7.9,"count_votes":75983,"primary_title":"The Big Sleep","shooting_end_date":-787968000000,"title_type":"movie","is_adult":0,"production_start_date":-820540800000,"genres":["Crime","Film-Noir","Mystery"],"shooting_start_date":-796089600000,"tconst":"tt0038355","id":"n1042682","parent":"c2"},"position":{"x":-149.73229857645748,"y":-99.16659557257307},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR cy-expand-collapse-meta-edge"},{"data":{"characters":["Emilie Gallatin"],"act_end":-919296000000,"act_begin":-923011200000,"job":"","id":"e1628936","source":"n4","target":"n1041661"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Mrs. Frankweiler"],"act_end":94608000000,"act_begin":81388800000,"job":"","id":"e1634685","source":"n4","target":"n1046299"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Libby Meredith"],"act_end":-86400000,"act_begin":-22032000000,"job":"","id":"e1633938","source":"n4","target":"n1045655"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"source":"n4","target":"n1042751","id":"collapsedEdge_n4_n1042751_unknown_129238846033","collapsedEdges":[{"data":{"characters":["Alicia Huberman"],"act_end":-756000000000,"act_begin":-764553600000,"job":"","id":"e1630342","source":"n4","target":"n1042751"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-756000000000,"begin":-764553600000,"id":"e10","source":"n4","target":"n1042751"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Contessa Sanziani"],"act_end":197078400000,"act_begin":176083200000,"job":"","id":"e1635600","source":"n4","target":"n1047184"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Karla Zachanassian"],"act_end":-190684800000,"act_begin":-199238400000,"job":"","id":"e1632936","source":"n4","target":"n1044824"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Joan Madou"],"act_end":-730598400000,"act_begin":-740534400000,"job":"","id":"e1630607","source":"n4","target":"n1042940"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Clio Dulaine"],"act_end":-820627200000,"act_begin":-849398400000,"job":"","id":"e1630208","source":"n4","target":"n1042640"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Roy Earle"],"act_end":-924307200000,"act_begin":-927158400000,"job":"","id":"e1492525","source":"c1611575415904","target":"n1041749","originalEnds":{"source":{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5","parent":"c1611575428222"},"position":{"x":-71.79250695766993,"y":-127.2015872537342},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":100,"production_end_date":-924307200000,"original_title":"High Sierra","start_year":1941,"rating":7.5,"count_votes":14244,"primary_title":"High Sierra","shooting_end_date":-924307200000,"title_type":"movie","is_adult":0,"production_start_date":-927158400000,"genres":["Action","Adventure","Crime"],"shooting_start_date":-927158400000,"tconst":"tt0033717","id":"n1041749","parent":"c2"},"position":{"x":-230.43847654719093,"y":-207.79607119806474},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR cy-expand-collapse-meta-edge"},{"data":{"characters":["Anna Kalman"],"act_end":-347241600000,"act_begin":-378691200000,"job":"","id":"e1632302","source":"n4","target":"n1044341"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Joan of Arc"],"act_end":-689558400000,"act_begin":-703555200000,"job":"","id":"e1630675","source":"n4","target":"n1042996"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Stephanie Dickinson"],"act_end":-86400000,"act_begin":-28080000000,"job":"","id":"e1633411","source":"n4","target":"n1045207"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"source":"n4","target":"n1042647","id":"collapsedEdge_n4_n1042647_unknown_618052729892","collapsedEdges":[{"data":{"characters":["Dr. Constance Petersen"],"act_end":-796953600000,"act_begin":-804816000000,"job":"","id":"e1630216","source":"n4","target":"n1042647"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-796953600000,"begin":-804816000000,"id":"e9","source":"n4","target":"n1042647"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"source":"n4","target":"n1042398","id":"collapsedEdge_n4_n1042398_unknown_1004360221782","collapsedEdges":[{"data":{"characters":["Paula Alquist"],"act_end":-820627200000,"act_begin":-833760000000,"job":"","id":"e1629887","source":"n4","target":"n1042398"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-820627200000,"begin":-833760000000,"id":"e8","source":"n4","target":"n1042398"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"source":"n3","target":"n1047965","id":"collapsedEdge_n3_n1047965_unknown_347468277924","collapsedEdges":[{"data":{"characters":["Joliet Jake"],"act_end":318211200000,"act_begin":303350400000,"job":"","id":"e1506660","source":"n3","target":"n1047965"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"end":315446400000,"begin":283996800000,"id":"e7","source":"n3","target":"n1047965"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Ilsa Lund"],"act_end":-865123200000,"act_begin":-871171200000,"job":"","id":"e1629315","source":"n4","target":"n1041946"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Julia Balzar"],"act_end":-993772800000,"act_begin":-998956800000,"job":"","id":"e1627942","source":"n4","target":"n1040897"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-865123200000,"begin":-871171200000,"id":"e13","source":"c1611575415904","target":"n1041946","originalEnds":{"source":{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5","parent":"c1611575428222"},"position":{"x":-71.79250695766993,"y":-127.2015872537342},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":102,"production_end_date":-865123200000,"original_title":"Casablanca","start_year":1942,"rating":8.5,"count_votes":497036,"primary_title":"Casablanca","shooting_end_date":-865123200000,"title_type":"movie","is_adult":0,"production_start_date":-871171200000,"genres":["Drama","Romance","War"],"shooting_start_date":-871171200000,"tconst":"tt0034583","id":"n1041946","parent":"c2"},"position":{"x":-16.527220287229525,"y":-207.07575933633194},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR cy-expand-collapse-meta-edge"},{"data":{"source":"n2","target":"n1044899","id":"collapsedEdge_n2_n1044899_unknown_1154170547251","collapsedEdges":[{"data":{"characters":["Maria I"],"act_end":-126316800000,"act_begin":-155606400000,"job":"","id":"e1633037","source":"n2","target":"n1044899"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-126316800000,"begin":-155606400000,"id":"e6","source":"n2","target":"n1044899"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge"},{"data":{"characters":["Eric Katz"],"act_end":283910400000,"act_begin":258595200000,"job":"","id":"e1506457","source":"n3","target":"n1047880"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Earl Keese"],"act_end":362620800000,"act_begin":356572800000,"job":"","id":"e1507251","source":"n3","target":"n1048215"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Deputy Hector"],"act_end":247104000000,"act_begin":239241600000,"job":"","id":"e1505831","source":"n3","target":"n1047612"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"characters":["Dixon Steele"],"act_end":-633830400000,"act_begin":-637027200000,"job":"","id":"e1496124","source":"c1611575415904","target":"n1043296","originalEnds":{"source":{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5","parent":"c1611575428222"},"position":{"x":-71.79250695766993,"y":-127.2015872537342},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":94,"production_end_date":-633830400000,"original_title":"In a Lonely Place","start_year":1950,"rating":8,"count_votes":23875,"primary_title":"In a Lonely Place","shooting_end_date":-633830400000,"title_type":"movie","is_adult":0,"production_start_date":-637027200000,"shooting_start_date":-637027200000,"genres":["Drama","Film-Noir","Mystery"],"tconst":"tt0042593","id":"n1043296","parent":"c2"},"position":{"x":-178.55748267375793,"y":-264.17385682048047},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR cy-expand-collapse-meta-edge"},{"data":{"characters":["Ernie Souchak"],"act_end":349747200000,"act_begin":340848000000,"job":"","id":"e1507091","source":"n3","target":"n1048145"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR"},{"data":{"source":"c1","target":"c1611575415904","id":"collapsedEdge_n1_n1042518_unknown_153131403609","collapsedEdges":[{"data":{"characters":["Marie 'Slim' Browning"],"act_end":-809308800000,"act_begin":-815443200000,"job":"","id":"e1630050","source":"n1","target":"n1042518"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-809308800000,"begin":-815443200000,"id":"e5","source":"n1","target":"n1042518"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection","originalEnds":{"source":{"data":{"end_t":1419984000000,"primary_profession":["actress","soundtrack"],"death_year":2014,"nconst":"nm0000002","primary_name":"Lauren Bacall","start_t":-1451692800000,"birth_year":1924,"id":"n1","parent":"c1"},"position":{"x":221.56335840306576,"y":-355.83762846209436},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":100,"production_end_date":-809308800000,"original_title":"To Have and Have Not","start_year":1944,"rating":7.8,"count_votes":29330,"primary_title":"To Have and Have Not","shooting_end_date":-809308800000,"title_type":"movie","is_adult":0,"production_start_date":-815443200000,"shooting_start_date":-815443200000,"genres":["Adventure","Comedy","Film-Noir"],"tconst":"tt0037382","id":"n1042518","parent":"c1611575415904"},"position":{"x":50.824620397805674,"y":-241.9036014831678},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge cy-expand-collapse-meta-edge"},{"data":{"characters":["Clara"],"act_end":-86400000,"act_begin":-24451200000,"job":"","id":"e1633451","source":"n2","target":"n1045238"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Agnès"],"act_end":31449600000,"act_begin":22723200000,"job":"","id":"e1633839","source":"n2","target":"n1045573"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Self"],"end":-44409600000,"job":"","begin":-94694400000,"id":"e1433263","source":"n2","target":"n1076797"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"SELF"},{"data":{"characters":["Irina Lazaar"],"act_end":-31622400000,"act_begin":-63158400000,"job":"","id":"e1633338","source":"n2","target":"n1045152"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["María"],"act_end":-857433600000,"act_begin":-867974400000,"job":"","id":"e1629634","source":"n4","target":"n1042189"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"characters":["Fred C. Dobbs"],"act_end":-708739200000,"act_begin":-717638400000,"job":"","id":"e1495596","source":"c1611575415904","target":"n1043065","originalEnds":{"source":{"data":{"end_t":-378777600000,"primary_profession":["actor","soundtrack","producer"],"death_year":1957,"nconst":"nm0000007","primary_name":"Humphrey Bogart","start_t":-2240524800000,"birth_year":1899,"id":"n5","parent":"c1611575428222"},"position":{"x":-71.79250695766993,"y":-127.2015872537342},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":126,"production_end_date":-708739200000,"original_title":"The Treasure of the Sierra Madre","start_year":1948,"rating":8.2,"count_votes":108196,"primary_title":"The Treasure of the Sierra Madre","shooting_end_date":-708739200000,"title_type":"movie","is_adult":0,"production_start_date":-717638400000,"genres":["Adventure","Drama","Western"],"shooting_start_date":-717638400000,"tconst":"tt0040897","id":"n1043065","parent":"c2"},"position":{"x":-111.16761391450285,"y":-260.15281984085726},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTOR cy-expand-collapse-meta-edge"},{"data":{"source":"c1","target":"n1042682","id":"collapsedEdge_n1_n1042682_unknown_850987493969","collapsedEdges":[{"data":{"characters":["Vivian Rutledge"],"act_end":-787968000000,"act_begin":-796089600000,"job":"","id":"e1630253","source":"n1","target":"n1042682"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"},{"data":{"end":-757468800000,"begin":-820540800000,"id":"e4","source":"n1","target":"n1042682"},"position":{"x":0,"y":0},"group":"edges","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"KNOWN_FOR"}],"edgeType":"unknown","directionType":"unidirection","originalEnds":{"source":{"data":{"end_t":1419984000000,"primary_profession":["actress","soundtrack"],"death_year":2014,"nconst":"nm0000002","primary_name":"Lauren Bacall","start_t":-1451692800000,"birth_year":1924,"id":"n1","parent":"c1"},"position":{"x":221.56335840306576,"y":-355.83762846209436},"group":"nodes","removed":true,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Person"},"target":{"data":{"runtime_minutes":114,"production_end_date":-757468800000,"original_title":"The Big Sleep","start_year":1946,"rating":7.9,"count_votes":75983,"primary_title":"The Big Sleep","shooting_end_date":-787968000000,"title_type":"movie","is_adult":0,"production_start_date":-820540800000,"genres":["Crime","Film-Noir","Mystery"],"shooting_start_date":-796089600000,"tconst":"tt0038355","id":"n1042682","parent":"c2"},"position":{"x":-149.73229857645748,"y":-99.16659557257307},"group":"nodes","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":false,"classes":"Title"}}},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"cy-expand-collapse-collapsed-edge cy-expand-collapse-meta-edge"},{"data":{"characters":["Stella Bergen"],"act_end":-912556800000,"act_begin":-917827200000,"job":"","id":"e1629164","source":"n4","target":"n1041829"},"position":{"x":0,"y":0},"group":"edges","removed":false,"selected":false,"selectable":true,"locked":false,"grabbable":true,"pannable":true,"classes":"ACTRESS"}]} \ No newline at end of file diff --git a/cypress/helper.js b/cypress/helper.js deleted file mode 100644 index 15d4541e..00000000 --- a/cypress/helper.js +++ /dev/null @@ -1,78 +0,0 @@ -export const URL = 'http://visuall.herokuapp.com/'; -// export const URL = 'http://localhost:4200/'; - -export function open() { - cy.visit(URL); -} - -/** click to open dropdown menu and then click to the action button - * @param {string} dropdownBtn text shown on UI - * @param {string} actionBtn text shown on UI - */ -export function navbarAction(dropdownBtn, actionBtn) { - cy.get('button.btn.btn-light.dropdown-toggle:visible').contains(dropdownBtn).click(); - cy.get('button.dropdown-item:visible').contains(actionBtn).click(); - - if (dropdownBtn == 'Data' && actionBtn == 'Sample Data') { - cy.wait(1500); - cy.window().then((win) => { - expect(win.cy.nodes().length > 0).to.eq(true); - }); - } - if (dropdownBtn == 'Data' && actionBtn == 'Clear Data') { - cy.window().then((win) => { - expect(win.cy.nodes().length == 0).to.eq(true); - }); - } -} - -/** - * @param {string} subTab text shown on UI - */ -export function openSubTab(subTab) { - cy.get('b.va-heading2:visible').contains(subTab).click(); -} - -/** - * @param {string} s text shown on UI - */ -export function openTab(s) { - cy.get('a.nav-link').contains(s).click(); -} - -/** click to "Options" subheading - */ -export function click2options() { - cy.get('span.va-heading3').contains('Options').click(); - cy.wait(250); -} - -/** - * @param {string} algoName - * @param {boolean} shouldResultCompounds - */ -export function groupBy(algoName, shouldResultCompounds) { - cy.get('label').contains(algoName).click(); - cy.get('input[value="Execute"]:visible').click(); - - cy.window().then((win) => { - if (shouldResultCompounds) { - expect(win.cy.$(':parent').length > 0).to.eq(true); - } else { - expect(win.cy.$(':parent').length == 0).to.eq(true); - } - }); -} - -/** - * @param {string} prop Object type to select - * @param {string} op Operator to select - * @param {string} inp input value as operand - */ -export function addPropertyRule(prop, op, inp) { - cy.get('select.prop').select(prop); - cy.get('select.prop-op-key').select(op); - cy.get('input[placeholder="Filter..."]').clear(); - cy.get('input[placeholder="Filter..."]').type(inp); - cy.get('img[title="Add/Update"]').click(); -} \ No newline at end of file diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js deleted file mode 100644 index 59b2bab6..00000000 --- a/cypress/plugins/index.js +++ /dev/null @@ -1,22 +0,0 @@ -/// -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ -// eslint-disable-next-line no-unused-vars -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} diff --git a/cypress/screenshots/app.cy.js/Global properties about Visuall -- TC1 Can show object properties by selecting -- before each hook open (failed).png b/cypress/screenshots/app.cy.js/Global properties about Visuall -- TC1 Can show object properties by selecting -- before each hook open (failed).png deleted file mode 100644 index 49191ac5..00000000 Binary files a/cypress/screenshots/app.cy.js/Global properties about Visuall -- TC1 Can show object properties by selecting -- before each hook open (failed).png and /dev/null differ diff --git a/cypress/screenshots/filterByType.cy.js/Filter By NodeEdge Type -- TC1 Filter by nodeedge type should show or hide based on type -- before each hook open (failed).png b/cypress/screenshots/filterByType.cy.js/Filter By NodeEdge Type -- TC1 Filter by nodeedge type should show or hide based on type -- before each hook open (failed).png deleted file mode 100644 index 9e7530da..00000000 Binary files a/cypress/screenshots/filterByType.cy.js/Filter By NodeEdge Type -- TC1 Filter by nodeedge type should show or hide based on type -- before each hook open (failed).png and /dev/null differ diff --git a/cypress/screenshots/generalQueries.cy.js/General Queries implemented in the backend side -- TC1 Get Neigborhood query should bring some nodes and edges -- before each hook open (failed).png b/cypress/screenshots/generalQueries.cy.js/General Queries implemented in the backend side -- TC1 Get Neigborhood query should bring some nodes and edges -- before each hook open (failed).png deleted file mode 100644 index bc821ebb..00000000 Binary files a/cypress/screenshots/generalQueries.cy.js/General Queries implemented in the backend side -- TC1 Get Neigborhood query should bring some nodes and edges -- before each hook open (failed).png and /dev/null differ diff --git a/cypress/screenshots/graphTheoreticProperty.cy.js/Calculate Theoretic Property -- TC1 Can calculate degree centrality and set widths -- before each hook open (failed).png b/cypress/screenshots/graphTheoreticProperty.cy.js/Calculate Theoretic Property -- TC1 Can calculate degree centrality and set widths -- before each hook open (failed).png deleted file mode 100644 index 49c18ba4..00000000 Binary files a/cypress/screenshots/graphTheoreticProperty.cy.js/Calculate Theoretic Property -- TC1 Can calculate degree centrality and set widths -- before each hook open (failed).png and /dev/null differ diff --git a/cypress/screenshots/groupNodes.cy.js/Group Nodes -- TC1 Can group with Louvain using compounds -- before each hook open (failed).png b/cypress/screenshots/groupNodes.cy.js/Group Nodes -- TC1 Can group with Louvain using compounds -- before each hook open (failed).png deleted file mode 100644 index ac16e77e..00000000 Binary files a/cypress/screenshots/groupNodes.cy.js/Group Nodes -- TC1 Can group with Louvain using compounds -- before each hook open (failed).png and /dev/null differ diff --git a/cypress/screenshots/navbar.cy.js/Navbar buttons -- TC1 should have at least 7 buttons on navbar -- before each hook open (failed).png b/cypress/screenshots/navbar.cy.js/Navbar buttons -- TC1 should have at least 7 buttons on navbar -- before each hook open (failed).png deleted file mode 100644 index 89c25c3a..00000000 Binary files a/cypress/screenshots/navbar.cy.js/Navbar buttons -- TC1 should have at least 7 buttons on navbar -- before each hook open (failed).png and /dev/null differ diff --git a/cypress/screenshots/queryByRule.cy.js/Query By Rule -- TC1 rule for birth 1994 AND death 2020 -- before each hook open (failed).png b/cypress/screenshots/queryByRule.cy.js/Query By Rule -- TC1 rule for birth 1994 AND death 2020 -- before each hook open (failed).png deleted file mode 100644 index 610785f7..00000000 Binary files a/cypress/screenshots/queryByRule.cy.js/Query By Rule -- TC1 rule for birth 1994 AND death 2020 -- before each hook open (failed).png and /dev/null differ diff --git a/cypress/screenshots/timebar.cy.js/Timebar -- TC1 Timebar metric as AND rule birth 1994 && death 2020 -- before each hook open (failed).png b/cypress/screenshots/timebar.cy.js/Timebar -- TC1 Timebar metric as AND rule birth 1994 && death 2020 -- before each hook open (failed).png deleted file mode 100644 index cb005fae..00000000 Binary files a/cypress/screenshots/timebar.cy.js/Timebar -- TC1 Timebar metric as AND rule birth 1994 && death 2020 -- before each hook open (failed).png and /dev/null differ diff --git a/cypress/support/commands.js b/cypress/support/commands.js deleted file mode 100644 index 119ab03f..00000000 --- a/cypress/support/commands.js +++ /dev/null @@ -1,25 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js deleted file mode 100644 index 9c5f5954..00000000 --- a/cypress/support/e2e.js +++ /dev/null @@ -1,20 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands' -import 'cypress-file-upload'; -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/docs/.DS_Store b/docs/.DS_Store deleted file mode 100644 index 386e7dec..00000000 Binary files a/docs/.DS_Store and /dev/null differ diff --git a/docs/background.png b/docs/background.png deleted file mode 100644 index 9f6e5939..00000000 Binary files a/docs/background.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index b3501169..00000000 --- a/docs/index.md +++ /dev/null @@ -1,41 +0,0 @@ -# Software Artifact Analyzer - -Software Artifact Analyzer (SAA) was built on a [fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) of the repository of the tool [Visuall](https://github.com/ugurdogrusoz/visuall) to visually analyze different software artifacts, including source code files, pull requests, issues, and commits, as well as their relationships with developers in the software projects. - -![Screenshot](https://github.com/iVis-at-Bilkent/software-artifact-analyzer/assets/59064089/4118240f-9942-4cc5-a61d-e268bf3740b3) - -# Demo -A sample demo deployment can be found [here](http://saa.cs.bilkent.edu.tr/). - -## Key Features - -- **Context Menu**: Implemented using the [cytoscape.js-context-menus](https://github.com/iVis-at-Bilkent/cytoscape.js-context-menus) library, the context menu is node-specific, allowing users to perform operations tailored to each node type. Relation-based queries enable users to reveal connections between different node types. -![Context Menu](https://github.com/iVis-at-Bilkent/software-artifact-analyzer/assets/59064089/e300f599-0025-41c0-b32f-d478f04f9585) - -- **Grouping Nodes**: SAA facilitates the grouping of nodes based on developers, enhancing visualization to understand relationships and dynamics within a software project. - -- **Reviewer Recommendation**: Utilizing the RSTrace+ [1] algorithm, SAA assists in making reviewer assignments, offering a visual representation of analysis results to boost confidence in decision-making. - -![Reviewer Recommendation](https://github.com/iVis-at-Bilkent/software-artifact-analyzer/assets/59064089/e363c472-c631-448a-9a60-9c9e55bc706c) - -- **Bug Tracking Process Anomaly Detection**: SAA detects 11 types of bug-tracking process anomalies, as categorized by Qamar et al. [2], contributing to process evaluation and anomaly prevention. - -- **Report Component**: SAA allows users to report analysis results or observations directly on GitHub or Jira platforms, promoting seamless integration and practicality. Users can submit reports as comments under pull requests in GitHub or issue comments in Jira, enhancing collaboration and communication. - -![Report Component](https://github.com/iVis-at-Bilkent/software-artifact-analyzer/assets/59064089/7e0038e7-12d8-44ac-a13f-0d9e9c36762a) - -This tool empowers developers with the ability to detect anomalies, make informed decisions, and collaborate effectively within the context of their software projects. - -[1] E. Sülün, E. Tüzün, and U. Doğrusöz, “RSTrace+: Reviewer suggestion using software artifact traceability graphs,” Information and Software Technology, vol. 130, p. 106455, 2021. - -[2] K. A. Qamar, E. Sülün, and E. Tüzün, “Taxonomy of bug tracking process smells: Perceptions of practitioners and an empirical analysis,” Information and Software Technology, vol. 150, p. 106972, 2022. doi:10.1016/j.infsof.2022.106972 - - -## User Guide - -A User Guide for the Software Artifact Analyzer can be found [here](https://docs.google.com/document/d/1MHoBk2O2AREYiKwqZuDkHLkdlWwUkYMHzeuugqnVxFY/edit?usp=sharing). - -## Developer Guide - -A Developer Guide for SAA can be found [here](https://docs.google.com/document/d/1dIasoHNoGYy6klZOnmUMzOE7RvM-fN7DOcEf7w9jS70/edit?usp=sharing). - diff --git a/e2e-results.txt b/e2e-results.txt deleted file mode 100755 index 3687c92d..00000000 --- a/e2e-results.txt +++ /dev/null @@ -1,162 +0,0 @@ - -==================================================================================================== - - (Run Starting) - - ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Cypress: 10.1.0 │ - │ Browser: Electron 100 (headless) │ - │ Node Version: v14.19.3 (/home/ivis/.nvm/versions/node/v14.19.3/bin/node) │ - │ Specs: 8 found (app.cy.js, filterByType.cy.js, generalQueries.cy.js, graphTheoreticPr │ - │ operty.cy.js, groupNodes.cy.js, navbar.cy.js, queryByRule.cy.js, timebar.cy.js │ - │ ) │ - │ Searched: cypress/e2e/**/*.cy.{js,jsx,ts,tsx} │ - └────────────────────────────────────────────────────────────────────────────────────────────────┘ - - -──────────────────────────────────────────────────────────────────────────────────────────────────── - - Running: app.cy.js (1 of 8) - - - Global properties about Visuall - ✓ TC1: Can show object properties by selecting (5572ms) - ✓ TC2: Should maintain settings when "Store user profile" is checked (true by default) (3107ms) - - - 2 passing (11s) - - - (Results) - - ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Tests: 2 │ - │ Passing: 2 │ - │ Failing: 0 │ - │ Pending: 0 │ - │ Skipped: 0 │ - │ Screenshots: 0 │ - │ Video: false │ - │ Duration: 11 seconds │ - │ Spec Ran: app.cy.js │ - └────────────────────────────────────────────────────────────────────────────────────────────────┘ - - -──────────────────────────────────────────────────────────────────────────────────────────────────── - - Running: filterByType.cy.js (2 of 8) - - - Filter By Node/Edge Type - ✓ TC1: Filter by node/edge type should show or hide based on type (5852ms) - - - 1 passing (8s) - - - (Results) - - ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Tests: 1 │ - │ Passing: 1 │ - │ Failing: 0 │ - │ Pending: 0 │ - │ Skipped: 0 │ - │ Screenshots: 0 │ - │ Video: false │ - │ Duration: 8 seconds │ - │ Spec Ran: filterByType.cy.js │ - └────────────────────────────────────────────────────────────────────────────────────────────────┘ - - -──────────────────────────────────────────────────────────────────────────────────────────────────── - - Running: generalQueries.cy.js (3 of 8) - - - General Queries implemented in the backend side - ✓ TC1: "Get Neigborhood" query should bring some nodes and edges (10732ms) - ✓ TC2: "Get graph of interest" query should bring some nodes and edges (10983ms) - ✓ TC3: "Get common targets/regulators" query should bring some nodes and edges (9743ms) - - - 3 passing (34s) - - - (Results) - - ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Tests: 3 │ - │ Passing: 3 │ - │ Failing: 0 │ - │ Pending: 0 │ - │ Skipped: 0 │ - │ Screenshots: 0 │ - │ Video: false │ - │ Duration: 33 seconds │ - │ Spec Ran: generalQueries.cy.js │ - └────────────────────────────────────────────────────────────────────────────────────────────────┘ - - -──────────────────────────────────────────────────────────────────────────────────────────────────── - - Running: graphTheoreticProperty.cy.js (4 of 8) - - - Calculate Theoretic Property - ✓ TC1: Can calculate degree centrality and set widths (5888ms) - - - 1 passing (8s) - - - (Results) - - ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Tests: 1 │ - │ Passing: 1 │ - │ Failing: 0 │ - │ Pending: 0 │ - │ Skipped: 0 │ - │ Screenshots: 0 │ - │ Video: false │ - │ Duration: 8 seconds │ - │ Spec Ran: graphTheoreticProperty.cy.js │ - └────────────────────────────────────────────────────────────────────────────────────────────────┘ - - -──────────────────────────────────────────────────────────────────────────────────────────────────── - - Running: groupNodes.cy.js (5 of 8) - - - Group Nodes - ✓ TC1: Can group with Louvain using compounds (6878ms) - - - 1 passing (9s) - - - (Results) - - ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Tests: 1 │ - │ Passing: 1 │ - │ Failing: 0 │ - │ Pending: 0 │ - │ Skipped: 0 │ - │ Screenshots: 0 │ - │ Video: false │ - │ Duration: 9 seconds │ - │ Spec Ran: groupNodes.cy.js │ - └────────────────────────────────────────────────────────────────────────────────────────────────┘ - - -──────────────────────────────────────────────────────────────────────────────────────────────────── - - Running: navbar.cy.js (6 of 8) - - - Navbar buttons - ✓ TC1: should have at least 7 buttons on navbar (3264ms) - ✓ TC2: Can save as JSON and PNG (6175ms) diff --git a/e2e-runner.sh b/e2e-runner.sh deleted file mode 100755 index 5454a20c..00000000 --- a/e2e-runner.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash -PATH=/usr/bin:/bin:/home/ivis/.nvm/versions/node/v14.19.3/bin -npm run e2e && bash -c "echo 'Tested on visuall.heroku.com at $(date)' >> e2e-results.txt" \ No newline at end of file diff --git a/docs/features.html b/features.html similarity index 100% rename from docs/features.html rename to features.html diff --git a/file-server.js b/file-server.js deleted file mode 100644 index 6a2b8a7f..00000000 --- a/file-server.js +++ /dev/null @@ -1,13 +0,0 @@ -const express = require('express'); -const compression = require('compression'); -const path = require('path'); - -const app = express(); -app.use(compression()); - -const port = process.env.PORT || 8080; -app.listen(port); - -app.get('/*', function (req, res) { - res.sendFile(path.join(__dirname + '/logs.txt')); -}); \ No newline at end of file diff --git a/gitpull.sh b/gitpull.sh deleted file mode 100755 index 36799a82..00000000 --- a/gitpull.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -cd /home/ivis/visuall/software-artifact-analyzer -git checkout -- . -echo "git pull started $(date)" -sudo git pull -echo "git pull ended $(date)" \ No newline at end of file diff --git a/gitpull.sh.save b/gitpull.sh.save deleted file mode 100755 index 6099343b..00000000 --- a/gitpull.sh.save +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -cd -git checkout -- . -echo "git pull started $(date)" -git pull -echo "git pull ended $(date)" diff --git a/docs/guides.html b/guides.html similarity index 100% rename from docs/guides.html rename to guides.html diff --git a/docs/implications.html b/implications.html similarity index 66% rename from docs/implications.html rename to implications.html index edcfe057..86b94231 100644 --- a/docs/implications.html +++ b/implications.html @@ -5,52 +5,6 @@ Practitioner Insights -
diff --git a/docs/index.html b/index.html similarity index 100% rename from docs/index.html rename to index.html diff --git a/docs/main.js b/main.js similarity index 100% rename from docs/main.js rename to main.js diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index ba25b3d3..00000000 --- a/package-lock.json +++ /dev/null @@ -1,14795 +0,0 @@ -{ - "name": "ng-visuall", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ng-visuall", - "version": "1.0.0", - "license": "iVis", - "dependencies": { - "@angular/animations": "^14.0.1", - "@angular/cdk": "^13.0.0", - "@angular/common": "^14.0.1", - "@angular/compiler": "^14.0.1", - "@angular/core": "^14.0.1", - "@angular/forms": "^14.0.1", - "@angular/localize": "^14.0.1", - "@angular/material": "^13.0.0", - "@angular/platform-browser": "^14.0.1", - "@angular/platform-browser-dynamic": "^14.0.1", - "@angular/router": "^14.0.1", - "@ng-bootstrap/ng-bootstrap": "^12.1.2", - "@popperjs/core": "^2.11.5", - "a-color-picker": "^1.2.1", - "angular2-draggable": "^2.3.2", - "body-parser": "^1.20.0", - "bootstrap": "^5.1.3", - "compression": "^1.7.4", - "cytoscape": "^3.21.1", - "cytoscape-cise": "github:iVis-at-Bilkent/cytoscape.js-cise#develop", - "cytoscape-context-menus": "github:iVis-at-Bilkent/cytoscape.js-context-menus#unstable", - "cytoscape-expand-collapse": "github:iVis-at-Bilkent/cytoscape.js-expand-collapse#unstable", - "cytoscape-fcose": "github:iVis-at-Bilkent/cytoscape.js-fcose#unstable", - "cytoscape-layout-utilities": "github:iVis-at-Bilkent/cytoscape.js-layout-utilities#unstable", - "cytoscape-navigator": "^2.0.1", - "cytoscape-panzoom": "^2.5.3", - "cytoscape-view-utilities": "github:iVis-at-Bilkent/cytoscape.js-view-utilities#unstable", - "express": "^4.18.1", - "flatpickr": "^4.6.13", - "html2canvas": "^1.4.1", - "http": "0.0.1-security", - "https": "^1.0.0", - "jquery": "^3.6.0", - "ngx-autosize-input": "^13.1.0", - "path": "^0.12.7", - "rxjs": "^7.5.5", - "tinycolor2": "^1.6.0", - "tslib": "^2.5.0", - "zone.js": "~0.11.5" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^14.0.1", - "@angular/cli": "^14.0.1", - "@angular/compiler-cli": "^14.0.1", - "@angular/language-service": "^14.0.1", - "@types/jasmine": "^4.0.3", - "@types/jasminewd2": "~2.0.10", - "@types/node": "^17.0.42", - "codelyzer": "^6.0.2", - "css": "^3.0.0", - "cypress": "^10.1.0", - "cypress-file-upload": "^5.0.8", - "enhanced-resolve": "^5.9.3", - "jasmine-core": "~4.2.0", - "jasmine-spec-reporter": "~7.0.0", - "karma": "^6.3.20", - "karma-chrome-launcher": "~3.1.1", - "karma-coverage-istanbul-reporter": "^3.0.3", - "karma-jasmine": "~5.0.1", - "karma-jasmine-html-reporter": "^2.0.0", - "ts-node": "^10.8.1", - "tslint": "^6.1.3", - "typescript": "~4.7.3" - }, - "engines": { - "node": "14.x", - "npm": "6.x" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", - "dev": true - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "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.1402.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz", - "integrity": "sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "14.2.11", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.15.0 || >=16.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": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.11.tgz", - "integrity": "sha512-O3X7GXcCBCGceVSHT+GIJ2JrRCg2YcO7HtNavpmPrraNr1o+aCdTkmT5WTS2cqWkZBm/z0wqKR8PsX/ZoD2r1A==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.11", - "@angular-devkit/build-webpack": "0.1402.11", - "@angular-devkit/core": "14.2.11", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.11", - "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", - "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "karma-source-map-support": "1.4.0", - "less": "4.1.3", - "less-loader": "11.0.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", - "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", - "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.76.1", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "5.1.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "esbuild": "0.15.5" - }, - "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "@angular/localize": "^14.0.0", - "@angular/service-worker": "^14.0.0", - "karma": "^6.3.0", - "ng-packagr": "^14.0.0", - "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.6.2 <4.9" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "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/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-angular/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1402.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.11.tgz", - "integrity": "sha512-Ajyg1O6B6JSHsDlPdh165uy3glW4IiUlRXu8VVAOSA88WIT1Dl17f4Oun0/t27ip0/CNceiVY9MzOqIwGL1E6g==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1402.11", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.15.0 || >=16.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": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.11.tgz", - "integrity": "sha512-cBIGs6y9rykOQqnuAQOB1DgIRyBFYtvKRJb7QNUfIJ0qUfARKkuV/yikv3lrb95ePGkmoRzmjkFqcFZiYU+r7A==", - "dev": true, - "dependencies": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.15.0 || >=16.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": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.11.tgz", - "integrity": "sha512-OTEOu4uf3kZDcSGYkuESxf/IOlJSn/GdLt63Sd1QwJu6pJSeFxkANw/WEWICZyJfRLNW6fdLJLEGPM9Zt5ZqAg==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "14.2.11", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "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": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.3.0.tgz", - "integrity": "sha512-QoBcIKy1ZiU+4qJsAh5Ls20BupWiXiZzKb0s6L9/dntPt5Msr4Ao289XR2P6O1L+kTsCprH9Kt41zyGQ/bkRqg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/core": "14.3.0" - } - }, - "node_modules/@angular/cdk": { - "version": "13.3.9", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.9.tgz", - "integrity": "sha512-XCuCbeuxWFyo3EYrgEYx7eHzwl76vaWcxtWXl00ka8d+WAOtMQ6Tf1D98ybYT5uwF9889fFpXAPw98mVnlo3MA==", - "dependencies": { - "tslib": "^2.3.0" - }, - "optionalDependencies": { - "parse5": "^5.0.0" - }, - "peerDependencies": { - "@angular/common": "^13.0.0 || ^14.0.0-0", - "@angular/core": "^13.0.0 || ^14.0.0-0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/cli": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.11.tgz", - "integrity": "sha512-k4Epob8Xz+9oyC6Ty9SNntTa2wHAvzxfcCi7itefPMcwEU9pqBcAv4XYfyawb5d7n/S5RBNwdsDpjoh2DPtmow==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1402.11", - "@angular-devkit/core": "14.2.11", - "@angular-devkit/schematics": "14.2.11", - "@schematics/angular": "14.2.11", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", - "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", - "ora": "5.4.1", - "pacote": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", - "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/common": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz", - "integrity": "sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/core": "14.3.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/compiler": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.3.0.tgz", - "integrity": "sha512-E15Rh0t3vA+bctbKnBCaDmLvc3ix+ZBt6yFZmhZalReQ+KpOlvOJv+L9oiFEgg+rYVl2QdvN7US1fvT0PqswLw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/core": "14.3.0" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } - } - }, - "node_modules/@angular/compiler-cli": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz", - "integrity": "sha512-eoKpKdQ2X6axMgzcPUMZVYl3bIlTMzMeTo5V29No4BzgiUB+QoOTYGNJZkGRyqTNpwD9uSBJvmT2vG9+eC4ghQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.17.2", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", - "reflect-metadata": "^0.1.2", - "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", - "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.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/compiler": "14.3.0", - "typescript": ">=4.6.2 <4.9" - } - }, - "node_modules/@angular/core": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz", - "integrity": "sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4 || ~0.12.0" - } - }, - "node_modules/@angular/forms": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.3.0.tgz", - "integrity": "sha512-fBZZC2UFMom2AZPjGQzROPXFWO6kvCsPDKctjJwClVC8PuMrkm+RRyiYRdBbt2qxWHEqOZM2OCQo73xUyZOYHw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/common": "14.3.0", - "@angular/core": "14.3.0", - "@angular/platform-browser": "14.3.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/language-service": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.3.0.tgz", - "integrity": "sha512-Sij3OQzj1UGs1O8H9PxVAY/o27+oqZwQRnib66rsWvtbIBTjHp4FV3dTs5iVcr62GGv4V4Mff/2I82NP10GPQg==", - "dev": true, - "engines": { - "node": "^14.15.0 || >=16.10.0" - } - }, - "node_modules/@angular/localize": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-14.3.0.tgz", - "integrity": "sha512-YmwlOEGnFonfDrIcWqlxXVFFjd0Q6yXeHGZCBFBfwbtjIseiJJ4UBmkTUgFeq7qlWevSFQzHdQnraFRGZpnMig==", - "dependencies": { - "@babel/core": "7.18.9", - "glob": "8.0.3", - "yargs": "^17.2.1" - }, - "bin": { - "localize-extract": "tools/bundles/src/extract/cli.js", - "localize-migrate": "tools/bundles/src/migrate/cli.js", - "localize-translate": "tools/bundles/src/translate/cli.js" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/compiler": "14.3.0", - "@angular/compiler-cli": "14.3.0" - } - }, - "node_modules/@angular/localize/node_modules/@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "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/@angular/localize/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/material": { - "version": "13.3.9", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.9.tgz", - "integrity": "sha512-FU8lcMgo+AL8ckd27B4V097ZPoIZNRHiCe3wpgkImT1qC0YwcyXZVn0MqQTTFSdC9a/aI8wPm3AbTClJEVw5Vw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/animations": "^13.0.0 || ^14.0.0-0", - "@angular/cdk": "13.3.9", - "@angular/common": "^13.0.0 || ^14.0.0-0", - "@angular/core": "^13.0.0 || ^14.0.0-0", - "@angular/forms": "^13.0.0 || ^14.0.0-0", - "@angular/platform-browser": "^13.0.0 || ^14.0.0-0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.3.0.tgz", - "integrity": "sha512-w9Y3740UmTz44T0Egvc+4QV9sEbO61L+aRHbpkLTJdlEGzHByZvxJmJyBYmdqeyTPwc/Zpy7c02frlpfAlyB7A==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/animations": "14.3.0", - "@angular/common": "14.3.0", - "@angular/core": "14.3.0" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.3.0.tgz", - "integrity": "sha512-rneZiMrIiYRhrkQvdL40E2ErKRn4Zdo6EtjBM9pAmWeyoM8oMnOZb9gz5vhrkNWg06kVMVg0yKqluP5How7j3A==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/common": "14.3.0", - "@angular/compiler": "14.3.0", - "@angular/core": "14.3.0", - "@angular/platform-browser": "14.3.0" - } - }, - "node_modules/@angular/router": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.3.0.tgz", - "integrity": "sha512-uip0V7w7k7xyxxpTPbr7EuMnYLj3FzJrwkLVJSEw3TMMGHt5VU5t4BBa9veGZOta2C205XFrTAHnp8mD+XYY1w==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0" - }, - "peerDependencies": { - "@angular/common": "14.3.0", - "@angular/core": "14.3.0", - "@angular/platform-browser": "14.3.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, - "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "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", - "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/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "dependencies": { - "@babel/types": "^7.18.10", - "@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.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "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.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", - "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "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", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz", - "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/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-create-regexp-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", - "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/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-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.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", - "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", - "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", - "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", - "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.22.5", - "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.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@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.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@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.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "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.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@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.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "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.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", - "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz", - "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", - "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz", - "integrity": "sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", - "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "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.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "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.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", - "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@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.18.10", - "@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.18.9", - "@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.18.6", - "@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.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@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.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@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.18.9", - "@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.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.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.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", - "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "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/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "dev": true, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@cypress/request": { - "version": "2.88.11", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz", - "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", - "dev": true, - "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", - "http-signature": "~1.3.6", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "~6.10.3", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/request/node_modules/qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - } - }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "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/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "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/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "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", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "dev": true, - "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.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "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/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "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/@ng-bootstrap/ng-bootstrap": { - "version": "12.1.2", - "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-12.1.2.tgz", - "integrity": "sha512-p27c+mYVdHiJMYrj5hwClVJxLdiZxafAqlbw1sdJh2xJ1rGOe+H/kCf5YDRbhlHqRN+34Gr0RQqIUeD1I2V8hg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": "^13.0.0", - "@angular/core": "^13.0.0", - "@angular/forms": "^13.0.0", - "@angular/localize": "^13.0.0", - "@popperjs/core": "^2.10.2", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@ngtools/webpack": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.11.tgz", - "integrity": "sha512-4enbLFAp98uTgWYF6OFceQqLcfv2/0brIrNN4iWT9xe/Mh3zdCt+eH42zvNRsqo9WXNWRSLvnx8I924p83LNlw==", - "dev": true, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "typescript": ">=4.6.2 <4.9", - "webpack": "^5.54.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/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/@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "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": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", - "dev": true, - "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@schematics/angular": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.11.tgz", - "integrity": "sha512-tejU2BOc25bQO34mZmTwmtAfOiFtDE/io/yHqYgUsTn804kyMQbz2QOOXN0epdzRYrkAHvH4KV8c2LDyO6iijA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "14.2.11", - "@angular-devkit/schematics": "14.2.11", - "jsonc-parser": "3.1.0" - }, - "engines": { - "node": "^14.15.0 || >=16.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", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "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/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "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.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-5.3.1.tgz", - "integrity": "sha512-F6itHi2DxdatHil1rJ2yEFUNhejj8+0Acd55LZ6Ggwbdoks0+DxVY2cawNj16sjCBiWvubVlh6eBMVsYRNGLew==" - }, - "node_modules/@types/eslint": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.2.tgz", - "integrity": "sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "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.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/jasmine": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.4.tgz", - "integrity": "sha512-DsJbnxCdjmhRP7dXwjD6JcPc+z7V/4mG3VA1cEFec/+R343TaNPnZ9eJzMkjR4T1BYkjkDIUsPDybkDC0qLrvA==", - "dev": true - }, - "node_modules/@types/jasminewd2": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", - "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", - "dev": true, - "dependencies": { - "@types/jasmine": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "dev": true - }, - "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/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/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, - "node_modules/@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", - "dev": true - }, - "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.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/a-color-picker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/a-color-picker/-/a-color-picker-1.2.1.tgz", - "integrity": "sha512-aMCUKd2zTDWK2YWnjz0k3YhFc9XL0jZlPIywF6XkP6i3wdq2iHTEnl1BFPZkOVDV89M12t+zeZ8m23cfzn57/Q==", - "dependencies": { - "is-plain-object": "^2.0.4" - } - }, - "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", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/affine-complement": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/affine-complement/-/affine-complement-1.0.0.tgz", - "integrity": "sha512-NYA6ukh+coBTIjLV9q3MJEctRvOgmKP7JyDO2wwBk6D4qV7Fdz5gBvUYdWM8ZxeNc/L/SwtDnSMZFSnVnwCkRg==", - "dependencies": { - "robust-orientation": "^1.1.3" - } - }, - "node_modules/affine-hull": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/affine-hull/-/affine-hull-1.0.0.tgz", - "integrity": "sha512-3QNG6+vFAwJvSZHsJYDJ/mt1Cxx9n5ffA+1Ohmj7udw0JuRgUVIXK0P9N9pCMuEdS3jCNt8GFX5q2fChq+GO3Q==", - "dependencies": { - "robust-orientation": "^1.1.3" - } - }, - "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.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "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": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/angular2-draggable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/angular2-draggable/-/angular2-draggable-2.3.2.tgz", - "integrity": "sha512-rw2O/icgVang8uSVIU7nmm59f1DceSAUQkOuSGYnKbv/h8EbhJ9099sCjh/I5LymZBza1XPKeFZofIvhekdE+A==", - "dependencies": { - "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": "^6.0.0-rc.0 || >=6.0.0", - "@angular/core": "^6.0.0-rc.0 || >=6.0.0" - } - }, - "node_modules/angular2-draggable/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/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", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-root-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", - "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", - "dev": true, - "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/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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/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/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==", - "dev": true, - "dependencies": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "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==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "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/avsdf-base": { - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/avsdf-base.git#01d4dd91a5cf1c72ee633663c15be7c0b4d8d043", - "license": "MIT", - "dependencies": { - "layout-base": "https://github.com/iVis-at-Bilkent/layout-base#unstable" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "dependencies": { - "ast-types-flow": "0.0.7" - } - }, - "node_modules/babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "dev": true, - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^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.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" - }, - "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/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bit-twiddle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==" - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "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/bonjour-service/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/bootstrap": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.0.tgz", - "integrity": "sha512-UnBV3E3v4STVNQdms6jSGO2CvOkjUMdDAVR2V5N4uCMdaIkaQjbcEAMqRimDHIs4uqBYzDAKCQwCB+97tJgHQw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.7" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", - "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": "^1.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "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", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001507", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz", - "integrity": "sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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/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", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "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", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "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==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/codelyzer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", - "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==", - "dev": true, - "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", - "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/codelyzer/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/codelyzer/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/codelyzer/node_modules/zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "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.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "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==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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==", - "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==", - "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==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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==", - "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==", - "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", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/convex-hull": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/convex-hull/-/convex-hull-1.0.3.tgz", - "integrity": "sha512-24rZAoh81t41GHPLAxcsokgjH9XNoVqU2OiSi8iMHUn6HUURfiefcEWAPt1AfwZjBBWTKadOm1xUcUMnfFukhQ==", - "dependencies": { - "affine-hull": "^1.0.0", - "incremental-convex-hull": "^1.0.1", - "monotone-convex-hull-2d": "^1.0.1" - } - }, - "node_modules/convex-minkowski-sum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/convex-minkowski-sum/-/convex-minkowski-sum-1.0.0.tgz", - "integrity": "sha512-U8ht0Kv99vWT1+EgOWEBIow/CrxI/USBhHuFANzpaJ94mtFgKJlzOqe+q1O/tFx1W7gw9NpC6CUfGi2vKSXHvw==", - "dependencies": { - "full-convex-hull": "^1.0.0", - "uniq": "^1.0.1" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "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==" - }, - "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/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/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/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/core-js-compat": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", - "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/cose-base/node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" - }, - "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/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", - "dev": true, - "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", - "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/critters/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/critters/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/critters/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/critters/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/critters/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/critters/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/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/css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "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.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==", - "dev": true, - "dependencies": { - "through": "X.X.X" - } - }, - "node_modules/cssdb": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz", - "integrity": "sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ] - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "node_modules/cypress": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz", - "integrity": "sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@cypress/request": "^2.88.10", - "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.6.0", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", - "commander": "^5.1.0", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "eventemitter2": "6.4.7", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.0", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.6", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "semver": "^7.3.2", - "supports-color": "^8.1.1", - "tmp": "~0.2.1", - "untildify": "^4.0.0", - "yauzl": "^2.10.0" - }, - "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cypress-file-upload": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", - "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", - "dev": true, - "engines": { - "node": ">=8.2.1" - }, - "peerDependencies": { - "cypress": ">3.0.0" - } - }, - "node_modules/cypress/node_modules/@types/node": { - "version": "14.18.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.51.tgz", - "integrity": "sha512-P9bsdGFPpVtofEKlhWMVS2qqx1A/rt9QBfihWlklfHHpUpjtYse5AzFz6j4DWrARLYh6gRnw9+5+DJcrq3KvBA==", - "dev": true - }, - "node_modules/cypress/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/cypress/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/cypress/node_modules/chalk/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/cypress/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/cypress/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/cypress/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cypress/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/cypress/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/cytoscape": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", - "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", - "dependencies": { - "heap": "^0.2.6", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cise": { - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/cytoscape.js-cise.git#4377591288467fdbac582e493f032a60d58d3e50", - "license": "MIT", - "dependencies": { - "avsdf-base": "https://github.com/iVis-at-Bilkent/avsdf-base#unstable", - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-context-menus": { - "version": "3.1.0", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/cytoscape.js-context-menus.git#81d5d173edacb59528c82fb9245bc03d058b2bdd", - "license": "MIT", - "peerDependencies": { - "cytoscape": "^2.7.0 || ^3.0.0" - } - }, - "node_modules/cytoscape-expand-collapse": { - "version": "3.2.1", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/cytoscape.js-expand-collapse.git#2158ae449f4c15be20b627fa982d152e545b2b12", - "license": "MIT", - "peerDependencies": { - "cytoscape": "^3.3.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.1.0", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/cytoscape.js-fcose.git#7c4abeec39d04fe470005d70f38c2f23fc2c4e9a", - "license": "MIT", - "dependencies": { - "cose-base": "https://github.com/iVis-at-Bilkent/cose-base#unstable" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.1.0", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/cose-base.git#65f2bb3307e1f2c264adce5befe0c04068acbe91", - "license": "MIT", - "dependencies": { - "layout-base": "git+https://github.com/iVis-at-Bilkent/layout-base.git#unstable" - } - }, - "node_modules/cytoscape-layout-utilities": { - "version": "1.0.2", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/cytoscape.js-layout-utilities.git#6ffb5f5661a2074aa352c6be5bb14fecaf1b1149", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/d3-delaunay": "^5.3.0", - "ajv": "^8.6.2", - "convex-minkowski-sum": "^1.0.0", - "d3-delaunay": "^5.3.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-navigator": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cytoscape-navigator/-/cytoscape-navigator-2.0.2.tgz", - "integrity": "sha512-TZFBLFWEMW858UOt4rzusOjtDj7YT5vNx2uCwpUuicUYbaWCHHcUROBZWO+hiuSPWpVhvGLFlOq3NBcAVYOAgw==", - "peerDependencies": { - "cytoscape": "^2.6.0 || ^3.0.0" - } - }, - "node_modules/cytoscape-panzoom": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/cytoscape-panzoom/-/cytoscape-panzoom-2.5.3.tgz", - "integrity": "sha512-//qLOqbbFUCGddarNKHDZArItOJHgnkQ1TvxI9nV2/8aOOl/5wuEOHmra3fL/aWSjB4AYpYTG4LX7w96uWfRTQ==", - "dependencies": { - "jquery": "^1.4 || ^2.0 || ^3.0" - }, - "peerDependencies": { - "cytoscape": "^2.0.0 || ^3.0.0" - } - }, - "node_modules/cytoscape-view-utilities": { - "version": "4.1.0", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/cytoscape.js-view-utilities.git#8ccab971d1e0e15d75fac532467f15a51ed03b51", - "license": "MIT", - "dependencies": { - "geometric": "^2.2.3" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/d3-delaunay": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", - "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", - "dependencies": { - "delaunator": "4" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/dayjs": { - "version": "1.11.8", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", - "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "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/default-gateway/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/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/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/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "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/delaunator": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "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", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/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.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "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/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.440", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", - "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "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/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.0.tgz", - "integrity": "sha512-UlfoK1iD62Hkedw2TmuHdhDsZCGaAyp+LZ/AvnImjYBeWagA3qIEETum90d6shMeFZiDuGT66zVCdx1wKYKGGg==", - "dev": true, - "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.1.0", - "ws": "~8.11.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", - "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "node_modules/eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "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/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "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/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "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/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==", - "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/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/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/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.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", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "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/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.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/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "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/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatpickr": { - "version": "4.6.13", - "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", - "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "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==", - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.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/full-convex-hull": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/full-convex-hull/-/full-convex-hull-1.0.0.tgz", - "integrity": "sha512-hLd/nsHAxjlIXpfKUBDAZ+o2HVtcFSNOUgNrtqcevhvtlY/H2DZZ1FXDrVUFNbqpaXG1uBOxbmkpXhsbdOdOUg==", - "dependencies": { - "affine-complement": "^1.0.0", - "affine-hull": "^1.0.0", - "convex-hull": "^1.0.3", - "simplicial-complex": "^1.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/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", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/geometric": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/geometric/-/geometric-2.5.4.tgz", - "integrity": "sha512-6MQ0id8tzpYJ0abWrKX6xI1sQAj8TfAkKSVqo1gLQU6b3oSJcFF8r32Ji+t0efGdYDyY5E3ZgkjAdU6qdxDTyQ==" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "dependencies": { - "async": "^3.2.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "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/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.0.tgz", - "integrity": "sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==", - "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.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "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", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" - }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "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/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.6.tgz", - "integrity": "sha512-9o0+dcpIw2/HxkNuYKxSJUF/MMRZQECK4GnF+oQOmJ83yCVHTWgCH5aOXxK5bozNRmM8wtgryjHD3uloPBDEGw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "dependencies": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz", - "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g==" - }, - "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", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "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-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", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "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.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", - "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" - }, - "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": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "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": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "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/incremental-convex-hull": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz", - "integrity": "sha512-mKRJDXtzo1R9LxCuB1TdwZXHaPaIEldoGPsXy2jrJc/kufyqp8y/VAQQxThSxM2aroLoh6uObexPk1ASJ7FB7Q==", - "dependencies": { - "robust-orientation": "^1.1.2", - "simplicial-complex": "^1.0.0" - } - }, - "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", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", - "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": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "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", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/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/istanbul-lib-report/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/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "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/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/istanbul-lib-source-maps/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jasmine-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.2.0.tgz", - "integrity": "sha512-OcFpBrIhnbmb9wfI8cqPSJ50pv3Wg4/NSgoZIqHzIwO/2a9qivJWzv8hUvaREIMYYJBas6AvfXATFdVuzzCqVw==", - "dev": true - }, - "node_modules/jasmine-spec-reporter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", - "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", - "dev": true, - "dependencies": { - "colors": "1.4.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/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/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jquery": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", - "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "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", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "node_modules/karma": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", - "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", - "dev": true, - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.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", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", - "dev": true, - "dependencies": { - "which": "^1.2.1" - } - }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "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-coverage-istanbul-reporter/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-jasmine": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.0.1.tgz", - "integrity": "sha512-FkL1Kk+JAKmim8VWU8RXKZBpl0lLI7J8LijM0/q7oP7emfB6QMZV1Az+JgqGKSLpF0tYaav+KUVFQroZUxQTHA==", - "dev": true, - "dependencies": { - "jasmine-core": "^4.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "karma": "^6.0.0" - } - }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", - "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true, - "peerDependencies": { - "jasmine-core": "^4.0.0 || ^5.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" - } - }, - "node_modules/karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "dependencies": { - "source-map-support": "^0.5.5" - } - }, - "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/karma/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/karma/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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/layout-base": { - "version": "2.0.0", - "resolved": "git+ssh://git@github.com/iVis-at-Bilkent/layout-base.git#54d92ef6c8584c205cac1b0ebe3feb8371dcd1cb", - "license": "MIT" - }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "engines": { - "node": "> 0.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.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", - "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", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "dependencies": { - "webpack-sources": "^3.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "3.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", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/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/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/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/log-update/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/log-update/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/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", - "dev": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "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": "^5.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/make-fetch-happen/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/make-fetch-happen/node_modules/cacache": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", - "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "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/make-fetch-happen/node_modules/fs-minipass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", - "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.0.tgz", - "integrity": "sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/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/make-fetch-happen/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/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "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==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "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", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", - "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/mini-css-extract-plugin/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/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "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": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "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": { - "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-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.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/minipass-fetch/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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-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-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-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/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/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/monotone-convex-hull-2d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz", - "integrity": "sha512-ixQ3qdXTVHvR7eAoOjKY8kGxl9YjOFtzi7qOjwmFFPfBqZHVOjUFOBy/Dk9dusamRSPJe9ggyfSypRbs0Bl8BA==", - "dependencies": { - "robust-orientation": "^1.1.3" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mute-stream": { - "version": "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.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/needle": { - "version": "3.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", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/ngx-autosize-input": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/ngx-autosize-input/-/ngx-autosize-input-13.1.1.tgz", - "integrity": "sha512-GgOfafcmQryqDhqPJ8hRJwnbY8CybrbiKfPyf5NDGBY+gZxKHi8L3fdphgpBZVs7LGKu9CkyCV+DTOgXD6ByfQ==", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": "^13.3.11", - "@angular/core": "^13.3.11" - } - }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "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", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.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", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "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/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" - }, - "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": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", - "dev": true, - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-packlist/node_modules/npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", - "dev": true, - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-registry-fetch/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/npm-registry-fetch/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/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", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "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/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-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/ora/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/ora/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/ora/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/ora/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/ora/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/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", - "dev": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "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": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "optional": true - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" - } - }, - "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-sax-parser/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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==" - }, - "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/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", - "dev": true, - "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/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "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-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" - }, - "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-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.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.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "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-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "dev": true, - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "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/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "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/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==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true - }, - "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", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "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/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "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/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", - "dev": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/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.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "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", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "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-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.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", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/robust-orientation": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/robust-orientation/-/robust-orientation-1.2.1.tgz", - "integrity": "sha512-FuTptgKwY6iNuU15nrIJDLjXzCChWB+T4AvksRtwPS/WZ3HuP1CElCm1t+OBfgQKfWbtZIawip+61k7+buRKAg==", - "dependencies": { - "robust-scale": "^1.0.2", - "robust-subtract": "^1.0.0", - "robust-sum": "^1.0.0", - "two-product": "^1.0.2" - } - }, - "node_modules/robust-scale": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/robust-scale/-/robust-scale-1.0.2.tgz", - "integrity": "sha512-jBR91a/vomMAzazwpsPTPeuTPPmWBacwA+WYGNKcRGSh6xweuQ2ZbjRZ4v792/bZOhRKXRiQH0F48AvuajY0tQ==", - "dependencies": { - "two-product": "^1.0.2", - "two-sum": "^1.0.0" - } - }, - "node_modules/robust-subtract": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/robust-subtract/-/robust-subtract-1.0.0.tgz", - "integrity": "sha512-xhKUno+Rl+trmxAIVwjQMiVdpF5llxytozXJOdoT4eTIqmqsndQqFb1A0oiW3sZGlhMRhOi6pAD4MF1YYW6o/A==" - }, - "node_modules/robust-sum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz", - "integrity": "sha512-AvLExwpaqUqD1uwLU6MwzzfRdaI6VEZsyvQ3IAQ0ZJ08v1H+DTyqskrf2ZJyh0BDduFVLN7H04Zmc+qTiahhAw==" - }, - "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.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", - "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.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", - "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", - "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/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.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.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng==", - "dev": true, - "dependencies": { - "semver": "^5.3.0" - } - }, - "node_modules/semver-dsl/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/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/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "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==", - "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==" - }, - "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==", - "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==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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==", - "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", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "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", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "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", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simplicial-complex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-1.0.0.tgz", - "integrity": "sha512-mHauIKSOy3GquM5VnYEiu7eP5y4A8BiaN9ezUUgyYFz1k68PqDYcyaH3kenp2cyvWZE96QKE3nrxYw65Allqiw==", - "dependencies": { - "bit-twiddle": "^1.0.0", - "union-find": "^1.0.0" - } - }, - "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/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi/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/slice-ansi/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/slice-ansi/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/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.7.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.0.tgz", - "integrity": "sha512-eOpu7oCNiPGBHn9Falg0cAGivp6TpDI3Yt596fbsf+vln8kRLFWxXKrecFrybn/xNYVn9HcdJNAkYToCmTjsyg==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dev": true, - "dependencies": { - "ws": "~8.11.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/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-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", - "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-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "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.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "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/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "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": "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/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/streamroller/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/streamroller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/streamroller/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/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/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", - "dev": true, - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "bin": { - "stylus": "bin/stylus" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://opencollective.com/stylus" - } - }, - "node_modules/stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "stylus": ">=0.52.4", - "webpack": "^5.0.0" - } - }, - "node_modules/stylus/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/stylus/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/stylus/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "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/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "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.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "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", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", - "integrity": "sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "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/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "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/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/tslint/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/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/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/two-product": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/two-product/-/two-product-1.0.2.tgz", - "integrity": "sha512-vOyrqmeYvzjToVM08iU52OFocWT6eB/I5LUWYnxeAPGXAhAxXYU/Yr/R2uY5/5n4bvJQL9AQulIuxpIsMoT8XQ==" - }, - "node_modules/two-sum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/two-sum/-/two-sum-1.0.0.tgz", - "integrity": "sha512-phP48e8AawgsNUjEY2WvoIWqdie8PoiDZGxTDv70LDr01uX5wLEQbOgSP7Z/B6+SW5oLtbe8qaYX2fKJs3CGTw==" - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "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/union-find": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/union-find/-/union-find-1.0.2.tgz", - "integrity": "sha512-wFA9bMD/40k7ZcpKVXfu6X1qD3ri5ryO8HUsuA1RnxPCQl66Mu6DgkxyR+XNnd+osD0aLENixcJVFj+uf+O4gw==" - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==" - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "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/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", - "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": "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-dev-middleware/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/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", - "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.0.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/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/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", - "dev": true, - "dependencies": { - "typed-assert": "^1.0.8" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", - "webpack": "^5.12.0" - }, - "peerDependenciesMeta": { - "html-webpack-plugin": { - "optional": true - } - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "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/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.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "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.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "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==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/zone.js": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", - "dependencies": { - "tslib": "^2.3.0" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 5c24273c..00000000 --- a/package.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "name": "ng-visuall", - "version": "1.0.0", - "description": "Customizable graph visualization tool", - "scripts": { - "ng": "ng", - "start": "node server.js", - "start-logs": "node file-server.js", - "build": "ng build && node time-stamper.js", - "test": "ng test", - "lint": "ng lint", - "webdriver-update": "webdriver-manager update", - "heroku-postbuild": "ng build --configuration=heroku && node time-stamper.js", - "prod": "ng build --configuration production && node server.js", - "serve-public": "ng serve --host 0.0.0.0", - "build-prod": "ng build --configuration production && node time-stamper.js", - "cy": "cypress open", - "e2e": "cypress run --config-file cypress.config.ts > e2e-results.txt" - }, - "private": true, - "dependencies": { - "@angular/animations": "^14.0.1", - "@angular/cdk": "^13.0.0", - "@angular/common": "^14.0.1", - "@angular/compiler": "^14.0.1", - "@angular/core": "^14.0.1", - "@angular/forms": "^14.0.1", - "@angular/localize": "^14.0.1", - "@angular/material": "^13.0.0", - "@angular/platform-browser": "^14.0.1", - "@angular/platform-browser-dynamic": "^14.0.1", - "@angular/router": "^14.0.1", - "@ng-bootstrap/ng-bootstrap": "^12.1.2", - "@popperjs/core": "^2.11.5", - "a-color-picker": "^1.2.1", - "angular2-draggable": "^2.3.2", - "body-parser": "^1.20.0", - "bootstrap": "^5.1.3", - "compression": "^1.7.4", - "cytoscape": "^3.21.1", - "cytoscape-cise": "github:iVis-at-Bilkent/cytoscape.js-cise#develop", - "cytoscape-context-menus": "github:iVis-at-Bilkent/cytoscape.js-context-menus#unstable", - "cytoscape-expand-collapse": "github:iVis-at-Bilkent/cytoscape.js-expand-collapse#unstable", - "cytoscape-fcose": "github:iVis-at-Bilkent/cytoscape.js-fcose#unstable", - "cytoscape-layout-utilities": "github:iVis-at-Bilkent/cytoscape.js-layout-utilities#unstable", - "cytoscape-navigator": "^2.0.1", - "cytoscape-panzoom": "^2.5.3", - "cytoscape-view-utilities": "github:iVis-at-Bilkent/cytoscape.js-view-utilities#unstable", - "express": "^4.18.1", - "flatpickr": "^4.6.13", - "html2canvas": "^1.4.1", - "http": "0.0.1-security", - "https": "^1.0.0", - "jquery": "^3.6.0", - "ngx-autosize-input": "^13.1.0", - "path": "^0.12.7", - "rxjs": "^7.5.5", - "tinycolor2": "^1.6.0", - "tslib": "^2.5.0", - "zone.js": "~0.11.5" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^14.0.1", - "@angular/cli": "^14.0.1", - "@angular/compiler-cli": "^14.0.1", - "@angular/language-service": "^14.0.1", - "@types/jasmine": "^4.0.3", - "@types/jasminewd2": "~2.0.10", - "@types/node": "^17.0.42", - "codelyzer": "^6.0.2", - "css": "^3.0.0", - "cypress": "^10.1.0", - "cypress-file-upload": "^5.0.8", - "enhanced-resolve": "^5.9.3", - "jasmine-core": "~4.2.0", - "jasmine-spec-reporter": "~7.0.0", - "karma": "^6.3.20", - "karma-chrome-launcher": "~3.1.1", - "karma-coverage-istanbul-reporter": "^3.0.3", - "karma-jasmine": "~5.0.1", - "karma-jasmine-html-reporter": "^2.0.0", - "ts-node": "^10.8.1", - "tslint": "^6.1.3", - "typescript": "~4.7.3" - }, - "browserslist": [ - "> 0.5%", - "last 2 versions", - "Firefox ESR", - "not dead", - "not IE 9-11" - ], - "author": "i-Vis Research Lab", - "license": "iVis", - "bugs": { - "url": "https://github.com/ahmetcandiroglu/visuall/issues" - }, - "engines": { - "node": "14.x", - "npm": "6.x" - }, - "homepage": "https://github.com/ivis-at-bilkent/visuall#readme" -} \ No newline at end of file diff --git a/docs/quato_type.html b/quato_type.html similarity index 100% rename from docs/quato_type.html rename to quato_type.html diff --git a/runner.sh b/runner.sh deleted file mode 100755 index 2e5eec1a..00000000 --- a/runner.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash -PATH=/usr/bin:/bin:/home/ivis/.nvm/versions/node/v14.19.3/bin -echo "starting runner $(date)" >> bash-script.log -npm i >> bash-script.log -npm run ng build >> bash-script.log -sudo "$(which node)" server.js >> bash-script.log -echo "runner ended $(date)" >> bash-script.log \ No newline at end of file diff --git a/runner.sh.save b/runner.sh.save deleted file mode 100755 index 75228463..00000000 --- a/runner.sh.save +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -PATH=/usr/bin:/bin:/home/ivis/.nvm/versions/node/v14.19.3/bin -echo "starting runner $(date)" >> bash-script.log - -npm i >> bash-script.log -npm run ng build >> bash-script.log -npm run server.js >> bash-script.log - -echo "runner ended $(date)" >> bash-script.log diff --git a/server.js b/server.js deleted file mode 100644 index 4a05a291..00000000 --- a/server.js +++ /dev/null @@ -1,74 +0,0 @@ -//Install express server -const express = require('express'); -const http = require('http'); -const bodyParser = require('body-parser'); -const cors = require('cors'); -const path = require('path'); -const https = require('https'); -const compression = require('compression'); -const app = express(); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: true })); -app.use(bodyParser.text({ type: 'text/*' })) -app.use(compression()); -const fs = require('fs'); -const { createProxyMiddleware } = require('http-proxy-middleware'); -const appPath = '/dist/ng-visuall'; -app.use(express.static(__dirname + appPath)); - - -app.get('/urlquery/*', function (req, res) { - let reqURL = req.url.substr(10); - const data = []; - if (reqURL.substr(0, 5).toLowerCase() != "https" && reqURL.substr(0, 4).toLowerCase() == "http") { - let request = http.request(reqURL, function (response, body) { - response.on('data', function (chunk) { - data.push(chunk); - }); - response.on('end', function () { - let result = JSON.parse(data.join('')) - res.send(result); - - }); - }); - request.on('error', function (e) { - console.log(e.message); - }); - request.end(); - } - else { - if (reqURL.substr(0, 4).toLowerCase() != "http") { - reqURL = "https://" + reqURL; - } - let request = https.request(reqURL, function (response, body) { - response.on('data', function (chunk) { - data.push(chunk); - }); - response.on('end', function () { - try { - const result = JSON.parse(data.join('')) - res.send(result); - } catch (e) { - res.send('{}'); - } - - }); - }); - request.on('error', function (e) { - console.log(e.message); - }); - request.end(); - } -}); - -app.get('/e2e', function (req, res) { - res.sendFile(path.join(__dirname + '/e2e-results.txt')); -}); - -app.get('/*', function (req, res) { - res.sendFile(path.join(__dirname + appPath + '/index.html')); -}); -const port = process.env.PORT || 4400; -app.listen(port); -// Start the app by listening on the default port -console.log('server listening port: ', port); diff --git a/docs/session1.html b/session1.html similarity index 100% rename from docs/session1.html rename to session1.html diff --git a/docs/session2.html b/session2.html similarity index 100% rename from docs/session2.html rename to session2.html diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index 2d0453d4..00000000 Binary files a/src/.DS_Store and /dev/null differ diff --git a/src/app/.DS_Store b/src/app/.DS_Store deleted file mode 100644 index e50e5974..00000000 Binary files a/src/app/.DS_Store and /dev/null differ diff --git a/src/app/custom/.DS_Store b/src/app/custom/.DS_Store deleted file mode 100644 index 7738ffb5..00000000 Binary files a/src/app/custom/.DS_Store and /dev/null differ diff --git a/src/app/custom/analyses/anomalies/.DS_Store b/src/app/custom/analyses/anomalies/.DS_Store deleted file mode 100644 index 7fa98ebc..00000000 Binary files a/src/app/custom/analyses/anomalies/.DS_Store and /dev/null differ diff --git a/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.css b/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.css deleted file mode 100644 index 173d6809..00000000 --- a/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.css +++ /dev/null @@ -1,3 +0,0 @@ -#genreSelector { - width: 40px; -} diff --git a/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.html b/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.html deleted file mode 100644 index e1446f6b..00000000 --- a/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.html +++ /dev/null @@ -1,36 +0,0 @@ -
-
-
- Min anomaly count - -
-
-
-
- -
- - -
-
- - - -
-
- - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.ts b/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.ts deleted file mode 100644 index 9fa47614..00000000 --- a/src/app/custom/analyses/anomalies/anomaly-statistic/anomaly-statistic.component.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - issue: string; - anomalies: string; -} -@Component({ - selector: 'app-anomaly-statistic', - templateUrl: './anomaly-statistic.component.html', - styleUrls: ['./anomaly-statistic.component.css'] -}) -export class AnomalyStatisticComponent implements OnInit, QueryComponent { - tableInput: TableViewInput = { - columns: ['issue','anomalies'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - count: number; - issueList:string[] = []; - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - this.count = 1 - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - //Anomaly Detection Queries - - - - - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'id', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql = `MATCH (n : Issue) WHERE n.anomalyCount >= ${this.count} and ${dateFilter} - RETURN distinct elementId(n) as id , n.name as issue, n.anomalyList as anomalies ORDER BY ${orderExpr}`; - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - - - - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get anomaly statistics`); }; - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter =this._h.getDateRangeCQL(); - const cql = `MATCH (n : Issue)-[r]-(d:Developer) - WHERE n.anomalyCount >= ${this.count} and ${dateFilter} - RETURN n,r,d` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - else if (nodeIdDict[x.edges[i].startNodeElementId]) { - nodeIdDict[x.edges[i].endNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - if(data[i][uiColumns[j]].length == 0){ - row.push({ type: TableDataType.string, val: "None"}) - }else{ - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get anomaly statistics (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - const cql = `MATCH (n:Issue)-[r]-(d:Developer) WHERE ${idFilter} return n,d,r` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - - -} \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/anomaly/anomaly.component.css b/src/app/custom/analyses/anomalies/anomaly/anomaly.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/custom/analyses/anomalies/anomaly/anomaly.component.html b/src/app/custom/analyses/anomalies/anomaly/anomaly.component.html deleted file mode 100644 index 37c2c042..00000000 --- a/src/app/custom/analyses/anomalies/anomaly/anomaly.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
-
- -
-
-
-
- -
-
-
\ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/anomaly/anomaly.component.ts b/src/app/custom/analyses/anomalies/anomaly/anomaly.component.ts deleted file mode 100644 index 4d8d101f..00000000 --- a/src/app/custom/analyses/anomalies/anomaly/anomaly.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { CustomizationModule } from '../../../customization.module'; -import { UnassignedBugsComponent } from '../unassigned-bugs/unassigned-bugs.component'; -import { NoLinkToBugFixingCommitComponent } from '../no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component'; -import { IgnoredBugsComponent } from '../ignored-bugs/ignored-bugs.component'; -import { MissingPriorityComponent } from '../missing-priority/missing-priority.component'; -import { NotReferencedDuplicatesComponent } from '../not-referenced-duplicates/not-referenced-duplicates.component'; -import { MissingEnvironmentInformationComponent } from '../missing-environment-information/missing-environment-information.component'; -import { ReassignmentBugAssigneeComponent } from '../reassignment-bug-assignee/reassignment-bug-assignee.component'; -import { NoCommentBugsComponent } from '../no-comment-bugs/no-comment-bugs.component'; -import { NoAssigneeResolverBugComponent } from '../no-assignee-resolver-bug/no-assignee-resolver-bug.component'; -import { ClosedReopenPingPongComponent } from '../closed-reopen-ping-pong/closed-reopen-ping-pong.component'; -import { SameResolverCloserComponent } from '../same-resolver-closer/same-resolver-closer.component'; -@Component({ - selector: 'app-anomaly', - templateUrl: './anomaly.component.html', - styleUrls: ['./anomaly.component.css'] -}) -export class AnomalyComponent implements OnInit { - anomaly: string; - selectedIdx: number; - - anomalies: { component: any, text: string }[] = [ - { component: UnassignedBugsComponent, text: 'Unassigned Bugs' }, - { component: NoLinkToBugFixingCommitComponent, text: 'No Link to Bug-Fixing Commit' }, - { component: IgnoredBugsComponent, text: 'Ignored Bugs' }, - { component: MissingPriorityComponent, text: 'Missing Priority' }, - { component: NotReferencedDuplicatesComponent, text: 'Not referenced duplicates' }, - { component: MissingEnvironmentInformationComponent, text: 'Missing Environment Information' }, - { component: ReassignmentBugAssigneeComponent, text: 'Reassignment of Bug Assignee' }, - { component: NoCommentBugsComponent, text: 'No comment bugs' }, - { component: NoAssigneeResolverBugComponent, text: 'Non-Assignee Resolver of Bug' }, - { component: ClosedReopenPingPongComponent, text: 'Closed-Reopen Ping Pong' }, - { component: SameResolverCloserComponent, text: 'Same Resolver and Closer' }, - - ]; - - constructor() { - this.selectedIdx = -1; - } - changeAnomaly(event) { - this.selectedIdx = this.anomalies.findIndex(x => x.text == event.target.value); - } - ngOnInit(): void { - this.anomaly = ''; - } - -} diff --git a/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.css b/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.html b/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.ts b/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.ts deleted file mode 100644 index b6a03cdd..00000000 --- a/src/app/custom/analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component.ts +++ /dev/null @@ -1,229 +0,0 @@ - -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; - Assignee: string; - Resolver: string; - Count: string; -} -@Component({ - selector: 'app-closed-reopen-ping-pong', - templateUrl: './closed-reopen-ping-pong.component.html', - styleUrls: ['./closed-reopen-ping-pong.component.css'] -}) -export class ClosedReopenPingPongComponent implements OnInit, QueryComponent { - count:number; - tableInput: TableViewInput = { - columns: ['issue','assignee','resolver','count'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - this.count= this._g.userPrefs?.anomalyDefaultValues?.reopenCount.getValue() ||1; - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - this.count= this._g.userPrefs?.anomalyDefaultValues?.reopenCount.getValue() ||1; - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - } else { - this.fillTable(processedTableData, cnt); - } - if (!filter) { - this.tableResponse = processedTableData; - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql=` MATCH (n:Issue) - WHERE 'Closed reopen ping pong' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) - RETURN ElementId(n) as id, n.name AS issue, d.name as assignee, d2.name as resolver, n.reopenCount as count ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - this.count= this._g.userPrefs?.anomalyDefaultValues?.reopenCount.getValue() ||1; - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: Closed reopen ping-pong bugs`); }; - const cb = (x) => { - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = ` MATCH (n:Issue) - WHERE 'Closed reopen ping pong' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) return n,d,d2,r,r2` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string,TableDataType.string, TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - this.count= this._g.userPrefs?.anomalyDefaultValues?.reopenCount.getValue() ||1; - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: Closed reopen ping-pong bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - const cql = ` - MATCH (n:Issue) - WHERE 'Closed reopen ping pong' IN n.anomalyList AND ${idFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) return n,d,d2,r,r2` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } -} - diff --git a/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.css b/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.html b/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.ts b/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.ts deleted file mode 100644 index 8ba7dc36..00000000 --- a/src/app/custom/analyses/anomalies/ignored-bugs/ignored-bugs.component.ts +++ /dev/null @@ -1,257 +0,0 @@ - -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface' - -export interface Anomaly { - Issue: string; - Assignee: string; - Dates: string; -} -@Component({ - selector: 'app-ignored-bugs', - templateUrl: './ignored-bugs.component.html', - styleUrls: ['./ignored-bugs.component.css'] -}) -export class IgnoredBugsComponent implements OnInit, QueryComponent { - - time:number ; - - tableInput: TableViewInput = { - columns: ['issue','assignee','dates'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - this.time = this._g.userPrefs.anomalyDefaultValues.ignoreBug.getValue() - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - } else { - this.fillTable(processedTableData, cnt); - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'id', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql=`MATCH (n) - WHERE n.history IS NOT NULL AND size(n.history) >= 2 AND ${dateFilter} - WITH n, range(0, size(n.history)-2) as index_range - UNWIND index_range as i - WITH n, i, toInteger(n.history[i]) as fromMillis, toInteger(n.history[i+1]) as toMillis\ - WITH n, i, datetime({epochMillis: fromMillis}) as from, datetime({epochMillis: toMillis}) as to\ - WHERE duration.between(from, to).months > ${this.time} - RETURN distinct ElementId(n) as id , n.name as issue, n.assignee as assignee, collect([from, to]) as dates ORDER BY ${orderExpr} - SKIP ${skip} LIMIT ${dataCnt}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - this.time = this._g.userPrefs.anomalyDefaultValues.ignoreBug.getValue() - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: Ignored bugs`); }; - const cb = (x) => { - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h. getOrderByExpression4Query(null, 'n.name', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql =`MATCH (n) - WHERE 'Ignored bug' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n) -[r:ASSIGNED_TO]-(t) WHERE t.name = n.assignee - RETURN n , t ,r ` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].startNodeElementId]) { - nodeIdDict[x.edges[i].endNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string,TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - if(uiColumns[j] == "dates" && data[i][uiColumns[j]].length>3 && Array.isArray(data[i][uiColumns[j]]) ){ - const formattedDates = data[i][uiColumns[j]].map(subArray => { - return subArray.map(dateString => { - const date = new Date(dateString); - return date.toLocaleDateString('en-GB'); // use your preferred locale here - }).join(' - '); - }); - - data[i][uiColumns[j]] = formattedDates.slice(0,3).join(" , ") - data[i][uiColumns[j]] = "[" + data[i][uiColumns[j]] + " ...]" - row.push({ type: columnTypes[j], val: data[i][uiColumns[j]] }) - } - else if (uiColumns[j] == "dates" && data[i][uiColumns[j]].length<=3 && Array.isArray(data[i][uiColumns[j]]) ){ - const formattedDates = data[i][uiColumns[j]].map(subArray => { - return subArray.map(dateString => { - const date = new Date(dateString); - return date.toLocaleDateString('en-GB'); // use your preferred locale here - }).join(' - '); - }); - - data[i][uiColumns[j]] = formattedDates.join(" , ") - data[i][uiColumns[j]] = "[" + data[i][uiColumns[j]] + " ]"; - row.push({ type: columnTypes[j], val: data[i][uiColumns[j]] }) - } - else{ - row.push({ type: columnTypes[j], val: data[i][uiColumns[j]] }) - } - } - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: Ignored bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql = `MATCH (n) - WHERE 'Ignored bug' IN n.anomalyList AND ${idFilter} - OPTIONAL MATCH (n) -[r:ASSIGNED_TO]-(t) WHERE t.name = n.assignee - RETURN n,r,t ` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } -} diff --git a/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.css b/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.html b/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.ts b/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.ts deleted file mode 100644 index cef2f3d4..00000000 --- a/src/app/custom/analyses/anomalies/missing-environment-information/missing-environment-information.component.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; - Reporter: string; -} -@Component({ - selector: 'app-missing-environment-information', - templateUrl: './missing-environment-information.component.html', - styleUrls: ['./missing-environment-information.component.css'] -}) -export class MissingEnvironmentInformationComponent implements OnInit, QueryComponent { - - - - tableInput: TableViewInput = { - columns: ['issue','reporter'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'id', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql=`MATCH (n) - WHERE 'Missing Environment Information' IN n.anomalyList AND ${dateFilter} - RETURN ElementId(n) as id, n.name as issue , n.reporter as reporter ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: Missing environment information bugs`); }; - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = `MATCH (n) - WHERE 'Missing Environment Information' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:REPORTED]-(d) - return n,r,d` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - if(x.edges[i].type ==="REPORTED"){ - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - - } - else if (nodeIdDict[x.edges[i].startNodeElementId]) { - if(x.edges[i].type ==="ASSIGNED_TO"){ - nodeIdDict[x.edges[i].endNodeElementId] = true; - } - } - else{ - - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: Missing environment information bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql = `MATCH (n) - WHERE 'Missing Environment Information' IN n.anomalyList AND ${idFilter} - OPTIONAL MATCH (n)-[r:REPORTED]-(d) - return n,r,d ` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - -} diff --git a/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.css b/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.html b/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.ts b/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.ts deleted file mode 100644 index 1c0efda6..00000000 --- a/src/app/custom/analyses/anomalies/missing-priority/missing-priority.component.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; - Assignee: string; - Resolver: string; -} -@Component({ - selector: 'app-missing-priority', - templateUrl: './missing-priority.component.html', - styleUrls: ['./missing-priority.component.css'] -}) -export class MissingPriorityComponent implements OnInit, QueryComponent { - - - - tableInput: TableViewInput = { - columns: ['issue','assignee','resolver'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'id', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql=` MATCH (n:Issue) - WHERE 'Missing Priority' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) - RETURN ElementId(n) as id, n.name AS issue, d.name as assignee, d2.name as resolver ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: Missing priority bugs`); }; - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = `MATCH (n:Issue) - WHERE 'Missing Priority' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) return n,d,d2,r,r2` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string,TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: Missing priority bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql = `MATCH (n:Issue) - WHERE 'Missing Priority' IN n.anomalyList AND ${idFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) return n,d,d2,r,r2 ` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } -} diff --git a/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.css b/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.html b/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.ts b/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.ts deleted file mode 100644 index ef171c0a..00000000 --- a/src/app/custom/analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; - Assignee: string; - Resolver: string; -} -@Component({ - selector: 'app-no-assignee-resolver-bug', - templateUrl: './no-assignee-resolver-bug.component.html', - styleUrls: ['./no-assignee-resolver-bug.component.css'] -}) -export class NoAssigneeResolverBugComponent implements OnInit, QueryComponent { - - - - tableInput: TableViewInput = { - columns: ['issue','assignee','resolver'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'id', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - - const r = `[${skip}..${skip + dataCnt}]`; - const cql=`MATCH (n:Issue) - WHERE 'No assignee resolver' IN n.anomalyList AND ${dateFilter} - RETURN ElementId(n) as id, n.name as issue, n.assignee as assignee, n.resolver as resolver ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: No assignee resolver bugs`); }; - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = `MATCH (n:Issue)-[r1:ASSIGNED_TO]-(assignee:Developer), - (n:Issue)<-[r2:RESOLVED]-(resolver:Developer) - WHERE 'No assignee resolver' IN n.anomalyList AND ${dateFilter} - RETURN n, assignee, resolver, r2,r1` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string,TableDataType.string] ; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: No assignee resolver bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql = `MATCH (resolver:Developer)-[r2:RESOLVED]->(n:Issue)-[r1:ASSIGNED_TO]-(assignee:Developer) - WHERE 'No assignee resolver' IN n.anomalyList AND ${idFilter} - RETURN n, assignee, resolver, r2,r1 ` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - -} - diff --git a/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.css b/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.html b/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.ts b/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.ts deleted file mode 100644 index ff912902..00000000 --- a/src/app/custom/analyses/anomalies/no-comment-bugs/no-comment-bugs.component.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; -} -@Component({ - selector: 'app-no-comment-bugs', - templateUrl: './no-comment-bugs.component.html', - styleUrls: ['./no-comment-bugs.component.css'] -}) -export class NoCommentBugsComponent implements OnInit, QueryComponent { - - - - tableInput: TableViewInput = { - columns: ['issue'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'id', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - - const cql=`MATCH (n:Issue) - WHERE 'No comment on issue' IN n.anomalyList AND ${dateFilter} - RETURN ElementId(n) as id, n.name AS issue ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: No comment bugs`); }; - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = `MATCH (n:Issue) - WHERE 'No comment on issue' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) return n,d,d2,r,r2` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: No comment bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql = `MATCH (n:Issue) - WHERE 'No comment on issue' IN n.anomalyList AND ${idFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) return n,d,d2,r,r2 ` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - -} diff --git a/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.css b/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.html b/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.ts b/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.ts deleted file mode 100644 index 40228945..00000000 --- a/src/app/custom/analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; - Assignee: string; - Resolver: string; -} -@Component({ - selector: 'app-no-link-to-bug-fixing-commit', - templateUrl: './no-link-to-bug-fixing-commit.component.html', - styleUrls: ['./no-link-to-bug-fixing-commit.component.css'] -}) -export class NoLinkToBugFixingCommitComponent implements OnInit, QueryComponent { - - - - tableInput: TableViewInput = { - columns: ['issue', 'assignee','resolver'],results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'id', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql=`MATCH (n:Issue) - WHERE 'No link to bug fixing commit or pull request' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) - RETURN ElementId(n) as id, n.name AS issue, d.name as assignee, d2.name as resolver ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: No link to bug fixing commit bugs`); }; - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - const cql = `MATCH (n:Issue) - WHERE 'No link to bug fixing commit or pull request' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) return n,r,r2 ` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - if(x.edges[i].type ==="RESOLVED"){ - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - - } - else if (nodeIdDict[x.edges[i].startNodeElementId]) { - if(x.edges[i].type ==="ASSIGNED_TO"){ - nodeIdDict[x.edges[i].endNodeElementId] = true; - } - } - else{ - - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string, TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: No link to bug fixing commit bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql = `MATCH (n:Issue) - WHERE 'No link to bug fixing commit or pull request' IN n.anomalyList AND ${idFilter} - OPTIONAL MATCH (n)-[r:ASSIGNED_TO]-(d) - OPTIONAL MATCH (n)-[r2:RESOLVED]-(d2) return n,d,d2,r,r2` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } -} diff --git a/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.css b/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.html b/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.ts b/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.ts deleted file mode 100644 index 53f40f24..00000000 --- a/src/app/custom/analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; - RelatedIssue: string; -} -@Component({ - selector: 'app-not-referenced-duplicates', - templateUrl: './not-referenced-duplicates.component.html', - styleUrls: ['./not-referenced-duplicates.component.css'] -}) -export class NotReferencedDuplicatesComponent implements OnInit, QueryComponent { - - - - tableInput: TableViewInput = { - columns: ['issue','related'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'id', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - - - const cql=` MATCH (n:Issue) - WHERE 'Not Referenced duplicate' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:RELATES_TO]-(d) - RETURN ElementId(n) as id, n.name AS issue, d.name as related ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: Not referenced duplicates bugs`); }; - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = `MATCH (n:Issue) - WHERE 'Not Referenced duplicate' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:RELATES_TO]-(d) - RETURN n,r,d` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].startNodeElementId]) { - nodeIdDict[x.edges[i].endNodeElementId] = true; - } - else if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: Not referenced duplicates bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql = `MATCH (n:Issue) - WHERE 'Not Referenced duplicate' IN n.anomalyList and ${idFilter} - OPTIONAL MATCH (n)-[r:RELATES_TO]-(d) - RETURN n,r,d ` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - -} diff --git a/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.css b/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.html b/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.ts b/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.ts deleted file mode 100644 index efb21073..00000000 --- a/src/app/custom/analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; - History: string[]; - Count: string; -} -@Component({ - selector: 'app-reassignment-bug-assignee', - templateUrl: './reassignment-bug-assignee.component.html', - styleUrls: ['./reassignment-bug-assignee.component.css'] -}) -export class ReassignmentBugAssigneeComponent implements OnInit, QueryComponent { - count :number; - - tableInput: TableViewInput = { - columns: ['issue','history','count'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - this.count= this._g.userPrefs?.anomalyDefaultValues?.assigneeChangeCount.getValue() ||1; - } - - ngOnInit() { - - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - this.count= this._g.userPrefs?.anomalyDefaultValues?.assigneeChangeCount.getValue() ||1; - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - - const r = `[${skip}..${skip + dataCnt}]`; - const cql=` MATCH (n:Issue) - WHERE 'Reassignment of Bug Assignee' IN n.anomalyList AND ${dateFilter} - RETURN ElementId(n) as id, n.name AS issue, n.assigneeHistory as history, n.assigneeChangeCount as count ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - this.count= this._g.userPrefs?.anomalyDefaultValues?.assigneeChangeCount.getValue() ||1; - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: Reassignment bug assignee`); }; - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = ` MATCH (n:Issue) - WHERE 'Reassignment of Bug Assignee' IN n.anomalyList - WITH n, [assignee IN n.assigneeHistory ] AS assignees - UNWIND assignees AS assignee - OPTIONAL MATCH path =(n)-[*1..2]-(developer: Developer) - WHERE developer.name =assignee and ${dateFilter} - RETURN n, developer AS assignee,relationships(path) AS edges` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - const nodeIdDict = {}; - const start_edges = ["ASSIGNED_TO","ASSIGNED_BY", "REFERENCED"] - const sink_edges = ["COMMITTED","OPENED","MERGED", "REVIEWED", "CLOSED", "RESOLVED","REPORTED"] - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - if(sink_edges.includes(x.edges[i].type )){ - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - - } - else if (nodeIdDict[x.edges[i].startNodeElementId]) { - if(start_edges.includes(x.edges[i].type)){ - nodeIdDict[x.edges[i].endNodeElementId] = true; - } - } - else{ - - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string, TableDataType.string, TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - this.count= this._g.userPrefs?.anomalyDefaultValues?.assigneeChangeCount.getValue() ||1; - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: Get Anomalies: Reassignment bug assignee (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - const cql = ` MATCH (n:Issue) - WHERE 'Reassignment of Bug Assignee' IN n.anomalyList and ${idFilter} - OPTIONAL MATCH (n)-[r]-(d) - return n,d,r` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } -} - diff --git a/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.css b/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.html b/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.ts b/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.ts deleted file mode 100644 index 05be7648..00000000 --- a/src/app/custom/analyses/anomalies/same-resolver-closer/same-resolver-closer.component.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { getCyStyleFromColorAndWid } from 'src/app/visuall/constants'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Developer: string; - Issues: string; - Count: number; -} -@Component({ - selector: 'app-same-resolver-closer', - templateUrl: './same-resolver-closer.component.html', - styleUrls: ['./same-resolver-closer.component.css'] -}) -export class SameResolverCloserComponent implements OnInit, QueryComponent { - - - - tableInput: TableViewInput = { - columns: ['Developer','Issues','Count'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Developer', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - } - if (isClientSidePagination) { - - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - } else { - this.fillTable(processedTableData, cnt); - } - if (!filter) { - this.tableResponse = processedTableData; - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Developer'], isIgnoreCase); - const ui2Db = { 'Developer': 'Developer' ,'Issues': 'Issues','Count': 'Count'}; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - - const cql = ` MATCH (n:Developer)-[r]->(issue:Issue) - WHERE issue.resolver= n.name and issue.closer = n.name and ${dateFilter} - RETURN ElementId(n) as id, n.name AS Developer, Collect(distinct issue.name) AS Issues, count(distinct issue.name) as Count ORDER BY ${orderExpr} ` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: Same resolver closer bugs`); }; - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - - let nodeIds = [] - let edegeIds = [] - - x.nodes.forEach(node => { - nodeIds.push(node.id) - }); - x.edges.forEach(edge => { - edegeIds.push(edge.id) - }); - } - - const ui2Db = { 'Developer': 'Developer' ,'Issues': 'Issues','Count': 'Count'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = ` MATCH (n:Developer)-[r1:RESOLVED ]->(issue:Issue) - MATCH (n)-[r2:CLOSED]->(issue) - WHERE issue.resolver= n.name and issue.closer = n.name AND ${dateFilter} - RETURN n, r1,r2, issue SKIP 0 ` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string, TableDataType.string,TableDataType.number]; - this.tableInput.results = []; - - for (let i = 0; i < data.length; i++) { - const row: TableData[] = [] - for (let j = 0; j < uiColumns.length; j++) { - if(uiColumns[j] == "Issues" && data[i][uiColumns[j]].length>3 ){ - data[i][uiColumns[j]] = data[i][uiColumns[j]].slice(0,3).join(" , ") - data[i][uiColumns[j]] = "[" + data[i][uiColumns[j]] + " ...]" - row.push({ type: columnTypes[j], val: data[i][uiColumns[j]] }) - } - else if (uiColumns[j] == "Issues" && data[i][uiColumns[j]].length<=3 ){ - data[i][uiColumns[j]] = data[i][uiColumns[j]].join(" , ") - data[i][uiColumns[j]] = "[" + data[i][uiColumns[j]] + " ]"; - row.push({ type: columnTypes[j], val: data[i][uiColumns[j]] }) - } - else{ - row.push({ type: columnTypes[j], val: data[i][uiColumns[j]] }) - } - - } - this.tableInput.results.push(row) - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - - this.tableFilled.next(true); - } - - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - let nodeIds = [] - let edegeIds = [] - x.nodes.forEach(node => { - nodeIds.push(node.id) - }); - x.edges.forEach(edge => { - edegeIds.push(edge.id) - }); - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: Same resolver closer bugs (${names.join(", ")})`); - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = { 'Developer': 'Developer' ,'Issues': 'Issues','Count': 'Count'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = ` MATCH (n:Developer)-[r1:RESOLVED ]->(issue:Issue) - MATCH (n)-[r2:CLOSED]->(issue) - WHERE issue.resolver= n.name and issue.closer = n.name AND ${idFilter} AND ${dateFilter} - RETURN n, r1,r2, issue SKIP 0 ` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - -} \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.css b/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.css deleted file mode 100644 index 54bee37e..00000000 --- a/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.css +++ /dev/null @@ -1,4 +0,0 @@ -#genreSelector { - width: 70px; - } - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.html b/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.ts b/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.ts deleted file mode 100644 index 57c2974d..00000000 --- a/src/app/custom/analyses/anomalies/unassigned-bugs/unassigned-bugs.component.ts +++ /dev/null @@ -1,213 +0,0 @@ - -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../../query.component.interface'; - -export interface Anomaly { - Issue: string; - Resolver: string; -} -@Component({ - selector: 'app-unassigned-bugs', - templateUrl: './unassigned-bugs.component.html', - styleUrls: ['./unassigned-bugs.component.css'] -}) -export class UnassignedBugsComponent implements OnInit, QueryComponent { - - tableInput: TableViewInput = { - columns: ['issue','resolver'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - setTimeout(() => { - - }, 0); - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData =this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - } else { - this.fillTable(processedTableData, cnt); - } - if (!filter) { - this.tableResponse = processedTableData; - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const ui2Db = {'issue': 'n.name' }; - const orderExpr = this._h.getOrderByExpression4Query(filter, 'issue', 'asc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql=`MATCH(n:Issue) - WHERE 'Unassigned issue' IN n.anomalyList AND ${dateFilter} - RETURN ElementId(n) as id, n.name AS issue, n.resolver as resolver ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get Anomalies: Unassigned bugs`); }; - const cb = (x) => { - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const dateFilter = this._h.getDateRangeCQL(); - const cql = `MATCH (n:Issue) - WHERE 'Unassigned issue' IN n.anomalyList AND ${dateFilter} - OPTIONAL MATCH (n)-[r:RESOLVED]-(d) return n,d,r` - this._dbService.runQuery(cql, fn); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Anomaly[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get Anomalies: Unassigned bugs (${names.join(", ")})`); - } - const idFilter = this._h.buildIdFilter(e.dbIds); - - const cql = `MATCH(n:Issue) - WHERE 'Unassigned issue' IN n.anomalyList AND ${idFilter} - OPTIONAL MATCH (n)-[r:RESOLVED]-(d) return n,d,r` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: Anomaly[], filter: TableFiltering): Anomaly[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Anomaly[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - -} diff --git a/src/app/custom/analyses/collaborators/collaborators.component.css b/src/app/custom/analyses/collaborators/collaborators.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/custom/analyses/collaborators/collaborators.component.html b/src/app/custom/analyses/collaborators/collaborators.component.html deleted file mode 100644 index 173ef22c..00000000 --- a/src/app/custom/analyses/collaborators/collaborators.component.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
-
-
-
-
-
- - -
-
- -
- - -
-
- - -
-
- - - - \ No newline at end of file diff --git a/src/app/custom/analyses/collaborators/collaborators.component.ts b/src/app/custom/analyses/collaborators/collaborators.component.ts deleted file mode 100644 index 413a4143..00000000 --- a/src/app/custom/analyses/collaborators/collaborators.component.ts +++ /dev/null @@ -1,367 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { GENERIC_TYPE, LONG_MAX, LONG_MIN } from 'src/app/visuall/constants'; -import { TimebarGraphInclusionTypes } from 'src/app/visuall/user-preference'; -import { GroupCustomizationService } from 'src/app/custom/customization-service/group-customization.service'; -import { QueryComponent } from '../query.component.interface'; - -export interface Collaborator { - Name: string; - Collaboration: number; -} -@Component({ - selector: 'app-collaborators', - templateUrl: './collaborators.component.html', - styleUrls: ['./collaborators.component.css'] -}) -export class CollaboratorsComponent implements OnInit, QueryComponent{ - - developer: String = ""; - developerId : String = ""; - developers: String [] = []; - developersName : String [] = []; - scores: number [] = []; - tableInput: TableViewInput = { - columns: ['name','collaboration'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Developer', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - number: Number = 3; - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, - private _group: GroupCustomizationService, private _h: QueryHelperService) { - } - - ngOnInit() { - this.developer = this._g.cy.$(':selected')[0]._private.data.name; - let name = ""; - setInterval(() => { - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "Developer" && this._g.cy.$(':selected')[0]._private.data.name !== name) { - name = this._g.cy.$(':selected')[0]._private.data.name - this.developer = this._g.cy.$(':selected')[0]._private.data.name; - this.developerId = this._g.cy.$(':selected')[0]._private.data.id; - } - }, 500) - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - this.developers = []; - this.developersName = []; - this.scores = []; - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - x.data.forEach(element => { - this.developers.push(element[2]) - this.developersName.push("'" + element[1] + "'") - this.scores.push(element[0]) - }); - const processedTableData = this.preprocessTableData(x); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Developer'], isIgnoreCase); - const ui2Db = {'name': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'collaboration', 'desc', ui2Db); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const f1 = this.dateFilterFromUserPref('n', true); - const f2 = this.dateFilterFromUserPref('issue', true); - const f3 = this.dateFilterFromUserPref('d1', true); - let f = ''; - if (f1.length > 0) { - f += ' WHERE ' + f1.substr(5); - } - if (f2.length > 0) { - f += f2; - } - if (f3.length > 0) { - f += f3; - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql=`MATCH (d1:Developer {name: '${this.developer}'}) - MATCH (n:Developer) - WHERE d1 <> n - MATCH p = (d1)-[]->(issue:Issue)<-[]-(n) ${f} - WITH n, COUNT(DISTINCT issue) AS collaboration - RETURN ElementId(n) as id, n.name AS name, collaboration ORDER BY ${orderExpr} LIMIT ${this.number} - ` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - const seedsSet = new Set(this.developers.map(x => 'n' + x)); - const seedNodes = this._g.cy.nodes().filter(element => seedsSet.has(element.id())); - const currHighlightIdx = this._g.userPrefs.currHighlightIdx.getValue(); - const developerNode = this._g.cy.nodes(`[id = "${this.developerId}"]`); - if (currHighlightIdx == 0) { - this._g.viewUtils.highlight(seedNodes, 1); - this._g.viewUtils.highlight(developerNode, 2); - } - else if(currHighlightIdx == 2){ - this._g.viewUtils.highlight(seedNodes, 1); - this._g.viewUtils.highlight(developerNode, 0); - }else { - this._g.viewUtils.highlight(seedNodes, 0); - } - - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Developer'], isIgnoreCase); - const ui2Db = {'name': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'score', 'desc', ui2Db); - const f1 = this.dateFilterFromUserPref('n', true); - const f2 = this.dateFilterFromUserPref('issue', true); - const f3 = this.dateFilterFromUserPref('d1', true); - let f = ''; - if (f1.length > 0) { - f += ' WHERE ' + f1.substr(5); - } - if (f2.length > 0) { - f += f2; - } - if (f3.length > 0) { - f += f3; - } - - const cql = `MATCH (d1:Developer {name: '${this.developer}'}) - MATCH (n:Developer) - WHERE d1 <> n - MATCH p = (d1)-[]->(issue:Issue)<-[]-(n) ${f} - WITH n, COUNT(DISTINCT issue) AS score, collect(p) AS paths, d1 - ORDER BY ${orderExpr} - LIMIT ${this.number} - RETURN d1, paths; - ` - this._dbService.runQuery(cql, cb); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - else if (nodeIdDict[x.edges[i].startNodeElementId]) { - nodeIdDict[x.edges[i].endNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Collaborator[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.number]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql = - `MATCH (d1:Developer {name: '${this.developer}'}) - MATCH (n:Developer) - WHERE d1 <> n and ${idFilter} - MATCH p = (d1)-[]->(issue:Issue)<-[]-(n) - WITH n, COUNT(DISTINCT issue) AS score, collect(p) AS paths, d1 - RETURN d1, paths; - ` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - // zip paralel arrays - private preprocessTableData(data): Collaborator[] { - const dbColumns = data.columns as string[]; - const uiColumns = ['id'].concat(this.tableInput.columns); - let columnMapping = []; - for (let i = 0; i < uiColumns.length; i++) { - columnMapping.push(dbColumns.indexOf(uiColumns[i])); - } - const rawData = data.data; - const objArr: Collaborator[] = []; - for (let i = 0; i < rawData.length; i++) { - const obj = {}; - for (let j = 0; j < columnMapping.length; j++) { - obj[uiColumns[j]] = rawData[i][columnMapping[j]]; - } - objArr.push(obj as Collaborator) - } - return objArr; - } - - filterTableResponse(x: Collaborator[], filter: TableFiltering): Collaborator[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Collaborator[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - // tableInput is already filtered. Use that to filter graph elements. - // For this query, we should specifically bring the related nodes and their 1-neighborhood - - private dateFilterFromUserPref(varName: string, isNode: boolean): string { - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - return ''; - } - let s = ''; - let keys = []; - - if (isNode) { - keys = Object.keys(this._g.appDescription.getValue().objects); - } else { - keys = Object.keys(this._g.appDescription.getValue().relations); - } - - const d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - const d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const mapping = this._g.appDescription.getValue().timebarDataMapping; - - if (!mapping || Object.keys(mapping).length < 1) { - return ''; - } - - s = ' AND ('; - for (const k of keys) { - if (!mapping[k]) { - continue; - } - const p1 = `COALESCE(${varName}.${mapping[k].begin_datetime}, ${LONG_MIN})`; - const p2 = `COALESCE(${varName}.${mapping[k].end_datetime}, ${LONG_MAX})`; - const bothNull = `(${varName}.${mapping[k].end_datetime} IS NULL AND ${varName}.${mapping[k].begin_datetime} IS NULL)` - if (inclusionType == TimebarGraphInclusionTypes.overlaps) { - s += `(${bothNull} OR (${p1} <= ${d2} AND ${p2} >= ${d1})) AND`; - } else if (inclusionType == TimebarGraphInclusionTypes.contains) { - s += `(${bothNull} OR (${d1} <= ${p1} AND ${d2} >= ${p2})) AND`; - } else if (inclusionType == TimebarGraphInclusionTypes.contained_by) { - s += `(${bothNull} OR (${p1} <= ${d1} AND ${p2} >= ${d2})) AND`; - } - - } - s = s.slice(0, -4) - s += ')' - return s; - } -} diff --git a/src/app/custom/analyses/comment-collaborators/comment-collaborators.component.css b/src/app/custom/analyses/comment-collaborators/comment-collaborators.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/custom/analyses/comment-collaborators/comment-collaborators.component.html b/src/app/custom/analyses/comment-collaborators/comment-collaborators.component.html deleted file mode 100644 index 173ef22c..00000000 --- a/src/app/custom/analyses/comment-collaborators/comment-collaborators.component.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
-
-
-
-
-
- - -
-
- -
- - -
-
- - -
-
- - - - \ No newline at end of file diff --git a/src/app/custom/analyses/comment-collaborators/comment-collaborators.component.ts b/src/app/custom/analyses/comment-collaborators/comment-collaborators.component.ts deleted file mode 100644 index 19297679..00000000 --- a/src/app/custom/analyses/comment-collaborators/comment-collaborators.component.ts +++ /dev/null @@ -1,374 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { LONG_MAX, LONG_MIN } from 'src/app/visuall/constants'; -import { TimebarGraphInclusionTypes } from 'src/app/visuall/user-preference'; -import { QueryComponent } from '../query.component.interface'; - -export interface Collaborator { - Name: string; - CollaborationCount: number; - CollaborationScore: number; -} -@Component({ - selector: 'app-comment-collaborators', - templateUrl: './comment-collaborators.component.html', - styleUrls: ['./comment-collaborators.component.css'] -}) -export class CommentCollaboratorsComponent implements OnInit, QueryComponent { - - developer: String = ""; - developerId : String = ""; - developers: String [] = []; - developersName : String [] = []; - scores: number [] = []; - tableInput: TableViewInput = { - columns: ['name','collaboration', 'score'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Developer', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - number: Number = 3; - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - this.developer = this._g.cy.$(':selected')[0]._private.data.name; - let name = ""; - setInterval(() => { - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "Developer" && this._g.cy.$(':selected')[0]._private.data.name !== name) { - name = this._g.cy.$(':selected')[0]._private.data.name - this.developer = this._g.cy.$(':selected')[0]._private.data.name; - this.developerId = this._g.cy.$(':selected')[0]._private.data.id; - } - }, 500) - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - this.developers = []; - this.developersName = []; - this.scores = []; - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - x.data.forEach(element => { - this.developers.push(element[3]) - this.developersName.push("'" + element[2] + "'") - this.scores.push(element[0]) - }); - const processedTableData = this.preprocessTableData(x); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Developer'], isIgnoreCase); - const ui2Db = {'name': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'score', 'desc', ui2Db); - const f1 = this.dateFilterFromUserPref('n', true); - const f2 = this.dateFilterFromUserPref('issue', true); - const f3 = this.dateFilterFromUserPref('d1', true); - let f = ''; - if (f1.length > 0) { - f += ' WHERE ' + f1.substr(5); - } - if (f2.length > 0) { - f += f2; - } - if (f3.length > 0) { - f += f3; - } - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - const cql=` - MATCH (d1:Developer {name: '${this.developer}'}) - MATCH (n:Developer) - WHERE d1 <> n - MATCH (d1)-[comment1:COMMENTED]->(issue:Issue)<-[comment2:COMMENTED]-(n) ${f} - WITH n, COUNT(DISTINCT issue) AS sharedIssues, - SUM(comment1.commentCount + comment2.commentCount) AS totalComments - WITH n, sharedIssues, totalComments, sharedIssues * totalComments AS score - WHERE score > 0 - RETURN ElementId(n) as id, n.name AS name, sharedIssues AS collaboration, score ORDER BY ${orderExpr} - LIMIT ${this.number}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - const seedsSet = new Set(this.developers.map(x => 'n' + x)); - const seedNodes = this._g.cy.nodes().filter(element => seedsSet.has(element.id())); - const currHighlightIdx = this._g.userPrefs.currHighlightIdx.getValue(); - const developerNode = this._g.cy.nodes(`[id = "${this.developerId}"]`); - if (currHighlightIdx == 0) { - this._g.viewUtils.highlight(seedNodes, 1); - this._g.viewUtils.highlight(developerNode, 2); - } - else if(currHighlightIdx == 2){ - this._g.viewUtils.highlight(seedNodes, 1); - this._g.viewUtils.highlight(developerNode, 0); - }else { - this._g.viewUtils.highlight(seedNodes, 0); - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Developer'], isIgnoreCase); - const ui2Db = {'name': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'collaborationScore', 'desc', ui2Db); - const f1 = this.dateFilterFromUserPref('n', true); - const f2 = this.dateFilterFromUserPref('issue', true); - const f3 = this.dateFilterFromUserPref('d1', true); - let f = ''; - if (f1.length > 0) { - f += ' WHERE ' + f1.substr(5); - } - if (f2.length > 0) { - f += f2; - } - if (f3.length > 0) { - f += f3; - } - const cql=` - MATCH (d1:Developer {name: '${this.developer}'}) - MATCH (n:Developer) - WHERE d1 <> n - MATCH p = (d1)-[comment1:COMMENTED]->(issue:Issue)<-[comment2:COMMENTED]-(n) ${f} - WITH n, COUNT(DISTINCT issue) AS sharedIssues, - SUM(comment1.commentCount + comment2.commentCount) AS totalComments, collect(p) AS paths - WITH sharedIssues * totalComments AS collaborationScore,paths - ORDER BY ${orderExpr} - LIMIT ${this.number} - RETURN paths` - this._dbService.runQuery(cql, cb); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - else if (nodeIdDict[x.edges[i].startNodeElementId]) { - nodeIdDict[x.edges[i].endNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } - - - fillTable(data: Collaborator[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string,TableDataType.number,TableDataType.number]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = {'issue': 'n.name'}; - - const cql=` - MATCH (d1:Developer {name: '${this.developer}'}) - MATCH (n:Developer) - WHERE d1 <> n AND ${idFilter} - MATCH p = (d1)-[comment1:COMMENTED]->(issue:Issue)<-[comment2:COMMENTED]-(n) - WITH n, COUNT(DISTINCT issue) AS sharedIssues, - SUM(comment1.commentCount + comment2.commentCount) AS totalComments, p - WITH n, sharedIssues, totalComments, sharedIssues * totalComments AS collaborationScore, collect(p) AS paths - WHERE collaborationScore > 0 - RETURN paths` - - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - // zip paralel arrays - private preprocessTableData(data): Collaborator[] { - const dbColumns = data.columns as string[]; - const uiColumns = ['id'].concat(this.tableInput.columns); - let columnMapping = []; - for (let i = 0; i < uiColumns.length; i++) { - columnMapping.push(dbColumns.indexOf(uiColumns[i])); - } - const rawData = data.data; - const objArr: Collaborator[] = []; - for (let i = 0; i < rawData.length; i++) { - const obj = {}; - for (let j = 0; j < columnMapping.length; j++) { - obj[uiColumns[j]] = rawData[i][columnMapping[j]]; - } - objArr.push(obj as Collaborator) - } - return objArr; - } - - filterTableResponse(x: Collaborator[], filter: TableFiltering): Collaborator[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Collaborator[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - // tableInput is already filtered. Use that to filter graph elements. - // For this query, we should specifically bring the related nodes and their 1-neighborhood - - - private dateFilterFromUserPref(varName: string, isNode: boolean): string { - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - return ''; - } - let s = ''; - let keys = []; - - if (isNode) { - keys = Object.keys(this._g.appDescription.getValue().objects); - } else { - keys = Object.keys(this._g.appDescription.getValue().relations); - } - - const d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - const d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const mapping = this._g.appDescription.getValue().timebarDataMapping; - - if (!mapping || Object.keys(mapping).length < 1) { - return ''; - } - - s = ' AND ('; - for (const k of keys) { - if (!mapping[k]) { - continue; - } - const p1 = `COALESCE(${varName}.${mapping[k].begin_datetime}, ${LONG_MIN})`; - const p2 = `COALESCE(${varName}.${mapping[k].end_datetime}, ${LONG_MAX})`; - const bothNull = `(${varName}.${mapping[k].end_datetime} IS NULL AND ${varName}.${mapping[k].begin_datetime} IS NULL)` - if (inclusionType == TimebarGraphInclusionTypes.overlaps) { - s += `(${bothNull} OR (${p1} <= ${d2} AND ${p2} >= ${d1})) AND`; - } else if (inclusionType == TimebarGraphInclusionTypes.contains) { - s += `(${bothNull} OR (${d1} <= ${p1} AND ${d2} >= ${p2})) AND`; - } else if (inclusionType == TimebarGraphInclusionTypes.contained_by) { - s += `(${bothNull} OR (${p1} <= ${d1} AND ${p2} >= ${d2})) AND`; - } - - } - s = s.slice(0, -4) - s += ')' - return s; - } -} diff --git a/src/app/custom/analyses/comment-contributors/comment-contributors.component.css b/src/app/custom/analyses/comment-contributors/comment-contributors.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/custom/analyses/comment-contributors/comment-contributors.component.html b/src/app/custom/analyses/comment-contributors/comment-contributors.component.html deleted file mode 100644 index 25208fdf..00000000 --- a/src/app/custom/analyses/comment-contributors/comment-contributors.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
-
-
-
- -
- - -
-
- - -
-
- - - - - \ No newline at end of file diff --git a/src/app/custom/analyses/comment-contributors/comment-contributors.component.ts b/src/app/custom/analyses/comment-contributors/comment-contributors.component.ts deleted file mode 100644 index 889b0a3f..00000000 --- a/src/app/custom/analyses/comment-contributors/comment-contributors.component.ts +++ /dev/null @@ -1,227 +0,0 @@ - import { Component, OnInit } from '@angular/core'; - import { Neo4jDb } from '../../../visuall/db-service/neo4j-db.service'; - import { CytoscapeService } from '../../../visuall/cytoscape.service'; - import { GlobalVariableService } from '../../../visuall/global-variable.service'; - import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../shared/table-view/table-view-types'; - import { Subject } from 'rxjs'; - import { QueryHelperService} from '../query-helper.service'; - import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; - import { QueryComponent } from '../query.component.interface'; - - export interface Developer { - Developer: string; - Count: string; - } - @Component({ - selector: 'app-comment-contributors', - templateUrl: './comment-contributors.component.html', - styleUrls: ['./comment-contributors.component.css'] - }) - export class CommentContributorsComponent implements OnInit, QueryComponent { - tableInput: TableViewInput = { - columns: ['developer','count'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Issue', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - issue = "" - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - } - - ngOnInit() { - let name = ""; - setInterval(() => { - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "Issue" && this._g.cy.$(':selected')[0]._private.data.name !== name) { - name = this._g.cy.$(':selected')[0]._private.data.name - this.issue = this._g.cy.$(':selected')[0]._private.data.name; - } - }, 500) - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['Issue'], isIgnoreCase); - const ui2Db = {'issue': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - - const r = `[${skip}..${skip + dataCnt}]`; - const cql=`MATCH (issue:Issue {name:'${this.issue}'}) - WITH issue, [cmtr in issue.commenterList] AS commenterList - UNWIND commenterList AS commenter - WITH issue as issue, apoc.convert.fromJsonMap(commenter) as cmtr - MATCH (n:Developer {name: cmtr.name}) - WHERE ${dateFilter} - RETURN elementId(n) as id, n.name as developer, cmtr.count as count ORDER BY ${orderExpr}` - this._dbService.runQuery(cql, cb, DbResponseType.table); - } - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - const ui2Db = { 'issue': 'n.name'}; - const orderExpr =this._h.getOrderByExpression4Query(null, 'Count', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - const cql = `MATCH (issue:Issue {name:'${this.issue}'}) - WITH issue, [cmtr in issue.commenterList] AS commenterList - UNWIND commenterList AS commenter - WITH issue as issue, apoc.convert.fromJsonMap(commenter) as cmtr - MATCH (n:Developer {name: cmtr.name}) - WITH issue, n - WHERE ${dateFilter} - MATCH path = shortestPath((issue)-[*1..3]-(n)) - RETURN issue, n, nodes(path) AS path_nodes, relationships(path) AS path_relationships` - this._dbService.runQuery(cql, cb); - - } - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: x.nodes, edges: x.edges }; - return r; - } - - - fillTable(data: Developer[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string, TableDataType.string, TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - } - const idFilter = this._h. buildIdFilter(e.dbIds); - const dateFilter = this._h.getDateRangeCQL(); - const ui2Db = {'issue': 'n.name'}; - const cql =`MATCH (issue:Issue {name:'${this.issue}'}) - WITH issue, [cmtr in issue.commenterList] AS commenterList - UNWIND commenterList AS commenter - WITH issue as issue, apoc.convert.fromJsonMap(commenter) as cmtr - MATCH (n:Developer {name: cmtr.name}) - WITH issue, n - WHERE ${idFilter} - MATCH path = shortestPath((issue)-[*1..3]-(n)) - RETURN issue, n, nodes(path) AS path_nodes, relationships(path) AS path_relationships` - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - - filterTableResponse(x: Developer[], filter: TableFiltering): Developer[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: Developer[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - - } - - \ No newline at end of file diff --git a/src/app/custom/analyses/developer-commits/developer-commits.component.css b/src/app/custom/analyses/developer-commits/developer-commits.component.css deleted file mode 100644 index 6905d97b..00000000 --- a/src/app/custom/analyses/developer-commits/developer-commits.component.css +++ /dev/null @@ -1,4 +0,0 @@ - -.developer-select{ - width: 150px !important; -} \ No newline at end of file diff --git a/src/app/custom/analyses/developer-commits/developer-commits.component.html b/src/app/custom/analyses/developer-commits/developer-commits.component.html deleted file mode 100644 index 54e48a71..00000000 --- a/src/app/custom/analyses/developer-commits/developer-commits.component.html +++ /dev/null @@ -1,33 +0,0 @@ -
-
-
- Developer - - - {{developer}} - -
-
-
-
- -
- - -
-
- - -
-
- - \ No newline at end of file diff --git a/src/app/custom/analyses/developer-commits/developer-commits.component.ts b/src/app/custom/analyses/developer-commits/developer-commits.component.ts deleted file mode 100644 index 29697143..00000000 --- a/src/app/custom/analyses/developer-commits/developer-commits.component.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Neo4jDb } from '../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { QueryComponent } from '../query.component.interface'; -//This query is for -export interface CommitData { - id: string; - commit: string; -} -@Component({ - selector: 'app-developer-commits', - templateUrl: './developer-commits.component.html', - styleUrls: ['./developer-commits.component.css'] -}) - -export class DeveloperCommitsComponent implements OnInit, QueryComponent { - developer: string; - developers: string[]; - filteredDevelopers: string[] = []; - tableInput: TableViewInput = { - columns: ['commit'], results: [], results2: [], isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Commit', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private _h: QueryHelperService) { - this.developers = []; - } - - ngOnInit() { - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "Developer") { - this.developer = this._g.cy.$(':selected')[0]._private.data.name; - } - setTimeout(() => { - const dateFilter = this._h.getDateRangeCQL(); - this._dbService.runQuery(`MATCH (n:Developer) RETURN distinct n.name`, (x) => this.fillGenres(x), DbResponseType.table); - }, 5); - let name = "" - setInterval(() => { - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "Developer" && this._g.cy.$(':selected')[0]._private.data.name != name) { - name = this._g.cy.$(':selected')[0]._private.data.name - this.developer = this._g.cy.$(':selected')[0]._private.data.name; - } - }, 1500) - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - this.loadGraph(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - const processedTableData = this._h.preprocessTableData(x,['id'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = x.data.length; - - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - - } else { - this.fillTable(processedTableData, cnt); - - } - if (!filter) { - this.tableResponse = processedTableData; - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['n.name'], isIgnoreCase); - const ui2Db = { 'name': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'n.name', 'desc', ui2Db); - const dateFilter =this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - - const cql = `MATCH (n:Commit) <-[r:COMMITTED]-(d:Developer {name: '${this.developer}' }) - WHERE ${dateFilter} - RETURN collect(ElementId(n))${r} as id, n.name as commit, size(collect(ElementId(n))) as totalDataCount`; - this._dbService.runQuery(cql, cb, DbResponseType.table); - - } - - loadGraph(skip: number, filter?: TableFiltering) { - if (!this.tableInput.isLoadGraph) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Get commits of the developer ${this.developer}`); }; - const cb = (x) => { - - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - }; - if (isClientSidePagination && filter && this.graphResponse) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(this.graphResponse), this.tableInput.isMergeGraph); - return; - } - - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition =this._h.getQueryCondition4TxtFilter(filter, ['n.name'], isIgnoreCase); - const ui2Db = { 'name': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(filter, 'n.name', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const cql = `MATCH (n:Commit) <-[r:COMMITTED]-(d:Developer {name: '${this.developer}' }) - WHERE ${dateFilter} - RETURN d,n,r - SKIP ${skip} LIMIT ${dataCnt}`; - this._dbService.runQuery(cql, fn); - - } - - - fillTable(data: CommitData[], totalDataCount: number | null) { - const uiColumns = ['id'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - - fillGenres(data) { - this.developers = []; - for (let i = 0; i < data.data.length; i++) { - this.developers.push(data.data[i].join('')); - } - this.filteredDevelopers = this.developers.slice(); - } - - filterOptions(value: string) { - this.filteredDevelopers = this.developers.filter(dev => - dev.toLowerCase().includes(value.toLowerCase()) - ); - } - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Get commits of the developer ${this.developer} (${names.join(", ")})`); - } - - const idFilter = this._h. buildIdFilter(e.dbIds); - const ui2Db = { 'name': 'n.name' }; - const orderExpr =this._h. getOrderByExpression4Query(null, 'n.name', 'desc', ui2Db); - const dateFilter = this._h.getDateRangeCQL(); - - - const cql = `MATCH (n:Commit) <-[r:COMMITTED]-(d:Developer {name: '${this.developer}' }) - WHERE ${idFilter} and ${dateFilter} - RETURN n,r,d - SKIP 0 LIMIT ${this.tableInput.pageSize}`; - this._dbService.runQuery(cql, cb); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - if (this.tableInput.isLoadGraph) { - this.loadGraph(skip, filter); - } - } - - filterTableResponse(x: CommitData[], filter: TableFiltering): CommitData[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: CommitData[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - - filterGraphResponse(x: GraphResponse): GraphResponse { - const r: GraphResponse = { nodes: [], edges: x.edges }; - - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNodeElementId]) { - nodeIdDict[x.edges[i].startNodeElementId] = true; - } - } - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].elementId]) { - r.nodes.push(x.nodes[i]); - } - } - return r; - } -} diff --git a/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.css b/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.css deleted file mode 100644 index 20428a61..00000000 --- a/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.css +++ /dev/null @@ -1,10 +0,0 @@ -.file-select{ - width: 20vw !important; - } - - .empty{ - border: 1px solid #c9cacb; - padding: 10px; - border-radius: 0.375rem; - text-align: center; - } \ No newline at end of file diff --git a/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.html b/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.html deleted file mode 100644 index 7bc11f9a..00000000 --- a/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.html +++ /dev/null @@ -1,54 +0,0 @@ -
-
-
- File - - - {{file}} - -
-
-
-
- - -
-
- -
-
- - -
-
- - -
-
- - -
-
-
- -
- - -
-
- - -
-
- - -
No expert recommendation can be provided.
\ No newline at end of file diff --git a/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.ts b/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.ts deleted file mode 100644 index 416b202e..00000000 --- a/src/app/custom/analyses/expert-recommendation/expert-recommendation.component.ts +++ /dev/null @@ -1,471 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import * as C from 'src/app/visuall/constants'; -import { Neo4jDb } from '../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../visuall/global-variable.service'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService} from '../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { getCyStyleFromColorAndWid, readTxtFile, isJson } from 'src/app/visuall/constants'; -import { GroupingOptionTypes } from '../../../visuall/user-preference'; -import { GroupCustomizationService } from 'src/app/custom/customization-service/group-customization.service'; -import { TheoreticPropertiesCustomService } from 'src/app/custom/customization-service/theoretic-properties-custom.service' -import { QueryComponent } from '../query.component.interface'; -import { trimEnd } from 'cypress/types/lodash'; - -export interface DeveloperData { - name: string; - score: number; - id: String; - -} -@Component({ - selector: 'app-expert-recommendation', - templateUrl: './expert-recommendation.component.html', - styleUrls: ['./expert-recommendation.component.css'] -}) -export class ExpertRecommendationComponent implements OnInit, QueryComponent { - githubHttpOptions: any; - authentication: any; - file: string; - fileId: string; - files: string[]; - filteredFiles: string[]= []; - fileIds: string[]; - possibleDevelopers: string[]; - developers = []; - scores = []; - developersName = []; - reviewers: string[] = []; - isObjectQuery = true; - commits = []; - seeds = []; - number = 3; - recency: boolean = false; - assigned: boolean = false - tableFilter: TableFiltering = { orderBy: null, orderDirection: null, txt: '', skip: null }; - tableInput: TableViewInput = { - columns: ['name', 'score'], results: [], results2: [], isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Developer', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: false, isNodeData: true, isSelect: false - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - cluster = true; - size = false; - readonly ZOOM_THRESHOLD = 0.8; - readonly NODE_SIZE = 40; - maxPropValue = 1; - currNodeSize = this.NODE_SIZE; - algorithm = null; - empty: boolean = false; - nodes = []; - edges = []; - - constructor(private http: HttpClient, private _dbService: Neo4jDb, private _cyService: CytoscapeService, - private _g: GlobalVariableService, private _group: GroupCustomizationService, private _gt: TheoreticPropertiesCustomService, private _h: QueryHelperService) { - this.files = []; - this.possibleDevelopers = []; - this.developers = []; - this.scores = []; - this.developersName = []; - this.commits = []; - } - - ngOnInit() { - - this._dbService.runQuery('MATCH (m:File) return m.name as name , elementId(m) as id order by m.name ', (x) => { - this.fillGenres(x) - }, DbResponseType.table); - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "File") { - this.file = this._g.cy.$(':selected')[0]._private.data.name; - } - else { - this.file = this.files[0] - } - let name = "" - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - setInterval(() => { - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "File" && this._g.cy.$(':selected')[0]._private.data.name !== name) { - name = this._g.cy.$(':selected')[0]._private.data.name - this.file = this._g.cy.$(':selected')[0]._private.data.name; - } - }, 500) - } - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - } - - - - loadTable(skip: number, filter?: TableFiltering) { - this.empty = false - this.developers = []; - this.scores = []; - this.fileId = this.fileIds[this.files.indexOf(this.file)] - - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - this.nodes = x.data[0][3] - this.edges = x.data[0][9] - this.developers = x.data[0][4] - this.scores = x.data[0][6] - let tableData = { - columns: [x.columns[4], x.columns[5], x.columns[6]], - data: [[x.data[0][4], x.data[0][5], x.data[0][6]]] - } - - if(this.developers.length == 0){ - this.empty = true - } - const processedTableData = this._h.preprocessTableDataZip(tableData, ['elementId'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = processedTableData.length; - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - } else { - this.fillTable(processedTableData, cnt); - } - if (!filter) { - this.tableResponse = processedTableData; - } - if (this.tableInput.isLoadGraph) { - - this.loadGraph(skip, this.tableFilter) - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition = this._h.getQueryCondition4TxtFilter(filter, ['score'], isIgnoreCase); - const ui2Db = { 'name': 'name', "score": "score" }; - const orderExpr = this._h.getOrderByExpression4Query(filter, 'score', 'desc', ui2Db); - - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - - const pageSize = this.getPageSize4Backend(); - const currPage = skip ? Math.floor(skip / pageSize) + 1 : 1; - const orderBy = 'score'; - let orderDir = 0; - const timeMap = this.getTimebarMapping4Java(); - let d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - let d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - d1 = 0; - d2 = 0; - } - - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - - const cbSub1 = (x) => { - this.possibleDevelopers = x.data[0][0][0] - if (this.possibleDevelopers.length > 0) { - this._dbService.runQuery(`CALL findNodesWithMostPathBetween(['${this.fileId}'], ['COMMENTED'],['${this.possibleDevelopers.join("','")}'],'${this.recency?'recency':'none'}',3,${this.number}, false, - ${pageSize}, ${currPage}, null, false, '${orderBy}', ${orderDir}, ${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, null)`, cb, DbResponseType.table, false); - } - else{ - this.empty = true - } - } - - this._dbService.runQuery(` MATCH (file:File) - WHERE elementId(file) = '${this.fileId}' - CALL apoc.path.subgraphAll(file, { relationshipFilter: null, minLevel: 0, maxLevel: 3, bfs: true }) - YIELD nodes, relationships - WITH [node IN nodes WHERE 'Developer' IN labels(node) | elementId(node)] AS NodeIDs - RETURN collect( distinct NodeIDs) as developersList `, cbSub1, DbResponseType.table, false); - } - - - loadGraph(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - this.seeds = [] - this._g.add2GraphHistory(`Expert recommendation for the file #${this.file}`); - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(x), this.tableInput.isMergeGraph); - this.seeds = [...this.developers]; - this.seeds.push(this.fileId) - const seedsSet = new Set(this.seeds.map(x => 'n' + x)); - const seedNodes = this._g.cy.nodes().filter(element => seedsSet.has(element.id())); - if (this._g.userPrefs.highlightStyles.length < 2) { - const cyStyle = getCyStyleFromColorAndWid('#0b9bcd', 4.5); - this._g.viewUtils.addHighlightStyle(cyStyle.node, cyStyle.edge); - } - const currHighlightIdx = this._g.userPrefs.currHighlightIdx.getValue(); - if (currHighlightIdx == 0) { - this._g.viewUtils.highlight(seedNodes, 1); - } else { - this._g.viewUtils.highlight(seedNodes, 0); - } - - - } else { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - this.clusterByDeveloper(); - this.devSize(); - }; - - if (this.edges.length > 0 || this.developers.length > 0) { - this._dbService.runQuery(`MATCH (N)-[R]-() WHERE elementId(N) in ['${this.nodes.join("','")}'] AND elementId(R) in ['${this.edges.join("','")}'] return N,R`, cb, DbResponseType.graph, false); - } - } - - fillTable(data: DeveloperData[], totalDataCount: number | null) { - const uiColumns = ['elementId'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string, TableDataType.string, TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - if(uiColumns[j] === "score"){ - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]].toFixed(2)) }) - }else{ - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - fillGenres(data) { - this.files = []; - this.fileIds = []; - for (let i = 0; i < data.data.length; i++) { - this.files.push(data.data[i][0]); - } - for (let i = 0; i < data.data.length; i++) { - this.fileIds.push(data.data[i][1]); - } - this.filteredFiles = this.files.slice(); - } - - - filterOptions(value: string) { - this.filteredFiles = this.files.filter(dev => - dev.toLowerCase().includes(value.toLowerCase()) - ); - } - - getDataForQueryResult(e: TableRowMeta) { - const cb = (x) => { - this.seeds = [] - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph) - this.seeds = [...e.dbIds]; - this.seeds.push(this.fileId) - const seedsSet = new Set(this.seeds.map(x => 'n' + x)); - const seedNodes = this._g.cy.nodes().filter(element => seedsSet.has(element.id())); - if (this._g.userPrefs.highlightStyles.length < 2) { - const cyStyle = getCyStyleFromColorAndWid('#0b9bcd', 4.5); - this._g.viewUtils.addHighlightStyle(cyStyle.node, cyStyle.edge); - } - const currHighlightIdx = this._g.userPrefs.currHighlightIdx.getValue(); - if (currHighlightIdx == 0) { - this._g.viewUtils.highlight(seedNodes, 1); - } else { - this._g.viewUtils.highlight(seedNodes, 0); - } - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Expert recommendation for the file #${this.file} (${names.join(", ")})`); - this.clusterByDeveloper(); - this.devSize(); - } - - const idFilter = e.dbIds.join("','"); - const ui2Db = { 'Title': 'n.primary_title' }; - const orderExpr = this._h.getOrderByExpression4Query(null, 'score', 'desc', ui2Db); - const pageSize = this.getPageSize4Backend(); - const orderBy = 'score'; - let orderDir = 0; - const timeMap = this.getTimebarMapping4Java(); - let d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - let d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - d1 = 0; - d2 = 0; - } - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - this._dbService.runQuery(`CALL findNodesWithMostPathBetween(['${this.fileId}'], ['COMMENTED'],['${idFilter}'],'${this.recency?'recency':'none'}',3,${this.number}, false, - ${pageSize}, 1, null, false, '${orderBy}', ${orderDir}, ${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, null)`, cb, DbResponseType.graph, false); - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - } - - - filterTableResponse(x: DeveloperData[], filter: TableFiltering): DeveloperData[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: DeveloperData[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - - // tableInput is already filtered. Use that to filter graph elements. - // For this query, we should specifically bring the related nodes and their 1-neighborhood - filterGraphResponse(x: GraphResponse): GraphResponse { - /* - const r: GraphResponse = { nodes: [], edges: x.edges }; - const nodeIdDict = {}; - for (let i = 0; i < this.tableInput.results.length; i++) { - nodeIdDict[this.tableInput.results[i][0].val] = true; - } - // add a node if an edge ends with that - for (let i = 0; i < x.edges.length; i++) { - if (nodeIdDict[x.edges[i].endNode]) { - nodeIdDict[x.edges[i].startNode] = true; - } - } - - for (let i = 0; i < x.nodes.length; i++) { - if (nodeIdDict[x.nodes[i].id]) { - r.nodes.push(x.nodes[i]); - } - } - */ - return x; - } - - //Cluster by developer - clusterByDeveloper() { - if (this.cluster) { - this._cyService.expandAllCompounds(); - this._cyService.deleteClusteringNodes(); - this._g.performLayout(false); - this._cyService.changeGroupingOption(GroupingOptionTypes.compound) - const seedNodes = this.developers.map(x => 'n' + x); - this._group.clusterByDeveloper(seedNodes) - } - else { - // expand all collapsed without animation (sync) - this._g.expandCollapseApi.expandAll(C.EXPAND_COLLAPSE_FAST_OPT); - const compounNodes = this._g.cy.$('.' + C.CLUSTER_CLASS); - /* - let clusterSelector = ''; - C.CLUSTER_CLASS.forEach((className, index) => { - if (index !== 0) { - // Add a comma and a space before adding the next class - clusterSelector += ', '; - } - // Concatenate the class name - clusterSelector += '.' + className; - }); - const compounNodes = this._g.cy.$(clusterSelector); - */ - const clusters: string[][] = []; - for (let i = 0; i < compounNodes.length; i++) { - //const cluster = compounNodes[i].children().not(clusterSelector).map(x => x.id()); - const cluster = compounNodes[i].children().not('.' + C.CLUSTER_CLASS).map(x => x.id()); - clusters.push(cluster); - } - this._g.layout.clusters = clusters; - // delete the compound nodes - this._cyService.removeGroup4Selected(this._g.cy.nodes('.' + C.CLUSTER_CLASS), true, true); - //this._cyService.removeGroup4Selected(this._g.cy.nodes(clusterSelector), true, true); - } - - } - devSize() { - if (this.size) { - let devs = this._g.cy.collection(); - this.developers.forEach(id =>{ - devs = devs.union(this._g.cy.$id(`n${id}`)); - }) - this._gt.knowAboutScore(devs, this.scores) - this._gt.showHideBadges(true) - } - else { - for (let i = 0; i < this.developers.length - 1; i++) { - let element = this._g.cy.nodes(`[id = "n${this.developers[i]}"]`)[0]; - if (element._private.classes.values().next().value == 'Developer') { - element.removeClass('graphTheoreticDisplay') - } - - } - this._gt.showHideBadges(false) - - } - - } - private getPageSize4Backend(): number { - let pageSize = this._g.userPrefs.dataPageSize.getValue(); - if (this._g.userPrefs.queryResultPagination.getValue() == 'Client') { - pageSize = pageSize * this._g.userPrefs.dataPageLimit.getValue(); - } - return pageSize; - } - - private getTimebarMapping4Java(): string { - // {Person:["start_t", "end_t"]} - const mapping = this._g.appDescription.getValue().timebarDataMapping; - let s = '{' - for (const k in mapping) { - s += k + ':["' + mapping[k].begin_datetime + '","' + mapping[k].end_datetime + '"],'; - } - s = s.slice(0, -1); - s += '}' - return s; - } -} \ No newline at end of file diff --git a/src/app/custom/analyses/query-helper.service.ts b/src/app/custom/analyses/query-helper.service.ts deleted file mode 100644 index c375bb22..00000000 --- a/src/app/custom/analyses/query-helper.service.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Injectable } from '@angular/core'; -import { TableFiltering } from '../../shared/table-view/table-view-types'; -import { GlobalVariableService } from '../../visuall/global-variable.service'; -import { CytoscapeService } from '../../visuall/cytoscape.service'; - -@Injectable({ - providedIn: 'root' -}) -export class QueryHelperService { - - - constructor(private _g: GlobalVariableService, private _cyService: CytoscapeService) {} - -getQueryCondition4TxtFilter(filter: TableFiltering, cols: string[], isIgnoreCase: boolean): string { - if (filter == null || filter.txt.length < 1) { - return ''; - } - let s = ''; - - for (let i = 0; i < cols.length; i++) { - if (isIgnoreCase) { - s += ` LOWER(toString(${cols[i]})) CONTAINS LOWER('${filter.txt}') OR `; - } else { - s += ` toString(${cols[i]}) CONTAINS '${filter.txt}' OR `; - } - } - s = s.slice(0, -3); - s = 'AND (' + s + ')'; - return s; -} - - - -getOrderByExpression4Query(filter: TableFiltering, orderBy: string, orderDirection: string, ui2Db: any) { - if (filter != null && filter.orderDirection.length > 0 && filter.orderBy.length > 0) { - orderBy = ui2Db[filter.orderBy]; - orderDirection = filter.orderDirection; - } - return orderBy + ' ' + orderDirection; -} - -buildIdFilter(ids: string[] | number[], hasEnd = false, isEdgeQuery = false): string { - if (ids === undefined) { - return ''; - } - let varName = 'n'; - if (isEdgeQuery) { - varName = 'e'; - } - let cql = ''; - if (ids.length > 0) { - cql = '('; - } - for (let i = 0; i < ids.length; i++) { - cql += `ElementId(${varName})='${ids[i]}' OR ` - } - - if (ids.length > 0) { - cql = cql.slice(0, -4); - - cql += ')'; - if (hasEnd) { - cql += ' AND '; - } - } - return cql; -} - -preprocessTableDataZip(data, uiColumns): any[] { - console.log(data) - const dbColumns = data.columns as string[]; - let columnMapping = []; - for (let i = 0; i < uiColumns.length; i++) { - columnMapping.push(dbColumns.indexOf(uiColumns[i])); - } - const rawData = data.data[0]; - const objArr: any[] = []; - for (let i = 0; i < rawData[0].length; i++) { - const obj = {}; - for (let j = 0; j < columnMapping.length; j++) { - obj[uiColumns[j]] = rawData[columnMapping[j]][i]; - } - objArr.push(obj as any) - } - return objArr; -} - -preprocessTableData(data, uiColumns): any[] { - const dbColumns = data.columns as string[]; - let columnMapping = []; - for (let i = 0; i < uiColumns.length; i++) { - columnMapping.push(dbColumns.indexOf(uiColumns[i])); - } - const rawData = data.data; - const objArr: any[] = []; - for (let i = 0; i < rawData.length; i++) { - const obj = {}; - for (let j = 0; j < columnMapping.length; j++) { - obj[uiColumns[j]] = rawData[i][columnMapping[j]]; - } - objArr.push(obj as any) - } - return objArr; -} - - -getDateRangeCQL() { - - const isLimit = this._g.userPrefs.isLimitDbQueries2range.getValue(); - if (!isLimit) { - return 'TRUE'; - } - const d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - const d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - const a = new Date(d1); - const c = new Date(d2); - const b = a.toISOString() - const d = c.toISOString() - - return ` ${d2} >= n.createdAt AND ${d1}<= n.closeDate`; -} - -} \ No newline at end of file diff --git a/src/app/custom/analyses/query.component.interface.ts b/src/app/custom/analyses/query.component.interface.ts deleted file mode 100644 index 65d2be5a..00000000 --- a/src/app/custom/analyses/query.component.interface.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TableViewInput, TableFiltering, TableData } from '../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { GraphResponse } from 'src/app/visuall/db-service/data-types'; - -export interface QueryComponent { - tableInput: TableViewInput; - tableFilled: Subject; - tableResponse: T; - graphResponse: GraphResponse; - clearTableFilter: Subject; - - ngOnInit(): void; - prepareQuery(): void; - loadTable(skip: number, filter?: TableFiltering): void; - loadGraph(skip: number, filter?: TableFiltering): void; - filterGraphResponse(x: GraphResponse): GraphResponse; - fillTable(data: T[], totalDataCount: number | null): void; - getDataForQueryResult(e: any): void; - filterTable(filter: TableFiltering): void; - filterTableResponse(x: T[], filter: TableFiltering): T[]; -} \ No newline at end of file diff --git a/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.css b/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.css deleted file mode 100644 index a4d64626..00000000 --- a/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.css +++ /dev/null @@ -1,9 +0,0 @@ -.pr-select{ - width: 50px !important; -} -.empty{ - border: 1px solid #c9cacb; - padding: 10px; - border-radius: 0.375rem; - text-align: center; -} \ No newline at end of file diff --git a/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.html b/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.html deleted file mode 100644 index f84b3b1f..00000000 --- a/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.html +++ /dev/null @@ -1,59 +0,0 @@ -
-
-
- Pull Request - - - #{{pr}} - -
-
-
-
- - -
-
- -
-
- - -
-
- - -
-
- - -
-
-
- -
- - -
-
- - -
-
- - - - -
No reviewer recommendation can be provided.
-
- -
\ No newline at end of file diff --git a/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.ts b/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.ts deleted file mode 100644 index 8a155e8c..00000000 --- a/src/app/custom/analyses/reviewer-recommendation/reviewer-recommendation.component.ts +++ /dev/null @@ -1,572 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import * as C from 'src/app/visuall/constants'; -import { Neo4jDb } from '../../../visuall/db-service/neo4j-db.service'; -import { CytoscapeService } from '../../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../../visuall/global-variable.service'; -import { formatNumber } from '@angular/common'; -import { TableViewInput, TableDataType, TableFiltering, TableRowMeta, TableData } from '../../../shared/table-view/table-view-types'; -import { Subject } from 'rxjs'; -import { QueryHelperService } from '../query-helper.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { getCyStyleFromColorAndWid, readTxtFile, isJson } from 'src/app/visuall/constants'; -import { GroupingOptionTypes } from '../../../visuall/user-preference'; -import { GroupCustomizationService } from 'src/app/custom/customization-service/group-customization.service'; -import { TheoreticPropertiesCustomService } from 'src/app/custom/customization-service/theoretic-properties-custom.service' -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ModalContentComponent } from '../../operational-tabs/object-tab/modal-content/modal-content.component'; -import { QueryComponent } from '../query.component.interface'; -import { ActivatedRoute } from '@angular/router'; -export interface DeveloperData { - name: string; - score: number; - id: string; -} -@Component({ - selector: 'app-reviewer-recommendation', - templateUrl: './reviewer-recommendation.component.html', - styleUrls: ['./reviewer-recommendation.component.css'] -}) -export class ReviewerRecommendationComponent implements OnInit, QueryComponent { - githubHttpOptions: any; - authentication: any; - pr: string; - prId: string; - prs: string[]; - filteredPrs: string[] = []; - prIds: string[]; - developers = []; - nodes = []; - edges = []; - scores = []; - fileIds = []; - possibleDevelopers: string[] = []; - reviewers: string[] = []; - commits = []; - seeds = []; - number = 3; - assigned: boolean = false - empty: boolean = false - tableFilter: TableFiltering = { orderBy: null, orderDirection: null, txt: '', skip: null }; - tableInput: TableViewInput = { - columns: ['name', 'score'], results: [], results2: [], isEmphasizeOnHover: true, tableTitle: 'Query Results', classNameOfObjects: 'Developer', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: false, isNodeData: true, isSelect: true - }; - tableFilled = new Subject(); - tableResponse = null; - graphResponse = null; - clearTableFilter = new Subject(); - cluster = true; - size = false; - readonly ZOOM_THRESHOLD = 0.8; - readonly NODE_SIZE = 40; - maxPropValue = 1; - currNodeSize = this.NODE_SIZE; - algorithm = null; - recency: boolean = false; - - constructor( - private http: HttpClient, - private _dbService: Neo4jDb, - private _cyService: CytoscapeService, - private _g: GlobalVariableService, - private _group: GroupCustomizationService, - private _gt: TheoreticPropertiesCustomService, - private modalService: NgbModal, - private _h: QueryHelperService, - private route: ActivatedRoute - ) { - this.prs = []; - this.developers = []; - this.scores = []; - this.fileIds = []; - this.possibleDevelopers = []; - this.commits = []; - } - - ngOnInit() { - this._dbService.runQuery('MATCH (m:PullRequest) return m.name as name , elementId(m) as id order by m.name ', (x) => { - this.fillOptions(x) - this.route.queryParamMap.subscribe(params => { - if (params.get('pr')) { - this.size = true; - this.cluster = true; - this.recency = true; - this.tableInput.isLoadGraph = true; - this.prepareQuery() - } - }); - }, DbResponseType.table); - let name = "" - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "PullRequest") { - this.pr = this._g.cy.$(':selected')[0]._private.data.name; - } - this.tableInput.results = []; - this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; }); - setInterval(() => { - if (this._g.cy.$(':selected').length > 0 && this._g.cy.$(':selected')[0]._private.classes.values().next().value === "PullRequest" && this._g.cy.$(':selected')[0]._private.data.name !== name) { - name = this._g.cy.$(':selected')[0]._private.data.name - this.pr = this._g.cy.$(':selected')[0]._private.data.name; - } - }, 500) - } - - prepareQuery() { - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - this.loadTable(skip); - } - - loadTable(skip: number, filter?: TableFiltering) { - this.empty = false - this.assigned = false - this.prId = this.prIds[this.prs.indexOf(this.pr)] - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - - const cb = (x) => { - this.nodes = x.data[0][3] - this.edges = x.data[0][9] - this.developers = x.data[0][4] - this.scores = x.data[0][6] - let tableData = { - columns: [x.columns[4], x.columns[5], x.columns[6]], - data: [[x.data[0][4], x.data[0][5], x.data[0][6]]] - } - if (this.developers.length > 0) { - this.assigned = true - } - else { - this.assigned = false - } - const processedTableData = this._h.preprocessTableDataZip(tableData, ['elementId'].concat(this.tableInput.columns)); - const limit4clientSidePaginated = this._g.userPrefs.dataPageSize.getValue() * this._g.userPrefs.dataPageLimit.getValue(); - let cnt = processedTableData.length; - if (isClientSidePagination && cnt > limit4clientSidePaginated) { - cnt = limit4clientSidePaginated; - } - if (isClientSidePagination) { - this.fillTable(this.filterTableResponse(processedTableData, filter), cnt); - } else { - this.fillTable(processedTableData, cnt); - } - if (!filter) { - this.tableResponse = processedTableData; - } - if (this.tableInput.isLoadGraph) { - - this.loadGraph(skip, this.tableFilter) - - } - }; - if (isClientSidePagination && filter) { - this.fillTable(this.filterTableResponse(this.tableResponse, filter), null); - return; - } - //const idFilter = this._h. buildIdFilter(e.dbIds); - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const txtCondition = this._h.getQueryCondition4TxtFilter(filter, ['score'], isIgnoreCase); - const ui2Db = { 'name': 'name', "score": "score" }; - const orderExpr = this._h.getOrderByExpression4Query(filter, 'score', 'desc', ui2Db); - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - - const pageSize = this.getPageSize4Backend(); - const currPage = skip ? Math.floor(skip / pageSize) + 1 : 1; - const orderBy = 'score'; - let orderDir = 0; - const timeMap = this.getTimebarMapping4Java(); - let d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - let d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - d1 = 0; - d2 = 0; - } - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - const cbSub1 = (x) => { - this.fileIds = x.data[0][0] - if (this.fileIds.length > 0) { - this._dbService.runQuery(` MATCH (file:File) - WHERE elementId(file) IN ['${this.fileIds.join("','")}'] - CALL apoc.path.subgraphAll(file, { relationshipFilter: null, minLevel: 0, maxLevel: 3, bfs: true }) - YIELD nodes, relationships - WITH [node IN nodes WHERE 'Developer' IN labels(node) | elementId(node)] AS NodeIDs - RETURN collect( distinct NodeIDs) as list `, cbSub2, DbResponseType.table, false); - } - else{ - this.empty = true - } - } - const cbSub2 = (x) => { - this.possibleDevelopers = Array.from(new Set(x.data[0][0].flat())); - if (this.possibleDevelopers.length > 0) { - this._dbService.runQuery(`MATCH (N:PullRequest{name:'${this.pr}'})-[:INCLUDES]-(c:Commit)-[:COMMITTED]-(d:Developer) - WITH collect(distinct elementId(d)) AS ignoreDevs return ignoreDevs`, cbSub3, DbResponseType.table, false); - } - else{ - this.empty = true - } - } - const cbSub3 = (x) => { - let ignoredDevelopers = x.data[0][0] - this.possibleDevelopers = this.possibleDevelopers.filter(dev => !ignoredDevelopers.includes(dev)); - if (this.possibleDevelopers.length > 0) { - this._dbService.runQuery(`CALL findNodesWithMostPathBetween(['${this.fileIds.join("','")}'], ['COMMENTED'],['${this.possibleDevelopers.join("','")}'],'${this.recency ? 'recency' : 'none'}',3,${this.number}, false, - ${pageSize}, ${currPage}, null, false, '${orderBy}', ${orderDir}, ${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, null)`, cb, DbResponseType.table, false); - } - else { - this.empty = true - } - } - - - this._dbService.runQuery(`MATCH (N:PullRequest{name:'${this.pr}'})-[:INCLUDES]-(c:Commit)-[:CONTAINS]-(f:File) WITH collect(distinct elementId(f)) AS fileIds RETURN fileIds`, cbSub1, DbResponseType.table, false); - - } - - loadGraph(skip: number, filter?: TableFiltering) { - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - this.seeds = [] - this._g.add2GraphHistory(`Reviewer recommendation for the pull request #${this.pr}`); - const cbSub1 = (y) => { - let result = x - result.nodes = result.nodes.concat(y.nodes) - result.edges = result.edges.concat(y.edges) - //If number of files more than 300 we will filter file nodes - /* - if (this.fileIds.length > 300) { - result.nodes = result.nodes.filter(node => !node.labels.includes("File")); - } - */ - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(result), this.tableInput.isMergeGraph); - this.seeds = [...this.developers]; - this.seeds.push(this.prId) - const seedsSet = new Set(this.seeds.map(x => 'n' + x)); - const seedNodes = this._g.cy.nodes().filter(element => seedsSet.has(element.id())); - if (this._g.userPrefs.highlightStyles.length < 2) { - const cyStyle = getCyStyleFromColorAndWid('#0b9bcd', 4.5); - this._g.viewUtils.addHighlightStyle(cyStyle.node, cyStyle.edge); - } - const currHighlightIdx = this._g.userPrefs.currHighlightIdx.getValue(); - if (currHighlightIdx == 0) { - this._g.viewUtils.highlight(seedNodes, 1); - } else { - this._g.viewUtils.highlight(seedNodes, 0); - } - } - else { - this._cyService.loadElementsFromDatabase(result, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - this.clusterByDeveloper(); - this.devSize(); - } - this._dbService.runQuery(`MATCH p=(N:PullRequest{name:'${this.pr}'})-[:INCLUDES]-(c:Commit)-[:CONTAINS]-(f:File) RETURN p`, cbSub1, DbResponseType.graph, false); - } - if (this.edges.length > 0 || this.developers.length > 0) { - this._dbService.runQuery(`MATCH (N)-[R]-() WHERE elementId(N) in ['${this.nodes.join("','")}'] AND elementId(R) in ['${this.edges.join("','")}'] return N,R`, cb, DbResponseType.graph, false); - } - } - - fillTable(data: DeveloperData[], totalDataCount: number | null) { - const uiColumns = ['elementId'].concat(this.tableInput.columns); - const columnTypes = [TableDataType.string, TableDataType.string, TableDataType.string, TableDataType.string]; - - this.tableInput.results = []; - for (let i = 0; i < data.length; i++) { - const row: TableData[] = []; - for (let j = 0; j < uiColumns.length; j++) { - if(uiColumns[j] === "score"){ - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]].toFixed(2)) }) - } else { - row.push({ type: columnTypes[j], val: String(data[i][uiColumns[j]]) }) - } - } - row.push(); - this.tableInput.results.push(row) - - } - if (totalDataCount) { - this.tableInput.resultCnt = totalDataCount; - } - - this.tableFilled.next(true); - } - - fillOptions(data) { - this.prs = []; - this.prIds = []; - for (let i = 0; i < data.data.length; i++) { - this.prs.push(data.data[i][0]); - } - for (let i = 0; i < data.data.length; i++) { - this.prIds.push(data.data[i][1]); - } - this.filteredPrs = this.prs.slice(); - } - filterOptions(value: string) { - this.filteredPrs = this.prs.filter(pr => - pr.toLowerCase().includes(value.toLowerCase()) - ); - } - - getDataForQueryResult(e: TableRowMeta) { - let filter = this.tableFilter; - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - const idFilter = e.dbIds.join("','"); - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const cb = (x) => { - this.seeds = [] - - const cbSub1 = (y) => { - let result = x - result.nodes = result.nodes.concat(y.nodes) - result.edges = result.edges.concat(y.edges) - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase(this.filterGraphResponse(result), this.tableInput.isMergeGraph); - this.seeds = [...this.developers]; - this.seeds.push(this.prId) - const seedsSet = new Set(this.seeds.map(x => 'n' + x)); - const seedNodes = this._g.cy.nodes().filter(element => seedsSet.has(element.id())); - if (this._g.userPrefs.highlightStyles.length < 2) { - const cyStyle = getCyStyleFromColorAndWid('#0b9bcd', 4.5); - this._g.viewUtils.addHighlightStyle(cyStyle.node, cyStyle.edge); - } - const currHighlightIdx = this._g.userPrefs.currHighlightIdx.getValue(); - if (currHighlightIdx == 0) { - this._g.viewUtils.highlight(seedNodes, 1); - } else { - this._g.viewUtils.highlight(seedNodes, 0); - } - } - else { - this._cyService.loadElementsFromDatabase(result, this.tableInput.isMergeGraph); - } - if (!filter || this.graphResponse == null) { - this.graphResponse = x; - } - const names = [] - e.dbIds.forEach(nodeId => { - names.push(this._g.cy.$id(`n${nodeId}`)._private.data.name) - }); - this._g.add2GraphHistory(`Reviewer recommendation for the pull request #${this.pr} (${names.join(", ")})`); - this.clusterByDeveloper(); - this.devSize(); - } - this._dbService.runQuery(`MATCH p=(N:PullRequest{name:'${this.pr}'})-[:INCLUDES]-(c:Commit)-[:CONTAINS]-(f:File) RETURN p`, cbSub1, DbResponseType.graph, false); - }; - let dataCnt = this.tableInput.pageSize; - if (isClientSidePagination) { - dataCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - } - const r = `[${skip}..${skip + dataCnt}]`; - - const t = filter.txt ?? ''; - const pageSize = this.getPageSize4Backend(); - const currPage = filter.skip ? Math.floor(filter.skip / pageSize) + 1 : 1; - const orderBy = 'score'; - let orderDir = 0; - if (filter.orderDirection == 'desc') { - orderDir = 1; - } else if (filter.orderDirection == '') { - orderDir = 2; - } - const timeMap = this.getTimebarMapping4Java(); - let d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - let d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - d1 = 0; - d2 = 0; - } - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - if (this.fileIds.length > 0 && this.possibleDevelopers.length > 0) { - this._dbService.runQuery(`CALL findNodesWithMostPathBetween(['${this.fileIds.join("','")}'], ['COMMENTED'],['${idFilter}'],'${this.recency ? 'recency' : 'none'}',3,${this.number}, false, - ${pageSize}, ${currPage}, null, false, '${orderBy}', ${orderDir}, ${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, null)`, cb, DbResponseType.graph, false); - } - } - - filterTable(filter: TableFiltering) { - this.tableInput.currPage = 1; - let skip = filter.skip ? filter.skip : 0; - this.loadTable(skip, filter); - } - - - filterTableResponse(x: DeveloperData[], filter: TableFiltering): DeveloperData[] { - if (!filter || ((!filter.txt || filter.txt.length < 1) && filter.orderDirection == '' && (!filter.skip || filter.skip == 0))) { - const skip = filter && filter.skip ? filter.skip : 0; - this.tableInput.resultCnt = x.length; - return x.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let filtered: DeveloperData[] = []; - - for (let i = 0; i < x.length; i++) { - const s = Object.values(x[i]).join(''); - if ((isIgnoreCase && s.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && s.includes(filter.txt))) { - filtered.push(x[i]); - } - } - - // order by - if (filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] > b[o]) return 1; if (b[o] > a[o]) return -1; return 0 }); - } else { - filtered = filtered.sort((a, b) => { if (!a[o]) return 1; if (!b[o]) return -1; if (a[o] < b[o]) return 1; if (b[o] < a[o]) return -1; return 0 }); - } - } - if (filter) { - this.tableInput.resultCnt = filtered.length; - } - const skip = filter && filter.skip ? filter.skip : 0; - return filtered.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - } - - - filterGraphResponse(x: GraphResponse): GraphResponse { - return x; - } - - //Cluster by developer - clusterByDeveloper() { - if (this.cluster) { - this._cyService.expandAllCompounds(); - this._cyService.deleteClusteringNodes(); - this._g.performLayout(false); - this._cyService.changeGroupingOption(GroupingOptionTypes.compound) - const seedNodes = this.developers.map(x => 'n' + x); - this._group.clusterByDeveloper(seedNodes) - } - else { - // expand all collapsed without animation (sync) - this._g.expandCollapseApi.expandAll(C.EXPAND_COLLAPSE_FAST_OPT); - const compounNodes = this._g.cy.$('.' + C.CLUSTER_CLASS); - const clusters: string[][] = []; - for (let i = 0; i < compounNodes.length; i++) { - const cluster = compounNodes[i].children().not('.' + C.CLUSTER_CLASS).map(x => x.id()); - clusters.push(cluster); - } - this._g.layout.clusters = clusters; - // delete the compound nodes - this._cyService.removeGroup4Selected(this._g.cy.nodes('.' + C.CLUSTER_CLASS), true, true); - } - - } - getHtml(badges: number[]): string { - let s = ''; - for (let i = 0; i < badges.length; i++) { - s += `${formatNumber(badges[i], 'en', '1.0-2')}` - } - return s; - } - - devSize() { - if (this.size) { - let devs = this._g.cy.collection(); - this.developers.forEach(id => { - devs = devs.union(this._g.cy.$id(`n${id}`)); - }) - this._gt.knowAboutScore(devs, this.scores) - this._gt.showHideBadges(true) - } - else { - for (let i = 0; i < this.developers.length - 1; i++) { - let element = this._g.cy.nodes(`[id = "n${this.developers[i]}"]`)[0]; - if (element._private.classes.values().next().value == 'Developer') { - element.removeClass('graphTheoreticDisplay') - } - - } - this._gt.showHideBadges(false) - - } - - } - private getPageSize4Backend(): number { - let pageSize = this._g.userPrefs.dataPageSize.getValue(); - if (this._g.userPrefs.queryResultPagination.getValue() == 'Client') { - pageSize = pageSize * this._g.userPrefs.dataPageLimit.getValue(); - } - return pageSize; - } - openModal(templateType, name?, url?, title?, message?): void { - const modalRef = this.modalService.open(ModalContentComponent); - modalRef.componentInstance.name = name; // Pass data to the modal component - modalRef.componentInstance.url = url; - modalRef.componentInstance.templateType = templateType; - modalRef.componentInstance.message = message; - modalRef.componentInstance.title = title; - } - - private getTimebarMapping4Java(): string { - // {Person:["start_t", "end_t"]} - const mapping = this._g.appDescription.getValue().timebarDataMapping; - let s = '{' - for (const k in mapping) { - s += k + ':["' + mapping[k].begin_datetime + '","' + mapping[k].end_datetime + '"],'; - } - s = s.slice(0, -1); - s += '}' - return s; - } - - assign() { - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/getAuthentication" : - `http://${window.location.hostname}:4445/getAuthentication`; - this.http.get(url).subscribe(data => { - this.authentication = data; - this.githubHttpOptions = { - headers: new HttpHeaders({ - 'Authorization': `Bearer ${this.authentication.github.access_token}`, - 'Accept': 'application/vnd.github.v3+json', - "X-GitHub-Api-Version": "2022-11-28", - 'Content-Type': 'application/json' - }) - }; - if (this.authentication.authenticated) { - this.reviewers = this.tableInput.results.filter((_, i) => this.tableInput.results2[i]).map(x => x[1].val) as string[]; - const url = `https://api.github.com/repos/${this.authentication.github.github_repo}/pulls/${this.pr}/requested_reviewers`; - const headers = { - 'Accept': 'application/vnd.github+json', - 'Authorization': `Bearer ${this.authentication.github.access_token}`, - 'X-GitHub-Api-Version': '2022-11-28', - 'Content-Type': 'application/json' - }; - const body = { - reviewers: this.reviewers - }; - - this.http.post(url, body, { headers }).subscribe( - (response) => { - this.openModal('assigned', "Pull Request " + this.pr, response["html_url"]); - console.log('Reviewers added successfully:', response); - }, - (error) => { - console.log(error.error.message); - this.openModal('error', undefined, undefined, "Assignment error", error.error.message); - } - - ); - } else { - this.openModal('error', undefined, undefined, "You are not authenticated", "You are not authenticated for performing this task") - } - } - ); - } - -} - - diff --git a/src/app/custom/assets/.DS_Store b/src/app/custom/assets/.DS_Store deleted file mode 100644 index 36ceb121..00000000 Binary files a/src/app/custom/assets/.DS_Store and /dev/null differ diff --git a/src/app/custom/assets/commit-git.png b/src/app/custom/assets/commit-git.png deleted file mode 100644 index 27f7fd25..00000000 Binary files a/src/app/custom/assets/commit-git.png and /dev/null differ diff --git a/src/app/custom/assets/commit.svg b/src/app/custom/assets/commit.svg deleted file mode 100644 index 685387bd..00000000 --- a/src/app/custom/assets/commit.svg +++ /dev/null @@ -1,75 +0,0 @@ - - -Created with Fabric.js 3.5.0 - - - - - - - diff --git a/src/app/custom/assets/developer.png b/src/app/custom/assets/developer.png deleted file mode 100644 index 1220cd0a..00000000 Binary files a/src/app/custom/assets/developer.png and /dev/null differ diff --git a/src/app/custom/assets/developer.svg b/src/app/custom/assets/developer.svg deleted file mode 100644 index 8e828ba1..00000000 --- a/src/app/custom/assets/developer.svg +++ /dev/null @@ -1,89 +0,0 @@ - - -Created with Fabric.js 3.5.0 - - - - - - - - - - - - - - - - - - - diff --git a/src/app/custom/assets/file.png b/src/app/custom/assets/file.png deleted file mode 100644 index d058bad0..00000000 Binary files a/src/app/custom/assets/file.png and /dev/null differ diff --git a/src/app/custom/assets/file.svg b/src/app/custom/assets/file.svg deleted file mode 100644 index 12fa1ce4..00000000 --- a/src/app/custom/assets/file.svg +++ /dev/null @@ -1,105 +0,0 @@ - - -Created with Fabric.js 3.5.0 - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/app/custom/assets/issue-priority/Blocker.svg b/src/app/custom/assets/issue-priority/Blocker.svg deleted file mode 100644 index 93fe81aa..00000000 --- a/src/app/custom/assets/issue-priority/Blocker.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-priority/Critical.svg b/src/app/custom/assets/issue-priority/Critical.svg deleted file mode 100644 index 38605876..00000000 --- a/src/app/custom/assets/issue-priority/Critical.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-priority/High.svg b/src/app/custom/assets/issue-priority/High.svg deleted file mode 100644 index 3607057e..00000000 --- a/src/app/custom/assets/issue-priority/High.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-priority/Highest.svg b/src/app/custom/assets/issue-priority/Highest.svg deleted file mode 100644 index dd3a70cb..00000000 --- a/src/app/custom/assets/issue-priority/Highest.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-priority/Low.svg b/src/app/custom/assets/issue-priority/Low.svg deleted file mode 100644 index 04260f44..00000000 --- a/src/app/custom/assets/issue-priority/Low.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-priority/Lowest.svg b/src/app/custom/assets/issue-priority/Lowest.svg deleted file mode 100644 index 275df1ba..00000000 --- a/src/app/custom/assets/issue-priority/Lowest.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-priority/Major.svg b/src/app/custom/assets/issue-priority/Major.svg deleted file mode 100644 index dd3a70cb..00000000 --- a/src/app/custom/assets/issue-priority/Major.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-priority/Medium.svg b/src/app/custom/assets/issue-priority/Medium.svg deleted file mode 100644 index 0b532817..00000000 --- a/src/app/custom/assets/issue-priority/Medium.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - -icon/16px/medium-priority -Created with Sketch. - - - - - - diff --git a/src/app/custom/assets/issue-priority/Minor.svg b/src/app/custom/assets/issue-priority/Minor.svg deleted file mode 100644 index 04260f44..00000000 --- a/src/app/custom/assets/issue-priority/Minor.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-priority/Other.svg b/src/app/custom/assets/issue-priority/Other.svg deleted file mode 100644 index 0b532817..00000000 --- a/src/app/custom/assets/issue-priority/Other.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - -icon/16px/medium-priority -Created with Sketch. - - - - - - diff --git a/src/app/custom/assets/issue-priority/Trivial.svg b/src/app/custom/assets/issue-priority/Trivial.svg deleted file mode 100644 index 275df1ba..00000000 --- a/src/app/custom/assets/issue-priority/Trivial.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/Bug.svg b/src/app/custom/assets/issue-types/Bug.svg deleted file mode 100644 index 9fb83388..00000000 --- a/src/app/custom/assets/issue-types/Bug.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/Epic.svg b/src/app/custom/assets/issue-types/Epic.svg deleted file mode 100644 index 8d3949b4..00000000 --- a/src/app/custom/assets/issue-types/Epic.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - epic - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/Improvement.svg b/src/app/custom/assets/issue-types/Improvement.svg deleted file mode 100644 index 22aa2b1e..00000000 --- a/src/app/custom/assets/issue-types/Improvement.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - defect - Created with Sketch. - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/New Feature.svg b/src/app/custom/assets/issue-types/New Feature.svg deleted file mode 100644 index 65a5c093..00000000 --- a/src/app/custom/assets/issue-types/New Feature.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - new_feature - Created with Sketch. - - - - - - - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/Other.svg b/src/app/custom/assets/issue-types/Other.svg deleted file mode 100644 index 82b1427c..00000000 --- a/src/app/custom/assets/issue-types/Other.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - generic_issue - Created with Sketch. - - - - - - - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/Story.svg b/src/app/custom/assets/issue-types/Story.svg deleted file mode 100644 index c1516b2a..00000000 --- a/src/app/custom/assets/issue-types/Story.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - story - Created with Sketch. - - - - - - - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/Sub-task.svg b/src/app/custom/assets/issue-types/Sub-task.svg deleted file mode 100644 index 8972ce5c..00000000 --- a/src/app/custom/assets/issue-types/Sub-task.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - subtask - Created with Sketch. - - - - - - - - - - - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/Task.svg b/src/app/custom/assets/issue-types/Task.svg deleted file mode 100644 index 92922cac..00000000 --- a/src/app/custom/assets/issue-types/Task.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/custom/assets/issue-types/lovepik-node-line-of-green-science-and-technology-png-image_400884045_wh1200.png b/src/app/custom/assets/issue-types/lovepik-node-line-of-green-science-and-technology-png-image_400884045_wh1200.png deleted file mode 100644 index 7b8b00cf..00000000 Binary files a/src/app/custom/assets/issue-types/lovepik-node-line-of-green-science-and-technology-png-image_400884045_wh1200.png and /dev/null differ diff --git a/src/app/custom/assets/issue.png b/src/app/custom/assets/issue.png deleted file mode 100644 index 4734cf84..00000000 Binary files a/src/app/custom/assets/issue.png and /dev/null differ diff --git a/src/app/custom/assets/issue.svg b/src/app/custom/assets/issue.svg deleted file mode 100644 index 26625dab..00000000 --- a/src/app/custom/assets/issue.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/app/custom/assets/logo.png b/src/app/custom/assets/logo.png deleted file mode 100644 index 9ce76de0..00000000 Binary files a/src/app/custom/assets/logo.png and /dev/null differ diff --git a/src/app/custom/assets/logo.svg b/src/app/custom/assets/logo.svg deleted file mode 100644 index d90e737d..00000000 --- a/src/app/custom/assets/logo.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/app/custom/assets/person.svg b/src/app/custom/assets/person.svg deleted file mode 100644 index 889891f0..00000000 --- a/src/app/custom/assets/person.svg +++ /dev/null @@ -1,65 +0,0 @@ - -image/svg+xml diff --git a/src/app/custom/assets/pull-request.png b/src/app/custom/assets/pull-request.png deleted file mode 100644 index d2537fd5..00000000 Binary files a/src/app/custom/assets/pull-request.png and /dev/null differ diff --git a/src/app/custom/assets/pull-request.svg b/src/app/custom/assets/pull-request.svg deleted file mode 100644 index 90d9a6d7..00000000 --- a/src/app/custom/assets/pull-request.svg +++ /dev/null @@ -1,75 +0,0 @@ - - -Created with Fabric.js 3.5.0 - - - - - - - - - - - - - - diff --git a/src/app/custom/config/app_description.json b/src/app/custom/config/app_description.json deleted file mode 100644 index 8aabe24c..00000000 --- a/src/app/custom/config/app_description.json +++ /dev/null @@ -1,852 +0,0 @@ -{ - "appInfo": { - "name": "Software Artifact Analyzer", - "html_header": "Software Artifact Analyzer", - "icon": "app/custom/assets/logo.svg", - "version": "1.0.0 beta", - "company_name": "Developed by i-Vis at Bilkent and BILSEN Bilkent University", - "company_contact": "ivis@cs.bilkent.edu.tr" - }, - "objects": { - "Commit": { - "properties": { - "name": "string", - "createdAt": "datetime", - "end": "datetime", - "url":"string" - }, - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "text-wrap": "ellipsis", - "font-size": "11px", - "background-image": "app/custom/assets/commit.svg", - "shape": "diamond", - "background-fit": "contain", - "width": "27px", - "height": "27px", - "text-width": "100px", - "text-outline-color": "#ffffff", - "color": "#bd7ebe", - "text-outline-width": "1px" - } - }, - "Developer": { - "properties": { - "name": "string", - "email": "string", - "start": "datetime", - "end": "datetime" - }, - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "font-size": "11px", - "background-image": "app/custom/assets/developer.svg", - "shape": "ellipse", - "background-fit": "contain", - "width": "24px", - "height": "24px", - "text-max-width": "60px", - "text-outline-color": "#ffffff", - "color": "#976e6e", - "text-outline-width": "1px" - } - }, - "File": { - "properties": { - "name": "string", - "createdAt": "datetime", - "end": "datetime", - "url":"string" - }, - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "font-size": "11px", - "background-image": "app/custom/assets/file.svg", - "shape": "rectangle", - "text-wrap": "ellipsis", - "background-fit": "contain", - "width": "20px", - "height": "24px", - "text-max-width": "60px", - "text-outline-color": "#ffffff", - "color": "#6988a5", - "text-outline-width": "1px" - } - }, - "Issue": { - "properties": { - "name": "string", - "issueType": "enum,string", - "priority": "enum,string", - "status": "enum,string", - "createdAt": "datetime", - "closeDate": "datetime", - "resolutionDate": "datetime", - - "title": "string", - "url": "string", - "reporter": "string", - "assigner": "string", - "assignee": "string", - "resolver": "string", - "closer": "string", - "duplicate": "string", - "assigneeChangeCount": "integer", - "environment": "string", - "reopenCount": "integer", - "affectedVersion": "string" - }, - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "text-outline-color": "#ffffff", - "color": "#4C5F7A", - "text-outline-width": "1px", - "font-size": "11px", - "shape": "rectangle", - "background-fit": "contain", - "background-image": "app/custom/assets/issue.svg", - "width": "32px", - "height": "32px" - } - }, - "PullRequest": { - "properties": { - "name": "string", - "mergeStatus": "enum,string", - "headBranch": "string", - "createdAt": "datetime", - "closeDate": "datetime", - "changeLineOfCode": "int", - "numberOfCommits": "int", - "numberOfChangeFiles": "int", - "title": "string", - "url": "string" - }, - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "font-size": "11px", - "background-image": "app/custom/assets/pull-request.svg", - "shape": "ellipse", - "background-fit": "contain", - "width": "24px", - "height": "24px", - "text-outline-color": "#ffffff", - "color": "#71aa9f", - "text-outline-width": "1px" - } - } - }, - "relations": { - "BLOCKS": { - "source": "Issue", - "target": "Issue", - "isBidirectional": false, - "properties": { "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "blocks", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - "ASSIGNED_TO": { - "source": "Issue", - "target": "Developer", - "isBidirectional": false, - "properties": { - "recency":"float", - "end": "datetime", - "createdAt": "datetime" - }, - "style": { - "label": "assigned to", - "font-size": "11px", - "width": "1px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - "RESOLVED": { - "source": "Developer", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "end": "datetime", - "createdAt": "datetime" - }, - "style": { - "label": "resolved", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "COMMENTED": { - "source": "Developer", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime", - "commentCount": "string" - }, - "style": { - "label": "commented", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "ASSIGNED_BY": { - "source": "Issue", - "target": "Developer", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "assigned by", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "COMMITTED": { - "source": "Developer", - "target": "Commit", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "committed", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "DEPENDS_UPON": { - "source": "Issue", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "depends_upon", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - "DUPLICATES": { - "source": "Issue", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "duplicates", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - "FIXES": { - "source": "Issue", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "fixes", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - "CONTAINS": { - "source": "Commit", - "target": "File", - "isBidirectional": false, - "properties": { - "recency":"float", - "changeLOC": "integer", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "contains", - "width": "1px", - "font-size": "11px", - "line-color": "#bd7ebe", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#bd7ebe", - "text-rotation": "autorotate", - "color": "#bd7ebe" - } - }, - "INCLUDES": { - "source": "PullRequest", - "target": "Commit", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "includes", - "width": "1px", - "font-size": "11px", - "line-color": "#71aa9f", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#71aa9f", - "text-rotation": "autorotate", - "color": "#71aa9f" - } - }, - "INCORPORATES": { - "source": "Issue", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "incorporates", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - "IS_A_CLONE_OF": { - "source": "Issue", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "is a clone of", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - "OPENED": { - "source": "Developer", - "target": "PullRequest", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "opened", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "REFERENCED_PR": { - "source": "Issue", - "target": "PullRequest", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "referenced", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - },"REFERENCED_COMMIT": { - "source": "Issue", - "target": "Commit", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "referenced", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - - "RELATES_TO": { - "source": "Issue", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "relates to", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - "MERGED": { - "source": "Developer", - "target": "PullRequest", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "merged", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "RENAMED_TO": { - "source": "File", - "target": "File", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "renamed to", - "width": "1px", - "font-size": "11px", - "line-color": "#6988a5", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#6988a5", - "text-rotation": "autorotate", - "color": "#6988a5" - } - }, - "REPORTED": { - "source": "Developer", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "reported", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "CLOSED": { - "source": "Developer", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "closed", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "REVIEWED": { - "source": "Developer", - "target": "PullRequest", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "reviewed", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - "SUPERSEDES": { - "source": "Issue", - "target": "Issue", - "isBidirectional": false, - "properties": { - "recency":"float", - "createdAt": "datetime", - "end": "datetime" - }, - "style": { - "label": "supersedes", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - } - }, - "enumMapping": { - "Issue": { - "issueType": "issueType", - "priority": "priority", - "status": "status" - }, - "PullRequest": { - "mergeStatus": "mergeStatus" - } - }, - "timebarDataMapping": { - "Commit": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "Developer": { - "begin_datetime": "start", - "end_datetime": "end" - }, - "File": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "Issue": { - "begin_datetime": "createdAt", - "end_datetime": "closeDate" - }, - "PullRequest": { - "begin_datetime": "createdAt", - "end_datetime": "closeDate" - }, - "ASSIGNED_TO": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "RESOLVED": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "ASSIGNED_BY": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "RENAMED_TO": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "BLOCKS": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "COMMITTED": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "COMMENTED": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "INCLUDES": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "DEPENDS_UPON": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "DUPLICATES": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "FIXES": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "INCORPORATES": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "MERGED": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "OPENED": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "IS_A_CLONE_OF": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "RELATES_TO": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "REFERENCED_COMMIT": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "REFERENCED_PR": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "REVIEWED": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "CLOSED": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "REPORTED": { - "begin_datetime": "createdAt", - "end_datetime": "end" - }, - "SUPERSEDES": { - "begin_datetime": "createdAt", - "end_datetime": "end" - } - }, - "appPreferences": { - "isAutoIncrementalLayoutOnChange": true, - "isHighlightOnHover": false, - "isShowOverviewWindow": false, - "isShowEdgeLabels": true, - "isTileDisconnectedOnLayout": true, - "isIgnoreCaseInText": false, - "isOnlyHighlight4LatestQuery": true, - "isStoreUserProfile": true, - "isCollapseEdgesBasedOnType": false, - "isCollapseMultiEdgesOnLoad": true, - "isLimitDbQueries2range": true, - "dbQueryTimeRange": { - "start": -5364669352000, - "end": 4102434000000 - }, - "savedLists": { - "numberLists": [], - "stringLists": [], - "enumLists": [] - }, - "dataPageSize": 15, - "dataPageLimit": 15, - "queryHistoryLimit": 10, - "queryNeighborLimit ": 7, - "dbTimeout": 30, - "tableColumnLimit": 3, - "highlightStyles": [ - { - "wid": 3, - "color": "#FCE903" - }, - { - "wid": 3, - "color": "#00ffff" - }, - { - "wid": 3, - "color": "#04f06a" - } - ], - "currHighlightIdx": 0, - "selectionColor": "#6c757d", - "selectionWidth": 4.5, - "groupingOption": 0, - "mergedElemIndicator": 2, - "nodeLabelWrap": 0, - "compoundPadding": "5%", - "edgeCollapseLimit": 2, - "avgNodeSize": 40, - "objectInclusionType": 0, - "anomalyDefaultValues": { - "ignoreBug": 5, - "assigneeChangeCount": 2, - "reopenCount": 2 - }, - "queryResultPagination": "Client", - "tilingPadding": 4, - "timebar": { - "isEnabled": false, - "playingStep": 50, - "playingPeriod": 1350, - "zoomingStep": 50, - "statsInclusionType": 0, - "graphRangeRatio": 0.33, - "isHideDisconnectedNodesOnAnim": false, - "isMaintainGraphRange": false - } - }, - "cssStyle": { - ".va-title": { - "font-size": "20px" - }, - ".va-heading1": { - "font-size": "14px", - "font-weight": "bold" - }, - ".va-heading2": { - "font-size": "12px" - }, - ".panel-heading": { - "height": "17px" - }, - ".va-heading3": { - "font-size": "12px" - }, - ".va-text": { - "font-size": "12px" - }, - ".va-small-text": { - "font-size": "11px" - }, - "svg": { - "background-color": "rgba(0, 0, 0, 0.5)" - } - } -} \ No newline at end of file diff --git a/src/app/custom/config/enums.json b/src/app/custom/config/enums.json deleted file mode 100644 index 0da401aa..00000000 --- a/src/app/custom/config/enums.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "issueType": { - "Epic": "Epic", - "Bug": "Bug", - "Story": "Story", - "Task": "Task", - "Sub-task": "Sub-task", - "New Feature":"New Feature", - "Improvement": "Improvement" - }, - "priority": { - "Blocker": "Blocker", - "Critical": "Critical", - "Highest" : "Highest", - "Major": "Major", - "High" : "High", - "Medium": "Medium", - "Low": "Low", - "Minor":"Minor", - "Lowest": "Lowest", - "Trivial": "Trivial" - }, - "status": { - "Done": "Done", - "To Do": "To Do", - "In Progress": "In Progress" - }, - - - "mergeStatus": { - "True": "True", - "False": "False" - } - -} \ No newline at end of file diff --git a/src/app/custom/customization-service/context-menu-customization.service.ts b/src/app/custom/customization-service/context-menu-customization.service.ts deleted file mode 100644 index 7f61ed28..00000000 --- a/src/app/custom/customization-service/context-menu-customization.service.ts +++ /dev/null @@ -1,2064 +0,0 @@ -import { Injectable } from "@angular/core"; -import { CytoscapeService } from "../../visuall/cytoscape.service"; -import { DbAdapterService } from "../../visuall/db-service/db-adapter.service"; -import { GlobalVariableService } from "../../visuall/global-variable.service"; -import { ContextMenuItem } from "../../visuall/context-menu/icontext-menu"; -import { DbQueryMeta, HistoryMetaData } from "../../visuall/db-service/data-types"; -import { HttpClient } from '@angular/common/http'; - -@Injectable({ - providedIn: "root", -}) - -export class ContextMenuCustomizationService { - private _menu: ContextMenuItem[]; - //Commit - private _commit_developer = "COMMITTED"; - private _commit_pr = "INCLUDES"; - private _commit_file = "CONTAINS"; - private _commit_issue = "REFERENCED_COMMIT"; - private _commit_review_developer = ["INCLUDES", "REVIEWED"] - //File - private _file_file = "RENAMED_TO"; - private _file_commit = "CONTAINS"; - private _file_developer = ["CONTAINS", "COMMITTED"]; - private _file_pull_request = ["CONTAINS", "INCLUDES"]; - private _file_issue = ["CONTAINS", "REFERENCED_COMMIT"] - //private _file_issue = [["CONTAINS","INCLUDES", "REFERENCED_PR"],["CONTAINS", "REFERENCED_COMMIT"]] (Visuall not let to run multilength multipath queries) - //PullRequest - private _pr_issue = "REFERENCED_PR"; - private _pr_commit = "INCLUDES"; - private _pr_file = ["INCLUDES", "CONTAINS"] - //Issue - private _get_commit_for_issue_relation = "REFERENCED_COMMIT"; - private _get_developer_for_issue_relation = ["REFERENCED_COMMIT", "COMMITTED"] - private _get_files_for_issue_relation = ["REFERENCED_COMMIT", "CONTAINS"] - private _issue_issue = ["FIXES", "DEPENDS_UPON", "DUPLICATES", "BLOCKS", "INCORPORATES", "INCORPORATES", "RELATES_TO", "SUPERSEDES"] - //Developer - private _developer_commit_pull_request = ["COMMITTED", "INCLUDES"]; - private _developer_commits = "COMMITTED"; - private _developer_commits_file = ["COMMITTED", "CONTAINS"]; - private _developers_reviewBy_developer = ["REVIEWED", "INCLUDES", "COMMITTED"]; - - - get menu(): ContextMenuItem[] { - return this._menu; - } - constructor( - private _cyService: CytoscapeService, - private _dbService: DbAdapterService, - private _g: GlobalVariableService, - private _http: HttpClient - - ) { - this._menu = [ - //Developer - { - id: "All Work", - content: "All Work", - selector: "node.Developer", - submenu: - //Developer pull request submenu - [ - { - id: "showAllWorkRecent", - content: "Show Recent Work", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show developer recent work: " }, - {}, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showAllWork", - content: "Show All Work", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show developer work: " }, - {} - ); - }, - }, - { - id: "hideAllWork", - content: "Hide All Work", - selector: "node.Developer", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide developer work: " }, - {} - ); - }, - }, - ] - }, - - { - id: "showDeveloperIssue", - content: "Issue", - selector: "node.Developer", - submenu: [ - { - id: "showDeveloperIssueReportRecent", - content: "Show Issues Recently Reported ", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show refcently reported issues: " }, - { edgeType: "REPORTED", targetType: "Issue" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperIssueReport", - content: "Show Issues Reported", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show reported issues: " }, - { edgeType: "REPORTED", targetType: "Issue" } - ); - }, - }, - { - id: "hideDeveloperIssue", - content: "Hide Issues Reported", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide reported issues: " }, - { edgeType: "REPORTED", targetType: "Issue" } - ); - }, - }, - { - id: "showDeveloperIssueAssignRecent", - content: "Show Issues Recently Assigned By", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues recently assigned by: " }, - { edgeType: "ASSIGNED_BY", targetType: "Issue" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperIssueAssign", - content: "Show Issues Assigned By", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues assigned by: " }, - { edgeType: "ASSIGNED_BY", targetType: "Issue" } - ); - }, - }, - { - id: "hideDeveloperIssueAssign", - content: "Hide Issues Assigned By", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide issues assigned by: " }, - { edgeType: "ASSIGNED_BY", targetType: "Issue" } - ); - }, - }, - { - id: "showDeveloperIssueAssignedRecent", - content: "Show Issues Recently Assigned To", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues recently assigned to: " }, - { edgeType: "ASSIGNED", targetType: "Issue" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperIssueAssigned", - content: "Show Issues Assigned To", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues assigned to: " }, - { edgeType: "ASSIGNED", targetType: "Issue" } - ); - }, - }, - - { - id: "hideDeveloperIssueAssigned", - content: "Hide Issues Assigned To", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide issues assigned to: " }, - { edgeType: "ASSIGNED", targetType: "Issue" } - ); - }, - }, - { - id: "showDeveloperIssueRecentlyResolve", - content: "Show Issues Recently Resolved", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues recently resolved: " }, - { edgeType: "RESOLVED", targetType: "Issue" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperIssueResolve", - content: "Show Issues Resolved", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues resolved: " }, - { edgeType: "RESOLVED", targetType: "Issue" } - ); - }, - }, - { - id: "hideDeveloperIssueResolve", - content: "Hide Issues Resolved", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide issues resolved: " }, - { edgeType: "RESOLVED", targetType: "Issue" } - ); - }, - }, - { - id: "showDeveloperIssueCloseRecent", - content: "Show Issues Recently Closed", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues recently closed: " }, - { edgeType: "CLOSED", targetType: "Issue" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperIssueClose", - content: "Show Issues Closed", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues closed: " }, - { edgeType: "CLOSED", targetType: "Issue" } - ); - }, - }, - { - id: "hideDeveloperIssueClose", - content: "Hide Issues Closed", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide issues closed: " }, - { edgeType: "CLOSED", targetType: "Issue" } - ); - }, - }, - ] - }, - { - id: "showDeveloper Pull Requests", - content: "Pull Requests", - selector: "node.Developer", - submenu: - //Developer pull request submenu - [ - { - id: "showDeveloperPullRequestsOpenRecent", - content: "Show Pull Requests Recently Opened", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests recently opened: " }, - { edgeType: "OPENED", targetType: "PullRequest" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperPullRequestsOpen", - content: "Show Pull Requests Opened", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests opened: " }, - { edgeType: "OPENED", targetType: "PullRequest" } - ); - }, - }, - { - id: "hideDeveloperPullRequestsOpen", - content: "Hide Pull Requests Opened", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide pull requests opened: " }, - { edgeType: "OPENED", targetType: "PullRequest" } - ); - }, - }, - { - id: "showDeveloperPullRequestsMergeRecent", - content: "Show Pull Requests Recently Merged ", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests recently merged: " }, - { edgeType: "MERGED", targetType: "PullRequest" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperPullRequestsMerge", - content: "Show Pull Requests Merged ", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests merged: " }, - { edgeType: "MERGED", targetType: "PullRequest" } - ); - }, - }, - { - id: "hideDeveloperPullRequestsMerge", - content: "Hide Pull Requests Merged", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide pull requests merged: " }, - { edgeType: " MERGED", targetType: "PullRequest" } - ); - }, - }, - { - id: "showDeveloperPullRequestsReviewRecent", - content: "Show Pull Requests Recently Reviewed ", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests recently reviewed: " }, - { edgeType: "REVIEWED", targetType: "PullRequest" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperPullRequestsReview", - content: "Show Pull Requests Reviewed", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests reviewed: " }, - { edgeType: "REVIEWED", targetType: "PullRequest" } - ); - }, - }, - { - id: "hideDeveloperPullRequestsReview", - content: "Hide Pull Requests Reviewed", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide pull requests reviewed: " }, - { edgeType: "REVIEWED", targetType: "PullRequest" } - ); - }, - }, - { - id: "showDeveloperCommitPullRequestsRecent", - content: "Show Pull Requests Recently Committed", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests recently committed: " }, - { - isMultiLength: true, - edgeType: this._developer_commit_pull_request, - targetType: "PullRequest" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperCommitPullRequests", - content: "Show Pull Requests Committed", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests committed: " }, - { - isMultiLength: true, - edgeType: this._developer_commit_pull_request, - targetType: "PullRequest" - } - ); - }, - }, - { - id: "hideDeveloperCommitPullRequests", - content: "Hide Pull Requests Committed", - selector: "node.Developer", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide pull requests committed: " }, - { - isMultiLength: true, - edgeType: this._developer_commit_pull_request, - targetType: "PullRequest" - } - ); - }, - }, - ] - }, - { - id: "commit", - content: "Commit", - selector: "node.Developer", - submenu: [ - { - id: "showDeveloperCommitsRecent", - content: "Show Recent Commits", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recent commits: " }, - { - isMultiLength: false, - edgeType: this._developer_commits, - targetType: "Commit" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperCommits", - content: "Show Commits", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show commits: " }, - { - isMultiLength: false, - edgeType: this._developer_commits, - targetType: "Commit" - } - ); - }, - }, - { - id: "hideDeveloperCommits", - content: "Hide Commits", - selector: "node.Developer", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide commits: " }, - { - isMultiLength: false, - edgeType: this._developer_commits, - targetType: "Commit" - } - ); - }, - }, - ] - }, - { - id: "file developer", - content: "File", - selector: "node.Developer", - submenu: [ - { - id: "showDeveloperCommitsFileRecent", - content: "Show Files Recently Committed To", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show files recently committed into: " }, - { - isMultiLength: true, - edgeType: this._developer_commits_file, - targetType: "File" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showDeveloperCommitsFile", - content: "Show Files Committed To", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show files committed into: " }, - { - isMultiLength: true, - edgeType: this._developer_commits_file, - targetType: "File" - } - ); - }, - }, - { - id: "hideDeveloperCommitsFile", - content: "Hide Files Committed To", - selector: "node.Developer", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide files committed into: " }, - { - isMultiLength: true, - edgeType: this._developer_commits_file, - targetType: "File" - } - ); - }, - }, - ] - }, - { - id: "Developer", - content: "Developer", - selector: "node.Developer", - hasTrailingDivider: true, - submenu: [ - { - id: "showDeveloperReview", - content: "Show Developers Reviewed", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show developers reviewed: " }, - { - isMultiLength: true, - edgeType: this._developers_reviewBy_developer, - targetType: "Developer" - } - ); - }, - }, - { - id: "showDeveloperReviewRecently", - content: "Show Developers Recently Reviewed", - selector: "node.Developer", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show developers recently reviewed: " }, - { - isMultiLength: true, - edgeType: this._developers_reviewBy_developer, - targetType: "Developer" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "hideDeveloperReview", - content: "Hide Developers Reviewed", - selector: "node.Developer", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide developers reviewed: " }, - { - isMultiLength: true, - edgeType: this._developers_reviewBy_developer, - targetType: "Developer" - } - ); - }, - }, - ] - }, - - //Commit - { - id: "commit all", - content: "All Related", - selector: "node.Commit", - submenu: [ - { - id: "showCommitRelatedRecent", - content: "Show Recently Related", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show all related: " }, - {}, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showCommitRelated", - content: "Show All Related", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show all related: " }, - {} - ); - }, - }, - { - id: "hideAllRelatedCommit", - content: "Hide All Related", - selector: "node.Commit", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide all related: " }, - {} - ); - }, - }, - ] - }, - { - id: "related_commit_pr", - content: "Pull Request", - selector: "node.Commit", - submenu: [ - - { - id: "showCommitPR", - content: "Show Pull Request", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull request: " }, - { - edgeType: this._commit_pr, - targetType: "PullRequest" - } - ); - }, - }, - { - id: "hideCommitPR", - content: "Hide Pull Request", - selector: "node.Commit", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide pull request: " }, - { - edgeType: this._commit_pr, - targetType: "PullRequest" - } - ); - }, - }, - ] - }, - { - id: "related_commit_file", - content: "File", - selector: "node.Commit", - submenu: [ - { - id: "showCommitFile", - content: "Show Some Modified Files ", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show some modified files: " }, - { - edgeType: this._commit_file, - targetType: "File" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showCommitFile", - content: "Show Modified Files ", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show modified files: " }, - { - edgeType: this._commit_file, - targetType: "File" - } - ); - }, - }, - { - id: "hideCommitFile", - content: "Hide Modified Files", - selector: "node.Commit", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide files modified: " }, - { - edgeType: this._commit_file, - targetType: "File" - } - ); - }, - }, - ] - }, - { - id: "related_commit_issue", - content: "Issue", - selector: "node.Commit", - submenu: [ - { - id: "showCommitIssue", - content: "Show Issues Recently Referencing", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues recently referenced: " }, - { - edgeType: this._commit_issue, - targetType: "Issue" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showCommitIssue", - content: "Show Issues Referencing", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show issues referenced: " }, - { - edgeType: this._commit_issue, - targetType: "Issue" - } - ); - }, - }, - { - id: "hideCommitIssue", - content: "Hide Issues Referencing", - selector: "node.Commit", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide issues referenced: " }, - { - edgeType: this._commit_issue, - targetType: "Issue" - } - ); - }, - }, - ] - }, - { - id: "showCommit Developer", - content: "Developer", - selector: "node.Commit", - hasTrailingDivider: true, - submenu: - // Commit Developer submenu - [ - { - id: "showCommitDeveloper", - content: "Show Author", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show author: " }, - { - edgeType: this._commit_developer, - targetType: "Developer" - } - ); - }, - }, - { - id: "hideCommitDeveloper", - content: "Hide Author", - selector: "node.Commit", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide author: " }, - { - edgeType: this._commit_developer, - targetType: "Developer" - } - ); - }, - }, - { - id: "showCommitReviewDeveloper", - content: "Show Reviewer", - selector: "node.Commit", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show reviewer: " }, - { edgeType: this._commit_review_developer, isMultiLength: true } - ); - }, - }, - { - id: "hideCommitReviewDeveloper", - content: "Hide Reviewer", - selector: "node.Commit", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide reviewer: " }, - { - edgeType: this._commit_review_developer, - isMultiLength: true, - targetType: "Developer" - } - ); - }, - } - ] - }, - //Issue - { - id: "related_issue", - content: "All Related", - selector: "node.Issue", - submenu: [ - { - id: "showIssueRelatedRecent", - content: "Show Recently Related", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recently related: " }, - {}, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showIssueRelated", - content: "Show All Related", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show all related: " }, - {} - ); - }, - }, - { - id: "hideAllRelatedIssue", - content: "Hide All Related", - selector: "node.Issue", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide all related: " }, - {} - ); - }, - }, - ] - }, - { - id: "related_issue_pr", - content: "Pull Request", - selector: "node.Issue", - submenu: [ - { - id: "ShowRelatedPRofIssueRecent", - content: "Show Pull Requests Recently Referenced", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull request recently referenced: " }, - { - edgeType: "REFERENCED_PR", - targetType: "PullRequest" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "ShowRelatedPRofIssue", - content: "Show Pull Requests Referenced", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull request referenced: " }, - { - edgeType: "REFERENCED_PR", - targetType: "PullRequest" - } - ); - }, - }, - { - id: "HideRelatedPRofIssue", - content: "Hide Pull Requests Referenced", - selector: "node.Issue", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide pull request referenced: " }, - { - edgeType: "REFERENCED_PR", - targetType: "PullRequest" - } - ); - }, - }, - ] - }, - { - id: "related_issue_file", - content: "File", - selector: "node.Issue", - submenu: [ - { - id: "ShowRelatedFilesRecent", - content: "Show Files Recently Related ", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show files recently related: " }, - { - edgeType: this._get_files_for_issue_relation, - isMultiLength: true, - targetType: "File" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "ShowRelatedFiles", - content: "Show Files Related ", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show related files: " }, - { - edgeType: this._get_files_for_issue_relation, - isMultiLength: true, - targetType: "File" - } - ); - }, - }, - { - id: "HideRelatedFiles", - content: "Hide Related Files", - selector: "node.Issue", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide related files: " }, - { - edgeType: this._get_files_for_issue_relation, - isMultiLength: true, - targetType: "File" - } - ); - }, - }, - - ] - }, - - { - id: "related_issue_commit", - content: "Commit", - selector: "node.Issue", - submenu: [ - { - id: "ShowRelatedCommitsofIssueRecent", - content: "Show Commits Recently Referenced", - selector: "node.Issue", - onClickFunction: (x) => { - const node = x.target || x.cyTarget; - this.getNeighbors( - x, - { isNode: true, customTxt: "Show commits recently referenced: " }, - { - edgeType: this._get_commit_for_issue_relation, - isMultiLength: false, - targetType: "Commit" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "ShowRelatedCommitsofIssue", - content: "Show Commits Referenced", - selector: "node.Issue", - onClickFunction: (x) => { - const node = x.target || x.cyTarget; - this.getNeighbors( - x, - { isNode: true, customTxt: "Show referenced commits: " }, - { - edgeType: this._get_commit_for_issue_relation, - isMultiLength: false, - targetType: "Commit" - } - ); - }, - }, - { - id: "HideRelatedCommitsofIssue", - content: "Hide Commits Referenced", - selector: "node.Issue", - onClickFunction: (x) => { - const node = x.target || x.cyTarget; - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide referenced commits: " }, - { - edgeType: this._get_commit_for_issue_relation, - isMultiLength: false, - targetType: "Commit" - } - ); - }, - }, - - ] - }, - { - id: "show Developers", - content: "Developers", - selector: "node.Issue", - submenu: - // Commit Developer submenu - [ - { - id: "ShowDevelopersCommitRecent", - content: "Show Recently Committing Developers", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show developers who worked on the solution: " }, - { - edgeType: this._get_developer_for_issue_relation, - isMultiLength: true, - targetType: "Developer" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "ShowDevelopersCommit", - content: "Show Committing Developers", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show developers who worked on the solution: " }, - { - edgeType: this._get_developer_for_issue_relation, - isMultiLength: true, - targetType: "Developer" - } - ); - }, - }, - { - id: "HideDevelopersCommit", - content: "Hide Committing Developers ", - selector: "node.Issue", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide developers who worked on the solution: " }, - { - edgeType: this._get_developer_for_issue_relation, - isMultiLength: true, - targetType: "Developer" - } - ); - }, - }, - { - id: "ShowRelatedDevelopers", - content: "Show Reporter", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show reporter: " }, - { - edgeType: "REPORTED", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "HideRelatedDevelopers1", - content: "Hide Reporter", - selector: "node.Issue", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide reporter: " }, - { - edgeType: "REPORTED", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "ShowRelatedDevelopers2", - content: "Show Assignee", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show assignee: " }, - { - edgeType: "ASSIGNED_TO", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "HideRelatedDevelopers2", - content: "Hide Assignee", - selector: "node.Issue", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide assignee: " }, - { - edgeType: "ASSIGNED_TO", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "ShowRelatedDevelopers3", - content: "Show Assigner", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show assigner: " }, - { - edgeType: "ASSIGNED_BY", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "HideRelatedDevelopers3", - content: "Hide Assigner", - selector: "node.Issue", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide assigner: " }, - { - edgeType: "ASSIGNED_BY", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "ShowRelatedDevelopers", - content: "Show Resolver", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show resolver: " }, - { - edgeType: "RESOLVED", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "HideRelatedDevelopers", - content: "Hide Resolver", - selector: "node.Issue", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide resolver: " }, - { - edgeType: "RESOLVED", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "ShowRelatedDevelopers", - content: "Show Closer", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show closer: " }, - { - edgeType: "CLOSED", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - { - id: "HideRelatedDevelopers", - content: "Hide Closer", - selector: "node.Issue", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide closer: " }, - { - edgeType: "CLOSED", - isMultiLength: false, - targetType: "Developer" - } - ); - }, - }, - ] - }, - { - id: "issue_issue", - content: "Issue", - selector: "node.Issue", - hasTrailingDivider: true, - submenu: - // Commit Developer submenu - [ - { - id: "ShowIssueRelatedIssueRecent", - content: "Show Recent Related Issues", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recent related issues: " }, - { - edgeType: this._issue_issue, - targetType: "Issue" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "ShowIssueRelatedIssue", - content: "Show Related Issues", - selector: "node.Issue", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show related issues: " }, - { - edgeType: this._issue_issue, - targetType: "Issue" - } - ); - }, - }, - { - id: "HideIssueRelatedIssue", - content: "Hide Related Issues", - selector: "node.Issue", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide related issues: " }, - { - edgeType: this._issue_issue, - targetType: "Issue" - } - ); - }, - }, - ] - }, - { - id: "report_anomaly", - content: "Report Anomalies", - selector: "node.Issue", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.reportAnomaly(x); - }, - - }, - //Pull Request - { - id: "pr", - content: "All Related", - selector: "node.PullRequest", - submenu: - // Commit Developer submenu - [ - { - id: "showPullRequestRelated", - content: "Show Recent Related ", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recently related: " }, - {}, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showPullRequestRelated", - content: "Show All Related ", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recently related: " }, - {} - ); - }, - }, - { - id: "hideAllRelatedPullRequest", - content: "Hide All Related", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide related: " }, - {} - ); - }, - }, - ] - }, - { - id: "pr_issue", - content: "Issue", - selector: "node.PullRequest", - submenu: - // Commit Developer submenu - [ - { - id: "showPullRequestIssueRecent", - content: "Show Issues Recently Referenced", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recently referenced issues: " }, - { - edgeType: this._pr_issue, - targetType: "Issue" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showPullRequestIssue", - content: "Show Issues Referenced", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show referenced issues: " }, - { - edgeType: this._pr_issue, - targetType: "Issue" - } - ); - }, - }, - { - id: "hidePullRequestIssue", - content: "Hide Issues Referenced", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide referenced issues: " }, - { - edgeType: this._pr_issue, - targetType: "Issue" - } - ); - }, - }, - ] - }, - { - id: "pr_developer", - content: "Developer", - selector: "node.PullRequest", - submenu: - // Commit Developer submenu - [ - { - id: "showPullRequestDeveloperOpen", - content: "Show Opener", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show opener: " }, - { - edgeType: "OPENED", - targetType: "Developer" - } - ); - }, - }, - { - id: "hidePullRequestDeveloper", - content: "Hide Opener", - selector: "node.PullRequest", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide opener: " }, - { - edgeType: "OPENED", - targetType: "Developer" - } - ); - }, - }, - { - id: "showPullRequestDeveloperMerge", - content: "Show Merger", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show merger: " }, - { - edgeType: "MERGED", - targetType: "Developer" - } - ); - }, - }, - { - id: "hidePullRequestDeveloperMerge", - content: "Hide Merger", - selector: "node.PullRequest", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide merger: " }, - { - edgeType: "MERGED", - targetType: "Developer" - } - ); - }, - }, - { - id: "showPullRequestDeveloperReview", - content: "Show Reviewer ", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show reviewer: " }, - { - edgeType: "REVIEWED", - targetType: "Developer" - } - ); - }, - }, - { - id: "hidePullRequestDeveloper", - content: "Hide Reviewer", - selector: "node.PullRequest", - hasTrailingDivider: true, - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide reviewer: " }, - { - edgeType: "REVIEWED", - targetType: "Developer" - } - ); - }, - }, - ] - }, - { - id: "pr_commit", - content: "Commit", - selector: "node.PullRequest", - submenu: - // Commit Developer submenu - [ - { - id: "showPullRequestCommit", - content: "Show Recent Commits", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recent commits: " }, - { - edgeType: this._pr_commit, - targetType: "Commit" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showPullRequestCommit", - content: "Show Commits", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show commits: " }, - { - edgeType: this._pr_commit, - targetType: "Commit" - } - ); - }, - }, - { - id: "hidePullRequestCommit", - content: "Hide Commits", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide commits: " }, - { - edgeType: this._pr_commit, - targetType: "Commit" - } - ); - }, - }, - ] - }, - { - id: "pr_files", - content: "File", - selector: "node.PullRequest", - hasTrailingDivider: true, - submenu: - [ - { - id: "showPullRequestFileRecent", - content: "Show Files Recently Modified", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recently modified files: " }, - { - edgeType: this._pr_file, isMultiLength: true, - targetType: "File" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showPullRequestFile", - content: "Show Files Modified", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show modified files: " }, - { - edgeType: this._pr_file, isMultiLength: true, - targetType: "File" - } - ); - }, - }, - { - id: "hidePullRequestFile", - content: "Hide Files Modified", - selector: "node.PullRequest", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide modified files: " }, - { - edgeType: this._pr_file, isMultiLength: true, - targetType: "File" - } - ); - }, - }, - ] - }, - //File - { - id: "file", - content: "All Related", - selector: "node.File", - submenu: - [ - { - id: "showFileRelatedRecent", - content: "Show Recently Related", - selector: "node.File", - - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recently related: " }, - {}, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showFileRelated", - content: "Show All Related", - selector: "node.File", - - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show all related: " }, - {} - ); - }, - }, - { - id: "hideAllRelatedFile", - content: "Hide All Related", - selector: "node.File", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide all related: " }, - {} - ); - }, - }, - ] - }, - { - id: "file_file", - content: "File", - selector: "node.File", - submenu: - // Commit Developer submenu - [ - { - id: "showFileRenameFile", - content: "Show Renamed Files", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show renamed files: " }, - { - edgeType: this._file_file, - targetType: "File" - } - ); - }, - }, - { - id: "hideFileRenameFile", - content: "Hide Renamed Files", - selector: "node.File", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide renamed files: " }, - { - edgeType: this._file_file, - targetType: "File" - } - ); - }, - }, - ] - }, - { - id: "file_commit", - content: "Commit", - selector: "node.File", - submenu: - [ - { - id: "showFileCommitRecent", - content: "Show Recent Commits", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recent commits: " }, - { edgeType: this._file_commit }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showFileCommit", - content: "Show Commits", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show commits: " }, - { edgeType: this._file_commit } - ); - }, - }, - { - id: "hideFileCommit", - content: "Hide Commits", - selector: "node.File", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide commits: " }, - { - edgeType: this._file_commit, - targetType: "Commit" - } - ); - }, - }, - ] - }, - { - id: "file_developer", - content: "Developer", - selector: "node.File", - submenu: [ - { - id: "showFileDeveloperRecent", - content: "Show Recently Committing Developers", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show developers recently committed into: " }, - { - edgeType: this._file_developer, isMultiLength: true, - targetType: "Developer" - }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showFileDeveloper", - content: "Show Committing Developers", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show developers committed into: " }, - { - edgeType: this._file_developer, isMultiLength: true, - targetType: "Developer" - } - ); - }, - }, - { - id: "hideFileDeveloper", - content: "Hide Committing Developers ", - selector: "node.File", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide developers committed into: " }, - { - edgeType: this._file_developer, isMultiLength: true, - targetType: "Developer" - } - ); - }, - }, - ] - }, - { - id: "file_pr", - content: "Pull Request ", - selector: "node.File", - submenu: [ - { - id: "showFilePullRequestsRecent", - content: "Show Recent Related PullRequests", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recent pull requests make change: " }, - { edgeType: this._file_pull_request, isMultiLength: true, targetType: "PullRequest" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showFilePullRequests", - content: "Show Related PullRequests", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show pull requests make change: " }, - { edgeType: this._file_pull_request, isMultiLength: true, targetType: "PullRequest" } - ); - }, - }, - { - id: "hideFilePullRequests", - content: "Hide Related PullRequests", - selector: "node.File", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide pull requests make change: " }, - { edgeType: this._file_pull_request, isMultiLength: true, targetType: "PullRequest" } - ); - }, - }, - ] - }, - { - id: "file_issue", - content: "Issue ", - selector: "node.File", - hasTrailingDivider: true, - submenu: [ - { - id: "showFileIssue", - content: "Show Recent Related Issues", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show recent related issues: " }, - { edgeType: this._file_issue, isMultiLength: true, targetType: "Issue" }, - this._g.userPrefs.queryNeighborLimit.getValue() - ); - }, - }, - { - id: "showFileIssue", - content: "Show Related Issues", - selector: "node.File", - onClickFunction: (x) => { - this.getNeighbors( - x, - { isNode: true, customTxt: "Show related issues: " }, - { edgeType: this._file_issue, isMultiLength: true, targetType: "Issue" } - ); - }, - }, - { - id: "hideFileIssue", - content: "Hide Related Issues", - selector: "node.File", - onClickFunction: (x) => { - this.deleteNeighbors( - x, - { isNode: true, customTxt: "Hide related issues: " }, - { edgeType: this._file_issue, isMultiLength: true, targetType: "Issue" } - ); - }, - }, - ] - } - ]; - } - - getNeighbors(event, historyMeta: HistoryMetaData, queryMeta: DbQueryMeta, limit?: number) { - const ele = event.target || event.cyTarget; - const targetNodeId = ele._private.data.id; - this._dbService.getNeighbors( - [ele.id().substr(1)], - (x) => { - this._cyService.loadElementsFromDatabase(x, true,false); - }, - historyMeta, - queryMeta, - limit - ); - } - isAnyHidden() { - return this._g.cy.$().map(x => x.hidden()).filter(x => x).length > 0; - } - deleteNeighbors(event, historyMeta: HistoryMetaData, queryMeta: DbQueryMeta) { - const ele = event.target || event.cyTarget; - const targetNodeId = ele._private.data.id; - let hideSet = this._g.cy.collection(); - this._dbService.getNeighbors( - [ele.id().substr(1)], - (x) => { - x.nodes.forEach(element => { - if ((`n${element.elementId}` != targetNodeId) && (!queryMeta.targetType || queryMeta.targetType === element.labels[0])) { - if (!queryMeta.isMultiLength) { - const edge = this._g.cy.edges(`[source="${targetNodeId}"][target="n${element.elementId}"]`); - const edge2 = this._g.cy.edges(`[source="n${element.elementId}"][target="${targetNodeId}"]`); - if (edge.nonempty() | edge2.nonempty()) { - hideSet = hideSet.add(this._g.cy.elements(`[id = "n${element.elementId}"]`)); - } - } else { - hideSet = hideSet.add(this._g.cy.elements(`[id = "n${element.elementId}"]`)); - } - } - }); - this._g.viewUtils.hide(hideSet); - this._cyService.hideCompounds(hideSet); - this._g.applyClassFiltering(); - if (hideSet.length > 0) { - this._g.performLayout(false,false,500, false); - } - }, - historyMeta, - queryMeta - ); - - } - - reportAnomaly(event) { - const ele = event.target; - this._g.cy.$().unselect(); - this._g.cy.$id(ele.id()).select(); - this._g.openReportTab.next(true); - if(this._g.openReportTab.getValue()){ - if (this._g.isSwitch2ObjTabOnSelect) { - this._g.operationTabChanged.next(0); - } - } - - } - -} diff --git a/src/app/custom/customization-service/cy-style-customization.service.ts b/src/app/custom/customization-service/cy-style-customization.service.ts deleted file mode 100644 index 738d1801..00000000 --- a/src/app/custom/customization-service/cy-style-customization.service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class CyStyleCustomizationService { - - constructor() { } - - // The developer can inject their own styles - // Below given a code sample - // cy.style().selector('node.Person') - // .style({ - // 'label': (e) => { - // return e.data('primary_name') + ' - ' + e.data('birth_year'); - // }, - // }).update(); - public addCustomStyles(cy) { - - } -} diff --git a/src/app/custom/customization-service/group-customization.service.ts b/src/app/custom/customization-service/group-customization.service.ts deleted file mode 100644 index b202425c..00000000 --- a/src/app/custom/customization-service/group-customization.service.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CytoscapeService } from '../../visuall/cytoscape.service'; -import { GlobalVariableService } from '../../visuall/global-variable.service'; -import { GroupingOptionTypes } from '../../visuall/user-preference'; - -@Injectable({ - providedIn: 'root' -}) -export class GroupCustomizationService { - private _clusteringMethods: { name: string, fn: any }[]; - get clusteringMethods(): { name: string, fn: any }[] { - return this._clusteringMethods; - } - - constructor(private _g: GlobalVariableService, private _cyService: CytoscapeService) { - this._clusteringMethods = [{ name: 'By developer', fn: () => { this.clusterByDeveloper(); } }]; - } - - clusterByDeveloper(ids?: any[]) { - let developerEdges = []; - this._g.cy.edges().filter(':visible').forEach(element => { - if(element._private.source._private.classes.values().next().value=='Developer'){ - if(ids != null){ - if(ids.includes(element._private.source._private.data.id)){ - developerEdges.push(element) - } - }else{ - developerEdges.push(element) - } - - } - }); - let developerIds = new Set(); - let commit2developer = {}; - for (let i = 0; i < developerEdges.length; i++) { - let edgeData = developerEdges[i].data(); - developerIds.add(edgeData.source); - if (commit2developer[edgeData.target]) { - commit2developer[edgeData.target].push(edgeData.source); - } else { - commit2developer[edgeData.target] = [edgeData.source]; - } - } - - if (this._g.userPrefs.groupingOption.getValue() == GroupingOptionTypes.compound) { - // add parent nodes - for (let id of developerIds) { - let name = this._g.cy.elements(`[id = "${id}"]`).data().id; - // for each developer, generate a compound node - this._cyService.addParentNode(name); - this._g.cy.elements(`[id = 'c${id}']`).data()["name"] = this._g.cy.elements(`[id = "${id}"]`).data()["name"] - this._g.cy.elements(`[id = 'c${id}']`)[0]._private.classes.add("clusterByDeveloper") - console.log(this._g.cy.elements(`[id = 'c${id}']`)[0]._private.classes) - // add the developer to the compound node - this._g.cy.elements(`[id = "${id}"]`).move({ parent: 'c' + id }); - - } - - // assign nodes to parents - for (let [k, v] of Object.entries(commit2developer)) { - // if a artifact has less than 2 developer add, those artifacts to the cluster of developer - // add developer to the compound node - if (v['length'] < 2) { - this._g.cy.elements(`[id = "${k}"]`).move({ parent: 'c' + v[0] }); - } - - } - } else { - const clusters = {}; - for (let id of developerIds) { - clusters[id] = [id]; - } - for (let [k, v] of Object.entries(developerIds)) { - // if a artifact has less than 2 developer add, those artifacts to the cluster of developer - if (v['length'] < 2) { - clusters[v[0]].push(k); - } - } - - this._g.layout.clusters = Object.values(clusters); - } - } -} diff --git a/src/app/custom/customization-service/navbar-customization.service.ts b/src/app/custom/customization-service/navbar-customization.service.ts deleted file mode 100644 index 654f539a..00000000 --- a/src/app/custom/customization-service/navbar-customization.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Injectable } from '@angular/core'; -import { NavbarDropdown } from '../../visuall/navbar/inavbar'; -import { GlobalVariableService } from '../../visuall/global-variable.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { Neo4jDb } from '../../visuall/db-service/neo4j-db.service'; -@Injectable({ - providedIn: 'root' -}) - -export class NavbarCustomizationService { - - private _menu: NavbarDropdown[]; - get menu(): NavbarDropdown[] { - return this._menu; - } - - constructor(private _g: GlobalVariableService, public _dbService: Neo4jDb) { - this._menu = [ - { - dropdown: 'Highlight', actions: [{ txt: 'Check Anomalies', id: '', fn: 'activateAnomalyCues', isStd: false }] - }, - ]; - } - activateAnomalyCues(){ - this._dbService.activateAnomalyCues(); - } -} - - diff --git a/src/app/custom/customization-service/theoretic-properties-custom.service.ts b/src/app/custom/customization-service/theoretic-properties-custom.service.ts deleted file mode 100644 index 2083be98..00000000 --- a/src/app/custom/customization-service/theoretic-properties-custom.service.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../visuall/global-variable.service'; -import { formatNumber } from '@angular/common'; -import { CytoscapeService } from '../../visuall/cytoscape.service'; -import { debounce2, debounce, COLLAPSED_EDGE_CLASS, mapColor } from '../../visuall/constants'; -import { Subscription } from 'rxjs'; - -@Injectable({ - providedIn: 'root' -}) -export class TheoreticPropertiesCustomService { - - - private _adjustSizeMethods: { name: string, fn: any }[]; - get adjustSizeMethods(): { name: string, fn: any }[] { - return this._adjustSizeMethods; - } - isOnSelected = false; - isDirectedGraph = false; - isMapNodeSizes = true; - isMapBadgeSizes = false; - isConsiderOriginalEdges = false; - selectedPropFn: string = ''; - poppedData: { popper: HTMLDivElement, elem: any, fn: Function, fn2: Function }[] = []; - UPDATE_POPPER_WAIT = 100; - cySelector = ''; - badgeColor = '#007bff'; - isBadgeVisible = true; - readonly ZOOM_THRESHOLD = 0.8; - readonly NODE_SIZE = 40; - maxPropValue = 0; - currNodeSize = this.NODE_SIZE; - appDescSubs: Subscription; - - constructor(private _g: GlobalVariableService, private _cyService: CytoscapeService) { - - this._adjustSizeMethods = [{ name: 'By know about score ', fn: (elems, scores) => { this.knowAboutScore(elems, scores) } }]; - } - - knowAboutScore (elems, scores){ - this.cySelector = ''; - let m = Math.max(...scores); - this.maxPropValue = m; - for (let i = 0; i < elems.length; i++) { - let badges = [0]; - badges = [scores[i]]; - this.generateBadge4Elem(elems[i][0], badges); - } - this._cyService.setNodeSizeOnGraphTheoreticProp(m, this.currNodeSize); - this.setBadgeColorsAndCoords(); - elems.removeClass('graphTheoreticDisplay'); - elems.addClass('graphTheoreticDisplay'); - - } - - generateBadge4Elem(e, badges: number[]) { - const div = document.createElement('div'); - div.innerHTML = this.getHtml(badges); - div.style.position = 'absolute'; - div.style.top = '0px'; - div.style.left = '0px'; - document.getElementById('cy').appendChild(div); - this.isMapBadgeSizes = true; - this.isMapNodeSizes = true; - if (true) { - let sum = 0; - for (let i = 0; i < badges.length; i++) { - sum += badges[i]; - } - e.data('__graphTheoreticProp', sum / badges.length); - } - if (this.isMapNodeSizes) { - e.removeClass('graphTheoreticDisplay'); - e.addClass('graphTheoreticDisplay'); - } - - const positionHandlerFn = debounce2( - () => { - this.setBadgeCoords(e, div); - this.setBadgeCoordsOfChildren(e); - }, - this.UPDATE_POPPER_WAIT, - () => { - this.showHideBadge(false, div); - }).bind(this); - const styleHandlerFn = debounce(() => { this.setBadgeVisibility(e, div); }, this.UPDATE_POPPER_WAIT * 2).bind(this); - - e.on('position', positionHandlerFn); - e.on('style', styleHandlerFn); - this._g.cy.on('pan zoom resize', positionHandlerFn); - this.poppedData.push({ popper: div, elem: e, fn: positionHandlerFn, fn2: styleHandlerFn }); - } - - private setBadgeCoords(e, div: HTMLDivElement) { - // let the nodes resize first - setTimeout(() => { - let ratio = 1; - if (true) { - let b = this.currNodeSize + 20; - let a = Math.max(5, this.currNodeSize - 20); - - let x = e.data('__graphTheoreticProp'); - ratio = ((b - a) * x / this.maxPropValue + a) / this.currNodeSize; - } else { - ratio = this.currNodeSize / this.NODE_SIZE; - } - ratio = ratio < this.ZOOM_THRESHOLD ? this.ZOOM_THRESHOLD : ratio; - - let z1 = this._g.cy.zoom() / 2 * ratio; - const bb = e.renderedBoundingBox({ includeLabels: false, includeOverlays: false }); - const w = div.clientWidth; - const h = div.clientHeight; - const deltaW4Scale = (1 - z1) * w / 2; - const deltaH4Scale = (1 - z1) * h / 2; - div.style.transform = `translate(${bb.x2 - deltaW4Scale - w * z1}px, ${bb.y1 - deltaH4Scale}px) scale(${z1})`; - this.showHideBadge(e.visible(), div); - }, 0); - } - - private setBadgeCoordsOfChildren(e) { - const elems = e.children(); - for (let i = 0; i < elems.length; i++) { - const child = elems[i]; - if (child.isParent()) { - this.setBadgeCoordsOfChildren(child); - } else { - const idx = this.poppedData.findIndex(x => x.elem.id() == child.id()); - if (idx > -1) { - this.setBadgeCoords(this.poppedData[idx].elem, this.poppedData[idx].popper); - } - } - } - } - - private setBadgeVisibility(e, div: HTMLDivElement) { - if (!e.visible()) { - div.style.opacity = '1'; - } - } - - - - getHtml(badges: number[]): string { - let s = ''; - for (let i = 0; i < badges.length; i++) { - s += `${formatNumber(badges[i], 'en', '1.0-2')}` - } - return s; - } - - showHideBadges(isShow: boolean) { - let z = this._g.cy.zoom(); - if (z <= this.ZOOM_THRESHOLD) { - isShow = false; - } - let css = '0'; - if (isShow) { - css = '1'; - } - for (let i = 0; i < this.poppedData.length; i++) { - this.poppedData[i].popper.style.opacity = css; - } - } - - showHideBadge(isShow: boolean, div: HTMLDivElement) { - let z = this._g.cy.zoom(); - if (z <= this.ZOOM_THRESHOLD) { - isShow = false; - } - let css = '0'; - if (isShow) { - css = '1'; - } - div.style.opacity = css; - } - - setBadgeColorsAndCoords() { - for (let i = 0; i < this.poppedData.length; i++) { - let c = mapColor(this.badgeColor, this.maxPropValue, this.poppedData[i].elem.data('__graphTheoreticProp')); - for (let j = 0; j < this.poppedData[i].popper.children.length; j++) { - (this.poppedData[i].popper.children[j] as HTMLSpanElement).style.background = c; - } - this.setBadgeCoords(this.poppedData[i].elem, this.poppedData[i].popper); - } - } - - colorSelected(s: string) { - this.badgeColor = s; - } - - avgNodeSizeChanged() { - if (this.currNodeSize < 5) { - this.currNodeSize = 5; - } - } - -} diff --git a/src/app/custom/customization-service/toolbar-customization.service.ts b/src/app/custom/customization-service/toolbar-customization.service.ts deleted file mode 100644 index c4daec32..00000000 --- a/src/app/custom/customization-service/toolbar-customization.service.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ToolbarDiv } from '../../visuall/toolbar/itoolbar'; -import { GlobalVariableService } from '../../visuall/global-variable.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { Neo4jDb } from '../../visuall/db-service/neo4j-db.service'; -import { ActivatedRoute } from '@angular/router'; - -@Injectable({ - providedIn: 'root' -}) -export class ToolbarCustomizationService { - - private _menu: ToolbarDiv[]; - listOfAnomalies = [] - get menu(): ToolbarDiv[] { - return this._menu; - } - - constructor(private _g: GlobalVariableService, public _dbService: Neo4jDb, private route: ActivatedRoute) { - this._menu = []; - - this._menu = [{ - div: 3, items: [{ title: 'Check Anomalies', isRegular: true, fn: 'activateAnomalyCues', isStd: true, imgSrc: 'assets/img/toolbar/cue.svg' }] - }]; - - - this.route.queryParamMap.subscribe(params => { - if (params.get('issue')) { - setTimeout(() => { - this._dbService.activateAnomalyCues(); - }, 500); - } - }); - } - activateAnomalyCues(){ - this._dbService.activateAnomalyCues(); - } -} diff --git a/src/app/custom/customization.module.ts b/src/app/custom/customization.module.ts deleted file mode 100644 index b54241d5..00000000 --- a/src/app/custom/customization.module.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Neo4jDb } from '../visuall/db-service/neo4j-db.service'; -import { DbService } from '../visuall/db-service/data-types'; -import { DeveloperCommitsComponent } from './analyses/developer-commits/developer-commits.component'; -import { ReviewerRecommendationComponent } from './analyses/reviewer-recommendation/reviewer-recommendation.component'; -import { AnomalyComponent } from './analyses/anomalies/anomaly/anomaly.component'; -import { AnomalyStatisticComponent } from './analyses/anomalies/anomaly-statistic/anomaly-statistic.component'; -import { SharedModule } from '../shared/shared.module'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { Rule, RuleNode, TimebarMetric } from '../visuall/operation-tabs/map-tab/query-types'; -import { ReportComponent } from './operational-tabs/object-tab/report-tab/report.component'; -import { ObjectQueriesComponent } from './operational-tabs/object-tab/object-queries-tab/object-queries.component' -import { HttpClientModule, HttpClientXsrfModule, HTTP_INTERCEPTORS } from '@angular/common/http'; -import { BrowserModule } from '@angular/platform-browser'; -import { UnassignedBugsComponent } from './analyses/anomalies/unassigned-bugs/unassigned-bugs.component'; -import { NoLinkToBugFixingCommitComponent } from './analyses/anomalies/no-link-to-bug-fixing-commit/no-link-to-bug-fixing-commit.component'; -import { IgnoredBugsComponent } from './analyses/anomalies/ignored-bugs/ignored-bugs.component'; -import { MissingPriorityComponent } from './analyses/anomalies/missing-priority/missing-priority.component'; -import { NotReferencedDuplicatesComponent } from './analyses/anomalies/not-referenced-duplicates/not-referenced-duplicates.component'; -import { MissingEnvironmentInformationComponent } from './analyses/anomalies/missing-environment-information/missing-environment-information.component'; -import { ReassignmentBugAssigneeComponent } from './analyses/anomalies/reassignment-bug-assignee/reassignment-bug-assignee.component'; -import { NoCommentBugsComponent } from './analyses/anomalies/no-comment-bugs/no-comment-bugs.component'; -import { NoAssigneeResolverBugComponent } from './analyses/anomalies/no-assignee-resolver-bug/no-assignee-resolver-bug.component'; -import { ClosedReopenPingPongComponent } from './analyses/anomalies/closed-reopen-ping-pong/closed-reopen-ping-pong.component'; -import { SameResolverCloserComponent } from './analyses/anomalies/same-resolver-closer/same-resolver-closer.component'; -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { ModalContentComponent } from './operational-tabs/object-tab/modal-content/modal-content.component'; -import { ExpertRecommendationComponent } from './analyses/expert-recommendation/expert-recommendation.component'; -import { CommentContributorsComponent } from './analyses/comment-contributors/comment-contributors.component'; -import { CollaboratorsComponent } from './analyses/collaborators/collaborators.component'; -import { CommentCollaboratorsComponent } from './analyses/comment-collaborators/comment-collaborators.component'; -import { ReportIssueComponent } from './operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component'; -import { ReportPrComponent } from './operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component'; -import { ReportDeveloperComponent } from './operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component'; -import { ReportCommitComponent } from './operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component'; -import { ReportFileComponent } from './operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component'; -import {MatAutocompleteModule} from '@angular/material/autocomplete' -import { MatInputModule } from '@angular/material/input'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -// import { AsdComponent } from './asd/asd.component'; -// import statements for custom components should be here - -@NgModule({ - // custom components should be inside declarations - declarations: [ - DeveloperCommitsComponent, - ReviewerRecommendationComponent, - AnomalyStatisticComponent, - ReportComponent, - ObjectQueriesComponent, - AnomalyComponent, - UnassignedBugsComponent, - NoLinkToBugFixingCommitComponent, - IgnoredBugsComponent, - MissingPriorityComponent, - NotReferencedDuplicatesComponent, - MissingEnvironmentInformationComponent, - ReassignmentBugAssigneeComponent, - NoCommentBugsComponent, - NoAssigneeResolverBugComponent, - ClosedReopenPingPongComponent, - SameResolverCloserComponent, - ModalContentComponent, - ExpertRecommendationComponent, - CommentContributorsComponent, - CollaboratorsComponent, - CommentCollaboratorsComponent, - ReportIssueComponent, - ReportPrComponent, - ReportDeveloperComponent, - ReportCommitComponent, - ReportFileComponent], - imports: [ - HttpClientModule, - BrowserModule, - CommonModule, - SharedModule, - FormsModule, - NgbModule, - BrowserModule, - BrowserAnimationsModule, - MatAutocompleteModule, - MatInputModule, - ReactiveFormsModule - ] -}) - -export class CustomizationModule { - - static operationTabs: { component: any, text: string }[] = []; - - static objSubTabs: { component: any, text: string }[] = []; - - static objSubTabsOne: { component: any, text: string } [] = [ - { component: ReportComponent, text: 'Report'}, - { component: ObjectQueriesComponent, text: 'Queries'} - ]; - - static mapSubTabs: { component: any, text: string } [] = []; - static databaseSubTabs: { component: any, text: string } [] = []; - static settingsSubTabs: { component: any, text: string } [] = []; - static queries: { component: any, text: string } [] = [ - { component: DeveloperCommitsComponent, text: 'Get Commits of Developer' }, - { component: ReviewerRecommendationComponent, text: 'Get Recommended Reviewers' }, - { component: ExpertRecommendationComponent, text: 'Get Experts' }, - { component: AnomalyComponent, text: 'Get Anomalies' }, - { component: AnomalyStatisticComponent, text: 'Get Anomaly Statistics' } -]; - - static db: DbService; - static defaultTimebarMetrics: TimebarMetric[]; -constructor(private _db: Neo4jDb) { - CustomizationModule.db = _db; - const andCond: Rule = { ruleOperator: 'OR' }; - const issueCond1: Rule = { propertyOperand: 'priority', propertyType: 'string', rawInput: 'Critical', inputOperand: 'Critical', ruleOperator: null, operator: '=' }; - const issueCond2: Rule = { propertyOperand: 'priority', propertyType: 'string', rawInput: 'Blocker', inputOperand: 'Blocker', ruleOperator: null, operator: '=' }; - const root1: RuleNode = { r: andCond, parent: null, children: [] }; - const child1: RuleNode = { r: issueCond1, parent: root1, children: [] }; - const child2: RuleNode = { r: issueCond2, parent: root1, children: [] }; - root1.children = [child1, child2]; - CustomizationModule.defaultTimebarMetrics = [ - { incrementFn: null, name: 'serious issue', className: 'Issue', rules: root1, color: '#3366cc' }, - ]; -} -} diff --git a/src/app/custom/operational-tabs/object-tab/modal-content/modal-content.component.css b/src/app/custom/operational-tabs/object-tab/modal-content/modal-content.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/custom/operational-tabs/object-tab/modal-content/modal-content.component.html b/src/app/custom/operational-tabs/object-tab/modal-content/modal-content.component.html deleted file mode 100644 index 0a92ef86..00000000 --- a/src/app/custom/operational-tabs/object-tab/modal-content/modal-content.component.html +++ /dev/null @@ -1 +0,0 @@ -

modal-content works!

diff --git a/src/app/custom/operational-tabs/object-tab/modal-content/modal-content.component.ts b/src/app/custom/operational-tabs/object-tab/modal-content/modal-content.component.ts deleted file mode 100644 index 658cd24e..00000000 --- a/src/app/custom/operational-tabs/object-tab/modal-content/modal-content.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'app-modal-content', - template: ` - - - - - - -` -}) -export class ModalContentComponent { - name: string; - url: string; - templateType: string; - message: string; - title: string; - - constructor(public activeModal: NgbActiveModal) { } - - closeModal(): void { - this.activeModal.close(); // Close the modal from within the modal component - } -} \ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/object-queries-tab/object-queries.component.css b/src/app/custom/operational-tabs/object-tab/object-queries-tab/object-queries.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/custom/operational-tabs/object-tab/object-queries-tab/object-queries.component.html b/src/app/custom/operational-tabs/object-tab/object-queries-tab/object-queries.component.html deleted file mode 100644 index 4ece8b26..00000000 --- a/src/app/custom/operational-tabs/object-tab/object-queries-tab/object-queries.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
-
- -
-
-
- -
-
- -
-
- diff --git a/src/app/custom/operational-tabs/object-tab/object-queries-tab/object-queries.component.ts b/src/app/custom/operational-tabs/object-tab/object-queries-tab/object-queries.component.ts deleted file mode 100644 index 8828f4b0..00000000 --- a/src/app/custom/operational-tabs/object-tab/object-queries-tab/object-queries.component.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { Observable } from 'rxjs'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ModalContentComponent } from '../modal-content/modal-content.component'; -import { BehaviorSubject } from 'rxjs'; -import { DeveloperCommitsComponent } from '../../../analyses/developer-commits/developer-commits.component'; -import { CommentContributorsComponent } from '../../../analyses/comment-contributors/comment-contributors.component'; -import { ReviewerRecommendationComponent } from '../../../analyses/reviewer-recommendation/reviewer-recommendation.component'; -import { ExpertRecommendationComponent } from '../../../analyses/expert-recommendation/expert-recommendation.component'; -import { CollaboratorsComponent } from '../../../analyses/collaborators/collaborators.component'; -import { CommentCollaboratorsComponent } from '../../../analyses/comment-collaborators/comment-collaborators.component'; -import { ActivatedRoute } from '@angular/router'; -@Component({ - selector: 'app-object-queries', - templateUrl: './object-queries.component.html', - styleUrls: ['./object-queries.component.css'] -}) -export class ObjectQueriesComponent implements OnInit { - selectedItem = new BehaviorSubject(null); - selectedIdx: number; - selectedQuery: string = ""; - className: string = "" - queries: { component: any, text: string }[] =[]; - issueQueries: { component: any, text: string }[] =[]; - developerQueries: { component: any, text: string }[] =[]; - fileQueries: { component: any, text: string }[] =[]; - commitQueries: { component: any, text: string }[] =[]; - prQueries: { component: any, text: string }[] =[]; - - - constructor(public _dbService: Neo4jDb, private _g: GlobalVariableService, private http: HttpClient,private modalService: NgbModal, private route: ActivatedRoute) { - /* - this.developerQueries = [ - { component: DeveloperCommitsComponent, text: 'Get Commits' }, - { component: CollaboratorsComponent, text: 'Get Collaborators' }, - { component: CommentCollaboratorsComponent, text: 'Get Comment Only Collaborators' }, - ]; - this.prQueries = [ - { component: ReviewerRecommendationComponent, text: 'Get Recommended Reviewers' }, - ]; - this.fileQueries = [ - { component: ExpertRecommendationComponent, text: 'Get Experts' }, - ]; - this.issueQueries = [ - { component: CommentContributorsComponent, text: 'Get Comment Contributors' }, - ]; - this.commitQueries = [ - ]; - */ - this.developerQueries = [ - { component: DeveloperCommitsComponent, text: 'Get Commits' }] - this.prQueries = [ - { component: ReviewerRecommendationComponent, text: 'Get Recommended Reviewers' }, - ]; - this.fileQueries = [ - { component: ExpertRecommendationComponent, text: 'Get Experts' }, - ]; - this.issueQueries = []; - this.commitQueries = [ - ]; - this.selectedIdx = -1; - } - - - changeQuery(event) { - this.selectedIdx = this.queries.findIndex(x => x.text == event.target.value); - } - - ngOnInit(): void { - let name = "" - setInterval(() => { - if (this._g.cy.$(':selected')[0]) { - this.selectedItem.next(this._g.cy.$(':selected')[0]._private.data.name) - this.className = this._g.cy.$(':selected')[0]._private.classes.values().next().value; - if (this._g.cy.$(':selected')[0]._private.data.name !== name) { - if (this.className === "Issue"){ - this.queries = this.issueQueries - } - else if (this.className === "Developer"){ - this.queries = this.developerQueries - } - else if ( this.className === "PullRequest"){ - this.queries = this.prQueries - } - else if ( this.className === "Commit"){ - this.queries = this.commitQueries - } - else{ - this.queries = this.fileQueries - } - }}}, 500) - - - this.route.queryParamMap.subscribe(params => { - if (params.get('pr')) { - this.selectedIdx = 0; - } - }); - - } - -} diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/report.component.css b/src/app/custom/operational-tabs/object-tab/report-tab/report.component.css deleted file mode 100644 index 0ef4e289..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/report.component.css +++ /dev/null @@ -1,68 +0,0 @@ -.btn-close{ - float: right; -} -.draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90) !important; - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; - min-width: 150px; - top:60vh; - - right: 25vw; -} -.modal-header{ - display: block; -} -.subpanel-heading { - cursor: pointer; - text-align: center; - background-color: #eaeaea40; - line-height: 1.45; - display: flex; - width: 22vw; - justify-content: center; - flex-direction: column; -} - - .dd-item { - padding: 0.37rem !important; - } - - .flex{ - flex-wrap: wrap; - margin-top: 1rem; - align-items: center !important; - display: flex; - width: 100%; - display: flex; - justify-content: space-between; - } - .checkBox{ - display: flex; - align-items: center !important; - } - .flex-pr{ - align-items: center !important; - display: flex; - } - .comment-header{ - height: 2rem !important; - } - - .comment-body{ - min-height: 8rem !important; - } - - img { - margin: 2% 0; - border-radius: 0.375rem; - border: 1px solid #ced4da; - border-radius: 0.375rem; - line-height: 1.5; - padding: 0.375rem 0.75rem; - width: 100%; - } \ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/report.component.html b/src/app/custom/operational-tabs/object-tab/report-tab/report.component.html deleted file mode 100644 index 88362437..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/report.component.html +++ /dev/null @@ -1,87 +0,0 @@ -
-
- -
-
- -
-
-
- - -
-
-
-
-
-
- -
-
-
- -
-
- -
-
- Pull Request - -
-
-
-
- Issue - -
-
-
- -
-
- -
-
- -
- -
- - - - -
\ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/report.component.ts b/src/app/custom/operational-tabs/object-tab/report-tab/report.component.ts deleted file mode 100644 index f4edc21c..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/report.component.ts +++ /dev/null @@ -1,72 +0,0 @@ - - -import { Component, ViewChild, ViewContainerRef, ComponentRef, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../../../visuall/global-variable.service'; -import { Neo4jDb } from '../../../../visuall/db-service/neo4j-db.service'; -import { BehaviorSubject } from 'rxjs'; -import { ReportIssueComponent } from './sub-report-tabs/report-issue/report-issue.component'; -import { ReportPrComponent } from './sub-report-tabs/report-pr/report-pr.component'; -import { ReportFileComponent } from './sub-report-tabs/report-file/report-file.component'; -import { ReportCommitComponent } from './sub-report-tabs/report-commit/report-commit.component'; -import { ReportDeveloperComponent } from './sub-report-tabs/report-developer/report-developer.component'; -@Component({ - selector: 'app-report', - template: ` -
- `, -}) -export class ReportComponent implements OnInit { - className: string; - name: string; - @ViewChild('reportContainer', { read: ViewContainerRef }) container: ViewContainerRef; - componentRef: ComponentRef; - - - constructor( - public _dbService: Neo4jDb, - private _g: GlobalVariableService, - ) { } - - ngOnInit() { - setInterval(() => { - if ( this._g.cy.$(':selected')[0] && this._g.cy.$(':selected')[0]._private.data.name !== this.name) { - this.name = this._g.cy.$(':selected')[0]._private.data.name - this.loadComponent(); - } - }, 500) - - } - - loadComponent() { - if (this.container) { - this.container.clear(); - } - this.className = this._g.cy.$(':selected')[0]._private.classes.values().next().value; - switch (this.className) { - case 'Issue': - this.loadDynamicComponent(ReportIssueComponent); - break; - case 'PullRequest': - this.loadDynamicComponent(ReportPrComponent); - break; - case 'File': - this.loadDynamicComponent(ReportFileComponent); - break; - case 'Commit': - this.loadDynamicComponent(ReportCommitComponent); - break; - case 'Developer': - this.loadDynamicComponent(ReportDeveloperComponent); - break; - default: - this.loadDynamicComponent(ReportFileComponent); - break; - } - } - loadDynamicComponent(component: any) { - this.componentRef = this.container.createComponent(component); - } - - -} - diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.css b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.css deleted file mode 100644 index 44f09049..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.css +++ /dev/null @@ -1,72 +0,0 @@ -.btn-close{ - float: right; - } - .draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90) !important; - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; - min-width: 150px; - top:60vh; - - right: 25vw; - } - .modal-header{ - display: block; - } - .subpanel-heading { - cursor: pointer; - text-align: center; - background-color: #eaeaea40; - line-height: 1.45; - display: flex; - width: 22vw; - justify-content: center; - flex-direction: column; - } - - .dd-item { - padding: 0.37rem !important; - } - - .flex{ - flex-wrap: wrap; - margin-top: 1rem; - align-items: center !important; - display: flex; - width: 100%; - display: flex; - justify-content: center; - } - .checkBox{ - display: flex; - margin: 0.2rem; - align-items: center !important; - } - .flex-pr{ - align-items: center !important; - display: flex; - } - .comment-header{ - height: 2rem !important; - } - - .comment-body{ - min-height: 8rem !important; - } - - img { - margin: 2% 0; - border-radius: 0.375rem; - border: 1px solid #ced4da; - border-radius: 0.375rem; - line-height: 1.5; - padding: 0.375rem 0.75rem; - width: 100%; - } - .pr-select{ - width: 50px!important; - } diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.html b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.html deleted file mode 100644 index c06f7e1b..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.html +++ /dev/null @@ -1,47 +0,0 @@ -
-
-
-
- -
-
-
- -
-
-
-
-
- Pull Request - - - #{{pr}} - -
-
-
- -
-
- -
-
- -
- -
- -
\ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.ts b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.ts deleted file mode 100644 index cd4576aa..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-commit/report-commit.component.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../../../../../visuall/global-variable.service'; -import { Observable } from 'rxjs'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Neo4jDb } from '../../../../../../visuall/db-service/neo4j-db.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ModalContentComponent } from '../../../modal-content/modal-content.component'; - -interface Attachment { - name: string; - data: any, - type: string; -} -@Component({ - selector: 'app-report-commit', - templateUrl: './report-commit.component.html', - styleUrls: ['./report-commit.component.css'] -}) -export class ReportCommitComponent implements OnInit { - key: string; - pr_key: string; - prs: string[]; - filteredPrs: string[] = []; - commentInput: any = { - addGraph: false - }; - addMenu: any[]; - dataURL: string = ""; - attachments: Attachment[] = []; - - githubHttpOptions: any; - sha_github: string = ""; - authentication: any; - imageUrl: string; - comment: any; - - constructor(public _dbService: Neo4jDb, private _g: GlobalVariableService, private http: HttpClient, private modalService: NgbModal) { } - - ngOnInit(): void { - this.key = this._g.cy.$(':selected')[0]._private.data.name; - this.comment = { - header: "", - body: "", - } - this._dbService.runQuery(`MATCH (n:PullRequest) RETURN distinct n.name`, (x) => this.fillPr(x), DbResponseType.table); - this.addMenu = [ - { label: 'Graph', value: this.commentInput.addGraph, function: "addGraph()" }, - ] - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/getAuthentication" : - `http://${window.location.hostname}:4445/getAuthentication`; - this.http.get(url).subscribe(data => { - this.authentication = data; - this.githubHttpOptions = { - headers: new HttpHeaders({ - 'Authorization': `Bearer ${this.authentication.github.access_token}`, - 'Accept': 'application/vnd.github.v3+json' - }) - }; - }); - } - fillPr(data) { - this.prs = []; - for (let i = 0; i < data.data.length; i++) { - this.prs.push(data.data[i][0]); - } - this.filteredPrs = this.prs.slice(); - } - filterOptionsPr(value: string) { - this.filteredPrs = this.prs.filter(pr => - pr.toLowerCase().includes(value.toLowerCase()) - ); - } - - - addGraph() { - if (!this.commentInput.addGraph) { - this.commentInput.addGraph = true; - } - else { - this.commentInput.addGraph = false - this.dataURL = "" - this.attachments = [] - } - } - onCheckboxChange(item: any) { - this.callFunction(item.function); - } - - callFunction(functionName: string) { - switch (functionName) { - case "addGraph()": - this.addGraph(); - break; - } - } - - async performSelection() { - this.comment.header = "Report Commit " + this.key + " "; - this.comment.body = "[You can inspect artifact " + this.key + " from this link](http://" + window.location.hostname + ":" + window.location.port + "/?name=" + this.key + ")\n"; - if (this.commentInput.addGraph) { - this.saveAsPng(false); - } - } - - async postComment() { - if (this.authentication.authenticated) { - let commentBody = { - body: `### ${this.comment.header}\n${this.comment.body}` - }; - if (this.commentInput.addGraph) { - await this.updateFile().subscribe(response => { - console.log('Comment posted successfully:', response); - this.imageUrl = response["content"]["download_url"] - commentBody = { - body: `### ${this.comment.header}\n${this.comment.body}\n![image](${this.imageUrl})` - }; - this.http.post(`https://api.github.com/repos/${this.authentication.github.github_repo}/issues/${this.pr_key}/comments`, commentBody, this.githubHttpOptions).subscribe(response => { - this.openModal("Pull Request " + this.pr_key, response["html_url"], 'report') - }, error => { - console.error('Error posting comment:', error); - }); - }, error => { - console.error('Error updating image:', error); - }); - - } - else { - this.http.post(`https://api.github.com/repos/${this.authentication.github.github_repo}/issues/${this.pr_key}/comments`, commentBody, this.githubHttpOptions).subscribe(response => { - console.log('Comment posted successfully:', response); - this.openModal("Pull Request" + this.pr_key, response["html_url"], 'report') - }, error => { - console.error('Error posting comment:', error); - }); - } - } else { - this.openModal("", "", 'error') - } - } - - updateFile(): Observable { - const filename = `image_${Date.now()}.png`; - const url = `https://api.github.com/repos/${this.authentication.github.github_repo}/contents/assets/${filename}`; - const body = { - message: "Add image", - content: `${this.dataURL.split(",")[1]}` - }; - const options = this.githubHttpOptions; - return this.http.put(url, body, options); - } - - openModal(name, url, templateType): void { - const modalRef = this.modalService.open(ModalContentComponent); - modalRef.componentInstance.name = name; // Pass data to the modal component - modalRef.componentInstance.url = url; - modalRef.componentInstance.templateType = templateType; - } - - async saveAsPng(isWholeGraph: boolean) { - const options = { bg: 'white', scale: 2, full: isWholeGraph }; - const base64png =this._g.cy.pngFull(options, ['cy-context-menus-cxt-menu','cy-panzoom']); - const image = new Image(); - image.src = await base64png; - image.onload = async () => { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - canvas.width = image.width / 4; - canvas.height = image.height / 4; - ctx.drawImage(image, 0, 0, canvas.width, canvas.height); - this.dataURL = canvas.toDataURL('image/png'); - }; - } - -} diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.css b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.css deleted file mode 100644 index 154f3ef8..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.css +++ /dev/null @@ -1,77 +0,0 @@ -.btn-close{ - float: right; - } - .draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90) !important; - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; - min-width: 150px; - top:60vh; - - right: 25vw; - } - .modal-header{ - display: block; - } - .subpanel-heading { - cursor: pointer; - text-align: center; - background-color: #eaeaea40; - line-height: 1.45; - display: flex; - width: 22vw; - justify-content: center; - flex-direction: column; - } - - .dd-item { - padding: 0.37rem !important; - } - - .flex{ - flex-wrap: wrap; - margin-top: 1rem; - align-items: center !important; - display: flex; - width: 100%; - display: flex; - justify-content: center; - } - .checkBox{ - display: flex; - margin: 0.2rem; - align-items: center !important; - } - .flex-pr{ - align-items: center !important; - display: flex; - } - .comment-header{ - height: 2rem !important; - } - - .comment-body{ - min-height: 8rem !important; - } - - img { - margin: 2% 0; - border-radius: 0.375rem; - border: 1px solid #ced4da; - border-radius: 0.375rem; - line-height: 1.5; - padding: 0.375rem 0.75rem; - width: 100%; - } - .pr-select{ - width: 50px!important; - } - .issue-select { - width: 100px!important; - } - - \ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.html b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.html deleted file mode 100644 index 8e3f1f30..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.html +++ /dev/null @@ -1,63 +0,0 @@ -
-
-
-
- -
-
-
- -
-
-
-
-
- Pull Request - - - #{{pr}} - -
-
-
-
- Issue - - - {{issue}} - -
-
-
- -
-
- -
-
- -
- -
- -
\ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.ts b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.ts deleted file mode 100644 index 99d4cd35..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-developer/report-developer.component.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../../../../../visuall/global-variable.service'; -import { Observable } from 'rxjs'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Neo4jDb } from '../../../../../../visuall/db-service/neo4j-db.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ModalContentComponent } from '../../../modal-content/modal-content.component'; - -interface Attachment { - name: string; - data: any, - type: string; -} -@Component({ - selector: 'app-report-developer', - templateUrl: './report-developer.component.html', - styleUrls: ['./report-developer.component.css'] -}) -export class ReportDeveloperComponent implements OnInit { - key: string; - pr_key: string; - issue_key:string; - prs: string[]; - filteredPrs: string[] = []; - filteredIssues: string[] = []; - issues: string[]; - commentInput: any = { - addGraph: false, addReviewer: false - }; - addMenu: any[]; - dataURL: string = ""; - attachments: Attachment[] = []; - - githubHttpOptions: any; //Github rest api header - sha_github: string = ""; - authentication: any; - imageUrl: string; - comment: any; - constructor(public _dbService: Neo4jDb, private _g: GlobalVariableService, private http: HttpClient, private modalService: NgbModal) { } - - ngOnInit(): void { - this.key = this._g.cy.$(':selected')[0]._private.data.name; - this.comment = { - header: "", - body: "", - } - this.addMenu = [ - { label: 'On Pull Request ', value: this.commentInput.addGithub, function: "addGithub()" }, - { label: 'On Issue', value: this.commentInput.addJira, function: "addJira()" }, - { label: 'Graph', value: this.commentInput.addGraph, function: "addGraph()" }, - ] - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/getAuthentication" : - `http://${window.location.hostname}:4445/getAuthentication`; - this.http.get(url).subscribe(data => { - this.authentication = data; - this.githubHttpOptions = { - headers: new HttpHeaders({ - 'Authorization': `Bearer ${this.authentication.github.github.access_token}`, - 'Accept': 'application/vnd.github.v3+json' - }) - }; - }); - } - fillPr(data) { - this.prs = []; - for (let i = 0; i < data.data.length; i++) { - this.prs.push(data.data[i][0]); - } - this.filteredPrs = this.prs.slice(); - } - fillIssues(data) { - this.issues = []; - for (let i = 0; i < data.data.length; i++) { - this.issues.push(data.data[i][0]); - } - this.filteredIssues = this.issues.slice(); - } - - filterOptionsPr(value: string) { - this.filteredPrs = this.prs.filter(pr => - pr.toLowerCase().includes(value) - ); - } - - filterOptionsIssue(value: string) { - this.filteredIssues = this.issues.filter(issue => - issue.toLowerCase().includes(value.toLowerCase()) - ); - } - - addGraph() { - if (!this.commentInput.addGraph) { - this.commentInput.addGraph = true; - } - else { - this.commentInput.addGraph = false - this.dataURL = "" - this.attachments = [] - } - } - addJira() { - if (!this.commentInput.addJira) { - this.commentInput.addJira = true - this._dbService.runQuery(`MATCH (n:Issue) RETURN distinct n.name`, (x) => this.fillIssues(x), DbResponseType.table); - - } - else { - this.commentInput.addJira = false - } - - } - addGithub() { - if (!this.commentInput.addGithub) { - this.commentInput.addGithub = true; - this._dbService.runQuery(`MATCH (n:PullRequest) RETURN distinct n.name`, (x) => this.fillPr(x), DbResponseType.table); - } - else { - this.commentInput.addGithub = false - } - - } - onCheckboxChange(item: any) { - this.callFunction(item.function); - } - - callFunction(functionName: string) { - switch (functionName) { - case "addJira()": - this.addJira(); - break; - case "addGithub()": - this.addGithub(); - break; - case "addGraph()": - this.addGraph(); - break; - } - } - - async performSelection() { - this.comment.body = "[You can inspect developer " + this.key + " from this link](http://" + window.location.hostname + ":" + window.location.port + "/?name=" + this.key.replace(" ", "%20") + ")\n"; - if (this.commentInput.addGraph) { - this.saveAsPng(false); - } - if (this.commentInput.addGithub) { - this.comment.header = "Report @" + this.key.replace(" ", "") + " "; - - } - if (this.commentInput.addJira) { - this.comment.header = "Report @" + this.key.replace(" ", "") + " "; - - } - } - - async postComment() { - if (this.authentication.authenticated) { - if (this.commentInput.addGithub) { - let commentBody = { - body: `### ${this.comment.header}\n${this.comment.body}` - }; - if (this.commentInput.addGraph) { - await this.updateFile().subscribe(response => { - console.log('Comment posted successfully:', response); - this.imageUrl = response["content"]["download_url"] - commentBody = { - body: `### ${this.comment.header}\n${this.comment.body}\n![image](${this.imageUrl})` - }; - this.http.post(`https://api.github.com/repos/${this.authentication.github.github_repo}/issues/${this.pr_key}/comments`, commentBody, this.githubHttpOptions).subscribe(response => { - this.openModal("Pull Request " + this.pr_key, response["html_url"], 'report') - }, error => { - console.error('Error posting comment:', error); - }); - }, error => { - console.error('Error updating image:', error); - }); - - } - else { - this.http.post(`https://api.github.com/repos/${this.authentication.github.github_repo}/issues/${this.pr_key}/comments`, commentBody, this.githubHttpOptions).subscribe(response => { - console.log('Comment posted successfully:', response); - this.openModal("Pull Request " + this.pr_key, response["html_url"], 'report') - }, error => { - console.error('Error posting comment:', error); - }); - } - } - if (this.commentInput.addJira) { - let body = { - "header": this.comment.header, - "text": this.comment.body.substring(this.comment.body.indexOf("]") + 1), - "url": `http://${window.location.hostname}:${window.location.port}/?name=${this.key.replace(" ", "%20")}`, - "issueName": this.issue_key, - "imgData": this.dataURL ? this.dataURL.split(",")[1] : "", - "uploadImage": this.commentInput.addGraph - } - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/sendJiraComment" : - `http://${window.location.hostname}:4445/sendJiraComment`; - this.http.post(url, body, { headers: { 'Content-Type': 'application/json' } }) - .subscribe( - (response) => { - console.info('Confirm request success', response); - const url = `${this.authentication.jira.jira_url}/browse/${this.issue_key}?focusedCommentId=${response["id"]} ` - this.openModal("issue " + this.issue_key, url, 'report') - }, - (error) => { - console.error('Confirm request error:', error); - } - ); - } - } else { - this.openModal("", "", 'error') - } - } - - updateFile(): Observable { - const filename = `image_${Date.now()}.png`; - const url = `https://api.github.com/repos/${this.authentication.github.github_repo}/contents/assets/${filename}`; - const body = { - message: "Add image", - content: `${this.dataURL.split(",")[1]}` - }; - const options = this.githubHttpOptions; - return this.http.put(url, body, options); - } - - openModal(name, url, templateType): void { - const modalRef = this.modalService.open(ModalContentComponent); - modalRef.componentInstance.name = name; // Pass data to the modal component - modalRef.componentInstance.url = url; - modalRef.componentInstance.templateType = templateType; - } - - async saveAsPng(isWholeGraph: boolean) { - const options = { bg: 'white', scale: 2, full: isWholeGraph }; - const base64png =this._g.cy.pngFull(options, ['cy-context-menus-cxt-menu','cy-panzoom']); - const image = new Image(); - image.src = await base64png; - image.onload = async () => { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - canvas.width = image.width / 4; - canvas.height = image.height / 4; - ctx.drawImage(image, 0, 0, canvas.width, canvas.height); - this.dataURL = canvas.toDataURL('image/png'); - }; - } - - onItemSelected(item: string) { - this.pr_key = item; - console.log('Selected Item:', item); - } - - -} diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.css b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.css deleted file mode 100644 index 52b0d23c..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.css +++ /dev/null @@ -1,73 +0,0 @@ -.btn-close{ - float: right; - } - .draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90) !important; - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; - min-width: 150px; - top:60vh; - - right: 25vw; - } - .modal-header{ - display: block; - } - .subpanel-heading { - cursor: pointer; - text-align: center; - background-color: #eaeaea40; - line-height: 1.45; - display: flex; - width: 22vw; - justify-content: center; - flex-direction: column; - } - - .dd-item { - padding: 0.37rem !important; - } - - .flex{ - flex-wrap: wrap; - margin-top: 1rem; - align-items: center !important; - display: flex; - width: 100%; - display: flex; - justify-content: center; - } - .checkBox{ - display: flex; - margin: 0.2rem; - align-items: center !important; - } - .flex-pr{ - align-items: center !important; - display: flex; - } - .comment-header{ - height: 2rem !important; - } - - .comment-body{ - min-height: 8rem !important; - } - - img { - margin: 2% 0; - border-radius: 0.375rem; - border: 1px solid #ced4da; - border-radius: 0.375rem; - line-height: 1.5; - padding: 0.375rem 0.75rem; - width: 100%; - } - - .pr-select{ - width: 50px!important; - } diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.html b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.html deleted file mode 100644 index de38d98e..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.html +++ /dev/null @@ -1,48 +0,0 @@ -
-
-
-
- -
-
-
- -
-
- -
-
-
- Pull Request - - - #{{pr}} - -
-
-
- -
-
- -
-
- -
- -
- -
\ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.ts b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.ts deleted file mode 100644 index 87964703..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-file/report-file.component.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../../../../../visuall/global-variable.service'; -import { Observable } from 'rxjs'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Neo4jDb } from '../../../../../../visuall/db-service/neo4j-db.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ModalContentComponent } from '../../../modal-content/modal-content.component'; - -interface Attachment { - name: string; - data: any, - type: string; -} -@Component({ - selector: 'app-report-file', - templateUrl: './report-file.component.html', - styleUrls: ['./report-file.component.css'] -}) -export class ReportFileComponent implements OnInit { - key: string; - pr_key: string; - prs: string[]; - filteredPrs: string[] = []; - commentInput: any = { - addGraph: false - }; - addMenu: any[]; - dataURL: string = ""; - attachments: Attachment[] = []; - - githubHttpOptions: any; //Github rest api header - sha_github: string = ""; - authentication: any; - imageUrl: string; - comment: any; - - constructor(public _dbService: Neo4jDb, private _g: GlobalVariableService, private http: HttpClient, private modalService: NgbModal) { } - - ngOnInit(): void { - this.key = this._g.cy.$(':selected')[0]._private.data.name; - this.comment = { - header: "", - body: "", - } - this._dbService.runQuery(`MATCH (n:PullRequest) RETURN distinct n.name`, (x) => this.fillPr(x), DbResponseType.table); - this.addMenu = [ - { label: 'Graph', value: this.commentInput.addGraph, function: "addGraph()" }, - ] - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/getAuthentication" : - `http://${window.location.hostname}:4445/getAuthentication`; - this.http.get(url).subscribe(data => { - this.authentication = data; - this.githubHttpOptions = { - headers: new HttpHeaders({ - 'Authorization': `Bearer ${this.authentication.github.access_token}`, - 'Accept': 'application/vnd.github.v3+json' - }) - }; - }); - } - fillPr(data) { - this.prs = []; - for (let i = 0; i < data.data.length; i++) { - this.prs.push(data.data[i][0]); - } - this.filteredPrs = this.prs.slice(); - } - - filterOptionsPr(value: string) { - this.filteredPrs = this.prs.filter(pr => - pr.toLowerCase().includes(value.toLowerCase()) - ); - } - - - addGraph() { - if (!this.commentInput.addGraph) { - this.commentInput.addGraph = true; - } - else { - this.commentInput.addGraph = false - this.dataURL = "" - this.attachments = [] - } - } - onCheckboxChange(item: any) { - this.callFunction(item.function); - } - - callFunction(functionName: string) { - switch (functionName) { - case "addGraph()": - this.addGraph(); - break; - } - } - - async performSelection() { - this.comment.header = "Report File " + this.key + " "; - this.comment.body = "[You can inspect artifact " + this.key + " from this link](http://" + window.location.hostname + ":" + window.location.port + "/?name=" + this.key + ")\n"; - if (this.commentInput.addGraph) { - this.saveAsPng(false); - } - } - - async postComment() { - if (this.authentication.authenticated) { - let commentBody = { - body: `### ${this.comment.header}\n${this.comment.body}` - }; - if (this.commentInput.addGraph) { - await this.updateFile().subscribe(response => { - console.log('Comment posted successfully:', response); - this.imageUrl = response["content"]["download_url"] - commentBody = { - body: `### ${this.comment.header}\n${this.comment.body}\n![image](${this.imageUrl})` - }; - this.http.post(`https://api.github.com/repos/${this.authentication.github.github_repo}/issues/${this.pr_key}/comments`, commentBody, this.githubHttpOptions).subscribe(response => { - this.openModal("Pull Request " + this.pr_key, response["html_url"], 'report') - }, error => { - console.error('Error posting comment:', error); - }); - }, error => { - console.error('Error updating image:', error); - }); - - } - else { - this.http.post(`https://api.github.com/repos/${this.authentication.github.github_repo}/issues/${this.pr_key}/comments`, commentBody, this.githubHttpOptions).subscribe(response => { - console.log('Comment posted successfully:', response); - this.openModal("Pull Request" + this.pr_key, response["html_url"], 'report') - }, error => { - console.error('Error posting comment:', error); - }); - } - } else { - this.openModal("", "", 'error') - } - } - - updateFile(): Observable { - const filename = `image_${Date.now()}.png`; - const url = `https://api.github.com/repos/${this.authentication.github.github_repo}/contents/assets/${filename}`; - const body = { - message: "Add image", - content: `${this.dataURL.split(",")[1]}` - }; - const options = this.githubHttpOptions; - return this.http.put(url, body, options); - } - - openModal(name, url, templateType): void { - const modalRef = this.modalService.open(ModalContentComponent); - modalRef.componentInstance.name = name; // Pass data to the modal component - modalRef.componentInstance.url = url; - modalRef.componentInstance.templateType = templateType; - } - - async saveAsPng(isWholeGraph: boolean) { - const options = { bg: 'white', scale: 2, full: isWholeGraph }; - const base64png =this._g.cy.pngFull(options, ['cy-context-menus-cxt-menu','cy-panzoom']); - const image = new Image(); - image.src = await base64png; - image.onload = async () => { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - canvas.width = image.width / 4; - canvas.height = image.height / 4; - ctx.drawImage(image, 0, 0, canvas.width, canvas.height); - this.dataURL = canvas.toDataURL('image/png'); - }; - } - -} diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.css b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.css deleted file mode 100644 index 25617bfe..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.css +++ /dev/null @@ -1,69 +0,0 @@ -.btn-close{ - float: right; -} -.draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90) !important; - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; - min-width: 150px; - top:60vh; - - right: 25vw; -} -.modal-header{ - display: block; -} -.subpanel-heading { - cursor: pointer; - text-align: center; - background-color: #eaeaea40; - line-height: 1.45; - display: flex; - width: 22vw; - justify-content: center; - flex-direction: column; -} - - .dd-item { - padding: 0.37rem !important; - } - - .flex{ - flex-wrap: wrap; - margin-top: 1rem; - align-items: center !important; - display: flex; - width: 100%; - display: flex; - justify-content: center; - } - .checkBox{ - display: flex; - margin: 0.2rem; - align-items: center !important; - } - .flex-pr{ - align-items: center !important; - display: flex; - } - .comment-header{ - height: 2rem !important; - } - - .comment-body{ - min-height: 8rem !important; - } - - img { - margin: 2% 0; - border-radius: 0.375rem; - border: 1px solid #ced4da; - border-radius: 0.375rem; - line-height: 1.5; - padding: 0.375rem 0.75rem; - width: 100%; - } \ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.html b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.html deleted file mode 100644 index fcd5f1b7..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.html +++ /dev/null @@ -1,48 +0,0 @@ -
-
-
-
- -
-
-
- - -
-
-
-
-
- -
-
-
- -
-
- -
-
- -
-
- -
-
- -
- -
- - - -
\ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.ts b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.ts deleted file mode 100644 index 97888dc2..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-issue/report-issue.component.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../../../../../visuall/global-variable.service'; -import { Observable } from 'rxjs'; -import { DbResponseType } from 'src/app/visuall/db-service/data-types'; -import { HttpClient } from '@angular/common/http'; -import { Neo4jDb } from '../../../../../../visuall/db-service/neo4j-db.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ModalContentComponent } from '../../../modal-content/modal-content.component'; - -interface Attachment { - name: string; - data: any, - type: string; -} - -interface BoolSetting { - isEnable: boolean; - text: string; - name: string; -} - -@Component({ - selector: 'app-report-issue', - templateUrl: './report-issue.component.html', - styleUrls: ['./report-issue.component.css'] -}) -export class ReportIssueComponent implements OnInit { - key:string; - commentInput: any = { - addGraph: false, addAnomaly: false - }; - addMenu: any[]; - dataURL: string=""; - attachments: Attachment[] = []; - authentication: any; - imageUrl: string; - comment: any; - anomalies: BoolSetting[]; - number_of_anomalies: number = 0; - anomalyModal: boolean = true; - - constructor(public _dbService: Neo4jDb, private _g: GlobalVariableService, private http: HttpClient, private modalService: NgbModal) {} - - ngOnInit(): void { - this.key = this._g.cy.$(':selected')[0]._private.data.name; - this.comment = { - header:"", - body : "", - } - this.anomalies = [ - { text: 'Unassigned Bugs', isEnable: true, name: "Unassigned issue" }, - { text: 'No Link to Bug-Fixing Commit', isEnable: true, name: "No link to bug fixing commit or pull request" }, - { text: 'Ignored Bugs', isEnable: true, name: "Ignored bug" }, - { text: 'Missing Priority', isEnable: true, name: "Missing Priority" }, - { text: 'Missing Environment Information', isEnable: true, name: "Missing Environment Information" }, - { text: 'No comment bugs', isEnable: true, name: "No comment on issue" }, - { text: 'Non-Assignee Resolver of Bug', isEnable: true, name: "No assignee resolver" }, - { text: 'Closed-Reopen Ping Pong', isEnable: true, name: "Closed reopen ping pong" }, - { text: 'Reassignment of Bug Assignee', isEnable: true, name: "Reassignment of Bug Assignee" }, - { text: 'Not Referenced Duplicates', isEnable: true, name: "Not Referenced duplicate" }, - { text: 'Same Resolver Closer', isEnable: true, name: "Same resolver closer" } - ]; - this.addMenu = [ - { label: 'Graph', value: this.commentInput.addGraph, function: "addGraph()" }, - { label: 'Anomaly', value: this.commentInput.addAnomaly, function: "addAnomaly()" }, - ] - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/getAuthentication" : - `http://${window.location.hostname}:4445/getAuthentication`; - this.http.get(url).subscribe(data => { - this.authentication = data; - }); - - if(this._g.openReportTab.getValue()){ - this.commentInput={ - addGraph: false, addAnomaly: true - }; - this.addMenu = [ - { label: 'Graph', value: this.commentInput.addGraph, function: "addGraph()" }, - { label: 'Anomaly', value: this.commentInput.addAnomaly, function: "addAnomaly()" }, - ] - this.performSelection(); - - } - } - - addGraph() { - if (!this.commentInput.addGraph) { - this.commentInput.addGraph = true; - } - else { - this.commentInput.addGraph = false - this.dataURL = "" - this.attachments = [] - } - } - - addAnomaly() { - if (!this.commentInput.addAnomaly) { - this.commentInput.addAnomaly = true; - this.anomalyModal = true; - - } - else { - this.commentInput.addAnomaly = false - this.anomalyModal = false; - } - } - - onCheckboxChange(item: any) { - this.callFunction(item.function); - } - - callFunction(functionName: string) { - switch (functionName) { - case "addAnomaly()": - this.addAnomaly(); - break; - case "addGraph()": - this.addGraph(); - break; - } - } - - async performSelection() { - this.comment.body = "[You can inspect artifact " + this.key + " from this link](http://" + window.location.hostname + ":" + window.location.port + "/?name=" + this.key + ")\n"; - if (this.commentInput.addGraph) { - this.saveAsPng(false); - } - if (this.commentInput.addAnomaly) { - let commentAnomaly = ""; - const queries = this.anomalies - .filter((anomaly) => anomaly.isEnable) - .map((anomaly) => this.anomalyQ(anomaly.name)); - const queryResults = await Promise.all(queries); - commentAnomaly = queryResults.join(" "); - if (this.number_of_anomalies > 0) { - commentAnomaly = "\nAnomalies: We have detected " + this.number_of_anomalies + " anomaly in the issue " + this.key + "." + commentAnomaly; - } else { - commentAnomaly += "\nAnomalies: We have not detected any anomaly in the issue " + this.key + "."; - } - this.number_of_anomalies = 0; - this.comment.body = this.comment.body + commentAnomaly; - } - } - - async postComment() { - if (this.authentication.authenticated) { - let body = { - "header": this.comment.header, - "text": this.comment.body.substring(this.comment.body.indexOf("]") + 1), - "url": `http://${window.location.hostname}:${window.location.port}/?name=${this.key.replace(" ", "%20")}`, - "issueName": this.key, - "imgData": this.dataURL ? this.dataURL.split(",")[1] : "", - "uploadImage": this.commentInput.addGraph - } - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/sendJiraComment" : - `http://${window.location.hostname}:4445/sendJiraComment`; - this.http.post(url, body, { headers: { 'Content-Type': 'application/json' } }) - .subscribe( - (response) => { - console.info('Confirm request success', response); - const url = `${this.authentication.jira.jira_url}/browse/${this.key}?focusedCommentId=${response["id"]} ` - this.openModal("issue " + this.key, url, 'report') - }, - (error) => { - console.error('Confirm request error:', error); - } - ); - } - else { - this.openModal("", "", 'error') - } - } - - - openModal(name, url, templateType): void { - const modalRef = this.modalService.open(ModalContentComponent); - modalRef.componentInstance.name = name; // Pass data to the modal component - modalRef.componentInstance.url = url; - modalRef.componentInstance.templateType = templateType; - } - - async saveAsPng(isWholeGraph: boolean) { - const options = { bg: 'white', scale: 2, full: isWholeGraph }; - const base64png =this._g.cy.pngFull(options, ['cy-context-menus-cxt-menu','cy-panzoom']); - - - - const image = new Image(); - image.src = await base64png; - image.onload = async () => { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - canvas.width = image.width / 4; - canvas.height = image.height / 4; - ctx.drawImage(image, 0, 0, canvas.width, canvas.height); - this.dataURL = canvas.toDataURL('image/png'); - }; - } - async anomalyQ(anomalyName: string): Promise { - const cql = ` MATCH (issue:Issue {name : '${this.key}'}) - WHERE issue.anomalyList IS NOT NULL AND '${anomalyName}' IN issue.anomalyList - RETURN true` - return await this.runAnomalyQuery(cql, anomalyName); - } - - - async runAnomalyQuery(cql: string, name: string) { - return new Promise((resolve, reject) => { - const cb = (x) => { - const result = x.data[0] - if (result && result[0]) { - this.number_of_anomalies += 1 - if (name == "Ignored bug:") { - const startDateString = result[1].slice(0, 10); - const endDateString = result[2].slice(0, 10); - resolve(`\nAnomaly Found:Ignored bug: From ${startDateString} To ${endDateString}`); - } - else if (name == "No assignee resolver:") { - resolve(`\nNo assignee resolver: Assignee ${result[1]} Resolver ${result[0]}`); - } - else { - resolve("\nAnomaly Found: " + name); - } - } - else { - resolve(""); - } - }; - this._dbService.runQuery(cql, cb, DbResponseType.table); - }); - } - -} diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.css b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.css deleted file mode 100644 index e3c2f443..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.css +++ /dev/null @@ -1,69 +0,0 @@ -.btn-close{ - float: right; - } - .draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90) !important; - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; - min-width: 150px; - top:60vh; - - right: 25vw; - } - .modal-header{ - display: block; - } - .subpanel-heading { - cursor: pointer; - text-align: center; - background-color: #eaeaea40; - line-height: 1.45; - display: flex; - width: 22vw; - justify-content: center; - flex-direction: column; - } - - .dd-item { - padding: 0.37rem !important; - } - - .flex{ - flex-wrap: wrap; - margin-top: 1rem; - align-items: center !important; - display: flex; - width: 100%; - display: flex; - justify-content: center; - } - .checkBox{ - display: flex; - margin: 0.2rem; - align-items: center !important; - } - .flex-pr{ - align-items: center !important; - display: flex; - } - .comment-header{ - height: 2rem !important; - } - - .comment-body{ - min-height: 8rem !important; - } - - img { - margin: 2% 0; - border-radius: 0.375rem; - border: 1px solid #ced4da; - border-radius: 0.375rem; - line-height: 1.5; - padding: 0.375rem 0.75rem; - width: 100%; - } \ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.html b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.html deleted file mode 100644 index 0495b7ac..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.html +++ /dev/null @@ -1,34 +0,0 @@ -
-
- -
-
- -
-
-
- -
-
-
-
- -
-
- -
-
- -
- -
- - - -
\ No newline at end of file diff --git a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.ts b/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.ts deleted file mode 100644 index ecdb5491..00000000 --- a/src/app/custom/operational-tabs/object-tab/report-tab/sub-report-tabs/report-pr/report-pr.component.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../../../../../visuall/global-variable.service'; -import { Observable } from 'rxjs'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Neo4jDb } from '../../../../../../visuall/db-service/neo4j-db.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ModalContentComponent } from '../../../modal-content/modal-content.component'; - -interface Attachment { - name: string; - data: any, - type: string; -} -@Component({ - selector: 'app-report-pr', - templateUrl: './report-pr.component.html', - styleUrls: ['./report-pr.component.css'] -}) -export class ReportPrComponent implements OnInit { - key:string; - commentInput: any = { - addGraph: false, addReviewer: false - }; - addMenu: any[]; - dataURL: string=""; - attachments: Attachment[] = []; - reviewerData: any[] = []; - githubHttpOptions: any; //Github rest api header - sha_github: string = ""; - authentication: any; - imageUrl: string; - comment: any; - - constructor(public _dbService: Neo4jDb, private _g: GlobalVariableService, private http: HttpClient, private modalService: NgbModal) {} - - ngOnInit(): void { - this.key = this._g.cy.$(':selected')[0]._private.data.name; - this.comment = { - header:"", - body : "", - } - - this.addMenu = [ - { label: 'Graph', value: this.commentInput.addGraph, function: "addGraph()" }, - { label: 'Reviewer Recommendation ', value: this.commentInput.addReviewer, function: "addReviewer()" }, - ] - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/getAuthentication" : - `http://${window.location.hostname}:4445/getAuthentication`; - this.http.get(url).subscribe(data => { - this.authentication = data; - this.githubHttpOptions = { - headers: new HttpHeaders({ - 'Authorization': `Bearer ${this.authentication.github.access_token}`, - 'Accept': 'application/vnd.github.v3+json' - }) - }; - }); - } - - addGraph() { - if (!this.commentInput.addGraph) { - this.commentInput.addGraph = true; - } - else { - this.commentInput.addGraph = false - this.dataURL = "" - this.attachments = [] - } - } - - addReviewer() { - if (!this.commentInput.addReviewer) { - this.commentInput.addReviewer = true; - - } - else { - this.commentInput.addReviewer = false - } - } - - onCheckboxChange(item: any) { - this.callFunction(item.function); - } - - callFunction(functionName: string) { - switch (functionName) { - case "addReviewer()": - this.addReviewer(); - break; - case "addGraph()": - this.addGraph(); - break; - } - } - - async performSelection() { - this.comment.body = "[You can inspect artifact " + this.key + " from this link](http://" + window.location.hostname + ":" + window.location.port + "/?name=" + this.key + ")\n"; - if (this.commentInput.addGraph) { - this.saveAsPng(false); - } - if (this.commentInput.addReviewer) { - const cb = (x) => { - this.reviewerData = x.data; - let recommendation = ''; - if(x.data[0][1].length>0){ - recommendation += 'Recommended developers are;\n'; - x.data[0][1].forEach((developer, index) => { - recommendation += `@${developer.replace(' ', '')} with score ${x.data[0][2][index].toFixed(2)}\n` - }); - } - else{ - recommendation += 'There is no recommended reviewer.\n'; - } - this.comment.body = this.comment.body + recommendation; - } - const timeMap = this.getTimebarMapping4Java(); - let d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - let d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - d1 = 0; - d2 = 0; - } - let ignoredDevelopers; - let possibleDevelopers - let fileIds; - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - - const cbSub1 = (x) => { - fileIds = x.data[0][0] - if (fileIds.length > 0) { - this._dbService.runQuery(`MATCH (file:File)-[*1..3]-(developer:Developer) - WHERE elementId(file) IN ['${fileIds.join("','")}'] - RETURN COLLECT(DISTINCT elementId(developer)) AS developersList`, cbSub2, DbResponseType.table, false); - } - } - const cbSub2 = (x) => { - possibleDevelopers = x.data[0][0] - if (possibleDevelopers.length > 0) { - this._dbService.runQuery(`MATCH (N:PullRequest{name:'${this.key}'})-[:INCLUDES]-(c:Commit)-[:COMMITTED]-(d:Developer) - WITH collect(distinct elementId(d)) AS ignoreDevs return ignoreDevs`, cbSub3, DbResponseType.table, false); - } - } - const cbSub3 = (x) => { - let ignoredDevelopers = x.data[0][0] - possibleDevelopers = possibleDevelopers.filter(dev => !ignoredDevelopers.includes(dev)); - if (possibleDevelopers.length > 0) { - this._dbService.runQuery(`CALL findNodesWithMostPathBetweenTable(['${fileIds.join("','")}'], ['COMMENTED'],['${possibleDevelopers.join("','")}'],'recency',3,3, false, - 225, 1, null, false, 'score', 0,${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, null)`, cb, DbResponseType.table, false); - } - } - - - this._dbService.runQuery(`MATCH (N:PullRequest{name:'${this.key}'})-[:INCLUDES]-(c:Commit)-[:CONTAINS]-(f:File) WITH collect(distinct elementId(f)) AS fileIds RETURN fileIds`, cbSub1, DbResponseType.table, false); - - - - - - } - } - - async postComment() { - if (this.authentication.authenticated) { - let commentBody = { - body: `### ${this.comment.header}\n${this.comment.body}` - }; - //If add graph is selected - if (this.commentInput.addGraph) { - await this.updateFile().subscribe(response => { - console.log('Comment posted successfully:', response); - this.imageUrl = response["content"]["download_url"] - commentBody = { - body: `### ${this.comment.header}\n${this.comment.body}\n![image](${this.imageUrl})` - }; - this.http.post(`https://api.github.com/repos/${this.authentication.github.github_repo}/issues/${this.key}/comments`, commentBody, this.githubHttpOptions).subscribe(response => { - this.openModal("pull request " + this.key, response["html_url"], 'report') - }, error => { - console.error('Error posting comment:', error); - }); - }, error => { - console.error('Error updating image:', error); - }); - - } - else { - this.http.post(`https://api.github.com/repos/${this.authentication.github.github_repo}/issues/${this.key}/comments`, commentBody, this.githubHttpOptions).subscribe(response => { - console.log('Comment posted successfully:', response); - this.openModal("pull request " + this.key, response["html_url"], 'report') - }, error => { - console.error('Error posting comment:', error); - }); - } - } else { - this.openModal("", "", 'error') - } - } - - updateFile(): Observable { - const filename = `image_${Date.now()}.png`; - const url = `https://api.github.com/repos/${this.authentication.github.github_repo}/contents/assets/${filename}`; - const body = { - message: "Add image", - content: `${this.dataURL.split(",")[1]}` - }; - const options = this.githubHttpOptions; - return this.http.put(url, body, options); - } - - openModal(name, url, templateType): void { - const modalRef = this.modalService.open(ModalContentComponent); - modalRef.componentInstance.name = name; // Pass data to the modal component - modalRef.componentInstance.url = url; - modalRef.componentInstance.templateType = templateType; - } - - async saveAsPng(isWholeGraph: boolean) { - const options = { bg: 'white', scale: 2, full: isWholeGraph }; - const base64png =this._g.cy.pngFull(options, ['cy-context-menus-cxt-menu','cy-panzoom']); - const image = new Image(); - image.src = await base64png; - image.onload = async () => { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - canvas.width = image.width / 4; - canvas.height = image.height / 4; - ctx.drawImage(image, 0, 0, canvas.width, canvas.height); - this.dataURL = canvas.toDataURL('image/png'); - }; - } - - getTimebarMapping4Java(): string { - const mapping = this._g.appDescription.getValue().timebarDataMapping; - let s = '{' - for (const k in mapping) { - s += k + ':["' + mapping[k].begin_datetime + '","' + mapping[k].end_datetime + '"],'; - } - s = s.slice(0, -1); - s += '}' - return s; - } -} diff --git a/src/app/shared/elem-of-interest/elem-of-interest.component.css b/src/app/shared/elem-of-interest/elem-of-interest.component.css deleted file mode 100644 index d0d42de4..00000000 --- a/src/app/shared/elem-of-interest/elem-of-interest.component.css +++ /dev/null @@ -1,58 +0,0 @@ -.icon { - width: 16px; - height: 16px; -} - -.down-icon:after { - font-family: 'FontAwesome', sans-serif; - content: "\f077"; - float: right; - padding-right: 4px; -} - -/* symbol for "collapsed" panels */ - -.up-icon:after { - font-family: 'FontAwesome', sans-serif; - content: "\f078"; - float: right; - padding-right: 4px; -} - -.max-h500 { - max-height: 500px; - transition: max-height 0.35s ease-in; - overflow: auto; -} - -.max-h0 { - max-height: 0; - overflow: hidden; - transition: max-height 0.35s ease-out; -} - -.img-btn { - width: 24px; - height: 24px; - cursor: pointer; -} - -.highlighted-btn { - animation-name: borderanim; - animation-duration: 1s; - animation-timing-function: ease-in-out; - animation-iteration-count: infinite; - animation-direction: reverse; -} - -@keyframes borderanim { - 0% { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, .25); - } - 50% { - box-shadow: 0 0 white; - } - 100% { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, .25); - } -} \ No newline at end of file diff --git a/src/app/shared/elem-of-interest/elem-of-interest.component.html b/src/app/shared/elem-of-interest/elem-of-interest.component.html deleted file mode 100644 index 79e393cb..00000000 --- a/src/app/shared/elem-of-interest/elem-of-interest.component.html +++ /dev/null @@ -1,32 +0,0 @@ - - -
- - {{header}} - - - -
-
-
-
-
- {{n.label}}  - -
-
-
-
- - - -
-
\ No newline at end of file diff --git a/src/app/shared/elem-of-interest/elem-of-interest.component.ts b/src/app/shared/elem-of-interest/elem-of-interest.component.ts deleted file mode 100644 index 781d5a37..00000000 --- a/src/app/shared/elem-of-interest/elem-of-interest.component.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { Component, OnInit, ViewChild, Output, EventEmitter, Input } from '@angular/core'; -import { GlobalVariableService } from '../../visuall/global-variable.service'; -import { readTxtFile, isJson } from '../../visuall/constants'; -import { GraphElem, ElemAsQueryParam } from '../../visuall/db-service/data-types'; - -@Component({ - selector: 'app-elem-of-interest', - templateUrl: './elem-of-interest.component.html', - styleUrls: ['./elem-of-interest.component.css'] -}) -export class ElemOfInterestComponent implements OnInit { - - @Input() header: string; - @Input() typeScope: string[]; - @ViewChild('file', { static: false }) file; - @Output() selectedElemsChanged = new EventEmitter(); - - selectedNodes: ElemAsQueryParam[] = []; - clickedNodeIdx = -1; - addNodeBtnTxt = 'Select nodes to add'; - addNodeBtnImg = 'assets/img/add-selection-cursor.svg'; - isShow = true; - - constructor(private _g: GlobalVariableService) { } - - ngOnInit(): void { - } - - selectedNodeClicked(i: number) { - this._g.isSwitch2ObjTabOnSelect = false; - this.clickedNodeIdx = i; - const idSelector = 'n' + this.selectedNodes[i].dbId; - this._g.cy.$().unselect(); - this._g.cy.elements(`[id = "${idSelector}"]`).select(); - this._g.isSwitch2ObjTabOnSelect = true; - } - - addSelectedNodes() { - if (this._g.isSwitch2ObjTabOnSelect) { - this._g.isSwitch2ObjTabOnSelect = false; - this.addNodeBtnTxt = 'Complete selection'; - this.addNodeBtnImg = 'assets/img/tick.svg' - return; - } - this.addNodeBtnTxt = 'Select nodes to add'; - this.addNodeBtnImg = 'assets/img/add-selection-cursor.svg' - this._g.isSwitch2ObjTabOnSelect = true; - const selectedNodes = this._g.cy.nodes(':selected'); - if (selectedNodes.length < 1) { - return; - } - const dbIds = selectedNodes.map(x => x.id().slice(1)); - const labels = this._g.getLabels4ElemsAsArray(dbIds); - const types = selectedNodes.map(x => x.classes()[0]); - for (let i = 0; i < labels.length; i++) { - if (this.selectedNodes.findIndex(x => x.dbId == dbIds[i]) < 0 && this.isValidType(types[i])) { - this.selectedNodes.push({ dbId: dbIds[i], label: types[i] + ':' + labels[i] }); - } - } - this.selectedElemsChanged.next(this.selectedNodes); - } - - addSelectedNodesFromFile() { - this.file.nativeElement.value = ''; - this.file.nativeElement.click(); - } - - fileSelected() { - readTxtFile(this.file.nativeElement.files[0], (txt) => { - let elems: GraphElem[] = []; - if (!isJson(txt)) { - const arr = txt.split('\n').map(x => x.split('|')); - if (arr.length < 0) { - return; - } - const idx4id = arr[0].indexOf('elementId'); - - for (let i = 1; i < arr.length; i++) { - if (this.selectedNodes.find(x => x.dbId == arr[i][idx4id].substring(1))) { - continue; - } - const o = {}; - for (let j = 1; j < arr[0].length; j++) { - o[arr[0][j]] = arr[i][j]; - } - elems.push({ classes: arr[i][0], data: o }); - } - } else { - elems = JSON.parse(txt) as GraphElem[]; - const fn1 = x => this.selectedNodes.find(y => y.dbId === x.data.id.substring(1)) === undefined; - if (!(elems instanceof Array)) { - elems = (JSON.parse(txt).nodes as any[]).filter(fn1); - } else { - elems = elems.filter(x => x.data.id.startsWith('n') && fn1(x)); - } - } - - elems = elems.filter(x => this.isValidType(x.classes.split(' ')[0])); - const labels = this._g.getLabels4ElemsAsArray(null, true, elems); - this.selectedNodes = this.selectedNodes.concat(elems.map((x, i) => { return { dbId: x.data.id.substring(1), label: x.classes.split(' ')[0] + ':' + labels[i] } })); - - this.selectedElemsChanged.next(this.selectedNodes); - }); - } - - removeSelected(i: number) { - if (i == this.clickedNodeIdx) { - this.clickedNodeIdx = -1; - const idSelector = 'n' + this.selectedNodes[i].dbId; - this._g.cy.$id(idSelector).unselect(); - } else if (i < this.clickedNodeIdx) { - this.clickedNodeIdx--; - } - this.selectedNodes.splice(i, 1); - this.selectedElemsChanged.next(this.selectedNodes); - } - - removeAllSelectedNodes() { - this.selectedNodes = []; - this.clickedNodeIdx = -1; - this.selectedElemsChanged.next(this.selectedNodes); - } - - private isValidType(className: string): boolean { - if (!this.typeScope) { - return true; - } - return this.typeScope.includes(className); - } - -} \ No newline at end of file diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts deleted file mode 100644 index 09d60f0e..00000000 --- a/src/app/shared/shared.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ReplacePipe, TableViewComponent } from './table-view/table-view.component'; -import { TypesViewComponent } from './types-view/types-view.component'; -import { ElemOfInterestComponent } from './elem-of-interest/elem-of-interest.component'; -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { AngularDraggableModule } from 'angular2-draggable'; -import { AutoSizeInputModule } from 'ngx-autosize-input'; -import { FormsModule } from '@angular/forms'; - - -@NgModule({ - declarations: [TableViewComponent, ReplacePipe, TypesViewComponent, ElemOfInterestComponent], - - imports: [ - CommonModule, - NgbModule, - AngularDraggableModule, - AutoSizeInputModule, - FormsModule, - ], - exports: [TableViewComponent, ReplacePipe, TypesViewComponent, ElemOfInterestComponent] -}) -export class SharedModule { } diff --git a/src/app/shared/table-view/table-view-types.ts b/src/app/shared/table-view/table-view-types.ts deleted file mode 100644 index c8b2e35a..00000000 --- a/src/app/shared/table-view/table-view-types.ts +++ /dev/null @@ -1,161 +0,0 @@ -export enum TableDataType { - string = 0, number = 1, datetime = 2, enum = 3, button = 4 -} - -export interface TableData { - val: any; - type: TableDataType; -} - -export interface TableViewInput { - // first property of every result must be ID - results: TableData[][]; - results2?: number[]; - columns: string[]; - isLoadGraph: boolean; - isMergeGraph: boolean; - currPage: number; - pageSize: number; - resultCnt: number; - isNodeData: boolean; - isShowExportAsCSV: boolean; - columnLimit?: number; - isHide0?: boolean; - isUseCySelector4Highlight?: boolean; - isHideLoadGraph?: boolean; - isReplace_inHeaders?: boolean; - isDisableHover?: boolean; - tableTitle?: string; - isEmphasizeOnHover?: boolean; - classNameOfObjects?: string; - classNames?: string[]; - isSelect?:boolean; -} - -export interface TableFiltering { - txt: string; - orderBy: string; - orderDirection: 'asc' | 'desc' | ''; - skip?: number; -} - -export interface TableRowMeta { - dbIds: string[]; - tableIdx: number[]; -} - -export function property2TableData(properties, enumMapping, propName: string, propVal: any, className: string, isEdge: boolean): TableData { - let t = ''; - if (isEdge) { - t = properties.edges[className][propName]; - } else { - t = properties.nodes[className][propName]; - } - if (t === undefined || t == null) { - return { val: propVal, type: TableDataType.string }; - } else if (t.startsWith('enum')) { - const mapping = enumMapping[className][propName][propVal]; - if (mapping) { - return { val: mapping, type: TableDataType.enum }; - } - return { val: propVal, type: TableDataType.string }; - } else if (t == 'string') { - return { val: propVal, type: TableDataType.string }; - } else if (t == 'list') { - if (typeof propVal === 'string') { - return { val: propVal, type: TableDataType.string }; - } - return { val: propVal.join(), type: TableDataType.string }; - } - else if (t == 'datetime') { - return { val: propVal, type: TableDataType.datetime }; - } else if (t == 'float' || t == 'int') { - return { val: propVal, type: TableDataType.number }; - } else { - return { val: 'see rawData2TableData function', type: TableDataType.string }; - } -} - -export function getClassNameFromProperties(properties, propNames: string[]): string { - - for (let nodeClass in properties.nodes) { - if (isSubset(Object.keys(properties.nodes[nodeClass]), propNames)) { - return nodeClass; - } - } - - for (let edgeClass in properties.edges) { - if (isSubset(Object.keys(properties.edges[edgeClass]), propNames)) { - return edgeClass; - } - } - console.log('could not find class from') - return null; -} - -export function filterTableDatas(filter: TableFiltering, inp: TableViewInput, isIgnoreCaseInText: boolean) { - let idxHide = []; - // filter by text - for (let i = 0; i < inp.results.length; i++) { - let isMatch = false; - // first column is ID - for (let j = 1; j < inp.results[i].length; j++) { - let curr = inp.results[i][j].val; - if (isIgnoreCaseInText) { - if ((curr + '').toLowerCase().includes(filter.txt.toLowerCase())) { - isMatch = true; - break; - } - } else { - if ((curr + '').includes(filter.txt)) { - isMatch = true; - break; - } - } - } - if (!isMatch) { - idxHide.push(i); - } - } - - inp.results = inp.results.filter((_, i) => !idxHide.includes(i)); - - // order by - if (filter.orderDirection.length > 0) { - let i = inp.columns.findIndex(x => x == filter.orderBy); - if (i < 0) { - console.error('i < 0 !'); - } - i++; // first column is for ID or for highlight - if (filter.orderDirection == 'asc') { - inp.results = inp.results.sort((a, b) => { if (a[i].val > b[i].val) return 1; if (b[i].val > a[i].val) return -1; return 0 }); - } else { - inp.results = inp.results.sort((a, b) => { if (a[i].val < b[i].val) return 1; if (b[i].val < a[i].val) return -1; return 0 }); - } - } - let skip = filter.skip ?? 0; - if (filter.txt.length > 0) { - inp.resultCnt = inp.results.length; - } - inp.results = inp.results.slice(skip, skip + inp.pageSize); -} - -/** check whether a2 is a subset of a1. - * @param {} a1 is an array - * @param {} a2 is an array - */ -export function isSubset(a1, a2) { - let superSet = {}; - for (let i = 0; i < a1.length; i++) { - const e = a1[i] + typeof a1[i]; - superSet[e] = true; - } - - for (let i = 0; i < a2.length; i++) { - const e = a2[i] + typeof a2[i]; - if (!superSet[e]) { - return false; - } - } - return true; -} \ No newline at end of file diff --git a/src/app/shared/table-view/table-view.component.css b/src/app/shared/table-view/table-view.component.css deleted file mode 100644 index 9ef8cd59..00000000 --- a/src/app/shared/table-view/table-view.component.css +++ /dev/null @@ -1,28 +0,0 @@ -.draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90); - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; -} - -img { - width: 16px; - height: 16px; -} - -td { - max-width: 200px; - overflow-wrap: break-word; -} - -th { - white-space: nowrap; -} - -.highlighted-row { - color: #212529; - background-color: rgba(0, 0, 0, .075); -} diff --git a/src/app/shared/table-view/table-view.component.html b/src/app/shared/table-view/table-view.component.html deleted file mode 100644 index 3437ab57..00000000 --- a/src/app/shared/table-view/table-view.component.html +++ /dev/null @@ -1,105 +0,0 @@ -
- - - -
- Loading... -
- - - - - - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - -
- # - - Select - - - {{params.isReplace_inHeaders ? (col | replace : '[_]' : ' ') : col }} - - - - - - - ... - - -
{{ (params.currPage - 1) * params.pageSize + i + 1 }} - - - - - - {{e.val | number:'1.0-2'}} - {{e.val | date:'medium'}} - ... - - -
-
-
- - - - -
-
\ No newline at end of file diff --git a/src/app/shared/table-view/table-view.component.ts b/src/app/shared/table-view/table-view.component.ts deleted file mode 100644 index 59cc4adb..00000000 --- a/src/app/shared/table-view/table-view.component.ts +++ /dev/null @@ -1,338 +0,0 @@ -import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, ViewChild, Pipe, PipeTransform, NgZone } from '@angular/core'; -import { GlobalVariableService } from '../../visuall/global-variable.service'; -import { CytoscapeService } from '../../visuall/cytoscape.service'; -import { EV_MOUSE_ON, EV_MOUSE_OFF, debounce } from '../../visuall/constants'; -import { TableViewInput, TableFiltering, getClassNameFromProperties } from './table-view-types'; -import { IPosition } from 'angular2-draggable'; -import { Subject, Subscription } from 'rxjs'; -import { GraphElem } from '../../visuall/db-service/data-types'; - -@Pipe({ name: 'replace' }) -export class ReplacePipe implements PipeTransform { - transform(value: string, strToReplace: string, replacementStr: string): string { - - if (!value || !strToReplace || !replacementStr) { - return value; - } - - return value.replace(new RegExp(strToReplace, 'g'), replacementStr); - } -} -@Component({ - selector: 'app-table-view', - templateUrl: './table-view.component.html', - styleUrls: ['./table-view.component.css'] -}) -export class TableViewComponent implements OnInit, OnDestroy { - private highlighterFn: (ev: { target: any, type: string, cySelector?: string }) => void; - private readonly TXT_FILTER_DEBOUNCE = 1000; - private readonly EMPHASIZE_DEBOUNCE = 50; - // column index is also a column - columnLimit: number; - isDraggable: boolean = false; - position: IPosition = { x: 0, y: 0 }; - filterTxt: string = ''; - sortDirection: 'asc' | 'desc' | '' = ''; - sortingIdx: number = -1; - isLoading: boolean = false; - isShowTable: boolean = false; - filterTxtChanged: () => void; - @ViewChild('dynamicDiv', { static: false }) dynamicDiv; - checkedIdx: any = {}; - emphasizeRowFn: Function; - higlightOnHoverSubs: Subscription; - tableFillSubs: Subscription; - clearFilterSubs: Subscription; - tableColumnLimitSubs: Subscription; - hoveredElemId = '-'; - isCheckbox4AllChecked = false; - selected?: any = {}; - - @Input() params: TableViewInput; - @Input() tableFilled = new Subject(); - @Input() clearFilter = new Subject(); - @Output() onFilteringChanged = new EventEmitter(); - @Output() onDataForQueryResult = new EventEmitter<{ dbIds: string[], tableIdx: number[] }>(); - - constructor(private _cyService: CytoscapeService, private _g: GlobalVariableService, private _ngZone: NgZone) { } - - ngOnInit() { - this.tableFillSubs = this.tableFilled.subscribe(this.onTableFilled.bind(this)); - this.clearFilterSubs = this.clearFilter.subscribe(this.onClearFilter.bind(this)); - this.tableColumnLimitSubs = this._g.userPrefs.tableColumnLimit.subscribe(x => { this.columnLimit = x; if (this.params.columnLimit) { this.columnLimit = this.params.columnLimit; } }); - this.highlighterFn = this._cyService.highlightNeighbors(); - this.position.x = 0; - this.position.y = 0; - this.filterTxtChanged = debounce(this.filterBy.bind(this), this.TXT_FILTER_DEBOUNCE); - } - - private resetHoverEvents() { - this.unbindHiglightOnHovers(); - if (!this.params.isEmphasizeOnHover) { - return; - } - this.higlightOnHoverSubs = this._g.userPrefs.isHighlightOnHover.subscribe(x => { - if (x) { - this.bindHoverListener(); - } else { - this.unbindHoverListener(); - } - }); - } - - private bindHoverListener() { - if (!this.params.isEmphasizeOnHover) { - return; - } - this.emphasizeRowFn = debounce(this.elemHovered.bind(this), this.EMPHASIZE_DEBOUNCE).bind(this); - if (this.params.isNodeData) { - this._g.cy.on('mouseover mouseout', 'node', this.emphasizeRowFn); - } else { - this._g.cy.on('mouseover mouseout', 'edge', this.emphasizeRowFn); - } - } - - private unbindHoverListener() { - if (!this.emphasizeRowFn) { - return; - } - // previous table might be edge or node table - this._g.cy.off('mouseover mouseout', 'edge', this.emphasizeRowFn); - this._g.cy.off('mouseover mouseout', 'node', this.emphasizeRowFn); - } - - ngOnDestroy() { - this.unbindHiglightOnHovers(); - if (this.tableColumnLimitSubs) { - this.tableColumnLimitSubs.unsubscribe(); - } - if (this.clearFilterSubs) { - this.clearFilterSubs.unsubscribe(); - } - if (this.tableFillSubs) { - this.tableFillSubs.unsubscribe(); - } - } - - unbindHiglightOnHovers() { - if (this.higlightOnHoverSubs) { - this.higlightOnHoverSubs.unsubscribe(); - } - this.unbindHoverListener(); - } - - private elemHovered(e) { - this._ngZone.run(() => { - if (e.type == 'mouseover') { - if (this.params.isUseCySelector4Highlight) { - this.hoveredElemId = '#' + e.target.id(); - } else { - this.hoveredElemId = e.target.id().substr(1); - } - } else { - this.hoveredElemId = '-'; - } - }); - } - - private onTableFilled() { - this.isLoading = false; - this.checkedIdx = {}; - this.isCheckbox4AllChecked = false; - if (this.params.results && this.params.results.length > 0) { - this.isShowTable = true; - } else if (this.filterTxt.length == 0) { - this.isShowTable = false; - } - this.resetHoverEvents(); - this.setColumnLimit(); - } - - private onClearFilter() { - this.filterTxt = ''; - this.sortingIdx = -1; - this.sortDirection = ''; - } - - filterBy() { - this.isLoading = true; - this.onFilteringChanged.emit({ txt: this.filterTxt, orderBy: this.params.columns[this.sortingIdx], orderDirection: this.sortDirection }); - } - - onMouseEnter(id: string) { - if (this.params.isDisableHover || !this._g.userPrefs.isHighlightOnHover.getValue()) { - return; - } - if (this.params.isUseCySelector4Highlight) { - this.highlighterFn({ target: null, type: EV_MOUSE_ON, cySelector: id }); - } else { - let target = this._g.cy.elements(`[id = "n${id}"]`); - - if (!this.params.isNodeData) { - target = this._g.cy.edges(`[id = "e${id}"]`); - } - this.highlighterFn({ target: target, type: EV_MOUSE_ON }); - } - } - - onMouseExit(id: string) { - if (this.params.isDisableHover || !this._g.userPrefs.isHighlightOnHover.getValue()) { - return; - } - if (this.params.isUseCySelector4Highlight) { - this.highlighterFn({ target: null, type: EV_MOUSE_OFF, cySelector: id }); - } else { - let target = this._g.cy.elements(`[id = "n${id}"]`); - if (!this.params.isNodeData) { - target = this._g.cy.edges(`[id = "e${id}"]`); - } - this.highlighterFn({ target: target, type: EV_MOUSE_OFF }); - } - } - - pageChanged(newPage: number) { - this.isCheckbox4AllChecked = false; - let o = this.params.columns[this.sortingIdx]; - let skip = (newPage - 1) * this.params.pageSize; - this.onFilteringChanged.emit({ txt: this.filterTxt, orderBy: o, orderDirection: this.sortDirection, skip: skip }); - } - - isNumber(v: any) { - return typeof v === 'number'; - } - - resetPosition(isDraggable: boolean) { - this.isDraggable = isDraggable; - if (this.isDraggable) { - this.position = { x: -130, y: 0 }; - } else { - this.position = { x: 0, y: 0 }; - } - this.setColumnLimit(); - } - - private setColumnLimit() { - if (this.isDraggable) { - this.columnLimit = this.params.columns.length; - } else { - if (this.params.columnLimit) { - this.columnLimit = this.params.columnLimit; - } else { - this.columnLimit = this._g.userPrefs.tableColumnLimit.getValue(); - } - } - } - - columnClicked(i: number) { - this.isLoading = true; - this.sortingIdx = i; - let o = this.params.columns[i]; - if (this.sortDirection == 'asc') { - this.sortDirection = 'desc'; - } else if (this.sortDirection == 'desc') { - this.sortDirection = ''; - } else if (this.sortDirection == '') { - this.sortDirection = 'asc'; - } - this.onFilteringChanged.emit({ txt: this.filterTxt, orderBy: o, orderDirection: this.sortDirection }); - } - - cbChanged(idx: number, t: EventTarget) { - const isChecked = (t).checked - delete this.checkedIdx[idx]; - - if (isChecked) { - this.checkedIdx[idx] = true; - } - } - - selectChanged(idx: number, t: EventTarget) { - const isChecked = (t).checked - delete this.selected[idx]; - - if (isChecked) { - this.selected[idx] = true; - } - this.params.results2 = this.selected - } - - loadGraph4Checked() { - // index 0 keeps database IDs - let dbIds = this.params.results.filter((_, i) => this.checkedIdx[i]).map(x => x[0].val) as string[]; - let idxes = []; - for (let i in this.checkedIdx) { - idxes.push(Number(i) + 1); - } - if (dbIds.length > 0) { - this.onDataForQueryResult.emit({ dbIds: dbIds, tableIdx: idxes }); - } - } - - cb4AllChanged() { - this.checkedIdx = {}; - let elems = this.dynamicDiv.nativeElement.querySelectorAll('.row-cb'); - let elemsArr: HTMLInputElement[] = []; - for (let i = 0; i < elems.length; i++) { - elemsArr.push(elems[i] as HTMLInputElement); - } - elemsArr = elemsArr.filter(x => !x.parentElement.hidden); - - if (this.isCheckbox4AllChecked) { - for (let i = 0; i < this.params.results.length; i++) { - this.checkedIdx[i] = true; - elemsArr[i].checked = true; - } - } else { - for (let i = 0; i < elemsArr.length; i++) { - elemsArr[i].checked = false; - } - } - } - - tableStateChanged() { - this.isDraggable = !this.isDraggable; - this.resetPosition(this.isDraggable); - if (!this.isDraggable) { - const e = this.dynamicDiv.nativeElement; - e.style.width = ''; - e.style.height = ''; - } - } - - downloadAsCSV4Checked() { - let rows = this.params.results; - let cNames = this.params.classNames; - if (!this.params.isLoadGraph) { - rows = rows.filter((_, i) => this.checkedIdx[i]); - if (cNames) { - cNames = cNames.filter((_, i) => this.checkedIdx[i]); - } - } - const props = this._g.dataModel.getValue(); - let objs: GraphElem[] = []; - let prefix = this.params.isNodeData ? 'n' : 'e'; - for (let i = 0; i < rows.length; i++) { - const r = rows[i]; - let cName = this.params.classNameOfObjects; - - if (!cName) { - if (this.params.classNames && this.params.classNames[i]) { - cName = cNames[i]; - } else { - cName = getClassNameFromProperties(props, this.params.columns); - } - } - const data = {}; - // first index is for ID - for (let i = 1; i < r.length; i++) { - data[this.params.columns[i - 1]] = r[i].val; - } - data['id'] = prefix + r[0].val; - if (this.params.isUseCySelector4Highlight) { - data['id'] = r[0].val.substr(1); - } - objs.push({ classes: cName, data: data }); - } - this._cyService.saveAsCSV(objs); - } -} diff --git a/src/app/shared/types-view/types-view.component.css b/src/app/shared/types-view/types-view.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/shared/types-view/types-view.component.html b/src/app/shared/types-view/types-view.component.html deleted file mode 100644 index 1e0c24ad..00000000 --- a/src/app/shared/types-view/types-view.component.html +++ /dev/null @@ -1,11 +0,0 @@ -{{nc}} -
-{{ ec }}
\ No newline at end of file diff --git a/src/app/shared/types-view/types-view.component.ts b/src/app/shared/types-view/types-view.component.ts deleted file mode 100644 index f3793d26..00000000 --- a/src/app/shared/types-view/types-view.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Component, OnInit, Output, EventEmitter, Input, OnDestroy } from '@angular/core'; -import { GlobalVariableService } from '../../visuall/global-variable.service'; -import { Subscription } from 'rxjs'; -@Component({ - selector: 'app-types-view', - templateUrl: './types-view.component.html', - styleUrls: ['./types-view.component.css'] -}) -export class TypesViewComponent implements OnInit, OnDestroy { - - nodeClasses: Set; - showNodeClass = {}; - edgeClasses: Set; - showEdgeClass = {}; - endPoints: { [key: string]: {} } = {}; - @Output() onFilterByType = new EventEmitter<{ className: string, willBeShowed: boolean }>(); - @Input() classList: string[]; - dataModelSubs: Subscription; - endPointsSubs: Subscription; - constructor(private _g: GlobalVariableService) { - this.nodeClasses = new Set([]); - this.edgeClasses = new Set([]); - } - - ngOnInit(): void { - this.dataModelSubs = this._g.dataModel.subscribe(x => { - if (x) { - for (const key in x.nodes) { - if (!this.classList || this.classList.includes(key)) { - this.nodeClasses.add(key); - this.showNodeClass[key] = true; - } - } - - for (const key in x.edges) { - if (!this.classList || this.classList.includes(key)) { - this.edgeClasses.add(key); - this.showEdgeClass[key] = true; - } - } - } - this.filterElesByClass('COMMENTED', false) - }); - this.endPointsSubs = this._g.endPoints.subscribe(x => { - if (x) { - for (const key in x){ - this.endPoints[key] = x[key] - } - } - }); - } - - filterElesByClass(className: string, isNode: boolean) { - let willBeShowed = false; - if (isNode) { - this.showNodeClass[className] = !this.showNodeClass[className]; - willBeShowed = this.showNodeClass[className]; - } else { - this.showEdgeClass[className] = !this.showEdgeClass[className]; - willBeShowed = this.showEdgeClass[className]; - } - this.onFilterByType.next({ className: className, willBeShowed: willBeShowed }); - } - - ngOnDestroy(): void { - if (this.dataModelSubs) { - this.dataModelSubs.unsubscribe(); - } - if (this.endPointsSubs) { - this.endPointsSubs.unsubscribe(); - } - } - -} diff --git a/src/app/visuall/app.component.css b/src/app/visuall/app.component.css deleted file mode 100644 index 66321ed7..00000000 --- a/src/app/visuall/app.component.css +++ /dev/null @@ -1,8 +0,0 @@ -.loading-div { - position: absolute; - z-index: 100000; - right: calc(50% - 2.5vh); - top: 35vh; - width: 5vh; - height: 5vh; -} diff --git a/src/app/visuall/app.component.html b/src/app/visuall/app.component.html deleted file mode 100644 index f5c95506..00000000 --- a/src/app/visuall/app.component.html +++ /dev/null @@ -1,16 +0,0 @@ -
- -
-
-
- - - - - -
- Loading... -
-
-
- diff --git a/src/app/visuall/app.component.ts b/src/app/visuall/app.component.ts deleted file mode 100644 index 9e2f37af..00000000 --- a/src/app/visuall/app.component.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Component } from '@angular/core'; -import { GlobalVariableService } from './global-variable.service'; -import { ActivatedRoute } from '@angular/router'; -import { Neo4jDb } from './db-service/neo4j-db.service'; -import { CytoscapeService } from './cytoscape.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { UserProfileService } from './user-profile.service'; -import { EMPTY } from 'rxjs'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.css'] -}) -export class AppComponent { - isLoading = false; - paramValue: string = ""; - setupValue: string = ""; - queryValue: string = ""; - constructor(private _dbService: Neo4jDb, private _cyService: CytoscapeService, private _g: GlobalVariableService, private route: ActivatedRoute, private _profile: UserProfileService) { - this._g.setLoadingStatus = (e) => { - this.isLoading = e; - window['IsVisuallLoading'] = e; - }; - - this.route.queryParamMap.subscribe(params => { - if (params.get('name')) { - this.paramValue = params.get('name'); - this._g.initialQuery = this.paramValue.toString(); - if (this.paramValue != "") { - this._g.userPrefs.isLimitDbQueries2range.next(false) - this._profile.saveUserPrefs(); - let limit = null; - if (params.get('limit')) { - limit = params.get('limit'); - if(params.get('limit') == "true"){ - limit = this._g.userPrefs.queryNeighborLimit.getValue() - } - } - const cb = (x) => { - const elementId = x.data[0][0]; - this._dbService.getNeighbors( - [elementId], - (x) => { - this._cyService.loadElementsFromDatabase(x, true); - }, - {}, - limit - ); - console.log(elementId) - }; - this._dbService.runQuery(`MATCH (n {name:'${this.paramValue}'}) RETURN elementId(n) `, cb, DbResponseType.table); - } - } - if (params.get('setup')) { - const setupParam = params.get('setup')?.toLowerCase(); - if (setupParam === "github") { - this.setupValue = "GitHub"; - } - else if (setupParam === "jira") { - this.setupValue = "Jira"; - } - else if (setupParam === "neo4j") { - this.setupValue = "Neo4j"; - } - } - - if (params.get('pr')) { - this.queryValue = params.get('pr'); - const cb = (x) => { - if (x.nodes.length != 0) { - this._cyService.loadElementsFromDatabaseInitial(x); - this._g.cy.$id(`n${x.nodes[0].elementId}`)[0].select(); - } - else { - alert('There is no pull request register with the given name') - } - - }; - this._dbService.runQuery(`MATCH (n{name:'${this.queryValue}'}) RETURN n`, cb); - } - - else if (params.get('issue')) { - this.queryValue = params.get('issue'); - const cb = (x) => { - if (x.nodes.length != 0) { - this._cyService.loadElementsFromDatabaseInitial(x); - } - else { - alert('There is no pull request register with the given name') - } - }; - this._dbService.runQuery(`MATCH (n1{name:'${this.queryValue}'})-[e]-(n2) RETURN n1,n2,e `, cb); - } - }); - - } - -} \ No newline at end of file diff --git a/src/app/visuall/app.module.ts b/src/app/visuall/app.module.ts deleted file mode 100644 index f8aba54c..00000000 --- a/src/app/visuall/app.module.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { Routes, RouterModule } from '@angular/router'; -import { APP_BASE_HREF } from '@angular/common'; - -import {MatDialogModule } from '@angular/material/dialog'; -import { AppComponent } from './app.component'; -import { NavbarComponent } from './navbar/navbar.component'; -import { ToolbarComponent } from './toolbar/toolbar.component'; -import { TimebarComponent } from './timebar/timebar.component'; -import { OperationTabsComponent } from './operation-tabs/operation-tabs.component'; -import { HttpClientModule } from '@angular/common/http'; -import { CytoscapeComponent } from './cytoscape/cytoscape.component'; -import { SaveAsPngModalComponent } from './popups/save-as-png-modal/save-as-png-modal.component'; -import { QuickHelpModalComponent } from './popups/quick-help-modal/quick-help-modal.component'; -import { LegendModalComponent } from './popups/legend-modal/legend-modal.component'; -import { AboutModalComponent } from './popups/about-modal/about-modal.component'; -import {ProjectAboutModalComponent} from './popups/project-about-modal/project-about-modal-component'; -import { ObjectTabComponent } from './operation-tabs/object-tab/object-tab.component'; -import { MapTabComponent } from './operation-tabs/map-tab/map-tab.component'; -import { SettingsTabComponent } from './operation-tabs/settings-tab/settings-tab.component'; -import { QueryTabComponent } from './operation-tabs/query-tab/query-tab.component'; -import { GroupTabComponent } from './operation-tabs/map-tab/group-tab/group-tab.component'; -import { TimebarMetricEditorComponent } from './operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component'; -import { ColorPickerComponent } from './color-picker/color-picker.component'; -import { AutoSizeInputModule } from 'ngx-autosize-input'; -import { PropertyRuleComponent } from './property-rule/property-rule.component'; -import { ErrorModalComponent } from './popups/error-modal/error-modal.component'; -import { AngularDraggableModule } from 'angular2-draggable'; -import { GraphTheoreticPropertiesTabComponent } from './operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component'; -import { GraphHistoryComponent } from './graph-history/graph-history.component'; -import { SaveProfileModalComponent } from './popups/save-profile-modal/save-profile-modal.component'; -import { AdvancedQueriesComponent } from './operation-tabs/query-tab/advanced-queries/advanced-queries.component'; -import { RuleTreeComponent } from './rule-tree/rule-tree.component'; -import { RuleDropdownComponent } from './rule-dropdown/rule-dropdown.component'; -import { SharedModule } from '../shared/shared.module'; -import { CustomizationModule } from '../custom/customization.module'; -import { PanelContainerComponent } from './panel-container/panel-container.component'; -import { LoadGraphFromFileModalComponent } from './popups/load-graph-from-file-modal/load-graph-from-file-modal.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import {ProjectBuilderDialogComponent} from './navbar/project-builder/project-builder-dialog-component'; -import { SetupComponent } from './setup/setup.component'; -import { MatInputModule } from '@angular/material/input'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatFormFieldModule } from '@angular/material/form-field'; - -@NgModule({ - declarations: [ - ProjectBuilderDialogComponent, - AppComponent, - NavbarComponent, - ToolbarComponent, - TimebarComponent, - OperationTabsComponent, - CytoscapeComponent, - SaveAsPngModalComponent, - QuickHelpModalComponent, - LegendModalComponent, - AboutModalComponent, - ProjectAboutModalComponent, - ObjectTabComponent, - MapTabComponent, - SettingsTabComponent, - QueryTabComponent, - GroupTabComponent, - TimebarMetricEditorComponent, - ColorPickerComponent, - PropertyRuleComponent, - ErrorModalComponent, - GraphTheoreticPropertiesTabComponent, - GraphHistoryComponent, - SaveProfileModalComponent, - AdvancedQueriesComponent, - RuleTreeComponent, - RuleDropdownComponent, - PanelContainerComponent, - LoadGraphFromFileModalComponent, - SetupComponent - ], - imports: [ - MatDialogModule, - BrowserModule, - HttpClientModule, - FormsModule, - ReactiveFormsModule, - NgbModule, - AutoSizeInputModule, - AngularDraggableModule, - CustomizationModule, - SharedModule, - RouterModule.forRoot([]), - BrowserAnimationsModule, - MatAutocompleteModule, - MatInputModule, - MatFormFieldModule - ], - exports: [RouterModule, - HttpClientModule], - providers: [{ provide: APP_BASE_HREF, useValue: "/" }], - bootstrap: [AppComponent], - entryComponents: [SaveAsPngModalComponent, QuickHelpModalComponent, AboutModalComponent, ErrorModalComponent] -}) -export class AppModule { } diff --git a/src/app/visuall/color-picker/color-picker.component.css b/src/app/visuall/color-picker/color-picker.component.css deleted file mode 100644 index a531d252..00000000 --- a/src/app/visuall/color-picker/color-picker.component.css +++ /dev/null @@ -1,8 +0,0 @@ -.picker-window .modal-content { - width: 232px !important; - height: 363px !important; -} - -.h2 { - height: 0.65em; -} diff --git a/src/app/visuall/color-picker/color-picker.component.html b/src/app/visuall/color-picker/color-picker.component.html deleted file mode 100644 index 642bef4c..00000000 --- a/src/app/visuall/color-picker/color-picker.component.html +++ /dev/null @@ -1,5 +0,0 @@ - -
-
- - \ No newline at end of file diff --git a/src/app/visuall/color-picker/color-picker.component.ts b/src/app/visuall/color-picker/color-picker.component.ts deleted file mode 100644 index 4a7df921..00000000 --- a/src/app/visuall/color-picker/color-picker.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Component, OnInit, Output, EventEmitter, Input, ViewEncapsulation } from '@angular/core'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import * as AColorPicker from 'a-color-picker'; -@Component({ - selector: 'app-color-picker', - templateUrl: './color-picker.component.html', - encapsulation: ViewEncapsulation.None, - styleUrls: ['./color-picker.component.css'] -}) -export class ColorPickerComponent implements OnInit { - - @Output() onColorSelected = new EventEmitter(); - constructor(private _modalService: NgbModal) { } - pickedColors: string[] = []; - picker: AColorPicker.ACPController = null; - @Input() currColor: string; - - ngOnInit() { } - - open(ev: MouseEvent, content) { - ev.preventDefault(); - // style="width: 232px; height: 363px;" - const fn = () => { this.onColorSelected.emit(this.currColor); }; - this._modalService.open(content, { windowClass: 'picker-window', animation: true }).result.then(fn, fn); - this.setPicker(); - } - - private setPicker() { - this.picker = AColorPicker.from('.picker', { palette: this.pickedColors })[0]; - this.picker.color = this.currColor; - this.picker.off('change'); - this.picker.on('change', (_, color) => { - this.currColor = AColorPicker.parseColor(color, 'hex') - }); - this.picker.off('coloradd'); - this.picker.on('coloradd', (_, color) => { - this.pickedColors.push(AColorPicker.parseColor(color, 'hex')); - }); - this.picker.off('colorremove'); - this.picker.on('colorremove', (_, color) => { - const c = AColorPicker.parseColor(color, 'hex'); - const i = this.pickedColors.findIndex(x => x == c); - if (i > -1) { - this.pickedColors.splice(i, 1); - } - }); - } -} diff --git a/src/app/visuall/constants.ts b/src/app/visuall/constants.ts deleted file mode 100644 index 5c763ca4..00000000 --- a/src/app/visuall/constants.ts +++ /dev/null @@ -1,393 +0,0 @@ -export const HIGHLIGHT_OPACITY = 0.2; -// it is more reasonable to make HIGHLIGHT_ANIM_DUR * 2 < HIGHLIGHT_WAIT_DUR -export const HIGHLIGHT_ANIM_DUR = 400; -export const HIGHLIGHT_WAIT_DUR = 1500; -export const EV_MOUSE_ON = 'mouseover'; -export const EV_MOUSE_OFF = 'mouseout'; -export const DATE_PROP_START = ['start', 'createdat']; -export const DATE_PROP_END = ['closedate', 'end']; -export const CY_BATCH_END_DELAY = 100; -export const OBJ_INFO_UPDATE_DELAY = 200; - -// defined in expand-collapse extension -export const META_EDGE_CLASS = 'cy-expand-collapse-meta-edge'; -export const COLLAPSED_EDGE_CLASS = 'cy-expand-collapse-collapsed-edge'; -export const COLLAPSED_NODE_CLASS = 'cy-expand-collapse-collapsed-node'; -export const EXPAND_COLLAPSE_FAST_OPT = { layoutBy: null, fisheye: false, animate: false }; - -export const CY_NAVI_POSITION_WAIT_DUR = 500; -export const MAX_HIGHTLIGHT_WIDTH = 20; -export const MIN_HIGHTLIGHT_WIDTH = 1; -export const MAX_DATA_PAGE_SIZE = 10000; -export const MIN_DATA_PAGE_SIZE = 1; -export const EXPAND_COLLAPSE_CUE_SIZE = 12; -export const MAX_TABLE_COLUMN_COUNT = 100; -export const MIN_TABLE_COLUMN_COUNT = 1; -export const HIDE_EMPTY_TIMEBAR_DELAY = 1000; -export const CSS_SM_TEXT_SIZE = 11; -export const CSS_FONT_NAME = 'Arial'; -export const CLUSTER_CLASS = 'Cluster'; -export const LAYOUT_ANIM_DUR = 500; - -export const LONG_MAX = '9000000036854776000' -export const LONG_MIN = '-9000000036854776000'; - -export const GENERIC_TYPE = { - ANY_CLASS: 'Any Object', - NOT_SELECTED: '───', - NODES_CLASS: 'Any Node', - EDGES_CLASS: 'Any Edge' -}; - -export const MAX_HIGHLIGHT_CNT = 12; - -export const NUMBER_OPERATORS = { - '=': '=', - '\u2260': '<>', - '<': '<', - '>': '>', - '\u2264': '<=', - '\u2265': '>=', - 'one of': 'One of' -}; - -export const DATETIME_OPERATORS = { - '=': '=', - '\u2260': '<>', - '<': '<', - '>': '>', - '\u2264': '<=', - '\u2265': '>=' -}; - -export const ENUM_OPERATORS = { - '=': '=', - '\u2260': '<>', - 'one of': 'One of' -}; - -export const TEXT_OPERATORS = { - 'equal to': '=', - 'contains': 'Contains', - 'starts with': 'Starts with', - 'ends with': 'Ends with', - 'one of': 'One of' -}; -export const LIST_OPERATORS = { - 'in': 'In' -}; - -export const NEO4J_2_JS_NUMBER_OPERATORS = { - '=': '===', - '<>': '!==', - '<': '<', - '>': '>', - '<=': '<=', - '>=': '>=' -}; - -export const NEO4J_2_JS_STR_OPERATORS = { - 'Contains': 'includes', - 'Starts with': 'startsWith', - 'Ends with': 'endsWith' -}; - -export const TIME_UNITS = { - 'century': 3153600000000, - 'decade': 315360000000, - 'year': 31536000000, - 'quarter': 7884000000, - 'month': 2592000000, - 'week': 604800000, - 'day': 86400000, - 'hour': 3600000, - '5min': 300000, - 'minute': 60000, - '5sec': 5000, - 'second': 1000, - '50ms': 50, - 'ms': 1 -}; - -export const MONTHS = ["January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"]; - -export const SHORT_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"]; - -/** https://davidwalsh.name/javascript-debounce-function - * Returns a function, that, as long as it continues to be invoked, will not - * be triggered. The function will be called after it stops being called for - * N milliseconds. If `immediate` is passed, trigger the function on the - * leading edge, instead of the trailing. - * @param {} func - * @param {number} wait - * @param {boolean=false} immediate - * @param {} preConditionFn=null if function returns false, ignore this call - */ -export function debounce(func, wait: number, immediate: boolean = false, preConditionFn = null) { - let timeout; - return function () { - if (preConditionFn && !preConditionFn()) { - return; - } - const context = this, args = arguments; - const later = function () { - timeout = null; - if (!immediate) func.apply(context, args); - }; - const callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (callNow) func.apply(context, args); - }; -} - -// calls fn2 at the beginning of frequent calls to fn1 -export function debounce2(fn1: Function, wait: number, fn2: Function) { - let timeout; - let isInit = true; - return function () { - const context = this, args = arguments; - const later = function () { - timeout = null; - fn1.apply(context, args); - isInit = true; - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (isInit) { - fn2.apply(context, args); - isInit = false; - } - }; -} - -// objects is an array of objects, types is an array of strings -// get propperty names of types. If types does not exists get all -export function getPropNamesFromObj(objects, types) { - let s1 = new Set(); - - for (const obj of objects) { - for (const [, value] of Object.entries(obj)) { - for (const [k2, v2] of Object.entries(value)) { - if (!types) { - s1.add(k2); - } else if (types.includes(v2)) { - s1.add(k2); - } - } - } - } - return s1; -} - -// return union of 2 sets -export function union(setA, setB) { - let _union = new Set(setA); - for (let elem of setB) { - _union.add(elem); - } - return _union; -} - -export function isClose(a1: number, a2: number, margin = 1000) { - return Math.abs(a1 - a2) < margin; -} - -export function findTypeOfAttribute(attribute, nodeProps, edgeProps): string { - - for (const nodeClass in nodeProps) { - if (nodeProps[nodeClass].hasOwnProperty(attribute)) - return nodeProps[nodeClass][attribute]; - } - for (const edgeClass in edgeProps) { - if (edgeProps[edgeClass].hasOwnProperty(attribute)) - return edgeProps[edgeClass][attribute]; - } -} - -export function expandCollapseCuePosition(node) { - const zoom = node._private.cy.zoom(); - let smallness = 1 - node.renderedWidth() / (node._private.cy.width()); - if (smallness < 0) { - smallness = 0; - } - // cue size / 2 - const rectSize = EXPAND_COLLAPSE_CUE_SIZE / 2; - const offset = parseFloat(node.css('border-width')) + rectSize; - let size = zoom < 1 ? rectSize / zoom : rectSize; - let add = offset * smallness + size; - const x = node.position('x') - node.width() / 2 - parseFloat(node.css('padding-left')) + add; - const y = node.position('y') - node.height() / 2 - parseFloat(node.css('padding-top')) + add; - return { x: x, y: y }; -} - -export function areSetsEqual(s1: Set, s2: Set) { - if (!s1 || !s2) { - return false; - } - for (let i of s1) { - if (!s2.has(i)) { - return false; - } - } - - for (let i of s2) { - if (!s1.has(i)) { - return false; - } - } - return true; -} - -export function compareUsingOperator(a: any, b: any, op: string) { - op = op.toLowerCase(); - switch (op) { - case '=': - return a === b; - case '<>': - return a !== b; - case '<': - return a < b; - case '>': - return a > b; - case '>=': - return a >= b; - case '<=': - return a <= b; - case 'contains': - case 'in': - return a.includes(b); - case 'starts with': - return a.startsWith(b); - case 'ends with': - return a.endsWith(b); - default: - return false; - } -} - -export function isNumber(value: string | number): boolean { - return ((value != null) && !isNaN(Number(value.toString()))); -} - -export function isPrimitiveType(o) { - const t = typeof o; - return t == 'string' || t == 'number' || t == 'boolean'; -} - -export function extend(a, b) { - if (a == undefined || a == null) { - a = {}; - } - - for (let key in b) { - if (b.hasOwnProperty(key)) { - a[key] = b[key]; - } - } - - return a; -} - -/** - * Deep copy function for TypeScript. - * @param T Generic type of target/copied value. - * @param target Target value to be copied. - * @see Source project, ts-deepcopy https://github.com/ykdr2017/ts-deepcopy - * @see Code pen https://codepen.io/erikvullings/pen/ejyBYg - */ -export const deepCopy = (target: T): T => { - if (target === null) { - return target; - } - if (target instanceof Date) { - return new Date(target.getTime()) as any; - } - if (target instanceof Array) { - const cp = [] as any[]; - (target as any[]).forEach((v) => { cp.push(v); }); - return cp.map((n: any) => deepCopy(n)) as any; - } - if (typeof target === 'object') { - const cp = { ...(target as { [key: string]: any }) } as { [key: string]: any }; - Object.keys(cp).forEach(k => { - cp[k] = deepCopy(cp[k]); - }); - return cp as T; - } - return target; -}; - -export function readTxtFile(file: File, cb: (s: string) => void) { - const fileReader = new FileReader(); - fileReader.onload = () => { - try { - cb(fileReader.result as string); - } catch (error) { - console.error('Given file is not suitable.', error); - } - }; - fileReader.onerror = (error) => { - console.error('File could not be read!', error); - fileReader.abort(); - }; - fileReader.readAsText(file); -} - -export function arrayDiff(smallArr: string[], bigArr: string[]): string[] { - let diff: string[] = []; - let d = {}; - for (let i = 0; i < smallArr.length; i++) { - d[smallArr[i]] = true; - } - - for (let i = 0; i < bigArr.length; i++) { - if (!d[bigArr[i]]) { - diff.push(bigArr[i]); - } - } - return diff; -} - -export function getCyStyleFromColorAndWid(color: string, wid: number): { node: any, edge: any } { - return { - node: { 'overlay-color': color, 'overlay-opacity': HIGHLIGHT_OPACITY, 'overlay-padding': wid }, - edge: { 'overlay-color': color, 'overlay-opacity': HIGHLIGHT_OPACITY, 'overlay-padding': (e) => { - return (wid + e.width()) / 2 + 'px'; - } } - }; -} - -export function isJson(str: string) { - try { - JSON.parse(str); - } catch (e) { - return false; - } - return true; -} - -export function mapColor(colorEnd: string, valueEnd: number, val: number) { - if (colorEnd[0] == '#') { - colorEnd = colorEnd.slice(1, colorEnd.length); - } - let r = parseInt(colorEnd.slice(0, 2), 16); - let g = parseInt(colorEnd.slice(2, 4), 16); - let b = parseInt(colorEnd.slice(4, 6), 16); - - let rVal = Math.round(r + (255 - r) * (1 - val / valueEnd)).toString(16); - let gVal = Math.round(g + (255 - g) * (1 - val / valueEnd)).toString(16); - let bVal = Math.round(b + (255 - b) * (1 - val / valueEnd)).toString(16); - if (rVal.length < 2) { - rVal = '0' + rVal; - } - if (gVal.length < 2) { - gVal = '0' + gVal; - } - if (bVal.length < 2) { - bVal = '0' + bVal; - } - return '#' + rVal + gVal + bVal -} \ No newline at end of file diff --git a/src/app/visuall/context-menu/context-menu.service.ts b/src/app/visuall/context-menu/context-menu.service.ts deleted file mode 100644 index dfd93e5b..00000000 --- a/src/app/visuall/context-menu/context-menu.service.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Injectable } from '@angular/core'; -import cytoscape from 'cytoscape'; -import * as contextMenus from 'cytoscape-context-menus'; -import { CytoscapeService } from '../cytoscape.service'; -import { GlobalVariableService } from '../global-variable.service'; -import { ContextMenuItem } from './icontext-menu'; -import { ContextMenuCustomizationService } from '../../custom/customization-service/context-menu-customization.service'; -import { COLLAPSED_EDGE_CLASS, CLUSTER_CLASS } from './../constants'; - -@Injectable({ - providedIn: 'root' -}) -export class ContextMenuService { - - menu: ContextMenuItem[]; - - constructor(private _cyService: CytoscapeService, private _g: GlobalVariableService, private _customizationService: ContextMenuCustomizationService) { - - this.menu = [ - { - id: 'collapseAllNodes', - content: 'Collapse All Nodes', - hasTrailingDivider: true, - coreAsWell: true, - onClickFunction: () => { this._cyService.collapseNodes(); } - }, - { - id: 'collapseAllEdges', - content: 'Collapse All Edges', - hasTrailingDivider: true, - coreAsWell: true, - onClickFunction: () => { this._cyService.collapseMultiEdges(); } - }, - { - id: 'performLayout', - content: 'Perform Layout', - hasTrailingDivider: true, - coreAsWell: true, - onClickFunction: this.performLayout.bind(this) - }, - { - id: 'deleteSelected', - content: 'Delete Selected', - hasTrailingDivider: true, - coreAsWell: true, - onClickFunction: this.deleteSelected.bind(this) - }, - { - id: 'selectObjectsOfThisType', - content: 'Select Objects of This Type', - hasTrailingDivider: true, - selector: 'node,edge', - onClickFunction: this.selectAllThisType.bind(this) - }, - { - id: 'collapseEdge', - content: 'Collapse', - selector: '[^collapsedEdges][^originalEnds]', - hasTrailingDivider: true, - onClickFunction: this.collapseEdges.bind(this) - }, - { - id: 'expandEdge', - content: 'Expand', - selector: 'edge.' + COLLAPSED_EDGE_CLASS + '[^originalEnds]', // don't expand meta edges - onClickFunction: this.expandEdge.bind(this) - }, - { - id: 'removeGroup', - content: 'Remove Group', - hasTrailingDivider: true, - selector: 'node.' + CLUSTER_CLASS, - onClickFunction: (e) => { this._cyService.removeGroup4Selected(e.target || e.cyTarget) } - }, - { - id: 'deleteElement', - content: 'Delete', - hasTrailingDivider: true, - selector: 'node,edge', - onClickFunction: this.deleteElem.bind(this) - }, - ]; - } - - bindContextMenuExtension() { - - // register context menu extension - cytoscape.use(contextMenus); - this.menu = this._customizationService.menu.concat(this.menu); - this._g.cy.contextMenus({ menuItems: this.menu, menuItemClasses: ['vall-ctx-menu-item'], contextMenuClasses: ['vall-ctx-menu'] }); - } - - deleteElem(event) { this._cyService.deleteSelected(event); } - - deleteSelected() { this._cyService.deleteSelected(false); } - - performLayout() { this._g.performLayout(false, true); } - - selectAllThisType(event) { - const ele = event.target || event.cyTarget; - if (!ele) { - return; - } - const model = this._g.dataModel.getValue(); - const classes = ele.className(); - for (let c of classes) { - if (model.nodes[c] || model.edges[c]) { - this._g.cy.$('.' + c).select(); - } - } - } - - collapseEdges(event) { - const ele = event.target || event.cyTarget; - if (!ele) { - return; - } - this._cyService.collapseMultiEdges(ele.parallelEdges()); - } - - expandEdge(event) { - const ele = event.target || event.cyTarget; - if (!ele) { - return; - } - this._cyService.expandMultiEdges(ele); - } - -} diff --git a/src/app/visuall/context-menu/icontext-menu.ts b/src/app/visuall/context-menu/icontext-menu.ts deleted file mode 100644 index c940f0e1..00000000 --- a/src/app/visuall/context-menu/icontext-menu.ts +++ /dev/null @@ -1,11 +0,0 @@ - -export interface ContextMenuItem { - id: string; - content: string; - selector?: string; - submenu?: any; - hasTrailingDivider?: boolean; - onClickFunction?: (event: any) => void; - // must be false for custom items - coreAsWell?: boolean; -} \ No newline at end of file diff --git a/src/app/visuall/cy-ext.service.ts b/src/app/visuall/cy-ext.service.ts deleted file mode 100644 index 9f0ca626..00000000 --- a/src/app/visuall/cy-ext.service.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { Injectable } from '@angular/core'; -import navigator from 'cytoscape-navigator'; -import fcose from 'cytoscape-fcose'; -import expandCollapse from 'cytoscape-expand-collapse'; -import viewUtilities from 'cytoscape-view-utilities'; -import layoutUtilities from 'cytoscape-layout-utilities'; -import cise from 'cytoscape-cise'; -import cytoscape from 'cytoscape'; -import timebar from '../../lib/timebar/cytoscape-timebar'; -import cytoscapeVisualCues from '../../lib/cytoscape-visual-cues/cytoscape-visual-cues.esm'; - -import * as $ from 'jquery'; -import { GlobalVariableService } from './global-variable.service'; -import { MAX_HIGHLIGHT_CNT, expandCollapseCuePosition, EXPAND_COLLAPSE_CUE_SIZE, getCyStyleFromColorAndWid } from './constants'; -import panzoom from 'cytoscape-panzoom'; - -// service for cytoscape.js extensions -@Injectable({ - providedIn: 'root' -}) -export class CyExtService { - cyNavi: any; - - constructor(private _g: GlobalVariableService) { } - - registerExtensions() { - // register timebar extension - timebar(cytoscape); - // register cues extension - cytoscapeVisualCues(cytoscape); - // register navigator extension - navigator(cytoscape); - // register view utilities extension - viewUtilities(cytoscape); - //register expand-collapse extension - expandCollapse(cytoscape); - //register layour utilities extension - layoutUtilities(cytoscape); - // use fcose layout algorithm - cytoscape.use(fcose); - // use cise layout algorithm - cytoscape.use(cise); - panzoom(cytoscape); // register extension - - } - - bindExtensions() { - this.bindNavigatorExtension(); - this.bindLayoutUtilitiesExtension(); - this.bindPanZoomExtension(); - this.bindExpandCollapseExtension(); - } - - private bindLayoutUtilitiesExtension() { - this._g.layoutUtils = this._g.cy.layoutUtilities({ desiredAspectRatio: this._g.cy.width() / this._g.cy.height() }); - } - - bindNavigatorExtension() { - if (this.cyNavi) { - return; - } - const cyNaviClass = 'cytoscape-navigator-wrapper'; - const div = document.createElement('div'); - div.className = cyNaviClass; - document.getElementById('cy').append(div); - - this.setNavigatorPosition(); - let defaults = { - container: `.${cyNaviClass}`, // can be a HTML or jQuery - // element or jQuery selector - - viewLiveFramerate: - 0, // set false to update graph pan only on drag end; set 0 to do it - // instantly; set a number (frames per second) to update not more - // than N times per second - - thumbnailEventFramerate: - 30, // max thumbnail's updates per second triggered by graph updates - - thumbnailLiveFramerate: - false, // max thumbnail's updates per second. Set false to disable - - dblClickDelay: 200, // milliseconds - - removeCustomContainer: - true, // destroy the container specified by user on plugin destroy - - rerenderDelay: 100, // ms to throttle rerender updates to the panzoom for - // performance - }; - - this.cyNavi = this._g.cy.navigator(defaults); // get navigator instance, nav - this._g.cyNaviPositionSetter = this.setNavigatorPosition.bind(this); - window.removeEventListener('resize', this._g.cyNaviPositionSetter); - window.removeEventListener('scroll', this._g.cyNaviPositionSetter); - - window.addEventListener('resize', this._g.cyNaviPositionSetter); - window.addEventListener('scroll', this._g.cyNaviPositionSetter); - // to render navigator, fire zoom event - this._g.cy.zoom(this._g.cy.zoom() + 0.00001); - // to prevent expandCollapse extension's blocking - (document.getElementsByClassName(cyNaviClass)[0] as HTMLElement).style.zIndex = '1000'; - } - - unbindNavigatorExtension() { - window.removeEventListener('resize', this._g.cyNaviPositionSetter); - window.removeEventListener('scroll', this._g.cyNaviPositionSetter); - if (!this.cyNavi) { - return; - } - this.cyNavi.destroy(); - this.cyNavi._removeCyListeners(); - this.cyNavi = null; - } - - setNavigatorPosition() { - if (!this._g.userPrefs.isShowOverviewWindow.getValue()) { - return; - } - const navSelector = '.cytoscape-navigator-wrapper'; - const containerSelector = '#cy'; - - const topCy = $(containerSelector).offset().top - window.scrollY; - const leftCy = $(containerSelector).offset().left; - const heightCy = $(containerSelector).outerHeight(); - const widthCy = $(containerSelector).outerWidth(); - const heightNavigator = $(navSelector).outerHeight(); - const widthNavigator = $(navSelector).outerWidth(); - $(navSelector).css('top', heightCy + topCy - heightNavigator); - $(navSelector).css('left', widthCy + leftCy - widthNavigator); - } - - bindViewUtilitiesExtension() { - let options = { - highlightStyles: this.getHighlightStyles(), - setVisibilityOnHide: false, // whether to set visibility on hide/show - setDisplayOnHide: true, // whether to set display on hide/show - zoomAnimationDuration: 500, //default duration for zoom animation speed - neighbor: function (node) { // return desired neighbors of tapheld node - return false; - }, - neighborSelectTime: 500, //ms, time to taphold to select desired neighbors, - colorCount: MAX_HIGHLIGHT_CNT, - htmlElem4marqueeZoom: '#cy', - marqueeZoomCursor: window.location.href + 'assets/img/zoom-cursor.svg' - }; - this._g.viewUtils = this._g.cy.viewUtilities(options); - this._g.updateSelectionCyStyle(); - } - - private bindPanZoomExtension() { - - // the default values of each option are outlined below: - const defaults = { - zoomFactor: 0.05, // zoom factor per zoom tick - zoomDelay: 45, // how many ms between zoom ticks - minZoom: 0.1, // min zoom level - maxZoom: 10, // max zoom level - fitPadding: 50, // padding when fitting - panSpeed: 10, // how many ms in between pan ticks - panDistance: 10, // max pan distance per tick - panDragAreaSize: 75, // the length of the pan drag box in which the - // vector for panning is calculated (bigger = finer - // control of pan speed and direction) - panMinPercentSpeed: - 0.25, // the slowest speed we can pan by (as a percent of panSpeed) - panInactiveArea: 8, // radius of inactive area in pan drag box - panIndicatorMinOpacity: 0.5, // min opacity of pan indicator (the - // draggable nib); scales from this to 1.0 - zoomOnly: false, // a minimal version of the ui only with zooming (useful - // on systems with bad mousewheel resolution) - fitSelector: undefined, // selector of elements to fit - animateOnFit: function () { // whether to animate on fit - return true; - }, - fitAnimationDuration: 1000, // duration of animation on fit - - // icon class names - sliderHandleIcon: 'fa fa-minus', - zoomInIcon: 'fa fa-plus', - zoomOutIcon: 'fa fa-minus', - resetIcon: 'fa fa-expand' - }; - - // add the panzoom control - this._g.cy.panzoom(defaults); - } - - private bindExpandCollapseExtension() { - this._g.expandCollapseApi = this._g.cy.expandCollapse({ - layoutBy: null, // to rearrange after expand/collapse. It's just layout options or whole layout function. Choose your side! - // recommended usage: use cose-bilkent layout with randomize: false to preserve mental map upon expand/collapse - fisheye: true, // whether to perform fisheye view after expand/collapse you can specify a function too - animate: true, // whether to animate on drawing changes you can specify a function too - ready: function () { }, // callback when expand/collapse initialized - undoable: false, // and if undoRedoExtension exists, - randomize: false, - - cueEnabled: true, // Whether cues are enabled - expandCollapseCuePosition: expandCollapseCuePosition, - expandCollapseCueSize: EXPAND_COLLAPSE_CUE_SIZE, // size of expand-collapse cue - expandCollapseCueLineSize: 8, // size of lines used for drawing plus-minus icons - expandCueImage: undefined, // image of expand icon if undefined draw regular expand cue - collapseCueImage: undefined, // image of collapse icon if undefined draw regular collapse cue - expandCollapseCueSensitivity: 1, // sensitivity of expand-collapse cues - allowNestedEdgeCollapse: false - }); - } - - private getHighlightStyles(): any[] { - let r = []; - - for (let i = 0; i < this._g.userPrefs.highlightStyles.length; i++) { - let style = this._g.userPrefs.highlightStyles[i]; - let w, c; - try { - c = style.color.getValue(); - w = style.wid.getValue(); - } - catch (err) { - c = "#6c757d" - w = 3; - } - - r.push(getCyStyleFromColorAndWid(c, w)); - - } - return r; - } - -} diff --git a/src/app/visuall/cytoscape.service.ts b/src/app/visuall/cytoscape.service.ts deleted file mode 100644 index 33c9558a..00000000 --- a/src/app/visuall/cytoscape.service.ts +++ /dev/null @@ -1,1133 +0,0 @@ -import { Injectable, NgZone } from '@angular/core'; -import cytoscape from 'cytoscape'; -import * as C from './constants'; -import { GlobalVariableService } from './global-variable.service'; -import { TimebarService } from './timebar.service'; -import { GraphResponse, GraphElem, CyEdge, CyNode } from './db-service/data-types'; -import { UserPrefHelper } from './user-pref-helper'; -import { MergedElemIndicatorTypes, TextWrapTypes, GroupingOptionTypes } from './user-preference'; -import { UserProfileService } from './user-profile.service'; -import { LouvainClustering } from '../../lib/louvain-clustering/LouvainClustering'; -import { CyExtService } from './cy-ext.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { HttpClient } from '@angular/common/http'; -import { LoadGraphFromFileModalComponent } from './popups/load-graph-from-file-modal/load-graph-from-file-modal.component'; -import { Neo4jDb } from './db-service/neo4j-db.service'; -import { BehaviorSubject } from 'rxjs'; -@Injectable({ - providedIn: 'root' -}) -export class CytoscapeService { - userPrefHelper: UserPrefHelper; - removePopperFn: Function; - showObjPropsFn: Function; - showStatsFn: Function; - louvainClusterer: LouvainClustering; - enums = new BehaviorSubject(null); - constructor(private _g: GlobalVariableService, private _timebarService: TimebarService, private _cyExtService: CyExtService, - private _profile: UserProfileService, private _ngZone: NgZone, private _modalService: NgbModal, protected _http: HttpClient,private _dbService: Neo4jDb) { - this.userPrefHelper = new UserPrefHelper(this, this._timebarService, this._g, this._profile); - this.louvainClusterer = new LouvainClustering(); - this._timebarService.hideCompoundsFn = this.hideCompounds.bind(this); - this._timebarService.showCollapsedFn = this.showCollapsed.bind(this); - } - - initCy(containerElem) { - this._cyExtService.registerExtensions(); - - this._g.layout = this._g.getFcoseOptions(); - this._ngZone.runOutsideAngular(() => { - this._g.cy = cytoscape({ - container: containerElem, - layout: this._g.layout, - // initial viewport state: - zoom: 1, - pan: { x: 0, y: 0 }, - // interaction options: - minZoom: 1e-50, - maxZoom: 1e50, - zoomingEnabled: true, - userZoomingEnabled: true, - panningEnabled: true, - userPanningEnabled: true, - boxSelectionEnabled: true, - selectionType: 'single', - touchTapThreshold: 8, - desktopTapThreshold: 4, - autolock: false, - autoungrabify: false, - autounselectify: false, - // rendering options: - headless: false, - styleEnabled: true, - hideEdgesOnViewport: false, - hideLabelsOnViewport: false, - textureOnViewport: false, - motionBlur: false, - motionBlurOpacity: 0.2, - wheelSensitivity: 0.1, - pixelRatio: 'auto' - }); - }); - this._cyExtService.bindExtensions(); - this.bindComponentSelector(); - - this.bindSelectObjOfThisType(); - (window).cy = this._g.cy; - this._g.cy.on('select unselect', (e) => { this._ngZone.run(() => { this.elemSelected(e) }); }); - this._g.cy.on('select unselect add remove tap', () => { this._ngZone.run(() => { this.statsChanged() }); }); - this._g.cy.on('add', C.debounce(this.applyStyle4NewElements, C.CY_BATCH_END_DELAY).bind(this)); - this.userPrefHelper.listen4UserPref(); - this._g.listen4graphEvents(); - } - - private runLayoutIfNoTimebar() { - if (!this._g.userPrefs.timebar.isEnabled.getValue()) { - this._g.performLayout(false); - } else { - this._timebarService.isRandomizedLayout = false; - this._g.isLoadFromExpandCollapse = false; - this._g.isLoadFromHistory = false; - } - } - - private elemSelected(e) { - if (e.type == 'select') { - if (this._g.isSwitch2ObjTabOnSelect) { - this._g.operationTabChanged.next(0); - } - } - if (this.showObjPropsFn) { - this.showObjPropsFn(); - } - } - - private statsChanged() { - if (this.showStatsFn) { - this.showStatsFn(); - } - } - - private applyStyle4NewElements() { - this._g.cy.startBatch(); - this.fitLabel2Node(); - this.showHideEdgeLabels(); - setTimeout(() => { this._g.cy.endBatch(); }, C.CY_BATCH_END_DELAY); - } - - setNodeSizeOnGraphTheoreticProp(maxVal: number, avgSize: number) { - if (maxVal <= 0) { - maxVal = 1; - } - this._g.cy.style().selector('node.graphTheoreticDisplay') - .style( - { - 'width': (e) => { - let b = avgSize + 20; - let a = Math.max(5, avgSize - 20); - let x = e.data('__graphTheoreticProp'); - return ((b - a) * x / maxVal + a) + 'px'; - }, - 'height': (e) => { - let b = avgSize + 20; - let a = Math.max(5, avgSize - 20); - let x = e.data('__graphTheoreticProp'); - return (((b - a) * x / maxVal + a) * e.height() / e.width()) + 'px'; - } - }) - .update(); - } - - bindViewUtilitiesExtension() { - this._cyExtService.bindViewUtilitiesExtension(); - } - - setNavigatorPosition() { - this._cyExtService.setNavigatorPosition(); - } - - loadElementsFromDatabase(data: GraphResponse, isIncremental: boolean, fit:boolean=true) { - if (!data || !data.nodes || !data.edges) { - this._g.showErrorModal('Empty Graph', 'Empty response from database!') - return; - } - if (data.nodes.length > 0 || data.edges.length > 0) { - const nodes = data.nodes; - const edges = data.edges; - - let current = this._g.cy.nodes(':visible'); - let elemIds: string[] = []; - let cyNodes = []; - for (let i = 0; i < nodes.length; i++) { - let cyNodeId = 'n' + nodes[i].elementId; - cyNodes.push(this.createCyNode(nodes[i], cyNodeId)); - elemIds.push(cyNodeId); - } - - let cyEdges = []; - let collapsedEdgeIds = {}; - if (isIncremental) { - collapsedEdgeIds = this.getCollapsedEdgeIds(); - } - for (let i = 0; i < edges.length; i++) { - let cyEdgeId = 'e' + edges[i].elementId; - if (collapsedEdgeIds[cyEdgeId]) { - elemIds.push(collapsedEdgeIds[cyEdgeId]); - continue; - } - cyEdges.push(this.createCyEdge(edges[i], cyEdgeId)); - elemIds.push(cyEdgeId) - } - - this._g.switchLayoutRandomization(!isIncremental); - - if (!isIncremental) { - this._g.cy.elements().remove(); - } - let prevElems = this._g.cy.$(':visible'); - const wasEmpty = this._g.cy.elements().length < 2; - - this._g.cy.add(cyNodes); - const filteredCyEdges = [] - for (let i = 0; i < cyEdges.length; i++) { - const sId = cyEdges[i].data.source; - const eId = cyEdges[i].data.target; - if ((this._g.cy.$id(sId).length < 1 && !nodes.find(x => x.elementId == sId)) || (this._g.cy.$id(eId).length < 1 && !nodes.find(x => x.elementId == eId))) { - continue; - } - filteredCyEdges.push(cyEdges[i]); - } - const addedEdges = this._g.cy.add(filteredCyEdges); - - let compoundEdgeIds = Object.values(collapsedEdgeIds) as string[]; - if (this._g.userPrefs.isCollapseMultiEdgesOnLoad.getValue()) { - this.collapseMultiEdges(addedEdges, false); - } - let compoundEdgeIds2 = this._g.cy.edges('.' + C.COLLAPSED_EDGE_CLASS).map(x => x.id()); - - elemIds.push(...C.arrayDiff(compoundEdgeIds, compoundEdgeIds2)); - - // elements might already exist but hidden, so show them - const elemIdSet = new Set(elemIds); - this._g.viewUtils.show(this._g.cy.elements().filter(element => elemIdSet.has(element.id()))); - this._g.applyClassFiltering(); - - if (isIncremental && !wasEmpty) { - let collection = this._g.cy.collection(); - for (let i = 0; i < cyNodes.length; i++) { - let node = this._g.cy.getElementById(cyNodes[i].data.id); - if (!current.contains(node)) { - collection = collection.union(node); - } - } - this._g.layoutUtils.placeNewNodes(collection); - } - - const shouldRandomize = !isIncremental || wasEmpty; - const hasNew = this.hasNewElem(elemIds, prevElems); - if (hasNew) { - this._g.performLayout(shouldRandomize,false,500, fit); - } - this.highlightElems(isIncremental, elemIds); - this._g.isLoadFromDB = true; - } - this._dbService.addIssueBages() - - - } - - hasNewElem(newElemIds: string[], prevElems: any) { - let d = {}; - - for (let i = 0; i < prevElems.length; i++) { - d[prevElems[i].id()] = true; - } - - for (let i = 0; i < newElemIds.length; i++) { - if (!d[newElemIds[i]]) { - return true; - } - } - return false; - } - loadElementsFromDatabaseInitial(data: GraphResponse) { - if (!data || !data.nodes || !data.edges) { - this._g.showErrorModal('Empty Graph', 'Empty response from database!') - return; - } - const nodes = data.nodes; - const edges = data.edges; - - let current = this._g.cy.nodes(':visible'); - let elemIds: string[] = []; - let cyNodes = []; - for (let i = 0; i < nodes.length; i++) { - let cyNodeId = 'n' + nodes[i].elementId; - cyNodes.push(this.createCyNode(nodes[i], cyNodeId)); - elemIds.push(cyNodeId); - } - let cyEdges = []; - let collapsedEdgeIds = {}; - for (let i = 0; i < edges.length; i++) { - let cyEdgeId = 'e' + edges[i].elementId; - if (collapsedEdgeIds[cyEdgeId]) { - elemIds.push(collapsedEdgeIds[cyEdgeId]); - continue; - } - cyEdges.push(this.createCyEdge(edges[i], cyEdgeId)); - elemIds.push(cyEdgeId) - } - - this._g.switchLayoutRandomization(true); - let prevElems = this._g.cy.$(':visible'); - const wasEmpty = this._g.cy.elements().length < 2; - - this._g.cy.add(cyNodes); - const filteredCyEdges = [] - for (let i = 0; i < cyEdges.length; i++) { - const sId = cyEdges[i].data.source; - const eId = cyEdges[i].data.target; - if ((this._g.cy.$id(sId).length < 1 && !nodes.find(x => x.elementId == sId)) || (this._g.cy.$id(eId).length < 1 && !nodes.find(x => x.elementId == eId))) { - continue; - } - filteredCyEdges.push(cyEdges[i]); - } - const addedEdges = this._g.cy.add(filteredCyEdges); - - let compoundEdgeIds = Object.values(collapsedEdgeIds) as string[]; - if (this._g.userPrefs.isCollapseMultiEdgesOnLoad.getValue()) { - this.collapseMultiEdges(addedEdges, false); - } - let compoundEdgeIds2 = this._g.cy.edges('.' + C.COLLAPSED_EDGE_CLASS).map(x => x.id()); - elemIds.push(...C.arrayDiff(compoundEdgeIds, compoundEdgeIds2)); - this._g.applyClassFiltering(); - const hasNew = this.hasNewElem(elemIds, prevElems); - if (hasNew) { - this._g.performLayout(true); - } - this.highlightElems(false, elemIds); - this._g.isLoadFromDB = true; - } - - collapseMultiEdges(edges2collapse?: any, isSetFlag = true) { - if (!edges2collapse) { - edges2collapse = this._g.cy.edges(':visible'); - } - edges2collapse = edges2collapse.filter('[^originalEnds]'); // do not collapse meta-edges - let sourceTargetPairs = {}; - let isCollapseBasedOnType = this._g.userPrefs.isCollapseEdgesBasedOnType.getValue(); - let edgeCollapseLimit = this._g.userPrefs.edgeCollapseLimit.getValue(); - for (let i = 0; i < edges2collapse.length; i++) { - let e = edges2collapse[i]; - const s = e.data('source'); - const t = e.data('target'); - let edgeId = s + t; - if (isCollapseBasedOnType) { - edgeId = e.classes()[0] + s + t; - } - if (!sourceTargetPairs[edgeId]) { - sourceTargetPairs[edgeId] = { cnt: 1, s: s, t: t }; - } else { - sourceTargetPairs[edgeId]['cnt'] += 1; - } - } - for (let i in sourceTargetPairs) { - let curr = sourceTargetPairs[i]; - if (curr.cnt < edgeCollapseLimit) { - continue; - } - let edges = this._g.cy.edges(`[source="${curr.s}"][target="${curr.t}"]`); - this._g.expandCollapseApi.collapseEdges(edges); - } - if (isSetFlag) { - this._g.isLoadFromExpandCollapse = true; - } - } - - expandMultiEdges(edges2expand?: any) { - if (!edges2expand) { - edges2expand = this._g.cy.edges('.' + C.COLLAPSED_EDGE_CLASS); - } - edges2expand = edges2expand.not('.' + C.META_EDGE_CLASS); - this._g.expandCollapseApi.expandEdges(edges2expand); - this._g.isLoadFromExpandCollapse = true; - } - - collapseNodes() { - if (this._g.cy.nodes(':parent').length > 0) { - this._g.expandCollapseApi.collapseAll(); - } - } - - private getCollapsedEdgeIds(): any { - let compoundEdges = this._g.cy.edges('.' + C.COLLAPSED_EDGE_CLASS); - let collapsedEdgeIds = {}; - for (let i = 0; i < compoundEdges.length; i++) { - let collapsed = compoundEdges[i].data('collapsedEdges'); - for (let j = 0; j < collapsed.length; j++) { - collapsedEdgeIds[collapsed[j].id()] = compoundEdges[i].id(); - } - } - return collapsedEdgeIds; - } - - highlightElems(isIncremental: boolean, elemIds: string[]) { - if (!isIncremental) { - return; - } - // remove all existing hightlights before hightlighting new elements - const newElemIndicator = this._g.userPrefs.mergedElemIndicator.getValue(); - if (newElemIndicator == MergedElemIndicatorTypes.none) { - return; - } - - if (this._g.userPrefs.isOnlyHighlight4LatestQuery.getValue()) { - if (newElemIndicator == MergedElemIndicatorTypes.highlight) { - this._g.viewUtils.removeHighlights(); - } - if (newElemIndicator == MergedElemIndicatorTypes.selection) { - this._g.cy.$().unselect(); - } - } - let ele2highlight = this._g.cy.collection(); - const cnt = elemIds.length; - for (let i = 0; i < cnt; i++) { - ele2highlight.merge(this._g.cy.$id(elemIds.pop())) - } - if (newElemIndicator == MergedElemIndicatorTypes.selection) { - this._g.isSwitch2ObjTabOnSelect = false; - ele2highlight.select(); - this._g.isSwitch2ObjTabOnSelect = true; - } else if (newElemIndicator == MergedElemIndicatorTypes.highlight) { - this._g.highlightElems(ele2highlight); - } - } - - createCyNode(node: CyNode, id) { - const classes = node.labels.join(' '); - let properties = node.properties; - properties.id = id; - return { data: properties, classes: classes }; - } - - createCyEdge(edge: CyEdge, id) { - let properties = edge.properties || {}; - properties.id = id; - properties.source = 'n' + edge.startNodeElementId; - properties.target = 'n' + edge.endNodeElementId; - - return { data: properties, classes: edge.type }; - } - - showHideEdgeLabels() { - this._g.cy.startBatch(); - this._g.cy.edges().removeClass('nolabel'); - if (!this._g.userPrefs.isShowEdgeLabels.getValue()) { - this._g.cy.edges().addClass('nolabel'); - } - setTimeout(() => { this._g.cy.endBatch(); }, C.CY_BATCH_END_DELAY); - } - - fitLabel2Node() { - this._g.cy.startBatch(); - let nodes = this._g.cy.nodes().not(':parent').not('.' + C.CLUSTER_CLASS); - let wrapType = this._g.userPrefs.nodeLabelWrap.getValue(); - - nodes.removeClass('ellipsis_label wrap_label'); - if (wrapType == TextWrapTypes.ellipsis) { - for (let i = 0; i < nodes.length; i++) { - let origLabel = nodes[i].style('label'); - nodes[i].data('__label__', this.truncateText(origLabel, nodes[i])); - } - nodes.addClass('ellipsis_label'); - } else if (wrapType == TextWrapTypes.wrap) { - nodes.addClass('wrap_label'); - } - setTimeout(() => { this._g.cy.endBatch(); }, C.CY_BATCH_END_DELAY); - } - - truncateText(label: string, ele: any): string { - let context = document.createElement('canvas').getContext("2d"); - - let fStyle = ele.pstyle('font-style').strValue; - let size = ele.pstyle('font-size').pfValue + 'px'; - let family = ele.pstyle('font-family').strValue; - let weight = ele.pstyle('font-weight').strValue; - - context.font = fStyle + ' ' + weight + ' ' + size + ' ' + family; - let text = label || ''; - let textWidth = ele.width(); - return this.findFittedTxt(context, text, textWidth); - } - - private findFittedTxt(ctx: CanvasRenderingContext2D, txt: string, wid: number) { - let len = txt.length; - if (ctx.measureText(txt.substr(0, len)).width <= wid) { - return txt; - } - let maxIdx = len - 1; - let minIdx = 1; - - // binary search through possible interval - while (true) { - let doesFit = ctx.measureText(txt.substr(0, len) + '..').width <= wid; - if (doesFit && ctx.measureText(txt.substr(0, len + 1) + '..').width >= wid) { - break; - } - if (doesFit) { - minIdx = len; - len = Math.ceil((len + maxIdx) / 2); - } else { - maxIdx = len; - len = Math.floor((len + minIdx) / 2); - } - } - return txt.substr(0, len) + '..'; - } - - bindHighlightOnHoverListeners() { - let highlighterFn = this.highlightNeighbors(); - let events = `${C.EV_MOUSE_ON} ${C.EV_MOUSE_OFF}`; - let targets = 'node, edge' - this._g.cy.on(events, targets, highlighterFn.bind(this)); - } - - highlightNeighbors() { - return function (event: { target: any, type: string, cySelector?: string }) { - let elements2remain = null; - if (event.cySelector != undefined) { - elements2remain = this._g.cy.$(event.cySelector); - } else { - elements2remain = event.target.neighborhood().union(event.target); - if (event.target.isEdge()) { - elements2remain = event.target.connectedNodes().union(event.target); - } - } - - if (event.type === C.EV_MOUSE_ON) { - elements2remain.addClass('emphasize'); - } else { - elements2remain.removeClass('emphasize'); - } - }.bind(this); - } - - setOtherElementsOpacity(elements, opacity) { - this._g.cy.startBatch(); - this._g.cy.elements().difference(elements).style({ opacity: opacity }); - setTimeout(() => { this._g.cy.endBatch(); }, C.CY_BATCH_END_DELAY); - } - - highlightSelected() { - const selected = this._g.cy.$(':selected'); - if (selected.length < 1) { - return; - } - this._g.highlightElems(selected); - } - - staticHighlightNeighbors() { - let selected = this._g.cy.$(':selected'); - let neighbors = selected.neighborhood(); - this._g.highlightElems(selected.union(neighbors)); - } - - removeHighlights() { - this._g.viewUtils.removeHighlights(); - this._g.viewUtils.removeHighlights(this._g.filterRemovedElems(() => true)); - this.removePopperFn(); - - this._g.cy.nodes().filter(':visible').forEach(element => { - if (element._private.classes.values().next().value == 'Issue') { - this._g.viewUtils.removeHighlights(element) - const elementCueValue = element.getCueData() - //Remove anomaly cues if exist - if (elementCueValue) { - element.removeCue() - } - } - } - - ); - this._dbService.addIssueBages() - } - - unbindHighlightOnHoverListeners() { - this._g.cy.off(`${C.EV_MOUSE_ON} ${C.EV_MOUSE_OFF}`, 'node, edge'); - } - - highlighterCheckBoxClicked(isChecked: boolean) { - if (!isChecked) { - this.unbindHighlightOnHoverListeners(); - } else { - this.bindHighlightOnHoverListeners(); - } - } - - navigatorCheckBoxClicked(isChecked: boolean) { - if (isChecked) { - this._cyExtService.bindNavigatorExtension(); - } else { - this._cyExtService.unbindNavigatorExtension(); - } - } - - showHideTimebar(isChecked: boolean) { - this._g.cy.resize(); - this._timebarService.showHideTimebar(isChecked); - setTimeout(() => { this._cyExtService.setNavigatorPosition() }, 0); - } - - loadFile(file: File) { - C.readTxtFile(file, (txt) => { - try { - if (this._g.cy.$().length == 0) { - this._g.expandCollapseApi.loadJson(txt, false); - } else { - const modal = this._modalService.open(LoadGraphFromFileModalComponent); - modal.componentInstance.txt = txt; - } - } catch (e) { - this._g.showErrorModal('Load', 'Cannot process provided JSON file!'); - } - }); - } - - private str2file(str: string, fileName: string) { - const blob = new Blob([str], { type: 'text/plain' }); - const anchor = document.createElement('a'); - - anchor.download = fileName; - anchor.href = (window.URL).createObjectURL(blob); - anchor.dataset.downloadurl = - ['text/plain', anchor.download, anchor.href].join(':'); - anchor.click(); - } - - saveAsJson() { - this._g.expandCollapseApi.saveJson(this._g.cy.$(), 'visuall.json'); - } - - saveSelectedAsJson() { - this._g.expandCollapseApi.saveJson(this._g.cy.$(':selected'), 'visuall.json'); - } - - saveAsCSV(objs: GraphElem[]) { - if (!objs || objs.length < 1) { - return; - } - - const cols = ['className'].concat(Object.keys(objs[0].data)); - const arr: string[][] = []; - arr.push(cols); - for (const o of objs) { - arr.push([o.classes.split(' ')[0], ...Object.values(o.data) as string[]]); - } - const str = arr.map(x => x.join('|')).join('\n'); - this.str2file(str, 'visuall_objects.csv'); - } - - saveAsPng(isWholeGraph: boolean) { - const options = { bg: 'white', scale: 3, full: isWholeGraph }; - //const base64png: string = this._g.cy.png(options); - const base64png = this._g.cy.pngFull(options, ['cy-context-menus-cxt-menu', 'cy-panzoom']); - base64png.then((result) => { - fetch(result) - .then(res => res.blob()) - .then(x => { - const anchor = document.createElement('a'); - anchor.download = 'visuall.png'; - anchor.href = (window.URL).createObjectURL(x); - anchor.click(); - return x; - }) - }).catch((error) => { - console.error(error); // Handle errors - }); - } - - deleteSelected(event) { - if (event) { - const ele = event.target || event.cyTarget; - this._g.cy.remove(ele); - } else { - this._g.cy.remove(':selected'); - } - this._g.handleCompoundsOnHideDelete(); - this.runLayoutIfNoTimebar(); - } - - addParentNode(idSuffix: string | number, parent = undefined): string { - const id = 'c' + idSuffix; - const parentNode = this.createCyNode({ labels: [C.CLUSTER_CLASS], properties: { end_datetime: 0, begin_datetime: 0, name: name }, elementId: '' }, id); - this._g.cy.add(parentNode); - this._g.cy.elements(`[id = "${id}"]`).move({ parent: parent }); - return id; - } - - addGroup4Selected() { - const elems = this._g.cy.nodes(':selected'); - if (elems.length < 1) { - return; - } - const parent = elems[0].parent().id(); - for (let i = 1; i < elems.length; i++) { - if (parent !== elems[i].parent().id()) { - return; - } - } - if (this._g.userPrefs.groupingOption.getValue() == GroupingOptionTypes.compound) { - const id = new Date().getTime(); - this.addParentNode(id, parent); - for (let i = 0; i < elems.length; i++) { - elems[i].move({ parent: 'c' + id }); - } - } else { - const currCluster: string[] = elems.map(x => x.id()); - if (!this._g.layout.clusters || this._g.layout.clusters.length < 1) { - this._g.layout.clusters = [currCluster]; - } else { - this.removeElementsFromCurrentClusters(elems); - this._g.layout.clusters.push(currCluster); - } - this.removeEmptyClusters(); - } - - this._g.performLayout(false); - } - - removeElementsFromCurrentClusters(elems) { - if (!this._g.layout.clusters) { - return; - } - const currCluster: string[] = elems.map(x => x.id()); - // remove elements from current clusters - for (const cluster of this._g.layout.clusters) { - for (const item of currCluster) { - const idx = cluster.indexOf(item); - if (idx > -1) { - cluster.splice(idx, 1); - } - } - } - } - - removeEmptyClusters() { - if (!this._g.layout.clusters) { - return; - } - const nonEmptyClusters = []; - for (const cluster of this._g.layout.clusters) { - if (cluster.length > 0) { - nonEmptyClusters.push(cluster); - } - } - this._g.layout.clusters = nonEmptyClusters; - } - - removeGroup4Selected(elems = undefined, isRunLayout = true, isCompoundGrouping = null) { - if (isCompoundGrouping === null) { - isCompoundGrouping = this._g.userPrefs.groupingOption.getValue() == GroupingOptionTypes.compound; - } - if (!elems) { - elems = this._g.cy.nodes(':selected'); - if (isCompoundGrouping) { - elems = elems.filter('.' + C.CLUSTER_CLASS); - } - } - if (elems.length < 1) { - return; - } - if (isCompoundGrouping) { - for (let i = 0; i < elems.length; i++) { - // expand if collapsed - if (elems[i].hasClass(C.COLLAPSED_NODE_CLASS)) { - this._g.expandCollapseApi.expand(elems[i], C.EXPAND_COLLAPSE_FAST_OPT); - } - const grandParent = elems[i].parent().id() ?? null; - const children = elems[i].children(); - children.move({ parent: grandParent }); - this._g.cy.remove(elems[i]); - } - } else { - this.removeElementsFromCurrentClusters(elems); - this.removeEmptyClusters(); - } - - if (isRunLayout) { - this._g.performLayout(false); - } - } - - showHideSelectedElements(isHide: boolean) { - if (isHide) { - let selected = this._g.cy.$(':selected').not('.' + C.META_EDGE_CLASS); - this._g.viewUtils.hide(selected); - this.hideCompounds(selected); - this._g.applyClassFiltering(); - if (selected.length > 0) { - this._g.performLayout(false); - } - } else { - if (!this.isAnyHidden()) { - return; - } - const prevVisible = this._g.cy.$(':visible'); - this._g.viewUtils.show(this._g.cy.$()); - this._g.applyClassFiltering(); - this._timebarService.coverVisibleRange(); - this.showCollapsed(null, null); - const currVisible = this._g.cy.$(':visible'); - if (!currVisible.same(prevVisible)) { - if (prevVisible.length > 0) { - this._g.layoutUtils.placeNewNodes(currVisible.difference(prevVisible).nodes()); - } - this._g.performLayout(false); - } - } - } - - hideUnselected() { - let unselected = this._g.cy.$().not(':selected').not('.' + C.META_EDGE_CLASS); - this._g.viewUtils.hide(unselected); - this.hideCompounds(unselected); - this._g.applyClassFiltering(); - if (unselected.length > 0) { - this._g.performLayout(false); - } - } - - showCollapsed(collapsedNodes, collapsedEdges) { - if (!collapsedNodes) { - collapsedNodes = this._g.cy.$('.' + C.COLLAPSED_NODE_CLASS); - } - for (let i = 0; i < collapsedNodes.length; i++) { - this.showCollapsed4Node(collapsedNodes[i]); - } - if (!collapsedEdges) { - collapsedEdges = this._g.cy.$('.' + C.COLLAPSED_EDGE_CLASS); - } - for (let i = 0; i < collapsedEdges.length; i++) { - this.showCollapsed4Edge(collapsedEdges[i]); - } - } - - showCollapsed4Node(node) { - const collapsed = node.data('collapsedChildren'); - this._g.viewUtils.show(collapsed); - const collapsedNodes = collapsed.filter('.' + C.COLLAPSED_NODE_CLASS); - for (let i = 0; i < collapsedNodes.length; i++) { - this.showCollapsed4Node(collapsedNodes[i]); - } - - const collapsedEdges = collapsed.filter('.' + C.COLLAPSED_EDGE_CLASS); - for (let i = 0; i < collapsedEdges.length; i++) { - this.showCollapsed4Edge(collapsedEdges[i]); - } - } - - showCollapsed4Edge(edge) { - const collapsed = edge.data('collapsedEdges'); - this._g.viewUtils.show(collapsed); - const collapsedEdges = collapsed.filter('.' + C.COLLAPSED_EDGE_CLASS); - for (let i = 0; i < collapsedEdges.length; i++) { - this.showCollapsed4Edge(collapsedEdges[i]); - } - } - - // expands all the compound nodes and deletes them recursively - hideCompounds(elems) { - this._timebarService.setIgnoreChanges(true); - const nodes = elems.filter('.' + C.CLUSTER_CLASS).not('.' + C.META_EDGE_CLASS); - let collapsedEdgeIds = elems.union(elems.connectedEdges()).filter('.' + C.COLLAPSED_EDGE_CLASS).map(x => x.id()); - const edgeIdDict = {}; - for (const i of collapsedEdgeIds) { - edgeIdDict[i] = true; - } - for (let i = 0; i < nodes.length; i++) { - this.hideCompoundNode(nodes[i], edgeIdDict); - } - for (let i in edgeIdDict) { - this.hideCompoundEdge(this._g.cy.edges('#' + i)); - } - this._timebarService.setIgnoreChanges(false); - } - - hideCompoundNode(node, edgeIdDict) { - let children = node.children(); // a node might have children - let collapsed = node.data('collapsedChildren'); // a node might a collapsed - let collapsedEdgeIds = children.connectedEdges().filter('.' + C.COLLAPSED_EDGE_CLASS).map(x => x.id()); - - if (collapsed) { - children = children.union(collapsed); - collapsedEdgeIds = collapsed.edges('.' + C.COLLAPSED_EDGE_CLASS).map(x => x.id()); - this._g.expandCollapseApi.expand(node, C.EXPAND_COLLAPSE_FAST_OPT); - } - for (const i of collapsedEdgeIds) { - edgeIdDict[i] = true; - } - - // recursively apply for complex children - const compoundNodes = children.filter('.' + C.CLUSTER_CLASS); - for (let i = 0; i < compoundNodes.length; i++) { - this.hideCompoundNode(compoundNodes[i], edgeIdDict); - } - - // in recursive calls chilren are modified, this node should be an expanded compound node - children = node.children(); // a node might have children - children.move({ parent: node.data('parent') ?? null }); - this._g.viewUtils.hide(children); - this._g.cy.remove(node); - } - - hideCompoundEdge(edge) { - if (!edge || edge.length < 1 || edge.not('.' + C.META_EDGE_CLASS).length < 1) { - return; - } - let children = edge.data('collapsedEdges'); - // recursively apply for complex children - const compoundEdges = children.filter('.' + C.COLLAPSED_EDGE_CLASS); - for (let i = 0; i < compoundEdges.length; i++) { - this.hideCompoundEdge(compoundEdges[i]); - } - this._g.viewUtils.hide(children); - this._g.expandCollapseApi.expandEdges(edge); - } - - isAnyHidden() { - return this._g.cy.$().map(x => x.hidden()).filter(x => x).length > 0; - } - - markovClustering() { - const opt = { attributes: [() => { return 1; }] }; - - let clusters = this._g.cy.$(':visible').markovClustering(opt); - if (this._g.userPrefs.groupingOption.getValue() == GroupingOptionTypes.compound) { - for (let i = 0; i < clusters.length; i++) { - this.addParentNode(i); - clusters[i].move({ parent: 'c' + i }); - } - } else { - let arr = []; - for (let i = 0; i < clusters.length; i++) { - let a = []; - for (let j = 0; j < clusters[i].length; j++) { - a.push(clusters[i][j].id()); - } - arr.push(a); - } - this._g.layout.clusters = arr; - } - } - - louvainClustering() { - let clustering = this.louvainClusterer.cluster(this._g.cy.$(':visible')); - let clusters = {}; - for (let n in clustering) { - clusters[clustering[n]] = true; - } - if (this._g.userPrefs.groupingOption.getValue() == GroupingOptionTypes.compound) { - // generate compound nodes - for (let i in clusters) { - this.addParentNode(i); - } - // add parents to non-compound nodes - for (let n in clustering) { - this._g.cy.elements(`[id = "${n}"]`).move({ parent: 'c' + clustering[n] }); - } - } else { - let arr = []; - for (let i in clusters) { - arr.push([]); - } - for (let i in clustering) { - arr[clustering[i]].push(i); - } - this._g.layout.clusters = arr; - } - } - - clusterByDirector() { - let directorEdges = this._g.cy.edges('.DIRECTOR').filter(':visible'); - let directorIds = new Set(); - let movie2director = {}; - for (let i = 0; i < directorEdges.length; i++) { - let edgeData = directorEdges[i].data(); - directorIds.add(edgeData.source); - if (movie2director[edgeData.target]) { - movie2director[edgeData.target].push(edgeData.source); - } else { - movie2director[edgeData.target] = [edgeData.source]; - } - } - - if (this._g.userPrefs.groupingOption.getValue() == GroupingOptionTypes.compound) { - // add parent nodes - for (let id of directorIds) { - // for each director, generate a compound node - this.addParentNode(id); - // add the director to the compound node - this._g.cy.elements(`[id = "${id}"]`).move({ parent: 'c' + id }); - } - - // assign nodes to parents - for (let [k, v] of Object.entries(movie2director)) { - // if a movie has less than 2 directors add, those movies to the cluster of director - if (v['length'] < 2) { - // add movies to the compound node - this._g.cy.elements(`[id = "${k}"]`).move({ parent: 'c' + v[0] }); - } - } - } else { - const clusters = {}; - for (let id of directorIds) { - clusters[id] = [id]; - } - for (let [k, v] of Object.entries(movie2director)) { - // if a movie has less than 2 directors add, those movies to the cluster of director - if (v['length'] < 2) { - clusters[v[0]].push(k); - } - } - this._g.layout.clusters = Object.values(clusters); - } - - } - - deleteClusteringNodes() { - this._g.cy.$().move({ parent: null }); - this._g.cy.remove('node.' + C.CLUSTER_CLASS); - this._g.layout.clusters = null; - } - - expandAllCompounds() { - if (this._g.cy.nodes('.' + C.COLLAPSED_NODE_CLASS).length > 0) { - this._g.expandCollapseApi.expandAll(); - } - } - - bindComponentSelector() { - let isSelectionLocked = false; - - this._g.cy.on('taphold', 'node, edge', (e) => { - if (!e.originalEvent.shiftKey) { - return; - } - this.getVisibleComponentOf(e.target).select(); - // it selects current node again to prevent that, disable selection until next tap event - this._g.cy.autounselectify(true); - isSelectionLocked = true; - }); - - this._g.cy.on('tapend', 'node, edge', () => { - if (!isSelectionLocked) { - return; - } - // wait to prevent unselect clicked node, after tapend - setTimeout(() => { - this._g.cy.autounselectify(false); - isSelectionLocked = false; - }, 100); - }); - } - - private getVisibleComponentOf(e) { - const comp = this._g.cy.collection(); - const visited = {}; - const stack = []; - if (e.isNode()) { - comp.merge(e); - stack.push(e); - } else { - comp.merge(e); - const conn = e.connectedNodes(); - comp.connectedNodes(conn); - for (let i = 0; i < conn.length; i++) { - stack.push(conn[i]); - } - } - - while (stack.length > 0) { - const curr = stack.pop(); - visited[curr.id()] = true; - const connEdges = curr.connectedEdges(':visible'); - const neigs = connEdges.union(connEdges.connectedNodes(':visible')); - comp.merge(neigs); - const neigNodes = neigs.nodes(); - for (let i = 0; i < neigNodes.length; i++) { - if (!visited[neigNodes[i].id()]) { - stack.push(neigNodes[i]); - } - } - } - - return comp; - } - - bindSelectObjOfThisType() { - let isSelectionLocked = false; - - this._g.cy.on('taphold', 'node, edge', (e) => { - if (!e.originalEvent.ctrlKey) { - return; - } - const model = this._g.dataModel.getValue(); - const classes = e.target.className(); - for (let c of classes) { - if (model.nodes[c] || model.edges[c]) { - this._g.cy.$('.' + c).select(); - } - } - // it selects current node again to prevent that, disable selection until next tap event - this._g.cy.autounselectify(true); - isSelectionLocked = true; - }); - - this._g.cy.on('tapend', 'node, edge', () => { - if (!isSelectionLocked) { - return; - } - // wait to prevent unselect clicked node, after tapend - setTimeout(() => { - this._g.cy.autounselectify(false); - isSelectionLocked = false; - }, 100); - }); - } - - setRemovePoppersFn(fn) { - this.removePopperFn = fn; - } - - changeGroupingOption(x: GroupingOptionTypes) { - if (x === GroupingOptionTypes.clusterId && this._g.cy.$('.' + C.CLUSTER_CLASS).length > 0) { - // expand all collapsed without animation (sync) - this._g.expandCollapseApi.expandAll(C.EXPAND_COLLAPSE_FAST_OPT); - const compounNodes = this._g.cy.$('.' + C.CLUSTER_CLASS); - const clusters: string[][] = []; - for (let i = 0; i < compounNodes.length; i++) { - const cluster = compounNodes[i].children().not('.' + C.CLUSTER_CLASS).map(x => x.id()); - clusters.push(cluster); - } - this._g.layout.clusters = clusters; - // delete the compound nodes - this.removeGroup4Selected(this._g.cy.nodes('.' + C.CLUSTER_CLASS), true, true); - } else if (x === GroupingOptionTypes.compound) { - // Clusters are always non-nested. If cise support nested clusters, below logic should be recursive - if (!this._g.layout || !this._g.layout.clusters) { - this._g.layout.clusters = null; - return; - } - let i = 0; - for (const cluster of this._g.layout.clusters) { - const parentId = this.addParentNode(new Date().getTime() + '_' + i); - for (const nodeId of cluster) { - this._g.cy.nodes('#' + nodeId).move({ parent: parentId }); - } - i++; - } - this._g.layout.clusters = null; - this._g.performLayout(false); - } - } -} \ No newline at end of file diff --git a/src/app/visuall/cytoscape/cytoscape.component.css b/src/app/visuall/cytoscape/cytoscape.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/cytoscape/cytoscape.component.html b/src/app/visuall/cytoscape/cytoscape.component.html deleted file mode 100644 index 7a8afabb..00000000 --- a/src/app/visuall/cytoscape/cytoscape.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
-
-
\ No newline at end of file diff --git a/src/app/visuall/cytoscape/cytoscape.component.ts b/src/app/visuall/cytoscape/cytoscape.component.ts deleted file mode 100644 index 69d71769..00000000 --- a/src/app/visuall/cytoscape/cytoscape.component.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Component, OnInit, HostListener } from '@angular/core'; -import { CytoscapeService } from '../cytoscape.service'; -import { TimebarService } from '../timebar.service'; -import { ContextMenuService } from '../context-menu/context-menu.service'; -import { GlobalVariableService } from '../global-variable.service'; - -@Component({ - selector: 'app-cytoscape', - templateUrl: './cytoscape.component.html', - styleUrls: ['./cytoscape.component.css'] -}) -export class CytoscapeComponent implements OnInit { - - constructor(private _g: GlobalVariableService, private _cyService: CytoscapeService, private _ctxMenuService: ContextMenuService) { } - cyClass = false; - private keyDown = { - 'Alt': false, - 'Shift': false, - 'ArrowUp': false, - 'ArrowDown': false, - 'ArrowRight': false, - 'ArrowLeft': false - } - - ngOnInit() { - this._cyService.initCy(document.getElementById('cy')); - this._ctxMenuService.bindContextMenuExtension(); - } - - setClassForCyDiv(b: boolean) { - this.cyClass = b; - } - - @HostListener('document:keydown.delete', ['$event']) - deleteHotKeyFn() { - const activeElement = document.activeElement as any; - if (activeElement.tagName == 'INPUT' && activeElement.value && activeElement.value.length > 0) { - return; - } - this._cyService.deleteSelected(false); - } - - @HostListener('document:keydown.control.a', ['$event']) - selectAllHotKeyFn(event: KeyboardEvent) { - const activeElement = document.activeElement as any; - if ((activeElement.tagName == 'INPUT' && activeElement.value && activeElement.value.length > 0) || activeElement.tagName == 'TEXTAREA') { - return; - } - event.preventDefault(); - if (event.ctrlKey) { - this._g.cy.$().not(':hidden, :transparent').select(); - } - } - - @HostListener('document:keydown', ['$event']) - moveSelectedWithArrowKeys(event: KeyboardEvent) { - - if (this.keyDown[event.key] === undefined) { - return; - } - this.keyDown[event.key] = true; - - // alt + arrowleft in chrome goes back to previous page - if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && event.altKey) { - event.preventDefault(); - } - - // shouldn't go ahead if both Alt and Shift are pressed - if (this.keyDown['Alt'] && this.keyDown['Shift']) { - return; - } - // normal - let moveSpeed: number = 3; - - // slow - if (this.keyDown['Alt']) { - moveSpeed = 1; - } - // fast - else if (this.keyDown['Shift']) { - moveSpeed = 10; - } - - // decide the shift values in x and y axes - // based on key presses - let dx: number = 0; - let dy: number = 0; - - dx += this.keyDown['ArrowRight'] ? moveSpeed : 0; - dx -= this.keyDown['ArrowLeft'] ? moveSpeed : 0; - dy += this.keyDown['ArrowDown'] ? moveSpeed : 0; - dy -= this.keyDown['ArrowUp'] ? moveSpeed : 0; - - // move selected by the shift values decided above - this._g.cy.nodes(':selected').shift({ - x: dx, - y: dy - }); - - } - // This listener is written for moving - // selected elements with arrow keys facility - @HostListener('document:keyup', ['$event']) - setKeyDownValues(event: KeyboardEvent) { - // if the key is down set corresponding value to false - if (this.keyDown[event.key] !== undefined) { - this.keyDown[event.key] = false; - } - } -} diff --git a/src/app/visuall/db-service/data-types.ts b/src/app/visuall/db-service/data-types.ts deleted file mode 100644 index 5070bc9d..00000000 --- a/src/app/visuall/db-service/data-types.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { ClassBasedRules } from '../operation-tabs/map-tab/query-types'; -import { TableFiltering } from '../../shared/table-view/table-view-types'; - -export interface DbService { - getNeighbors(elemIds: string[] | number[], callback: (x: GraphResponse) => any, queryMeta?: DbQueryMeta, limit?: number); - getElems(ids: string[] | number[], callback: (x: GraphResponse) => any, meta: DbQueryMeta); - getSampleData(callback: (x: GraphResponse) => any); - getFilteringResult(rules: ClassBasedRules, filter: TableFiltering, skip: number, limit: number, type: DbResponseType, callback: (x: GraphResponse | TableResponse) => any); - getGraphOfInterest(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, isDirected: boolean, type: DbResponseType, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void); - getCommonStream(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, dir: Neo4jEdgeDirection, type: DbResponseType, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void); - getNeighborhood(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, isDirected: boolean, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void); -} - -export interface GraphResponse { - nodes: CyNode[]; - edges: CyEdge[]; -} - -export interface CyNode { - elementId: string; - labels: string[]; - properties?: any; -} - -export interface CyEdge { - elementId: string; - properties?: any; - startNodeElementId: string; - endNodeElementId: string; - type: string; -} - -export interface TableResponse { - columns: string[]; - data: any[][]; -} - -export enum Neo4jEdgeDirection { - OUTGOING = 0, INCOMING = 1, BOTH = 2 -} - -export interface GraphHistoryItem { - expo: string; - base64png: string; - json: any; -} - -export interface HistoryMetaData { - labels?: string; - isNode?: boolean; - customTxt?: string; -} - -export interface DbQueryMeta { - edgeType?: string | string[] | string[][]; - targetType?: string; - isMultiLength?: boolean; - isMultiPart?: boolean; - isEdgeQuery?: boolean; -} - -export interface GraphElem { - data: any; - classes: string; -} - -export interface ElemAsQueryParam { - dbId: string; - label: string; -} - -export interface DbResponse { - tableData: TableResponse; - graphData: GraphResponse; - count: number -} - -export enum DbResponseType { - graph = 0, table = 1, generic = 2, count = 3, raw = 4 -} \ No newline at end of file diff --git a/src/app/visuall/db-service/db-adapter.service.ts b/src/app/visuall/db-service/db-adapter.service.ts deleted file mode 100644 index 46c3b990..00000000 --- a/src/app/visuall/db-service/db-adapter.service.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Injectable } from '@angular/core'; -import { DbService, GraphResponse, TableResponse, HistoryMetaData, DbQueryMeta, Neo4jEdgeDirection, DbResponse, DbResponseType } from './data-types'; -import { ClassBasedRules, rule2str2 } from '../operation-tabs/map-tab/query-types'; -import { TableFiltering } from '../../shared/table-view/table-view-types'; -import { GlobalVariableService } from '../global-variable.service'; -import { CustomizationModule } from '../../custom/customization.module'; - -@Injectable({ - providedIn: 'root' -}) -// functions that are not defined due to interface DbService might be deleted -export class DbAdapterService { - private _db: DbService; - // put prefered database service type as argument - constructor(private _g: GlobalVariableService) { - this._db = CustomizationModule.db; - } - - getNeighbors(elemId: string[], callback: (x: GraphResponse) => any, historyMeta?: HistoryMetaData, queryMeta?: DbQueryMeta, limit?: number) { - let s = ''; - if (historyMeta) { - s = historyMeta.labels; - if (!historyMeta.labels) { - s = this._g.getLabels4Elems(elemId, historyMeta.isNode); - } - } - - let txt = 'Get neighbors of element(s): '; - if (historyMeta && historyMeta.customTxt) { - txt = historyMeta.customTxt; - } - let fn = (x) => { callback(x); this._g.add2GraphHistory(txt + s); }; - this._db.getNeighbors(elemId, fn, queryMeta, limit); - } - - getElems(ids: string[], callback: (x: GraphResponse) => any, queryMeta: DbQueryMeta, historyMeta?: HistoryMetaData) { - let s = ''; - if (historyMeta) { - s = historyMeta.labels; - if (!historyMeta.labels) { - s = this._g.getLabels4Elems(ids, historyMeta.isNode); - } - } - - let txt = 'Get neighbors of element(s): '; - if (historyMeta && historyMeta.customTxt) { - txt = historyMeta.customTxt; - } - let fn = (x) => { callback(x); this._g.add2GraphHistory(txt + s); }; - this._db.getElems(ids, fn, queryMeta); - } - - getSampleData(callback: (x: GraphResponse) => any) { - let fn = (x) => { callback(x); this._g.add2GraphHistory('Get sample data'); }; - this._db.getSampleData(fn); - } - - getFilteringResult(rules: ClassBasedRules, filter: TableFiltering, skip: number, limit: number, type: DbResponseType, callback: (x: DbResponse) => any) { - let s = 'Get ' + rule2str2(rules); - let fn = (x) => { callback(x); this._g.add2GraphHistory(s); }; - this._db.getFilteringResult(rules, filter, skip, limit, type, fn); - } - - getGraphOfInterest(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, isDirected: boolean, type: DbResponseType, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void) { - let fn = cb; - if (type == DbResponseType.table) { - fn = (x) => { cb(x); this._g.add2GraphHistory(`Graph of interest`); }; - } - this._db.getGraphOfInterest(dbIds, ignoredTypes, lengthLimit, isDirected, type, filter, idFilter, fn); - } - - getCommonStream(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, dir: Neo4jEdgeDirection, type: DbResponseType, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void) { - let fn = cb; - if (type == DbResponseType.table) { - fn = (x) => { cb(x); this._g.add2GraphHistory(`Common target/regulator`); }; - } - this._db.getCommonStream(dbIds, ignoredTypes, lengthLimit, dir, type, filter, idFilter, fn); - } - - getNeighborhood(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, isDirected: boolean, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void) { - let fn = (x) => { cb(x); this._g.add2GraphHistory(`Common target/regulator`); }; - this._db.getNeighborhood(dbIds, ignoredTypes, lengthLimit, isDirected, filter, idFilter, fn); - } -} diff --git a/src/app/visuall/db-service/neo4j-db.service.ts b/src/app/visuall/db-service/neo4j-db.service.ts deleted file mode 100644 index 27882c42..00000000 --- a/src/app/visuall/db-service/neo4j-db.service.ts +++ /dev/null @@ -1,823 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { GlobalVariableService } from '../global-variable.service'; -import { GraphResponse, TableResponse, DbService, DbQueryMeta, Neo4jEdgeDirection, DbResponse, DbResponseType } from './data-types'; -import { Rule, ClassBasedRules, RuleNode } from '../operation-tabs/map-tab/query-types'; -import { GENERIC_TYPE, LONG_MAX, LONG_MIN } from '../constants'; -import { TableFiltering } from '../../shared/table-view/table-view-types'; -import { TimebarGraphInclusionTypes } from '../user-preference'; -import { Observable } from 'rxjs'; -import { BehaviorSubject } from 'rxjs'; -interface Config { - httpURL: string; - neo4jUsername: string; - neo4jUserPassword: string; -} - -@Injectable({ - providedIn: 'root' -}) - -export class Neo4jDb implements DbService { - enums = new BehaviorSubject(null); - constructor(protected _http: HttpClient, protected _g: GlobalVariableService) { - - this._http.get('/app/custom/config/enums.json').subscribe(x => { - this.enums.next(x) - }); - } - - loadConf(): Observable { - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/getNeo4j" : - `http://${window.location.hostname}:4445/getNeo4j`; - return this._http.get(url); - - } - - async runQuery(query: string, callback: (x: any) => any, responseType: DbResponseType = 0, isTimeboxed = true) { - const conf = await this.loadConf().toPromise(); - const url = conf.httpURL; - //console.log(query) - const username = conf.neo4jUsername; - const password = conf.neo4jUserPassword; - - //For experiment - // Start time - //const startTime = new Date(); - const requestType = responseType == DbResponseType.graph ? 'graph' : 'row'; - this._g.setLoadingStatus(true); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - const q = isTimeboxed - ? `CALL apoc.cypher.run("${query}", null ) YIELD value RETURN value` - : query; - console.log(q); - - this._g.statusMsg.next('Executing database query...'); - const requestBody = { - statements: [{ - statement: q, - parameters: null, - resultDataContents: [requestType] - }] - }; - let isTimeout = true; - let timeoutId; - - if (isTimeboxed) { - timeoutId = setTimeout(() => { - isTimeout = true; - this._g.showErrorModal('Database Timeout', 'Your query took too long!
Consider adjusting timeout setting.'); - }, timeout); - } - - const errFn = (err) => { - if (isTimeout) { - clearTimeout(timeoutId); // Clear the timeout if the request has already timed out - } - isTimeout = false; - // Handle errors - if (err.message.includes('Timeout occurred! It takes longer than')) { - this._g.statusMsg.next(''); - this._g.showErrorModal('Database Timeout', 'Your query took too long!
Consider adjusting timeout setting.'); - } else { - this._g.statusMsg.next('Database query execution raised an error!'); - this._g.showErrorModal('Database Query Execution Error', err.message); - } - this._g.setLoadingStatus(false); - }; - this._http.post(url, requestBody, { - headers: { - 'Accept': 'application/json; charset=UTF-8', - 'Content-Type': 'application/json', - 'Authorization': 'Basic ' + btoa(username + ':' + password) - } - }).subscribe(x => { - if (isTimeout) { - clearTimeout(timeoutId); // Clear the timeout if the request completed before the timeout - } - isTimeout = false; - this._g.setLoadingStatus(false); - if (x['errors'] && x['errors'].length > 0) { - errFn(x['errors'][0]); - return; - } - this._g.statusMsg.next(''); - if (responseType == DbResponseType.graph) { - //const endTime = new Date(); - // Calculate the time difference - //const elapsedTime = endTime.getTime() - startTime.getTime(); - //console.log(`Elapsed Time: ${elapsedTime} milliseconds for graph`); - callback(this.extractGraph(x)); - this.addIssueBages(); - - - - } else if (responseType == DbResponseType.table || responseType == DbResponseType.count) { - //const endTime = new Date(); - // Calculate the time difference - // const elapsedTime = endTime.getTime() - startTime.getTime(); - //console.log(`Elapsed Time: ${elapsedTime} milliseconds for table`); - callback(this.extractTable(x, isTimeboxed)); - } else if (responseType == DbResponseType.generic) { - //const endTime = new Date(); - // Calculate the time difference - //const elapsedTime = endTime.getTime() - startTime.getTime(); - //console.log(`Elapsed Time: ${elapsedTime} milliseconds`); - callback(this.extractGenericData(x, isTimeboxed)); - } - }, errFn); - } - - async runQueryWithoutTimeBoxed(query: string, callback: (x: any) => any, responseType: DbResponseType = 0, isTimeboxed = true) { - const conf = await this.loadConf().toPromise(); - const url = conf.httpURL; - //console.log(query) - const username = conf.neo4jUsername; - const password = conf.neo4jUserPassword; - const requestType = responseType == DbResponseType.graph ? 'graph' : 'row'; - this._g.setLoadingStatus(true); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 10000; - let q = query; - if (!isTimeboxed) { - q = query; - } - this._g.statusMsg.next('Executing database query...'); - const requestBody = { - statements: [{ - statement: q, - parameters: null, - resultDataContents: [requestType] - }] - }; - let isTimeout = true; - if (isTimeboxed) { - setTimeout(() => { - if (isTimeout) { - this._g.showErrorModal('Database Timeout', 'Your query took too long!
Consider adjusting timeout setting.'); - } - }, timeout); - } - - const errFn = (err) => { - isTimeout = false; - // It means our user-defined stored procedure intentionally throws exception to signal timeout - if (err.message.includes('Timeout occurred! It takes longer than')) { - this._g.statusMsg.next(''); - this._g.showErrorModal('Database Timeout', 'Your query took too long!
Consider adjusting timeout setting.'); - } else { - this._g.statusMsg.next('Database query execution raised error!'); - this._g.showErrorModal('Database Query Qxecution Error', err.message); - } - this._g.setLoadingStatus(false); - }; - this._http.post(url, requestBody, { - headers: { - 'Accept': 'application/json; charset=UTF-8', - 'Content-Type': 'application/json', - 'Authorization': 'Basic ' + btoa(username + ':' + password) - } - }).subscribe(x => { - isTimeout = false; - this._g.setLoadingStatus(false); - if (x['errors'] && x['errors'].length > 0) { - errFn(x['errors'][0]); - return; - } - this._g.statusMsg.next(''); - if (responseType == DbResponseType.graph) { - callback(this.extractGraph(x)); - } else if (responseType == DbResponseType.table || responseType == DbResponseType.count) { - callback(this.extractTable(x, isTimeboxed)); - } else if (responseType == DbResponseType.generic) { - callback(this.extractGenericData(x, isTimeboxed)); - } - }, errFn); - } - getNeighbors(elemIds: string[] | number[], callback: (x: GraphResponse) => any, meta?: DbQueryMeta, limit?: number) { - let isEdgeQuery = meta && meta.isEdgeQuery; - const idFilter = this.buildIdFilter(elemIds, false, isEdgeQuery); - let edgeCql = ""; - let recencyProduct = ""; - let withClause = ""; - if (meta && meta.edgeType != undefined && typeof meta.edgeType == 'string' && meta.edgeType.length > 0) { - edgeCql = `-[e:${meta.edgeType}`; - recencyProduct = "e.recency"; - withClause = ",e" - } else if (meta && meta.edgeType != undefined && typeof meta.edgeType == 'object') { - if (meta.isMultiLength) { - for (let i = 0; i < meta.edgeType.length; i++) { - if (i != meta.edgeType.length - 1) { - edgeCql += `-[e${i}:${meta.edgeType[i]}]-()`; - recencyProduct += `e${i}.recency * `; - withClause = `,e${i} ,` - } else { - edgeCql += `-[e${i}:${meta.edgeType[i]}`; - recencyProduct += `e${i}.recency`; - withClause = `,e${i} ` - } - } - } else { - edgeCql = `-[e:${meta.edgeType.join('|')}`; - recencyProduct = `e.recency` - withClause = ",e" - } - } else { - recencyProduct = `e.recency` - withClause = ",e" - edgeCql = `-[e`; - } - let targetCql = ''; - if (meta && meta.targetType != undefined && meta.targetType.length > 0) { - targetCql = ':' + meta.targetType; - } - edgeCql += ']-'; - - let f2 = this.dateFilterFromUserPref('n', true); - if (meta && meta.isMultiLength) { - for (let i = 0; i < meta.edgeType.length; i++) { - f2 += this.dateFilterFromUserPref('e' + i, false); - } - } else { - f2 += this.dateFilterFromUserPref('e', false); - } - let totalIds = [] - if (limit > 0) { - const callbackLimit = (x) => { - const limitedIds = [] - for (const key in x.data) { - if (limitedIds.length >= limit) { - break - } - if (this._g.cy.$id(`n${x.data[key][0]}`).length == 0 || !this._g.cy.$id(`n${x.data[key][0]}`)[0].visible()) { - limitedIds.push(x.data[key][0]) - } - else { - totalIds.push(x.data[key][0]) - } - } - totalIds = [...totalIds, ...limitedIds] - const idFilterlimit = `elementId(t) in ['${totalIds.join("','")}'] ` - this.runQuery(`MATCH p=(n)${edgeCql}(t ${targetCql}) WHERE ${idFilter} AND (${idFilterlimit} ) ${f2} RETURN p ORDER BY ${recencyProduct} DESC `, callback); - } - this.runQuery(`MATCH p=(n)${edgeCql}(t ${targetCql}) WHERE ${idFilter} ${f2} WITH t ${withClause} ORDER BY ${recencyProduct} DESC RETURN distinct elementId(t) `, callbackLimit, DbResponseType.table); - } - else { - this.runQuery(`MATCH p=(n)${edgeCql}(${targetCql}) WHERE ${idFilter} ${f2} RETURN p`, callback); - } - } - - getElems(ids: string[] | number[], callback: (x: GraphResponse) => any, meta: DbQueryMeta) { - const isEdgeQuery = meta && meta.isEdgeQuery; - const idFilter = this.buildIdFilter(ids, false, isEdgeQuery); - let edgepart = isEdgeQuery ? '-[e]-(n2)' : ''; - let returnPart = isEdgeQuery ? 'n,e,n2' : 'n'; - this.runQuery(`MATCH (n)${edgepart} WHERE ${idFilter} RETURN ${returnPart}`, callback); - } - - getSampleData(callback: (x: GraphResponse) => any) { - const f1 = this.dateFilterFromUserPref('n', true); - const f2 = this.dateFilterFromUserPref('e', false); - let f = ''; - if (f1.length > 0) { - f += ' WHERE ' + f1.substr(5); - } - if (f2.length > 0) { - f += f2; - } - this.runQuery(`MATCH (n)-[e]-() ${f} RETURN n,e , rand() as r ORDER BY r limit 50`, callback); - } - - getFilteringResult(rules: ClassBasedRules, filter: TableFiltering, skip: number, limit: number, type: DbResponseType, callback: (x: GraphResponse | TableResponse) => any) { - const cql = this.rule2cql2(rules, skip, limit, type, filter); - this.runQuery(cql, callback, DbResponseType.generic); - } - - getGraphOfInterest(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, isDirected: boolean, type: DbResponseType, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void) { - const t = filter.txt ?? ''; - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const pageSize = this.getPageSize4Backend(); - const currPage = filter.skip ? Math.floor(filter.skip / pageSize) + 1 : 1; - const orderBy = filter.orderBy ? `'${filter.orderBy}'` : null; - let orderDir = 0; - if (filter.orderDirection == 'desc') { - orderDir = 1; - } else if (filter.orderDirection == '') { - orderDir = 2; - } - const timeMap = this.getTimebarMapping4Java(); - let d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - let d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - d1 = 0; - d2 = 0; - } - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - let idf = 'null'; - if (idFilter) { - idf = `[${idFilter.map(element => `'${element}'`).join()}]`; - } - this.runQuery(`CALL graphOfInterest([${dbIds.map(element => `'${element}'`).join()}], [${ignoredTypes.join()}], ${lengthLimit}, ${isDirected}, - ${pageSize}, ${currPage}, '${t}', ${isIgnoreCase}, ${orderBy}, ${orderDir}, ${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, ${idf})`, cb, type, false); - } - - getCommonStream(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, dir: Neo4jEdgeDirection, type: DbResponseType, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void) { - const t = filter.txt ?? ''; - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const pageSize = this.getPageSize4Backend(); - const currPage = filter.skip ? Math.floor(filter.skip / pageSize) + 1 : 1; - const orderBy = filter.orderBy ? `'${filter.orderBy}'` : null; - let orderDir = 0; - if (filter.orderDirection == 'desc') { - orderDir = 1; - } else if (filter.orderDirection == '') { - orderDir = 2; - } - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const timeMap = this.getTimebarMapping4Java(); - let d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - let d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - d1 = 0; - d2 = 0; - } - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - let idf = 'null'; - if (idFilter) { - idf = `[${idFilter.map(element => `'${element}'`).join()}]`; - } - if (type == DbResponseType.count) { - this.runQuery(`CALL commonStreamCount([${dbIds.map(element => `'${element}'`).join()}], [${ignoredTypes.join()}], ${lengthLimit}, ${dir}, '${t}', ${isIgnoreCase}, - ${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, ${idf})`, cb, type, false); - } else if (type == DbResponseType.table) { - this.runQuery(`CALL commonStream([${dbIds.map(element => `'${element}'`).join()}], [${ignoredTypes.join()}], ${lengthLimit}, ${dir}, ${pageSize}, ${currPage}, - '${t}', ${isIgnoreCase}, ${orderBy}, ${orderDir}, ${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, ${idf})`, cb, type, false); - } - } - - getNeighborhood(dbIds: (string | number)[], ignoredTypes: string[], lengthLimit: number, isDirected: boolean, filter: TableFiltering, idFilter: (string | number)[], cb: (x) => void) { - const t = filter.txt ?? ''; - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const pageSize = this.getPageSize4Backend(); - const currPage = filter.skip ? Math.floor(filter.skip / pageSize) + 1 : 1; - const orderBy = filter.orderBy ? `'${filter.orderBy}'` : null; - let orderDir = 0; - if (filter.orderDirection == 'desc') { - orderDir = 1; - } else if (filter.orderDirection == '') { - orderDir = 2; - } - const timeMap = this.getTimebarMapping4Java(); - let d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - let d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - d1 = 0; - d2 = 0; - } - let idf = 'null'; - if (idFilter) { - idf = `[${idFilter.map(element => `'${element}'`).join()}]`; - } - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const timeout = this._g.userPrefs.dbTimeout.getValue() * 1000; - this.runQuery(`CALL neighborhood([${dbIds.map(element => `'${element}'`).join()}], [${ignoredTypes.join()}], ${lengthLimit}, ${isDirected}, - ${pageSize}, ${currPage}, '${t}', ${isIgnoreCase}, ${orderBy}, ${orderDir}, ${timeMap}, ${d1}, ${d2}, ${inclusionType}, ${timeout}, ${idf})`, cb, DbResponseType.table, false); - } - - private getPageSize4Backend(): number { - let pageSize = this._g.userPrefs.dataPageSize.getValue(); - if (this._g.userPrefs.queryResultPagination.getValue() == 'Client') { - pageSize = pageSize * this._g.userPrefs.dataPageLimit.getValue(); - } - return pageSize; - } - - private getTimebarMapping4Java(): string { - // {Person:["start_t", "end_t"]} - const mapping = this._g.appDescription.getValue().timebarDataMapping; - let s = '{' - for (const k in mapping) { - s += k + ':["' + mapping[k].begin_datetime + '","' + mapping[k].end_datetime + '"],'; - } - s = s.slice(0, -1); - s += '}' - return s; - } - - private dateFilterFromUserPref(varName: string, isNode: boolean): string { - if (!this._g.userPrefs.isLimitDbQueries2range.getValue()) { - return ''; - } - let s = ''; - let keys = []; - - if (isNode) { - keys = Object.keys(this._g.appDescription.getValue().objects); - } else { - keys = Object.keys(this._g.appDescription.getValue().relations); - } - - const d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - const d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - const inclusionType = this._g.userPrefs.objectInclusionType.getValue(); - const mapping = this._g.appDescription.getValue().timebarDataMapping; - - if (!mapping || Object.keys(mapping).length < 1) { - return ''; - } - - s = ' AND ('; - for (const k of keys) { - if (!mapping[k]) { - continue; - } - const p1 = `COALESCE(${varName}.${mapping[k].begin_datetime}, ${LONG_MIN})`; - const p2 = `COALESCE(${varName}.${mapping[k].end_datetime}, ${LONG_MAX})`; - const bothNull = `(${varName}.${mapping[k].end_datetime} IS NULL AND ${varName}.${mapping[k].begin_datetime} IS NULL)` - if (inclusionType == TimebarGraphInclusionTypes.overlaps) { - s += `(${bothNull} OR (${p1} <= ${d2} AND ${p2} >= ${d1})) AND`; - } else if (inclusionType == TimebarGraphInclusionTypes.contains) { - s += `(${bothNull} OR (${d1} <= ${p1} AND ${d2} >= ${p2})) AND`; - } else if (inclusionType == TimebarGraphInclusionTypes.contained_by) { - s += `(${bothNull} OR (${p1} <= ${d1} AND ${p2} >= ${d2})) AND`; - } - - } - s = s.slice(0, -4) - s += ')' - return s; - } - - private extractGraph(response): GraphResponse { - let nodes = []; - let edges = []; - const results = response.results[0]; - if (!results) { - this._g.showErrorModal('Invalid Query', response.errors[0]); - return; - } - - const data = response.results[0].data; - for (let i = 0; i < data.length; i++) { - const graph = data[i].graph; - const graph_nodes = graph.nodes; - const graph_edges = graph.relationships; - - for (let node of graph_nodes) { - nodes.push(node); - } - - for (let edge of graph_edges) { - edges.push(edge); - } - } - - return { 'nodes': nodes, 'edges': edges }; - } - - private extractTable(response, isTimeboxed = true): TableResponse { - if (response.errors && response.errors.length > 0) { - this._g.showErrorModal('Database Query', response.errors); - this._g.setLoadingStatus(false); - return; - } - if (isTimeboxed) { - const obj = response.results[0].data; - if (obj[0] === undefined || obj[0] === null) { - return { columns: [], data: [] }; - } - const cols = Object.keys(obj[0].row[0]); - const data = obj.map(x => Object.values(x.row[0])); - // put id to first - const idxId = cols.indexOf('ElementId(x)'); - if (idxId > -1) { - const tmp = cols[idxId]; - cols[idxId] = cols[0]; - cols[0] = tmp; - - for (let i = 0; i < data.length; i++) { - const tmp2 = data[i][idxId]; - data[i][idxId] = data[i][0]; - data[i][0] = tmp2; - } - } - return { columns: cols, data: data }; - } - return { columns: response.results[0].columns, data: response.results[0].data.map(x => x.row) }; - } - - private extractGenericData(response, isTimeboxed = true): DbResponse { - if (response.errors && response.errors.length > 0) { - this._g.showErrorModal('Database Query', response.errors); - this._g.setLoadingStatus(false); - return; - } - if (isTimeboxed) { - const obj = response.results[0].data[0].row[0]; - const r: DbResponse = { tableData: { columns: ['elementId(x)', 'x'], data: [] }, graphData: { nodes: [], edges: [] }, count: obj.count }; - // response is a node response - if (obj.nodeIds) { - r.tableData.data = obj.nodeIds.map((x, i) => [x, obj.nodes[i]]); - r.graphData.nodes = obj.nodeIds.map((x, i) => { return { properties: obj.nodes[i], labels: obj.nodeTypes[i], elementId: x }; }); - } else { - r.tableData.data = obj.edgeIds.map((x, i) => [x, obj.edges[i]]); - r.graphData.nodes = r.graphData.nodes.concat(obj.srcNodeIds.map((x, i) => { return { properties: obj.srcNodes[i], labels: obj.srcNodeTypes[i], elementId: x }; })); - r.graphData.nodes = r.graphData.nodes.concat(obj.tgtNodeIds.map((x, i) => { return { properties: obj.tgtNodes[i], labels: obj.tgtNodeTypes[i], elementId: x }; })); - r.graphData.edges = obj.edgeIds.map((x, i) => { return { properties: obj.edges[i], type: obj.edgeTypes[i], elementId: x, startNodeElementId: obj.srcNodeIds[i], endNodeElementId: obj.tgtNodeIds[i] }; }); - } - - return r; - } - // return { columns: response.results[0].columns, data: response.results[0].data.map(x => x.row) }; - return null; - - } - - // ------------------------------------------------- methods for conversion to CQL ------------------------------------------------- - private rule2cql2(rules: ClassBasedRules, skip: number, limit: number, type: DbResponseType, filter: TableFiltering = null) { - let query = ''; - query += this.getCql4Rules2(rules, filter); - query += this.generateFinalQueryBlock(filter, skip, limit, type, rules.isEdge); - return query; - } - - private getCql4Rules2(rule: ClassBasedRules, filter: TableFiltering = null) { - let isGenericType = false; - if (rule.className == GENERIC_TYPE.ANY_CLASS || rule.className == GENERIC_TYPE.EDGES_CLASS || rule.className == GENERIC_TYPE.NODES_CLASS) { - isGenericType = true; - } - let classFilter = ':' + rule.className; - if (isGenericType) { - classFilter = ''; - } - let matchClause: string; - if (rule.isEdge) { - let s = this._g.appDescription.getValue().relations[rule.className].source; - let t = this._g.appDescription.getValue().relations[rule.className].target; - let conn = '>'; - let isBidirectional = this._g.appDescription.getValue().relations[rule.className].isBidirectional; - if (isBidirectional) { - conn = ''; - } - matchClause = `OPTIONAL MATCH (:${s})-[x${classFilter}]-${conn}(:${t})\n`; - } - else { - matchClause = `OPTIONAL MATCH (x${classFilter})\n`; - } - - let conditions = this.getCondtion4RuleNode(rule.rules); - - if (filter != null && filter.txt.length > 0) { - let s = this.getCondition4TxtFilter(rule.isEdge, rule.className, filter.txt); - conditions = '(' + conditions + ') AND ' + s; - } - conditions += this.dateFilterFromUserPref('x', !rule.isEdge); - - return matchClause + 'WHERE ' + conditions + '\n'; - } - - private getCondition4TxtFilter(isEdge: boolean, className: string, txt: string): string { - let s = ''; - let t = 'nodes'; - if (isEdge) { - t = 'edges'; - } - - let p = this._g.dataModel.getValue()[t][className]; - for (let k in p) { - if (p[k] !== 'list') { - if (this._g.userPrefs.isIgnoreCaseInText.getValue()) { - s += ` LOWER(toString(x.${k})) CONTAINS LOWER('${txt}') OR `; - } else { - s += ` toString(x.${k}) CONTAINS '${txt}' OR `; - } - } else { - if (this._g.userPrefs.isIgnoreCaseInText.getValue()) { - s += ` LOWER(REDUCE(s='', w IN x.${k} | s + w)) CONTAINS LOWER('${txt}') OR `; - } else { - s += ` REDUCE(s = '', w IN x.${k} | s + w) CONTAINS '${txt}' OR `; - } - } - } - s = s.slice(0, -3) - s = '(' + s + ')' - return s; - } - - private getCondtion4RuleNode(node: RuleNode): string { - let s = '('; - if (!node.r.ruleOperator) { - s += ' ' + this.getCondition4Rule(node.r) + ' '; - } else { - for (let i = 0; i < node.children.length; i++) { - if (i != node.children.length - 1) { - s += ' ' + this.getCondtion4RuleNode(node.children[i]) + ' ' + node.r.ruleOperator; - } else { - s += ' ' + this.getCondtion4RuleNode(node.children[i]) + ' '; - } - } - } - return s + ')'; - } - - private getCondition4Rule(rule: Rule): string { - if (!rule.propertyOperand || rule.propertyOperand == GENERIC_TYPE.NOT_SELECTED) { - return '(TRUE)'; - } - let inputOp = ''; - if (rule.propertyType == 'string' || rule.propertyType == 'list' || rule.propertyType.startsWith('enum')) { - inputOp = `'${rule.rawInput}'`; - } else { - inputOp = '' + rule.rawInput; - } - if (rule.propertyType == 'list') { - return `(${inputOp} IN x.${rule.propertyOperand})`; - } else if (rule.propertyType == 'edge') { - if (!rule.operator || !rule.inputOperand || rule.inputOperand.length < 1) { - return `( COUNT{(x)-[:${rule.propertyOperand}]-()}> 0 )`; - } - const i = this.transformInp(rule, rule.inputOperand); - const op = rule.operator != 'One of' ? rule.operator : 'IN'; - return `( COUNT{(x)-[:${rule.propertyOperand}]-()} ${op} ${i} )`; - } else { - if (rule.propertyType == 'string' && this._g.userPrefs.isIgnoreCaseInText.getValue()) { - inputOp = inputOp.toLowerCase(); - inputOp = this.transformInp(rule, inputOp); - const op = rule.operator != 'One of' ? rule.operator : 'IN'; - return `(LOWER(x.${rule.propertyOperand}) ${op} ${inputOp})`; - } - inputOp = this.transformInp(rule, inputOp); - const op = rule.operator != 'One of' ? rule.operator : 'IN'; - return `(x.${rule.propertyOperand} ${op} ${inputOp})`; - } - } - - private transformInp(rule: Rule, inputOp: string): string { - if (rule.operator != 'One of') { - return inputOp; - } - let s = inputOp; - s = s.replace(/'/g, ''); - if (rule.propertyType == 'string') { - let arr = s.split(',').map(x => `'${x}'`); - return `[${arr.join(',')}]` - } else { - return `[${s}]` - } - } - - private generateFinalQueryBlock(filter: TableFiltering, skip: number, limit: number, type: DbResponseType, isEdge: boolean) { - const r = `[${skip}..${skip + limit}]`; - if (type == DbResponseType.table) { - let orderExp = ''; - if (filter != null && filter.orderDirection.length > 0) { - orderExp = `WITH x ORDER BY x.${filter.orderBy} ${filter.orderDirection}`; - } - if (isEdge) { - return `${orderExp} RETURN collect(ElementId(x))${r} as edgeIds, collect(type(x))${r} as edgeTypes, collect(x)${r} as edges, - collect(ElementId(startNode(x)))${r} as srcNodeIds, collect(labels(startNode(x)))${r} as srcNodeTypes, collect(startNode(x))${r} as srcNodes, - collect(ElementId(endNode(x)))${r} as tgtNodeIds, collect(labels(endNode(x)))${r} as tgtNodeTypes, collect(endNode(x))${r} as tgtNodes, - size(collect(x)) as count`; - } - return `${orderExp} RETURN collect(ElementId(x))${r} as nodeIds, collect(labels(x))${r} as nodeTypes, collect(x)${r} as nodes, size(collect(x)) as count`; - } else if (type == DbResponseType.count) { - return `RETURN COUNT(x)`; - } - return ''; - } - - private buildIdFilter(ids: string[] | number[], hasAnd = false, isEdgeQuery = false): string { - if (ids === undefined) { - return ''; - } - let varName = 'n'; - if (isEdgeQuery) { - varName = 'e'; - } - let cql = ''; - if (ids.length > 0) { - cql = '('; - } - for (let i = 0; i < ids.length; i++) { - cql += `ElementId(${varName})='${ids[i]}' OR ` - } - - if (ids.length > 0) { - cql = cql.slice(0, -4); - - cql += ')'; - if (hasAnd) { - cql += ' AND '; - } - } - return cql; - } - addIssueBages(size: number = 18) { - let addPriorityBadge = false; - this._g.cy.nodes().forEach(async (element) => { - if (element._private.classes.values().next().value == 'Issue') { - const div1 = document.createElement("div"); - const div2 = document.createElement("div"); - let type = element._private.data.issueType - let priority = element._private.data.priority - if (!Object.values(this.enums.getValue().issueType).includes(element._private.data.issueType)) { - type = 'Other'; - } - if (!Object.values(this.enums.getValue().priority).includes(element._private.data.priority)) { - type = 'Other'; - } - if (Object.keys(element.getCueData()).length === 0) { - element.addCue({ - htmlElem: div1, - imgData: { width: size, height: size, src: "app/custom/assets/issue-types/" + type + ".svg" }, - id: element._private.data.name + element._private.data.issueType, - show: "always", - position: "top-left", - marginY: "%21.3", - marginX: "%24.3", - cursor: "pointer", - zIndex: 1, - tooltip: type - }); - - element.addCue({ - htmlElem: div2, - imgData: { width: size, height: size, src: "app/custom/assets/issue-priority/" + priority + ".svg" }, - id: element._private.data.name + element._private.data.priority, - show: "always", - position: "left", - marginX: "%24.3", - marginY: "%7.8", - cursor: "pointer", - zIndex: 1, - tooltip: priority - }); - - - } - } - }); - - } - - private generateRedShades() { - let colors = []; - colors = [ - "#FF9999", "#fe5050", "#FE0022", "#BC0000", "#9a0000" - ] - return colors; - } - activateAnomalyCues() { - const colors = this.generateRedShades() - - this._g.cy.nodes().filter(':visible').forEach(async (element) => { - if (element._private.classes.values().next().value == 'Issue') { - const cb = (x) => { - const div1 = document.createElement("div"); - let number = x.data[0][1]; - if (number > 0) { - element.addClass("anomalyBadgeDisplay") - let position = "top-right"; - let badgeWidth = 1; - if(element._private.classes.has("graphTheoreticDisplay")){ - position = "right" - badgeWidth = element.data('__graphTheoreticProp') * 0.4; - } - let color = (number <= 5) ? colors[number - 1] : colors[4]; - let listOfAnomalies = x.data[0][0]; - const size_x = 0.60 + 2 * badgeWidth * Math.log(3 * listOfAnomalies.length + 1) / 15; - const size_y = 0.10 + 2 *badgeWidth * Math.log(3 * listOfAnomalies.length + 1) / 15; - const font_size = 0.75 + Math.log(3 * badgeWidth * listOfAnomalies.length + 1) / 15; - div1.style.backgroundColor = color; - div1.style.color = "#fff"; - div1.style.fontSize = font_size + 'em'; - div1.style.paddingBottom = size_y + 'em'; - div1.style.paddingTop = size_y + 'em'; - div1.style.paddingRight = size_x + 'em'; - div1.style.paddingLeft = size_x + 'em'; - div1.style.borderRadius = '100%'; - div1.innerHTML = `${number}`; - let elementCueValue = element.getCueData() - if (elementCueValue && !elementCueValue[Object.keys(elementCueValue)[0]].hasOwnProperty(element._private.data.name)) { - element.addCue({ - htmlElem: div1, - id: element._private.data.name, - show: "always", - position: position, - marginX: "%0", - marginY: "%8", - cursor: "pointer", - zIndex: 5, - tooltip: listOfAnomalies.join('\n') - }); - } - } - } - const cql = `MATCH (n:Issue {name:'${element._private.data.name}'}) RETURN n.anomalyList as anomalyList , n.anomalyCount as anomalyCount`; - this.runQuery(cql, cb, DbResponseType.table); - } - }); - } - // ------------------------------------------------- end of methods for conversion to CQL ------------------------------------------------- -} diff --git a/src/app/visuall/global-variable.service.ts b/src/app/visuall/global-variable.service.ts deleted file mode 100644 index aabbf4e5..00000000 --- a/src/app/visuall/global-variable.service.ts +++ /dev/null @@ -1,600 +0,0 @@ -import { Injectable } from '@angular/core'; -import { UserPref, GroupingOptionTypes } from './user-preference'; -import { BehaviorSubject } from 'rxjs'; -import { HttpClient } from '@angular/common/http'; -import appPref from '../../assets/appPref.json'; -import { isPrimitiveType, debounce, LAYOUT_ANIM_DUR, COLLAPSED_EDGE_CLASS, COLLAPSED_NODE_CLASS, CLUSTER_CLASS, CY_BATCH_END_DELAY, EXPAND_COLLAPSE_FAST_OPT, HIGHLIGHT_OPACITY } from './constants'; -import { GraphHistoryItem, GraphElem } from './db-service/data-types'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ErrorModalComponent } from './popups/error-modal/error-modal.component'; -import { CyStyleCustomizationService } from '../custom/customization-service/cy-style-customization.service'; - -@Injectable({ - providedIn: 'root' -}) -export class GlobalVariableService { - private HISTORY_SNAP_DELAY = 1500; // we should wait for layout to finish - private _isSetEnums = false; - private _isErrorModalUp = false; - cy: any; - viewUtils: any; - layoutUtils: any; - layout: { clusters: string[][], randomize: boolean, tile: boolean, animationDuration: number, tilingPaddingVertical: number, tilingPaddingHorizontal: number }; - expandCollapseApi: any; - hiddenClasses: Set; - setLoadingStatus: (boolean) => void; - userPrefs: UserPref = {} as UserPref; - userPrefsFromFiles: UserPref = {} as UserPref; - shownElemsChanged = new BehaviorSubject(true); - operationTabChanged = new BehaviorSubject(1); - isSwitch2ObjTabOnSelect: boolean = true; - graphHistory: GraphHistoryItem[] = []; - showHideGraphHistory = new BehaviorSubject(false); - addNewGraphHistoryItem = new BehaviorSubject(false); - isLoadFromHistory: boolean = false; - isLoadFromDB: boolean = false; - openReportTab =new BehaviorSubject(false); - isLoadFromExpandCollapse: boolean = false; - isUserPrefReady = new BehaviorSubject(false); - statusMsg = new BehaviorSubject(''); - performLayout: Function; - cyNaviPositionSetter: any; - appDescription = new BehaviorSubject(null); - dataModel = new BehaviorSubject(null); - endPoints = new BehaviorSubject(null); - enums = new BehaviorSubject(null); - initialQuery: string=""; - //The anomaly settings - constructor(private _http: HttpClient, private _modalService: NgbModal, private _cyCustomStyle: CyStyleCustomizationService) { - this.hiddenClasses = new Set([]); - // set user preferences staticly (necessary for rendering html initially) - this.setUserPrefs(appPref, this.userPrefs); - - // set default values dynamically - this._http.get('./assets/appPref.json').subscribe(x => { - this.setUserPrefs(x, this.userPrefs); - this.setUserPrefs(x, this.userPrefsFromFiles); - - // set user prefered values. These will be overriden if "Store User Profile" is checked - this._http.get('/app/custom/config/app_description.json').subscribe(x => { - this.appDescription.next(x); - this.setUserPrefs(x['appPreferences'], this.userPrefs); - this.setUserPrefs(x['appPreferences'], this.userPrefsFromFiles); - this.isUserPrefReady.next(true); - }, this.showErr.bind(this)); - }, this.showErr.bind(this)); - - let isGraphEmpty = () => { return this.cy.elements().not(':hidden, :transparent').length > 0 }; - this.performLayout = debounce(this.performLayoutFn, LAYOUT_ANIM_DUR, false, isGraphEmpty); - - // set cytoscape.js style dynamicly - this._http.get('./assets/generated/stylesheet.json').subscribe(x => { - this.cy.style(x); - this.addOtherStyles(); - }, this.showErr.bind(this)); - - this._http.get('./assets/generated/properties.json').subscribe(x => { - this.dataModel.next(x); - }, this.showErr.bind(this)); - - this._http.get('./assets/generated/endpoints.json').subscribe(x => { - this.endPoints.next(x); - }, this.showErr.bind(this)); - - this._http.get('/app/custom/config/enums.json').subscribe(x => { - this.enums.next(x); - }, this.showErr.bind(this)); - } - - private showErr(e) { - this.showErrorModal('Internet Error', e); - } - - transfer2UserPrefs(u: any) { - if (u) { - this.setUserPrefs(u, this.userPrefs); - } - } - - runLayout() { - const elems4layout = this.cy.elements().not(':hidden, :transparent'); - if (elems4layout.length < 1) { - return; - } - if (this.layout.randomize) { - this.statusMsg.next('Recalculating layout...'); - } else { - this.statusMsg.next('Performing layout...'); - } - this.setLoadingStatus(true); - if (this.layout.clusters && this.layout.clusters.length > 0) { - this.removeDeletedClusters(); - elems4layout.layout(this.getCiseOptions()).run(); - } else { - elems4layout.layout(this.layout).run(); - } - this.statusMsg.next('Rendering graph...'); - } - - private removeDeletedClusters() { - const clusters = []; - for (let i = 0; i < this.layout.clusters.length; i++) { - const c = []; - for (let j = 0; j < this.layout.clusters[i].length; j++) { - if (this.cy.$id(this.layout.clusters[i][j]).length > 0) { - c.push(this.layout.clusters[i][j]); - } - } - if (c.length > 0) { - clusters.push(c); - } - } - this.layout.clusters = clusters; - } - - switchLayoutRandomization(isRandomize: boolean) { - this.layout.randomize = isRandomize; - this.layoutUtils.setOption('randomize', isRandomize); - } - applyClassFiltering() { - let hiddenSelector = ''; - for (let i of this.hiddenClasses) { - hiddenSelector += '.' + i + ','; - } - - hiddenSelector = hiddenSelector.substr(0, hiddenSelector.length - 1); - - if (hiddenSelector.length > 1 && this.cy.$(hiddenSelector).length>0 ) { - this.viewUtils.hide(this.cy.$(hiddenSelector)); - } - - this.handleCompoundsOnHideDelete(); - } - - filterByClass(elems) { - let hiddenSelector = ''; - for (let i of this.hiddenClasses) { - hiddenSelector += '.' + i + ','; - } - - hiddenSelector = hiddenSelector.substr(0, hiddenSelector.length - 1); - - if (hiddenSelector.length < 1) { - return elems; - } - return elems.not(hiddenSelector); - } - - getGraphElemSet() { - return new Set(this.cy.elements().map(x => x.id())); - } - - highlightElems(elems) { - this.viewUtils.highlight(elems, this.userPrefs.currHighlightIdx.getValue()); - } - - updateSelectionCyStyle() { - this.cy.style().selector(':selected').style({ - 'overlay-color': this.userPrefs.selectionColor.getValue(), - 'overlay-padding': this.userPrefs.selectionWidth.getValue() - }) - .selector('edge:selected') - .style({ - 'overlay-padding': (e) => { - return (this.userPrefs.selectionWidth.getValue() + e.width()) / 2 + 'px'; - }, - }).update(); - - this.addStyle4Emphasize(); - } - - add2GraphHistory(expo: string) { - setTimeout(() => { - if (this.graphHistory.length > this.userPrefs.queryHistoryLimit.getValue() - 1) { - this.graphHistory.splice(0, 1); - } - const options = { bg: 'white', scale: 1, full: true }; - const base64png: string = this.cy.png(options); - const elements = this.cy.json().elements; - - let g: GraphHistoryItem = { - expo: expo, - base64png: base64png, - json: elements - }; - this.graphHistory.push(g); - this.addNewGraphHistoryItem.next(true); - }, this.HISTORY_SNAP_DELAY); - } - - getLabels4Elems(elemIds: string[] , isNode: boolean = true, objDatas: GraphElem[] = null): string { - return this.getLabels4ElemsAsArray(elemIds, isNode, objDatas).join(','); - } - - getLabels4ElemsAsArray(elemIds: string[] , isNode: boolean = true, objDatas: GraphElem[] = null): string[] { - let cyIds: string[] = []; - let idChar = 'n'; - if (!isNode) { - idChar = 'e'; - } - if (objDatas) { - cyIds = objDatas.map(x => x.data.id); - } else { - for (let i = 0; i < elemIds.length; i++) { - cyIds.push(idChar + elemIds[i]); - } - } - - const labels = []; - let labelParent: any = this.appDescription.getValue().objects; - if (!isNode) { - labelParent = this.appDescription.getValue().relations; - } - for (let i = 0; i < cyIds.length; i++) { - let cName = ''; - if (!objDatas) { - cName = this.cy.elements(`[id = "${cyIds[i]}"]`).className()[0]; - } else { - cName = objDatas[i].classes.split(' ')[0]; - } - - let s = labelParent[cName]['style']['label'] as string; - if (s.indexOf('(') < 0) { - labels.push(s); - } else { - let propName = s.slice(s.indexOf('(') + 1, s.indexOf(')')); - if (!objDatas) { - labels.push(this.cy.elements(`[id = "${cyIds[i]}"]`).data(propName)); - } else { - const currData = objDatas[i].data; - let l = currData[propName]; - if (!l) { - l = currData[Object.keys(currData)[0]] - } - labels.push(l); - } - } - } - - return labels; - } - - listen4graphEvents() { - this.cy.on('layoutstop', () => { - this.setLoadingStatus(false); - this.statusMsg.next(''); - }); - } - - getFcoseOptions(fitValue:boolean=true) { - let p = 4; - if (this.userPrefsFromFiles.tilingPadding) { - p = this.userPrefsFromFiles.tilingPadding.getValue(); - } - return { - name: 'fcose', - //Change the edge length - idealEdgeLength: edge => 70, - randomize: false, - // whether or not to animate the layout - animate: true, - // duration of animation in ms, if enabled - animationDuration: LAYOUT_ANIM_DUR, - fit: fitValue, - // padding around layout - padding: 10, - // whether to include labels in node dimensions. Valid in 'proof' quality - nodeDimensionsIncludeLabels: true, - tile: true, - // Represents the amount of the vertical space to put between the zero degree members during the tiling operation(can also be a function) - tilingPaddingVertical: p, - // Represents the amount of the horizontal space to put between the zero degree members during the tiling operation(can also be a function) - tilingPaddingHorizontal: p, - clusters: null // cise argument - }; - } - - // delete/expand compounds if they don't have any visible elements - handleCompoundsOnHideDelete() { - const metaEdges = this.cy.edges('.' + COLLAPSED_EDGE_CLASS); - // some collapsed edges should be expanded, or their data should be updated - for (let i = 0; i < metaEdges.length; i++) { - const collapsedEdges = metaEdges[i].data('collapsedEdges'); - if (collapsedEdges.filter(':visible').length < 2) { - this.expandCollapseApi.expandEdges(metaEdges[i]); - } else { - metaEdges[i].data('collapsedEdges', collapsedEdges.filter(':visible')) - this.cy.add(collapsedEdges.not(':visible')); - } - } - - const metaNodes = this.cy.nodes('.' + COLLAPSED_NODE_CLASS); - // First, expand the collapsed if they don't have anything visible inside - for (let i = 0; i < metaNodes.length; i++) { - const collapsedChildren = metaNodes[i].data('collapsedChildren'); - if (collapsedChildren.filter(':visible').length < 1) { - this.expandCollapseApi.expand(metaNodes[i], EXPAND_COLLAPSE_FAST_OPT); - } - } - - //if an expanded compound does not have anything visible, delete it - const clusterNodes = this.cy.nodes('.' + CLUSTER_CLASS).not('.' + COLLAPSED_NODE_CLASS); - for (let i = 0; i < clusterNodes.length; i++) { - // if there are empty compounds, delete them - const children = clusterNodes[i].children(); - if (children.filter(':visible').length < 1) { - children.move({ parent: null }); - this.cy.remove(clusterNodes[i]); - } - } - } - - getEnumMapping(): any { - // changes value inside `this.appDescription.getValue().enumMapping` since it works on reference - const mapping = this.appDescription.getValue().enumMapping; - if (this._isSetEnums) { - return mapping; - } - const enums = this.enums.getValue(); - for (const k in mapping) { - for (const k2 in mapping[k]) { - mapping[k][k2] = enums[mapping[k][k2]]; - } - } - this._isSetEnums = true; - return mapping; - } - - showErrorModal(title: string, msg: string) { - if (this._isErrorModalUp) { - return; - } - this._isErrorModalUp = true; - const fn = () => { - this._isErrorModalUp = false; - }; - const instance = this._modalService.open(ErrorModalComponent); - instance.result.then(fn, fn); - instance.componentInstance.title = title; - instance.componentInstance.msg = msg; - } - - /** - * @param {} fn should be a function that takes a cytoscape.js element and returns true or false - */ - filterRemovedElems(fn) { - const r = this.cy.collection(); - const collapsedNodes = this.cy.nodes('.' + COLLAPSED_NODE_CLASS); - for (let i = 0; i < collapsedNodes.length; i++) { - const ancestors = this.cy.collection(); - this.filterOnElem(collapsedNodes[i], fn, r, ancestors); - } - const collapsedEdges = this.cy.edges('.' + COLLAPSED_EDGE_CLASS); - for (let i = 0; i < collapsedEdges.length; i++) { - const ancestors = this.cy.collection(); - this.filterOnElem(collapsedEdges[i], fn, r, ancestors); - } - return r; - } - - filterOnElem(elem, fn, r, ancestors) { - const collapsedChildren = elem.data('collapsedChildren'); - const collapsedEdges = elem.data('collapsedEdges'); - let collapsed = this.cy.collection(); - if (collapsedChildren) { - collapsed.merge(collapsedChildren); - } - if (collapsedEdges) { - collapsed.merge(collapsedEdges); - } - if (!collapsedChildren && !collapsedEdges && fn(elem)) { - r.merge(elem); - r.merge(ancestors); - } - - if (collapsed.length > 0) { - ancestors = ancestors.union(elem); - } - for (let i = 0; i < collapsed.length; i++) { - this.filterOnElem(collapsed[i], fn, r, ancestors); - } - } - - private performLayoutFn(isRandomize: boolean, isDirectCommand: boolean = false, animationDuration: number = LAYOUT_ANIM_DUR, fit: boolean = true) { - if (!this.userPrefs.isAutoIncrementalLayoutOnChange.getValue() && !isRandomize && !isDirectCommand) { - this.cy.fit(); - return; - } - if (this.userPrefs.groupingOption.getValue() != GroupingOptionTypes.clusterId) { - this.layout = this.getFcoseOptions(fit); - } - this.layout.animationDuration = animationDuration; - this.layout.tile = this.userPrefs.isTileDisconnectedOnLayout.getValue(); - this.switchLayoutRandomization(isRandomize); - this.runLayout(); - } - - private getCiseOptions() { - return { - // -------- Mandatory parameters -------- - name: 'cise', - - // ClusterInfo can be a 2D array contaning node id's or a function that returns cluster ids. - // For the 2D array option, the index of the array indicates the cluster ID for all elements in - // the collection at that index. Unclustered nodes must NOT be present in this array of clusters. - // - // For the function, it would be given a Cytoscape node and it is expected to return a cluster id - // corresponding to that node. Returning negative numbers, null or undefined is fine for unclustered - // nodes. - // e.g - // Array: OR function(node){ - // [ ['n1','n2','n3'], ... - // ['n5','n6'] } - // ['n7', 'n8', 'n9', 'n10'] ] - clusters: this.layout.clusters, - randomize: this.layout.randomize, - - // -------- Optional parameters -------- - // Whether to animate the layout - // - true : Animate while the layout is running - // - false : Just show the end result - // - 'end' : Animate directly to the end result - animate: 'end', - - // number of ticks per frame; higher is faster but more jerky - refresh: 10, - - // Animation duration used for animate:'end' - animationDuration: LAYOUT_ANIM_DUR, - - // Easing for animate:'end' - animationEasing: undefined, - - // Whether to fit the viewport to the repositioned graph - // true : Fits at end of layout for animate:false or animate:'end' - fit: true, - - // Padding in rendered co-ordinates around the layout - padding: 30, - - // separation amount between nodes in a cluster - // note: increasing this amount will also increase the simulation time - nodeSeparation: 10, - - // Inter-cluster edge length factor - // (2.0 means inter-cluster edges should be twice as long as intra-cluster edges) - idealInterClusterEdgeLengthCoefficient: 1.4, - - // Whether to pull on-circle nodes inside of the circle - allowNodesInsideCircle: true, - - // Max percentage of the nodes in a circle that can move inside the circle - maxRatioOfNodesInsideCircle: 0.1, - - // - Lower values give looser springs - // - Higher values give tighter springs - springCoeff: 0.45, - - // Node repulsion (non overlapping) multiplier - nodeRepulsion: 4500, - - // Gravity force (constant) - gravity: 0.25, - - // Gravity range (constant) - gravityRange: 3.8, - - packComponents: true, - - // Layout event callbacks; equivalent to `layout.one('layoutready', callback)` for example - ready: function () { }, // on layoutready - stop: function () { }, // on layoutstop - }; - } - - private setUserPrefs(obj: any, userPref: any) { - if (obj === undefined || obj === null) { - return; - } - for (let k in obj) { - let prop = obj[k]; - if (isPrimitiveType(prop)) { - if (userPref[k]) { - (userPref[k] as BehaviorSubject).next(prop); - } else { - userPref[k] = new BehaviorSubject(prop); - } - } else { - if (!userPref[k]) { - if (prop instanceof Array) { - userPref[k] = []; - } else { - userPref[k] = {}; - } - } - this.setUserPrefs(obj[k], userPref[k]); - } - } - } - - // some styles uses functions, so they can't be added using JSON - private addOtherStyles() { - this.cy.startBatch(); - this.cy.style().selector('edge.' + COLLAPSED_EDGE_CLASS) - .style({ - 'label': (e) => { - return '(' + e.data('collapsedEdges').length + ')'; - }, - 'width': (e) => { - let n = e.data('collapsedEdges').length; - return (3 + Math.log2(n)) + 'px'; - }, - 'line-color': this.setColor4CompoundEdge.bind(this), - 'target-arrow-color': this.setColor4CompoundEdge.bind(this), - 'target-arrow-shape': this.setTargetArrowShape.bind(this), - }).update(); - this._cyCustomStyle.addCustomStyles(this.cy); - - // add override styles - this.cy.style() - .selector('node.ellipsis_label') - .style({ - "label": "data(__label__)" - }) - .selector('node.wrap_label') - .style({ - "text-wrap": "wrap" - }) - .selector('edge.nolabel') - .style({ - "label": "" - }).update(); - - setTimeout(() => { this.cy.endBatch(); }, CY_BATCH_END_DELAY); - } - - private addStyle4Emphasize() { - const color = '#ff8a00'; - const wid = this.userPrefs.highlightStyles[0].wid.getValue() + 4; - const OPACITY_DIFF = 0.06; - - this.cy.style().selector('node.emphasize') - .style({ - 'overlay-color': color, 'overlay-opacity': HIGHLIGHT_OPACITY + OPACITY_DIFF, 'overlay-padding': wid - }).update(); - - this.cy.style().selector('edge.emphasize') - .style({ - 'overlay-color': color, 'overlay-opacity': HIGHLIGHT_OPACITY + OPACITY_DIFF, 'overlay-padding': (e) => { - return (wid + e.width()) / 2 + 'px'; - } - }).update(); - } - - private setColor4CompoundEdge(e) { - let collapsedEdges = e.data('collapsedEdges'); - if (this.doElemsMultiClasses(collapsedEdges)) { - return '#b3b3b3'; - } - return collapsedEdges[0].style('line-color') - } - - private setTargetArrowShape(e) { - let collapsedEdges = e.data('collapsedEdges'); - if (this.doElemsMultiClasses(collapsedEdges)) { - return 'triangle'; - } - return collapsedEdges[0].style('target-arrow-shape') - } - - private doElemsMultiClasses(elems) { - let classDict = {}; - for (let i = 0; i < elems.length; i++) { - let classes = elems[i].classes(); - for (let j = 0; j < classes.length; j++) { - classDict[classes[j]] = true; - } - } - return Object.keys(classDict).length > 1; - } -} diff --git a/src/app/visuall/graph-history/graph-history.component.css b/src/app/visuall/graph-history/graph-history.component.css deleted file mode 100644 index 72018325..00000000 --- a/src/app/visuall/graph-history/graph-history.component.css +++ /dev/null @@ -1,36 +0,0 @@ -.draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90); - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; - min-width: 150px; - min-height: 600px; -} - -.std-icon { - width: 16px; -} - -.img-bg { - z-index: 1000; - position: fixed; - width: 100vw; - height: 100vh; - top: 0px; - left: 0px; - background-color: lightgray; - opacity: 0.9; -} - -.popped-img { - position: fixed; - z-index: 1000; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - height: 50vh; - width: auto; -} diff --git a/src/app/visuall/graph-history/graph-history.component.html b/src/app/visuall/graph-history/graph-history.component.html deleted file mode 100644 index 915274fe..00000000 --- a/src/app/visuall/graph-history/graph-history.component.html +++ /dev/null @@ -1,32 +0,0 @@ -
- -
- -
-
- -
- -
\ No newline at end of file diff --git a/src/app/visuall/graph-history/graph-history.component.ts b/src/app/visuall/graph-history/graph-history.component.ts deleted file mode 100644 index 995d8f51..00000000 --- a/src/app/visuall/graph-history/graph-history.component.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../global-variable.service'; -import { GraphHistoryItem } from '../db-service/data-types'; -import { Subscription } from 'rxjs'; - -@Component({ - selector: 'app-graph-history', - templateUrl: './graph-history.component.html', - styleUrls: ['./graph-history.component.css'] -}) -export class GraphHistoryComponent implements OnInit, OnDestroy { - - isShow: boolean = false; - imgSrc: string = null; - graphHistory: GraphHistoryItem[]; - position = { x: -130, y: 0 }; - currSize: { width: number, height: number } = { width: 375, height: 600 }; - activeItemIdx = 0; - subs: Subscription[] = []; - - constructor(private _g: GlobalVariableService) { } - - ngOnInit(): void { - this.graphHistory = this._g.graphHistory; - this.subs.push(this._g.showHideGraphHistory.subscribe(x => { - this.isShow = x; - if (x) { - this.graphHistory = this._g.graphHistory; - } - })); - this.subs.push(this._g.addNewGraphHistoryItem.subscribe(x => { - if (x) { - this.activeItemIdx = this._g.graphHistory.length - 1; - } - })); - this.subs.push(this._g.userPrefs.queryHistoryLimit.subscribe(x => { - while (this._g.graphHistory.length > x) { - this._g.graphHistory.splice(0, 1); - this.activeItemIdx = this.activeItemIdx - 1; - } - this.graphHistory = this._g.graphHistory; - })); - } - - ngOnDestroy(): void { - if (this.subs) { - for (const sub of this.subs) { - sub.unsubscribe(); - } - this.subs = []; - } - } - - load(i: number) { - this.activeItemIdx = i; - let g = this.graphHistory[i]; - this._g.cy.json({ elements: g.json }); - this._g.isLoadFromHistory = true; - this._g.cy.fit(); - } - - delete(i: number) { - if (i == this.activeItemIdx) { - this.activeItemIdx = -1; - } - if (i < this.activeItemIdx) { - this.activeItemIdx = this.activeItemIdx - 1; - } - this._g.graphHistory.splice(i, 1); - } - - onMouseOver(i: number) { - this.imgSrc = this._g.graphHistory[i].base64png; - } - - onMouseOut() { - this.imgSrc = null; - } - - closeClicked() { - this._g.showHideGraphHistory.next(false); - this.imgSrc = null; - } - - onMoveEnd(e) { - this.position = e; - } - - onResizeStop(e) { - this.currSize = e.size; - } -} diff --git a/src/app/visuall/load-from-url.service.ts b/src/app/visuall/load-from-url.service.ts deleted file mode 100644 index 9062e6ee..00000000 --- a/src/app/visuall/load-from-url.service.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { CytoscapeService } from './cytoscape.service'; -import { HttpClient } from '@angular/common/http'; -import { HttpErrorResponse } from '@angular/common/http'; -import { GlobalVariableService } from './global-variable.service'; - -@Injectable({ providedIn: 'root' }) - -export class URLLoadService { - - url: string; - data: any; - fileRead: boolean = false; - - constructor(private route: ActivatedRoute, private http: HttpClient, - private _cyService: CytoscapeService, private _g: GlobalVariableService) { } - - init() { - - this.route.queryParams.subscribe(async params => { - //if there is a URL query, getData() is invoked, otherwise nothing - this.url = await params['URL']; - this.getData(); - }); - } - - getData() { - if (typeof this.url !== 'undefined') { - //if url is not null, get the data from the given route else wait for 200 ms and try again - this.http.get(('urlquery/' + this.url), { - headers: { 'Content-Type': 'application/json' } - , observe: "body", responseType: "text" as "json" - }).subscribe(async data => { - - this.data = new File([await data], 'Graph', { type: 'text', lastModified: Date.now() }); - - //data is taken as json and given to cytoscape's loadFile method as it is in navbar load - this._cyService.loadFile(this.data); - }, - (err: HttpErrorResponse) => { - this._g.showErrorModal(err.name, err.message) - } - ); - } - else { - setTimeout(this.getData, 200); - } - } - -} diff --git a/src/app/visuall/navbar/inavbar.ts b/src/app/visuall/navbar/inavbar.ts deleted file mode 100644 index 3a599ece..00000000 --- a/src/app/visuall/navbar/inavbar.ts +++ /dev/null @@ -1,17 +0,0 @@ -export interface NavbarDropdown { - // will be shown as a dropdown button - dropdown: string; - // will be shown inside the dropdown button - actions: NavbarAction[]; -} - -export interface NavbarAction { - // only used to make unit testing easier - id: string; - // used to show on navbar - txt: string; - // must be the name of function, function should be parameterless - fn: string; - // must be false for custom items - isStd: boolean; -} \ No newline at end of file diff --git a/src/app/visuall/navbar/navbar.component.css b/src/app/visuall/navbar/navbar.component.css deleted file mode 100644 index 08ffbbcf..00000000 --- a/src/app/visuall/navbar/navbar.component.css +++ /dev/null @@ -1,6 +0,0 @@ -.navbar{ - padding: 1px; -} -#brand-logo{ - height: 50px -} \ No newline at end of file diff --git a/src/app/visuall/navbar/navbar.component.html b/src/app/visuall/navbar/navbar.component.html deleted file mode 100644 index 472b8111..00000000 --- a/src/app/visuall/navbar/navbar.component.html +++ /dev/null @@ -1,34 +0,0 @@ - \ No newline at end of file diff --git a/src/app/visuall/navbar/navbar.component.ts b/src/app/visuall/navbar/navbar.component.ts deleted file mode 100644 index 2eb4182b..00000000 --- a/src/app/visuall/navbar/navbar.component.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { Component, NgModule, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { DbAdapterService } from '../db-service/db-adapter.service'; -import { GlobalVariableService } from '../global-variable.service'; -import { CytoscapeService } from '../cytoscape.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { SaveAsPngModalComponent } from '../popups/save-as-png-modal/save-as-png-modal.component'; -import { AboutModalComponent } from '../popups/about-modal/about-modal.component'; -import { QuickHelpModalComponent } from '../popups/quick-help-modal/quick-help-modal.component'; -import { LegendModalComponent } from '../popups/legend-modal/legend-modal.component'; -import { NavbarCustomizationService } from '../../custom/customization-service/navbar-customization.service'; -import { NavbarDropdown, NavbarAction } from './inavbar'; -import { UserProfileService } from '../user-profile.service'; -import { readTxtFile, CLUSTER_CLASS } from '../constants'; -import { SaveProfileModalComponent } from '../popups/save-profile-modal/save-profile-modal.component'; -import { URLLoadService } from '../load-from-url.service'; -import { GroupingOptionTypes } from '../user-preference'; -import { Subscription } from 'rxjs'; -import { ProjectBuilderDialogComponent } from './project-builder/project-builder-dialog-component'; -@Component({ - selector: 'app-navbar', - templateUrl: './navbar.component.html', - styleUrls: ['./navbar.component.css'] -}) -export class NavbarComponent implements OnInit, OnDestroy { - @ViewChild('file', { static: false }) file; - @NgModule({ - imports: [ProjectBuilderDialogComponent], - declarations: [ProjectBuilderDialogComponent], - providers: [], - bootstrap: [ProjectBuilderDialogComponent] - }) - - menu: NavbarDropdown[]; - closeResult: string; - toolName: string; - toolLogo: string; - isLoadFile4Graph: boolean = false; - appDescSubs: Subscription; - //addProject: {dropdown: 'Add', actions: [{ txt: 'Load...', id: 'nbi00', fn: 'loadFile', isStd: true }]}; - - - constructor(private _dbService: DbAdapterService, private _cyService: CytoscapeService, private _modalService: NgbModal, - private _g: GlobalVariableService, private _customizationService: NavbarCustomizationService, private _profile: UserProfileService, - private _urlload: URLLoadService) { - this.menu = [ - { - dropdown: 'File', actions: [{ txt: 'Load...', id: 'nbi00', fn: 'loadFile', isStd: true }, - { txt: 'Save', id: 'nbi01', fn: 'saveAsJson', isStd: true }, - { txt: 'Save Selected Objects', id: 'nbi02', fn: 'saveSelectedAsJson', isStd: true }, - { txt: 'Save as PNG...', id: 'nbi03', fn: 'saveAsPng', isStd: true }, - { txt: 'Load User Profile...', id: 'nbi04', fn: 'loadUserProfile', isStd: true }, - { txt: 'Save User Profile...', id: 'nbi05', fn: 'saveUserProfile', isStd: true }] - }, - { - dropdown: 'Edit', actions: [{ txt: 'Add Group for Selected', id: 'nbi10', fn: 'addGroup4Selected', isStd: true }, - { txt: 'Remove Group for Selected', id: 'nbi11', fn: 'removeGroup4Selected', isStd: true }, - { txt: 'Remove All Groups', id: 'nbi12', fn: 'removeAllGroups', isStd: true }, - { txt: 'Delete Selected', id: 'nbi13', fn: 'deleteSelected', isStd: true }, - { txt: 'Query History', id: 'nbi101', fn: 'showHideGraphHistory', isStd: true }] - }, - { - dropdown: 'View', actions: [ - { txt: 'Hide Selected', id: 'nbi20', fn: 'hideSelected', isStd: true }, - { txt: 'Hide Unselected', id: 'nbi21', fn: 'hideUnselected', isStd: true }, - { txt: 'Show All', id: 'nbi22', fn: 'showAll', isStd: true }, - { txt: 'Collapse All Nodes', id: 'nbi23', fn: 'collapseAllNodes', isStd: true }, - { txt: 'Expand All Nodes', id: 'nbi24', fn: 'expandAllNodes', isStd: true }, - { txt: 'Collapse All Edges', id: 'nbi25', fn: 'collapseAllEdges', isStd: true }, - { txt: 'Expand All Edges', id: 'nbi26', fn: 'expandAllEdges', isStd: true } - ] - }, - { - dropdown: 'Highlight', actions: [{ txt: 'Search...', id: 'nbi30', fn: 'search2Highlight', isStd: true }, - { txt: 'Selected', id: 'nbi31', fn: 'highlightSelected', isStd: true }, - { txt: 'Neighbors of Selected', id: 'nbi32', fn: 'highlightNeighborsOfSelected', isStd: true }, - { txt: 'Remove Highlights', id: 'nbi33', fn: 'removeHighlights', isStd: true }] - }, - { - dropdown: 'Layout', actions: [{ txt: 'Perform Layout', id: 'nbi40', fn: 'doLayout', isStd: true }, - { txt: 'Recalculate Layout', id: 'nbi41', fn: 'recalculateLayout', isStd: true }] - }, - { - dropdown: 'Help', actions: [{ txt: 'Quick Help', id: 'nbi50', fn: 'openQuickHelp', isStd: true }, - { txt: 'Legend', id: 'nbi51', fn: 'openLegend', isStd: true }, - { txt: 'About', id: 'nbi52', fn: 'openAbout', isStd: true }] - }, - { - dropdown: 'Data', actions: [{ txt: 'Sample Data', id: 'nbi60', fn: 'getSampleData', isStd: true }, - { txt: 'Clear Data', id: 'nbi62', fn: 'clearData', isStd: true }] - } - ]; - } - - ngOnInit() { - this.appDescSubs = this._g.appDescription.subscribe(x => { - if (x != null) { - this.toolName = x.appInfo.name; - this.toolLogo = x.appInfo.icon; - } - }) - this.mergeCustomMenu(); - this._urlload.init(); - } - - ngOnDestroy(): void { - if (this.appDescSubs) { - this.appDescSubs.unsubscribe(); - } - } - - mergeCustomMenu() { - let m = this._customizationService.menu; - // in any case, set isStd property to false - m.map(x => x.actions.map(y => y.isStd = false)); - - for (let i = 0; i < m.length; i++) { - let idx = this.menu.findIndex(x => x.dropdown == m[i].dropdown); - if (idx == -1) { - this.menu.push(m[i]); - } else { - this.menu[idx].actions.push(...m[i].actions); - } - } - } - - fileSelected() { - if (this.isLoadFile4Graph) { - this._cyService.loadFile(this.file.nativeElement.files[0]); - } else { - readTxtFile(this.file.nativeElement.files[0], (s) => { - this._profile.setUserProfile(s); - }); - } - } - - triggerAct(act: NavbarAction) { - if (act.isStd) { - this[act.fn](); - } else { - this._customizationService[act.fn](); - } - } - - loadFile() { - this.isLoadFile4Graph = true; - this.openFileInput(); - } - - saveAsJson() { this._cyService.saveAsJson(); } - - saveSelectedAsJson() { this._cyService.saveSelectedAsJson(); } - - saveAsPng() { this._modalService.open(SaveAsPngModalComponent); } - - deleteSelected() { this._cyService.deleteSelected(null); } - - addGroup4Selected() { this._cyService.addGroup4Selected(); } - - removeGroup4Selected() { this._cyService.removeGroup4Selected(); } - - removeAllGroups() { - if (this._g.userPrefs.groupingOption.getValue() == GroupingOptionTypes.compound) { - this._cyService.removeGroup4Selected(this._g.cy.nodes('.' + CLUSTER_CLASS)); - } else { - this._cyService.removeGroup4Selected(this._g.cy.nodes()); - } - - } - - hideSelected() { this._cyService.showHideSelectedElements(true); } - - hideUnselected() { this._cyService.hideUnselected(); } - - showAll() { this._cyService.showHideSelectedElements(false); } - - search2Highlight() { document.getElementById('highlight-search-inp').focus(); } - - highlightSelected() { this._cyService.highlightSelected(); } - - highlightNeighborsOfSelected() { this._cyService.staticHighlightNeighbors(); } - - removeHighlights() { this._cyService.removeHighlights()} - - doLayout() { this._g.performLayout(false, true); } - - recalculateLayout() { this._g.performLayout(true); } - - openQuickHelp() { this._modalService.open(QuickHelpModalComponent); } - - openLegend() { this._modalService.open(LegendModalComponent); } - - openAbout() { this._modalService.open(AboutModalComponent); } - - collapseAllEdges() { this._cyService.collapseMultiEdges(); } - - expandAllEdges() { this._cyService.expandMultiEdges(); } - - collapseAllNodes() { this._cyService.collapseNodes(); } - - expandAllNodes() { this._cyService.expandAllCompounds(); } - - getSampleData() { - this._g.layout.clusters = null; - this._dbService.getSampleData(x => { this._cyService.loadElementsFromDatabase(x, false) }); - } - - clearData() { - this._g.layout.clusters = null; - this._g.cy.remove(this._g.cy.$()); - } - - showHideGraphHistory() { - const v = this._g.showHideGraphHistory.getValue(); - this._g.showHideGraphHistory.next(!v); - } - - loadUserProfile() { - this.isLoadFile4Graph = false; - this.openFileInput(); - } - - saveUserProfile() { - this._modalService.open(SaveProfileModalComponent, { size: 'sm' }); - } - - private openFileInput() { - this.file.nativeElement.value = ''; - this.file.nativeElement.click(); - } - -} - diff --git a/src/app/visuall/navbar/project-builder/dialog-component.html b/src/app/visuall/navbar/project-builder/dialog-component.html deleted file mode 100644 index dcd81752..00000000 --- a/src/app/visuall/navbar/project-builder/dialog-component.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
- - -
\ No newline at end of file diff --git a/src/app/visuall/navbar/project-builder/dialog-component.ts b/src/app/visuall/navbar/project-builder/dialog-component.ts deleted file mode 100644 index aef54627..00000000 --- a/src/app/visuall/navbar/project-builder/dialog-component.ts +++ /dev/null @@ -1,42 +0,0 @@ - -import { Component, OnInit, ElementRef, Inject } from '@angular/core'; -import { Pipe, PipeTransform } from '@angular/core'; -import { MatDialogRef } from '@angular/material/dialog'; -import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; -import { Router } from '@angular/router'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -@Component({ - selector: 'dialog-component', - styleUrls: ['project-builder-dialog-component.css'], - templateUrl: 'dialog-component.html', -}) -@Pipe({ - name: 'safe' -}) -export class DialogComponent implements OnInit { - public safeSrc: SafeResourceUrl; - private timeoutRef: any; - constructor(private http: HttpClient, private elRef: ElementRef, private router: Router, private sanitizer: DomSanitizer, public dialogRef: MatDialogRef) { - } - - ngOnInit() { - const hostname = window.location.hostname; - if (hostname === 'saa.cs.bilkent.edu.tr') { - this.safeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(`http://saa.cs.bilkent.edu.tr/ui/`); - } else { - this.safeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(`http://${hostname}:4450`); - } - } - adjustSize() { - const dialogEl = this.elRef.nativeElement.closest('.mat-dialog-container'); - const iframeEl = this.elRef.nativeElement.querySelector('iframe'); - } - ngOnDestroy() { - // Clear the timeout when the dialog is closed - clearTimeout(this.timeoutRef); - } - onCloseClick(): void { - this.dialogRef.close(); - } -} - diff --git a/src/app/visuall/navbar/project-builder/project-builder-dialog-component.css b/src/app/visuall/navbar/project-builder/project-builder-dialog-component.css deleted file mode 100644 index 7da8284f..00000000 --- a/src/app/visuall/navbar/project-builder/project-builder-dialog-component.css +++ /dev/null @@ -1,38 +0,0 @@ -iframe{ - width: 1000px !important; - height: 520px !important; - overflow: hidden; - position: absolute; -} - -.md-button { - padding: 0 6px 0 6px; - margin: 6px 8px 6px 8px; - min-width: 88px; - border-radius: 3px; - font-size: 14px; - text-align: center; - text-transform: uppercase; - text-decoration:none; - border: none; - outline: none; - } - -.btn-close:focus { - outline: 0; - box-shadow: none; - opacity: 1; -} - -.btn-close { - padding: 5px; -} -.close_button { - z-index: 400; - position: absolute; - width: 1000px; - float: right; - padding: 5px; - display: flex; - flex-direction: row-reverse; -} \ No newline at end of file diff --git a/src/app/visuall/navbar/project-builder/project-builder-dialog-component.html b/src/app/visuall/navbar/project-builder/project-builder-dialog-component.html deleted file mode 100644 index 5793bba4..00000000 --- a/src/app/visuall/navbar/project-builder/project-builder-dialog-component.html +++ /dev/null @@ -1,13 +0,0 @@ - - \ No newline at end of file diff --git a/src/app/visuall/navbar/project-builder/project-builder-dialog-component.ts b/src/app/visuall/navbar/project-builder/project-builder-dialog-component.ts deleted file mode 100644 index fb56969e..00000000 --- a/src/app/visuall/navbar/project-builder/project-builder-dialog-component.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Component, Injector, NgModule, ViewChild } from '@angular/core'; -import { MatDialog, MatDialogRef } from '@angular/material/dialog'; -import { MatButtonModule } from '@angular/material/button'; -import { DialogComponent } from './dialog-component'; -import { ProjectAboutModalComponent } from '../../popups/project-about-modal/project-about-modal-component'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Neo4jDb } from '../../db-service/neo4j-db.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -/** - * @title Dialog elements - */ -@Component({ - selector: 'project-builder-dialog-component', - styleUrls: ['project-builder-dialog-component.css'], - templateUrl: 'project-builder-dialog-component.html', -}) -export class ProjectBuilderDialogComponent { - constructor(public dialog: MatDialog, private _modalService: NgbModal, public _dbService: Neo4jDb) { } - - openNewDialog() { - const dialogRef = this.dialog.open(DialogComponent, { - width: '90vw', - height: '90vh', - }); - - dialogRef.afterClosed().subscribe(result => { - console.log('The dialog was closed'); - }); - } - - openAboutDialog() { - // Initialize the statistic object - const statistic: any = {}; - - const cb = (x) => { - // Use square brackets to access properties - for (let j = 0; j < x.columns.length; j++) { - statistic[x.columns[j]] = x.data[0][j]; - } - - // Pass the configuration object as a 'data' property - const modalRef = this._modalService.open(ProjectAboutModalComponent); - - // Access the component instance and set its properties - const modalComponentInstance: ProjectAboutModalComponent = modalRef.componentInstance; - modalComponentInstance.modalConfig = statistic; - }; - - const cql = ` - MATCH (n) - OPTIONAL MATCH (n)-[r]->() - WITH - COUNT(DISTINCT n) AS node, - COUNT(DISTINCT r) AS edge, - COLLECT(DISTINCT CASE WHEN 'Commit' IN labels(n) THEN n END) AS commitNodes, - COLLECT(DISTINCT CASE WHEN 'PullRequest' IN labels(n) THEN n END) AS prNodes, - COLLECT(DISTINCT CASE WHEN 'Issue' IN labels(n) THEN n END) AS issueNodes, - COLLECT(DISTINCT CASE WHEN 'Developer' IN labels(n) THEN n END) AS developerNodes, - COLLECT(DISTINCT CASE WHEN 'File' IN labels(n) THEN n END) AS fileNodes - RETURN - node, - edge, - SIZE(commitNodes) AS commitNode, - SIZE(prNodes) AS prNode, - SIZE(issueNodes) AS issueNode, - SIZE(developerNodes) AS developerNode, - SIZE(fileNodes) AS fileNode; - `; - - this._dbService.runQuery(cql, cb, DbResponseType.table); - } -} - - - diff --git a/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.css b/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.css deleted file mode 100644 index c873dc58..00000000 --- a/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.css +++ /dev/null @@ -1,4 +0,0 @@ -select { - width: 60%; - min-width: 200px; -} \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.html b/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.html deleted file mode 100644 index c46332bc..00000000 --- a/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.html +++ /dev/null @@ -1,42 +0,0 @@ -
-
- -
-
-
- - -
-
- - -
-
- - -
- -
-
-
- - -
- -
-
- -
- - -
-
-
\ No newline at end of file diff --git a/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.ts b/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.ts deleted file mode 100644 index d8b1782a..00000000 --- a/src/app/visuall/operation-tabs/map-tab/graph-theoretic-properties-tab/graph-theoretic-properties-tab.component.ts +++ /dev/null @@ -1,482 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../../global-variable.service'; -import { formatNumber } from '@angular/common'; -import { CytoscapeService } from '../../../cytoscape.service'; -import { debounce2, debounce, COLLAPSED_EDGE_CLASS, mapColor } from '../../../constants'; -import { Subscription } from 'rxjs'; -import { Neo4jDb } from '../../../db-service/neo4j-db.service'; -@Component({ - selector: 'app-graph-theoretic-properties-tab', - templateUrl: './graph-theoretic-properties-tab.component.html', - styleUrls: ['./graph-theoretic-properties-tab.component.css'] -}) -export class GraphTheoreticPropertiesTabComponent implements OnInit, OnDestroy { - - theoreticProps: { text: string, fn: string, arg: any }[] = [ - { text: 'Degree Centrality', fn: 'degreeCentrality', arg: '' }, - { text: 'Normalized Degree Centrality', fn: 'degreeCentralityNormalized', arg: '' }, - { text: 'Inter-Group Degree Centrality', fn: 'interGroupDegreeCentrality', arg: '' }, - { text: 'Normalized Inter-Group Degree Centrality', fn: 'interGroupDegreeCentralityNormalized', arg: '' }, - { text: 'Closeness Centrality', fn: 'closenessCentrality', arg: '' }, - { text: 'Normalized Closeness Centrality', fn: 'closenessCentralityNormalized', arg: '' }, - { text: 'Betweenness Centrality', fn: 'betweennessCentrality', arg: '' }, - { text: 'Normalized Betweenness Centrality', fn: 'betweennessCentralityNormalized', arg: '' }, - { text: 'Page Rank', fn: 'pageRank', arg: '' }, - { text: 'Pull Requests: Changed Lines of Code', fn: 'lineOfCode', arg: '' } - ]; - isOnSelected = false; - isDirectedGraph = false; - isMapNodeSizes = true; - isMapBadgeSizes = false; - isConsiderOriginalEdges = false; - selectedPropFn: string = ''; - poppedData: { popper: HTMLDivElement, elem: any, fn: Function, fn2: Function }[] = []; - UPDATE_POPPER_WAIT = 100; - cySelector = ''; - badgeColor = '#007bff'; - isBadgeVisible = true; - readonly ZOOM_THRESHOLD = 0.8; - readonly NODE_SIZE = 40; - maxPropValue = 0; - currNodeSize = this.NODE_SIZE; - appDescSubs: Subscription; - - constructor(private _g: GlobalVariableService, private _cyService: CytoscapeService, public _dbService: Neo4jDb) { } - - ngOnInit() { - this._cyService.setRemovePoppersFn(this.destroyCurrentPoppers.bind(this)); - this._g.cy.on('remove', (e) => { this.destroyPopper(e.target.id()) }); - this._g.appDescription.subscribe(x => { - if (x !== null && x.appPreferences.avgNodeSize) { - this.currNodeSize = x.appPreferences.avgNodeSize; - } - }); - } - - ngOnDestroy(): void { - if (this.appDescSubs) { - this.appDescSubs.unsubscribe(); - } - } - - runProperty() { - this.cySelector = ''; - if (this.isOnSelected) { - this.cySelector = ':selected'; - } - this.destroyCurrentPoppers(); - if (!this[this.selectedPropFn]) { - return; - } - this[this.selectedPropFn](); - - // Filter nodes that have the __graphTheoreticProp property - const nodesWithProp = this._g.cy.nodes().filter(x => (x.data('__graphTheoreticProp') !== undefined)) ; - if (nodesWithProp.length === 0) { - console.warn('No nodes with __graphTheoreticProp found'); - return; - } - let m = Math.max(...nodesWithProp.map(x => x.data('__graphTheoreticProp'))); - if (m <= 0) { - m = 1; - } - this.maxPropValue = m; - this._cyService.setNodeSizeOnGraphTheoreticProp(m, this.currNodeSize); - this.setBadgeColorsAndCoords(); - let b = this.currNodeSize + 20; - let a = Math.max(5, this.currNodeSize - 20); - - this._g.cy.nodes().filter(':visible').forEach(async (element) => { - if (element._private.classes.values().next().value === 'Issue') { - if (element._private.classes.has("graphTheoreticDisplay") ) { - element.removeCue(); - const badgeWidth = ((b - a) * element.data('__graphTheoreticProp') / m + a) * 0.5625; - console.log(b,a,m, element.data('__graphTheoreticProp'), badgeWidth) - this._dbService.addIssueBages(badgeWidth); - } else { - element.removeCue(); - this._dbService.addIssueBages(); - } - if(element._private.classes.has("anomalyBadgeDisplay")){ - this._dbService.activateAnomalyCues(); - } - } - }); - } - private edgeWeightFn(edge) { - if (this.isConsiderOriginalEdges && edge.hasClass(COLLAPSED_EDGE_CLASS)) { - return edge.data('collapsedEdges').length; - } - return 1; - } - - degreeCentrality() { - const elems = this._g.cy.nodes(this.cySelector); - for (let i = 0; i < elems.length; i++) { - const e = elems[i]; - const r = this._g.cy.$(this.cySelector).degreeCentrality({ root: e, directed: this.isDirectedGraph, alpha: 1, weight: this.edgeWeightFn.bind(this) }); - const badges = []; - if (this.isDirectedGraph) { - badges.push(r.indegree); - badges.push(r.outdegree); - } else { - badges.push(r.degree); - } - this.generateBadge4Elem(e, badges); - } - } - - degreeCentralityNormalized() { - let elems = this._g.cy.nodes(this.cySelector); - let r = this._g.cy.$(this.cySelector).degreeCentralityNormalized({ directed: this.isDirectedGraph, alpha: 1, weight: this.edgeWeightFn.bind(this) }); - for (let i = 0; i < elems.length; i++) { - let badges = []; - let e = elems[i]; - if (this.isDirectedGraph) { - badges.push(r.indegree(e)); - badges.push(r.outdegree(e)); - } else { - badges.push(r.degree(e)); - } - this.generateBadge4Elem(e, badges); - } - } - - interGroupDegreeCentrality() { - const elems = this._g.cy.nodes(this.cySelector); - for (let i = 0; i < elems.length; i++) { - const e = elems[i]; - const r = this.calcuateInterGroupDegree(e); - const badges = []; - if (this.isDirectedGraph) { - badges.push(r.indegree); - badges.push(r.outdegree); - } else { - badges.push(r.degree); - } - this.generateBadge4Elem(e, badges); - } - } - - interGroupDegreeCentralityNormalized() { - const elems = this._g.cy.nodes(this.cySelector); - const allBadges = []; - let maxD = -1, maxIn = -1, maxOut = -1; - - for (let i = 0; i < elems.length; i++) { - const e = elems[i]; - const r = this.calcuateInterGroupDegree(e); - const badges = []; - if (this.isDirectedGraph) { - badges.push(r.indegree); - if (r.indegree > maxIn) { - maxIn = r.indegree; - } - badges.push(r.outdegree); - if (r.outdegree > maxOut) { - maxOut = r.outdegree; - } - } else { - if (r.degree > maxD) { - maxD = r.degree; - } - badges.push(r.degree); - } - allBadges.push(badges); - } - if (maxD == 0) { - maxD = 1; - } - if (maxIn == 0) { - maxIn = 1; - } - if (maxOut == 0) { - maxOut = 1; - } - - for (let i = 0; i < elems.length; i++) { - const e = elems[i]; - const badges = allBadges[i]; - if (this.isDirectedGraph) { - badges[0] /= maxIn; - badges[1] /= maxOut; - } else { - badges[0] /= maxD; - } - this.generateBadge4Elem(e, badges); - } - } - - private calcuateInterGroupDegree(e) { - if (!e.parent()) { - if (this.isDirectedGraph) { - return { degree: 0 }; - } - return { indegree: 0, outdegree: 0 }; - } - - const myParent = e.parent(); - const myParentId = myParent.id(); - const subgraph = this._g.cy.$(this.cySelector); - - let outDegree = 0; - const outgoers = e.outgoers('edge'); - for (let i = 0; i < outgoers.length; i++) { - const tgt = outgoers[i].target(); - if (subgraph.contains(tgt) && tgt.parent().id() != myParentId) { - outDegree += this.edgeWeightFn(outgoers[i]); - } - } - - let inDegree = 0; - const incomers = e.incomers('edge'); - for (let i = 0; i < incomers.length; i++) { - const src = incomers[i].source(); - if (subgraph.contains(src) && src.parent().id() != myParentId) { - inDegree += this.edgeWeightFn(incomers[i]); - } - } - - if (this.isDirectedGraph) { - return { indegree: inDegree, outdegree: outDegree }; - } - return { degree: inDegree + outDegree }; - } - - closenessCentrality() { - let elems = this._g.cy.nodes(this.cySelector); - for (let i = 0; i < elems.length; i++) { - let e = elems[i]; - let r = this._g.cy.$(this.cySelector).closenessCentrality({ root: e, directed: this.isDirectedGraph, weight: this.edgeWeightFn.bind(this) }); - let badges = [r]; - this.generateBadge4Elem(e, badges); - } - } - - closenessCentralityNormalized() { - let elems = this._g.cy.nodes(this.cySelector); - let r = this._g.cy.$(this.cySelector).closenessCentralityNormalized({ directed: this.isDirectedGraph, weight: this.edgeWeightFn.bind(this) }); - for (let i = 0; i < elems.length; i++) { - let badges = [r.closeness(elems[i])]; - this.generateBadge4Elem(elems[i], badges); - } - } - - betweennessCentrality() { - let elems = this._g.cy.nodes(this.cySelector); - let r = this._g.cy.$(this.cySelector).betweennessCentrality({ directed: this.isDirectedGraph, weight: this.edgeWeightFn.bind(this) }); - for (let i = 0; i < elems.length; i++) { - let badges = [r.betweenness(elems[i])]; - this.generateBadge4Elem(elems[i], badges); - } - } - - betweennessCentralityNormalized() { - let elems = this._g.cy.nodes(this.cySelector); - let r = this._g.cy.$(this.cySelector).betweennessCentrality({ directed: this.isDirectedGraph, weight: this.edgeWeightFn.bind(this) }); - for (let i = 0; i < elems.length; i++) { - let badges = [r.betweennessNormalized(elems[i])]; - this.generateBadge4Elem(elems[i], badges); - } - } - - pageRank() { - let elems = this._g.cy.nodes(this.cySelector); - let r = this._g.cy.$(this.cySelector).pageRank(); - for (let i = 0; i < elems.length; i++) { - let badges = [r.rank(elems[i])]; - this.generateBadge4Elem(elems[i], badges); - } - } - lineOfCode (){ - let elems = this._g.cy.nodes(this.cySelector); - let elemsPr = []; - let prs=[]; - for (let i = 0; i < elems.length; i++) { - if ([...elems[i]._private.classes][0] =="PullRequest"){ - elemsPr.push(elems[i]) - } - } - for (let i = 0; i < elemsPr.length; i++) { - let badges = [0]; - if ([...elemsPr[i]._private.classes][0] =="PullRequest"){ - badges = [elemsPr[i]._private.data.changeLineOfCode ]; - this.generateBadge4Elem(elemsPr[i], badges, 3); - } - - } - } - knowAboutScore (elems, scores: number []){ - for (let i = 0; i < elems.length; i++) { - let badges = [0]; - badges = [scores[i]]; - this.generateBadge4Elem(elems[i], badges); - - - } - } - - generateBadge4Elem(e, badges: number[], ratio:number=1) { - const div = document.createElement('div'); - div.innerHTML = this.getHtml(badges); - div.style.position = 'absolute'; - div.style.top = '0px'; - div.style.left = '0px'; - document.getElementById('cy').appendChild(div); - if (this.isMapNodeSizes || this.isMapBadgeSizes) { - let sum = 0; - for (let i = 0; i < badges.length; i++) { - sum += badges[i]; - } - e.data('__graphTheoreticProp',Math.pow( sum / badges.length, 1 / ratio)); - } - if (this.isMapNodeSizes) { - e.removeClass('graphTheoreticDisplay'); - e.addClass('graphTheoreticDisplay'); - } - - const positionHandlerFn = debounce2( - () => { - this.setBadgeCoords(e, div); - this.setBadgeCoordsOfChildren(e); - }, - this.UPDATE_POPPER_WAIT, - () => { - this.showHideBadge(false, div); - }).bind(this); - const styleHandlerFn = debounce(() => { this.setBadgeVisibility(e, div); }, this.UPDATE_POPPER_WAIT * 2).bind(this); - e.on('position', positionHandlerFn); - e.on('style', styleHandlerFn); - this._g.cy.on('pan zoom resize', positionHandlerFn); - this.poppedData.push({ popper: div, elem: e, fn: positionHandlerFn, fn2: styleHandlerFn }); - } - - private setBadgeCoords(e, div: HTMLDivElement) { - // let the nodes resize first - setTimeout(() => { - let ratio = 1; - if (this.isMapBadgeSizes) { - let b = this.currNodeSize + 20; - let a = Math.max(5, this.currNodeSize - 20); - let x = e.data('__graphTheoreticProp'); - ratio = ((b - a) * x / this.maxPropValue + a) / this.currNodeSize; - } else { - ratio = this.currNodeSize / this.NODE_SIZE; - } - ratio = ratio < this.ZOOM_THRESHOLD ? this.ZOOM_THRESHOLD : ratio; - - let z1 = this._g.cy.zoom() / 2 * ratio; - const bb = e.renderedBoundingBox({ includeLabels: false, includeOverlays: false }); - const w = div.clientWidth; - const h = div.clientHeight; - const deltaW4Scale = (1 - z1) * w / 2; - const deltaH4Scale = (1 - z1) * h / 2; - div.style.transform = `translate(${bb.x2 - deltaW4Scale - w * z1}px, ${bb.y1 - deltaH4Scale}px) scale(${z1})`; - this.showHideBadge(e.visible(), div); - }, 0); - } - - private setBadgeCoordsOfChildren(e) { - const elems = e.children(); - for (let i = 0; i < elems.length; i++) { - const child = elems[i]; - if (child.isParent()) { - this.setBadgeCoordsOfChildren(child); - } else { - const idx = this.poppedData.findIndex(x => x.elem.id() == child.id()); - if (idx > -1) { - this.setBadgeCoords(this.poppedData[idx].elem, this.poppedData[idx].popper); - } - } - } - } - - private setBadgeVisibility(e, div: HTMLDivElement) { - if (!e.visible()) { - div.style.opacity = '0'; - } - } - - destroyCurrentPoppers() { - console.log("s3sss") - let size = this.poppedData.length; - for (let i = 0; i < size; i++) { - this.destroyPopper('', 0); - } - } - - destroyPopper(id: string, i: number = -1) { - - if (i < 0) { - i = this.poppedData.findIndex(x => x.elem.id() == id); - if (i < 0) { - return; - } - } - this.poppedData[i].popper.remove(); - // unbind previously bound functions - if (this.poppedData[i].fn) { - this.poppedData[i].elem.off('position', this.poppedData[i].fn); - this.poppedData[i].elem.off('style', this.poppedData[i].fn2); - this._g.cy.off('pan zoom resize', this.poppedData[i].fn); - } - this.poppedData[i].elem.removeClass('graphTheoreticDisplay'); - this.poppedData[i].elem.data('__graphTheoreticProp', undefined); - this.poppedData.splice(i, 1); - } - - getHtml(badges: number[]): string { - let s = ''; - for (let i = 0; i < badges.length; i++) { - s += `${formatNumber(badges[i], 'en', '1.0-2')}` - } - return s; - } - - showHideBadges(isShow: boolean) { - let z = this._g.cy.zoom(); - if (z <= this.ZOOM_THRESHOLD) { - isShow = false; - } - let css = '0'; - if (isShow) { - css = '1'; - } - for (let i = 0; i < this.poppedData.length; i++) { - this.poppedData[i].popper.style.opacity = css; - } - } - - showHideBadge(isShow: boolean, div: HTMLDivElement) { - let z = this._g.cy.zoom(); - if (z <= this.ZOOM_THRESHOLD) { - isShow = false; - } - let css = '0'; - if (isShow) { - css = '1'; - } - div.style.opacity = css; - } - - setBadgeColorsAndCoords() { - for (let i = 0; i < this.poppedData.length; i++) { - let c = mapColor(this.badgeColor, this.maxPropValue, this.poppedData[i].elem.data('__graphTheoreticProp')); - for (let j = 0; j < this.poppedData[i].popper.children.length; j++) { - (this.poppedData[i].popper.children[j] as HTMLSpanElement).style.background = c; - } - this.setBadgeCoords(this.poppedData[i].elem, this.poppedData[i].popper); - } - } - - colorSelected(s: string) { - this.badgeColor = s; - } - - avgNodeSizeChanged() { - if (this.currNodeSize < 5) { - this.currNodeSize = 5; - } - } - -} diff --git a/src/app/visuall/operation-tabs/map-tab/group-tab/group-tab.component.css b/src/app/visuall/operation-tabs/map-tab/group-tab/group-tab.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/operation-tabs/map-tab/group-tab/group-tab.component.html b/src/app/visuall/operation-tabs/map-tab/group-tab/group-tab.component.html deleted file mode 100644 index 35dc91f2..00000000 --- a/src/app/visuall/operation-tabs/map-tab/group-tab/group-tab.component.html +++ /dev/null @@ -1,8 +0,0 @@ -
- - -
-
- -
\ No newline at end of file diff --git a/src/app/visuall/operation-tabs/map-tab/group-tab/group-tab.component.ts b/src/app/visuall/operation-tabs/map-tab/group-tab/group-tab.component.ts deleted file mode 100644 index 1ced2592..00000000 --- a/src/app/visuall/operation-tabs/map-tab/group-tab/group-tab.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { CytoscapeService } from '../../../cytoscape.service'; -import { areSetsEqual } from '../../../constants'; -import { GlobalVariableService } from '../../../global-variable.service'; -import { GroupCustomizationService } from '../../../../custom/customization-service/group-customization.service'; -@Component({ - selector: 'app-group-tab', - templateUrl: './group-tab.component.html', - styleUrls: ['./group-tab.component.css'] -}) -export class GroupTabComponent implements OnInit { - options: { name: string, fn: any }[]; - selectedOption: string; - prevGraph: Set; - currGraph: Set; - - constructor(private _cyService: CytoscapeService, private _g: GlobalVariableService, private _customizationService: GroupCustomizationService) { } - - ngOnInit() { - this.options = [{ name: 'None', fn: null }, - { name: 'By the Louvain modularity algorithm', fn: () => { this._cyService.louvainClustering(); } }, - { name: 'By the Markov clustering algorithm', fn: () => { this._cyService.markovClustering(); } }, - ].concat(this._customizationService.clusteringMethods) - - this.selectedOption = this.options[0].name; - } - - optionChanged() { - const idx = this.options.findIndex((x) => x.name == this.selectedOption); - this._cyService.expandAllCompounds(); - this._cyService.deleteClusteringNodes(); - if (idx > -1 && this.options[idx].fn) { - this.options[idx].fn(); - } - this._g.performLayout(false); - this.setGraphState(); - } - - setGraphState() { - this.prevGraph = this.currGraph; - this.currGraph = this._g.getGraphElemSet(); - } - - public componentOpened() { - this.setGraphState(); - // set radio to None because graph has changed - if (!areSetsEqual(this.prevGraph, this.currGraph)) { - this.selectedOption = this.options[0].name; - } - } -} diff --git a/src/app/visuall/operation-tabs/map-tab/map-tab.component.css b/src/app/visuall/operation-tabs/map-tab/map-tab.component.css deleted file mode 100644 index 32466f2d..00000000 --- a/src/app/visuall/operation-tabs/map-tab/map-tab.component.css +++ /dev/null @@ -1,4 +0,0 @@ -img { - width: 16px; - height: 16px; -} \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/map-tab/map-tab.component.html b/src/app/visuall/operation-tabs/map-tab/map-tab.component.html deleted file mode 100644 index 266ef4c3..00000000 --- a/src/app/visuall/operation-tabs/map-tab/map-tab.component.html +++ /dev/null @@ -1,125 +0,0 @@ -
-
-
- Filter by Node/Edge Type -
-
- -
-
- -
- -
- -
- -
-
- {{r.name}}  - -
-
-
-
- new  -
-
-
- -
- - -
- -
- - Get {{selectedClass}} where:  - - - -
- -
- - - -
- - -
-
- -
- -
-
- - -
-
- - -
-
- - -
-
- -
- - -
- -
- - -
-
- -
- - -
- -
-
- -
- - -
- -
-
- - - -
\ No newline at end of file diff --git a/src/app/visuall/operation-tabs/map-tab/map-tab.component.ts b/src/app/visuall/operation-tabs/map-tab/map-tab.component.ts deleted file mode 100644 index d22bf54a..00000000 --- a/src/app/visuall/operation-tabs/map-tab/map-tab.component.ts +++ /dev/null @@ -1,812 +0,0 @@ -import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core"; -import { - GENERIC_TYPE, - COLLAPSED_EDGE_CLASS, - CLUSTER_CLASS, -} from "../../constants"; -import { DbAdapterService } from "../../db-service/db-adapter.service"; -import { CytoscapeService } from "../../cytoscape.service"; -import { GlobalVariableService } from "../../global-variable.service"; -import { TimebarService } from "../../timebar.service"; -import { - ClassOption, - Rule, - RuleSync, - QueryRule, - ClassBasedRules, - RuleNode, - getBoolExpressionFromMetric, - deepCopyRuleNode, -} from "./query-types"; -import { Subject, Subscription } from "rxjs"; -import { - TableViewInput, - TableData, - TableDataType, - TableFiltering, - TableRowMeta, - property2TableData, -} from "../../../shared/table-view/table-view-types"; -import { - DbResponse, - DbResponseType, - GraphResponse, - HistoryMetaData, -} from "../../db-service/data-types"; -import { GroupTabComponent } from "./group-tab/group-tab.component"; -import { MergedElemIndicatorTypes } from "../../user-preference"; -import { UserProfileService } from "../../user-profile.service"; -import { CustomizationModule } from "src/app/custom/customization.module"; - -@Component({ - selector: "app-map-tab", - templateUrl: "./map-tab.component.html", - styleUrls: ["./map-tab.component.css"], -}) -export class MapTabComponent implements OnInit, OnDestroy { - classOptions: ClassOption[]; - selectedClassProps: string[]; - selectedClass: string; - attributeType: string; - isDateProp: boolean; - currDatetimes: Date[]; - queryRule: ClassBasedRules; - currRuleNode: RuleNode; - editedRuleNode: Subject = new Subject(); - isQueryOnDb: boolean; - currProperties: Subject = new Subject(); - editingPropertyRule: Rule; - tableInput: TableViewInput = { - columns: [], - tableTitle: "Query Results", - results: [], - results2: [], - resultCnt: 0, - currPage: 1, - pageSize: 0, - isShowExportAsCSV: true, - isEmphasizeOnHover: true, - isLoadGraph: false, - isMergeGraph: true, - isNodeData: true, - isReplace_inHeaders: true, - }; - tableFilled = new Subject(); - isClassTypeLocked: boolean; - private isGroupTabOpen = false; - @ViewChild(GroupTabComponent, { static: false }) - private groupComponent: GroupTabComponent; - currRules: QueryRule[] = []; - isAddingNewRule = false; - changeBtnTxt = "Update"; - currRuleName = "New rule"; - isShowPropertyRule = true; - customSubTabs: { component: any; text: string }[] = - CustomizationModule.mapSubTabs; - loadFromFileSubs: Subscription; - dataPageSizeSubs: Subscription; - appDescSubs: Subscription; - dataModelSubs: Subscription; - dbResponse: DbResponse = null; - clearTableFilter = new Subject(); - - constructor( - private _cyService: CytoscapeService, - private _g: GlobalVariableService, - private _dbService: DbAdapterService, - private _timebarService: TimebarService, - private _profile: UserProfileService - ) { - this.isQueryOnDb = true; - this.tableInput.isMergeGraph = true; - this.classOptions = []; - this.selectedClassProps = []; - this.isDateProp = false; - this.currDatetimes = [new Date()]; - this.loadFromFileSubs = this._profile.onLoadFromFile.subscribe((x) => { - if (!x) { - return; - } - this.setCurrRulesFromLocalStorage(); - }); - } - - ngOnInit() { - this.dataPageSizeSubs = this._g.userPrefs.dataPageSize.subscribe((x) => { - this.tableInput.pageSize = x; - }); - - this.appDescSubs = this._g.appDescription.subscribe((x) => { - if (x === null) { - return; - } - this.dataModelSubs = this._g.dataModel.subscribe((x2) => { - if (x2 === null) { - return; - } - for (const key in x2.nodes) { - this.classOptions.push({ text: key, isDisabled: false }); - if (this.selectedClassProps.length == 0) { - this.selectedClassProps = Object.keys(x2.nodes[key]); - } - } - - for (const key in x2.edges) { - this.classOptions.push({ text: key, isDisabled: false }); - } - - this.setCurrRulesFromLocalStorage(); - let i = this.getEditingRuleIdx(); - if (i > -1) { - this.currRules[i].isEditing = false; // simulate click - this.editRule(i); - } else { - this.newRuleClick(); - } - }); - }); - } - - ngOnDestroy(): void { - if (this.loadFromFileSubs) { - this.loadFromFileSubs.unsubscribe(); - } - if (this.dataPageSizeSubs) { - this.dataPageSizeSubs.unsubscribe(); - } - if (this.appDescSubs) { - this.appDescSubs.unsubscribe(); - } - if (this.dataModelSubs) { - this.dataModelSubs.unsubscribe(); - } - } - - private setCurrRulesFromLocalStorage() { - if (this._profile.isStoreProfile()) { - let storedRules = this._profile.getQueryRules(); - for (const m of storedRules) { - this._profile.addParents(m.rules.rules); - } - this.currRules = storedRules; - } - } - - changeSelectedClass() { - const txt = this.selectedClass; - const properties = this._g.dataModel.getValue(); - let isNodeClassSelected: boolean = properties.nodes.hasOwnProperty(txt); - let isEdgeClassSelected: boolean = properties.edges.hasOwnProperty(txt); - this.selectedClassProps.length = 0; - this.selectedClassProps.push(GENERIC_TYPE.NOT_SELECTED); - let isGeneric = false; - if (isNodeClassSelected) { - this.selectedClassProps.push(...Object.keys(properties.nodes[txt])); - this.selectedClassProps.push(...this.getEdgeTypesRelated(txt)); - isGeneric = false; - } else if (isEdgeClassSelected) { - this.selectedClassProps.push(...Object.keys(properties.edges[txt])); - isGeneric = false; - } else { - isGeneric = true; - } - // update query rule if it exists - if (this.queryRule) { - this.queryRule.className = this.selectedClass; - this.queryRule.isEdge = isEdgeClassSelected; - } - - setTimeout(() => { - this.currProperties.next({ - properties: this.selectedClassProps, - isGenericTypeSelected: isGeneric, - selectedClass: this.selectedClass, - }); - }, 0); - } - - private getEdgeTypesRelated(nodeType: string): string[] { - let r: string[] = []; - const a = this._g.appDescription.getValue(); - const txt = this.selectedClass.toLowerCase(); - for (let k of Object.keys(a.relations)) { - const v = a.relations[k]; - if (v.source.toLowerCase() == txt || v.target.toLowerCase() == txt) { - r.push(k); - } - } - return r; - } - - initRules(s: "AND" | "OR" | "C") { - this.editingPropertyRule = null; - const properties = this._g.dataModel.getValue(); - const isEdge = properties.edges[this.selectedClass] != undefined; - if (s == "AND" || s == "OR") { - this.queryRule = { - className: this.selectedClass, - isEdge: isEdge, - rules: { r: { ruleOperator: s }, children: [], parent: null }, - }; - } else if (s == "C") { - this.queryRule = { - className: this.selectedClass, - isEdge: isEdge, - rules: { r: null, children: [], parent: null }, - }; - } - this.currRuleNode = this.queryRule.rules; - this.changeSelectedClass(); - } - - addRule2QueryRules(r: Rule) { - if (r.propertyType == "datetime") { - r.inputOperand = new Date(r.rawInput).toLocaleString(); - } - - if (this.currRuleNode.r) { - if (this.currRuleNode.isEditing) { - this.currRuleNode.r = r; - this.editedRuleNode.next(this.currRuleNode); - } else { - this.currRuleNode.children.push({ - r: r, - children: [], - parent: this.currRuleNode, - }); - } - } else { - // if "Condition" is clicked at the start - this.currRuleNode.r = r; - } - this.isClassTypeLocked = true; - this.isShowPropertyRule = r.ruleOperator !== null; - } - - showPropertyRule(e: { node: RuleNode; isEdit: boolean }) { - this.currRuleNode = e.node; - // means edit is clicked in rule tree - if (!e.isEdit) { - this.isShowPropertyRule = true; - this.changeSelectedClass(); - return; - } - this.isShowPropertyRule = false; - // let the UI for property rule re-rendered - setTimeout(() => { - this.isShowPropertyRule = e.node.isEditing; - this.changeSelectedClass(); - if (e.node.isEditing) { - this.editingPropertyRule = e.node.r; - } else { - this.editingPropertyRule = null; - } - }); - } - - newOperator(e: RuleNode) { - this.isShowPropertyRule = true; - this.currRuleNode = e; - } - - queryRuleDeleted() { - this.isClassTypeLocked = false; - this.queryRule.rules = null; - this.isShowPropertyRule = true; - } - - runQueryOnClient(cb: (s: number, end: number) => void, cbParams: any[]) { - const fnStr2 = - getBoolExpressionFromMetric(this.queryRule) + - " return true; return false;"; - - const filterFn = new Function("x", fnStr2); - let satisfyingElems = this._g.cy.filter(filterFn); - satisfyingElems = satisfyingElems.union( - this._g.filterRemovedElems(filterFn) - ); - const newElemIndicator = this._g.userPrefs.mergedElemIndicator.getValue(); - if ( - newElemIndicator == MergedElemIndicatorTypes.highlight || - newElemIndicator == MergedElemIndicatorTypes.none - ) { - this._g.highlightElems(satisfyingElems); - } else if (newElemIndicator == MergedElemIndicatorTypes.selection) { - this._g.isSwitch2ObjTabOnSelect = false; - satisfyingElems.select(); - this._g.isSwitch2ObjTabOnSelect = true; - } - this._g.applyClassFiltering(); - cb.apply(this, cbParams); - } - - runQueryOnDatabase(cb: (s: number, end: number) => void, cbParams: any[]) { - if (!this.queryRule || Object.keys(this.queryRule).length === 0) { - this._g.showErrorModal("Query", "There is no query!"); - return; - } - - const isClientSidePagination = - this._g.userPrefs.queryResultPagination.getValue() == "Client"; - const skip = (this.tableInput.currPage - 1) * this.tableInput.pageSize; - const limit4clientSidePaginated = - this._g.userPrefs.dataPageSize.getValue() * - this._g.userPrefs.dataPageLimit.getValue(); - const limit = isClientSidePagination - ? limit4clientSidePaginated - : this.tableInput.pageSize; - const isMerge = - this.tableInput.isMergeGraph && this._g.cy.elements().length > 0; - this.tableInput.currPage = 1; - this.clearTableFilter.next(true); - const cb2 = (x: DbResponse) => { - this.dbResponse = x; - const clientSideX = this.filterDbResponse(x, { - orderBy: "", - orderDirection: "", - txt: "", - }); - if (isClientSidePagination) { - this.fillTable(clientSideX.tableData); - } else { - this.fillTable(x.tableData); - } - - if (this.tableInput.isLoadGraph) { - if (isClientSidePagination) { - this._cyService.loadElementsFromDatabase( - clientSideX.graphData, - isMerge - ); - } else { - this._cyService.loadElementsFromDatabase(x.graphData, isMerge); - } - } - cb.apply(this, cbParams); - if (isClientSidePagination) { - this.tableInput.resultCnt = Math.min( - x.count, - limit4clientSidePaginated - ); - } else { - this.tableInput.resultCnt = x.count; - } - }; - this._dbService.getFilteringResult( - this.queryRule, - null, - skip, - limit, - DbResponseType.table, - cb2 - ); - } - - // used for client-side filtering, assumes tableData and graphData arrays are parallel (index i corresponds to the same element) - private filterDbResponse(d: DbResponse, filter: TableFiltering): DbResponse { - const pageSize = this._g.userPrefs.dataPageSize.getValue(); - const pageLimit = this._g.userPrefs.dataPageLimit.getValue(); - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - const r: DbResponse = { - count: pageSize * pageLimit, - graphData: { nodes: [], edges: [] }, - tableData: { columns: d.tableData.columns, data: [] }, - }; - let tmpData: { graph: any; table: any }[] = []; - for (let i = 0; i < d.tableData.data.length; i++) { - const vals = Object.values(d.tableData.data[i][1]).join(""); - if ( - (isIgnoreCase && - vals.toLowerCase().includes(filter.txt.toLowerCase())) || - (!isIgnoreCase && vals.includes(filter.txt)) - ) { - if (this.queryRule.isEdge) { - tmpData.push({ - table: d.tableData.data[i], - graph: d.graphData.edges[i], - }); - } else { - tmpData.push({ - table: d.tableData.data[i], - graph: d.graphData.nodes[i], - }); - } - } - } - // order by - if (filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == "asc") { - tmpData = tmpData.sort((a, b) => { - if (a.table[1][o] > b.table[1][o]) return 1; - if (b.table[1][o] > a.table[1][o]) return -1; - return 0; - }); - } else { - tmpData = tmpData.sort((a, b) => { - if (a.table[1][o] < b.table[1][o]) return 1; - if (b.table[1][o] < a.table[1][o]) return -1; - return 0; - }); - } - } - const skip = filter.skip ? filter.skip : 0; - r.count = tmpData.length; - tmpData = tmpData.slice(skip, skip + pageSize); - r.tableData.data = tmpData.map((x) => x.table); - if (this.queryRule.isEdge) { - r.graphData.edges = tmpData.map((x) => x.graph); - for (let i = 0; i < r.graphData.edges.length; i++) { - const srcId = r.graphData.edges[i].startNodeElementId; - const tgtId = r.graphData.edges[i].endNodeElementId; - r.graphData.nodes.push(d.graphData.nodes.find((x) => x.elementId == srcId)); - r.graphData.nodes.push(d.graphData.nodes.find((x) => x.elementId == tgtId)); - } - } else { - r.graphData.nodes = tmpData.map((x) => x.graph); - } - return r; - } - - private fillTable(data) { - this.tableInput.results = []; - if (data.data[0] === undefined || data.data[0][1] === undefined) { - this.tableFilled.next(true); - return; - } - - this.tableInput.isNodeData = !this.queryRule.isEdge; - const properties = this._g.dataModel.getValue(); - if (this.tableInput.isNodeData) { - this.tableInput.columns = Object.keys( - properties["nodes"][this.selectedClass] - ); - } else { - this.tableInput.columns = Object.keys( - properties["edges"][this.selectedClass] - ); - } - - for (let i = 0; i < data.data.length; i++) { - if ( - data.data[i] === null || - data.data[i] === undefined || - data.data[i][0] === undefined || - data.data[i][0] === null - ) { - continue; - } - // first column is ID - let d: TableData[] = [ - { val: data.data[i][0], type: TableDataType.string }, - ]; - for (let [k, v] of Object.entries(data.data[i][1])) { - let idx = this.tableInput.columns.indexOf(k); - if (idx > -1) { - const enumMapping = this._g.getEnumMapping(); - d[idx + 1] = property2TableData( - properties, - enumMapping, - k, - v, - this.queryRule.className, - this.queryRule.isEdge - ); - } - } - for (let j = 0; j < this.tableInput.columns.length + 1; j++) { - if (!d[j]) { - d[j] = { val: "", type: TableDataType.string }; - } - } - this.tableInput.results.push(d); - } - this.tableFilled.next(true); - } - - maintainChartRange(s: number, e: number) { - if (this._g.userPrefs.timebar.isMaintainGraphRange.value) { - this._timebarService.setChartRange(s, e); - } - } - - runQuery() { - const arr = this._timebarService.getChartRange(); - if (this.isQueryOnDb) { - this.dbResponse = null; - this.runQueryOnDatabase(this.maintainChartRange, arr); - } else { - this.runQueryOnClient(this.maintainChartRange, arr); - } - } - - filterElesByClass(e: { className: string; willBeShowed: boolean }) { - if (e.willBeShowed) { - this._g.hiddenClasses.delete(e.className); - if (this._g.cy.$("." + e.className).length > 0) { - this._g.viewUtils.show(this._g.cy.$("." + e.className)); - } - } else { - this._g.hiddenClasses.add(e.className); - if (this._g.cy.$("." + e.className).length > 0) { - this._g.viewUtils.hide(this._g.cy.$("." + e.className)); - } - } - this.filter4Collapsed(e.className, e.willBeShowed); - this._g.shownElemsChanged.next(true); - this._g.performLayout(false); - } - - private filter4Collapsed(className: string, isShow: boolean) { - const classCSS = "." + className; - - // apply filter to collapsed nodes, if they are not collapsed it should be already applied - const clusterNodes = this._g.cy.nodes("." + CLUSTER_CLASS); - for (let i = 0; i < clusterNodes.length; i++) { - this.filter4CompoundNode(clusterNodes[i], classCSS, isShow); - } - - // apply filter to collapsed edges, if they are not collapsed it should be already applied - const compoundEdges = this._g.cy.edges("." + COLLAPSED_EDGE_CLASS); - for (let i = 0; i < compoundEdges.length; i++) { - this.filter4CompoundEdge(compoundEdges[i], classCSS, isShow); - } - this._g.handleCompoundsOnHideDelete(); - } - - private filter4CompoundNode(node, classCSS: string, isShow: boolean) { - let children = node.children(); // a node might have children - const collapsed = node.data("collapsedChildren"); // a node might a collapsed - if (collapsed) { - children = children.union(collapsed); - } - for (let i = 0; i < children.length; i++) { - if (isShow) { - this._g.viewUtils.show(children[i].filter(classCSS)); - } else { - this._g.viewUtils.hide(children[i].filter(classCSS)); - } - } - // recursively apply for complex children - const compoundNodes = children.filter("." + CLUSTER_CLASS); - for (let i = 0; i < compoundNodes.length; i++) { - this.filter4CompoundNode(compoundNodes[i], classCSS, isShow); - } - // a compound node might also have compound edges - const compoundEdges = children.filter("." + COLLAPSED_EDGE_CLASS); - for (let i = 0; i < compoundEdges.length; i++) { - this.filter4CompoundEdge(compoundEdges[i], classCSS, isShow); - } - } - - private filter4CompoundEdge(edge, classCSS: string, isShow: boolean) { - const children = edge.data("collapsedEdges"); // a node might have children - for (let i = 0; i < children.length; i++) { - if (isShow) { - this._g.viewUtils.show(children[i].filter(classCSS)); - } else { - this._g.viewUtils.hide(children[i].filter(classCSS)); - } - } - // recursively apply for complex children - const complexes = children.filter("." + COLLAPSED_EDGE_CLASS); - for (let i = 0; i < complexes.length; i++) { - this.filter4CompoundEdge(complexes[i], classCSS, isShow); - } - } - - getDataForQueryResult(e: TableRowMeta) { - let fn = (x) => { - this._cyService.loadElementsFromDatabase(x, this.tableInput.isMergeGraph); - }; - let historyMeta: HistoryMetaData = { - customTxt: "Loaded from table: ", - isNode: !this.queryRule.isEdge, - labels: e.tableIdx.join(","), - }; - if ( - this._g.userPrefs.queryResultPagination.getValue() == "Client" && - this.dbResponse - ) { - const isMerge = - this.tableInput.isMergeGraph && this._g.cy.elements().length > 0; - let r: GraphResponse = { - nodes: this.dbResponse.graphData.nodes.filter( - (x) => e.dbIds.findIndex((a) => a == x.elementId) > -1 - ), - edges: [], - }; - if (this.queryRule.isEdge) { - const edges = this.dbResponse.graphData.edges.filter( - (x) => e.dbIds.findIndex((a) => a == x.elementId) > -1 - ); - const nodes = []; - for (let i = 0; i < edges.length; i++) { - const n1 = this.dbResponse.graphData.nodes.find( - (x) => x.elementId == edges[i].startNodeElementId - ); - const n2 = this.dbResponse.graphData.nodes.find( - (x) => x.elementId == edges[i].endNodeElementId - ); - nodes.push(n1, n2); - } - r = { edges: edges, nodes: nodes }; - } - this._cyService.loadElementsFromDatabase(r, isMerge); - } else { - this._dbService.getElems( - e.dbIds, - fn, - { isEdgeQuery: this.queryRule.isEdge }, - historyMeta - ); - } - } - - resetRule() { - this.queryRule = null; - this.tableInput = { - columns: [], - tableTitle: "Query Results", - results: [], - results2: [], - resultCnt: 0, - currPage: 1, - pageSize: this.tableInput.pageSize, - isShowExportAsCSV: true, - isEmphasizeOnHover: true, - isLoadGraph: false, - isMergeGraph: true, - isNodeData: true, - isReplace_inHeaders: true, - }; - this.isClassTypeLocked = false; - this.selectedClass = this.classOptions[0].text; - this.changeSelectedClass(); - } - - groupTabCliked() { - this.isGroupTabOpen = !this.isGroupTabOpen; - if (this.isGroupTabOpen) { - this.groupComponent.componentOpened(); - } - } - - filterTable(filter: TableFiltering) { - const cb2 = (x: DbResponse) => { - const isMerge = - this.tableInput.isMergeGraph && this._g.cy.elements().length > 0; - this.fillTable(x.tableData); - if (this.tableInput.isLoadGraph) { - this._cyService.loadElementsFromDatabase( - x.graphData as GraphResponse, - isMerge - ); - } - this.tableInput.resultCnt = x.count; - }; - this.tableInput.currPage = 1; - if (this._g.userPrefs.queryResultPagination.getValue() == "Client") { - cb2(this.filterDbResponse(this.dbResponse, filter)); - } else { - const limit = this.tableInput.pageSize; - let skip = filter.skip ? filter.skip : 0; - this._dbService.getFilteringResult( - this.queryRule, - filter, - skip, - limit, - DbResponseType.table, - cb2 - ); - } - } - - editRule(i: number) { - let curr = this.currRules[i]; - this.isShowPropertyRule = false; - if (curr.isEditing) { - return; - } - this.isAddingNewRule = false; - this.changeBtnTxt = "Update"; - this.resetRule(); - this.resetEditingRules(); - curr.isEditing = true; - // this.queryRule2 = { className: curr.rules.className, isEdge: curr.rules.isEdge, rules: deepCopyRuleNode(curr.rules.rules) }; - this.queryRule = curr.rules; - this.currRuleName = curr.name; - this.isQueryOnDb = curr.isOnDb; - this.tableInput.isMergeGraph = curr.isMergeGraph; - this.tableInput.isLoadGraph = curr.isLoadGraph; - this.selectedClass = this.queryRule.className; - this.changeSelectedClass(); - this.isClassTypeLocked = true; - } - - resetEditingRules() { - for (let i = 0; i < this.currRules.length; i++) { - this.currRules[i].isEditing = false; - this.clearAllEditings(this.currRules[i].rules.rules); - } - } - - clearAllEditings(r: RuleNode) { - if (r === undefined || r === null) { - return; - } - r.isEditing = false; - for (const child of r.children) { - this.clearAllEditings(child); - } - } - - deleteRule(i: number) { - this.currRules.splice(i, 1); - if (this.currRules.length < 1) { - this.newRuleClick(); - } - this._profile.saveQueryRules(this.currRules); - } - - newRuleClick() { - this.isAddingNewRule = true; - this.changeBtnTxt = "Add"; - this.currRuleName = "New rule"; - this.isShowPropertyRule = true; - this.resetEditingRules(); - this.resetRule(); - } - - private updateRule() { - let idx = this.getEditingRuleIdx(); - this.currRules[idx].rules = { - className: this.queryRule.className, - isEdge: this.queryRule.isEdge, - rules: deepCopyRuleNode(this.queryRule.rules), - }; - this.currRules[idx].name = this.currRuleName; - this.currRules[idx].isLoadGraph = this.tableInput.isLoadGraph; - this.currRules[idx].isMergeGraph = this.tableInput.isMergeGraph; - this.currRules[idx].isOnDb = this.isQueryOnDb; - } - - private getEditingRuleIdx(): number { - for (let i = 0; i < this.currRules.length; i++) { - if (this.currRules[i].isEditing) { - return i; - } - } - return -1; - } - - private addRule() { - if (this.queryRule == null || this.queryRule == undefined) { - return; - } - this.resetEditingRules(); - this.currRules.push({ - rules: { - className: this.queryRule.className, - isEdge: this.queryRule.isEdge, - rules: deepCopyRuleNode(this.queryRule.rules), - }, - name: this.currRuleName, - isEditing: true, - isOnDb: this.isQueryOnDb, - isLoadGraph: this.tableInput.isLoadGraph, - isMergeGraph: this.tableInput.isMergeGraph, - }); - this.isAddingNewRule = false; - this.changeBtnTxt = "Update"; - } - - addOrUpdateRule() { - if (this.isAddingNewRule) { - this.addRule(); - } else { - this.updateRule(); - } - this._profile.saveQueryRules(this.currRules); - } -} diff --git a/src/app/visuall/operation-tabs/map-tab/query-types.ts b/src/app/visuall/operation-tabs/map-tab/query-types.ts deleted file mode 100644 index 5442e00b..00000000 --- a/src/app/visuall/operation-tabs/map-tab/query-types.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { COLLAPSED_EDGE_CLASS, GENERIC_TYPE, NEO4J_2_JS_NUMBER_OPERATORS, NEO4J_2_JS_STR_OPERATORS } from '../../constants'; - -export interface QueryRule { - name: string; - rules: ClassBasedRules; - isEditing: boolean; - isOnDb: boolean; - isLoadGraph: boolean; - isMergeGraph: boolean; -} - -export interface ClassOption { - text: string; - isDisabled: boolean; -} - -export interface ClassBasedRules { - className: string; - rules: RuleNode; - isEdge: boolean; -} - -export interface RuleNode { - r: Rule; - children: RuleNode[]; - parent: RuleNode; - isEditing?: boolean; -} - -export function deepCopyRuleNode(root: RuleNode): RuleNode { - if (!root) { - return null; - } - const r: RuleNode = { r: root.r, children: [], parent: root.parent }; - for (const child of root.children) { - r.children.push(deepCopyRuleNode(child)); - } - return r; -} - -export function deepCopyQueryRule(m: QueryRule): QueryRule { - let r: RuleNode = deepCopyRuleNode(m.rules.rules); - let rules: ClassBasedRules = { className: m.rules.className, isEdge: m.rules.isEdge, rules: r }; - return { isEditing: m.isEditing, isLoadGraph: m.isLoadGraph, isMergeGraph: m.isMergeGraph, isOnDb: m.isOnDb, name: m.name, rules: rules }; -} - -export function deepCopyQueryRules(metrics: QueryRule[]): QueryRule[] { - let t2: QueryRule[] = []; - for (const m of metrics) { - t2.push(deepCopyQueryRule(m)); - } - return t2; -} - -export function deepCopyTimebarMetric(metric: TimebarMetric): TimebarMetric { - let r: RuleNode = deepCopyRuleNode(metric.rules); - return { className: metric.className, incrementFn: metric.incrementFn, name: metric.name, rules: r, color: metric.color, isEdge: metric.isEdge, isEditing: metric.isEditing }; -} - -export function deepCopyTimebarMetrics(metrics: TimebarMetric[]): TimebarMetric[] { - let t2: TimebarMetric[] = []; - for (const m of metrics) { - t2.push(deepCopyTimebarMetric(m)); - } - return t2; -} - -export enum PropertyCategory { - other = 0, date = 1, finiteSet = 2 -} - -export interface Rule { - propertyOperand?: string; - propertyType?: string; - operator?: string; - inputOperand?: string; - ruleOperator: 'AND' | 'OR' | null; - rawInput?: string; - enumMapping?: string; -} - -export interface RuleSync { - properties: string[]; - isGenericTypeSelected: boolean; - selectedClass: string; -} - -// 2 type of metric exists: sum or count. -// Sum: sums the property values of elements which satisfy the conditional expressions -// Count: counts the elements which satisfy the conditional expressions -export interface TimebarMetric { - incrementFn: (x: any) => number; - rules: RuleNode; - name: string; - className: string; - isEdge?: boolean; - isEditing?: boolean; - color?: string; -} - - -export interface TimebarUnitData { - isBegin: boolean; - d: number; - id: string; -} - -export interface TimebarItem { - start: number; - end: number; - cyElem: any; -} - -export function isSumRule(r: Rule): boolean { - return r && (!r.operator) && (r.propertyType == 'int' || r.propertyType == 'float' || r.propertyType == 'edge'); -} - -export function getBoolExpressionFromMetric(m: TimebarMetric | ClassBasedRules): string { - let classCondition = ''; - // apply class condition - if (m.className.toLowerCase() == GENERIC_TYPE.EDGES_CLASS.toLowerCase()) { - classCondition = ` x.isEdge() `; - } else if (m.className.toLowerCase() == GENERIC_TYPE.NODES_CLASS.toLowerCase()) { - classCondition = ` x.isNode() `; - } else if (m.className.toLowerCase() == GENERIC_TYPE.ANY_CLASS.toLowerCase()) { - classCondition = ` true `; - } else { - classCondition = ` x.classes().map(x => x.toLowerCase()).includes('${m.className.toLowerCase()}') `; - } - - const isAgg = m.rules.r && isSumRule(m.rules.r); - const propertyCondition = getBoolExpressionFromRuleNode(m.rules, isAgg); - - if (propertyCondition.length < 1) { - return `if (${classCondition})`; - } - return `if ( (${classCondition}) && (${propertyCondition}))`; -} - -function getBoolExpressionFromRuleNode(node: RuleNode, isAgg: boolean) { - let s = '('; - if (!isAgg && (!node.r || !node.r.ruleOperator)) { - if (!node.r || !node.r.propertyType) { - s += 'true'; - } else { - s += ' ' + getJsExpressionForMetricRule(node.r) + ' '; - } - } else { - for (let i = 0; i < node.children.length; i++) { - if (i != node.children.length - 1) { - let op = '&&'; - if (node.r.ruleOperator == 'OR') { - op = '||'; - } - s += ' ' + getBoolExpressionFromRuleNode(node.children[i], false) + ' ' + op; - } else { - s += ' ' + getBoolExpressionFromRuleNode(node.children[i], false) + ' '; - } - } - } - if (s == '(') { - return 'true'; - } - return s + ')'; -} - -function getJsExpressionForMetricRule(r: Rule) { - const collapsedEdges4Node = `x.connectedEdges('.${COLLAPSED_EDGE_CLASS}').map(x => x.data('collapsedEdges').filter('.${r.propertyOperand}')).reduce((x, y) => {return x.union(y)}, cy.collection())`; - if (r.operator == 'One of') { - let s = r.inputOperand; - s = s.replace(/'/g, ''); - if (r.propertyType == 'string') { - let arr = s.split(',').map(x => `'${x}'`); - s = arr.join(',') - } - if (r.propertyType == 'edge') { - return `[${s}].includes(x.connectedEdges('.${r.propertyOperand}').union(${collapsedEdges4Node}).length)`; - } - return `[${s}].includes(x.data('${r.propertyOperand}'))`; - } - if (r.propertyType == 'int' || r.propertyType == 'float' || r.propertyType == 'datetime' || r.propertyType == 'edge') { - let op = NEO4J_2_JS_NUMBER_OPERATORS[r.operator]; - if (r.propertyType == 'datetime') { - if (op && r.rawInput) { - return `x.data('${r.propertyOperand}') ${op} ${r.rawInput}`; - } - return `x.data('${r.propertyOperand}')`; - } - if (r.propertyType == 'edge') { - if (op && r.inputOperand) { - return `x.connectedEdges('.${r.propertyOperand}').union(${collapsedEdges4Node}).length ${op} ${r.inputOperand}`; - } - return `x.connectedEdges('.${r.propertyOperand}').union(${collapsedEdges4Node}).length`; - } - if (op && r.inputOperand) { - return `x.data('${r.propertyOperand}') ${op} ${r.inputOperand}`; - } - return `x.data('${r.propertyOperand}')`; - } - if (r.propertyType == 'string') { - if (r.operator === '=') { - return `x.data('${r.propertyOperand}') === '${r.inputOperand}'`; - } - let op = NEO4J_2_JS_STR_OPERATORS[r.operator]; - if (op && r.inputOperand) { - return `x.data('${r.propertyOperand}').${op}('${r.inputOperand}')`; - } - return `x.data('${r.propertyOperand}')`; - } - if (r.propertyType == 'list') { - if (r.inputOperand) { - return `x.data('${r.propertyOperand}').includes('${r.inputOperand}')`; - } - return `x.data('${r.propertyOperand}')`; - } - if (r.propertyType.startsWith('enum')) { - let op = NEO4J_2_JS_NUMBER_OPERATORS[r.operator]; - if (!op || !r.inputOperand) { - return `x.data('${r.propertyOperand}')`; - } - if (r.propertyType.endsWith('string')) { - return `x.data('${r.propertyOperand}') ${op} '${r.inputOperand}'`; - } else { - return `x.data('${r.propertyOperand}') ${op} ${r.inputOperand}`; - } - } -} - -function r2str(curr: Rule) { - let s = ''; - let inp = '' + curr.inputOperand; - if (curr.propertyType == 'string') { - inp = `"${inp}"`; - } - s += ` (${curr.propertyOperand} ${curr.operator} ${inp}) `; - return s; -} - -export function rule2str2(r: ClassBasedRules): string { - let s = `${r.className}`; - if (r.rules.children.length == 0 || !r.rules.children[0].r.propertyType) { - return s; - } - s += ' where ' + ruleNode2str(r.rules); - return s; -} - -function ruleNode2str(node: RuleNode) { - let s = '('; - if (!node.r || !node.r.ruleOperator) { - s += ' ' + r2str(node.r) + ' '; - } else { - for (let i = 0; i < node.children.length; i++) { - if (i != node.children.length - 1) { - let op = '&&'; - if (node.r.ruleOperator == 'OR') { - op = '||'; - } - s += ' ' + ruleNode2str(node.children[i]) + ' ' + op; - } else { - s += ' ' + ruleNode2str(node.children[i]) + ' '; - } - } - } - - return s + ')'; -} \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/object-tab/object-tab.component.css b/src/app/visuall/operation-tabs/object-tab/object-tab.component.css deleted file mode 100644 index 1bc0a6ea..00000000 --- a/src/app/visuall/operation-tabs/object-tab/object-tab.component.css +++ /dev/null @@ -1,10 +0,0 @@ -table { - margin-bottom: 0px; -} - -td { - padding-right: 0.3rem; - padding-left: 0.3rem; - padding-top: 0.1rem; - padding-bottom: 0.1rem; -} \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/object-tab/object-tab.component.html b/src/app/visuall/operation-tabs/object-tab/object-tab.component.html deleted file mode 100644 index 04f70d25..00000000 --- a/src/app/visuall/operation-tabs/object-tab/object-tab.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
-
- {{selectedClasses}} -
- -
- - - - - - - - - - - -
{{item.key}}{{item.val}}
{{item.key}}link
- - - -
-
- -
- -
- - -
-
- - - -
\ No newline at end of file diff --git a/src/app/visuall/operation-tabs/object-tab/object-tab.component.ts b/src/app/visuall/operation-tabs/object-tab/object-tab.component.ts deleted file mode 100644 index 89079676..00000000 --- a/src/app/visuall/operation-tabs/object-tab/object-tab.component.ts +++ /dev/null @@ -1,491 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { GlobalVariableService } from '../../global-variable.service'; -import { getPropNamesFromObj, DATE_PROP_END, DATE_PROP_START, findTypeOfAttribute, debounce, COLLAPSED_EDGE_CLASS, OBJ_INFO_UPDATE_DELAY, CLUSTER_CLASS, extend } from '../../constants'; -import { TableViewInput, TableData, TableDataType, TableFiltering, property2TableData, filterTableDatas } from '../../../shared/table-view/table-view-types'; -import { Subject, Subscription } from 'rxjs'; -import { CytoscapeService } from '../../cytoscape.service'; -import { CustomizationModule } from '../../../custom/customization.module'; -import { ActivatedRoute } from '@angular/router'; -@Component({ - selector: 'app-object-tab', - templateUrl: './object-tab.component.html', - styleUrls: ['./object-tab.component.css'] -}) -export class ObjectTabComponent implements OnInit, OnDestroy { - - nodeClasses: Set; - edgeClasses: Set; - selectedClasses: string; - selectedItemPropsURL: any[]; - selectedItemProps: any[]; - tableFilled = new Subject(); - multiObjTableFilled = new Subject(); - clearMultiObjTableFilter = new Subject(); - isShowStatsTable: boolean = false; - isShowObjTable = false; - singleObj = false; - isOpen = false; - customSubTabsObj: { component: any, text: string }[] = CustomizationModule.objSubTabsOne; - customSubTabs: { component: any, text: string }[] = CustomizationModule.objSubTabs; - - tableInput: TableViewInput = { - columns: ['Type', 'Count', 'Selected', 'Hidden'], isHide0: true, results: [], resultCnt: 0, currPage: 1, pageSize: 20, tableTitle: 'Statistics', - isShowExportAsCSV: true, isLoadGraph: true, columnLimit: 5, isMergeGraph: false, isNodeData: false, isUseCySelector4Highlight: true, isHideLoadGraph: true - }; - multiObjTableInp: TableViewInput = { - columns: ['Type'], isHide0: true, results: [], resultCnt: 0, currPage: 1, pageSize: 20, isReplace_inHeaders: true, tableTitle: 'Properties', - isShowExportAsCSV: true, isEmphasizeOnHover: true, isLoadGraph: true, isMergeGraph: false, isNodeData: false, isUseCySelector4Highlight: true, isHideLoadGraph: true - }; - private NODE_TYPE = '_NODE_'; - private EDGE_TYPE = '_EDGE_'; - shownElemsSubs: Subscription; - appDescSubs: Subscription; - dataModelSubs: Subscription; - - constructor(private _g: GlobalVariableService, private _cyService: CytoscapeService, private route: ActivatedRoute) { - this.selectedItemProps = []; - this.selectedItemPropsURL = []; - } - - ngOnInit() { - this.appDescSubs = this._g.appDescription.subscribe(x => { - if (x === null) { - return; - } - this.dataModelSubs = this._g.dataModel.subscribe(x2 => { - if (x2 === null) { - return; - } - x2.edges = x2.edges; - this.nodeClasses = new Set([]); - this.edgeClasses = new Set([]); - for (const key in x2.nodes) { - this.nodeClasses.add(key); - } - - for (const key in x2.edges) { - this.edgeClasses.add(key); - } - - this.shownElemsSubs = this._g.shownElemsChanged.subscribe(() => { this.showStats() }); - this.showObjectProps(); - this.showStats(); - this._cyService.showObjPropsFn = debounce(this.showObjectProps, OBJ_INFO_UPDATE_DELAY).bind(this); - this._cyService.showStatsFn = debounce(this.showStats, OBJ_INFO_UPDATE_DELAY).bind(this); - }); - }); - - this.route.queryParamMap.subscribe(params => { - if (params.get('pr')) { - this.isOpen = true - } - }); - } - - ngOnDestroy(): void { - if (this.appDescSubs) { - this.appDescSubs.unsubscribe(); - } - if (this.dataModelSubs) { - this.dataModelSubs.unsubscribe(); - } - if (this.shownElemsSubs) { - this.shownElemsSubs.unsubscribe(); - } - } - - showObjectProps() { - let selected = this._g.cy.$(':selected'); - this.singleObj = (this._g.cy.nodes(':selected').length === 1); - this.isShowObjTable = false; - if (selected.filter('.' + COLLAPSED_EDGE_CLASS).length > 0) { - this.isShowObjTable = true; - this.showCompoundEdgeProps(true); - return; - } - if (selected.length > 1 && (selected.length == selected.filter('node').length || selected.length == selected.filter('edge').length)) { - this.isShowObjTable = true; - this.showMultiObjTable(true); - return; - } - const selectedNonMeta = selected.not('.' + COLLAPSED_EDGE_CLASS); - let props: { [x: string]: any; }, classNames: any[]; - [props, classNames] = this.getCommonObjectProps(selectedNonMeta); - const properties = this._g.dataModel.getValue(); - // remove undefined but somehow added properties (cuz of extensions) - let definedProperties = getPropNamesFromObj([properties.nodes, properties.edges], false); - for (let k in props) { - if (!definedProperties.has(k)) { - delete props[k]; - } - } - - // remove classes added from extensions and other stuff - classNames = classNames.filter(x => this.nodeClasses.has(x) || this.edgeClasses.has(x)); - this.renderObjectProps(props, classNames, selectedNonMeta.length); - } - - showCompoundEdgeProps(isNeed2Filter: boolean) { - const compoundEdges = this._g.cy.edges(':selected').filter('.' + COLLAPSED_EDGE_CLASS); - const selectedNodeCnt = this._g.cy.nodes(':selected').length; - this.selectedClasses = ''; - this.selectedItemProps.length = 0; - this.selectedItemPropsURL.length = 0; - if (compoundEdges.length < 1 || selectedNodeCnt > 0) { - return; - } - let idMappingForHighlight = {}; - let edges = this._g.cy.collection(); - for (let i = 0; i < compoundEdges.length; i++) { - let collapsed = compoundEdges[i].data('collapsedEdges'); - edges = edges.union(collapsed); - for (let j = 0; j < collapsed.length; j++) { - idMappingForHighlight[collapsed[j].id()] = compoundEdges[i].id(); - } - } - let stdSelectedEdges = this._g.cy.edges(':selected').not('.' + COLLAPSED_EDGE_CLASS) - for (let i = 0; i < stdSelectedEdges.length; i++) { - idMappingForHighlight[stdSelectedEdges[i].id()] = stdSelectedEdges[i].id(); - } - edges = edges.union(stdSelectedEdges); - this.fillMultiObjTable(edges, false, idMappingForHighlight, isNeed2Filter); - } - - private fillMultiObjTable(elems, isNode: boolean, idMappingForHighlight: any, isNeed2Filter: boolean) { - this.multiObjTableInp.isNodeData = isNode; - let elemTypesArr = elems.map(x => x.classes()[0]); - let elemTypes = {}; - for (let i = 0; i < elemTypesArr.length; i++) { - elemTypes[elemTypesArr[i]] = true; - } - const properties = this._g.dataModel.getValue(); - let definedProperties = {}; - for (let edgeType in elemTypes) { - if (isNode) { - for (let j in properties.nodes[edgeType]) { - definedProperties[j] = true; - } - } else { - for (let j in properties.edges[edgeType]) { - definedProperties[j] = true; - } - } - } - this.multiObjTableInp.columns = ['Type'].concat(Object.keys(definedProperties)); - this.multiObjTableInp.results = []; - this.multiObjTableInp.classNames = []; - let elemTypeCnt = {}; - const enumMapping = this._g.getEnumMapping(); - for (let i = 0; i < elems.length; i++) { - let className = elems[i].classes()[0]; - if (elemTypeCnt[className]) { - elemTypeCnt[className] += 1; - } else { - elemTypeCnt[className] = 1; - } - let row: TableData[] = [{ type: TableDataType.string, val: '#' + idMappingForHighlight[elems[i].id()] }, { type: TableDataType.string, val: className }]; - for (let j in definedProperties) { - row.push(property2TableData(properties, enumMapping, j, elems[i].data(j) ?? '', className, !isNode)); - } - this.multiObjTableInp.results.push(row); - this.multiObjTableInp.classNames.push(className); - } - for (let k in elemTypeCnt) { - this.selectedClasses += k + '(' + elemTypeCnt[k] + ') '; - } - this.multiObjTableInp.pageSize = this._g.userPrefs.dataPageSize.getValue(); - this.multiObjTableInp.currPage = 1; - this.multiObjTableInp.resultCnt = this.multiObjTableInp.results.length; - // if too many edges need to be shown, we should make pagination - if (isNeed2Filter) { - this.clearMultiObjTableFilter.next(true); - filterTableDatas({ orderBy: '', orderDirection: '', txt: '' }, this.multiObjTableInp, this._g.userPrefs.isIgnoreCaseInText.getValue()); - } - setTimeout(() => { - this.multiObjTableFilled.next(true); - }, 100); - } - - showMultiObjTable(isNeed2Filter: boolean) { - let selected = this._g.cy.$(':selected').not('.' + CLUSTER_CLASS); - this.selectedClasses = ''; - this.selectedItemProps.length = 0; - this.selectedItemPropsURL.length = 0; - let hasNode = selected.filter('node').length > 0; - if (hasNode && selected.filter('edge').length > 0) { - return; - } - let idMappingForHighlight = {}; - for (let i = 0; i < selected.length; i++) { - let id = selected[i].id(); - idMappingForHighlight[id] = id; - } - this.fillMultiObjTable(selected, hasNode, idMappingForHighlight, isNeed2Filter); - } - - renderObjectProps(props, classNames, selectedCount) { - - if (classNames && classNames.length > 0) { - classNames = classNames.join(' & '); - } - - this.selectedClasses = classNames; - this.selectedItemProps.length = 0; - this.selectedItemPropsURL.length = 0; - let propKeys = Object.keys(props); - // get ordered keys if only one item is selected - if (selectedCount === 1) { - propKeys = this.orderPropertyKeysIf1Selected(classNames) || propKeys; - } - const properties = this._g.dataModel.getValue(); - for (const key of propKeys) { - - // Replace - and _ with space - let renderedKey = key.replace(/[_\-]/g, ' '); - let renderedValue = props[key]; - - const attributeType = findTypeOfAttribute(key, properties.nodes, properties.edges); - if (attributeType === 'datetime') { - if (typeof renderedValue !== 'undefined' && renderedValue < 2208988800000) { - renderedValue = new Date(renderedValue).toLocaleString(); - } else { - renderedValue = '-'; - } - if ( DATE_PROP_START.includes(key.toLowerCase()) || - DATE_PROP_END.includes(key.toLowerCase() )) { - this.selectedItemProps.push({ key: renderedKey, val: renderedValue }); - continue; - } - } - - else if (key === 'url' && renderedValue != undefined) { - this.selectedItemPropsURL.push({ key: renderedKey, val: renderedValue }); - } - else if (key === 'url' && renderedValue == undefined) { - this.selectedItemProps.push({ key: renderedKey, val: '-' }); - } - else { - renderedValue = this.getMappedProperty(this.selectedClasses, key, renderedValue); - this.selectedItemProps.push({ key: renderedKey, val: renderedValue }); - } - } - } - - // get common key-value pairs for non-nested properties - getCommonObjectProps(eleList) { - let superObj = {}; - let superClassNames = {}; - let commonProps = {}; - let commonClassNames = []; - let firstElem = null; - - // Assume ele is instance of Cytoscape.js element - eleList.forEach(ele => { - const e = ele.json(); - const data = e.data; - const classes = e.classes; - const classArray = classes.split(' '); - - // construct superClassNames - for (let i = 0; i < classArray.length; i++) { - const c = classArray[i]; - if (superClassNames[c]) { - superClassNames[c] += 1; - } else { - superClassNames[c] = 1; - } - } - - if (firstElem === null) { - firstElem = extend(firstElem, data); - } - - if (eleList.length === 1) { - commonClassNames = classArray; - return; - } - - // count common key-value pairs - this.countKeyValuePairs(data, superObj); - }); - - if (eleList.length === 1) { - return [firstElem, commonClassNames]; - } - - const eleCount = eleList.length; - - // get common key-value pairs - for (const [k, v] of Object.entries(superObj)) { - for (const [, v2] of Object.entries(v)) { - if (v2 === eleCount) { - commonProps[k] = firstElem[k]; - } - } - } - - // get common class names - for (const [k, v] of Object.entries(superClassNames)) { - if (v === eleCount) { - commonClassNames.push(k); - } - } - - return [commonProps, commonClassNames]; - } - - countKeyValuePairs(data, superObj) { - for (const [k, v] of Object.entries(data)) { - const valueProperty = v + ''; - if (superObj[k]) { - if (superObj[k][valueProperty]) { - superObj[k][valueProperty] += 1; - } else { - superObj[k][valueProperty] = 1 - } - } else { - const o2 = {}; - o2[valueProperty] = 1; - superObj[k] = o2; - } - } - } - - orderPropertyKeysIf1Selected(classNames) { - const properties = this._g.dataModel.getValue(); - const nodeProps = properties.nodes[classNames]; - const edgeProps = properties.edges[classNames]; - if (nodeProps) { - return Object.keys(nodeProps); - } else if (edgeProps) { - return Object.keys(edgeProps); - } - return null; - } - - getMappedProperty(className: string, propertyName: string, propertyValue: string): string { - const enumMap = this._g.getEnumMapping(); - let classes = Object.keys(enumMap); - let c = classes.find(x => x == className); - if (!c) { - return propertyValue; - } - - const mapping = enumMap[c][propertyName]; - if (!mapping) { - return propertyValue; - } - const val = enumMap[c][propertyName][propertyValue]; - if (val != null || val != undefined) { - return val; - } - return propertyValue; - } - - showStats() { - let stat = {}; - let classSet = new Set(); - let elems = this._g.cy.$(); - for (let i = 0; i < elems.length; i++) { - let curr = elems[i]; - let c = curr.classes(); - let isSelected = curr.selected(); - let isVisible = curr.visible(); - for (let j = 0; j < c.length; j++) { - if (!this.nodeClasses.has(c[j]) && !this.edgeClasses.has(c[j]) && c[j] != COLLAPSED_EDGE_CLASS) { - continue; - } - classSet.add(c[j]); - let TYPE_CLASS = curr.isNode() ? this.NODE_TYPE : this.EDGE_TYPE; - this.increaseCountInObj(stat, TYPE_CLASS, 'total'); - this.increaseCountInObj(stat, c[j], 'total'); - - if (isSelected) { - this.increaseCountInObj(stat, c[j], 'selected'); - this.increaseCountInObj(stat, TYPE_CLASS, 'selected'); - } - if (!isVisible) { - this.increaseCountInObj(stat, c[j], 'hidden'); - this.increaseCountInObj(stat, TYPE_CLASS, 'hidden'); - } - } - } - classSet.add(this.NODE_TYPE); - classSet.add(this.EDGE_TYPE); - this.setStatStrFromObj(stat, classSet); - this.isShowStatsTable = elems.length > 0; - } - - private setStatStrFromObj(stat, classSet: Set) { - - this.tableInput.results = []; - this.tableInput.classNames = []; - for (let c of classSet) { - if (stat[c] === undefined) { - continue; - } - let cySelector = '.' + c; - // first element must be ID, ID is irrelevant here - let row: TableData[] = [{ val: cySelector, type: TableDataType.string }]; - if (c == this.NODE_TYPE) { - row[0].val = 'node'; - row.push({ val: 'Node', type: TableDataType.string }); - } else if (c == this.EDGE_TYPE) { - row[0].val = 'edge'; - row.push({ val: 'Edge', type: TableDataType.string }); - } else if (c == COLLAPSED_EDGE_CLASS) { - row[0].val = '.' + COLLAPSED_EDGE_CLASS; - row.push({ val: 'Meta edge', type: TableDataType.string }); - } else { - row.push({ val: c, type: TableDataType.string }); - } - row.push({ val: stat[c].total, type: TableDataType.number }); - - if (stat[c]['selected']) { - row.push({ val: stat[c]['selected'], type: TableDataType.number }); - } else { - row.push({ val: 0, type: TableDataType.number }); - } - if (stat[c]['hidden']) { - row.push({ val: stat[c]['hidden'], type: TableDataType.number }); - } else { - row.push({ val: 0, type: TableDataType.number }); - } - this.tableInput.results.push(row); - this.tableInput.classNames.push(row[1].val); - } - this.tableInput.pageSize = this._g.userPrefs.dataPageSize.getValue(); - - // let tableView ngOnInit finish - setTimeout(() => this.tableFilled.next(true), 100); - } - - private increaseCountInObj(obj, p1: string, p2: string) { - if (obj[p1]) { - if (obj[p1][p2] === undefined) { - obj[p1][p2] = 1; - } else { - obj[p1][p2] += 1; - } - } else { - obj[p1] = {}; - obj[p1][p2] = 1; - } - } - - filterTable(filter: TableFiltering) { - this.showStats(); - filterTableDatas(filter, this.tableInput, this._g.userPrefs.isIgnoreCaseInText.getValue()); - setTimeout(() => this.tableFilled.next(true), 100); - } - - filterMultiObjTable(filter: TableFiltering) { - if (this._g.cy.edges(':selected').filter('.' + COLLAPSED_EDGE_CLASS).length > 0) { - this.showCompoundEdgeProps(false); - } else { - this.showMultiObjTable(false); - } - filterTableDatas(filter, this.multiObjTableInp, this._g.userPrefs.isIgnoreCaseInText.getValue()); - setTimeout(() => this.multiObjTableFilled.next(true), 100); - } -} \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/operation-tabs.component.css b/src/app/visuall/operation-tabs/operation-tabs.component.css deleted file mode 100644 index 641a025c..00000000 --- a/src/app/visuall/operation-tabs/operation-tabs.component.css +++ /dev/null @@ -1,3 +0,0 @@ -.nav-link{ - padding: 0.1rem 0.5rem; -} \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/operation-tabs.component.html b/src/app/visuall/operation-tabs/operation-tabs.component.html deleted file mode 100644 index 5cf37f50..00000000 --- a/src/app/visuall/operation-tabs/operation-tabs.component.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - -
-
- -
-
\ No newline at end of file diff --git a/src/app/visuall/operation-tabs/operation-tabs.component.ts b/src/app/visuall/operation-tabs/operation-tabs.component.ts deleted file mode 100644 index 3c4e5706..00000000 --- a/src/app/visuall/operation-tabs/operation-tabs.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { GlobalVariableService } from '../global-variable.service'; -import { ObjectTabComponent } from './object-tab/object-tab.component'; -import { MapTabComponent } from './map-tab/map-tab.component'; -import { QueryTabComponent } from './query-tab/query-tab.component'; -import { SettingsTabComponent } from './settings-tab/settings-tab.component'; -import { CustomizationModule } from '../../custom/customization.module'; -import { Subscription } from 'rxjs'; -import { ActivatedRoute } from '@angular/router'; -@Component({ - selector: 'app-operation-tabs', - templateUrl: './operation-tabs.component.html', - styleUrls: ['./operation-tabs.component.css'] -}) - -export class OperationTabsComponent implements OnDestroy { - currTab: Number; - tabs: { component: any, text: string }[] = [{ component: ObjectTabComponent, text: 'Object' }, { component: MapTabComponent, text: 'Map' }, { component: QueryTabComponent, text: 'Database' }, { component: SettingsTabComponent, text: 'Settings' }]; - tabChangeSubs: Subscription; - - constructor(private _g: GlobalVariableService, private route: ActivatedRoute) { - this.currTab = this._g.operationTabChanged.getValue(); - this.tabChangeSubs = this._g.operationTabChanged.subscribe(x => { this.currTab = x }); - this.tabs = this.tabs.concat(CustomizationModule.operationTabs); - this.route.queryParamMap.subscribe(params => { - if (params.get('pr')) { - this.setTab(0) - } - }); - - } - - setTab(i: number) { - this._g.operationTabChanged.next(i); - } - - ngOnDestroy(): void { - if (this.tabChangeSubs) { - this.tabChangeSubs.unsubscribe(); - } - } -} \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.css b/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.css deleted file mode 100644 index 745fcf78..00000000 --- a/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.css +++ /dev/null @@ -1,4 +0,0 @@ -img { - width: 16px; - height: 16px; -} diff --git a/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.html b/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.html deleted file mode 100644 index 025bd5d1..00000000 --- a/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.html +++ /dev/null @@ -1,82 +0,0 @@ - -
-
-
- -
-
-
- -
-
-
-
- Get common   - target(s)   - regulator(s) for -
-
- -
- - -
- - -
- -
- -
-
- - -
- -
-
- -
- -
-
- - -
-
- - -
-
- -
- - -
- - -
- -
- - -
-
-
- - -
\ No newline at end of file diff --git a/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.ts b/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.ts deleted file mode 100644 index 4ac40f92..00000000 --- a/src/app/visuall/operation-tabs/query-tab/advanced-queries/advanced-queries.component.ts +++ /dev/null @@ -1,439 +0,0 @@ -import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { GlobalVariableService } from '../../../global-variable.service'; -import { DbAdapterService } from '../../../db-service/db-adapter.service'; -import { CytoscapeService } from '../../../cytoscape.service'; -import { TableViewInput, property2TableData, TableData, TableDataType, TableFiltering, TableRowMeta } from '../../../../shared/table-view/table-view-types'; -import { Subject, Subscription } from 'rxjs'; -import { Neo4jEdgeDirection, GraphElem, HistoryMetaData, ElemAsQueryParam, DbResponseType } from '../../../db-service/data-types'; -import { getCyStyleFromColorAndWid, readTxtFile, isJson } from '../../../constants'; - -@Component({ - selector: 'app-advanced-queries', - templateUrl: './advanced-queries.component.html', - styleUrls: ['./advanced-queries.component.css'] -}) -export class AdvancedQueriesComponent implements OnInit, OnDestroy { - @ViewChild('file', { static: false }) file; - queries: string[]; - selectedQuery: string; - selectedIdx: number; - nodeEdgeClasses: string[] = []; - ignoredTypes: string[] = []; - lengthLimit = 2; - isDirected = true; - selectedNodes: ElemAsQueryParam[] = []; - selectedClass = ''; - targetOrRegulator = 0; - clickedNodeIdx = -1; - addNodeBtnTxt = 'Select Nodes to Add'; - tableInput: TableViewInput = { - columns: ['Title'], results: [], results2: [],isEmphasizeOnHover: true, tableTitle: 'Query Results', isShowExportAsCSV: true, - resultCnt: 0, currPage: 1, pageSize: 0, isLoadGraph: false, isMergeGraph: true, isNodeData: true - }; - tableFilter: TableFiltering = { orderBy: null, orderDirection: null, txt: '', skip: null }; - tableFilled = new Subject(); - dataPageSizeSubs: Subscription; - dataModelSubs: Subscription; - dbResponse = null; - - constructor(private _g: GlobalVariableService, private _dbService: DbAdapterService, private _cyService: CytoscapeService) { - this.queries = ['Get neighborhood', 'Get graph of interest', 'Get common targets/regulators']; - this.selectedIdx = -1; - } - - ngOnInit(): void { - this.dataModelSubs = this._g.dataModel.subscribe(x => { - if (x) { - for (const n in x.nodes) { - this.nodeEdgeClasses.push(n); - } - for (const e in x.edges) { - this.nodeEdgeClasses.push(e); - } - } - }); - this.selectedQuery = ''; - this.dataPageSizeSubs = this._g.userPrefs.dataPageSize.subscribe(x => { this.tableInput.pageSize = x; this.tableInput.currPage = 1; this.tableFilter.skip = 0; }); - } - - ngOnDestroy(): void { - if (this.dataModelSubs) { - this.dataModelSubs.unsubscribe(); - } - if (this.dataPageSizeSubs) { - this.dataPageSizeSubs.unsubscribe(); - } - } - - changeAdvancedQuery(event) { - this.selectedIdx = this.queries.findIndex(x => x == event.target.value); - } - - addSelectedNodes() { - if (this._g.isSwitch2ObjTabOnSelect) { - this._g.isSwitch2ObjTabOnSelect = false; - this.addNodeBtnTxt = 'Complete Selection'; - return; - } - this.addNodeBtnTxt = 'Select Nodes to Add'; - this._g.isSwitch2ObjTabOnSelect = true; - const selectedNodes = this._g.cy.nodes(':selected'); - if (selectedNodes.length < 1) { - return; - } - const dbIds = selectedNodes.map(x => x.id().slice(1)); - const labels = this._g.getLabels4ElemsAsArray(dbIds); - const types = selectedNodes.map(x => x.classes()[0]); - for (let i = 0; i < labels.length; i++) { - if (this.selectedNodes.findIndex(x => x.dbId == dbIds[i]) < 0) { - this.selectedNodes.push({ dbId: dbIds[i], label: types[i] + ':' + labels[i] }); - } - } - } - - removeSelected(i: number) { - if (i == this.clickedNodeIdx) { - this.clickedNodeIdx = -1; - const idSelector = 'n' + this.selectedNodes[i].dbId; - this._g.cy.$id(idSelector).unselect(); - } else if (i < this.clickedNodeIdx) { - this.clickedNodeIdx--; - } - this.selectedNodes.splice(i, 1); - } - - removeAllSelectedNodes() { - this.selectedNodes = []; - this.clickedNodeIdx = -1; - } - - runQuery(isFromFilter: boolean, idFilter: (string | number)[] | null) { - if (!isFromFilter && !idFilter) { - this.tableFilter.skip = 0; - this.tableInput.currPage = 1; - } - const dbIds = this.selectedNodes.map(x => x.dbId); - if (dbIds.length < 1) { - return; - } - const isClientSidePagination = this._g.userPrefs.queryResultPagination.getValue() == 'Client'; - const prepareDataFn = (x) => { - if (!idFilter && !isFromFilter) { - this.dbResponse = x; - } - - if (!idFilter) { - if (isClientSidePagination) { - const clientSideX = this.filterDbResponse(x, isFromFilter ? this.tableFilter : null, idFilter); - this.fillTable(clientSideX, !isFromFilter, isClientSidePagination); - } else { - this.fillTable(x, !isFromFilter, isClientSidePagination); - } - } - if (this.tableInput.isLoadGraph || idFilter) { - if (isClientSidePagination) { - const clientSideX = this.filterDbResponse(x, isFromFilter ? this.tableFilter : null, idFilter); - this._cyService.loadElementsFromDatabase(this.prepareElems4Cy(clientSideX), this.tableInput.isMergeGraph); - } else { - this._cyService.loadElementsFromDatabase(this.prepareElems4Cy(x), this.tableInput.isMergeGraph); - } - this.highlightSeedNodes(); - this.highlightTargetRegulators(x); - } - }; - if (isFromFilter && isClientSidePagination) { - prepareDataFn(this.dbResponse); - } else { - const types = this.ignoredTypes.map(x => `'${x}'`); - if (this.selectedIdx == 1) { - this._dbService.getGraphOfInterest(dbIds, types, this.lengthLimit, this.isDirected, DbResponseType.table, this.tableFilter, idFilter, prepareDataFn); - } else if (this.selectedIdx == 2) { - let dir: Neo4jEdgeDirection = this.targetOrRegulator; - if (!this.isDirected) { - dir = Neo4jEdgeDirection.BOTH; - } - this._dbService.getCommonStream(dbIds, types, this.lengthLimit, dir, DbResponseType.table, this.tableFilter, idFilter, prepareDataFn); - } else if (this.selectedIdx == 0) { - this._dbService.getNeighborhood(dbIds, types, this.lengthLimit, this.isDirected, this.tableFilter, idFilter, prepareDataFn); - } - } - - } - - setSelected(x: ElemAsQueryParam[]) { - this.selectedNodes = x; - } - - // used for client-side filtering - private filterDbResponse(x, filter: TableFiltering, idFilter: (string | number)[]) { - const r = { columns: x.columns, data: [[null, null, null, null, null, null, null, null]] }; - const idxNodes = x.columns.indexOf('nodes'); - const idxNodeId = x.columns.indexOf('nodeElementId'); - const idxNodeClass = x.columns.indexOf('nodeClass'); - const idxEdges = x.columns.indexOf('edges'); - const idxEdgeId = x.columns.indexOf('edgeElementId'); - const idxEdgeClass = x.columns.indexOf('edgeClass'); - const idxEdgeSrcTgt = x.columns.indexOf('edgeSourceTargets'); - const idxTotalCnt = x.columns.indexOf('totalNodeCount'); - const maxResultCnt = this._g.userPrefs.dataPageLimit.getValue() * this._g.userPrefs.dataPageSize.getValue(); - - const nodes = x.data[0][idxNodes]; - const nodeClass = x.data[0][idxNodeClass]; - const nodeId = x.data[0][idxNodeId]; - const edges = x.data[0][idxEdges]; - const edgeClass = x.data[0][idxEdgeClass]; - const edgeId = x.data[0][idxEdgeId]; - const edgeSrcTgt = x.data[0][idxEdgeSrcTgt]; - r.data[0][idxEdges] = edges; - r.data[0][idxEdgeClass] = edgeClass; - r.data[0][idxEdgeId] = edgeId; - r.data[0][idxEdgeSrcTgt] = edgeSrcTgt; - r.data[0][idxTotalCnt] = x.data[0][idxTotalCnt] > maxResultCnt ? maxResultCnt : x.data[0][idxTotalCnt]; - - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - - let tempNodes: { node: any, cls: string, elementId: string | number }[] = []; - const srcNodeIds = this.selectedNodes.map(x => x.dbId); - if (idFilter) { - tempNodes = nodes.map((_, i) => { return { node: nodes[i], cls: nodeClass[i], elementId: nodeId[i] } }) - .filter((_, i) => { return idFilter.includes(nodeId[i]) || srcNodeIds.findIndex(x => x == nodeId[i]) > -1; }); - } - else if (filter) { - for (let i = 0; i < nodes.length; i++) { - const vals = Object.values(nodes[i]).join(''); - // always include source nodes - if (srcNodeIds.includes(nodeId[i]) || (isIgnoreCase && vals.toLowerCase().includes(filter.txt.toLowerCase())) || (!isIgnoreCase && vals.includes(filter.txt))) { - tempNodes.push({ node: nodes[i], cls: nodeClass[i], elementId: nodeId[i] }); - } - } - } else { - tempNodes = nodes.map((_, i) => { return { node: nodes[i], cls: nodeClass[i], elementId: nodeId[i] } }) - } - - // order by - if (!idFilter && filter && filter.orderDirection.length > 0) { - const o = filter.orderBy; - if (filter.orderDirection == 'asc') { - tempNodes = tempNodes.sort((a, b) => { if (!a.node[o]) return 1; if (!b.node[o]) return -1; if (a.node[o] > b.node[o]) return 1; if (b.node[o] > a.node[o]) return -1; return 0 }); - } else { - tempNodes = tempNodes.sort((a, b) => { if (!a.node[o]) return 1; if (!b.node[o]) return -1; if (a.node[o] < b.node[o]) return 1; if (b.node[o] < a.node[o]) return -1; return 0 }); - } - } - const skip = filter && filter.skip ? filter.skip : 0; - for (let i = 0; i < srcNodeIds.length; i++) { - const idx = tempNodes.findIndex(x => x.elementId == srcNodeIds[i]); - // move src node to the beginning - if (idx > -1) { - const tmp = tempNodes[idx]; - tempNodes[idx] = tempNodes[i]; - tempNodes[i] = tmp; - } - } - if (filter && !idFilter) { - this.tableInput.resultCnt = tempNodes.length; - } - - tempNodes = tempNodes.slice(skip, skip + this._g.userPrefs.dataPageSize.getValue()); - r.data[0][idxNodes] = tempNodes.map(x => x.node); - r.data[0][idxNodeClass] = tempNodes.map(x => x.cls); - r.data[0][idxNodeId] = tempNodes.map(x => x.elementId); - return r; - } - - // fill table from graph response - private fillTable(data, isRefreshColumns = true, isClientSidePagination = true) { - const idxNodes = data.columns.indexOf('nodes'); - const idxNodeId = data.columns.indexOf('nodeElementId'); - const idxNodeClass = data.columns.indexOf('nodeClass'); - const idxTotalCnt = data.columns.indexOf('totalNodeCount'); - const nodes = data.data[0][idxNodes]; - const nodeClass = data.data[0][idxNodeClass]; - const nodeId = data.data[0][idxNodeId]; - if (isRefreshColumns || !isClientSidePagination) { - this.tableInput.resultCnt = data.data[0][idxTotalCnt]; - } - - this.tableInput.results = []; - if (isRefreshColumns) { - this.tableInput.columns = []; - } - this.tableInput.classNames = []; - const enumMapping = this._g.getEnumMapping(); - const props = this._g.dataModel.getValue(); - for (let i = 0; i < nodes.length; i++) { - const d = nodes[i]; - delete d['tconst']; - delete d['nconst']; - const propNames = Object.keys(d); - const row: TableData[] = [{ type: TableDataType.string, val: nodeId[i] }]; - for (const n of propNames) { - const idx = this.tableInput.columns.indexOf(n); - if (idx == -1) { - this.tableInput.columns.push(n); - row[this.tableInput.columns.length] = property2TableData(props, enumMapping, n, d[n], nodeClass[i], false); - } else { - row[idx + 1] = property2TableData(props, enumMapping, n, d[n], nodeClass[i], false); - } - } - // fill empty columns - for (let j = 0; j < this.tableInput.columns.length + 1; j++) { - if (!row[j]) { - row[j] = { val: '', type: TableDataType.string }; - } - } - this.tableInput.classNames.push(nodeClass[i]); - this.tableInput.results.push(row); - } - - const maxColCnt = Math.max(...this.tableInput.results.map(x => x.length)); - for (let i = 0; i < this.tableInput.results.length; i++) { - for (let j = this.tableInput.results[i].length; j < maxColCnt; j++) { - this.tableInput.results[i].push({ val: '', type: TableDataType.string }); - } - } - this.tableFilled.next(true); - } - - private highlightSeedNodes() { - const dbIds = new Set(this.selectedNodes.map(x => x.dbId)); - const seedNodes = this._g.cy.nodes().filter(node => dbIds.has(node.id().substring(1))); - // add a new higlight style - if (this._g.userPrefs.highlightStyles.length < 2) { - const cyStyle = getCyStyleFromColorAndWid('#0b9bcd', 4.5); - this._g.viewUtils.addHighlightStyle(cyStyle.node, cyStyle.edge); - } - const currHighlightIdx = this._g.userPrefs.currHighlightIdx.getValue(); - if (currHighlightIdx == 0) { - this._g.viewUtils.highlight(seedNodes, 1); - } else { - this._g.viewUtils.highlight(seedNodes, 0); - } - } - - private highlightTargetRegulators(data) { - const idxTargetRegulator = data.columns.indexOf('targetRegulatorNodeIds'); - const dbIds = new Set(data.data[0][idxTargetRegulator]); - if (!dbIds || dbIds.size < 1) { - return; - } - const cyNodes = this._g.cy.nodes().filter(node => dbIds.has(node.id().substring(1))); - - // add a new higlight style - if (this._g.userPrefs.highlightStyles.length < 3) { - const cyStyle = getCyStyleFromColorAndWid('#04f06a', 4.5); - this._g.viewUtils.addHighlightStyle(cyStyle.node, cyStyle.edge); - } - this._g.viewUtils.highlight(cyNodes, 2); - } - - addSelectedNodesFromFile() { - this.file.nativeElement.value = ''; - this.file.nativeElement.click(); - } - - fileSelected() { - readTxtFile(this.file.nativeElement.files[0], (txt) => { - let elems: GraphElem[] = []; - if (!isJson(txt)) { - const arr = txt.split('\n').map(x => x.split('|')); - if (arr.length < 0) { - return; - } - const idx4id = arr[0].indexOf('id'); - - for (let i = 1; i < arr.length; i++) { - if (this.selectedNodes.find(x => x.dbId == arr[i][idx4id].substring(1))) { - continue; - } - const o = {}; - for (let j = 1; j < arr[0].length; j++) { - o[arr[0][j]] = arr[i][j]; - } - elems.push({ classes: arr[i][0], data: o }); - } - } else { - elems = JSON.parse(txt) as GraphElem[]; - const fn1 = x => this.selectedNodes.find(y => y.dbId === x.data.id.substring(1)) === undefined; - if (!(elems instanceof Array)) { - elems = (JSON.parse(txt).nodes as any[]).filter(fn1); - } else { - elems = elems.filter(x => x.data.id.startsWith('n') && fn1(x)); - } - } - - const labels = this._g.getLabels4ElemsAsArray(null, true, elems); - this.selectedNodes = this.selectedNodes.concat(elems.map((x, i) => { return { dbId: x.data.id.substring(1), label: x.classes.split(' ')[0] + ':' + labels[i] } })); - }); - } - - addRemoveType(e: { className: string, willBeShowed: boolean }) { - if (e.willBeShowed) { - const idx = this.ignoredTypes.findIndex(x => x === e.className); - if (idx > -1) { - this.ignoredTypes.splice(idx, 1); - } - } else { - if (!this.ignoredTypes.includes(e.className)) { - this.ignoredTypes.push(e.className); - } - } - } - - selectedNodeClicked(i: number) { - this._g.isSwitch2ObjTabOnSelect = false; - this.clickedNodeIdx = i; - const idSelector = 'n' + this.selectedNodes[i].dbId; - this._g.cy.$().unselect(); - this._g.cy.elements(`[id = "${idSelector}"]`).select(); - this._g.isSwitch2ObjTabOnSelect = true; - } - - getDataForQueryResult(e: TableRowMeta) { - this.runQuery(true, e.dbIds); - } - - filterTable(filter: TableFiltering) { - console.log('filter table: ', filter); - this.tableFilter = filter; - this.runQuery(true, null); - } - - prepareElems4Cy(data) { - const idxNodes = data.columns.indexOf('nodes'); - const idxNodeId = data.columns.indexOf('nodeElementId'); - const idxNodeClass = data.columns.indexOf('nodeClass'); - const idxEdges = data.columns.indexOf('edges'); - const idxEdgeId = data.columns.indexOf('edgeElementId'); - const idxEdgeClass = data.columns.indexOf('edgeClass'); - const idxEdgeSrcTgt = data.columns.indexOf('edgeSourceTargets'); - - const nodes = data.data[0][idxNodes]; - const nodeClass = data.data[0][idxNodeClass]; - const nodeId = data.data[0][idxNodeId]; - const edges = data.data[0][idxEdges]; - const edgeClass = data.data[0][idxEdgeClass]; - const edgeId = data.data[0][idxEdgeId]; - const edgeSrcTgt = data.data[0][idxEdgeSrcTgt]; - - const cyData = { nodes: [], edges: [] }; - const nodeIdsDict = {}; - for (let i = 0; i < nodes.length; i++) { - cyData.nodes.push({ elementId: nodeId[i], labels: [nodeClass[i]], properties: nodes[i] }); - nodeIdsDict[nodeId[i]] = true; - } - - for (let i = 0; i < edges.length; i++) { - const srcId = edgeSrcTgt[i][0]; - const tgtId = edgeSrcTgt[i][1]; - // check if src and target exist in cy or current data. - const isSrcLoaded = this.tableInput.isMergeGraph ? this._g.cy.elements(`[id = "n${srcId}"]`).length > 0 : false; - const isTgtLoaded = this.tableInput.isMergeGraph ? this._g.cy.elements(`[id = "n${tgtId}"]`).length > 0 : false; - if ((nodeIdsDict[srcId] || isSrcLoaded) && (nodeIdsDict[tgtId] || isTgtLoaded)) { - cyData.edges.push({ properties: edges[i], startNodeElementId: srcId, endNodeElementId: tgtId, elementId: edgeId[i], type: edgeClass[i] }); - } - } - - return cyData; - } - -} \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/query-tab/query-tab.component.css b/src/app/visuall/operation-tabs/query-tab/query-tab.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/operation-tabs/query-tab/query-tab.component.html b/src/app/visuall/operation-tabs/query-tab/query-tab.component.html deleted file mode 100644 index c1015d14..00000000 --- a/src/app/visuall/operation-tabs/query-tab/query-tab.component.html +++ /dev/null @@ -1,40 +0,0 @@ -
-
-
- General Queries -
- -
- -
-
- -
- - -
-
-
-
- -
-
-
- -
-
- -
-
-
-
- - -
\ No newline at end of file diff --git a/src/app/visuall/operation-tabs/query-tab/query-tab.component.ts b/src/app/visuall/operation-tabs/query-tab/query-tab.component.ts deleted file mode 100644 index 21165459..00000000 --- a/src/app/visuall/operation-tabs/query-tab/query-tab.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { CustomizationModule } from '../../../custom/customization.module'; - -@Component({ - selector: 'app-query-tab', - templateUrl: './query-tab.component.html', - styleUrls: ['./query-tab.component.css'] -}) -export class QueryTabComponent implements OnInit { - queries: { component: any, text: string }[]; - selectedQuery: string; - selectedIdx: number; - customSubTabs: { component: any, text: string }[] = CustomizationModule.databaseSubTabs; - - constructor() { - this.queries = CustomizationModule.queries; - this.selectedIdx = -1; - } - - ngOnInit() { - this.selectedQuery = ''; - } - - changeQuery(event) { - this.selectedIdx = this.queries.findIndex(x => x.text == event.target.value); - } -} diff --git a/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.css b/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.css deleted file mode 100644 index 4857bb7d..00000000 --- a/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.css +++ /dev/null @@ -1,19 +0,0 @@ -.inp-4-char { - width: 6em; -} - -.inp-10-ch { - width: 10em; -} - -img { - width: 16px; - height: 16px; - cursor: pointer; -} - -.w5-5 { - width: 5.5em; -} - - diff --git a/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.html b/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.html deleted file mode 100644 index 2543543f..00000000 --- a/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.html +++ /dev/null @@ -1,260 +0,0 @@ -
-
- General -
-
-
-
- - -
-
-
-
Show query results using
-
- - -
-
-
-
Group using
-
- - -
-
-
-
Node label style:
-
- - -
-
-
- -
- - -
-
-
-
Highlight style
-
- - - - - - Update this style - - - Delete this style - - - Add new style - -
-
-
-
Object inclusion type:
-
- - -
-
-
-
Query result pagination:
-
- - -
-
- - -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- - -
-
- -
-
-
- -
- -
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- -
- - - - -
- -
-
-
- - -
-
-
-
- -
- -
-
{{timebarPlayingStep}}
-
-
-
- -
- -
-
{{timebarPlayingPeriod}}
-
-
-
-
- -
- -
-
{{timebarZoomingStep}}
-
-
-
-
-
Statistics inclusion type:
-
- - -
-
-
- -
-
- -
-
-
-
- - \ No newline at end of file diff --git a/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.ts b/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.ts deleted file mode 100644 index f4273669..00000000 --- a/src/app/visuall/operation-tabs/settings-tab/settings-tab.component.ts +++ /dev/null @@ -1,393 +0,0 @@ -import { Component, OnInit, ElementRef, ViewChild, OnDestroy } from '@angular/core'; -import { GlobalVariableService } from '../../global-variable.service'; -import { TimebarGraphInclusionTypes, TimebarStatsInclusionTypes, MergedElemIndicatorTypes, BoolSetting, GroupingOptionTypes } from '../../user-preference'; -import { UserProfileService } from '../../user-profile.service'; -import { BehaviorSubject, Subscription } from 'rxjs'; -import { MIN_HIGHTLIGHT_WIDTH, MAX_HIGHTLIGHT_WIDTH, getCyStyleFromColorAndWid } from '../../constants'; -import { CustomizationModule } from 'src/app/custom/customization.module'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; -import { Neo4jDb } from 'src/app/visuall/db-service/neo4j-db.service'; -@Component({ - selector: 'app-settings-tab', - templateUrl: './settings-tab.component.html', - styleUrls: ['./settings-tab.component.css'] -}) -export class SettingsTabComponent implements OnInit, OnDestroy { - generalBoolSettings: BoolSetting[]; - timebarBoolSettings: BoolSetting[]; - anomalyBoolSetting: BoolSetting[]; - highlightWidth: number; - highlightColor: string; - timebarPlayingStep: number; - timebarPlayingPeriod: number; - timebarZoomingStep: number; - compoundPadding: string; - @ViewChild('dbQueryDate1', { static: false }) dbQueryDate1: ElementRef; - @ViewChild('dbQueryDate2', { static: false }) dbQueryDate2: ElementRef; - dataPageSize: number; - dataPageLimit: number; - queryNeighborLimit: number; - queryHistoryLimit: number; - dbTimeout: number; - tableColumnLimit: number; - edgeCollapseLimit: number; - timebarGraphInclusionTypes: string[] = ['overlaps', 'contains', 'contained by']; - timebarStatsInclusionTypes: string[] = ['all', 'begin', 'middle', 'end']; - mergedElemIndicators: string[] = ['None', 'Selection', 'Highlight']; - groupingOptions: string[] = ['Compounds', 'Circles']; - nodeLabelWrapTypes: string[] = ['None', 'Wrap', 'Ellipsis']; - // multiple choice settings - graphInclusionType: TimebarGraphInclusionTypes; - queryResultPagination: 'Client' | 'Server'; - statsInclusionType: TimebarStatsInclusionTypes; - mergedElemIndicator: MergedElemIndicatorTypes; - groupingOption: GroupingOptionTypes; - nodeLabelWrap: number = 0; - isInit: boolean = false; - currHighlightStyles: string[] = []; - highlightStyleIdx = 0; - isStoreUserProfile = true; - selectionColor = "#6c757d"; - selectionWidth = 4.5; - customSubTabs: { component: any, text: string }[] = CustomizationModule.settingsSubTabs; - loadFromFileSubs: Subscription; - tabChangeSubs: Subscription; - anomalyDefaultValues: { - ignoreBug: number, - assigneeChangeCount: number, - reopenCount: number, - } - constructor(private _g: GlobalVariableService, private _profile: UserProfileService, public _dbService: Neo4jDb) { - this.anomalyDefaultValues = { - ignoreBug: this._g.userPrefs?.anomalyDefaultValues?.ignoreBug.getValue() || 1, - assigneeChangeCount: this._g.userPrefs?.anomalyDefaultValues?.assigneeChangeCount.getValue() || 1, - reopenCount: this._g.userPrefs?.anomalyDefaultValues?.reopenCount.getValue() || 1, - } - this.loadFromFileSubs = this._profile.onLoadFromFile.subscribe(x => { - if (!x) { - return; - } - this._profile.transferUserPrefs(); - this.setViewUtilsStyle(); - this.fillUIFromMemory(); - }); - } - - ngOnInit() { - this.anomalyDefaultValues = { - ignoreBug: this._g.userPrefs?.anomalyDefaultValues?.ignoreBug.getValue() || 1, - assigneeChangeCount: this._g.userPrefs?.anomalyDefaultValues?.assigneeChangeCount.getValue() || 1, - reopenCount: this._g.userPrefs?.anomalyDefaultValues?.reopenCount.getValue() || 1, - } - //this.anomalyDefaultValues.ignoreBug = this._g.userPrefs.anomalyDefaultValues.ignoreBug.getValue(); - - this.generalBoolSettings = [ - { text: 'Perform layout on changes', isEnable: false, path2userPref: 'isAutoIncrementalLayoutOnChange' }, - { text: 'Emphasize on hover', isEnable: false, path2userPref: 'isHighlightOnHover' }, - { text: 'Show overview window', isEnable: false, path2userPref: 'isShowOverviewWindow' }, - { text: 'Show edge labels', isEnable: false, path2userPref: 'isShowEdgeLabels' }, - { text: 'Ignore case in text operations', isEnable: false, path2userPref: 'isIgnoreCaseInText' }, - { text: 'Show results of latest query only', isEnable: false, path2userPref: 'isOnlyHighlight4LatestQuery' }, - { text: 'Collapse multiple edges based on type', isEnable: false, path2userPref: 'isCollapseEdgesBasedOnType' }, - { text: 'Collapse multiple edges on load', isEnable: false, path2userPref: 'isCollapseMultiEdgesOnLoad' }, - { text: 'Tile disconnected nodes on layout', isEnable: true, path2userPref: 'isTileDisconnectedOnLayout' }, - ]; - - this.timebarBoolSettings = [ - { text: 'Show timebar', isEnable: false, path2userPref: 'timebar.isEnabled' }, - { text: 'Hide disconnected nodes on animation', isEnable: false, path2userPref: 'timebar.isHideDisconnectedNodesOnAnim' }, - { text: 'Maintain graph range on topology changes', isEnable: false, path2userPref: 'timebar.isMaintainGraphRange' } - ]; - - this.isInit = true; - - this.tabChangeSubs = this._g.operationTabChanged.subscribe(x => { - if (x == 3) { // check if my tab is opened - this.fillUIFromMemory(); - } - }); - } - - ngOnDestroy(): void { - if (this.loadFromFileSubs) { - this.loadFromFileSubs.unsubscribe(); - } - if (this.tabChangeSubs) { - this.tabChangeSubs.unsubscribe(); - } - } - - private fillUIFromMemory() { - this.anomalyDefaultValues = { - ignoreBug: this._g.userPrefs?.anomalyDefaultValues?.ignoreBug.getValue() || 1, - assigneeChangeCount: this._g.userPrefs?.anomalyDefaultValues?.assigneeChangeCount.getValue() || 1, - reopenCount: this._g.userPrefs?.anomalyDefaultValues?.reopenCount.getValue() || 1, - } - // reference variables for shorter text - const up = this._g.userPrefs; - const up_t = this._g.userPrefs.timebar; - - this.generalBoolSettings[0].isEnable = up.isAutoIncrementalLayoutOnChange.getValue(); - this.generalBoolSettings[1].isEnable = up.isHighlightOnHover.getValue(); - this.generalBoolSettings[2].isEnable = up.isShowOverviewWindow.getValue(); - this.generalBoolSettings[3].isEnable = up.isShowEdgeLabels.getValue(); - this.generalBoolSettings[4].isEnable = up.isIgnoreCaseInText.getValue(); - this.generalBoolSettings[5].isEnable = up.isOnlyHighlight4LatestQuery.getValue(); - this.generalBoolSettings[6].isEnable = up.isCollapseEdgesBasedOnType.getValue(); - this.generalBoolSettings[7].isEnable = up.isCollapseMultiEdgesOnLoad.getValue(); - this.generalBoolSettings[8].isEnable = up.isTileDisconnectedOnLayout.getValue(); - - this.nodeLabelWrap = up.nodeLabelWrap.getValue(); - this.mergedElemIndicator = up.mergedElemIndicator.getValue(); - this.groupingOption = up.groupingOption.getValue(); - this.dataPageSize = up.dataPageSize.getValue(); - this.dataPageLimit = up.dataPageLimit.getValue(); - this.queryNeighborLimit = up.queryNeighborLimit.getValue(); - this.queryHistoryLimit = up.queryHistoryLimit.getValue(); - this.dbTimeout = up.dbTimeout.getValue(); - this.tableColumnLimit = up.tableColumnLimit.getValue(); - this.edgeCollapseLimit = up.edgeCollapseLimit.getValue(); - this.currHighlightStyles = up.highlightStyles.map((_, i) => 'Style ' + (i + 1)); - this.highlightStyleIdx = up.currHighlightIdx.getValue(); - this.highlightColor = up.highlightStyles[this._g.userPrefs.currHighlightIdx.getValue()].color.getValue(); - this.highlightWidth = up.highlightStyles[this._g.userPrefs.currHighlightIdx.getValue()].wid.getValue(); - this.selectionColor = up.selectionColor.getValue(); - this.selectionWidth = up.selectionWidth.getValue(); - this._g.cy.style().selector('core').style({ 'selection-box-color': this.selectionColor }); - this.compoundPadding = up.compoundPadding.getValue(); - this.isStoreUserProfile = up.isStoreUserProfile.getValue(); - this.graphInclusionType = up.objectInclusionType.getValue(); - this.queryResultPagination = up.queryResultPagination.getValue(); - - this.timebarBoolSettings[0].isEnable = up_t.isEnabled.getValue(); - this.timebarBoolSettings[1].isEnable = up_t.isHideDisconnectedNodesOnAnim.getValue(); - this.timebarBoolSettings[2].isEnable = up_t.isMaintainGraphRange.getValue(); - this.timebarPlayingStep = up_t.playingStep.getValue(); - this.timebarPlayingPeriod = up_t.playingPeriod.getValue(); - this.timebarZoomingStep = up_t.zoomingStep.getValue(); - this.statsInclusionType = up_t.statsInclusionType.getValue(); - - this.setHighlightStyles(); - this.highlightStyleSelected(this._g.userPrefs.currHighlightIdx.getValue()); - } - - private setHighlightStyles() { - if (!this._g.viewUtils) { - return; - } - this.currHighlightStyles = []; - let styles = this._g.viewUtils.getHighlightStyles(); - for (let i = 0; i < styles.length; i++) { - this.currHighlightStyles.push('Style ' + (i + 1)); - let c = styles[i].node['overlay-color']; - let w = styles[i].node['overlay-padding']; - if (this._g.userPrefs.highlightStyles[i]) { - this._g.userPrefs.highlightStyles[i].color.next(c); - this._g.userPrefs.highlightStyles[i].wid.next(w); - } else { - this._g.userPrefs.highlightStyles[i] = { wid: new BehaviorSubject(w), color: new BehaviorSubject(c) }; - } - } - this._g.userPrefs.highlightStyles.splice(styles.length); - this._profile.saveUserPrefs(); - } - - // set view utils extension highlight styles from memory (_g.userPrefs) - private setViewUtilsStyle() { - const styles = this._g.userPrefs.highlightStyles; - let vuStyles = this._g.viewUtils.getHighlightStyles(); - for (let i = 0; i < vuStyles.length; i++) { - let cyStyle = getCyStyleFromColorAndWid(styles[i].color.getValue(), styles[i].wid.getValue()); - this._g.viewUtils.changeHighlightStyle(i, cyStyle.node, cyStyle.edge); - } - for (let i = vuStyles.length; i < styles.length; i++) { - let cyStyle = getCyStyleFromColorAndWid(styles[i].color.getValue(), this.highlightWidth); - this._g.viewUtils.addHighlightStyle(cyStyle.node, cyStyle.edge); - } - } - settingAnomalyChanged(val: any, userPref: string) { - let path = userPref.split('.'); - let obj = this._g.userPrefs[path[0]]; - for (let i = 1; i < path.length; i++) { - obj = obj[path[i]]; - } - obj.next(val); - this._profile.saveUserPrefs(); - const cb = (x) => { - } - let cql = ""; - if (userPref == "anomalyDefaultValues.ignoreBug") { - cql = `MATCH (n:Issue) - SET n.anomalyCount = CASE - WHEN 'Ignored bug' IN n.anomalyList THEN n.anomalyCount - 1 - ELSE n.anomalyCount - END, - n.anomalyList = [x IN n.anomalyList WHERE x <> 'Ignored bug'] - WITH n - WHERE n.history IS NOT NULL AND size(n.history) >= 2 - WITH n, range(0, size(n.history)-2) as index_range - UNWIND index_range as i - WITH n, i, toInteger(n.history[i]) as fromMillis, toInteger(n.history[i+1]) as toMillis\ - WITH n, i, datetime({epochMillis: fromMillis}) as from, datetime({epochMillis: toMillis}) as to\ - WHERE duration.between(from, to).months > ${val} - WITH DISTINCT n - SET n.anomalyList = coalesce(n.anomalyList, []) + ['Ignored bug'], n.anomalyCount = coalesce(n.anomalyCount, 0) + 1 - RETURN n.name as name , ID(n) as id order by n.name`; - } - else if (userPref == "anomalyDefaultValues.assigneeChangeCount") { - cql = ` MATCH (n:Issue) - SET n.anomalyCount = CASE - WHEN 'Reassignment of Bug Assignee' IN n.anomalyList THEN n.anomalyCount - 1 - ELSE n.anomalyCount - END, - n.anomalyList = [x IN n.anomalyList WHERE x <> 'Reassignment of Bug Assignee'] - WITH n WHERE n.assigneeChangeCount>=${val} - SET n.anomalyList = coalesce(n.anomalyList, []) + [ 'Reassignment of Bug Assignee'] , n.anomalyCount = coalesce(n.anomalyCount, 0) + 1 - RETURN n.name as name , ID(n) as id order by n.name`; - } - else if (userPref == "anomalyDefaultValues.reopenCount") { - cql = `MATCH (n:Issue) - SET n.anomalyCount = CASE - WHEN 'Closed reopen ping pong' IN n.anomalyList THEN n.anomalyCount - 1 - ELSE n.anomalyCount - END, - n.anomalyList = [x IN n.anomalyList WHERE x <> 'Closed reopen ping pong'] - WITH n - WHERE n.reopenCount>=${val} - SET n.anomalyList = coalesce(n.anomalyList, []) + ['Closed reopen ping pong'] , n.anomalyCount = coalesce(n.anomalyCount, 0) + 1 - RETURN n.name as name , ID(n) as id order by n.name`; - } - - this._dbService.runQueryWithoutTimeBoxed(cql, cb, DbResponseType.table); - - } - - settingChanged(val: any, userPref: string) { - let path = userPref.split('.'); - let obj = this._g.userPrefs[path[0]]; - for (let i = 1; i < path.length; i++) { - obj = obj[path[i]]; - } - obj.next(val); - this._profile.saveUserPrefs(); - } - onColorSelected(c: string) { - this.highlightColor = c; - } - - onSelColorSelected(c: string) { - this._g.userPrefs.selectionColor.next(c); - this.selectionColor = c; - this._g.cy.style().selector('core').style({ 'selection-box-color': this.selectionColor }); - this._g.cy.style().selector(':selected').style({ 'overlay-color': this.selectionColor }).update(); - this._profile.saveUserPrefs(); - } - - onSelWidSelected(w) { - let width = parseFloat(w.target.value); - if (Number(width)) { - if (width < 0) - width = 1; - else if (width > 20) - width = 20; - this._g.userPrefs.selectionWidth.next(width); - this.selectionWidth = width; - this._g.cy.style().selector(':selected').style({ 'overlay-padding': width }) - .selector('edge:selected') - .style({ - 'overlay-padding': (e) => { - return (width + e.width()) / 2 + 'px'; - }, - }).update(); - this._profile.saveUserPrefs(); - } - else { - this._g.userPrefs.selectionWidth.next(1); - this.selectionWidth = this._g.userPrefs.selectionWidth.getValue(); - w.target.valueAsNumber = this.selectionWidth; - } - } - - // used to change border width or color. One of them should be defined. (exclusively) - changeHighlightStyle() { - this.bandPassHighlightWidth(); - let cyStyle = getCyStyleFromColorAndWid(this.highlightColor, this.highlightWidth); - this._g.viewUtils.changeHighlightStyle(this.highlightStyleIdx, cyStyle.node, cyStyle.edge); - this.setHighlightStyles(); - this._g.updateSelectionCyStyle(); - } - - deleteHighlightStyle() { - if (this._g.viewUtils.getAllHighlightClasses().length < 2) { - return; - } - this._g.viewUtils.removeHighlightStyle(this.highlightStyleIdx); - this.setHighlightStyles(); - let styleCnt = this._g.viewUtils.getAllHighlightClasses().length - 1; - if (this.highlightStyleIdx > styleCnt) { - this.highlightStyleIdx = styleCnt; - } - this.highlightStyleSelected(this.highlightStyleIdx); - } - addHighlightStyle() { - this.bandPassHighlightWidth(); - let cyStyle = getCyStyleFromColorAndWid(this.highlightColor, this.highlightWidth); - this._g.viewUtils.addHighlightStyle(cyStyle.node, cyStyle.edge); - this.setHighlightStyles(); - this.highlightStyleIdx = this.currHighlightStyles.length - 1; - this.highlightStyleSelected(this.highlightStyleIdx); - this._g.updateSelectionCyStyle(); - } - - - highlightStyleSelected(t: EventTarget | number) { - let i = 0; - if (typeof t == 'number') { - i = t; - } else { - i = (t).selectedIndex; - } - this.highlightStyleIdx = i; - this._g.userPrefs.currHighlightIdx.next(i); - let style = this._g.viewUtils.getHighlightStyles()[i]; - this.highlightColor = style.node['overlay-color']; - this.highlightWidth = style.node['overlay-padding']; - this._profile.saveUserPrefs(); - } - - bandPassHighlightWidth() { - if (this.highlightWidth < MIN_HIGHTLIGHT_WIDTH) { - this.highlightWidth = MIN_HIGHTLIGHT_WIDTH; - } - if (this.highlightWidth > MAX_HIGHTLIGHT_WIDTH) { - this.highlightWidth = MAX_HIGHTLIGHT_WIDTH; - } - } - - resetGeneralSettings() { - this.transferSubjectValues(this._g.userPrefsFromFiles, this._g.userPrefs, 'timebar'); - this.setViewUtilsStyle(); - this.fillUIFromMemory(); - this._g.updateSelectionCyStyle(); - } - - resetTimebarSettings() { - this.transferSubjectValues(this._g.userPrefsFromFiles.timebar, this._g.userPrefs.timebar); - this.fillUIFromMemory(); - } - - private transferSubjectValues(from, to, skip = null) { - for (const k in from) { - if (skip && k == skip) { - continue; - } - let p1 = from[k]; - let p2 = to[k]; - if (p1 instanceof BehaviorSubject) { - (p2 as BehaviorSubject).next((p1 as BehaviorSubject).getValue()); - } else { - this.transferSubjectValues(p1, p2); - } - } - } -} diff --git a/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.css b/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.css deleted file mode 100644 index 4ddb7aff..00000000 --- a/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.css +++ /dev/null @@ -1,15 +0,0 @@ -img { - width: 16px; - height: 16px; - cursor: pointer; -} - -.timebar-metric-name { - cursor: pointer; -} - - -.name-inp { - padding: 1%; - width: min-content; -} diff --git a/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.html b/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.html deleted file mode 100644 index 4a94cc81..00000000 --- a/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.html +++ /dev/null @@ -1,70 +0,0 @@ - - -
- -
- -
-
- {{r.name}}  - -
-
-
-
- new  -
-
-
- -
- -
- - - - - -
- -
- - Get {{selectedClass}} where:  - - -
- -
- - - -
- - -
-
- - -
-
- -
-
-
-
\ No newline at end of file diff --git a/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.ts b/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.ts deleted file mode 100644 index f723d0eb..00000000 --- a/src/app/visuall/operation-tabs/settings-tab/timebar-metric-editor/timebar-metric-editor.component.ts +++ /dev/null @@ -1,406 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ClassOption, TimebarMetric, Rule, RuleSync, getBoolExpressionFromMetric, RuleNode, deepCopyTimebarMetric, isSumRule } from '../../map-tab/query-types'; -import { COLLAPSED_EDGE_CLASS, GENERIC_TYPE } from '../../../constants'; -import { TimebarService } from '../../../timebar.service'; -import { UserProfileService } from '../../../user-profile.service'; -import { Subject, Subscription } from 'rxjs'; -import { GlobalVariableService } from '../../../global-variable.service'; -import { CustomizationModule } from '../../../../custom/customization.module'; - -@Component({ - selector: 'app-timebar-metric-editor', - templateUrl: './timebar-metric-editor.component.html', - styleUrls: ['./timebar-metric-editor.component.css'] -}) -export class TimebarMetricEditorComponent implements OnInit, OnDestroy { - - private editingIdx = -1; - classOptions: ClassOption[]; - selectedClassProps: string[]; - selectedClass: string; - filteringRule: TimebarMetric; - currMetrics: TimebarMetric[]; - currMetricName: string = 'new'; - currMetricColor: string = null; - isAClassSelectedForMetric = false; - newStatBtnTxt = 'Add'; - isHideEditing = true; - isAddingNew = false; - isGenericTypeSelected = true; - currProperties: Subject = new Subject(); - editingPropertyRule: Rule; - currRuleNode: RuleNode; - isShowPropertyRule = true; - editedRuleNode: Subject = new Subject(); - loadFromFileSubs: Subscription; - dataPageSizeSubs: Subscription; - appDescSubs: Subscription; - dataModelSubs: Subscription; - - constructor(private _g: GlobalVariableService, private _timeBarService: TimebarService, private _profile: UserProfileService) { - this.classOptions = []; - this.selectedClassProps = []; - this.filteringRule = null - - this.currMetrics = CustomizationModule.defaultTimebarMetrics; - - this.setCurrMetricsFromLocalStorage(); - this.setFnsForMetrics(); - this._timeBarService.shownMetrics.next(this.currMetrics); - - this.loadFromFileSubs = this._profile.onLoadFromFile.subscribe(x => { - if (!x) { - return; - } - this.setCurrMetricsFromLocalStorage(); - }); - } - - ngOnInit() { - this.appDescSubs = this._g.appDescription.subscribe(x => { - if (x) { - this.dataModelSubs = this._g.dataModel.subscribe(x2 => { - if (x2) { - this.classOptions.push({ text: GENERIC_TYPE.ANY_CLASS, isDisabled: false }); - this.classOptions.push({ text: GENERIC_TYPE.NODES_CLASS, isDisabled: false }); - - for (const key in x2.nodes) { - this.classOptions.push({ text: key, isDisabled: false }); - if (this.selectedClassProps.length == 0) { - this.selectedClassProps = Object.keys(x2.nodes[key]); - } - } - - this.classOptions.push({ text: GENERIC_TYPE.EDGES_CLASS, isDisabled: false }); - for (const key in x2.edges) { - this.classOptions.push({ text: key, isDisabled: false }); - } - this.clearInput(); - } - }, this.errFn.bind(this)); - } - }, this.errFn.bind(this)); - } - - private errFn(e) { - this._g.showErrorModal('Timebar Statistic', e); - } - - ngOnDestroy(): void { - if (this.loadFromFileSubs) { - this.loadFromFileSubs.unsubscribe(); - } - if (this.appDescSubs) { - this.appDescSubs.unsubscribe(); - } - if (this.dataModelSubs) { - this.dataModelSubs.unsubscribe(); - } - } - - initRules(s: 'AND' | 'OR' | 'C') { - this.editingPropertyRule = null; - const p = this._g.dataModel.getValue(); - const isEdge = p.edges[this.selectedClass] != undefined; - if (!this.currMetricName) { - this.currMetricName = ''; - } - if (s == 'AND' || s == 'OR') { - this.filteringRule = { rules: { r: { ruleOperator: s }, children: [], parent: null }, name: this.currMetricName, incrementFn: null, isEdge: isEdge, className: this.selectedClass, color: this.currMetricColor }; - } else if (s == 'C') { - this.filteringRule = { rules: { r: null, children: [], parent: null }, name: this.currMetricName, incrementFn: null, isEdge: isEdge, className: this.selectedClass, color: this.currMetricColor }; - } - this.currRuleNode = this.filteringRule.rules; - this.changeSelectedClass(); - } - - getStyleForMetric(m: TimebarMetric) { - if (m.isEditing) { - return { 'background-color': '#eaeaea' }; - } - return { 'background-color': `rgba(${m.color.slice(1, 3)}, ${m.color.slice(3, 5)}, ${m.color.slice(5, 7)}, 0.5)` } - } - - changeSelectedClass() { - const txt = this.selectedClass; - const p = this._g.dataModel.getValue(); - let isNodeClassSelected: boolean = p.nodes.hasOwnProperty(txt); - let isEdgeClassSelected: boolean = p.edges.hasOwnProperty(txt); - this.selectedClassProps.length = 0; - this.selectedClassProps.push(GENERIC_TYPE.NOT_SELECTED); - - if (isNodeClassSelected) { - this.selectedClassProps.push(...Object.keys(p.nodes[txt])); - this.selectedClassProps.push(...this.getEdgeTypesRelated()); - this.isGenericTypeSelected = false; - } else if (isEdgeClassSelected) { - this.selectedClassProps.push(...Object.keys(p.edges[txt])); - this.isGenericTypeSelected = false; - } else { - this.isGenericTypeSelected = true; - } - setTimeout(() => { - this.currProperties.next({ properties: this.selectedClassProps, isGenericTypeSelected: false, selectedClass: this.selectedClass }); - }, 0); - } - - addRule2FilteringRules(r: Rule) { - if (r.propertyType == 'datetime') { - r.inputOperand = new Date(r.rawInput).toLocaleString(); - } - - this.filteringRule.name = this.currMetricName; - this.filteringRule.color = this.currMetricColor; - if (this.currRuleNode.r) { - if (this.currRuleNode.isEditing) { - this.currRuleNode.r = r; - this.editedRuleNode.next(this.currRuleNode); - } else { - this.currRuleNode.children.push({ r: r, children: [], parent: this.currRuleNode }); - } - } else { - // if "Condition" is clicked at the start - this.currRuleNode.r = r; - } - - this.putSumRule2Root(r); - this.isAClassSelectedForMetric = true; - this.isShowPropertyRule = r.ruleOperator !== null; - } - - showPropertyRule(e: { node: RuleNode, isEdit: boolean }) { - this.currRuleNode = e.node; - // means edit is clicked in rule tree - if (!e.isEdit) { - this.isShowPropertyRule = true; - this.changeSelectedClass(); - return; - } - this.isShowPropertyRule = false; - // let the UI for property rule re-rendered - setTimeout(() => { - this.isShowPropertyRule = e.node.isEditing; - this.changeSelectedClass(); - if (e.node.isEditing) { - this.editingPropertyRule = e.node.r; - } else { - this.editingPropertyRule = null; - } - }); - } - - newOperator(e: RuleNode) { - this.isShowPropertyRule = true; - this.currRuleNode = e; - } - - queryRuleDeleted() { - this.isAClassSelectedForMetric = false; - this.filteringRule.rules = null; - this.isShowPropertyRule = true; - } - - deleteMetric(i: number) { - if (this.currMetrics.length < 2) { - return; - } - this.currMetrics.splice(i, 1); - if (this.editingIdx == i) { - this.clearInput(); - } - this._profile.saveTimebarMetrics(this.currMetrics); - this.refreshTimebar(); - } - - editMetric(i: number) { - if (this.currMetrics[i].isEditing) { - this.isHideEditing = true; - this.editingIdx = -1; - this.currMetrics[i].isEditing = false; - this.clearInput(); - this.newStatBtnTxt = 'Add Statictic'; - this.isShowPropertyRule = true; - } else { - this.isShowPropertyRule = false; - this.clearEditingOnRules(); - this.isHideEditing = false; - this.isAddingNew = false; - this.editingIdx = i; - this.currMetrics[i].isEditing = true; - this.filteringRule = this.currMetrics[i]; - this.currRuleNode = this.filteringRule.rules; - this.currMetricName = this.currMetrics[i].name; - this.currMetricColor = this.currMetrics[i].color; - this.selectedClass = this.currMetrics[i].className; - this.changeSelectedClass(); - this.isAClassSelectedForMetric = true; - this.newStatBtnTxt = 'Update'; - } - } - - newMetricClick() { - this.isHideEditing = !this.isHideEditing; - this.isAddingNew = !this.isAddingNew; - if (this.isAddingNew) { - this.isHideEditing = false; - this.isShowPropertyRule = true; - } - if (!this.isHideEditing) { - this.clearInput(); - } - this.clearEditingOnRules(); - } - - addStat() { - this.isAClassSelectedForMetric = false; - if (!this.currMetricName || this.currMetricName.length < 2) { - this.currMetricName = 'new'; - } - this.filteringRule.name = this.currMetricName; - this.filteringRule.color = this.currMetricColor; - if (this.editingIdx != -1) { - this.currMetrics[this.editingIdx] = deepCopyTimebarMetric(this.filteringRule); - this.currMetrics[this.editingIdx].isEditing = false; - } else { - this.currMetrics.push(deepCopyTimebarMetric(this.filteringRule)); - } - this.isHideEditing = true; - this.isAddingNew = false; - - this._profile.saveTimebarMetrics(this.currMetrics); - this.setFnsForMetrics(); - this.refreshTimebar(); - this.clearInput(); - } - - colorSelected(c: string) { - this.currMetricColor = c; - } - - private setCurrMetricsFromLocalStorage() { - if (this._profile.isStoreProfile()) { - let storedMetrics = this._profile.getTimebarMetrics(); - for (const m of storedMetrics) { - this._profile.addParents(m.rules); - } - if (storedMetrics.length > 0) { - this.currMetrics = storedMetrics; - } - } - } - - private setFnsForMetrics() { - for (let m of this.currMetrics) { - let fnStr = getBoolExpressionFromMetric(m); - const isS = isSumRule(m.rules.r); - if (isS) { - const r = m.rules.r; - if (r.propertyType == 'edge') { - const collapsedEdges4Node = `x.connectedEdges('.${COLLAPSED_EDGE_CLASS}').map(x => x.data('collapsedEdges').filter('.${r.propertyOperand}')).reduce((x, y) => {return x.union(y)}, cy.collection())`; - fnStr += `return x.connectedEdges('.${r.propertyOperand}').union(${collapsedEdges4Node}).length;` - } else { - fnStr += `return x.data('${r.propertyOperand}');` - } - } else { - fnStr += `return 1;` - } - fnStr += ' return 0;' - m.incrementFn = new Function('x', fnStr) as (x: any) => number; - } - } - - private putSumRule2Root(r: Rule) { - const isSum = isSumRule(r); - if (!isSum) { - return; - } - - // if root is already a sum rule, replace the root - if (isSumRule(this.filteringRule.rules.r)) { - const newNode: RuleNode = { parent: null, children: this.filteringRule.rules.children, r: r }; - this.filteringRule.rules = newNode; - } else { // add sum rule as root - let idx = -1; - for (let i = 0; i < this.currRuleNode.children.length; i++) { - if (this.areRulesEqual(r, this.currRuleNode.children[i].r)) { - idx = i; - } - } - // remove rule from current - this.currRuleNode.children.splice(idx, 1); - const newNode: RuleNode = { parent: null, children: [this.filteringRule.rules], r: r }; - this.filteringRule.rules.parent = newNode; - this.filteringRule.rules = newNode; - } - this.clearEditingOnRules(); - } - - private areRulesEqual(a: Rule, b: Rule) { - // Create arrays of property names - const aProps = Object.getOwnPropertyNames(a); - - for (let i = 0; i < aProps.length; i++) { - const propName = aProps[i]; - if (a[propName] !== b[propName]) { - return false; - } - } - return true; - } - - private refreshTimebar() { - this._timeBarService.shownMetrics.next(this.currMetrics); - } - - private clearInput() { - this.filteringRule = null; - this.currMetricName = 'new'; - this.currMetricColor = this.getRandomColor(); - this.newStatBtnTxt = 'Add'; - this.editingIdx = -1; - this.selectedClass = this.classOptions[0].text; - this.isAClassSelectedForMetric = false; - this.changeSelectedClass(); - } - - private getRandomColor() { - const letters = '0123456789ABCDEF'; - let color = '#'; - for (let i = 0; i < 6; i++) { - color += letters[Math.floor(Math.random() * 16)]; - } - return color; - } - - private clearEditingOnRules() { - for (let m of this.currMetrics) { - m.isEditing = false; - this.clearAllEditings(m.rules); - } - this.editingIdx = -1; - } - - clearAllEditings(r: RuleNode) { - if (r === undefined || r === null) { - return; - } - r.isEditing = false; - for (const child of r.children) { - this.clearAllEditings(child); - } - } - - private getEdgeTypesRelated(): string[] { - let r: string[] = []; - const a = this._g.appDescription.getValue(); - const txt = this.selectedClass.toLowerCase(); - for (let k of Object.keys(a.relations)) { - const v = a.relations[k]; - if (v.source.toLowerCase() == txt || v.target.toLowerCase() == txt) { - r.push(k); - } - } - return r; - } - -} diff --git a/src/app/visuall/panel-container/panel-container.component.css b/src/app/visuall/panel-container/panel-container.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/panel-container/panel-container.component.html b/src/app/visuall/panel-container/panel-container.component.html deleted file mode 100644 index 6d5cbcb4..00000000 --- a/src/app/visuall/panel-container/panel-container.component.html +++ /dev/null @@ -1,11 +0,0 @@ -
- -
- -
-
- -
-
\ No newline at end of file diff --git a/src/app/visuall/panel-container/panel-container.component.ts b/src/app/visuall/panel-container/panel-container.component.ts deleted file mode 100644 index 46a796a5..00000000 --- a/src/app/visuall/panel-container/panel-container.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-panel-container', - templateUrl: './panel-container.component.html', - styleUrls: ['./panel-container.component.css'] -}) -export class PanelContainerComponent implements OnInit { - - constructor() { } - - @Input() panels: { component: any, text: string }[]; - @Input() containerId: string; - @Input() isOpen = false; - ngOnInit(): void { - } - toggleContainer() { - this.isOpen = !this.isOpen; - } - -} diff --git a/src/app/visuall/popups/about-modal/about-modal.component.css b/src/app/visuall/popups/about-modal/about-modal.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/popups/about-modal/about-modal.component.html b/src/app/visuall/popups/about-modal/about-modal.component.html deleted file mode 100644 index 642e90b5..00000000 --- a/src/app/visuall/popups/about-modal/about-modal.component.html +++ /dev/null @@ -1,22 +0,0 @@ - - - \ No newline at end of file diff --git a/src/app/visuall/popups/about-modal/about-modal.component.ts b/src/app/visuall/popups/about-modal/about-modal.component.ts deleted file mode 100644 index 45471c60..00000000 --- a/src/app/visuall/popups/about-modal/about-modal.component.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Component, OnInit, ViewChild, AfterViewChecked, ElementRef, OnDestroy } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { Subscription } from 'rxjs'; -import { GlobalVariableService } from '../../global-variable.service'; - -@Component({ - selector: 'app-about-modal', - templateUrl: './about-modal.component.html', - styleUrls: ['./about-modal.component.css'] -}) -export class AboutModalComponent implements OnInit, AfterViewChecked, OnDestroy { - @ViewChild('closeBtn', { static: false }) closeBtnRef: ElementRef; - toolName: string; - softwareVersion: string; - buildTime: string; - toolLogo: string; - companyName: string; - companyContact: string; - subs: Subscription; - - constructor(public activeModal: NgbActiveModal, private _g: GlobalVariableService) { } - - ngOnInit() { - this.subs = this._g.appDescription.subscribe(x => { - if (x) { - this.toolName = x.appInfo.name; - this.softwareVersion = x.appInfo.version; - this.toolLogo = x.appInfo.icon; - this.companyName = x.appInfo.company_name; - this.companyContact = x.appInfo.company_contact; - this.buildTime = x.appInfo.build_time; - } - }); - } - - ngAfterViewChecked() { - this.closeBtnRef.nativeElement.blur(); - } - - ngOnDestroy(): void { - if (this.subs) { - this.subs.unsubscribe(); - } - } -} diff --git a/src/app/visuall/popups/error-modal/error-modal.component.css b/src/app/visuall/popups/error-modal/error-modal.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/popups/error-modal/error-modal.component.html b/src/app/visuall/popups/error-modal/error-modal.component.html deleted file mode 100644 index 97dfe456..00000000 --- a/src/app/visuall/popups/error-modal/error-modal.component.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/app/visuall/popups/error-modal/error-modal.component.ts b/src/app/visuall/popups/error-modal/error-modal.component.ts deleted file mode 100644 index dbfc1fca..00000000 --- a/src/app/visuall/popups/error-modal/error-modal.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, OnInit, ViewChild, AfterViewChecked, ElementRef, Input } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -@Component({ - selector: 'app-error-modal', - templateUrl: './error-modal.component.html', - styleUrls: ['./error-modal.component.css'] -}) -export class ErrorModalComponent implements OnInit, AfterViewChecked { - @ViewChild('closeBtn', { static: false }) closeBtnRef: ElementRef; - @Input() msg: string; - @Input() title: string; - constructor(public activeModal: NgbActiveModal) { } - - ngOnInit() { - } - - ngAfterViewChecked() { - this.closeBtnRef.nativeElement.blur(); - } - -} diff --git a/src/app/visuall/popups/legend-modal/legend-modal.component.css b/src/app/visuall/popups/legend-modal/legend-modal.component.css deleted file mode 100644 index b2bc0a07..00000000 --- a/src/app/visuall/popups/legend-modal/legend-modal.component.css +++ /dev/null @@ -1,31 +0,0 @@ -.modal-header { - display: flex; - justify-content: space-between; - align-items: center; - } - - .modal-body { - padding: 20px; /* Adjust as needed */ - } - - .legend-container { - display: flex; - flex-direction: column; - justify-content: space-around; - } - - .legend-item { - text-align: center; - } - - - .legend-item2 img { - max-width: 100%; - margin-bottom: 10px; - } - - .legend-item1 img { - max-width: 70%; - margin-bottom: 10px; - } - \ No newline at end of file diff --git a/src/app/visuall/popups/legend-modal/legend-modal.component.html b/src/app/visuall/popups/legend-modal/legend-modal.component.html deleted file mode 100644 index c5c567e9..00000000 --- a/src/app/visuall/popups/legend-modal/legend-modal.component.html +++ /dev/null @@ -1,21 +0,0 @@ - - - \ No newline at end of file diff --git a/src/app/visuall/popups/legend-modal/legend-modal.component.ts b/src/app/visuall/popups/legend-modal/legend-modal.component.ts deleted file mode 100644 index d135f9c9..00000000 --- a/src/app/visuall/popups/legend-modal/legend-modal.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, ViewChild, AfterViewChecked, ElementRef } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'legend-modal', - templateUrl: './legend-modal.component.html', - styleUrls: ['./legend-modal.component.css'] -}) -export class LegendModalComponent implements AfterViewChecked { - @ViewChild('closeBtn', { static: false }) closeBtnRef: ElementRef; - - constructor(public activeModal: NgbActiveModal) { } - - ngAfterViewChecked() { - this.closeBtnRef.nativeElement.blur(); - } - -} diff --git a/src/app/visuall/popups/load-graph-from-file-modal/load-graph-from-file-modal.component.css b/src/app/visuall/popups/load-graph-from-file-modal/load-graph-from-file-modal.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/popups/load-graph-from-file-modal/load-graph-from-file-modal.component.html b/src/app/visuall/popups/load-graph-from-file-modal/load-graph-from-file-modal.component.html deleted file mode 100644 index 9206fc35..00000000 --- a/src/app/visuall/popups/load-graph-from-file-modal/load-graph-from-file-modal.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/app/visuall/popups/load-graph-from-file-modal/load-graph-from-file-modal.component.ts b/src/app/visuall/popups/load-graph-from-file-modal/load-graph-from-file-modal.component.ts deleted file mode 100644 index b488d1ff..00000000 --- a/src/app/visuall/popups/load-graph-from-file-modal/load-graph-from-file-modal.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AfterViewChecked, Component, ElementRef, Input, ViewChild } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { GlobalVariableService } from '../../global-variable.service'; - -@Component({ - selector: 'app-load-graph-from-file-modal', - templateUrl: './load-graph-from-file-modal.component.html', - styleUrls: ['./load-graph-from-file-modal.component.css'] -}) -export class LoadGraphFromFileModalComponent implements AfterViewChecked { - @Input() txt: string; - isOverrideExisting = true; - constructor(public activeModal: NgbActiveModal, public _g: GlobalVariableService) { } - @ViewChild('closeBtn', { static: false }) closeBtnRef: ElementRef; - - ngAfterViewChecked() { - this.closeBtnRef.nativeElement.blur(); - } - - replace() { - this._g.layout.clusters = null; - this._g.cy.remove(this._g.cy.$()); - try { - this._g.expandCollapseApi.loadJson(this.txt, this.isOverrideExisting); - this.activeModal.dismiss(); - } catch(e) { - this.activeModal.dismiss(); - this._g.showErrorModal('Load', 'Cannot process provided JSON file!'); - } - } - -} diff --git a/src/app/visuall/popups/project-about-modal/project-about-modal-component.css b/src/app/visuall/popups/project-about-modal/project-about-modal-component.css deleted file mode 100644 index f5446004..00000000 --- a/src/app/visuall/popups/project-about-modal/project-about-modal-component.css +++ /dev/null @@ -1,16 +0,0 @@ - -.statistics-row { - display: flex; - justify-content: space-between; - align-items: stretch; - align-content: flex-end; - flex-wrap: nowrap; - flex-direction: row; - margin-bottom: 1vh; - width: 80%; - margin-left: 20%; -} -.statistic { - width: 50%; - text-align: left; -} \ No newline at end of file diff --git a/src/app/visuall/popups/project-about-modal/project-about-modal-component.html b/src/app/visuall/popups/project-about-modal/project-about-modal-component.html deleted file mode 100644 index be97c664..00000000 --- a/src/app/visuall/popups/project-about-modal/project-about-modal-component.html +++ /dev/null @@ -1,60 +0,0 @@ - - - \ No newline at end of file diff --git a/src/app/visuall/popups/project-about-modal/project-about-modal-component.ts b/src/app/visuall/popups/project-about-modal/project-about-modal-component.ts deleted file mode 100644 index fc06bc74..00000000 --- a/src/app/visuall/popups/project-about-modal/project-about-modal-component.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Component,Input, OnInit, ViewChild, AfterViewChecked, ElementRef, OnDestroy } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Neo4jDb } from '../../db-service/neo4j-db.service'; -import { DbResponseType, GraphResponse } from 'src/app/visuall/db-service/data-types'; - -@Component({ - - selector: 'project-about-modal-component', - templateUrl: './project-about-modal-component.html', - styleUrls: ['./project-about-modal-component.css'] -}) - -export class ProjectAboutModalComponent implements OnInit, AfterViewChecked, OnDestroy { - @Input() modalConfig: any; - @ViewChild('closeBtn', { static: false }) closeBtnRef: ElementRef; - projectName: string; - githubUrl: string; - jiraUrl: string; - statistic:any; - - - constructor(public activeModal: NgbActiveModal, private http: HttpClient) { } - - ngOnInit() { - this.statistic =this.modalConfig; - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/getAuthentication" : - `http://${window.location.hostname}:4445/getAuthentication`; - this.http.get(url).subscribe(data => { - if (data) { - this.projectName = data["github"]["github_repo"]; - this.githubUrl = "https://github.com/" + data["github"]["github_repo"]; - this.jiraUrl = data["jira"]["jira_url"] + "/projects/" + data["jira"]["jira_key"]; - } - }); - } - ngAfterViewChecked() { - this.closeBtnRef.nativeElement.blur(); - } - - ngOnDestroy(): void { - } -} diff --git a/src/app/visuall/popups/quick-help-modal/quick-help-modal.component.css b/src/app/visuall/popups/quick-help-modal/quick-help-modal.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/popups/quick-help-modal/quick-help-modal.component.html b/src/app/visuall/popups/quick-help-modal/quick-help-modal.component.html deleted file mode 100644 index 390a2c8a..00000000 --- a/src/app/visuall/popups/quick-help-modal/quick-help-modal.component.html +++ /dev/null @@ -1,26 +0,0 @@ - - - \ No newline at end of file diff --git a/src/app/visuall/popups/quick-help-modal/quick-help-modal.component.ts b/src/app/visuall/popups/quick-help-modal/quick-help-modal.component.ts deleted file mode 100644 index 9d675af3..00000000 --- a/src/app/visuall/popups/quick-help-modal/quick-help-modal.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, ViewChild, AfterViewChecked, ElementRef } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'app-quick-help-modal', - templateUrl: './quick-help-modal.component.html', - styleUrls: ['./quick-help-modal.component.css'] -}) -export class QuickHelpModalComponent implements AfterViewChecked { - @ViewChild('closeBtn', { static: false }) closeBtnRef: ElementRef; - - constructor(public activeModal: NgbActiveModal) { } - - ngAfterViewChecked() { - this.closeBtnRef.nativeElement.blur(); - } - -} diff --git a/src/app/visuall/popups/save-as-png-modal/save-as-png-modal.component.css b/src/app/visuall/popups/save-as-png-modal/save-as-png-modal.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/popups/save-as-png-modal/save-as-png-modal.component.html b/src/app/visuall/popups/save-as-png-modal/save-as-png-modal.component.html deleted file mode 100644 index efbaa545..00000000 --- a/src/app/visuall/popups/save-as-png-modal/save-as-png-modal.component.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/app/visuall/popups/save-as-png-modal/save-as-png-modal.component.ts b/src/app/visuall/popups/save-as-png-modal/save-as-png-modal.component.ts deleted file mode 100644 index 4dfef79c..00000000 --- a/src/app/visuall/popups/save-as-png-modal/save-as-png-modal.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component, ViewChild, AfterViewChecked, ElementRef } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { CytoscapeService } from '../../cytoscape.service'; - -@Component({ - selector: 'app-save-as-png-modal', - templateUrl: './save-as-png-modal.component.html', - styleUrls: ['./save-as-png-modal.component.css'] -}) -export class SaveAsPngModalComponent implements AfterViewChecked { - png : any; - constructor(public activeModal: NgbActiveModal, public _cyService: CytoscapeService) { - - } - @ViewChild('closeBtn', { static: false }) closeBtnRef: ElementRef; - - ngAfterViewChecked() { - this.closeBtnRef.nativeElement.blur(); - } - - saveWhole() { - this.png = this._cyService.saveAsPng(true); - this.activeModal.dismiss(); - } - - saveViewable() { - this._cyService.saveAsPng(false); - this.activeModal.dismiss(); - } - -} diff --git a/src/app/visuall/popups/save-profile-modal/save-profile-modal.component.css b/src/app/visuall/popups/save-profile-modal/save-profile-modal.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/visuall/popups/save-profile-modal/save-profile-modal.component.html b/src/app/visuall/popups/save-profile-modal/save-profile-modal.component.html deleted file mode 100644 index 53173af3..00000000 --- a/src/app/visuall/popups/save-profile-modal/save-profile-modal.component.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/app/visuall/popups/save-profile-modal/save-profile-modal.component.ts b/src/app/visuall/popups/save-profile-modal/save-profile-modal.component.ts deleted file mode 100644 index 1378d487..00000000 --- a/src/app/visuall/popups/save-profile-modal/save-profile-modal.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, ViewChild, AfterViewChecked, ElementRef } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { UserProfileService } from '../../user-profile.service'; - -@Component({ - selector: 'app-save-profile-modal', - templateUrl: './save-profile-modal.component.html', - styleUrls: ['./save-profile-modal.component.css'] -}) -export class SaveProfileModalComponent implements AfterViewChecked { - - constructor(public activeModal: NgbActiveModal, private _profile: UserProfileService) { } - @ViewChild('closeBtn', { static: false }) closeBtnRef: ElementRef; - boolSettings = [ - { - text: 'Settings', isEnable: true - }, - { - text: 'Filtering rules', isEnable: true - }, - { - text: 'Timebar statistics', isEnable: true - } - ]; - - ngAfterViewChecked() { - this.closeBtnRef.nativeElement.blur(); - } - - save2File() { - this._profile.downloadProfileAsFile(...this.boolSettings.map(x => x.isEnable)); - this.activeModal.dismiss(); - } -} \ No newline at end of file diff --git a/src/app/visuall/property-rule/property-rule.component.css b/src/app/visuall/property-rule/property-rule.component.css deleted file mode 100644 index 43eb361d..00000000 --- a/src/app/visuall/property-rule/property-rule.component.css +++ /dev/null @@ -1,35 +0,0 @@ -img { - width: 16px; - height: 16px; - cursor: pointer; -} - -.draggable-content { - z-index: 1001 !important; - position: absolute; - background: rgba(255, 255, 255, 0.90); - white-space: pre-wrap; - border: 2px solid #555555; - border-radius: 5px; - overflow: hidden; - height: auto; -} - -textarea { - width: 100%; - height: 100%; - resize: none !important; -} - -input, -select { - display: inline; -} - -.modal-header { - cursor: move; -} - -select[multiple] { - max-height: 200px; -} diff --git a/src/app/visuall/property-rule/property-rule.component.html b/src/app/visuall/property-rule/property-rule.component.html deleted file mode 100644 index 93f03258..00000000 --- a/src/app/visuall/property-rule/property-rule.component.html +++ /dev/null @@ -1,79 +0,0 @@ -
-
- -
- -
- -
- -
-
- -
-
- -
-
- -
-
- -
- -
-
-
-
- -
- - -
-
- - - - - - - - -
-
- - -
-
-
\ No newline at end of file diff --git a/src/app/visuall/property-rule/property-rule.component.ts b/src/app/visuall/property-rule/property-rule.component.ts deleted file mode 100644 index 9f58e017..00000000 --- a/src/app/visuall/property-rule/property-rule.component.ts +++ /dev/null @@ -1,408 +0,0 @@ -import { Component, OnInit, Output, EventEmitter, Input, ViewChild, ElementRef, HostListener } from '@angular/core'; -import { TEXT_OPERATORS, NUMBER_OPERATORS, LIST_OPERATORS, ENUM_OPERATORS, GENERIC_TYPE, isNumber, DATETIME_OPERATORS } from '../constants'; -import flatpickr from 'flatpickr'; -import { PropertyCategory, Rule, RuleSync } from '../operation-tabs/map-tab/query-types'; -import { BehaviorSubject, Subject, Subscription } from 'rxjs'; -import { IPosition } from 'angular2-draggable'; -import { GlobalVariableService } from '../global-variable.service'; -import { UserProfileService } from '../user-profile.service'; - -@Component({ - selector: 'app-property-rule', - templateUrl: './property-rule.component.html', - styleUrls: ['./property-rule.component.css'] -}) -export class PropertyRuleComponent implements OnInit { - private attributeType: string; - private readonly NO_OPERATION = 'no_op'; - private operators: any; - private readonly NOT_SELECTED = '───'; - private readonly ONE_OF = 'one of'; - - selectedProp: string; - isGenericTypeSelected = true; - selectedClassProps: string[]; - selectedOperatorKey: string; - operatorKeys: string[]; - selectedPropertyCategory: PropertyCategory; - filterInp: string; - optInp: string; - textAreaInp: string = ''; - finiteSetPropertyMap: any = null; - selectedClass: string; - currInpType: string = 'text'; - @Input() propertyChanged: Subject; - @Input() loadRule: Rule; - @Input() isStrict: boolean; - @Input() refreshView: Subject; - @Output() onRuleReady = new EventEmitter(); - @ViewChild('dateInp', { static: false }) dateInp: ElementRef; - @ViewChild('multiSelect', { static: false }) multiSelect: ElementRef; - isShowTxtArea = false; - txtAreaSize: { width: number, height: number } = { width: 350, height: 250 }; - position: IPosition = { x: 0, y: 0 }; - propChangeSubs: Subscription; - option2selected = {}; - currListName = 'New List'; - fittingSavedLists: string[] = []; - currSelectedList: string; - - constructor(private _g: GlobalVariableService, private _profile: UserProfileService) { } - - ngOnInit() { - this.propChangeSubs = this.propertyChanged.subscribe(x => { this.updateView(x.properties, x.isGenericTypeSelected, x.selectedClass) }); - } - - ngOnDestroy() { - if (this.propChangeSubs) { - this.propChangeSubs.unsubscribe(); - } - } - - updateView(props: string[], isGeneric: boolean, cName: string) { - this.selectedClassProps = props; - this.isGenericTypeSelected = isGeneric; - this.selectedClass = cName; - this.filterInp = ''; - this.selectedProp = null; - this.selectedOperatorKey = null; - - if (this.loadRule) { - this.filterInp = this.loadRule.inputOperand; - this.selectedProp = this.loadRule.propertyOperand; - // will set the operators according to selected property - this.changeSelectedProp(this.filterInp, this.loadRule.rawInput); - for (const opKey in this.operators) { - if (this.operators[opKey] == this.loadRule.operator) { - this.selectedOperatorKey = opKey; - } - } - } else { - this.changeSelectedProp(); - } - if (this.selectedOperatorKey === this.ONE_OF) { - this.currInpType = 'text'; - } - } - - changeSelectedProp(filterInp = '', unixDateValue = null) { - const model = this._g.dataModel.getValue(); - this.textAreaInp = ''; - this.selectedOperatorKey = null; - this.filterInp = filterInp; - let attrType = undefined; - if (model.nodes[this.selectedClass]) { - attrType = model.nodes[this.selectedClass][this.selectedProp]; - } else if (model.edges[this.selectedClass]) { - attrType = model.edges[this.selectedClass][this.selectedProp]; - } - if (model.edges[this.selectedProp]) { - attrType = 'edge'; - } - this.attributeType = attrType; - this.operators = {}; - this.operatorKeys = []; - this.selectedPropertyCategory = this.getPropertyCategory(); - - this.operators[this.NO_OPERATION] = this.NO_OPERATION; - this.operatorKeys.push(this.NOT_SELECTED); - if (!attrType) { - return; - } - if (attrType == 'string') { - this.currInpType = 'text'; - this.addOperators(TEXT_OPERATORS); - } else if (attrType == 'float' || attrType == 'int' || attrType == 'edge') { - this.currInpType = 'number'; - this.addOperators(NUMBER_OPERATORS); - } else if (attrType == 'list') { - this.addOperators(LIST_OPERATORS); - this.currInpType = 'text'; - } else if (attrType.startsWith('enum')) { - this.addOperators(ENUM_OPERATORS); - } else if (attrType == 'datetime') { - this.addOperators(DATETIME_OPERATORS); - let opt = { - defaultDate: new Date(), enableTime: true, enableSeconds: true, time_24hr: true, - minDate: this._g.userPrefs.dbQueryTimeRange.start.getValue(), - maxDate: this._g.userPrefs.dbQueryTimeRange.end.getValue(), - }; - if (unixDateValue) { - opt.defaultDate = new Date(unixDateValue); - } - - // view child gives undefined - setTimeout(() => { - flatpickr(this.dateInp.nativeElement, opt); - }, 0); - } - } - - isNumberProperty(): boolean { - const model = this._g.dataModel.getValue(); - let attrType = undefined; - if (model.nodes[this.selectedClass]) { - attrType = model.nodes[this.selectedClass][this.selectedProp]; - } else if (model.edges[this.selectedClass]) { - attrType = model.edges[this.selectedClass][this.selectedProp]; - } - if (model.edges[this.selectedProp]) { - attrType = 'edge'; - } - return attrType == 'float' || attrType == 'int' || attrType == 'edge'; - } - - @HostListener('document:keydown.enter', ['$event']) - onAddRuleClick(event: MouseEvent) { - // do not enter rule with keyboard shortcut if we are showing text area for 'one of' - if (event && this.isShowTxtArea) { - return; - } - const attribute = this.selectedProp; - let value: any = this.filterInp; - let rawValue: any = this.filterInp; - - let operator = this.operators[this.selectedOperatorKey]; - let atType = this.attributeType; - if (atType && atType.startsWith('enum')) { - atType = atType.substr(atType.indexOf(',') + 1); - } - - if (atType == 'datetime') { - value = this.dateInp.nativeElement['_flatpickr'].selectedDates[0].getTime(); - rawValue = value; - } else if (atType == 'int') { - value = parseInt(value); - } else if (atType == 'float') { - value = parseFloat(value); - } - - if (this.selectedOperatorKey === this.ONE_OF) { - value = this.filterInp; - } - - let mapped = undefined; - if (this.finiteSetPropertyMap) { - const o = this.finiteSetPropertyMap.find(x => x.key == this.filterInp); - if (o) { - mapped = o.value; - } - if (this.selectedOperatorKey === this.ONE_OF) { - mapped = ''; - const arr = this.filterInp.split(','); - for (const el of arr) { - const o = this.finiteSetPropertyMap.find(x => x.key == el); - if (o) { - mapped += o.value + ','; - } - } - const strSize = mapped.length; - if (strSize > 0 && mapped[strSize - 1] === ',') { - mapped = mapped.substr(0, strSize - 1); - } - } - } - if (Number.isNaN(value)) { - value = ''; - } - const rule: Rule = { - propertyOperand: attribute, - propertyType: atType, - rawInput: rawValue, - inputOperand: value, - ruleOperator: null, - operator: operator, - enumMapping: mapped - }; - const isOk = this.isStrictlyValid(rule); - if (this.isStrict && !isOk) { - this._g.showErrorModal('Error', 'Invalid Rule!'); - return; - } - this.onRuleReady.emit(rule); - } - - filterInpClicked() { - if (this.selectedOperatorKey != this.ONE_OF || this.isShowTxtArea) { - return; - } - if (this.position.x == 0 && this.position.y == 0) { - this.position = { x: -130, y: 0 }; - } - this.isShowTxtArea = true; - this.currListName = 'New list'; - this.currSelectedList = null; - this.fillFittingSavedLists(); - this.currInpType = 'text'; - if (typeof this.filterInp !== 'string') { - this.filterInp = '' + this.filterInp; - } - if (this.selectedPropertyCategory == PropertyCategory.finiteSet) { - const arr = this.filterInp.split(','); - for (const o of this.finiteSetPropertyMap) { - this.option2selected[o.key] = arr.includes(o.key); - } - } else { - this.textAreaInp = this.filterInp.split(',').join('\n'); - } - } - - optSelected() { - this.filterInp = this.optInp; - } - - txtAreaPopupOk() { - if (this.selectedOperatorKey == this.ONE_OF && this.selectedPropertyCategory == PropertyCategory.finiteSet) { - const selectedOptions = [...this.multiSelect.nativeElement.querySelectorAll('option')].filter(x => x.selected).map(x => x.value); - this.filterInp = selectedOptions.join(','); - } else { - this.filterInp = this.textAreaInp.trim().split('\n').join(','); - } - this.isShowTxtArea = false; - } - - txtAreaPopupCancel() { - this.textAreaInp = this.filterInp.split(',').join('\n'); - this.isShowTxtArea = false; - } - - onMoveEnd(e) { - this.position = e; - } - - onResizeStop(e) { - this.txtAreaSize = e.size; - } - - saveCurrList() { - let selectedOptions = this.textAreaInp.split('\n').map(x => new BehaviorSubject(x)); - if (this.selectedPropertyCategory == PropertyCategory.finiteSet) { - selectedOptions = [...this.multiSelect.nativeElement.querySelectorAll('option')].filter(x => x.selected).map(x => new BehaviorSubject(x.value)); - } - const isNum = this.isNumberProperty(); - // the button to fire this function will only be visible when operator is 'one of' - let theLists: { name: BehaviorSubject, values: BehaviorSubject[] }[] = null; - if (this.selectedPropertyCategory == PropertyCategory.finiteSet) { - theLists = this._g.userPrefs.savedLists.enumLists; - } else if (isNum) { - theLists = this._g.userPrefs.savedLists.numberLists; - } else { - theLists = this._g.userPrefs.savedLists.stringLists; - } - const idx = theLists.findIndex(x => x.name.getValue() == this.currListName); - if (idx > -1) { - theLists[idx].values = selectedOptions; - } else { - theLists.push({ name: new BehaviorSubject(this.currListName), values: selectedOptions }); - } - this.currSelectedList = this.currListName; - this._profile.saveUserPrefs(); - this.fillFittingSavedLists(); - } - - deleteList() { - const isNum = this.isNumberProperty(); - // the button to fire this function will only be visible when operator is 'one of' - let theLists: { name: BehaviorSubject, values: BehaviorSubject[] }[] = null; - if (this.selectedPropertyCategory == PropertyCategory.finiteSet) { - theLists = this._g.userPrefs.savedLists.enumLists; - } else if (isNum) { - theLists = this._g.userPrefs.savedLists.numberLists; - } else { - theLists = this._g.userPrefs.savedLists.stringLists; - } - const idx = theLists.findIndex(x => x.name.getValue() == this.currSelectedList); - if (idx > -1) { - theLists.splice(idx, 1); - } - this.currListName = ''; - this._profile.saveUserPrefs(); - this.fillFittingSavedLists(); - } - - changeSelectedSavedList(t: EventTarget) { - let ev = (t).value; - this.currListName = ev; - let savedList: BehaviorSubject[] = []; - const isNum = this.isNumberProperty(); - if (this.selectedPropertyCategory == PropertyCategory.finiteSet) { - savedList = this._g.userPrefs.savedLists.enumLists.find(x => x.name.getValue() === ev).values; - } else if (isNum) { - savedList = this._g.userPrefs.savedLists.numberLists.find(x => x.name.getValue() === ev).values; - } else { - savedList = this._g.userPrefs.savedLists.stringLists.find(x => x.name.getValue() === ev).values; - } - if (this.selectedPropertyCategory == PropertyCategory.finiteSet) { - for (const i in this.option2selected) { - this.option2selected[i] = false; - } - for (const i of savedList) { - this.option2selected[i.getValue()] = true; - } - } else { - this.textAreaInp = savedList.map(x => x.getValue()).join('\n'); - } - } - - private fillFittingSavedLists() { - this.fittingSavedLists.length = 0; - const l = this._g.userPrefs.savedLists; - const isNum = this.isNumberProperty(); - if (this.selectedPropertyCategory === PropertyCategory.finiteSet) { - this.fittingSavedLists = l.enumLists.map(x => x.name.getValue()); - } else if (isNum) { - this.fittingSavedLists = l.numberLists.map(x => x.name.getValue()); - } else { - this.fittingSavedLists = l.stringLists.map(x => x.name.getValue()); - } - } - - private addOperators(op) { - for (let [k, v] of Object.entries(op)) { - this.operators[k] = v; - this.operatorKeys.push(k); - } - } - - private getPropertyCategory(): PropertyCategory { - let m = this._g.getEnumMapping(); - this.finiteSetPropertyMap = null; - if (m && m[this.selectedClass] && m[this.selectedClass][this.selectedProp]) { - this.finiteSetPropertyMap = m[this.selectedClass][this.selectedProp]; - const arr = []; - for (const k in this.finiteSetPropertyMap) { - arr.push({ key: k, value: this.finiteSetPropertyMap[k] }); - } - arr.sort((a: any, b: any) => { if (a.value > b.value) return 1; if (b.value > a.value) return -1; return 0 }); - this.finiteSetPropertyMap = arr; - return PropertyCategory.finiteSet; - } - if (this.attributeType == 'datetime') { - return PropertyCategory.date; - } - return PropertyCategory.other; - } - - private isStrictlyValid(rule: Rule) { - const p = rule.propertyOperand; - // property not selected, so only a class is selected - if (p == null || p == GENERIC_TYPE.NOT_SELECTED) { - return true; - } - const op = rule.operator; - // property is selected so an operator must be selected - if (op === undefined || op === null) { - return false; - } - const inp = rule.inputOperand; - // property, operator are selected so an input must be provided - if (inp === undefined || inp === null) { - return false; - } - const t = rule.propertyType; - if ((t == 'datetime' || t == 'float' || t == 'int') && !isNumber(inp) && this.selectedOperatorKey != this.ONE_OF) { - return false; - } - return true; - } -} diff --git a/src/app/visuall/rule-dropdown/rule-dropdown.component.css b/src/app/visuall/rule-dropdown/rule-dropdown.component.css deleted file mode 100644 index d631d2e0..00000000 --- a/src/app/visuall/rule-dropdown/rule-dropdown.component.css +++ /dev/null @@ -1,27 +0,0 @@ -.dropdown-content { - position: absolute; - z-index: 1000; - overflow: auto; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: .25rem; -} - -.dropdown-container { - position: relative; - display: inline-block !important; -} - -img { - width: 16px; - height: 16px; - cursor: pointer; -} - -.dd-item { - padding: 0.37rem !important; -} diff --git a/src/app/visuall/rule-dropdown/rule-dropdown.component.html b/src/app/visuall/rule-dropdown/rule-dropdown.component.html deleted file mode 100644 index d70dbfc6..00000000 --- a/src/app/visuall/rule-dropdown/rule-dropdown.component.html +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/src/app/visuall/rule-dropdown/rule-dropdown.component.ts b/src/app/visuall/rule-dropdown/rule-dropdown.component.ts deleted file mode 100644 index f34ce984..00000000 --- a/src/app/visuall/rule-dropdown/rule-dropdown.component.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; - -@Component({ - selector: 'app-rule-dropdown', - templateUrl: './rule-dropdown.component.html', - styleUrls: ['./rule-dropdown.component.css'] -}) -export class RuleDropdownComponent implements OnInit { - - @Input() isShowConditionBtn: boolean; - @Output() btnClicked: EventEmitter<'AND' | 'OR' | 'C'> = new EventEmitter(); - isShowDropDown: boolean; - - constructor() { } - - ngOnInit(): void { - } - - btnClick(t: 'AND' | 'OR' | 'C') { - this.isShowDropDown = false; - this.btnClicked.next(t); - } - -} diff --git a/src/app/visuall/rule-tree/rule-tree.component.css b/src/app/visuall/rule-tree/rule-tree.component.css deleted file mode 100644 index b35a404e..00000000 --- a/src/app/visuall/rule-tree/rule-tree.component.css +++ /dev/null @@ -1,45 +0,0 @@ -img { - width: 16px; - height: 16px; - cursor: pointer; -} - -ul { - list-style-type: none; - margin-bottom: 2px; - padding-inline-start: 24px; -} - -.caret { - color: #666666; - display: inline-block; -} - -.curr-condition { - background: #F0F2F4; -} - -.padding4 { - padding-top: 4px; - padding-bottom: 4px; -} - -.black-up-triangle::after { - content: "\25B2"; - display: inline-block; -} - -.black-down-triangle::after { - content: "\25BC"; - display: inline-block; -} - -.white-down-triangle::after { - content: "\25BD"; - display: inline-block; -} - -.white-right-triangle::after { - content: "\25B7"; - display: inline-block; -} \ No newline at end of file diff --git a/src/app/visuall/rule-tree/rule-tree.component.html b/src/app/visuall/rule-tree/rule-tree.component.html deleted file mode 100644 index 48c5c7a0..00000000 --- a/src/app/visuall/rule-tree/rule-tree.component.html +++ /dev/null @@ -1,65 +0,0 @@ -
- - - - - - - - - - - - - - - - - - - - - - ALL - {{root.r.propertyOperand}} {{root.r.operator}} - {{root.r.enumMapping}} - {{root.r.inputOperand}} - - - - - {{root.r.ruleOperator}} - - - - - - - - - - - -
-
    -
  • - - -
  • -
  • - - -
  • -
-
    -
  • - - -
  • -
-
- -
\ No newline at end of file diff --git a/src/app/visuall/rule-tree/rule-tree.component.ts b/src/app/visuall/rule-tree/rule-tree.component.ts deleted file mode 100644 index f6ca2a00..00000000 --- a/src/app/visuall/rule-tree/rule-tree.component.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import { RuleNode } from '../operation-tabs/map-tab/query-types'; -import { Subject, Subscription } from 'rxjs'; - -@Component({ - selector: 'app-rule-tree', - templateUrl: './rule-tree.component.html', - styleUrls: ['./rule-tree.component.css'] -}) -export class RuleTreeComponent implements OnInit { - - constructor() { } - @Input() root: RuleNode; - @Input() editedRuleNode: Subject; - @Output() onRuleRequested = new EventEmitter<{ node: RuleNode, isEdit: boolean }>(); - @Output() onEmpty = new EventEmitter(); - @Output() onOperatorAdded = new EventEmitter(); - currNode: RuleNode; - isShowChildren = true; - editedRuleNodeSubs: Subscription; - - ngOnInit(): void { - if (this.editedRuleNode) { - this.editedRuleNodeSubs = this.editedRuleNode.subscribe(x => { - x.isEditing = false; - }); - } - } - - ngOnDestroy() { - if (this.editedRuleNodeSubs) { - this.editedRuleNodeSubs.unsubscribe(); - } - } - - operatorClicked(r: RuleNode) { - const op = r.r.ruleOperator; - if (op == 'AND') { - r.r.ruleOperator = 'OR'; - } else { - r.r.ruleOperator = 'AND'; - } - } - - addOperator(curr: RuleNode, code: 'AND' | 'OR') { - const newNode: RuleNode = { r: { ruleOperator: code }, children: [], parent: curr }; - curr.children.push(newNode); - this.currNode = newNode; - this.operatorEmitter(newNode); - } - - operatorEmitter(r: RuleNode) { - this.onOperatorAdded.emit(r); - } - - deleteNode(node: RuleNode) { - const parent = node.parent; - if (parent) { - const idx = parent.children.indexOf(node); - parent.children.splice(idx, 1); - } else { - this.root = null; - this.onEmpty.emit(true); - } - } - - addRule(e: { node: RuleNode, isEdit: boolean }) { - // since component is recursive, we should only set it once - if (!this.root.parent && e.isEdit) { - if (!e.node.isEditing) { - this.clearAllEditings(this.root); - } - e.node.isEditing = !e.node.isEditing; - } - this.onRuleRequested.emit(e); - } - - btnFromDropdownClicked(e: 'AND' | 'OR' | 'C') { - if (e != 'C') { - this.addOperator(this.root, e); - } else { - this.addRule({ node: this.root, isEdit: false }); - } - } - - changeQueryRuleOrder(node: RuleNode, isUp: boolean) { - const parent = node.parent; - const j = parent.children.indexOf(node); - if ((isUp && j == 0) || (!isUp && j == parent.children.length - 1)) { - return; - } - let idx = j + 1; - if (isUp) { - idx = j - 1; - } - let tmp = parent.children[j]; - parent.children[j] = parent.children[idx]; - parent.children[idx] = tmp; - } - - clearAllEditings(r: RuleNode) { - if (r === undefined || r === null) { - return; - } - r.isEditing = false; - for (const child of r.children) { - this.clearAllEditings(child); - } - } - -} diff --git a/src/app/visuall/setup/setup.component.css b/src/app/visuall/setup/setup.component.css deleted file mode 100644 index 01447484..00000000 --- a/src/app/visuall/setup/setup.component.css +++ /dev/null @@ -1,37 +0,0 @@ -.navbar{ - padding: 1px; - min-height: 35px; - - } - #brand-logo{ - height: 50px - } - #img-logo{ - height: 90px - } - .body { - background-color: #1b44ae; /* Set the background color to blue */ - display: flex; - justify-content: space-around; - - align-items: center; - height: 100vh; /* Make the body full height of the viewport */ - margin: 0; - flex-direction: column; - border: 2px solid #2F4154; - border-radius: 6px; - font-family: arial, helvetica, sans-serif; - } - .container { - background-color: white; - padding: 20px; - max-width: 50vw; - min-height: 40vh; - border-radius: 5px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - text-align: center; - - } - .form-group { - margin-bottom: 20px; - } diff --git a/src/app/visuall/setup/setup.component.html b/src/app/visuall/setup/setup.component.html deleted file mode 100644 index 6f24c980..00000000 --- a/src/app/visuall/setup/setup.component.html +++ /dev/null @@ -1,54 +0,0 @@ - -
- -
-
-

Install and Authenticate SAA from Jira For your Project

- - - -
-
- -
-
-
-

Install and Authenticate SAA from Github For your Project

- - - -
-
- -
-

Neo4j® Setup

-
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
-
-
-
\ No newline at end of file diff --git a/src/app/visuall/setup/setup.component.ts b/src/app/visuall/setup/setup.component.ts deleted file mode 100644 index 99886033..00000000 --- a/src/app/visuall/setup/setup.component.ts +++ /dev/null @@ -1,164 +0,0 @@ - import { Component, Input, OnInit } from '@angular/core'; - import { ActivatedRoute, Router } from '@angular/router'; - import { HttpClient } from '@angular/common/http'; - import { GlobalVariableService } from '../../visuall/global-variable.service'; - import { environment } from 'src/environments/environment'; - - @Component({ - selector: 'app-setup', - templateUrl: './setup.component.html', - styleUrls: ['./setup.component.css'] - }) - - export class SetupComponent implements OnInit { - - @Input() setupValue: string = ''; - tool = "Software Artifact Analyzer" - landingTool: string = "Github"; - //GitHub authentication credentials - - private githubClientId: string = environment.github.clientId; - private githubClientSecret: string = environment.github.clientSecret; - private redirectUrlFlowGithub: string = `http://${window.location.hostname}:${window.location.port}/?setup=Github`; //Will be change after production - private githubCode: string = ''; - private githubInstallationId: string = ''; - //Jira authentication credentials - private jiraClientId: string = environment.jira.clientId; - private jiraClientSecret: string = environment.jira.clientSecret; - private jiraCode: string = ''; - private redirectUrlFlowJira: string = ''; - //Neo4j Credentials - private boltUrl: string = "bolt://ivis.cs.bilkent.edu.tr:3006"; - private httpUrl: string = "http://ivis.cs.bilkent.edu.tr:3004"; - private neo4jUsername: string ="neo4j" ; - private neo4jUserPassword: string="01234567" ; - constructor(private _g: GlobalVariableService, private route: ActivatedRoute, private http: HttpClient, private _http: HttpClient, private router: Router) { } - - async ngOnInit(): Promise { - this.redirectUrlFlowJira = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "https://saa.cs.bilkent.edu.tr/?setup=Jira" : - `http://${window.location.hostname}:${window.location.port}/?setup=Jira`; - if (this.setupValue == "GitHub") { - this.github() - } - else if (this.setupValue == "Jira") { - this.jira() - } - } - directToJira() { - this.landingTool = "Github" - const state = Math.random().toString(36).substring(2); - //Will be change after production - const url = `https://auth.atlassian.com/authorize?audience=api.atlassian.com&client_id=s8vxvG5qiNGENrtsijGbheoFuihyjCa2&scope=offline_access%20read%3Ajira-work%20manage%3Ajira-project%20manage%3Ajira-configuration%20write%3Ajira-work%20read%3Ajira-user%20manage%3Ajira-webhook%20manage%3Ajira-data-provider&redirect_uri=https%3A%2F%2Fsaa.cs.bilkent.edu.tr%2F%3Fsetup%3DJira&state=${state}&response_type=code&prompt=consent` - window.location.href = url; - } - directToGitHub() { - - this.landingTool = "Jira" - } - github() { - this.route.queryParams.subscribe(params => { - this.githubCode = params['code']; - this.githubInstallationId = params['installation_id'] - if (this.githubCode) { - this.exchangeCodeForTokenGithub(); - } else { - console.error('Authorization code not received.'); - } - }); - } - onFormSubmit() { - const credentials = { - 'boltURL':this.boltUrl, - 'httpURL':this.httpUrl + "/db/neo4j/tx/commit", - 'neo4jUsername': this.neo4jUsername, - 'neo4jUserPassword': this.neo4jUserPassword - }; - let body = { - "params": credentials, - } - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/connectNeo4j" : - `http://${window.location.hostname}:4445/connectNeo4j`; - this.http.post(url, body, { headers: { 'Content-Type': 'application/json' } }) - .subscribe( - (response) => { - console.info('Confirm request success', response); - window.location.href = `http://${window.location.hostname}:${window.location.port}`; - - }, - (error) => { - console.error('Confirm request error:', error); - } - ); - } - - jira() { - if(this.landingTool == "Github"){ - this.route.queryParams.subscribe(params => { - this.jiraCode = params['code']; - if (this.jiraCode) { - this.exchangeCodeForTokenJira(); - } else { - console.error('Authorization code not received.'); - } - //TODO: Implement Refresh token mechanism check: https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/#how-do-i-get-a-new-access-token--if-my-access-token-expires-or-is-revoked- - }); - }else{ - //TODO: Second Flow - } - - - } - async exchangeCodeForTokenJira() { - const params = { - "grant_type": "authorization_code", - "client_id": this.jiraClientId, - "client_secret": this.jiraClientSecret, - "code": this.jiraCode, - "redirect_uri": this.redirectUrlFlowJira - } - let body = { - "params": params, - } - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/authenticateJira" : - `http://${window.location.hostname}:4445/authenticateJira`; - console.log(body) - this.http.post(url, body, { headers: { 'Content-Type': 'application/json' } }) - .subscribe( - (response) => { - console.info('Confirm request success', response); - }, - (error) => { - console.error('Confirm request error:', error); - } - ); - } - async exchangeCodeForTokenGithub() { - const params = { - client_id: this.githubClientId, - client_secret: this.githubClientSecret, - code: this.githubCode, - installation_id: this.githubInstallationId, - redirect_uri: this.redirectUrlFlowGithub - }; - let body = { - "params": params, - } - let url = window.location.hostname == "saa.cs.bilkent.edu.tr" ? - "http://saa.cs.bilkent.edu.tr/api/authenticateGithub" : - `http://${window.location.hostname}:4445/authenticateGithub`; - this.http.post(url, body, { headers: { 'Content-Type': 'application/json' } }) - .subscribe( - (response) => { - console.info('Confirm request success', response); - }, - (error) => { - console.error('Confirm request error:', error); - } - ); - } - - -} diff --git a/src/app/visuall/timebar.service.ts b/src/app/visuall/timebar.service.ts deleted file mode 100644 index bdb8bc85..00000000 --- a/src/app/visuall/timebar.service.ts +++ /dev/null @@ -1,336 +0,0 @@ -import { Injectable } from '@angular/core'; -import { GlobalVariableService } from './global-variable.service'; -import AppDescription from '../custom/config/app_description.json'; -import { TimebarMetric } from './operation-tabs/map-tab/query-types'; -import { Timebar } from '../../lib/timebar/Timebar'; -import { BehaviorSubject } from 'rxjs'; -import { MergedElemIndicatorTypes } from './user-preference'; -import { COLLAPSED_EDGE_CLASS, COLLAPSED_NODE_CLASS } from './constants'; - -@Injectable({ - providedIn: 'root' -}) -export class TimebarService { - - shownMetrics = new BehaviorSubject(null); - isRandomizedLayout = false; - private _timebarExt: Timebar; - private _playingPeriod: number; - private _prevElems: any = null; - showHideFn: (isHide: boolean) => void; - rangeListenerSetterFn: () => void; - hideCompoundsFn: (elems) => void; - showCollapsedFn: (collapsedNodes, collapsedEdges) => void; - - constructor(private _g: GlobalVariableService) { } - - coverVisibleRange() { - if (!this._timebarExt) { - return; - } - this._timebarExt.coverVisibleRange(); - } - - coverAllTimes() { - if (!this._timebarExt) { - return; - } - this._timebarExt.coverAllTimes(); - } - - changeZoom(isIncrease: boolean) { - if (!this._timebarExt) { - return; - } - this._timebarExt.changeZoom(isIncrease); - } - - moveCursor(isLeft: boolean) { - if (!this._timebarExt) { - return; - } - this._timebarExt.moveCursor(isLeft); - } - - setChartRange(s: number, e: number) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setGraphRange(s, e); - } - - getChartRange(): number[] { - if (!this._timebarExt) { - return; - } - return this._timebarExt.getGraphRange(); - } - - // ----------------------------------------- start of timebar settings ----------------------------------------- - showHideTimebar(isActive: boolean) { - this.showHideFn(!isActive); - // call init only once - if (isActive && !this._timebarExt) { - this.init(); - } - if (this._timebarExt) { - this._timebarExt.setSetting('isEnabled', isActive); - if (isActive) { - this.rangeListenerSetterFn(); - } - } - } - - setisHideDisconnectedNodes(val: boolean) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setSetting('isHideDisconnectedNodesOnAnim', val); - } - - changePeriod(v: number) { - if (!this._timebarExt) { - return; - } - this._playingPeriod = v; - this._timebarExt.setSetting('playingPeriod', v); - } - - changeStep(v: number) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setSetting('playingStep', v); - } - - changeZoomStep(v: number) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setSetting('zoomingStep', v); - } - - changeGraphInclusionType(i: number) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setSetting('graphInclusionType', i); - } - - changeStatsInclusionType(i: number) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setSetting('statsInclusionType', i); - } - - setIsMaintainGraphRange(v: boolean) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setSetting('isMaintainGraphRange', v); - } - // ----------------------------------------- end of timebar settings ----------------------------------------- - - onStatsChanged(f) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setEventListener('statsRangeChanged', f); - } - - onGraphChanged(f) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setEventListener('graphRangeChanged', f); - } - - playTiming(callback: (isShowPlay: boolean) => void) { - if (!this._timebarExt) { - return; - } - this._timebarExt.playTiming(callback); - } - - getCurrTimeUnit(): number { - if (!this._timebarExt) { - return; - } - return this._timebarExt.getCurrTimeUnit(); - } - - getGraphRangeRatio(): number { - if (!this._timebarExt) { - return; - } - return this._timebarExt.getGraphRangeRatio(); - } - - setIgnoreChanges(isIgnore: boolean) { - if (!this._timebarExt) { - return; - } - this._timebarExt.setSetting('isIgnoreElemChanges', isIgnore); - } - - // this function should show only the provided elements, hide the remaining, then should make layout - private shownOnlyElems(elems) { - this._timebarExt.setSetting('isIgnoreElemChanges', true); - const hiddenCollapsed = this._g.cy.collection(); - for (let i = 0; i < elems.length; i++) { - const collapsedChildren = elems[i].data('collapsedChildren'); - const collapsedEdges = elems[i].data('collapsedEdges'); - if (collapsedChildren) { - hiddenCollapsed.merge(collapsedChildren); - } - if (collapsedEdges) { - hiddenCollapsed.merge(collapsedEdges); - } - } - elems = elems.union(hiddenCollapsed); - const alreadyVisibleNodes = this._g.cy.nodes(':visible'); - if (alreadyVisibleNodes.length > 0) { - const nodes2Show = elems.nodes(':inside').difference(alreadyVisibleNodes); - this._g.layoutUtils.placeNewNodes(nodes2Show); - } - const alreadyVisible = this._g.cy.$(':visible'); - const elems2show = elems.difference(alreadyVisible); - const elems2hide = alreadyVisible.difference(elems); - this._g.viewUtils.show(elems); - this.showCollapsedFn(elems.filter('.' + COLLAPSED_NODE_CLASS), elems.filter('.' + COLLAPSED_EDGE_CLASS)); - const remaining4Hide = this._g.cy.elements().difference(elems); - // hide only non-compound nodes and edges - this._g.viewUtils.hide(remaining4Hide); - this.hideCompoundsFn(remaining4Hide); - - const isChanged = this.hasElemsChanged(this._prevElems, elems); - this._timebarExt.setSetting('isIgnoreElemChanges', false); - this._prevElems = elems; - if (!isChanged) { - return; - } - this._g.shownElemsChanged.next(true); - if (this._g.isLoadFromDB) { - this._g.isLoadFromDB = false; - return; - } - // `select` function of cytoscape should be called on visible elements - this.handleHighlight(elems2show, elems2hide); - if (this.isRandomizedLayout) { - this._g.performLayout(true, false, this._playingPeriod); - this.isRandomizedLayout = false; - } else { - if (!this._g.isLoadFromHistory && !this._g.isLoadFromExpandCollapse) { - this._g.performLayout(false, false, this._playingPeriod); - } else { - if (!this._g.isLoadFromExpandCollapse) { - this._g.cy.fit(); - } - this._g.isLoadFromHistory = false; - this._g.isLoadFromExpandCollapse = false; - } - } - } - - // only `elems2show` will be shown. Highlight elements to be shown "new" (previously hidden), - // unhighlight elemenets to be hidden - private handleHighlight(elems2show, elems2hide) { - if ((elems2show.length < 1 && elems2hide.length < 1) || this._g.isLoadFromExpandCollapse) { - return; - } - const newElemIndicator = this._g.userPrefs.mergedElemIndicator.getValue(); - if (newElemIndicator == MergedElemIndicatorTypes.none) { - return; - } - const isHighlightOnlyLatest = this._g.userPrefs.isOnlyHighlight4LatestQuery.getValue(); - - if (isHighlightOnlyLatest) { - if (newElemIndicator == MergedElemIndicatorTypes.highlight) { - this._g.viewUtils.removeHighlights(); - this._g.highlightElems(elems2show); - } else if (newElemIndicator == MergedElemIndicatorTypes.selection) { - this._g.cy.$().unselect(); - elems2show.select(); - } - } else { - if (newElemIndicator == MergedElemIndicatorTypes.highlight) { - this._g.viewUtils.removeHighlights(elems2hide); - this._g.highlightElems(elems2show); - } else if (newElemIndicator == MergedElemIndicatorTypes.selection) { - elems2hide.unselect(); - elems2show.select(); - } - } - } - - private hasElemsChanged(prev: any, curr: any) { - if (prev == null || curr == null) { - return true; - } - - const d1 = {}; - for (const i of prev) { - d1[i.id()] = true; - } - for (const i of curr) { - if (!d1[i.id()]) { - return true; - } - } - - const d2 = {}; - for (const i of curr) { - d2[i.id()] = true; - } - for (const i of prev) { - if (!d2[i.id()]) { - return true; - } - } - return false; - } - - private init() { - const m = AppDescription.timebarDataMapping; // mapping for timebar - const s = this.getUserPrefs(); // settings for timebar - const e = { // events (functions to be called in extension) - maintainFiltering: (elems) => { - return this._g.filterByClass(elems); - }, - showOnlyElems: this.shownOnlyElems.bind(this), - chartRendered: () => { }, - onMouseOverChart: (ids) => { - if (!ids) { - return; - } - this._g.viewUtils.removeHighlights(); - for (let i = 0; i < ids.length; i++) { - this._g.highlightElems(this._g.cy.$id(ids[i])); - } - }, - onMouseOutChart: (ids) => { - if (!ids) { - return; - } - this._g.viewUtils.removeHighlights(); - }, - }; - s['events'] = e; - s['defaultBeginDate'] = this._g.userPrefsFromFiles.dbQueryTimeRange.start.getValue(); - s['defaultEndDate'] = this._g.userPrefsFromFiles.dbQueryTimeRange.end.getValue(); - s['graphRangeRatio'] = AppDescription.appPreferences.timebar.graphRangeRatio; - const htmlElems = { chartElemId: 'chart_div', controllerElemId: 'filter_div' }; - this._timebarExt = this._g.cy.timebar(m, htmlElems, s); - this.shownMetrics.subscribe(x => { this._timebarExt.setStats(x); }); - } - - private getUserPrefs(): any { - const prefs = this._g.userPrefs.timebar; - const r = {}; - for (const key of Object.keys(prefs)) { - r[key] = prefs[key].getValue() - } - return r; - } -} \ No newline at end of file diff --git a/src/app/visuall/timebar/timebar.component.css b/src/app/visuall/timebar/timebar.component.css deleted file mode 100644 index c46cd368..00000000 --- a/src/app/visuall/timebar/timebar.component.css +++ /dev/null @@ -1,37 +0,0 @@ -#timebar-ctrl-pnl img:hover { - /* if you make it 1 stack order changes */ - opacity: 0.999; -} - -#timebar-ctrl-pnl { - height: 1.5em; -} - -#chart_div { - height: 9vh; -} - -#timebar-ctrl-pnl img { - opacity: 0.7; - z-index: 1; - height: 1.5vh; - min-height: 15px; -} - -#filter_div { - height: 5vh; -} - -.range-str { - z-index: 1; - width: 300px; -} - -.date-div { - z-index: 1; -} - -.date-inp{ - height: auto; - padding: 0px !important; -} \ No newline at end of file diff --git a/src/app/visuall/timebar/timebar.component.html b/src/app/visuall/timebar/timebar.component.html deleted file mode 100644 index e1e54eef..00000000 --- a/src/app/visuall/timebar/timebar.component.html +++ /dev/null @@ -1,55 +0,0 @@ -
- -
- -
-
-
{{statsRange1Str}}
-
- -
-
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
-
- -
-
- {{statsRange2Str}} -
-
-
-
- -
\ No newline at end of file diff --git a/src/app/visuall/timebar/timebar.component.ts b/src/app/visuall/timebar/timebar.component.ts deleted file mode 100644 index 470ba7c3..00000000 --- a/src/app/visuall/timebar/timebar.component.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; -import { TimebarService } from '../timebar.service'; -import { TIME_UNITS, CY_NAVI_POSITION_WAIT_DUR } from '../constants'; -import flatpickr from 'flatpickr'; -import { Locale } from 'flatpickr/dist/types/locale'; -import { GlobalVariableService } from '../global-variable.service'; -import { debounce, HIDE_EMPTY_TIMEBAR_DELAY } from '../constants'; - -@Component({ - selector: 'app-timebar', - templateUrl: './timebar.component.html', - styleUrls: ['./timebar.component.css'] -}) -export class TimebarComponent implements OnInit { - - s: TimebarService; - playImg: string; - pauseImg: string; - currPlayIcon: string; - statsRange1Str: string; - statsRange2Str: string; - cssLeftDate1 = 0; - cssLeftDate2 = 0; - isHide = true; - @ViewChild('dateInp1', { static: false }) dateInp1: ElementRef; - @ViewChild('dateInp2', { static: false }) dateInp2: ElementRef; - - constructor(timebarService: TimebarService, private _g: GlobalVariableService) { - this.s = timebarService; - } - - ngOnInit() { - this.playImg = '../assets/img/play-button.svg'; - this.pauseImg = '../assets/img/pause-symbol.svg'; - this.currPlayIcon = this.playImg; - this.s.showHideFn = this.showHide.bind(this); - this.s.rangeListenerSetterFn = this.setRangeListeners.bind(this); - } - - playTiming() { - this.s.playTiming(this.changePlayIcon.bind(this)); - } - - changePlayIcon(isShowPlay: boolean) { - if (isShowPlay) { - this.currPlayIcon = this.playImg; - } else { - this.currPlayIcon = this.pauseImg; - } - } - - private setStatsRangeStr(d1: number, d2: number) { - if (!d1 || !d2) { - this._g.showErrorModal('Timebar', 'range bounds are incorrect!'); - return; - } - this.statsRange1Str = this.date2str(d1); - this.statsRange2Str = this.date2str(d2); - } - - private setGraphRangeStr(d1: number, d2: number) { - if (!d1 || !d2) { - this._g.showErrorModal('Timebar', 'range bounds are incorrect!'); - return; - } - this.setFlatPickrInstance(this.dateInp1, d1, true); - this.setFlatPickrInstance(this.dateInp2, d2, false); - } - - setFlatPickrInstance(domElem: ElementRef, date: number, isStart: boolean) { - let instance = domElem.nativeElement._flatpickr; - - if (instance) { - domElem.nativeElement._flatpickr.setDate(date); - } else { - instance = flatpickr(domElem.nativeElement, { - defaultDate: new Date(date), enableTime: true, enableSeconds: true, time_24hr: true - }); - instance.setDate(date); - if (isStart) { - instance.config.onChange.push((selectedDates) => { this.s.setChartRange(selectedDates[0].getTime(), null); }); - } else { - instance.config.onChange.push((selectedDates) => { this.s.setChartRange(null, selectedDates[0].getTime()); }); - } - } - } - - date2str(d: number | Date): string { - let date = d; - if (typeof d === 'number') { - date = new Date(d); - } - let s = date.toString(); - const arr = s.split(' '); - arr.splice(0, 1); - arr.splice(arr.length - 2, 2); - const u = this.s.getCurrTimeUnit(); - const isGreaterThanDay = u >= TIME_UNITS.day; - const hasNeedMs = u < TIME_UNITS.second; - if (isGreaterThanDay) { - arr.splice(arr.length - 1, 1); - } - s = arr.join(' '); - if (hasNeedMs) { - s += '.' + (date as Date).getMilliseconds(); - } - return s; - } - - showHide(isHide: boolean) { - if (isHide != this.isHide) { - setTimeout(() => { - this._g.cyNaviPositionSetter(); - }, CY_NAVI_POSITION_WAIT_DUR); - } - this.isHide = isHide; - if (!this.isHide) { - const d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - const d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - this.setGraphRangeStr(d1, d2); - } - } - - setRangeListeners() { - const r = this.s.getGraphRangeRatio(); - this.cssLeftDate1 = (1 - r) / 2 * 100; - this.cssLeftDate2 = (1 + r) / 2 * 100; - this.s.onStatsChanged(this.setStatsRangeStr.bind(this)); - this.s.onGraphChanged(this.setGraphRangeStr.bind(this)); - } - -} diff --git a/src/app/visuall/toolbar/itoolbar.ts b/src/app/visuall/toolbar/itoolbar.ts deleted file mode 100644 index 99629577..00000000 --- a/src/app/visuall/toolbar/itoolbar.ts +++ /dev/null @@ -1,19 +0,0 @@ -export interface ToolbarDiv { - // id for the div - div: number; - // will be shown inside the dropdown button - items: ToolbarAction[]; -} - -export interface ToolbarAction { - // path to the image - imgSrc: string; - // will be showed on mouse over - title: string; - // must be the name of function, function should be parameterless - fn: string; - // must be false for custom items - isStd: boolean; - // irregular DOM elements should be hard coded to HTML - isRegular: boolean; -} \ No newline at end of file diff --git a/src/app/visuall/toolbar/toolbar.component.css b/src/app/visuall/toolbar/toolbar.component.css deleted file mode 100644 index 40061d6b..00000000 --- a/src/app/visuall/toolbar/toolbar.component.css +++ /dev/null @@ -1,51 +0,0 @@ -img { - opacity: 0.7; -} - -img:hover { - opacity : 1; - background : #dae0e5; - border-radius: 5px; -} - -input[type=checkbox] { - margin-left : 0.3rem; - margin-right: 0.3rem; -} - -.color-disabled { - color: #ABABAB; -} - -.color-disabled-bg { - opacity: 0.5; -} - -input:disabled { - cursor: not-allowed; - color : #ABABAB; -} - -.disabled { - cursor : not-allowed !important; - background: transparent !important; - opacity : 0.7 !important; -} - -.inp-10-ch { - width: 10.5em; -} - -.mid { - display : flex; - justify-content: center; - align-items : center; -} - -.tight-select { - line-height: normal; -} - -.dash { - padding: 0 2px; -} \ No newline at end of file diff --git a/src/app/visuall/toolbar/toolbar.component.html b/src/app/visuall/toolbar/toolbar.component.html deleted file mode 100644 index c01fa236..00000000 --- a/src/app/visuall/toolbar/toolbar.component.html +++ /dev/null @@ -1,35 +0,0 @@ - -
- -
- -
- - -
-
-
-
  
-
-
- - - - - -   -
- -
-   -
-
  
-
- {{statusMsg}} -
- -
\ No newline at end of file diff --git a/src/app/visuall/toolbar/toolbar.component.ts b/src/app/visuall/toolbar/toolbar.component.ts deleted file mode 100644 index 75ae23e1..00000000 --- a/src/app/visuall/toolbar/toolbar.component.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { Component, OnInit, ViewChild, AfterViewInit, OnDestroy, ElementRef } from '@angular/core'; -import { CytoscapeService } from '../cytoscape.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { SaveAsPngModalComponent } from '../popups/save-as-png-modal/save-as-png-modal.component'; -import { AboutModalComponent } from '../popups/about-modal/about-modal.component'; -import { QuickHelpModalComponent } from '../popups/quick-help-modal/quick-help-modal.component'; -import { LegendModalComponent } from '../popups/legend-modal/legend-modal.component'; -import { GlobalVariableService } from '../global-variable.service'; -import { getPropNamesFromObj } from '../constants'; -import { ToolbarCustomizationService } from '../../custom/customization-service/toolbar-customization.service'; -import { ToolbarDiv, ToolbarAction } from './itoolbar'; -import { Subscription } from 'rxjs'; -import { UserProfileService } from '../user-profile.service'; -import flatpickr from 'flatpickr'; - -@Component({ - selector: 'app-toolbar', - templateUrl: './toolbar.component.html', - styleUrls: ['./toolbar.component.css'] -}) -export class ToolbarComponent implements OnInit, AfterViewInit, OnDestroy { - @ViewChild('file', { static: false }) file; - searchTxt: string; - menu: ToolbarDiv[]; - statusMsg = ''; - statusMsgQueue: string[] = []; - MIN_MSG_DURATION = 500; - statusMsgSubs: Subscription; - userPrefSubs: Subscription; - msgStarted2show: number = 0; - isLimitDbQueries2range: boolean; - @ViewChild('dbQueryDate1', { static: false }) dbQueryDate1: ElementRef; - @ViewChild('dbQueryDate2', { static: false }) dbQueryDate2: ElementRef; - - constructor(private _cyService: CytoscapeService, private modalService: NgbModal, - private _g: GlobalVariableService, private _customizationService: ToolbarCustomizationService, private _profile: UserProfileService) { - this.menu = [ - { - div: 0, items: [{ imgSrc: 'assets/img/toolbar/load.svg', title: 'Load', fn: 'load', isStd: true, isRegular: true }, - { imgSrc: 'assets/img/toolbar/save.svg', title: 'Save', fn: 'saveAsJson', isStd: true, isRegular: true }, - { imgSrc: 'assets/img/toolbar/png.svg', title: 'Save as PNG', fn: 'saveAsPng', isStd: true, isRegular: true }] - }, - { - div: 1, items: [{ imgSrc: 'assets/img/toolbar/delete-simple.svg', title: 'Delete Selected', fn: 'deleteSelected', isStd: true, isRegular: true }, - { imgSrc: 'assets/img/toolbar/history.svg', title: 'Query History', fn: 'showHideGraphHistory', isStd: true, isRegular: true }] - }, - { - div: 2, items: [{ imgSrc: 'assets/img/toolbar/hide-selected.svg', title: 'Hide Selected', fn: 'hideSelected', isStd: true, isRegular: true }, - { imgSrc: 'assets/img/toolbar/show-all.svg', title: 'Show All', fn: 'showAll', isStd: true, isRegular: true }] - }, - { - div: 3, items: [{ imgSrc: 'assets/img/toolbar/search.svg', title: 'Search to Highlight', fn: 'highlightSearch', isStd: true, isRegular: true }, - { imgSrc: '', title: 'must be hard coded to HTML', fn: '', isStd: true, isRegular: false }, - { imgSrc: 'assets/img/toolbar/highlight-selected.svg', title: 'Highlight Selected', fn: 'highlightSelected', isStd: true, isRegular: true }, - { imgSrc: 'assets/img/toolbar/remove-highlights.svg', title: 'Remove Highlights', fn: 'removeHighlights', isStd: true, isRegular: true }] - }, - { - div: 4, items: [{ imgSrc: 'assets/img/toolbar/layout-cose.svg', title: 'Perform Layout', fn: 'performLayout', isStd: true, isRegular: true }, - { imgSrc: 'assets/img/toolbar/layout-static.svg', title: 'Recalculate Layout', fn: 'reLayout', isStd: true, isRegular: true }] - }, - { - div: 5, items: [{ imgSrc: 'assets/img/toolbar/quick-help.svg', title: 'Quick Help', fn: 'openQuickHelp', isStd: true, isRegular: true }, - { imgSrc: 'assets/img/toolbar/legend.svg', title: 'Legend', fn: 'openLegend', isStd: true, isRegular: true }, - { imgSrc: 'assets/img/toolbar/about.svg', title: 'About', fn: 'openAbout', isStd: true, isRegular: true }] - }, - ]; - } - - ngOnDestroy(): void { - if (this.statusMsgSubs) { - this.statusMsgSubs.unsubscribe(); - } - if (this.userPrefSubs) { - this.userPrefSubs.unsubscribe(); - } - } - - ngOnInit() { - this.mergeCustomMenu(); - this.statusMsgSubs = this._g.statusMsg.subscribe(x => { - this.statusMsgQueue.push(x); - this.processMsgQueue(); - }); - this.userPrefSubs = this._g.isUserPrefReady.subscribe(x => { - if (!x) { - return; - } - // user preferences from local storage should be setted - // Better way might be to use a shared behaviour subject just like `isUserPrefReady`. Its name might be isUserPrefFromLocalStorageReady - setTimeout(() => { - this.setDates4DbQuery(); - }, 1); - - }); - } - - private processMsgQueue() { - if (this.statusMsgQueue.length < 1) { - this.statusMsg = ''; - return; - } - const currTime = new Date().getTime(); - const timePassed = currTime - this.msgStarted2show; - if (timePassed >= this.MIN_MSG_DURATION || this.statusMsg.length === 0) { - this.statusMsg = this.statusMsgQueue[0]; - this.msgStarted2show = currTime; - this.statusMsgQueue.shift(); - } else { - // enough time didn't passed yet. Check again when it is passed. - setTimeout(this.processMsgQueue.bind(this), this.MIN_MSG_DURATION - timePassed); - } - } - - ngAfterViewInit() { - // angular rendering harms previous manual positioning - this._cyService.setNavigatorPosition(); - } - - mergeCustomMenu() { - const m = this._customizationService.menu; - // in any case, set isStd property to false - m.map(x => x.items.map(y => y.isStd = false)); - - for (const i of m) { - const idx = this.menu.findIndex(x => x.div === i.div); - if (idx === -1) { - this.menu.push(i); - } else { - this.menu[idx].items.push(...i.items); - } - } - } - - fileSelected() { this._cyService.loadFile(this.file.nativeElement.files[0]); } - - triggerAct(act: ToolbarAction) { - if (act.isStd) { - this[act.fn](); - } else { - this._customizationService[act.fn](); - } - } - - load() { - this.file.nativeElement.value = ''; - this.file.nativeElement.click(); - } - - saveAsJson() { this._cyService.saveAsJson(); } - - saveAsPng() { this.modalService.open(SaveAsPngModalComponent); } - - deleteSelected() { this._cyService.deleteSelected(null); } - - hideSelected() { this._cyService.showHideSelectedElements(true); } - - showAll() { this._cyService.showHideSelectedElements(false); } - - highlightSearch() { - const filterFn = (x) => { - const entityMap = this._g.dataModel.getValue(); - const propNames = getPropNamesFromObj([entityMap.nodes, entityMap.edges], false); - const isIgnoreCase = this._g.userPrefs.isIgnoreCaseInText.getValue(); - let s = ''; - for (const propName of propNames) { - const val = x.data(propName); - if (val != undefined && val != null) { - s += val; - } - } - if (isIgnoreCase) { - return s.toLowerCase().includes(this.searchTxt.toLowerCase()); - } - return s.includes(this.searchTxt); - }; - let satisfyingElems = this._g.cy.filter(filterFn); - satisfyingElems = satisfyingElems.union(this._g.filterRemovedElems(filterFn)); - this._g.highlightElems(satisfyingElems); - } - - highlightSelected() { this._cyService.highlightSelected(); } - - removeHighlights() { this._cyService.removeHighlights()} - - performLayout() { this._g.performLayout(false, true); } - - reLayout() { this._g.performLayout(true); } - - openQuickHelp() { this.modalService.open(QuickHelpModalComponent); } - - openAbout() { this.modalService.open(AboutModalComponent); } - - openLegend() { this.modalService.open(LegendModalComponent); } - - showHideGraphHistory() { - const v = this._g.showHideGraphHistory.getValue(); - this._g.showHideGraphHistory.next(!v); - } - - changeIsLimitDbQueryRange() { - this._g.userPrefs.isLimitDbQueries2range.next(this.isLimitDbQueries2range); - this._profile.saveUserPrefs(); - } - - resetDbQueryRange() { - if (!this.isLimitDbQueries2range) { - return; - } - const minDate = this._g.userPrefsFromFiles.dbQueryTimeRange.start.getValue(); - const maxDate = this._g.userPrefsFromFiles.dbQueryTimeRange.end.getValue(); - this.dbQueryDate1.nativeElement._flatpickr.setDate(minDate); - this.dbQueryDate2.nativeElement._flatpickr.setDate(maxDate); - this._g.userPrefs.dbQueryTimeRange.start.next(minDate); - this._g.userPrefs.dbQueryTimeRange.end.next(maxDate); - this._profile.saveUserPrefs(); - } - - private setDates4DbQuery() { - - const maxDate = this._g.userPrefsFromFiles.dbQueryTimeRange.end.getValue(); - const minDate = this._g.userPrefsFromFiles.dbQueryTimeRange.start.getValue(); - const d1 = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - const opt1 = { - defaultDate: new Date(d1), enableTime: true, enableSeconds: true, time_24hr: true, - onChange: (x, _, instance) => { - const dateTime = x[0].getTime(); - const startDate = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - const endDate = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (dateTime >= endDate) { - instance.setDate(startDate); - this.showDateTimeError('Start datetime should be earlier than end datetime'); - return; - } - this._g.userPrefs.dbQueryTimeRange.start.next(dateTime); - this._profile.saveUserPrefs(); - }, - minDate: minDate, - maxDate: maxDate, - }; - const d2 = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - const opt2 = { - defaultDate: new Date(d2), enableTime: true, enableSeconds: true, time_24hr: true, - onChange: (x, _, instance) => { - const dateTime = x[0].getTime(); - const startDate = this._g.userPrefs.dbQueryTimeRange.start.getValue(); - const endDate = this._g.userPrefs.dbQueryTimeRange.end.getValue(); - if (dateTime <= startDate) { - instance.setDate(endDate); - this.showDateTimeError('End datetime should be later than start datetime'); - return; - } - this._g.userPrefs.dbQueryTimeRange.end.next(dateTime); - this._profile.saveUserPrefs(); - }, - minDate: minDate, - maxDate: maxDate, - }; - flatpickr(this.dbQueryDate1.nativeElement, opt1); - flatpickr(this.dbQueryDate2.nativeElement, opt2); - this.isLimitDbQueries2range = this._g.userPrefs.isLimitDbQueries2range.getValue(); - } - - private showDateTimeError(msg: string) { - this._g.showErrorModal('Date Selection', msg); - } - -} diff --git a/src/app/visuall/user-pref-helper.ts b/src/app/visuall/user-pref-helper.ts deleted file mode 100644 index c6d61d9a..00000000 --- a/src/app/visuall/user-pref-helper.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { CytoscapeService } from './cytoscape.service'; -import { TimebarService } from './timebar.service'; -import { GlobalVariableService } from './global-variable.service'; -import { MAX_DATA_PAGE_SIZE, MIN_DATA_PAGE_SIZE, MAX_TABLE_COLUMN_COUNT, MIN_TABLE_COLUMN_COUNT } from './constants'; -import { UserProfileService } from './user-profile.service'; - -export class UserPrefHelper { - constructor(private _cyService: CytoscapeService, private _timebarService: TimebarService, private _g: GlobalVariableService, private _profile: UserProfileService) { - } - - listen4UserPref() { - this._g.isUserPrefReady.subscribe(isReady => { - if (!isReady) { - return; - } - this.loadPrefFromLocalStorage(); - // bind view utilities after UserPreferences are finalized - this._cyService.bindViewUtilitiesExtension(); - - const up = this._g.userPrefs; - const upT = this._g.userPrefs.timebar; - const tb = this._timebarService; - - up.isAutoIncrementalLayoutOnChange.subscribe(x => { this.changeAutoIncremental(x); }); - up.isHighlightOnHover.subscribe(x => { this._cyService.highlighterCheckBoxClicked(x); }); - up.isShowOverviewWindow.subscribe(x => { this._cyService.navigatorCheckBoxClicked(x); }); - up.isShowEdgeLabels.subscribe(() => { this._cyService.showHideEdgeLabels(); }); - up.nodeLabelWrap.subscribe(() => { this._cyService.fitLabel2Node(); }); - up.dataPageSize.subscribe(x => { this.dataPageSizeChanged(x); }); - up.dataPageLimit.subscribe(x => { this.dataPageLimitChanged(x); }); - up.tableColumnLimit.subscribe(x => { this.tableColumnLimitChanged(x); }); - up.compoundPadding.subscribe(x => { this.changeCompoundPadding(x); }); - up.objectInclusionType.subscribe(x => { tb.changeGraphInclusionType(x); }); - up.groupingOption.subscribe(x => { this._cyService.changeGroupingOption(x); }) - - upT.isEnabled.subscribe(x => this.isEnableTimebar(x)); - upT.isHideDisconnectedNodesOnAnim.subscribe(x => { tb.setisHideDisconnectedNodes(x); }); - upT.isMaintainGraphRange.subscribe(x => { tb.setIsMaintainGraphRange(x) }); - upT.playingStep.subscribe(x => { tb.changeStep(x); }); - upT.playingPeriod.subscribe(x => { tb.changePeriod(x); }); - upT.zoomingStep.subscribe(x => { tb.changeZoomStep(x); }); - upT.statsInclusionType.subscribe(x => { tb.changeStatsInclusionType(x); }); - }); - } - - isEnableTimebar(x: boolean) { - this._cyService.showHideTimebar(x); - } - - changeAutoIncremental(x: boolean) { - if (x) { - this._g.expandCollapseApi.setOption('layoutBy', this.expandCollapseLayout.bind(this)); - this._g.expandCollapseApi.setOption('fisheye', true); - this._g.expandCollapseApi.setOption('animate', true); - } else { - this._g.expandCollapseApi.setOption('layoutBy', null); - this._g.expandCollapseApi.setOption('fisheye', false); - this._g.expandCollapseApi.setOption('animate', false); - } - } - - private expandCollapseLayout() { - const l = this._g.getFcoseOptions(); - l.fit = false; - const elems4layout = this._g.cy.elements().not(':hidden, :transparent'); - if (elems4layout.length < 1) { - return; - } - this._g.isLoadFromExpandCollapse = true; - elems4layout.layout(l).run(); - } - - changeCompoundPadding(x: string) { - this._g.cy.style().selector(':compound') - .style({ padding: x }) - .update(); - } - - dataPageSizeChanged(x: number) { - if (x > MAX_DATA_PAGE_SIZE) { - x = MAX_DATA_PAGE_SIZE; - this._g.userPrefs.dataPageSize.next(x); - return; - } - if (x < MIN_DATA_PAGE_SIZE) { - x = MIN_DATA_PAGE_SIZE; - this._g.userPrefs.dataPageSize.next(x); - return; - } - } - - dataPageLimitChanged(x: number) { - if (x > MAX_DATA_PAGE_SIZE) { - x = MAX_DATA_PAGE_SIZE; - this._g.userPrefs.dataPageLimit.next(x); - return; - } - if (x < MIN_DATA_PAGE_SIZE) { - x = MIN_DATA_PAGE_SIZE; - this._g.userPrefs.dataPageLimit.next(x); - return; - } - } - - tableColumnLimitChanged(x: number) { - if (x > MAX_TABLE_COLUMN_COUNT) { - x = MAX_TABLE_COLUMN_COUNT; - this._g.userPrefs.tableColumnLimit.next(x); - return; - } - if (x < MIN_TABLE_COLUMN_COUNT) { - x = MIN_TABLE_COLUMN_COUNT; - this._g.userPrefs.tableColumnLimit.next(x); - return; - } - } - - private loadPrefFromLocalStorage() { - if (this._profile.isStoreProfile()) { - this._profile.transferUserPrefs(); - } - this._profile.transferIsStoreUserProfile(); - } -} \ No newline at end of file diff --git a/src/app/visuall/user-preference.ts b/src/app/visuall/user-preference.ts deleted file mode 100644 index 43eecff9..00000000 --- a/src/app/visuall/user-preference.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { BehaviorSubject } from 'rxjs'; -import { QueryRule, TimebarMetric } from './operation-tabs/map-tab/query-types'; - -export interface UserPref { - // boolean settings - isAutoIncrementalLayoutOnChange: BehaviorSubject; - isHighlightOnHover: BehaviorSubject; - isShowOverviewWindow: BehaviorSubject; - isShowEdgeLabels: BehaviorSubject; - isTileDisconnectedOnLayout: BehaviorSubject; - isIgnoreCaseInText: BehaviorSubject; - isOnlyHighlight4LatestQuery: BehaviorSubject; - isStoreUserProfile: BehaviorSubject; - isCollapseEdgesBasedOnType: BehaviorSubject; - isCollapseMultiEdgesOnLoad: BehaviorSubject; - - //Anomaly - anomalyDefaultValues:{ - ignoreBug:BehaviorSubject, - assigneeChangeCount:BehaviorSubject, - reopenCount:BehaviorSubject, - } - // Show query results using 'Selection', 'Highlight' - mergedElemIndicator: BehaviorSubject; - groupingOption: BehaviorSubject; - nodeLabelWrap: BehaviorSubject; - isLimitDbQueries2range: BehaviorSubject; - dbQueryTimeRange: { start: BehaviorSubject, end: BehaviorSubject }, - savedLists: SavedLists; - dataPageSize: BehaviorSubject; - dataPageLimit: BehaviorSubject; - queryHistoryLimit: BehaviorSubject; - queryNeighborLimit: BehaviorSubject; - dbTimeout: BehaviorSubject; - tableColumnLimit: BehaviorSubject; - highlightStyles: { wid: BehaviorSubject, color: BehaviorSubject }[]; - currHighlightIdx: BehaviorSubject; - compoundPadding: BehaviorSubject; - edgeCollapseLimit: BehaviorSubject; - objectInclusionType: BehaviorSubject; - queryResultPagination: BehaviorSubject<'Client' | 'Server'>; - selectionColor: BehaviorSubject; - selectionWidth: BehaviorSubject; - tilingPadding: BehaviorSubject, - - timebar: { - isEnabled: BehaviorSubject; - isHideDisconnectedNodesOnAnim: BehaviorSubject; - isMaintainGraphRange: BehaviorSubject - playingStep: BehaviorSubject; - playingPeriod: BehaviorSubject; - zoomingStep: BehaviorSubject; - statsInclusionType: BehaviorSubject; - } -} - -export enum TimebarGraphInclusionTypes { - overlaps = 0, contains = 1, contained_by = 2 -} - -export enum TimebarStatsInclusionTypes { - all = 0, begin = 1, middle = 2, end = 3 -} - -export enum MergedElemIndicatorTypes { - none = 0, selection = 1, highlight = 2 -} - -export enum GroupingOptionTypes { - compound = 0, clusterId = 1 -} - -export enum TextWrapTypes { - none = 0, wrap = 1, ellipsis = 2 -} - -export interface BoolSetting { - isEnable: boolean; - text: string; - path2userPref: string; -} - -export interface UserProfile { - queryRules: QueryRule[]; - timebarMetrics: TimebarMetric[]; - userPref: any; -} - -export interface SavedLists { - numberLists: { name: BehaviorSubject, values: BehaviorSubject[] }[] - stringLists: { name: BehaviorSubject, values: BehaviorSubject[] }[]; - enumLists: { name: BehaviorSubject, values: BehaviorSubject[] }[]; -} \ No newline at end of file diff --git a/src/app/visuall/user-profile.service.ts b/src/app/visuall/user-profile.service.ts deleted file mode 100644 index a793c96b..00000000 --- a/src/app/visuall/user-profile.service.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { Injectable } from '@angular/core'; -import { UserProfile } from './user-preference'; -import { QueryRule, TimebarMetric, RuleNode, deepCopyTimebarMetrics, deepCopyQueryRules } from './operation-tabs/map-tab/query-types'; -import { BehaviorSubject } from 'rxjs'; -import { GlobalVariableService } from './global-variable.service'; - -@Injectable({ - providedIn: 'root' -}) -export class UserProfileService { - - onLoadFromFile: BehaviorSubject = new BehaviorSubject(false); - constructor(private _g: GlobalVariableService) { } - - private getUserProfile() { - const p = localStorage.getItem('profile'); - if (!p) { - return null; - } - return JSON.parse(p) as UserProfile; - } - - private deleteParents(root: RuleNode) { - root.parent = null; - for (const child of root.children) { - this.deleteParents(child); - } - } - - addParents(root: RuleNode) { - for (const child of root.children) { - child.parent = root; - this.addParents(child); - } - } - - private getUserPrefs() { - const p = this.getUserProfile(); - if (p) { - return p.userPref; - } - return null; - } - - private userPref2RawData() { - const o = {}; - this.mapSubjectProperties(this._g.userPrefs, o); - return o; - } - - private mapSubjectProperties(obj, mappedObj) { - for (const k in obj) { - if (obj[k] instanceof BehaviorSubject) { - mappedObj[k] = (obj[k] as BehaviorSubject).getValue(); - } else { - if (obj[k] instanceof Array) { - mappedObj[k] = []; - } else { - mappedObj[k] = {}; - } - this.mapSubjectProperties(obj[k], mappedObj[k]); - } - } - } - - getQueryRules(): QueryRule[] { - const p = this.getUserProfile(); - if (p && p.queryRules) { - return p.queryRules; - } - return []; - } - - downloadProfileAsFile(isSaveSettings = true, isSaveQueryRules = true, isSaveTimebarStats = true) { - const p = this.getUserProfile(); - if (p) { - if (!isSaveSettings) { - p.userPref = undefined; - } - if (!isSaveQueryRules) { - p.queryRules = undefined; - } - if (!isSaveTimebarStats) { - p.timebarMetrics = undefined; - } - } - const str = JSON.stringify(p); - const element = document.createElement('a'); - element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(str)); - element.setAttribute('download', 'Visuall_User_Profile.vall'); - - element.style.display = 'none'; - document.body.appendChild(element); - - element.click(); - - document.body.removeChild(element); - } - - setUserProfile(txt: string) { - localStorage.setItem('profile', txt); - this.onLoadFromFile.next(true); - } - - isStoreProfile() { - const p = this.getUserProfile(); - if (!p || !p.userPref || p.userPref.isStoreUserProfile === undefined || p.userPref.isStoreUserProfile == null) { - return this._g.userPrefs.isStoreUserProfile; - } - return p.userPref.isStoreUserProfile; - } - - saveQueryRules(f: QueryRule[]) { - const p = this.getUserProfile(); - if (p) { - let m2 = deepCopyQueryRules(f); - for (const m of m2) { - this.deleteParents(m.rules.rules); - } - p.queryRules = m2; - localStorage.setItem('profile', JSON.stringify(p)); - } else { - localStorage.setItem('profile', JSON.stringify({ queryRules: f })); - } - } - - getTimebarMetrics(): TimebarMetric[] { - const p = this.getUserProfile(); - if (p && p.timebarMetrics) { - return p.timebarMetrics; - } - return []; - } - - saveTimebarMetrics(t: TimebarMetric[]) { - const p = this.getUserProfile(); - if (p) { - let t2 = deepCopyTimebarMetrics(t); - for (const m of t2) { - this.deleteParents(m.rules); - } - p.timebarMetrics = t2; - localStorage.setItem('profile', JSON.stringify(p)); - } else { - localStorage.setItem('profile', JSON.stringify({ timebarMetrics: [] })); - } - } - - transferUserPrefs() { - const p = this.getUserPrefs(); - this._g.transfer2UserPrefs(p); - } - - transferIsStoreUserProfile() { - const p = this.getUserProfile(); - if (p && p.userPref && typeof p.userPref.isStoreUserProfile === 'boolean') { - this._g.userPrefs.isStoreUserProfile.next(p.userPref.isStoreUserProfile); - } - } - - saveUserPrefs() { - const p = this.getUserProfile(); - if (p) { - p.userPref = this.userPref2RawData(); - localStorage.setItem('profile', JSON.stringify(p)); - } else { - const up = this.userPref2RawData(); - localStorage.setItem('profile', JSON.stringify({ userPref: up })); - } - } - -} diff --git a/src/assets/.DS_Store b/src/assets/.DS_Store deleted file mode 100644 index 88d56c3a..00000000 Binary files a/src/assets/.DS_Store and /dev/null differ diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/assets/appPref.json b/src/assets/appPref.json deleted file mode 100644 index 401d2c3b..00000000 --- a/src/assets/appPref.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "isAutoIncrementalLayoutOnChange": true, - "isHighlightOnHover": true, - "isShowOverviewWindow": false, - "isShowEdgeLabels": true, - "isTileDisconnectedOnLayout": true, - "isIgnoreCaseInText": false, - "isOnlyHighlight4LatestQuery": true, - "isStoreUserProfile": true, - "isCollapseEdgesBasedOnType": false, - "isCollapseMultiEdgesOnLoad": true, - "isLimitDbQueries2range": true, - "dbQueryTimeRange": { - "start": -5364669352000, - "end": 4102434000000 - }, - "savedLists": { - "numberLists": [], - "stringLists": [], - "enumLists": [] - }, - "dataPageSize": 15, - "dataPageLimit": 15, - "queryNeighborLimit": 7, - "queryHistoryLimit": 10, - "dbTimeout": 30, - "tableColumnLimit": 3, - "highlightStyles": [ - { - "wid": 3, - "color": "#FCE903" - }, - { - "wid": 3, - "color": "#00ffff" - }, - { - "wid": 3, - "color": "#04f06a" - }, - { - "wid": 3, - "color": "#ff0000" - } - ], - "currHighlightIdx": 0, - "selectionColor": "#6c757d", - "selectionWidth": 4.5, - "groupingOption": 0, - "mergedElemIndicator": 2, - "nodeLabelWrap": 0, - "compoundPadding": "5%", - "edgeCollapseLimit": 2, - "avgNodeSize": 40, - "objectInclusionType": 0, - "queryResultPagination": "Client", - "tilingPadding": 4, - "timebar": { - "isEnabled": false, - "playingStep": 50, - "playingPeriod": 1350, - "zoomingStep": 50, - "statsInclusionType": 0, - "isHideDisconnectedNodesOnAnim": false, - "isMaintainGraphRange": false - } -} \ No newline at end of file diff --git a/src/assets/bash_script/docker_scripts.sh b/src/assets/bash_script/docker_scripts.sh deleted file mode 100644 index e14175d1..00000000 --- a/src/assets/bash_script/docker_scripts.sh +++ /dev/null @@ -1,6 +0,0 @@ -# docker generated neo4j databases will restart themselves after reboot -sudo docker run --name hydra --restart unless-stopped --log-opt max-size=50m --log-opt max-file=10 -p7474:7474 -p7687:7687 -d -v /home/newt-beta-server/neo4j_databases/hydra/data:/data -v /home/newt-beta-server/neo4j_databases/hydra/logs:/logs --env NEO4J_AUTH=neo4j/123 neo4j -sudo docker run --name visuall --restart unless-stopped --log-opt max-size=50m --log-opt max-file=10 -p3001:7474 -p3002:7473 -p3003:7687 -d -v /home/newt-beta-server/neo4j_databases/visuall/data:/data -v /home/newt-beta-server/neo4j_databases/visuall/logs:/logs --env NEO4J_AUTH=none neo4j - -# list files and their size in the directory /var/log -sudo du -h /var/log | sort -h \ No newline at end of file diff --git a/src/assets/cy-style.json b/src/assets/cy-style.json deleted file mode 100644 index 4f2201c3..00000000 --- a/src/assets/cy-style.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "general": [{ - "selector": ".hidden", - "style": { - "display": "none" - } - }, - { - "selector": "node", - "style": { - "background-opacity": 0, - "font-size": "13px", - "text-valign": "center", - "text-halign": "center", - "background-color": "#555", - "text-outline-color": "#555", - "text-outline-width": "2px", - "color": "#fff", - "overlay-color": "#6c757d", - "overlay-padding": "6px", - "z-index": "10", - "text-max-width": "44px" - } - }, - { - "selector": "node:selected", - "style": { - "overlay-color": "#6c757d", - "overlay-opacity": 0.3, - "background-color": "#999999" - } - }, - { - "selector": "edge:selected", - "style": { - "overlay-color": "#6c757d", - "overlay-opacity": 0.3, - "line-color": "#808080" - } - }, - { - "selector": "edge", - "style": { - "font-size": "13px", - "text-outline-color": "#ffffff", - "text-outline-width": "2px", - "control-point-step-size": 13, - "curve-style": "bezier" - } - }, - { - "selector": "node.Cluster", - "style": { - "background-opacity": 0.07, - "background-color": "#555", - "shape": "barrel", - "border-color": "black", - "font-size": "9px" - } - }, - { - "selector": "node.cy-expand-collapse-collapsed-node", - "style": { - "label": "data(name)", - "font-size": "9px", - "border-color": "black", - "border-width": 1, - "border-style": "dotted", - "background-opacity": 0, - "shape": "barrel" - } - }, - { - "selector": ":compound", - "style": { - "padding": "5%" - } - }, - { - "selector": "edge.cy-expand-collapse-collapsed-edge", - "style": { - "font-size": "7px", - "line-style": "dotted", - "target-arrow-shape": "triangle", - "text-rotation": "autorotate" - } - }, - { - "selector": "node.clusterByDeveloper", - "style": { - "label": "data(name)", - "background-opacity": 0.07, - "background-color": "#555", - "shape": "barrel", - "border-color": "black", - "overlay-padding":30, - "font-size": "16px", - "text-valign": "top", - "text-halign": "center", - "text-outline-color": "#555", - "text-outline-width": "2px", - "color": "#fff" - } - } - ] -} diff --git a/src/assets/db_script/add_genre.cql b/src/assets/db_script/add_genre.cql deleted file mode 100644 index 5b91b8e4..00000000 --- a/src/assets/db_script/add_genre.cql +++ /dev/null @@ -1,102 +0,0 @@ -// python scripts used to generate CQL -// ----------------------------------------- start of python script -------------------------------------------- -// # movie_id2title = {} - -// # with open('movie_node.csv') as f: -// # i = 0 -// # for l in f.readlines(): -// # i = i + 1 -// # if i == 1: -// # continue -// # arr = l.split(';') -// # movie_id2title[arr[0]] = arr[1].replace('\n', '') -// # print (movie_id2title) - -// # print ('\n-----------------------------------------------------------------------------------\n') -// # genre_id2txt = {} - -// # with open('genre_node.csv') as f: -// # i = 0 -// # for l in f.readlines(): -// # i = i + 1 -// # if i == 1: -// # continue -// # arr = l.split(';') -// # genre_id2txt[arr[0]] = arr[1].replace('\n', '') -// # print (genre_id2txt) - -// # movie_id2_genre_id = {} - -// # with open('has_genre_rels.csv') as f: -// # i = 0 -// # for l in f.readlines(): -// # i = i + 1 -// # if i == 1: -// # continue -// # arr = l.split(';') -// # movie_id2_genre_id[arr[0]] = arr[1].replace('\n', '') -// # print (movie_id2_genre_id) - - -// import re -// movies = [] - -// with open('Nodes.csv') as f: -// for l in f.readlines(): -// if 'title:' in l: -// m = {} -// arr = re.split(':|,', l) -// i = 0 -// for v in arr: -// if v == 'title': -// m['t'] = arr[i+1] -// if v == 'genre': -// m['g'] = arr[i+1] -// i = i + 1 -// movies.append(m) - -// print(movies) - -// with open('cql.txt', 'w') as f: -// for m in movies: -// f.write('MATCH (n:Movie{title: \'' + m['t'] + '\'}) SET n.genre = \'' + m['g'] + '\';\n') -// ----------------------------------------- end of python script -------------------------------------------- - -MATCH (n:Movie{title: 'The Matrix'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'The Matrix Reloaded'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'The Matrix Revolutions'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'The Devil\'s Advocate'}) SET n.genre = 'Thriller'; -MATCH (n:Movie{title: 'A Few Good Men'}) SET n.genre = 'Crime'; -MATCH (n:Movie{title: 'Top Gun'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'Jerry Maguire'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'Stand By Me'}) SET n.genre = 'Drama'; -MATCH (n:Movie{title: 'As Good as It Gets'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'What Dreams May Come'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'Snow Falling on Cedars'}) SET n.genre = 'Drama'; -MATCH (n:Movie{title: 'You\'ve Got Mail'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'Sleepless in Seattle'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'Joe Versus the Volcano'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'When Harry Met Sally'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'That Thing You Do'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'The Replacements'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'RescueDawn'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'The Birdcage'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'Unforgiven'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'Johnny Mnemonic'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'Cloud Atlas'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'The Da Vinci Code'}) SET n.genre = 'Drama'; -MATCH (n:Movie{title: 'V for Vendetta'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'Speed Racer'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'Ninja Assassin'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'The Green Mile'}) SET n.genre = 'Crime'; -MATCH (n:Movie{title: 'Frost/Nixon'}) SET n.genre = 'Drama'; -MATCH (n:Movie{title: 'Hoffa'}) SET n.genre = 'Crime'; -MATCH (n:Movie{title: 'Apollo 13'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'Twister'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'Cast Away'}) SET n.genre = 'Action'; -MATCH (n:Movie{title: 'One Flew Over the Cuckoo\'s Nest'}) SET n.genre = 'Drama'; -MATCH (n:Movie{title: 'Something\'s Gotta Give'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'Bicentennial Man'}) SET n.genre = 'Drama'; -MATCH (n:Movie{title: 'Charlie Wilson\'s War'}) SET n.genre = 'Comedy'; -MATCH (n:Movie{title: 'The Polar Express'}) SET n.genre = 'Adventure'; -MATCH (n:Movie{title: 'A League of Their Own'}) SET n.genre = 'Comedy'; diff --git a/src/assets/db_script/apoc_import_export.cql b/src/assets/db_script/apoc_import_export.cql deleted file mode 100644 index cd1d2fb7..00000000 --- a/src/assets/db_script/apoc_import_export.cql +++ /dev/null @@ -1,26 +0,0 @@ -// apoc plugin must be installed -// ------------------------------------------------- 'neo4j.conf' changes for APOC ------------------------------------------------- -// full access to the database through unsupported/insecure internal APIs. -dbms.security.procedures.unrestricted=algo.*,apoc.* - -// apoc must be enabled to import export -apoc.export.file.enabled=true -apoc.import.file.enabled=true -// ------------------------------------------------- 'neo4j.conf' changes for APOC ------------------------------------------------- - -// ------------------------------------------------- things to change in 'neo4j.conf' for multiple servers ------------------------------------------------- -// # To accept non-local connections, uncomment this line: -dbms.connectors.default_listen_address=0.0.0.0 -dbms.connector.bolt.listen_address=:3003 -dbms.connector.https.listen_address=:3002 -dbms.connector.http.listen_address=:3001 -// ------------------------------------------------- things to change in 'neo4j.conf' for multiple servers ------------------------------------------------- - -// export all data with this -call apoc.export.cypher.all( "/mysubset.cypher", {format:'plain',separateFiles:true}); - -// import data step by step -call apoc.cypher.runSchemaFile('/mysubset.schema.cypher'); -call apoc.cypher.runFiles(['/mysubset.nodes.cypher','/mysubset.relationships.cypher']); -call apoc.cypher.runFile('/mysubset.cleanup.cypher'); -call apoc.cypher.runSchemaFile('/mysubset.cleanup.cypher'); \ No newline at end of file diff --git a/src/assets/db_script/generate_dateTime_properties.cql b/src/assets/db_script/generate_dateTime_properties.cql deleted file mode 100644 index d4ea2ac6..00000000 --- a/src/assets/db_script/generate_dateTime_properties.cql +++ /dev/null @@ -1,119 +0,0 @@ -// generate_dateTime_properties.cql -// delete all start and end time features of all edges -MATCH ()-[e]-() -WHERE EXISTS(e.begin_datetime) -SET e.begin_datetime = NULL, e.end_datetime = NULL; - -// delete all start and end time features of all nodes -MATCH (n) -WHERE EXISTS(n.begin_datetime) -SET n.begin_datetime = NULL, n.end_datetime = NULL; - -// assign random start and end time to all edges -// MATCH ()-[e]-() -// WHERE NOT EXISTS(e['begin_datetime']) -// // corresponds to the date "Mon Jan 01 2018 00:00:00 GMT+0300 (GMT+03:00)" in JS -// WITH e, 1514754000000 as d1 -// // corresponds to the date "Fri Mar 15 2019 09:44:34 GMT+0300 (GMT+03:00)" in JS -// ,1552632274954 as d2 -// // corresponds to the date "Fri Mar 15 2019 09:44:34 GMT+0300 (GMT+03:00)" in JS -// , 37878274954 as deltaTime -// SET e.begin_datetime = d1 + round(RAND() * deltaTime), -// e.end_datetime = e.begin_datetime + round(RAND() * (d2-e.begin_datetime)); - -// assign start and end time edges by giving the same range to all edges which source is common -// match (n1) -// with collect(id(n1)) as node_ids, 1514754000000 + round(RAND() * 37878274954) as seed -// unwind node_ids as curr_id -// match (n)-[r]-() -// where id(n) = curr_id -// // 86400000 is 1 day -// set r.begin_datetime = seed, r.end_datetime = seed + 86400000 - -// assign start and end time to Directed, Produced -match (n1) -with collect(id(n1)) as node_ids -unwind node_ids as curr_id - match (n:Movie)-[r:DIRECTED|PRODUCED]-(n2:Person) - where id(n) = curr_id - // 31536000000 is 1 year - set r.begin = (n.released - 1970) * 31536000000, - r.end = (n.released - 1969) * 31536000000 - -// assign start and end time to Acted In -match (n1) -with collect(id(n1)) as node_ids -unwind node_ids as curr_id - match (n:Movie)-[r:ACTED_IN]-(n2:Person) - where id(n) = curr_id - // 31536000000 is 1 year - set r.act_begin = (n.released - 1970) * 31536000000, - r.act_end = (n.released - 1969) * 31536000000 - -// assign start and end time to Wrote -match (n1) -with collect(id(n1)) as node_ids -unwind node_ids as curr_id - match (n:Movie)-[r:WROTE]-(n2:Person) - where id(n) = curr_id - // 31536000000 is 1 year - set r.occurence_begin = (n.released - 1970 - (3 + round(RAND() * 7)) ) * 31536000000, - r.occurence_end = (n.released - 1970) * 31536000000 - -// assign start and end time to Reviewed -match (n1) -with collect(id(n1)) as node_ids -unwind node_ids as curr_id - match (n:Movie)-[r:REVIEWED]-(n2:Person) - where id(n) = curr_id - // 31536000000 is 1 year - set r.begin = (n.released - 1970 - (3 + round(RAND() * 7)) ) * 31536000000, - r.end = (n.released - 1970) * 31536000000 - - -// some persons have null born values, set them to a default value -match (n:Person) where n.born is null set n.born = 1971; - -// assign start and end time to Follows -match (n:Person)-[r:FOLLOWS]-(n2:Person) -// 31536000000 is 1 year -set r.begin = (n.born - 1970 ) * 31536000000, -r.end = (n.born - 1970 + 3 + round(RAND() * 7) ) * 31536000000 - -// assign start time to a Person node by born date, +INF (2050) as end time -match (n:Person) -set n.start_t = (n.born - 1970) * 31536000000 + round(RAND() * 31536000000), -n.end_t = (2050 - 1970) * 31536000000 - -// assign start time to a Movie node by released date, +INF (2050) as end time -match (n:Movie) -set n.begin = (n.released - 1970) * 31536000000 + round(RAND() * 31536000000), -n.end = (2050 - 1970) * 31536000000 - -// assign random ratings with precision .1 -match (n:Movie) -set n.rating = round(10.0^1 * RAND() * 10)/10.0^1 - -// bug fix for movie begin -match (n:Movie) -set n.begin = n.begin - 31536000000 -// bug fix for reviwed -match (n1:Person)-[r:REVIEWED]->(n2:Movie) -set r.begin = (n2.released - 1970) * 31536000000 + round(RAND() * 3) * 31536000000, -r.end = (2050 - 1970) * 31536000000 - -// // assign start and end time to a node by covering start and end times of all its edges -// match (n1) -// with collect(id(n1)) as node_ids -// unwind node_ids as curr_id -// match (n)-[r]-() -// where id(n) = curr_id -// WITH n, MIN(r.begin_datetime) as minStart, MAX(r.end_datetime) as maxEnd -// set n.begin_datetime = minStart - 10000, -// n.end_datetime = maxEnd + 10000 - -// check if a node start-end time cover its edges -match(n1)-[r]-(n2) -with n1, MIN(r.begin_datetime) as minStart, AVG(r.begin_datetime) as avgStart -, MAX(r.end_datetime) as maxEnd, AVG(r.end_datetime) as avgEnd -return n1.begin_datetime, minStart, maxEnd, n1.end_datetime, avgStart, avgEnd \ No newline at end of file diff --git a/src/assets/db_script/imdb.cql b/src/assets/db_script/imdb.cql deleted file mode 100644 index 56896a5d..00000000 --- a/src/assets/db_script/imdb.cql +++ /dev/null @@ -1,157 +0,0 @@ -// generate people -CREATE CONSTRAINT ON (n:Person) ASSERT n.nconst IS UNIQUE; -:auto -USING PERIODIC COMMIT 10000 -LOAD CSV WITH HEADERS FROM 'file:///name-basics.tsv' AS r FIELDTERMINATOR '\t' -WITH toInteger(COALESCE(r.birthYear, 1900)) as birthYear, toInteger(COALESCE(r.deathYear, 2100)) as deathYear, split(r.primaryProfession, ',') as primaryProfession, -r.nconst as nconst, r.primaryName as primaryName -MERGE (n:Person {nconst: nconst}) -ON CREATE SET n.primary_name = primaryName, n.birth_year = toInteger(birthYear), n.death_year = toInteger(deathYear), -n.primary_profession = primaryProfession, n.start_t = (birthYear - 1970) * 31557600000, n.end_t = (deathYear - 1970) * 31557600000 - -// generate movies -CREATE CONSTRAINT ON (n:Movie) ASSERT n.tconst IS UNIQUE; -:auto -USING PERIODIC COMMIT 10000 -LOAD CSV WITH HEADERS FROM 'file:///title-basic.tsv' AS r FIELDTERMINATOR '\t' -WITH r.primaryTitle as primaryTitle, toInteger(r.runtimeMinutes) as runtimeMinutes, r.titleType as titleType, toInteger(r.production_end_date) as production_end_date, -toInteger(r.startYear) as startYear, toFloat(r.rating) as rating,toInteger(r.numVotes) as numVotes, toInteger(r.shooting_end_date) as shooting_end_date, -toInteger(r.endYear) as endYear, toInteger(r.production_start_date) as production_start_date, r.tconst as tconst, r.originalTitle as originalTitle, -toInteger(r.shooting_start_date) as shooting_start_date, split(r.genres, ',') as genres, toInteger(r.isAdult) as isAdult -MERGE (n:Movie {tconst: tconst}) -ON CREATE SET n.primary_title = primaryTitle, n.runtime_minutes = runtimeMinutes, n.title_type = titleType, n.production_end_date = production_end_date, -n.start_year = startYear, n.rating = rating, n.count_votes = numVotes, n.shooting_end_date = shooting_end_date, n.end_year = endYear, n.production_start_date = production_start_date, -n.original_title = originalTitle, n.shooting_start_date = shooting_start_date, n.genres = genres, n.is_adult = isAdult - -// generate KNOWN_FOR edges -:auto -USING PERIODIC COMMIT 10000 -LOAD CSV WITH HEADERS FROM 'file:///name-basics.tsv' AS r FIELDTERMINATOR '\t' -WITH split(r.knownForTitles, ',') as known4, r.nconst as nconst -UNWIND known4 as tconst -MATCH (p:Person {nconst:nconst}) -MATCH (m:Movie {tconst:tconst}) -MERGE (p)-[:KNOWN_FOR {}]->(m) - -// generate DIRECTOR edges from crew file -:auto -USING PERIODIC COMMIT 10000 -LOAD CSV WITH HEADERS FROM 'file:///title-crew.tsv' AS r FIELDTERMINATOR '\t' -WITH r.tconst as tconst, split(r.directors, ',') as directors -UNWIND directors as nconst -MATCH (p:Person {nconst:nconst}) -MATCH (m:Movie {tconst:tconst}) -MERGE (p)-[:DIRECTOR {}]->(m) - -// generate WRITER edges from crew file -:auto -USING PERIODIC COMMIT 10000 -LOAD CSV WITH HEADERS FROM 'file:///title-crew.tsv' AS r FIELDTERMINATOR '\t' -WITH r.tconst as tconst, split(r.writers, ',') as writers -UNWIND writers as nconst -MATCH (p:Person {nconst:nconst}) -MATCH (m:Movie {tconst:tconst}) -MERGE (p)-[:WRITER {}]->(m) - -// generate DIRECTOR edges from principals file -:auto -USING PERIODIC COMMIT 10000 -LOAD CSV WITH HEADERS FROM 'file:///title-principals.tsv' AS r FIELDTERMINATOR '\t' -WITH r.tconst as tconst, r.nconst as nconst, r.category as category, r.job as job, split(r.characters, ',') as characters -MATCH (p:Person {nconst:nconst}) -MATCH (m:Movie {tconst:tconst}) -FOREACH (_ IN CASE WHEN category='self' THEN [1] ELSE [] END | - MERGE (p)-[:SELF {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='director' THEN [1] ELSE [] END | - MERGE (p)-[:DIRECTOR {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='cinematographer' THEN [1] ELSE [] END | - MERGE (p)-[:CINEMATOGRAPHER {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='actor' THEN [1] ELSE [] END | - MERGE (p)-[:ACTOR {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='producer' THEN [1] ELSE [] END | - MERGE (p)-[:PRODUCER {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='writer' THEN [1] ELSE [] END | - MERGE (p)-[:WRITER {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='actress' THEN [1] ELSE [] END | - MERGE (p)-[:ACTRESS {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='composer' THEN [1] ELSE [] END | - MERGE (p)-[:COMPOSER {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='production_designer' THEN [1] ELSE [] END | - MERGE (p)-[:PRODUCTION_DESIGNER {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='editor' THEN [1] ELSE [] END | - MERGE (p)-[:EDITOR {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='archive_footage' THEN [1] ELSE [] END | - MERGE (p)-[:ARCHIVE_FOOTAGE {job: job, characters: characters}]->(m) -) -FOREACH (_ IN CASE WHEN category='archive_sound' THEN [1] ELSE [] END | - MERGE (p)-[:ARCHIVE_SOUND {job: job, characters: characters}]->(m) -) - -// delete the duplicated WRITER and DIRECTOR edges -match (n:Person)-[e:DIRECTOR]->(n2:Movie) -where size((n)-[:DIRECTOR]->(n2)) > 1 and e.job is null -delete e; -match (n:Person)-[e:WRITER]->(n2:Movie) -where size((n)-[:WRITER]->(n2)) > 1 and e.job is null -delete e; - -// update date times of Movie -:auto -USING PERIODIC COMMIT 10000 -LOAD CSV WITH HEADERS FROM 'file:///injected_data.tsv' AS r FIELDTERMINATOR '\t' -WITH r.tconst as id, toInteger(r.production_end_date) as p2, toInteger(r.production_start_date) as p1, toInteger(r.shooting_start_date) as s1, toInteger(r.shooting_end_date) as s2 -MATCH (n:Movie {tconst: id}) -set n.production_end_date = p2, n.production_start_date = p1, n.shooting_start_date = s1, n.shooting_end_date = s2 - -// update date times of ACTOR and ACTRESS -match(p:Person)-[e:ACTOR|ACTRESS]->(m:Movie) -set e.act_begin = m.shooting_start_date, e.act_end = m.shooting_end_date - -// update date times of others -match(p:Person)-[e:SELF|DIRECTOR|WRITER|ARCHIVE_SOUND|ARCHIVE_FOOTAGE|EDITOR|PRODUCTION_DESIGNER|COMPOSER|PRODUCER|CINEMATOGRAPHER]->(m:Movie) -set e.begin = m.production_start_date, e.end = m.production_end_date - -// forgot to make known for, also that that this operation might require to set a higher "dbms.memory.heap.max_size=8G" in neo4j.conf -match (:Person)-[e:KNOWN_FOR]->(m:Movie) -set e.begin = m.production_start_date, e.end = m.production_end_date - -// make empty properties empty -match ()-[e]->() -where e.characters[0] = '\\N' -set e.characters = [] - -match ()-[e]->() -where e.job = '\\N' -set e.job = '' - -// delete person with no deathYear AND no birthYear -match (n:Person) -where n.birth_year is null and n.death_year is null -DETACH DELETE n - -:auto -USING PERIODIC COMMIT 10000 -LOAD CSV WITH HEADERS FROM 'file:///name2-unix-times.tsv' AS r FIELDTERMINATOR '\t' -with r.nconst as nconst, toInteger(r.start_t) as start_t, toInteger(r.end_t) as end_t -match (n:Person {nconst: nconst}) -set n.start_t = start_t, n.end_t = end_t - -// fix movies which does not contain genres -MATCH (m:Movie) -where m.genres = ["\\N"] -set m.genres = [] - -// rename Movie to Title -MATCH (n:Movie) -SET n:Title -REMOVE n:Movie \ No newline at end of file diff --git a/src/assets/generated/endpoints.json b/src/assets/generated/endpoints.json deleted file mode 100644 index 22c97ea3..00000000 --- a/src/assets/generated/endpoints.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "BLOCKS": { - "sourceNodeType": "Issue", - "targetNodeType": "Issue" - }, - "ASSIGNED_TO": { - "sourceNodeType": "Issue", - "targetNodeType": "Developer" - }, - "RESOLVED": { - "sourceNodeType": "Developer", - "targetNodeType": "Issue" - }, - "COMMENTED": { - "sourceNodeType": "Developer", - "targetNodeType": "Issue" - }, - "ASSIGNED_BY": { - "sourceNodeType": "Issue", - "targetNodeType": "Developer" - }, - "COMMITTED": { - "sourceNodeType": "Developer", - "targetNodeType": "Commit" - }, - "DEPENDS_UPON": { - "sourceNodeType": "Issue", - "targetNodeType": "Issue" - }, - "DUPLICATES": { - "sourceNodeType": "Issue", - "targetNodeType": "Issue" - }, - "FIXES": { - "sourceNodeType": "Issue", - "targetNodeType": "Issue" - }, - "CONTAINS": { - "sourceNodeType": "Commit", - "targetNodeType": "File" - }, - "INCLUDES": { - "sourceNodeType": "PullRequest", - "targetNodeType": "Commit" - }, - "INCORPORATES": { - "sourceNodeType": "Issue", - "targetNodeType": "Issue" - }, - "IS_A_CLONE_OF": { - "sourceNodeType": "Issue", - "targetNodeType": "Issue" - }, - "OPENED": { - "sourceNodeType": "Developer", - "targetNodeType": "PullRequest" - }, - "REFERENCED_PR": { - "sourceNodeType": "Issue", - "targetNodeType": "PullRequest" - }, - "REFERENCED_COMMIT": { - "sourceNodeType": "Issue", - "targetNodeType": "Commit" - }, - "RELATES_TO": { - "sourceNodeType": "Issue", - "targetNodeType": "Issue" - }, - "MERGED": { - "sourceNodeType": "Developer", - "targetNodeType": "PullRequest" - }, - "RENAMED_TO": { - "sourceNodeType": "File", - "targetNodeType": "File" - }, - "REPORTED": { - "sourceNodeType": "Developer", - "targetNodeType": "Issue" - }, - "CLOSED": { - "sourceNodeType": "Developer", - "targetNodeType": "Issue" - }, - "REVIEWED": { - "sourceNodeType": "Developer", - "targetNodeType": "PullRequest" - }, - "SUPERSEDES": { - "sourceNodeType": "Issue", - "targetNodeType": "Issue" - } -} \ No newline at end of file diff --git a/src/assets/generated/properties.json b/src/assets/generated/properties.json deleted file mode 100644 index 350cf837..00000000 --- a/src/assets/generated/properties.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "nodes": { - "Commit": { - "name": "string", - "createdAt": "datetime", - "end": "datetime", - "url": "string" - }, - "Developer": { - "name": "string", - "email": "string", - "start": "datetime", - "end": "datetime" - }, - "File": { - "name": "string", - "createdAt": "datetime", - "end": "datetime", - "url": "string" - }, - "Issue": { - "name": "string", - "issueType": "enum,string", - "priority": "enum,string", - "status": "enum,string", - "createdAt": "datetime", - "closeDate": "datetime", - "resolutionDate": "datetime", - "title": "string", - "url": "string", - "reporter": "string", - "assigner": "string", - "assignee": "string", - "resolver": "string", - "closer": "string", - "duplicate": "string", - "assigneeChangeCount": "integer", - "environment": "string", - "reopenCount": "integer", - "affectedVersion": "string" - }, - "PullRequest": { - "name": "string", - "mergeStatus": "enum,string", - "headBranch": "string", - "createdAt": "datetime", - "closeDate": "datetime", - "changeLineOfCode": "int", - "numberOfCommits": "int", - "numberOfChangeFiles": "int", - "title": "string", - "url": "string" - } - }, - "edges": { - "BLOCKS": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "ASSIGNED_TO": { - "recency": "float", - "end": "datetime", - "createdAt": "datetime" - }, - "RESOLVED": { - "recency": "float", - "end": "datetime", - "createdAt": "datetime" - }, - "COMMENTED": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime", - "commentCount": "string" - }, - "ASSIGNED_BY": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "COMMITTED": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "DEPENDS_UPON": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "DUPLICATES": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "FIXES": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "CONTAINS": { - "recency": "float", - "changeLOC": "integer", - "createdAt": "datetime", - "end": "datetime" - }, - "INCLUDES": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "INCORPORATES": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "IS_A_CLONE_OF": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "OPENED": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "REFERENCED_PR": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "REFERENCED_COMMIT": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "RELATES_TO": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "MERGED": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "RENAMED_TO": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "REPORTED": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "CLOSED": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "REVIEWED": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - }, - "SUPERSEDES": { - "recency": "float", - "createdAt": "datetime", - "end": "datetime" - } - } -} \ No newline at end of file diff --git a/src/assets/generated/stylesheet.json b/src/assets/generated/stylesheet.json deleted file mode 100644 index f6ac9ac5..00000000 --- a/src/assets/generated/stylesheet.json +++ /dev/null @@ -1,517 +0,0 @@ -[ - { - "selector": ".hidden", - "style": { - "display": "none" - } - }, - { - "selector": "node", - "style": { - "background-opacity": 0, - "font-size": "13px", - "text-valign": "center", - "text-halign": "center", - "background-color": "#555", - "text-outline-color": "#555", - "text-outline-width": "2px", - "color": "#fff", - "overlay-color": "#6c757d", - "overlay-padding": "6px", - "z-index": "10", - "text-max-width": "44px" - } - }, - { - "selector": "node:selected", - "style": { - "overlay-color": "#6c757d", - "overlay-opacity": 0.3, - "background-color": "#999999" - } - }, - { - "selector": "edge:selected", - "style": { - "overlay-color": "#6c757d", - "overlay-opacity": 0.3, - "line-color": "#808080" - } - }, - { - "selector": "edge", - "style": { - "font-size": "13px", - "text-outline-color": "#ffffff", - "text-outline-width": "2px", - "control-point-step-size": 13, - "curve-style": "bezier" - } - }, - { - "selector": "node.Cluster", - "style": { - "background-opacity": 0.07, - "background-color": "#555", - "shape": "barrel", - "border-color": "black", - "font-size": "9px" - } - }, - { - "selector": "node.cy-expand-collapse-collapsed-node", - "style": { - "label": "data(name)", - "font-size": "9px", - "border-color": "black", - "border-width": 1, - "border-style": "dotted", - "background-opacity": 0, - "shape": "barrel" - } - }, - { - "selector": ":compound", - "style": { - "padding": "5%" - } - }, - { - "selector": "edge.cy-expand-collapse-collapsed-edge", - "style": { - "font-size": "7px", - "line-style": "dotted", - "target-arrow-shape": "triangle", - "text-rotation": "autorotate" - } - }, - { - "selector": "node.clusterByDeveloper", - "style": { - "label": "data(name)", - "background-opacity": 0.07, - "background-color": "#555", - "shape": "barrel", - "border-color": "black", - "overlay-padding": 30, - "font-size": "16px", - "text-valign": "top", - "text-halign": "center", - "text-outline-color": "#555", - "text-outline-width": "2px", - "color": "#fff" - } - }, - { - "selector": "node.Commit", - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "text-wrap": "ellipsis", - "font-size": "11px", - "background-image": "app/custom/assets/commit.svg", - "shape": "diamond", - "background-fit": "contain", - "width": "27px", - "height": "27px", - "text-width": "100px", - "text-outline-color": "#ffffff", - "color": "#bd7ebe", - "text-outline-width": "1px" - } - }, - { - "selector": "node.Developer", - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "font-size": "11px", - "background-image": "app/custom/assets/developer.svg", - "shape": "ellipse", - "background-fit": "contain", - "width": "24px", - "height": "24px", - "text-max-width": "60px", - "text-outline-color": "#ffffff", - "color": "#976e6e", - "text-outline-width": "1px" - } - }, - { - "selector": "node.File", - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "font-size": "11px", - "background-image": "app/custom/assets/file.svg", - "shape": "rectangle", - "text-wrap": "ellipsis", - "background-fit": "contain", - "width": "20px", - "height": "24px", - "text-max-width": "60px", - "text-outline-color": "#ffffff", - "color": "#6988a5", - "text-outline-width": "1px" - } - }, - { - "selector": "node.Issue", - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "text-outline-color": "#ffffff", - "color": "#4C5F7A", - "text-outline-width": "1px", - "font-size": "11px", - "shape": "rectangle", - "background-fit": "contain", - "background-image": "app/custom/assets/issue.svg", - "width": "32px", - "height": "32px" - } - }, - { - "selector": "node.PullRequest", - "style": { - "label": "data(name)", - "text-valign": "bottom", - "text-margin-y": "-5px", - "font-size": "11px", - "background-image": "app/custom/assets/pull-request.svg", - "shape": "ellipse", - "background-fit": "contain", - "width": "24px", - "height": "24px", - "text-outline-color": "#ffffff", - "color": "#71aa9f", - "text-outline-width": "1px" - } - }, - { - "selector": "edge.BLOCKS", - "style": { - "label": "blocks", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.ASSIGNED_TO", - "style": { - "label": "assigned to", - "font-size": "11px", - "width": "1px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.RESOLVED", - "style": { - "label": "resolved", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.COMMENTED", - "style": { - "label": "commented", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.ASSIGNED_BY", - "style": { - "label": "assigned by", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.COMMITTED", - "style": { - "label": "committed", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.DEPENDS_UPON", - "style": { - "label": "depends_upon", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.DUPLICATES", - "style": { - "label": "duplicates", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.FIXES", - "style": { - "label": "fixes", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.CONTAINS", - "style": { - "label": "contains", - "width": "1px", - "font-size": "11px", - "line-color": "#bd7ebe", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#bd7ebe", - "text-rotation": "autorotate", - "color": "#bd7ebe" - } - }, - { - "selector": "edge.INCLUDES", - "style": { - "label": "includes", - "width": "1px", - "font-size": "11px", - "line-color": "#71aa9f", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#71aa9f", - "text-rotation": "autorotate", - "color": "#71aa9f" - } - }, - { - "selector": "edge.INCORPORATES", - "style": { - "label": "incorporates", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.IS_A_CLONE_OF", - "style": { - "label": "is a clone of", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.OPENED", - "style": { - "label": "opened", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.REFERENCED_PR", - "style": { - "label": "referenced", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.REFERENCED_COMMIT", - "style": { - "label": "referenced", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.RELATES_TO", - "style": { - "label": "relates to", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - }, - { - "selector": "edge.MERGED", - "style": { - "label": "merged", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.RENAMED_TO", - "style": { - "label": "renamed to", - "width": "1px", - "font-size": "11px", - "line-color": "#6988a5", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#6988a5", - "text-rotation": "autorotate", - "color": "#6988a5" - } - }, - { - "selector": "edge.REPORTED", - "style": { - "label": "reported", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.CLOSED", - "style": { - "label": "closed", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.REVIEWED", - "style": { - "label": "reviewed", - "width": "1px", - "font-size": "11px", - "line-color": "#976e6e", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#976e6e", - "text-rotation": "autorotate", - "color": "#976e6e" - } - }, - { - "selector": "edge.SUPERSEDES", - "style": { - "label": "supersedes", - "width": "1px", - "font-size": "11px", - "line-color": "#4C5F7A", - "line-style": "solid", - "target-arrow-shape": "triangle", - "target-arrow-color": "#4C5F7A", - "text-rotation": "autorotate", - "color": "#4C5F7A" - } - } -] \ No newline at end of file diff --git a/src/assets/img/.DS_Store b/src/assets/img/.DS_Store deleted file mode 100644 index f3c4f611..00000000 Binary files a/src/assets/img/.DS_Store and /dev/null differ diff --git a/src/assets/img/add-from-file.svg b/src/assets/img/add-from-file.svg deleted file mode 100644 index a4577247..00000000 --- a/src/assets/img/add-from-file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/add-selection-cursor.svg b/src/assets/img/add-selection-cursor.svg deleted file mode 100644 index 67ece0d7..00000000 --- a/src/assets/img/add-selection-cursor.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/add.svg b/src/assets/img/add.svg deleted file mode 100644 index 8a0aea4c..00000000 --- a/src/assets/img/add.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/close.svg b/src/assets/img/close.svg deleted file mode 100644 index 35e0c467..00000000 --- a/src/assets/img/close.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/src/assets/img/delete-bin.svg b/src/assets/img/delete-bin.svg deleted file mode 100644 index 7114110e..00000000 --- a/src/assets/img/delete-bin.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/down-arrow.svg b/src/assets/img/down-arrow.svg deleted file mode 100644 index 769e0996..00000000 --- a/src/assets/img/down-arrow.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/downloading-file.svg b/src/assets/img/downloading-file.svg deleted file mode 100644 index 224d80f6..00000000 --- a/src/assets/img/downloading-file.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - diff --git a/src/assets/img/edit.svg b/src/assets/img/edit.svg deleted file mode 100644 index a00ea04f..00000000 --- a/src/assets/img/edit.svg +++ /dev/null @@ -1,120 +0,0 @@ - - - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/assets/img/github.svg b/src/assets/img/github.svg deleted file mode 100644 index afdc4ab2..00000000 --- a/src/assets/img/github.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - github - - - \ No newline at end of file diff --git a/src/assets/img/graph.svg b/src/assets/img/graph.svg deleted file mode 100644 index 3fd5104f..00000000 --- a/src/assets/img/graph.svg +++ /dev/null @@ -1,166 +0,0 @@ - - - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/assets/img/jira.svg b/src/assets/img/jira.svg deleted file mode 100644 index 4ace5cc8..00000000 --- a/src/assets/img/jira.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/left-arrow.svg b/src/assets/img/left-arrow.svg deleted file mode 100644 index f1e31ddd..00000000 --- a/src/assets/img/left-arrow.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/assets/img/legend/edges.svg b/src/assets/img/legend/edges.svg deleted file mode 100644 index 10532a5a..00000000 --- a/src/assets/img/legend/edges.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/legend/nodes.svg b/src/assets/img/legend/nodes.svg deleted file mode 100644 index de852cff..00000000 --- a/src/assets/img/legend/nodes.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/logo.svg b/src/assets/img/logo.svg deleted file mode 100644 index 5d52bc5e..00000000 --- a/src/assets/img/logo.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/maximize.svg b/src/assets/img/maximize.svg deleted file mode 100644 index ee793857..00000000 --- a/src/assets/img/maximize.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/minimize.svg b/src/assets/img/minimize.svg deleted file mode 100644 index 31be678e..00000000 --- a/src/assets/img/minimize.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/minus.svg b/src/assets/img/minus.svg deleted file mode 100644 index 2cc923dd..00000000 --- a/src/assets/img/minus.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/neo4j.svg b/src/assets/img/neo4j.svg deleted file mode 100644 index a62b4956..00000000 --- a/src/assets/img/neo4j.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/pause-symbol.svg b/src/assets/img/pause-symbol.svg deleted file mode 100644 index b62b70c6..00000000 --- a/src/assets/img/pause-symbol.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/play-button.svg b/src/assets/img/play-button.svg deleted file mode 100644 index 9f24bfb5..00000000 --- a/src/assets/img/play-button.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/refresh.svg b/src/assets/img/refresh.svg deleted file mode 100644 index 56b9ac8f..00000000 --- a/src/assets/img/refresh.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/right-arrow.svg b/src/assets/img/right-arrow.svg deleted file mode 100644 index e5c4bd37..00000000 --- a/src/assets/img/right-arrow.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/assets/img/submenu-indicator-default copy.svg b/src/assets/img/submenu-indicator-default copy.svg deleted file mode 100644 index 2995af83..00000000 --- a/src/assets/img/submenu-indicator-default copy.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/assets/img/tick.svg b/src/assets/img/tick.svg deleted file mode 100644 index 7694a793..00000000 --- a/src/assets/img/tick.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/.DS_Store b/src/assets/img/toolbar/.DS_Store deleted file mode 100644 index ee85250d..00000000 Binary files a/src/assets/img/toolbar/.DS_Store and /dev/null differ diff --git a/src/assets/img/toolbar/about.svg b/src/assets/img/toolbar/about.svg deleted file mode 100644 index 6a7c0a84..00000000 --- a/src/assets/img/toolbar/about.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/cue.svg b/src/assets/img/toolbar/cue.svg deleted file mode 100644 index 9ca670c4..00000000 --- a/src/assets/img/toolbar/cue.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - ic_fluent_warning_24_filled - Created with Sketch. - - - - - - - ic_fluent_warning_24_filled - - - - diff --git a/src/assets/img/toolbar/delete-simple.svg b/src/assets/img/toolbar/delete-simple.svg deleted file mode 100644 index 47f487df..00000000 --- a/src/assets/img/toolbar/delete-simple.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/src/assets/img/toolbar/hide-selected.svg b/src/assets/img/toolbar/hide-selected.svg deleted file mode 100644 index 38de93e0..00000000 --- a/src/assets/img/toolbar/hide-selected.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/highlight-selected.svg b/src/assets/img/toolbar/highlight-selected.svg deleted file mode 100644 index 038cbd24..00000000 --- a/src/assets/img/toolbar/highlight-selected.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/history.svg b/src/assets/img/toolbar/history.svg deleted file mode 100644 index 3ebe946a..00000000 --- a/src/assets/img/toolbar/history.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/toolbar/json-file.svg b/src/assets/img/toolbar/json-file.svg deleted file mode 100644 index 6ad6be52..00000000 --- a/src/assets/img/toolbar/json-file.svg +++ /dev/null @@ -1,213 +0,0 @@ - - - -image/svg+xmlJSON - \ No newline at end of file diff --git a/src/assets/img/toolbar/layout-cose.svg b/src/assets/img/toolbar/layout-cose.svg deleted file mode 100644 index 76042b7d..00000000 --- a/src/assets/img/toolbar/layout-cose.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/layout-properties.svg b/src/assets/img/toolbar/layout-properties.svg deleted file mode 100644 index be29e038..00000000 --- a/src/assets/img/toolbar/layout-properties.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/src/assets/img/toolbar/layout-static.svg b/src/assets/img/toolbar/layout-static.svg deleted file mode 100644 index 78149953..00000000 --- a/src/assets/img/toolbar/layout-static.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/src/assets/img/toolbar/legend.svg b/src/assets/img/toolbar/legend.svg deleted file mode 100644 index 8db1b686..00000000 --- a/src/assets/img/toolbar/legend.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/load.svg b/src/assets/img/toolbar/load.svg deleted file mode 100644 index 7d39d3aa..00000000 --- a/src/assets/img/toolbar/load.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/png.svg b/src/assets/img/toolbar/png.svg deleted file mode 100644 index f6313667..00000000 --- a/src/assets/img/toolbar/png.svg +++ /dev/null @@ -1,215 +0,0 @@ - - - -image/svg+xmlPNG - \ No newline at end of file diff --git a/src/assets/img/toolbar/quick-help.svg b/src/assets/img/toolbar/quick-help.svg deleted file mode 100644 index 347766d7..00000000 --- a/src/assets/img/toolbar/quick-help.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/remove-highlights.svg b/src/assets/img/toolbar/remove-highlights.svg deleted file mode 100644 index b339d1a5..00000000 --- a/src/assets/img/toolbar/remove-highlights.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/src/assets/img/toolbar/save.svg b/src/assets/img/toolbar/save.svg deleted file mode 100644 index 34aad6c3..00000000 --- a/src/assets/img/toolbar/save.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/assets/img/toolbar/search.svg b/src/assets/img/toolbar/search.svg deleted file mode 100644 index 6946a658..00000000 --- a/src/assets/img/toolbar/search.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/toolbar/show-all.svg b/src/assets/img/toolbar/show-all.svg deleted file mode 100644 index a6c8eb1e..00000000 --- a/src/assets/img/toolbar/show-all.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/up-arrow.svg b/src/assets/img/up-arrow.svg deleted file mode 100644 index b6e1026a..00000000 --- a/src/assets/img/up-arrow.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/img/width.svg b/src/assets/img/width.svg deleted file mode 100644 index bf4ec5c5..00000000 --- a/src/assets/img/width.svg +++ /dev/null @@ -1,126 +0,0 @@ - - - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/assets/img/zoom-cursor.svg b/src/assets/img/zoom-cursor.svg deleted file mode 100644 index f67c5f40..00000000 --- a/src/assets/img/zoom-cursor.svg +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/src/assets/submenu-indicator-default.svg b/src/assets/submenu-indicator-default.svg deleted file mode 100644 index 3d484d3d..00000000 --- a/src/assets/submenu-indicator-default.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/environments/environment.heroku.ts b/src/environments/environment.heroku.ts deleted file mode 100644 index e07910ca..00000000 --- a/src/environments/environment.heroku.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const environment = { - production: true, - dbConfig: { - url: 'http://ivis.cs.bilkent.edu.tr:3001/db/neo4j/tx/commit', - username: 'neo4j', - password: '123' - } -}; - diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts deleted file mode 100644 index b3344913..00000000 --- a/src/environments/environment.prod.ts +++ /dev/null @@ -1,16 +0,0 @@ -export const environment = { - production: true, - github: { - clientId: "Iv1.b382b5cc7ebbd934", - clientSecret: "4fbbce64a13dfda49ee2b75c3ab586df4b8143b3" - }, - jira: { - clientId: "s8vxvG5qiNGENrtsijGbheoFuihyjCa2", - clientSecret: "ATOAaLMRtOg5cI7F-PJJ-i7u4w32JzzR3AKxq7ldQU8LBUj5FP0W-LhjLk2yfC8dMKnU790279F1" - }, - dbConfig: { - url: 'http://ivis.cs.bilkent.edu.tr:3004/db/neo4j/tx/commit', - username: 'neo4j', - password: '01234567' - } -}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts deleted file mode 100644 index 08648dde..00000000 --- a/src/environments/environment.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false, - github: { - clientId: "Iv1.b382b5cc7ebbd934", - clientSecret: "4fbbce64a13dfda49ee2b75c3ab586df4b8143b3" - }, - jira: { - clientId: "s8vxvG5qiNGENrtsijGbheoFuihyjCa2", - clientSecret: "ATOAaLMRtOg5cI7F-PJJ-i7u4w32JzzR3AKxq7ldQU8LBUj5FP0W-LhjLk2yfC8dMKnU790279F1" - }, - dbConfig: { - url: 'http://ivis.cs.bilkent.edu.tr:3004/db/neo4j/tx/commit', - username: 'neo4j', - password: '01234567' - } -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/src/favicon.ico b/src/favicon.ico deleted file mode 100644 index 8351a1f4..00000000 Binary files a/src/favicon.ico and /dev/null differ diff --git a/src/index.html b/src/index.html deleted file mode 100644 index 6db94c76..00000000 --- a/src/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - Software Artifact Analyzer - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/karma.conf.js b/src/karma.conf.js deleted file mode 100644 index bc1e9073..00000000 --- a/src/karma.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// 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/ng-visuall'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true - }); -}; diff --git a/src/lib/.DS_Store b/src/lib/.DS_Store deleted file mode 100644 index 9de0d357..00000000 Binary files a/src/lib/.DS_Store and /dev/null differ diff --git a/src/lib/cytoscape-visual-cues/cytoscape-visual-cues.esm.js b/src/lib/cytoscape-visual-cues/cytoscape-visual-cues.esm.js deleted file mode 100644 index 34d9dd3a..00000000 --- a/src/lib/cytoscape-visual-cues/cytoscape-visual-cues.esm.js +++ /dev/null @@ -1,37 +0,0 @@ -import e from"html2canvas"; -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */function t(e,t,i,n){return new(i||(i=Promise))((function(r,o){function a(e){try{s(n.next(e))}catch(e){o(e)}}function l(e){try{s(n.throw(e))}catch(e){o(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,l)}s((n=n.apply(e,t||[])).next())}))}function i(e,t){var i,n,r,o,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return o={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function l(o){return function(l){return function(o){if(i)throw new TypeError("Generator is already executing.");for(;a;)try{if(i=1,n&&(r=2&o[0]?n.return:o[0]?n.throw||((r=n.return)&&r.call(n),0):n.next)&&!(r=r.call(n,o[1])).done)return r;switch(n=0,r&&(o=[2&o[0],r.value]),o[0]){case 0:case 1:r=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!r||o[1]>r[0]&&o[1]source - * @see based on - */function u(e,t){var i=e.x,n=e.y,r=Math.min(t.x1,t.x2),o=Math.min(t.y1,t.y2),a=Math.max(t.x1,t.x2),l=Math.max(t.y1,t.y2),s=(r+a)/2,u=(o+l)/2,c=(u-n)/(s-i);if(i<=s){var d=c*(r-i)+n;if(o<=d&&d<=l)return{x:r,y:d}}if(i>=s){var f=c*(a-i)+n;if(o<=f&&f<=l)return{x:a,y:f}}if(n<=u){var m=(o-n)/c+i;if(r<=m&&m<=a)return{x:m,y:o}}if(n>=u){var h=(l-n)/c+i;if(r<=h&&h<=a)return{x:h,y:l}}if(i===s&&n===u)return{x:i,y:n};throw"Cannot find intersection for "+[i,n]+" inside rectangle "+[r,o]+" - "+[a,l]+"."}var c=100,d="style mouseover mouseout select unselect",f={},m=1;function h(e){r(e.marginX)&&(e.marginX=Number(e.marginX)),r(e.marginY)&&(e.marginY=Number(e.marginY))}function v(e,t){if(e.segmentPoints())return function(e,t){var i=e.renderedSegmentPoints();if("target"==t){var n=e.target().renderedBoundingBox({includeLabels:!1,includeOverlays:!1});return u(i[i.length-1],n)}if("source"==t){n=e.source().renderedBoundingBox({includeLabels:!1,includeOverlays:!1});return u(i[0],n)}var r=Math.floor(i.length/2);if(i.length%2==0){return a(i[r],i[r-1])}return i[r]}(e,t);if(e.controlPoints())return function(e,t){var i=e.renderedControlPoints();if("target"==t){var n=e.target().renderedBoundingBox({includeLabels:!1,includeOverlays:!1});return u(i[i.length-1],n)}if("source"==t){n=e.source().renderedBoundingBox({includeLabels:!1,includeOverlays:!1});return u(i[0],n)}var r=Math.floor(i.length/2);if(i.length%2==0){return a(i[r],i[r-1])}var l=e.renderedSourceEndpoint(),s=e.renderedTargetEndpoint();r>0&&(l=i[r-1]);r0?1:-1;if("number"==typeof e.marginX)i.y+=e.marginX*f,i.x+=e.marginX*m;else if("string"==typeof e.marginX){var v=d*(Number(e.marginX.substring(1))/100);i.y+=v*f,i.x+=v*m}var g=t.renderedWidth();if("number"==typeof e.marginY)i.x+=e.marginY*f,i.y+=e.marginY*m;else if("string"==typeof e.marginY){v=g*(Number(e.marginY.substring(1))/100);i.x+=v*f,i.y+=v*m}i.x*=h,i.y*=h}return i}function y(e,t){var i=e.isNode();if(i&&("target"==t||"source"==t))throw"'"+t+"' is invalid cue position for a node";if(!i&&"target"!=t&&"source"!=t&&"center"!=t)throw"'"+t+"' is invalid cue position for an edge"}function p(e,t,i){var n=t/2*1,r=e.graphElem.renderedBoundingBox({includeLabels:!1,includeOverlays:!1}),o=e.graphElem.isEdge();for(var a in e.cues){i&&(a=i);var l=e.cues[a],s=l.htmlElem.clientWidth,u=l.htmlElem.clientHeight,c=l.position,d=(r.y1+r.y2)/2-u/2,f=(r.x2+r.x1)/2-s/2;if("bottom"==c||"bottom-left"==c||"bottom-right"==c?d=r.y2-u/2:"top"!=c&&"top-left"!=c&&"top-right"!=c||(d=r.y1-u/2),"right"==c||"top-right"==c||"bottom-right"==c?f=r.x2-s/2:"left"!=c&&"top-left"!=c&&"bottom-left"!=c||(f=r.x1-s/2),o){var m=v(e.graphElem,c);m&&(f=m.x-s/2,d=m.y-u/2)}var h=g(l,e.graphElem);f+=h.x,d+=h.y;var y="scale("+n+")";if(l.isFixedSize&&(y=""),l.htmlElem.style.transform="translate("+f+"px, "+d+"px) "+y,i)return}}function b(e,t,i){for(var n in e)i?(t[n]=e[n].htmlElem.style.visibility,e[n].htmlElem.style.visibility="hidden"):e[n].htmlElem.style.visibility=t[n]}function x(e,t){for(var i=e.children(),n=0;n number; - maxIterations?: number; - sensitivityThreshold?: number; -} - - -// Thanks to the original author https://github.com/upphiminn/jLouvain -export class LouvainClustering { - - private maxIterations: number = -1; - private sensitivityThreshold: number = 0.0000001; - private original_graph: Graph; - private edge_index = {}; - - //Helpers - private makeSet(array: (number | string)[]): string[] { - const set = {}; - array.forEach(function (d) { - set[d] = true; - }); - return Object.keys(set); - } - - private getDegree4Node(graph: Graph, node: string | number) { - const neighbours = graph.adj[node] ? Object.keys(graph.adj[node]) : []; - let weight = 0; - for (let i = 0; i < neighbours.length; i++) { - let value = graph.adj[node][neighbours[i]] || 1; - if (node === neighbours[i]) { - value *= 2; - } - weight += value; - } - return weight; - } - - private getNeighboursOfNode(graph: Graph, node: string | number) { - if (typeof graph.adj[node] === 'undefined') { - return []; - } - return Object.keys(graph.adj[node]); - } - - private getEdgeWeight(graph: Graph, node1: string | number, node2: string | number) { - return graph.adj[node1] ? graph.adj[node1][node2] : undefined; - } - - private getTotalWeight(graph: Graph) { - let size = 0; - graph.edges.forEach(function (edge) { - size += edge.weight; - }); - return size; - } - - private addEdge2Graph(graph: Graph, edge: Edge) { - this.updateAdj(graph, edge); - if (this.edge_index[edge.source + '_' + edge.target]) { - graph.edges[this.edge_index[edge.source + '_' + edge.target]].weight = edge.weight; - } else { - graph.edges.push(edge); - this.edge_index[edge.source + '_' + edge.target] = graph.edges.length - 1; - } - } - - private makeAdj(edge_list) { - const adj = {}; - edge_list.forEach(function (edge) { - adj[edge.source] = adj[edge.source] || {}; - adj[edge.source][edge.target] = edge.weight; - adj[edge.target] = adj[edge.target] || {}; - adj[edge.target][edge.source] = edge.weight; - }); - return adj; - } - - private updateAdj(graph: Graph, edge: Edge) { - graph.adj[edge.source] = graph.adj[edge.source] || {}; - graph.adj[edge.source][edge.target] = edge.weight; - graph.adj[edge.target] = graph.adj[edge.target] || {}; - graph.adj[edge.target][edge.source] = edge.weight; - } - - private clone(obj: any) { - if (obj === null || typeof obj !== 'object') { - return obj; - } - let temp = obj.constructor(); - for (let key in obj) { - temp[key] = this.clone(obj[key]); - } - return temp; - } - - //Core-Algorithm Related - private initStatus(graph: Graph, status: ClusteringStatus, part) { - status.node2Community = {}; - status.internals = {}; - status.degrees = {}; - status.gdegrees = {}; - status.loops = {}; - status.totalWeight = this.getTotalWeight(graph); - - if (typeof part === 'undefined') { - graph.nodes.forEach((node, i) => { - status.node2Community[node] = i; - - let deg = this.getDegree4Node(graph, node); - - if (deg < 0) { - throw new TypeError('Graph should only have positive weights.'); - } - - status.degrees[i] = deg; - status.gdegrees[node] = deg; - status.loops[node] = this.getEdgeWeight(graph, node, node) || 0; - status.internals[i] = status.loops[node]; - }); - } else { - graph.nodes.forEach((node) => { - const com = part[node]; - status.node2Community[node] = com; - const deg = this.getDegree4Node(graph, node); - status.degrees[com] = (status.degrees[com] || 0) + deg; - status.gdegrees[node] = deg; - let inc = 0.0; - let neighbours = this.getNeighboursOfNode(graph, node); - - neighbours.forEach(function (neighbour) { - const weight = graph.adj[node][neighbour]; - - if (weight <= 0) { - throw new TypeError('Graph should only have positive weights.'); - } - - if (part[neighbour] === com) { - if (neighbour === node) { - inc += weight; - } else { - inc += weight / 2.0; - } - } - }); - - status.internals[com] = (status.internals[com] || 0) + inc; - }); - } - } - - private modularity(status: ClusteringStatus): number { - const links = status.totalWeight; - let result = 0.0; - const communities = this.makeSet(Object.values(status.node2Community)); - - communities.forEach(function (com) { - const in_degree = status.internals[com] || 0; - const degree = status.degrees[com] || 0; - if (links > 0) { - result = result + in_degree / links - Math.pow(degree / (2.0 * links), 2); - } - }); - - return result; - } - - private neighcom(node: string | number, graph: Graph, status: ClusteringStatus) { - // compute the communities in the neighb. of the node, with the graph given by - // node2Community - const weights = {}; - const neighboorhood = this.getNeighboursOfNode(graph, node); //make iterable; - - neighboorhood.forEach(function (neighbour) { - if (neighbour !== node) { - const weight = graph.adj[node][neighbour] || 1; - const neighbourcom = status.node2Community[neighbour]; - weights[neighbourcom] = (weights[neighbourcom] || 0) + weight; - } - }); - - return weights; - } - - private insert2Community(node, com, weight, status: ClusteringStatus) { - // insert node into com and modify status - status.node2Community[node] = +com; - status.degrees[com] = (status.degrees[com] || 0) + (status.gdegrees[node] || 0); - status.internals[com] = (status.internals[com] || 0) + weight + (status.loops[node] || 0); - } - - private removeFromCommunity(node, com, weight, status: ClusteringStatus) { - //remove node from com and modify status - status.degrees[com] = (status.degrees[com] || 0) - (status.gdegrees[node] || 0); - status.internals[com] = (status.internals[com] || 0) - weight - (status.loops[node] || 0); - status.node2Community[node] = -1; - } - - private renumber(dict: Dict): Dict { - let count = 0; - const ret: Dict = this.clone(dict); //deep copy :) - const new_values = {}; - const dict_keys = Object.keys(dict); - - dict_keys.forEach(function (key) { - const value = dict[key]; - let new_value = typeof new_values[value] === 'undefined' ? -1 : new_values[value]; - if (new_value === -1) { - new_values[value] = count; - new_value = count; - count = count + 1; - } - ret[key] = new_value; - }); - - return ret; - } - - private oneLevel(graph: Graph, status: ClusteringStatus) { - //Compute one level of the Communities Dendogram. - let modif = true; - let nbPassDone = 0; - let currMod = this.modularity(status); - let newMod = currMod; - - while (modif && nbPassDone !== this.maxIterations) { - currMod = newMod; - modif = false; - nbPassDone += 1; - - graph.nodes.forEach((node, i) => { - let comNode = status.node2Community[node]; - let degcTotw = (status.gdegrees[node] || 0) / (status.totalWeight * 2.0); - let neighCommunities = this.neighcom(node, graph, status); - this.removeFromCommunity(node, comNode, neighCommunities[comNode] || 0.0, status); - let bestCom = comNode; - let bestIncrease = 0; - const neighCommunitiesEntries = Object.keys(neighCommunities); // make iterable; - - neighCommunitiesEntries.forEach(function (com) { - const incr = neighCommunities[com] - (status.degrees[com] || 0.0) * degcTotw; - - if (incr > bestIncrease) { - bestIncrease = incr; - bestCom = com; - } - }); - - this.insert2Community(node, bestCom, neighCommunities[bestCom] || 0, status); - - // convert from string to number - if (+bestCom !== comNode) { - modif = true; - } - }); - - newMod = this.modularity(status); - - if (newMod - currMod < this.sensitivityThreshold) { - break; - } - } - } - - // Produce the graph where nodes are the communities - private inducedGraph(partition, graph: Graph): Graph { - const ret: Graph = { nodes: [], edges: [], adj: {} }; - // add nodes from partition values - const partitionValues = Object.values(partition) as string[]; - ret.nodes = ret.nodes.concat(this.makeSet(partitionValues)); // make set - - let wPrec; - let weight; - graph.edges.forEach((edge, i) => { - weight = edge.weight || 1; - const com1 = partition[edge.source]; - const com2 = partition[edge.target]; - wPrec = this.getEdgeWeight(ret, com1, com2) || 0; - const newWeight = wPrec + weight; - this.addEdge2Graph(ret, { source: com1, target: com2, weight: newWeight }); - }); - - this.edge_index = {}; - - return ret; - } - - private partitionAtLevel(dendogram: Dict[], level: number) { - const partition = this.clone(dendogram[0]); - - for (let i = 1; i < level + 1; i++) { - Object.keys(partition).forEach(function (key, j) { - let node = key; - let com = partition[key]; - partition[node] = dendogram[i][com]; - }); - } - - return partition; - } - - private generateDendogram(graph: Graph, part_init): Dict[] { - if (graph.edges.length === 0) { - const part: Dict = {}; - graph.nodes.forEach(function (node) { - part[node] = node; - }); - return [part]; - } - - const status: ClusteringStatus = { totalWeight: 0, gdegrees: {}, degrees: {}, internals: {}, node2Community: {}, loops: {} }; - - this.initStatus(this.original_graph, status, part_init); - let mod = this.modularity(status); - const status_list: Dict[] = []; - this.oneLevel(this.original_graph, status); - let new_mod = this.modularity(status); - let partition = this.renumber(status.node2Community); - status_list.push(partition); - mod = new_mod; - let current_graph = this.inducedGraph(partition, this.original_graph); - this.initStatus(current_graph, status, undefined); - - while (true) { - this.oneLevel(current_graph, status); - new_mod = this.modularity(status); - if (new_mod - mod < this.sensitivityThreshold) { - break; - } - - partition = this.renumber(status.node2Community); - status_list.push(partition); - - mod = new_mod; - current_graph = this.inducedGraph(partition, current_graph); - this.initStatus(current_graph, status, undefined); - } - - return status_list; - } - - /** - * @param {} elems is a cytoscape.js collection https://js.cytoscape.org/#cy.collection - */ - cluster(elems, options: ClusterOptions = null) { - let weightFn = (x) => { return 1 }; - if (options) { - if (options.maxIterations) { - this.maxIterations = options.maxIterations; - } - if (options.sensitivityThreshold) { - this.sensitivityThreshold = options.sensitivityThreshold; - } - if (options.weightFn) { - weightFn = options.weightFn; - } - } - const nodes = elems.filter('node').map(x => x.id()); - const edges = elems.filter('edge').map(x => { return { source: x.source().id(), target: x.target().id(), weight: weightFn(x) } }); - let graph: Graph = { nodes: nodes, edges: edges, adj: this.makeAdj(edges) }; - this.original_graph = graph; - const dendogram = this.generateDendogram(graph, undefined); - return this.partitionAtLevel(dendogram, dendogram.length - 1); - } - -} \ No newline at end of file diff --git a/src/lib/timebar/GoogleChartClient.d.ts b/src/lib/timebar/GoogleChartClient.d.ts deleted file mode 100644 index 4b8f0863..00000000 --- a/src/lib/timebar/GoogleChartClient.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ChartElements } from "./data-type"; -export declare class GoogleChartClient { - colors: string[]; - private textStyle; - private dashboard; - private chartWrapper; - private controlWrapper; - private rangeChange; - private isReady; - private htmlElem; - private googleEvent; - constructor(rangeChange: (b1?: boolean, b2?: boolean) => void, htmlElem: ChartElements, colors: string[]); - load(callback: Function): void; - private initChart; - setControllerRange(start: number, end: number, isDraw?: boolean): number; - getControllerRange(): number[]; - setTicksForBarChart(ticks: any): void; - setColors(): void; - drawDashboard(arr: any[]): void; - drawControl(): void; - removeListener(): void; - addListener(): void; -} diff --git a/src/lib/timebar/PrivateTimebar.d.ts b/src/lib/timebar/PrivateTimebar.d.ts deleted file mode 100644 index 492a6aa2..00000000 --- a/src/lib/timebar/PrivateTimebar.d.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { TimebarItem, Stat, Settings, ChartElements } from "./data-type"; -import { GoogleChartClient } from "./GoogleChartClient"; -import { Timebar } from "./Timebar"; -export declare class PrivateTimebar { - cyElemChangeHandler: Function; - windowResizer: any; - statsRange1: number; - statsRange2: number; - items: TimebarItem[]; - minDate: number; - maxDate: number; - graphDates: number[]; - cursorPos: number; - sampleCount: number; - playTimerId: number; - readonly IDEAL_SAMPLE_CNT: number; - readonly MIN_ZOOM_RANGE: number; - currTimeUnit: number; - selectedTimeUnit: string; - beginPropertyName: string; - endPropertyName: string; - setStatsRangeStrFn: () => void; - setGraphRangeStrFn: () => void; - readonly GRAPH_RANGE_RATIO_MIN = 0.2; - readonly GRAPH_RANGE_RATIO_MAX = 0.8; - readonly ELEM_CHANGE_DEBOUNCE = 200; - ignoreEndNodesForEdgeInclusion: boolean; - cy: any; - dataMapping: any; - settings: Settings; - zoomFn: any; - chartClient: GoogleChartClient; - isChartClientReady: boolean; - api: Timebar; - htmlElem: ChartElements; - /** - * @param {any} cy - ignore this, it will be injected automatically - * @param {ChartElements} htmlElem - { chartElemId: string, controllerElemId: string} - * @param {any} dataMapping - which features should be used to represent time - * @param {Settings} settings - some settings to be used. Leave empty to use defaults - * @param {Events} events - functions which will be called later. Leave empty to use defaults - * @param {Stat[]} stats - calculations, color and text. Leave empty to use defaults - * @constructor - */ - constructor(cy: any, dataMapping: any, htmlElem: ChartElements, settings: Settings, api: Timebar); - cyElemListChanged(): void; - drawEmptyData(): void; - getStatsForRange(start: number, end: number): number[]; - count4Collapsed(item: TimebarItem, stat: Stat, cnts: number[], cntIdx: number, timeFilterFn: (x: any) => boolean, hasCollapsed: (x: TimebarItem) => any): void; - getTimeRange(cyElem: any): any[]; - getTimeFilteredGraphElems(start: number, end: number): any; - putStatDataForRange(s: number, e: number, data4arr: number, arr: any[]): void; - getVisibleRange(): number[]; - bindEventListeners(): void; - unbindEventListeners(): void; - bindCommands(): void; - addChartListener(): void; - removeChartListener(): void; - unbindCommands(): void; - prepareChartData(minDate: number, maxDate: number): void; - prepareData3(): void; - quantizeDateRange(d1: number, d2: number, cnt: number): number; - setTicksForBarChart(): void; - getQuantizedTime(d: number, isGreater: boolean): Date; - getTickStrForDate(d: Date): string; - getToolTippedData(rangeStart: number, cnts: number[]): any[]; - setStatsRangeByRatio(): void; - setGraphRangeByRatio(prevStatsRange1: number, prevStatsRange2: number, isOnMax: boolean): void; - setGraphRangeByStatsRange(r1: number, r2: number): void; - resetStatsRange(): void; - stopPlayTimer(callback: (isShowPlay: boolean) => void): void; - rangeChange(isSetCursorPos?: boolean): void; - /** used for rendering chart from existing data - */ - renderChart(): void; - /** activate/deactivate timebar - * @param {boolean} isActive - */ - setIsEnabled(isActive: boolean): void; - /** whether to hide or show disconnected nodes - * @param {boolean} val - */ - setIsHideDisconnectedNodesOnAnim(val: boolean): void; - /** whether to call `cyElemListChanged` on element added or removed - * @param {boolean} val - */ - setIsIgnoreElemChanges(val: boolean): void; - /** when a new data is added, whether change current graph range - * @param {boolean} v - */ - setIsMaintainGraphRange(v: boolean): void; - /** speed of animation - * @param {number} newSpeed - */ - setPlayingPeriod(newSpeed: number): void; - /** should be in range [0,100] - * @param {number} n - */ - setZoomingStep(n: number): void; - /** step size used in animation - * @param {number} newStep - */ - setPlayingStep(newStep: number): void; - /** used whether to show an element in the graph or not - * @param {number} i - */ - setGraphInclusionType(i: number): void; - /** used in calculations of statistics - * @param {number} i - */ - setStatsInclusionType(i: number): void; - /** set minimum possible date time on timebar - * @param {number} v - */ - setGlobalRangeMin(v: number): void; - /** set maximum possible date time on timebar - * @param {number} v - */ - setGlobalRangeMax(v: number): void; - /** set ratio of graph range to stats range - * @param {number} v - */ - setGraphRangeRatio(v: number): void; - /** set default begin date time - * @param {number} v - */ - setDefaultBeginDate(v: number): void; - /** set default end date time - * @param {number} v - */ - setDefaultEndDate(v: number): void; -} diff --git a/src/lib/timebar/Timebar.d.ts b/src/lib/timebar/Timebar.d.ts deleted file mode 100644 index 23dd5a54..00000000 --- a/src/lib/timebar/Timebar.d.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Stat, Settings, ChartElements } from "./data-type"; -import { PrivateTimebar } from './PrivateTimebar'; -export declare class Timebar { - _: PrivateTimebar; - /** - *Creates an instance of Timebar, e.g. let tb = Timebar(mapping, { chartElemId: 'chart_div', controllerElemId: 'filter_div' }); - * @param {*} cy ignore this, it will be injected automatically - * @param {*} dataMapping which properties should be used as begin, end datetimes - * @param {ChartElements} htmlElem { chartElemId (to display upper chart), controllerElemId (to display lower chart)} - * @param {Settings} settings settings to be used. Leave empty to use defaults - * @memberof Timebar - */ - constructor(cy: any, dataMapping: any, htmlElem: ChartElements, settings: Settings); - /** - * @param {boolean} isIncrease - set true to zoom in, false for zoom out - */ - changeZoom(isIncrease: boolean): void; - /** get graph range start and end values - * @returns number[] - */ - getGraphRange(): number[]; - /** set graph range start and end values - * @param {number} start - * @param {number} end - */ - setGraphRange(start: number, end: number): void; - /** move graph range to right or left. Size of movement is determined with setting `playingStep`. It is defined as (graph range) * (playingStep/100) - * @param {boolean} isLeft - */ - moveCursor(isLeft: boolean): boolean; - /** sets graph range to data range (range of all data both visible and hidden). - */ - coverAllTimes(): void; - /** sets graph range values to the minimum and maximum dates in visible data. - */ - coverVisibleRange(): void; - /** show the graph as graph range moves forward. Stops when reaching end of data range - * @param {(isPlaying:boolean)=>void} callback - callback will be fired with false if it stopped playing - */ - playTiming(callback: (isPlaying: boolean) => void): void; - /** update the event listeners - * @param {string} event - must be one of the predefined names of the events - * @param {any} fn - the function that will be called - */ - setEventListener(event: string, fn: any): void; - /** size of time unit currently used in milliseconds - * @returns number - */ - getCurrTimeUnit(): number; - /** returns (graph range) / (stats range) - * @returns number - */ - getGraphRangeRatio(): number; - /** set colors for stats - * @param {string[]} colors an array of strings - */ - setStatsColors(colors: string[]): void; - /** Each metric (stat) should contain a function named `incrementFn`. This function takes a Cytoscape.js element as a parameter and returns an integer. - * For example, if your statistic is to count the number of highly-rated movies, you should check for the rating of the movie and if it is greater than a threshold, - * return 1 else return 0. Another example statistic might be the sum of movie ratings. In this case, you can return the rating value of a movie. - * The parameter passed to `incrementFn` could be any Cytoscape.js element. So you should check type/class of the parameter element. - * The other properties of a stat are color and name. These are used for visualization. - * @param {Stat[]} m - */ - setStats(m: Stat[]): void; - /** Set a setting to a particular value e.g. setSetting('graphInclusionType', 1); - * @param {string} name - * @param {number|boolean} value - */ - setSetting(name: string, value: number | boolean): void; -} diff --git a/src/lib/timebar/cytoscape-timebar.js b/src/lib/timebar/cytoscape-timebar.js deleted file mode 100644 index 544cbe3f..00000000 --- a/src/lib/timebar/cytoscape-timebar.js +++ /dev/null @@ -1,16 +0,0 @@ -var t=["January","February","March","April","May","June","July","August","September","October","November","December"],e=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],n={century:31536e8,decade:31536e7,year:31536e6,quarter:7884e6,month:2592e6,week:6048e5,day:864e5,hour:36e5,"5min":3e5,minute:6e4,"5sec":5e3,second:1e3,"50ms":50,ms:1};var i=-59011466152e3,s=325036692e5;function a(t,e,n){var i;return function(){var s=this,a=arguments,r=function(){i=null,n||t.apply(s,a)},o=n&&!i;clearTimeout(i),i=setTimeout(r,e),o&&t.apply(s,a)}}function r(t,e){if(null==t)return e;for(var n in e)void 0===t[n]&&(t[n]=e[n]);return t} -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -function o(t,e,n){if(n||2===arguments.length)for(var i,s=0,a=e.length;s=e.length-1&&(t.row=e.length-1)},t.prototype.setControllerRange=function(t,e,n){if(void 0===n&&(n=!0),this.isReady){if(!t||!e){var i=this.getControllerRange(),s=i[0],a=i[1];t||(t=s),e||(e=a)}if(!(t>=e))return this.controlWrapper.setState({range:{start:new Date(t),end:new Date(e)}}),n&&this.controlWrapper.draw(),0;console.log("can not set start > end ")}},t.prototype.getControllerRange=function(){if(!this.isReady)return[i,s];var t=this.controlWrapper.getState(),e=i,n=s;return t&&t.range&&(t.range.start&&t.range.start.getTime&&(e=t.range.start.getTime()),t.range.end&&t.range.end.getTime&&(n=t.range.end.getTime())),[e,n]},t.prototype.setTicksForBarChart=function(t){this.isReady&&(this.chartWrapper.setOption("hAxis.ticks",t),this.controlWrapper.draw())},t.prototype.setColors=function(){if(this.chartWrapper&&this.controlWrapper&&this.isReady){for(var t=0;t=t&&n.start<=e}:2==s?h=function(n){return(n.start+n.end)/2>=t&&(n.start+n.end)/2<=e}:3==s?h=function(n){return n.end>=t&&n.end<=e}:0==s&&(h=function(n){return n.start<=e&&n.end>=t}),i=a.filter((function(t){return h(t)||o(t)}));for(var l=new Array(r.length).fill(0),g=0;g0&&function(t,e,n,i){t[n]||(t[n]={}),t[n][i]||(t[n][i]=[]),t[n][i].push(e)}(o.stat2elem,t.id(),s,i),n[i]+=a};if(r(t)){var g=t.cyElem.data("collapsedEdges");if(g)for(var c=0;c0){for(var a=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,o=0;or&&(r=g)}return[a,r]}var c=function(n){if(-1===e.findIndex((function(t){return t==n.toLowerCase()})))return"continue";var i=u.dataMapping[n][u.beginPropertyName],s=u.dataMapping[n][u.endPropertyName],a=t.data()[i],r=t.data()[s];return a&&r?{value:[a,r]}:a&&!r?{value:[a,u.settings.defaultEndDate]}:!a&&r?{value:[u.settings.defaultBeginDate,r]}:{value:[u.settings.defaultBeginDate,u.settings.defaultEndDate]}},u=this;for(var p in this.dataMapping){var d=c(p);if("object"==typeof d)return d.value}return[this.settings.defaultBeginDate,this.settings.defaultEndDate]},u.prototype.getTimeFilteredGraphElems=function(t,e){var n=this.cy.collection(),i=[];0==this.settings.graphInclusionType?i=this.items.filter((function(n){return n.start<=e&&n.end>=t})).map((function(t){return t.cyElem})):1==this.settings.graphInclusionType?i=this.items.filter((function(n){return t<=n.start&&e>=n.end})).map((function(t){return t.cyElem})):2==this.settings.graphInclusionType&&(i=this.items.filter((function(n){return n.start<=t&&n.end>=e})).map((function(t){return t.cyElem})));for(var s=0;se&&(e=h)}return n===s?[i,s]:[n,e]},u.prototype.bindEventListeners=function(){this.cyElemChangeHandler=a(this.cyElemListChanged,200,!1).bind(this),this.cy.on("add remove",this.cyElemChangeHandler),this.cy.on("mouseover mouseout","node,edge",this.cyElemMouseFn),this.windowResizer=a(this.renderChart,200,!1).bind(this),window.addEventListener("resize",this.windowResizer)},u.prototype.unbindEventListeners=function(){this.cyElemChangeHandler&&this.cy.off("add remove",this.cyElemChangeHandler),this.windowResizer&&window.removeEventListener("resize",this.windowResizer),this.cy.off("mouseover mouseout","node,edge",this.cyElemMouseFn)},u.prototype.bindCommands=function(){var t,e=this;this.zoomFn=function(t){e.api.changeZoom(t.deltaY<0)},null===(t=document.getElementById(this.htmlElem.controllerElemId))||void 0===t||t.addEventListener("wheel",this.zoomFn)},u.prototype.addChartListener=function(){this.chartClient.addListener()},u.prototype.removeChartListener=function(){this.chartClient.removeListener()},u.prototype.unbindCommands=function(){var t;null===(t=document.getElementById(this.htmlElem.controllerElemId))||void 0===t||t.removeEventListener("wheel",this.zoomFn)},u.prototype.prepareChartData=function(t,e){this.minDate=t,this.maxDate=e,this.resetStatsRange()},u.prototype.prepareData3=function(t){this.stat2elem={};for(var e=[],n=0,i=this.settings.stats;n10&&(o=u,h=l)}return""!=h&&(r=h),this.currTimeUnit=n[r],this.selectedTimeUnit=r,this.getQuantizedTime(t,!0).getTime()},u.prototype.setTicksForBarChart=function(){var t=this.chartClient.getControllerRange(),e=t[0],n=t[1];ethis.statsRange2&&(n=this.statsRange2);for(var i=this.getQuantizedTime(e,!1).getTime(),s=[];i<=n;){var a=new Date(i);s.push({v:a,f:this.getTickStrForDate(a)}),i=this.getQuantizedTime(i,!0).getTime()}var r=new Date(i);s.push({v:r,f:this.getTickStrForDate(r)}),this.chartClient.setTicksForBarChart(s)},u.prototype.getQuantizedTime=function(t,e){var n=this.selectedTimeUnit,i=new Date(t),s=i.getFullYear(),a=i.getMonth()+1,r=i.getDate(),o=i.getHours(),h=i.getMinutes(),l=i.getSeconds(),g=i.getMilliseconds();if("decade"==n||"century"==n){var c="decade"==n?10:100,u=s-s%c;return e?new Date(u+c,0,1):new Date(u,0,1)}if("year"==n)return e?new Date(s+1,0,1):new Date(s,0,1);if("quarter"==n){u=3*Math.ceil(a/3)-2;return e?new Date(s,u+2,1):new Date(s,u,1)}if("month"==n)return e?new Date(s,a,1):new Date(s,a-1,1);if("week"==n){var p=(i.getDay()+6)%7;return e?new Date(s,a-1,r-p+7):new Date(s,a-1,r-p)}if("day"==n)return e?new Date(s,a-1,r+1):new Date(s,a-1,r);if("hour"==n)return e?new Date(s,a-1,r,o+1):new Date(s,a-1,r,o);if("5min"==n){var d=5*Math.floor(h/5);return e?new Date(s,a-1,r,o,d+5):new Date(s,a-1,r,o,d)}if("minute"==n)return e?new Date(s,a-1,r,o,h+1):new Date(s,a-1,r,o,h);if("5sec"==n){var m=5*Math.floor(l/5);return e?new Date(s,a-1,r,o,h,m+5):new Date(s,a-1,r,o,h,m)}if("second"==n)return e?new Date(s,a-1,r,o,h,l+1):new Date(s,a-1,r,o,h,l);if("50ms"==n){var f=50*Math.floor(g/50);return e?new Date(s,a-1,r,o,h,l,f+50):new Date(s,a-1,r,o,h,l,f)}if("ms"==n)return e?new Date(s,a-1,r,o,h,l,g+1):new Date(s,a-1,r,o,h,l,g);throw"unknown timeUnit: "+n},u.prototype.getTickStrForDate=function(t){return"decade"==this.selectedTimeUnit||"century"==this.selectedTimeUnit||"year"==this.selectedTimeUnit?""+t.getFullYear():"quarter"==this.selectedTimeUnit||"month"==this.selectedTimeUnit?""+(t.getMonth()+1):"week"==this.selectedTimeUnit||"day"==this.selectedTimeUnit?""+t.getDate():"hour"==this.selectedTimeUnit?""+t.getHours():"minute"==this.selectedTimeUnit||"5min"==this.selectedTimeUnit?""+t.getMinutes():"second"==this.selectedTimeUnit||"5sec"==this.selectedTimeUnit?""+t.getSeconds():"50ms"==this.selectedTimeUnit||"ms"==this.selectedTimeUnit?""+t.getMilliseconds():"?"},u.prototype.getToolTippedData=function(n,i){var s=this.selectedTimeUnit,a=new Date(n),r=a.getFullYear(),o=a.getMonth()+1,h=a.getDate(),l=a.getHours(),g=a.getMinutes(),c=a.getSeconds(),u=a.getMilliseconds(),p=[],d="";"century"==s&&(d=r+"-"+(r+100)),"decade"==s&&(d=r+"s"),"year"==s&&(d=r+""),"quarter"==s&&(d="Quarter "+Math.ceil(o/3)+" "+r),"month"==s&&(d=t[o-1]+" "+r),"week"==s&&(d="Week "+e[o-1]+" "+h),"day"==s&&(d="Day "+h),"hour"==s&&(d="Hour "+l),"minute"!=s&&"5min"!=s||(d="Minute "+g),"second"!=s&&"5sec"!=s||(d="Second "+c),"50ms"!=s&&"ms"!=s||(d="Millisecond "+u);for(var m=0,f=0,y=i;f'+d+" "+R+"
")}return p},u.prototype.setStatsRangeByRatio=function(){var t=this.chartClient.getControllerRange(),e=t[0],n=t[1],a=(n+e)/2,r=n-e;rc&&(this.statsRange1-=this.statsRange2-c,this.statsRange2=c,this.setGraphRangeByRatio(h,l,!0)),this.renderChart()},u.prototype.setGraphRangeByRatio=function(t,e,n){var i,s,a,r=this.statsRange2-this.statsRange1,o=e-t;r>o&&(i=r,s=o,void 0===a&&(a=1e3),!(Math.abs(i-s)2)throw"graphInclusionType is not defined";this.settings.graphInclusionType=t,this.rangeChange(!0)},u.prototype.setStatsInclusionType=function(t){if(t<0||t>3)throw"statsInclusionType is not defined";this.settings.statsInclusionType=t,this.renderChart()},u.prototype.setGlobalRangeMin=function(t){this.settings.globalRangeMin=t},u.prototype.setGlobalRangeMax=function(t){this.settings.globalRangeMax=t},u.prototype.setGraphRangeRatio=function(t){tthis.GRAPH_RANGE_RATIO_MAX&&(t=this.GRAPH_RANGE_RATIO_MAX),this.settings.graphRangeRatio=t},u.prototype.setDefaultBeginDate=function(t){this.settings.defaultBeginDate=t},u.prototype.setDefaultEndDate=function(t){this.settings.defaultEndDate=t},u.prototype.setIsSelectBarOnGraphElemHovered=function(t){this.settings.isSelectBarOnGraphElemHovered=t},u}(),p=function(){function t(t,e,n,i){this._=new u(t,e,n,i,this),this.setSetting("zoomingStep",i.zoomingStep)}return t.prototype.changeZoom=function(t){if(this._.settings.isEnabled){var e=this.getGraphRange(),n=e[0],s=e[1],a=s-n;if(!(a<=this._.MIN_ZOOM_RANGE&&t)){var r=Math.floor(this._.settings.zoomingStep*a);t||(r=-r),s-=r,(n+=r)<=i||(this._.chartClient.setControllerRange(n,s),this._.rangeChange(!0))}}},t.prototype.getGraphRange=function(){return this._.chartClient.getControllerRange()},t.prototype.setGraphRange=function(t,e){this._.chartClient.setControllerRange(t,e),this._.rangeChange()},t.prototype.getStatsRange=function(){return[this._.statsRange1,this._.statsRange2]},t.prototype.moveCursor=function(t){if(this._.settings.isEnabled){var e=this.getGraphRange(),n=e[0],i=e[1],s=Math.ceil(i-n),a=Math.ceil(s*this._.settings.playingStep/100),r=this._.maxDate,o=this._.minDate;if(-1===this._.cursorPos&&t||1===this._.cursorPos&&!t)return!1;a>=n-o&&t?(i-=n-o,n=o,this._.cursorPos=-1):a>=r-i&&!t?(n=n+r-i,i=r,this._.cursorPos=1):t?(n-=a,i-=a,this._.cursorPos=0):t||(n+=a,i+=a,this._.cursorPos=0);var h=this._.graphDates[0],l=this._.graphDates[this._.graphDates.length-1];return n>=i&&(i=n+this._.currTimeUnit),n<=h&&(this._.statsRange2=this._.statsRange2+n-h,this._.statsRange1=n),i>=l&&(this._.statsRange1=this._.statsRange1+i-l,this._.statsRange2=i+1),this._.renderChart({start:n,end:i}),this._.rangeChange(!1),!0}},t.prototype.coverAllTimes=function(){this._.settings.isEnabled&&(this._.resetStatsRange(),this._.renderChart(),this._.chartClient.setControllerRange(this._.statsRange1,this._.statsRange2),this._.rangeChange(!0))},t.prototype.coverVisibleRange=function(){if(this._.settings.isEnabled){var t=this._.getVisibleRange(),e=t[0],n=t[1];n-e<=1&&(n=e+1e3),this._.resetStatsRange(),this._.renderChart(),this._.chartClient.setControllerRange(e,n),this._.rangeChange(!0)}},t.prototype.playTiming=function(t){var e=this;this._.settings.isEnabled&&(this._.playTimerId<0?(t(!1),this._.playTimerId=window.setInterval((function(){e.moveCursor(!1)?(t(!1),e._.chartClient.drawControl()):e._.stopPlayTimer(t)}),this._.settings.playingPeriod)):this._.stopPlayTimer(t))},t.prototype.setEventListener=function(t,e){this._.settings.events[t]=e},t.prototype.getCurrTimeUnit=function(){return this._.currTimeUnit},t.prototype.getGraphRangeRatio=function(){return this._.settings.graphRangeRatio},t.prototype.setGraphRangeRatio=function(t){this._.setGraphRangeRatio(t)},t.prototype.setStatsColors=function(t){this._.chartClient.colors=t;for(var e=0;e number; - name: string; - color?: string; -} -export interface TimebarItem { - start: number; - end: number; - cyElem: any; -} -export declare enum TimebarGraphInclusionTypes { - overlaps = 0, - contains = 1, - contained_by = 2 -} -export declare enum TimebarStatsInclusionTypes { - all = 0, - begin = 1, - middle = 2, - end = 3 -} -export interface Settings { - isEnabled: boolean; - graphInclusionType: TimebarGraphInclusionTypes; - statsInclusionType: TimebarStatsInclusionTypes; - playingStep: number; - playingPeriod: number; - zoomingStep: number; - isHideDisconnectedNodesOnAnim: boolean; - isMaintainGraphRange: boolean; - isIgnoreElemChanges: boolean; - globalRangeMin: number; - globalRangeMax: number; - graphRangeRatio: number; - defaultBeginDate: number; - defaultEndDate: number; - events: Events; - stats: Stat[]; -} -export interface Events { - maintainFiltering: (elems: any) => any; - showOnlyElems: (elems: any) => void; - chartRendered: () => void; - statsRangeChanged: (s: number, e: number) => void; - graphRangeChanged: (s: number, e: number) => void; -} -export interface ChartElements { - chartElemId: string; - controllerElemId: string; -} diff --git a/src/lib/timebar/defaults.d.ts b/src/lib/timebar/defaults.d.ts deleted file mode 100644 index 0bb0fbbf..00000000 --- a/src/lib/timebar/defaults.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -export declare const SETTINGS: { - isEnabled: boolean; - playingStep: number; - playingPeriod: number; - zoomingStep: number; - graphInclusionType: number; - statsInclusionType: number; - isHideDisconnectedNodesOnAnim: boolean; - globalRangeMin: number; - globalRangeMax: number; - isMaintainGraphRange: boolean; -}; -export declare const METRICS: { - name: string; - incrementFn: (x: any) => 1 | 0; - color: string; -}[]; -export declare const EVENTS: { - maintainFiltering: (elems: any) => any; - showOnlyElems: (elems: any, isRandomize: any) => void; - chartRendered: () => void; - statsRangeChanged: () => void; - graphRangeChanged: () => void; -}; diff --git a/src/lib/timebar/helper.d.ts b/src/lib/timebar/helper.d.ts deleted file mode 100644 index c89df864..00000000 --- a/src/lib/timebar/helper.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -export declare const CSS_SM_TEXT_SIZE = 11; -export declare const CSS_FONT_NAME = "Arial"; -export declare const MONTHS: string[]; -export declare const SHORT_MONTHS: string[]; -export declare const TIME_UNITS: { - 'century': number; - 'decade': number; - 'year': number; - 'quarter': number; - 'month': number; - 'week': number; - 'day': number; - 'hour': number; - '5min': number; - 'minute': number; - '5sec': number; - 'second': number; - '50ms': number; - 'ms': number; -}; -/** - * @param {number} a1 a datetime in milliseconds - * @param {number} a2 a datetime in milliseconds - * @param {number=1000} margin - */ -export declare function isCloseMS(a1: number, a2: number, margin?: number): boolean; -export declare const MIN_DATE = -59011466152000; -export declare const MAX_DATE = 32503669200000; -export declare const MIN_SAMPLE_CNT = 10; -export declare function debounce(func: any, wait: any, immediate: any): () => void; -export declare function extendObj(o1: any, o2: any): any; diff --git a/src/logo.ico b/src/logo.ico deleted file mode 100644 index 7eb33c83..00000000 Binary files a/src/logo.ico and /dev/null differ diff --git a/src/logo.png b/src/logo.png deleted file mode 100644 index 4ce80c34..00000000 Binary files a/src/logo.png and /dev/null differ diff --git a/src/main.ts b/src/main.ts deleted file mode 100644 index c5c4bf42..00000000 --- a/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/visuall/app.module'; -import { environment } from './environments/environment'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts deleted file mode 100644 index f1aacd9f..00000000 --- a/src/polyfills.ts +++ /dev/null @@ -1,67 +0,0 @@ -/*************************************************************************************************** - * Load `$localize` onto the global scope - used if i18n tags appear in Angular templates. - */ -import '@angular/localize/init'; -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags.ts'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/src/style-generator.js b/src/style-generator.js deleted file mode 100644 index 440a2de8..00000000 --- a/src/style-generator.js +++ /dev/null @@ -1,149 +0,0 @@ -let fs = require('fs'); -const css = require('css'); - -main(); - -function main() { - let app_desc_file = 'app/custom/config/app_description.json'; - if (process.argv.length === 3) { - app_desc_file = process.argv[2]; - } - - const app_desc = readFile(app_desc_file); - const cy_style = readFile('assets/cy-style.json'); - parseAppDescription(JSON.parse(app_desc), JSON.parse(cy_style)); -} - -function parseAppDescription(app_desc, cy_style) { - - let stylesheet = []; - let properties = { nodes: {}, edges: {} }; - let endpoints = {}; - updateHtmlCss(app_desc); - - // Apply styles that should be at the base - setFixedStyles(stylesheet, cy_style.general); - - // Generate stylesheet.json & properties.json for nodes and edges - setCyStyles(app_desc['objects'], stylesheet, properties, false); - setCyStyles(app_desc['relations'], stylesheet, properties); - setEndpoints(app_desc['relations'], endpoints); - let path = 'assets/generated/'; - // Beautify JSON output with 2 space tabs and write to file - writeFile(path + 'stylesheet.json', JSON.stringify(stylesheet, null, 2)); - writeFile(path + 'properties.json', JSON.stringify(properties, null, 2)); - writeFile(path + 'endpoints.json', JSON.stringify(endpoints, null, 2)); -} - -function updateHtmlCss(data) { - const indexFileName = 'index.html'; - const cssFileName = 'styles.css'; - - processCssFile(cssFileName, data.cssStyle); - processIndexFile(indexFileName, data.appInfo); -} - -function processCssFile(cssFileName, style) { - let cssFile = readFile(cssFileName); - - let ast = css.parse(cssFile); - - for (let [key, val] of Object.entries(style)) { - for (let [cssKey, cssVal] of Object.entries(val)) { - updateAST(ast, key, cssKey, cssVal); - } - } - - cssFile = css.stringify(ast); - writeFile(cssFileName, cssFile); -} - -function processIndexFile(indexFileName, template) { - let indexFile = readFile(indexFileName); - - // Insert name between ___ - indexFile = indexFile.replace(/(?<=)(.*?)(?=<\/title>)/, template.html_header); - writeFile(indexFileName, indexFile); -} - -function setFixedStyles(stylesheet, generalStyles) { - generalStyles.forEach(element => { - stylesheet.push(element); - }); -} - -function setEndpoints(relations, endpoints) { - for (let edgeClass in relations) { - let relation = relations[edgeClass]; - - // Extract source and target node types from the relation - let sourceNodeType = relation.source; - let targetNodeType = relation.target; - - // Populate endpoints dictionary - endpoints[edgeClass] = { - sourceNodeType: sourceNodeType, - targetNodeType: targetNodeType, - }; - } -} - -function setCyStyles(graphElems, stylesheet, properties, isEdge = true) { - let s = 'node.'; - let s2 = 'nodes'; - if (isEdge) { - s = 'edge.'; - s2 = 'edges'; - } - - for (let key in graphElems) { - let val = graphElems[key]; - let cyStyle = { selector: s + key, style: {} }; - - for (let style_key in val['style']) { - cyStyle['style'][style_key] = val['style'][style_key]; - } - stylesheet.push(cyStyle); - properties[s2][key] = val['properties']; - } -} - -function readFile(filename) { - if (typeof filename !== 'string') { - console.log('Invalid use of function!\nread_file(filename:string)'); - return; - } - - return fs.readFileSync(filename, 'utf8'); -} - -function writeFile(filename, content) { - if (typeof filename !== 'string' || typeof content !== 'string') { - console.log('Invalid use of function!\nwrite_file(filename:string, content:string)'); - return; - } - - fs.writeFile(filename, content, function (err) { - if (err) throw err; - - console.log(filename + ' written successfully!'); - }); -} - -// ast is abstract syntax tree for style.css file -function updateAST(ast, cssSelector, cssKey, cssVal) { - for (let i = 0; i < ast.stylesheet.rules.length; i++) { - let rule = ast.stylesheet.rules[i]; - if (!rule.selectors) { - continue; - } - if (rule.selectors.find(x => x.includes(cssSelector))) { - for (let j = 0; j < rule.declarations.length; j++) { - let decl = rule.declarations[j]; - if (decl.property === cssKey) { - ast.stylesheet.rules[i].declarations[j].value = cssVal; - } - } - } - } -} \ No newline at end of file diff --git a/src/styles.css b/src/styles.css deleted file mode 100644 index 7856c41c..00000000 --- a/src/styles.css +++ /dev/null @@ -1,444 +0,0 @@ -body, -html { - height: 100%; -} - -.va-title { - font-size: 20px; -} - -.va-heading1 { - font-size: 14px; - font-weight: bold; -} - -.va-heading2 { - font-size: 12px; -} - -.va-heading3 { - font-size: 12px; -} - -.va-text { - font-size: 12px; -} - -.va-small-text { - font-size: 11px; -} - -body { - font-family: 'Arial' !important; -} - -.navbar { - min-height: 35px; -} - -.toolbar-element { - height: 2.0vh; - min-height: 24px; - cursor: pointer; -} - -.toolbar-element-container { - padding: 1px; - margin-left: 4px; - float: left; -} - -#cy { - position: absolute; - overflow: hidden; - top: 0; - left: 10px; - width: 100%; - height: 100%; - border: 2px solid #2F4154; - border-radius: 6px; - background: #ffffff; -} - -app-navbar { - grid-area: nb; -} - -app-toolbar { - grid-area: tb; - padding-left: 10px; -} - -app-cytoscape { - grid-area: cy; - position: relative; -} - -app-timebar { - grid-area: ti; - padding-left: 10px; -} - -app-operation-tabs { - grid-area: ot; - padding-left: 10px; - overflow-y: scroll; -} - -.root { - display: grid; - grid-template-areas: 'nb nb''tb tb''cy ot''ti ti'; - height: 99vh; - grid-template-columns: 75% 25%; - grid-template-rows: min-content min-content auto max-content; -} - -.zoom-cursor { - cursor: url(../src/assets/img/zoom-cursor.svg), pointer !important; -} - -.filter-node-class { - margin: 1%; -} - -.filter-edge-class { - color: #343a40; - border-bottom: 2px solid #343a40; - margin: 1%; - padding: 3px; - text-decoration: none; -} - -.filter-edge-class:hover { - background-color: #343a40; - color: white; - border-radius: 3px; - text-decoration: none; -} - -.filter-class-disabled { - opacity: 0.4; -} - -.filter-form { - padding: 3px 20px 3px 5px; -} - -.filter-input { - padding-right: 5px; -} - -#rule-elements { - font-size: 0.875rem; -} - -#filter-add-rule-btn { - vertical-align: sub; -} - -.logic-op-link { - display: inline-block; - border: 2px solid; - border-radius: 5px; - color: inherit; - width: 3em; -} - -.panel-heading { - cursor: pointer; - text-align: center; - background-color: #eaeaea; - line-height: 1.45; - display: flex; - justify-content: center; - flex-direction: column; -} - -.subpanel-heading { - cursor: pointer; - text-align: center; - background-color: #eaeaea40; - line-height: 1.45; - display: flex; - justify-content: center; - flex-direction: column; -} - -.panel-heading-hideable { - margin: 0; - padding: 0; - text-align: center; - background-color: #eaeaea; -} - -.panel-title { - font-size: 12px; - color: #555555; - vertical-align: middle; - display: table-cell; -} - -.panel-body { - padding-top: 7px; - padding-bottom: 3px; - padding-left: 0 !important; - padding-right: 0 !important; -} - -.panel { - border: 2px solid transparent; -} - -/* CSS Method for adding Font Awesome Chevron Icons symbol for "opening" panels*/ - -.accordion-toggle:after { - font-family: 'FontAwesome', sans-serif; - content: "\f077"; - float: right; - padding-right: 4px; - color: inherit; -} - -/* symbol for "collapsed" panels */ - -.panel-heading.collapsed .accordion-toggle:after { - content: "\f078"; -} - -/* symbol for "collapsed" panels */ - -.subpanel-heading.collapsed .accordion-toggle:after { - content: "\f078"; -} - -/* borders for navigator and map */ - -.cytoscape-navigator-wrapper { - position: fixed; - width: 300px; - height: 200px; - overflow: hidden; - border: 2px solid #2F4154; - border-radius: 6px; - background: #fff; -} - -[data-bs-toggle="collapse"] .fa:before { - content: "\f139"; -} - -[data-bs-toggle="collapse"].collapsed .fa:before { - content: "\f13a"; -} - -#highlight-search-inp { - width: 75px; - border-radius: 5px; - height: 23px; -} - -/* custom css for context-menu extension */ - -.vall-ctx-menu-item:hover { - color: #16181b !important; - background-color: #f8f9fa !important; -} - -.vall-ctx-menu-item { - background-color: #ffffff !important; - padding: 0.25rem 1.5rem !important; - width: 100% !important; - font-weight: 400 !important; - color: #212529 !important; -} - -.vall-ctx-menu { - padding: .5rem 0 !important; - margin: .125rem 0 0 !important; - border: 1px solid rgba(0, 0, 0, .15) !important; - background-color: #ffffff !important; - border-radius: .25rem !important; -} - -.modal-title { - margin: 0 auto; -} - -.modal-header { - padding: 0.5rem 1rem; -} - -.img-icon { - width: 20px; - height: 20px; -} - -.img-sm-icon { - width: 12px; - height: 12px; -} - -.query-input { - width: 60px; - display: inline; - margin-top: 2px; -} - -.query-input-wide { - width: 105px; - display: inline; - margin-top: 2px; -} - -.custom-query { - padding: 2%; - color: black; -} - -.cb-filter { - margin-left: -1rem !important; -} - -.strokeme { - color: white; - text-shadow: 1px 0px 1px black, 0px 1px 1px black, -1px 0px 1px black, 0px -1px 1px black; -} - -.tight-select { - background-position: center right 5px; - height: inherit; -} - -.query-select { - text-align: center; - text-align-last: center; - width: auto; -} - -.inp-3-char { - width: 5.5em; -} - -.pointer { - cursor: pointer; - cursor: pointer; - -webkit-user-select: none; - /* Safari 3.1+ */ - -moz-user-select: none; - /* Firefox 2+ */ - -ms-user-select: none; - /* IE 10+ */ - user-select: none; -} - -.std-inp-hei { - height: 2em; - padding: .25rem !important; -} - -.std-inp-hei-sec { - height: 2.25em; -} - -.form-inline { - display: flex; - vertical-align: middle; - align-items: center; -} - -label.form-check-label, -input.form-check-input { - cursor: pointer; -} - -/* custom selected bar charts in Timebar */ - -rect[fill-opacity="0"]:not([stroke="none"]) { - stroke: white; - stroke-width: 2px; -} - -html, -body { - height: 100%; -} - -body { - margin: 0; - font-family: Roboto, "Helvetica Neue", sans-serif; -} - -/* Data Configuration Model */ - -.mat-dialog-container { - overflow: hidden !important; - width: 1000px !important; - height: 520px !important; - padding: 0 !important; - margin-left: calc((80vw - 1000px)/2); - margin-right: calc((80vw - 1000px)/2); - margin-top: calc((80vh - 500px)/2); - margin-bottom: calc((80vh - 500px)/2); -} - -/* Angular Material UI Auto Complete Component Changed Style*/ - -.mat-option { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: block; - line-height: 28px !important; - height: 28px !important; - width: max-content !important; - padding: 0 16px; - text-align: left; - text-decoration: none; - max-width: 100%; - position: relative; - cursor: pointer; - outline: none; - display: flex; - flex-direction: row; - max-width: 100%; - box-sizing: border-box; - align-items: center; - -webkit-tap-highlight-color: transparent; - max-width: 150px !important; -} - -.mat-option.large { - max-width: 20vw !important; -} - -.mat-autocomplete-panel { - scrollbar-width: none !important; - min-width: max-content !important; - border: 1px solid #ccc !important; - background-color: #ececec !important; - border-radius: 5px !important; -} - -.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover)::before { - content: '✓'; - /* Unicode checkmark character */ - display: inline-block; - position: absolute; - left: 5px; - /* Adjust the left position of the checkmark */ - top: 50%; - transform: translateY(-50%); - color: black; - background: #ececec !important; - /* Adjust the color of the checkmark */ -} - -.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover) { - background: #ececec !important; -} - -.mat-option:hover:not(.mat-option-disabled), -.mat-option:focus:not(.mat-option-disabled) { - background: rgb(0 0 0 / 4%); - border-radius: 5px !important; -} \ No newline at end of file diff --git a/src/test.ts b/src/test.ts deleted file mode 100644 index a6f15af3..00000000 --- a/src/test.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/testing'; -import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; - -declare const require: any; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() -); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json deleted file mode 100644 index 190fd300..00000000 --- a/src/tsconfig.app.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "types": [] - }, - "exclude": [ - "test.ts", - "**/*.spec.ts" - ] -} diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json deleted file mode 100644 index de773363..00000000 --- a/src/tsconfig.spec.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/spec", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "test.ts", - "polyfills.ts" - ], - "include": [ - "**/*.spec.ts", - "**/*.d.ts" - ] -} diff --git a/src/tslint.json b/src/tslint.json deleted file mode 100644 index aa7c3eeb..00000000 --- a/src/tslint.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "../tslint.json", - "rules": { - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ] - } -} diff --git a/docs/style.css b/style.css similarity index 84% rename from docs/style.css rename to style.css index 4e4c45f7..efcd9724 100644 --- a/docs/style.css +++ b/style.css @@ -136,4 +136,41 @@ img { display: flex; width: 100%; justify-content: center; +} + + +#practitioner-insights { + max-width: 1200px; + margin: 0 auto; +} +h2 { + text-align: center; + margin-bottom: 20px; +} +.card-container { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 20px; +} +.card { + background-color: #fff; + border: 1px solid #ddd; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + padding: 20px; + transition: transform 0.2s; +} +.card:hover { + transform: scale(1.05); +} +.card:hover h3 { + color: #e68903; +} +.card h3 { + margin-top: 0; + color: #333; +} +.card p { + color: #555; + text-align: -webkit-center; } \ No newline at end of file diff --git a/time-stamper.js b/time-stamper.js deleted file mode 100644 index 982f1f9b..00000000 --- a/time-stamper.js +++ /dev/null @@ -1,36 +0,0 @@ -const fs = require('fs'); - -main(); - -function main() { - let app_desc_file = 'dist/ng-visuall/app/custom/config/app_description.json'; - if (process.argv.length === 3) { - app_desc_file = process.argv[2]; - } - - const app_desc = JSON.parse(readFile(app_desc_file)); - app_desc.appInfo.build_time = new Date().toLocaleString('tr-TR', { timeZone: 'Europe/Athens' }) + ' (Turkey)'; - writeFile(app_desc_file, JSON.stringify(app_desc)); -} - -function readFile(filename) { - if (typeof filename !== 'string') { - console.log('Invalid use of function!\nread_file(filename:string)'); - return; - } - - return fs.readFileSync(filename, 'utf8'); -} - -function writeFile(filename, content) { - if (typeof filename !== 'string' || typeof content !== 'string') { - console.log('Invalid use of function!\nwrite_file(filename:string, content:string)'); - return; - } - - fs.writeFile(filename, content, function (err) { - if (err) throw err; - - console.log(filename + ' written successfully!'); - }); -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 1e52fe70..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "downlevelIteration": true, - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "module": "esnext", - "moduleResolution": "node", - "experimentalDecorators": true, - "importHelpers": true, - "target": "es2015", - "resolveJsonModule": true, - "esModuleInterop": true, - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2018", - "dom" - ] - }, - "angularCompilerOptions": { - "strictTemplates": true - } -} diff --git a/tslint.json b/tslint.json deleted file mode 100644 index add926c3..00000000 --- a/tslint.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "extends": "tslint:recommended", - "rulesDirectory": [ - "codelyzer" - ], - "rules": { - "array-type": false, - "arrow-parens": false, - "deprecation": { - "severity": "warn" - }, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "interface-name": false, - "max-classes-per-file": false, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-consecutive-blank-lines": false, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-empty": false, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-non-null-assertion": true, - "no-redundant-jsdoc": true, - "no-switch-case-fall-through": true, - "no-use-before-declare": true, - "no-var-requires": false, - "object-literal-key-quotes": [ - true, - "as-needed" - ], - "object-literal-sort-keys": false, - "ordered-imports": false, - "quotemark": [ - true, - "single" - ], - "trailing-comma": false, - "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 - } -} diff --git a/docs/tutorials.html b/tutorials.html similarity index 100% rename from docs/tutorials.html rename to tutorials.html