Spaces:
				
			
			
	
			
			
		Sleeping
		
	
	
	
			
			
	
	
	
	
		
		
		Sleeping
		
	
		Ahmad Shallouf
		
	commited on
		
		
					Commit 
							
							Β·
						
						88bf46c
	
1
								Parent(s):
							
							4bb8324
								
added control pael
Browse files- .DS_Store +0 -0
 - README.md +27 -11
 - docker-compose.yaml +0 -9
 - package-lock.json +275 -354
 - src/.DS_Store +0 -0
 - src/app/.DS_Store +0 -0
 - src/app/app.routes.ts +3 -0
 - src/{assets β app/components}/.DS_Store +0 -0
 - src/app/components/body/control-panel/admin-login/admin-login.component.css +43 -0
 - src/app/components/body/control-panel/admin-login/admin-login.component.html +23 -0
 - src/app/components/body/control-panel/admin-login/admin-login.component.spec.ts +23 -0
 - src/app/components/body/control-panel/admin-login/admin-login.component.ts +39 -0
 - src/app/components/body/control-panel/control-panel.component.css +36 -0
 - src/app/components/body/control-panel/control-panel.component.html +144 -0
 - src/app/components/body/control-panel/control-panel.component.spec.ts +23 -0
 - src/app/components/body/control-panel/control-panel.component.ts +110 -0
 - src/app/state_management/models/control-panel-entry.model.ts +16 -0
 - src/app/state_management/models/leaderboard-entry.model.ts +0 -2
 - src/app/state_management/models/state.model.ts +4 -0
 - src/app/state_management/services/app-state.service.ts +61 -3
 - src/app/state_management/services/authentication.service.spec.ts +16 -0
 - src/app/state_management/services/authentication.service.ts +74 -0
 - src/styles.css +1 -3
 
    	
        .DS_Store
    CHANGED
    
    | 
         Binary files a/.DS_Store and b/.DS_Store differ 
     | 
| 
         | 
    	
        README.md
    CHANGED
    
    | 
         @@ -1,11 +1,27 @@ 
     | 
|
| 1 | 
         
            -
             
     | 
| 2 | 
         
            -
             
     | 
| 3 | 
         
            -
             
     | 
| 4 | 
         
            -
             
     | 
| 5 | 
         
            -
             
     | 
| 6 | 
         
            -
             
     | 
| 7 | 
         
            -
             
     | 
| 8 | 
         
            -
             
     | 
| 9 | 
         
            -
             
     | 
| 10 | 
         
            -
             
     | 
| 11 | 
         
            -
              
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            # CompugeFrontend
         
     | 
| 2 | 
         
            +
             
     | 
| 3 | 
         
            +
            This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.4.
         
     | 
| 4 | 
         
            +
             
     | 
| 5 | 
         
            +
            ## Development server
         
     | 
| 6 | 
         
            +
             
     | 
| 7 | 
         
            +
            Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
         
     | 
| 8 | 
         
            +
             
     | 
| 9 | 
         
            +
            ## Code scaffolding
         
     | 
| 10 | 
         
            +
             
     | 
| 11 | 
         
            +
            Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
         
     | 
| 12 | 
         
            +
             
     | 
| 13 | 
         
            +
            ## Build
         
     | 
| 14 | 
         
            +
             
     | 
| 15 | 
         
            +
            Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
         
     | 
| 16 | 
         
            +
             
     | 
| 17 | 
         
            +
            ## Running unit tests
         
     | 
| 18 | 
         
            +
             
     | 
| 19 | 
         
            +
            Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
         
     | 
| 20 | 
         
            +
             
     | 
| 21 | 
         
            +
            ## Running end-to-end tests
         
     | 
| 22 | 
         
            +
             
     | 
| 23 | 
         
            +
            Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
         
     | 
| 24 | 
         
            +
             
     | 
| 25 | 
         
            +
            ## Further help
         
     | 
| 26 | 
         
            +
             
     | 
| 27 | 
         
            +
            To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
         
     | 
    	
        docker-compose.yaml
    DELETED
    
    | 
         @@ -1,9 +0,0 @@ 
     | 
|
| 1 | 
         
            -
            version: '3.7'
         
     | 
| 2 | 
         
            -
            services:
         
     | 
| 3 | 
         
            -
              frontend:
         
     | 
| 4 | 
         
            -
                build:
         
     | 
| 5 | 
         
            -
                  context: .
         
     | 
| 6 | 
         
            -
                  args:
         
     | 
| 7 | 
         
            -
                    PROFILE: production
         
     | 
| 8 | 
         
            -
                ports:
         
     | 
| 9 | 
         
            -
                  - '4200:4200' # Port mapping
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
    	
        package-lock.json
    CHANGED
    
    | 
         @@ -266,9 +266,9 @@ 
     | 
|
| 266 | 
         
             
                  }
         
     | 
| 267 | 
         
             
                },
         
     | 
| 268 | 
         
             
                "node_modules/@angular/animations": {
         
     | 
| 269 | 
         
            -
                  "version": "17.3. 
     | 
| 270 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3. 
     | 
| 271 | 
         
            -
                  "integrity": "sha512- 
     | 
| 272 | 
         
             
                  "dependencies": {
         
     | 
| 273 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 274 | 
         
             
                  },
         
     | 
| 
         @@ -276,7 +276,7 @@ 
     | 
|
| 276 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 277 | 
         
             
                  },
         
     | 
| 278 | 
         
             
                  "peerDependencies": {
         
     | 
| 279 | 
         
            -
                    "@angular/core": "17.3. 
     | 
| 280 | 
         
             
                  }
         
     | 
| 281 | 
         
             
                },
         
     | 
| 282 | 
         
             
                "node_modules/@angular/cdk": {
         
     | 
| 
         @@ -330,9 +330,9 @@ 
     | 
|
| 330 | 
         
             
                  }
         
     | 
| 331 | 
         
             
                },
         
     | 
| 332 | 
         
             
                "node_modules/@angular/common": {
         
     | 
| 333 | 
         
            -
                  "version": "17.3. 
     | 
| 334 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3. 
     | 
| 335 | 
         
            -
                  "integrity": "sha512- 
     | 
| 336 | 
         
             
                  "dependencies": {
         
     | 
| 337 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 338 | 
         
             
                  },
         
     | 
| 
         @@ -340,14 +340,14 @@ 
     | 
|
| 340 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 341 | 
         
             
                  },
         
     | 
| 342 | 
         
             
                  "peerDependencies": {
         
     | 
| 343 | 
         
            -
                    "@angular/core": "17.3. 
     | 
| 344 | 
         
             
                    "rxjs": "^6.5.3 || ^7.4.0"
         
     | 
| 345 | 
         
             
                  }
         
     | 
| 346 | 
         
             
                },
         
     | 
| 347 | 
         
             
                "node_modules/@angular/compiler": {
         
     | 
| 348 | 
         
            -
                  "version": "17.3. 
     | 
| 349 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3. 
     | 
| 350 | 
         
            -
                  "integrity": "sha512- 
     | 
| 351 | 
         
             
                  "dependencies": {
         
     | 
| 352 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 353 | 
         
             
                  },
         
     | 
| 
         @@ -355,7 +355,7 @@ 
     | 
|
| 355 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 356 | 
         
             
                  },
         
     | 
| 357 | 
         
             
                  "peerDependencies": {
         
     | 
| 358 | 
         
            -
                    "@angular/core": "17.3. 
     | 
| 359 | 
         
             
                  },
         
     | 
| 360 | 
         
             
                  "peerDependenciesMeta": {
         
     | 
| 361 | 
         
             
                    "@angular/core": {
         
     | 
| 
         @@ -364,9 +364,9 @@ 
     | 
|
| 364 | 
         
             
                  }
         
     | 
| 365 | 
         
             
                },
         
     | 
| 366 | 
         
             
                "node_modules/@angular/compiler-cli": {
         
     | 
| 367 | 
         
            -
                  "version": "17.3. 
     | 
| 368 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3. 
     | 
| 369 | 
         
            -
                  "integrity": "sha512- 
     | 
| 370 | 
         
             
                  "dev": true,
         
     | 
| 371 | 
         
             
                  "dependencies": {
         
     | 
| 372 | 
         
             
                    "@babel/core": "7.23.9",
         
     | 
| 
         @@ -387,7 +387,7 @@ 
     | 
|
| 387 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 388 | 
         
             
                  },
         
     | 
| 389 | 
         
             
                  "peerDependencies": {
         
     | 
| 390 | 
         
            -
                    "@angular/compiler": "17.3. 
     | 
| 391 | 
         
             
                    "typescript": ">=5.2 <5.5"
         
     | 
| 392 | 
         
             
                  }
         
     | 
| 393 | 
         
             
                },
         
     | 
| 
         @@ -437,9 +437,9 @@ 
     | 
|
| 437 | 
         
             
                  }
         
     | 
| 438 | 
         
             
                },
         
     | 
| 439 | 
         
             
                "node_modules/@angular/core": {
         
     | 
| 440 | 
         
            -
                  "version": "17.3. 
     | 
| 441 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3. 
     | 
| 442 | 
         
            -
                  "integrity": "sha512- 
     | 
| 443 | 
         
             
                  "dependencies": {
         
     | 
| 444 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 445 | 
         
             
                  },
         
     | 
| 
         @@ -468,9 +468,9 @@ 
     | 
|
| 468 | 
         
             
                  }
         
     | 
| 469 | 
         
             
                },
         
     | 
| 470 | 
         
             
                "node_modules/@angular/forms": {
         
     | 
| 471 | 
         
            -
                  "version": "17.3. 
     | 
| 472 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3. 
     | 
| 473 | 
         
            -
                  "integrity": "sha512- 
     | 
| 474 | 
         
             
                  "dependencies": {
         
     | 
| 475 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 476 | 
         
             
                  },
         
     | 
| 
         @@ -478,9 +478,9 @@ 
     | 
|
| 478 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 479 | 
         
             
                  },
         
     | 
| 480 | 
         
             
                  "peerDependencies": {
         
     | 
| 481 | 
         
            -
                    "@angular/common": "17.3. 
     | 
| 482 | 
         
            -
                    "@angular/core": "17.3. 
     | 
| 483 | 
         
            -
                    "@angular/platform-browser": "17.3. 
     | 
| 484 | 
         
             
                    "rxjs": "^6.5.3 || ^7.4.0"
         
     | 
| 485 | 
         
             
                  }
         
     | 
| 486 | 
         
             
                },
         
     | 
| 
         @@ -549,9 +549,9 @@ 
     | 
|
| 549 | 
         
             
                  }
         
     | 
| 550 | 
         
             
                },
         
     | 
| 551 | 
         
             
                "node_modules/@angular/platform-browser": {
         
     | 
| 552 | 
         
            -
                  "version": "17.3. 
     | 
| 553 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3. 
     | 
| 554 | 
         
            -
                  "integrity": "sha512- 
     | 
| 555 | 
         
             
                  "dependencies": {
         
     | 
| 556 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 557 | 
         
             
                  },
         
     | 
| 
         @@ -559,9 +559,9 @@ 
     | 
|
| 559 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 560 | 
         
             
                  },
         
     | 
| 561 | 
         
             
                  "peerDependencies": {
         
     | 
| 562 | 
         
            -
                    "@angular/animations": "17.3. 
     | 
| 563 | 
         
            -
                    "@angular/common": "17.3. 
     | 
| 564 | 
         
            -
                    "@angular/core": "17.3. 
     | 
| 565 | 
         
             
                  },
         
     | 
| 566 | 
         
             
                  "peerDependenciesMeta": {
         
     | 
| 567 | 
         
             
                    "@angular/animations": {
         
     | 
| 
         @@ -570,9 +570,9 @@ 
     | 
|
| 570 | 
         
             
                  }
         
     | 
| 571 | 
         
             
                },
         
     | 
| 572 | 
         
             
                "node_modules/@angular/platform-browser-dynamic": {
         
     | 
| 573 | 
         
            -
                  "version": "17.3. 
     | 
| 574 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3. 
     | 
| 575 | 
         
            -
                  "integrity": "sha512- 
     | 
| 576 | 
         
             
                  "dependencies": {
         
     | 
| 577 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 578 | 
         
             
                  },
         
     | 
| 
         @@ -580,16 +580,16 @@ 
     | 
|
| 580 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 581 | 
         
             
                  },
         
     | 
| 582 | 
         
             
                  "peerDependencies": {
         
     | 
| 583 | 
         
            -
                    "@angular/common": "17.3. 
     | 
| 584 | 
         
            -
                    "@angular/compiler": "17.3. 
     | 
| 585 | 
         
            -
                    "@angular/core": "17.3. 
     | 
| 586 | 
         
            -
                    "@angular/platform-browser": "17.3. 
     | 
| 587 | 
         
             
                  }
         
     | 
| 588 | 
         
             
                },
         
     | 
| 589 | 
         
             
                "node_modules/@angular/router": {
         
     | 
| 590 | 
         
            -
                  "version": "17.3. 
     | 
| 591 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3. 
     | 
| 592 | 
         
            -
                  "integrity": "sha512- 
     | 
| 593 | 
         
             
                  "dependencies": {
         
     | 
| 594 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 595 | 
         
             
                  },
         
     | 
| 
         @@ -597,9 +597,9 @@ 
     | 
|
| 597 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 598 | 
         
             
                  },
         
     | 
| 599 | 
         
             
                  "peerDependencies": {
         
     | 
| 600 | 
         
            -
                    "@angular/common": "17.3. 
     | 
| 601 | 
         
            -
                    "@angular/core": "17.3. 
     | 
| 602 | 
         
            -
                    "@angular/platform-browser": "17.3. 
     | 
| 603 | 
         
             
                    "rxjs": "^6.5.3 || ^7.4.0"
         
     | 
| 604 | 
         
             
                  }
         
     | 
| 605 | 
         
             
                },
         
     | 
| 
         @@ -617,9 +617,9 @@ 
     | 
|
| 617 | 
         
             
                  }
         
     | 
| 618 | 
         
             
                },
         
     | 
| 619 | 
         
             
                "node_modules/@babel/compat-data": {
         
     | 
| 620 | 
         
            -
                  "version": "7. 
     | 
| 621 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7. 
     | 
| 622 | 
         
            -
                  "integrity": "sha512- 
     | 
| 623 | 
         
             
                  "dev": true,
         
     | 
| 624 | 
         
             
                  "engines": {
         
     | 
| 625 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -711,12 +711,12 @@ 
     | 
|
| 711 | 
         
             
                  }
         
     | 
| 712 | 
         
             
                },
         
     | 
| 713 | 
         
             
                "node_modules/@babel/helper-compilation-targets": {
         
     | 
| 714 | 
         
            -
                  "version": "7. 
     | 
| 715 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7. 
     | 
| 716 | 
         
            -
                  "integrity": "sha512- 
     | 
| 717 | 
         
             
                  "dev": true,
         
     | 
| 718 | 
         
             
                  "dependencies": {
         
     | 
| 719 | 
         
            -
                    "@babel/compat-data": "^7. 
     | 
| 720 | 
         
             
                    "@babel/helper-validator-option": "^7.24.8",
         
     | 
| 721 | 
         
             
                    "browserslist": "^4.23.1",
         
     | 
| 722 | 
         
             
                    "lru-cache": "^5.1.1",
         
     | 
| 
         @@ -736,19 +736,17 @@ 
     | 
|
| 736 | 
         
             
                  }
         
     | 
| 737 | 
         
             
                },
         
     | 
| 738 | 
         
             
                "node_modules/@babel/helper-create-class-features-plugin": {
         
     | 
| 739 | 
         
            -
                  "version": "7. 
     | 
| 740 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7. 
     | 
| 741 | 
         
            -
                  "integrity": "sha512- 
     | 
| 742 | 
         
             
                  "dev": true,
         
     | 
| 743 | 
         
             
                  "dependencies": {
         
     | 
| 744 | 
         
             
                    "@babel/helper-annotate-as-pure": "^7.24.7",
         
     | 
| 745 | 
         
            -
                    "@babel/helper-environment-visitor": "^7.24.7",
         
     | 
| 746 | 
         
            -
                    "@babel/helper-function-name": "^7.24.7",
         
     | 
| 747 | 
         
             
                    "@babel/helper-member-expression-to-functions": "^7.24.8",
         
     | 
| 748 | 
         
             
                    "@babel/helper-optimise-call-expression": "^7.24.7",
         
     | 
| 749 | 
         
            -
                    "@babel/helper-replace-supers": "^7. 
     | 
| 750 | 
         
             
                    "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
         
     | 
| 751 | 
         
            -
                    "@babel/ 
     | 
| 752 | 
         
             
                    "semver": "^6.3.1"
         
     | 
| 753 | 
         
             
                  },
         
     | 
| 754 | 
         
             
                  "engines": {
         
     | 
| 
         @@ -770,18 +768,6 @@ 
     | 
|
| 770 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 771 | 
         
             
                  }
         
     | 
| 772 | 
         
             
                },
         
     | 
| 773 | 
         
            -
                "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": {
         
     | 
| 774 | 
         
            -
                  "version": "7.24.7",
         
     | 
| 775 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
         
     | 
| 776 | 
         
            -
                  "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
         
     | 
| 777 | 
         
            -
                  "dev": true,
         
     | 
| 778 | 
         
            -
                  "dependencies": {
         
     | 
| 779 | 
         
            -
                    "@babel/types": "^7.24.7"
         
     | 
| 780 | 
         
            -
                  },
         
     | 
| 781 | 
         
            -
                  "engines": {
         
     | 
| 782 | 
         
            -
                    "node": ">=6.9.0"
         
     | 
| 783 | 
         
            -
                  }
         
     | 
| 784 | 
         
            -
                },
         
     | 
| 785 | 
         
             
                "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
         
     | 
| 786 | 
         
             
                  "version": "6.3.1",
         
     | 
| 787 | 
         
             
                  "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
         
     | 
| 
         @@ -792,9 +778,9 @@ 
     | 
|
| 792 | 
         
             
                  }
         
     | 
| 793 | 
         
             
                },
         
     | 
| 794 | 
         
             
                "node_modules/@babel/helper-create-regexp-features-plugin": {
         
     | 
| 795 | 
         
            -
                  "version": "7. 
     | 
| 796 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7. 
     | 
| 797 | 
         
            -
                  "integrity": "sha512 
     | 
| 798 | 
         
             
                  "dev": true,
         
     | 
| 799 | 
         
             
                  "dependencies": {
         
     | 
| 800 | 
         
             
                    "@babel/helper-annotate-as-pure": "^7.24.7",
         
     | 
| 
         @@ -857,31 +843,6 @@ 
     | 
|
| 857 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 858 | 
         
             
                  }
         
     | 
| 859 | 
         
             
                },
         
     | 
| 860 | 
         
            -
                "node_modules/@babel/helper-function-name": {
         
     | 
| 861 | 
         
            -
                  "version": "7.24.7",
         
     | 
| 862 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
         
     | 
| 863 | 
         
            -
                  "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
         
     | 
| 864 | 
         
            -
                  "dev": true,
         
     | 
| 865 | 
         
            -
                  "dependencies": {
         
     | 
| 866 | 
         
            -
                    "@babel/template": "^7.24.7",
         
     | 
| 867 | 
         
            -
                    "@babel/types": "^7.24.7"
         
     | 
| 868 | 
         
            -
                  },
         
     | 
| 869 | 
         
            -
                  "engines": {
         
     | 
| 870 | 
         
            -
                    "node": ">=6.9.0"
         
     | 
| 871 | 
         
            -
                  }
         
     | 
| 872 | 
         
            -
                },
         
     | 
| 873 | 
         
            -
                "node_modules/@babel/helper-hoist-variables": {
         
     | 
| 874 | 
         
            -
                  "version": "7.24.7",
         
     | 
| 875 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
         
     | 
| 876 | 
         
            -
                  "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
         
     | 
| 877 | 
         
            -
                  "dev": true,
         
     | 
| 878 | 
         
            -
                  "dependencies": {
         
     | 
| 879 | 
         
            -
                    "@babel/types": "^7.24.7"
         
     | 
| 880 | 
         
            -
                  },
         
     | 
| 881 | 
         
            -
                  "engines": {
         
     | 
| 882 | 
         
            -
                    "node": ">=6.9.0"
         
     | 
| 883 | 
         
            -
                  }
         
     | 
| 884 | 
         
            -
                },
         
     | 
| 885 | 
         
             
                "node_modules/@babel/helper-member-expression-to-functions": {
         
     | 
| 886 | 
         
             
                  "version": "7.24.8",
         
     | 
| 887 | 
         
             
                  "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
         
     | 
| 
         @@ -909,16 +870,15 @@ 
     | 
|
| 909 | 
         
             
                  }
         
     | 
| 910 | 
         
             
                },
         
     | 
| 911 | 
         
             
                "node_modules/@babel/helper-module-transforms": {
         
     | 
| 912 | 
         
            -
                  "version": "7. 
     | 
| 913 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7. 
     | 
| 914 | 
         
            -
                  "integrity": "sha512- 
     | 
| 915 | 
         
             
                  "dev": true,
         
     | 
| 916 | 
         
             
                  "dependencies": {
         
     | 
| 917 | 
         
            -
                    "@babel/helper-environment-visitor": "^7.24.7",
         
     | 
| 918 | 
         
             
                    "@babel/helper-module-imports": "^7.24.7",
         
     | 
| 919 | 
         
             
                    "@babel/helper-simple-access": "^7.24.7",
         
     | 
| 920 | 
         
            -
                    "@babel/helper- 
     | 
| 921 | 
         
            -
                    "@babel/ 
     | 
| 922 | 
         
             
                  },
         
     | 
| 923 | 
         
             
                  "engines": {
         
     | 
| 924 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -927,18 +887,6 @@ 
     | 
|
| 927 | 
         
             
                    "@babel/core": "^7.0.0"
         
     | 
| 928 | 
         
             
                  }
         
     | 
| 929 | 
         
             
                },
         
     | 
| 930 | 
         
            -
                "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": {
         
     | 
| 931 | 
         
            -
                  "version": "7.24.7",
         
     | 
| 932 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
         
     | 
| 933 | 
         
            -
                  "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
         
     | 
| 934 | 
         
            -
                  "dev": true,
         
     | 
| 935 | 
         
            -
                  "dependencies": {
         
     | 
| 936 | 
         
            -
                    "@babel/types": "^7.24.7"
         
     | 
| 937 | 
         
            -
                  },
         
     | 
| 938 | 
         
            -
                  "engines": {
         
     | 
| 939 | 
         
            -
                    "node": ">=6.9.0"
         
     | 
| 940 | 
         
            -
                  }
         
     | 
| 941 | 
         
            -
                },
         
     | 
| 942 | 
         
             
                "node_modules/@babel/helper-optimise-call-expression": {
         
     | 
| 943 | 
         
             
                  "version": "7.24.7",
         
     | 
| 944 | 
         
             
                  "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
         
     | 
| 
         @@ -961,14 +909,14 @@ 
     | 
|
| 961 | 
         
             
                  }
         
     | 
| 962 | 
         
             
                },
         
     | 
| 963 | 
         
             
                "node_modules/@babel/helper-remap-async-to-generator": {
         
     | 
| 964 | 
         
            -
                  "version": "7. 
     | 
| 965 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7. 
     | 
| 966 | 
         
            -
                  "integrity": "sha512- 
     | 
| 967 | 
         
             
                  "dev": true,
         
     | 
| 968 | 
         
             
                  "dependencies": {
         
     | 
| 969 | 
         
             
                    "@babel/helper-annotate-as-pure": "^7.24.7",
         
     | 
| 970 | 
         
            -
                    "@babel/helper- 
     | 
| 971 | 
         
            -
                    "@babel/ 
     | 
| 972 | 
         
             
                  },
         
     | 
| 973 | 
         
             
                  "engines": {
         
     | 
| 974 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -990,14 +938,14 @@ 
     | 
|
| 990 | 
         
             
                  }
         
     | 
| 991 | 
         
             
                },
         
     | 
| 992 | 
         
             
                "node_modules/@babel/helper-replace-supers": {
         
     | 
| 993 | 
         
            -
                  "version": "7. 
     | 
| 994 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7. 
     | 
| 995 | 
         
            -
                  "integrity": "sha512- 
     | 
| 996 | 
         
             
                  "dev": true,
         
     | 
| 997 | 
         
             
                  "dependencies": {
         
     | 
| 998 | 
         
            -
                    "@babel/helper- 
     | 
| 999 | 
         
            -
                    "@babel/helper- 
     | 
| 1000 | 
         
            -
                    "@babel/ 
     | 
| 1001 | 
         
             
                  },
         
     | 
| 1002 | 
         
             
                  "engines": {
         
     | 
| 1003 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -1072,28 +1020,27 @@ 
     | 
|
| 1072 | 
         
             
                  }
         
     | 
| 1073 | 
         
             
                },
         
     | 
| 1074 | 
         
             
                "node_modules/@babel/helper-wrap-function": {
         
     | 
| 1075 | 
         
            -
                  "version": "7. 
     | 
| 1076 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7. 
     | 
| 1077 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1078 | 
         
             
                  "dev": true,
         
     | 
| 1079 | 
         
             
                  "dependencies": {
         
     | 
| 1080 | 
         
            -
                    "@babel/ 
     | 
| 1081 | 
         
            -
                    "@babel/ 
     | 
| 1082 | 
         
            -
                    "@babel/ 
     | 
| 1083 | 
         
            -
                    "@babel/types": "^7.24.7"
         
     | 
| 1084 | 
         
             
                  },
         
     | 
| 1085 | 
         
             
                  "engines": {
         
     | 
| 1086 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 1087 | 
         
             
                  }
         
     | 
| 1088 | 
         
             
                },
         
     | 
| 1089 | 
         
             
                "node_modules/@babel/helpers": {
         
     | 
| 1090 | 
         
            -
                  "version": "7. 
     | 
| 1091 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7. 
     | 
| 1092 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1093 | 
         
             
                  "dev": true,
         
     | 
| 1094 | 
         
             
                  "dependencies": {
         
     | 
| 1095 | 
         
            -
                    "@babel/template": "^7. 
     | 
| 1096 | 
         
            -
                    "@babel/types": "^7. 
     | 
| 1097 | 
         
             
                  },
         
     | 
| 1098 | 
         
             
                  "engines": {
         
     | 
| 1099 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -1115,10 +1062,13 @@ 
     | 
|
| 1115 | 
         
             
                  }
         
     | 
| 1116 | 
         
             
                },
         
     | 
| 1117 | 
         
             
                "node_modules/@babel/parser": {
         
     | 
| 1118 | 
         
            -
                  "version": "7. 
     | 
| 1119 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7. 
     | 
| 1120 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1121 | 
         
             
                  "dev": true,
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 1122 | 
         
             
                  "bin": {
         
     | 
| 1123 | 
         
             
                    "parser": "bin/babel-parser.js"
         
     | 
| 1124 | 
         
             
                  },
         
     | 
| 
         @@ -1127,12 +1077,12 @@ 
     | 
|
| 1127 | 
         
             
                  }
         
     | 
| 1128 | 
         
             
                },
         
     | 
| 1129 | 
         
             
                "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
         
     | 
| 1130 | 
         
            -
                  "version": "7. 
     | 
| 1131 | 
         
            -
                  "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. 
     | 
| 1132 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1133 | 
         
             
                  "dev": true,
         
     | 
| 1134 | 
         
             
                  "dependencies": {
         
     | 
| 1135 | 
         
            -
                    "@babel/helper-plugin-utils": "^7.24. 
     | 
| 1136 | 
         
             
                  },
         
     | 
| 1137 | 
         
             
                  "engines": {
         
     | 
| 1138 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -1159,13 +1109,13 @@ 
     | 
|
| 1159 | 
         
             
                  }
         
     | 
| 1160 | 
         
             
                },
         
     | 
| 1161 | 
         
             
                "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
         
     | 
| 1162 | 
         
            -
                  "version": "7. 
     | 
| 1163 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7. 
     | 
| 1164 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1165 | 
         
             
                  "dev": true,
         
     | 
| 1166 | 
         
             
                  "dependencies": {
         
     | 
| 1167 | 
         
            -
                    "@babel/helper- 
     | 
| 1168 | 
         
            -
                    "@babel/ 
     | 
| 1169 | 
         
             
                  },
         
     | 
| 1170 | 
         
             
                  "engines": {
         
     | 
| 1171 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -1487,12 +1437,12 @@ 
     | 
|
| 1487 | 
         
             
                  }
         
     | 
| 1488 | 
         
             
                },
         
     | 
| 1489 | 
         
             
                "node_modules/@babel/plugin-transform-block-scoping": {
         
     | 
| 1490 | 
         
            -
                  "version": "7. 
     | 
| 1491 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7. 
     | 
| 1492 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1493 | 
         
             
                  "dev": true,
         
     | 
| 1494 | 
         
             
                  "dependencies": {
         
     | 
| 1495 | 
         
            -
                    "@babel/helper-plugin-utils": "^7.24. 
     | 
| 1496 | 
         
             
                  },
         
     | 
| 1497 | 
         
             
                  "engines": {
         
     | 
| 1498 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -1535,18 +1485,16 @@ 
     | 
|
| 1535 | 
         
             
                  }
         
     | 
| 1536 | 
         
             
                },
         
     | 
| 1537 | 
         
             
                "node_modules/@babel/plugin-transform-classes": {
         
     | 
| 1538 | 
         
            -
                  "version": "7. 
     | 
| 1539 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7. 
     | 
| 1540 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1541 | 
         
             
                  "dev": true,
         
     | 
| 1542 | 
         
             
                  "dependencies": {
         
     | 
| 1543 | 
         
             
                    "@babel/helper-annotate-as-pure": "^7.24.7",
         
     | 
| 1544 | 
         
             
                    "@babel/helper-compilation-targets": "^7.24.8",
         
     | 
| 1545 | 
         
            -
                    "@babel/helper-environment-visitor": "^7.24.7",
         
     | 
| 1546 | 
         
            -
                    "@babel/helper-function-name": "^7.24.7",
         
     | 
| 1547 | 
         
             
                    "@babel/helper-plugin-utils": "^7.24.8",
         
     | 
| 1548 | 
         
            -
                    "@babel/helper-replace-supers": "^7. 
     | 
| 1549 | 
         
            -
                    "@babel/ 
     | 
| 1550 | 
         
             
                    "globals": "^11.1.0"
         
     | 
| 1551 | 
         
             
                  },
         
     | 
| 1552 | 
         
             
                  "engines": {
         
     | 
| 
         @@ -1568,18 +1516,6 @@ 
     | 
|
| 1568 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 1569 | 
         
             
                  }
         
     | 
| 1570 | 
         
             
                },
         
     | 
| 1571 | 
         
            -
                "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": {
         
     | 
| 1572 | 
         
            -
                  "version": "7.24.7",
         
     | 
| 1573 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
         
     | 
| 1574 | 
         
            -
                  "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
         
     | 
| 1575 | 
         
            -
                  "dev": true,
         
     | 
| 1576 | 
         
            -
                  "dependencies": {
         
     | 
| 1577 | 
         
            -
                    "@babel/types": "^7.24.7"
         
     | 
| 1578 | 
         
            -
                  },
         
     | 
| 1579 | 
         
            -
                  "engines": {
         
     | 
| 1580 | 
         
            -
                    "node": ">=6.9.0"
         
     | 
| 1581 | 
         
            -
                  }
         
     | 
| 1582 | 
         
            -
                },
         
     | 
| 1583 | 
         
             
                "node_modules/@babel/plugin-transform-computed-properties": {
         
     | 
| 1584 | 
         
             
                  "version": "7.24.7",
         
     | 
| 1585 | 
         
             
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
         
     | 
| 
         @@ -1707,14 +1643,14 @@ 
     | 
|
| 1707 | 
         
             
                  }
         
     | 
| 1708 | 
         
             
                },
         
     | 
| 1709 | 
         
             
                "node_modules/@babel/plugin-transform-function-name": {
         
     | 
| 1710 | 
         
            -
                  "version": "7. 
     | 
| 1711 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7. 
     | 
| 1712 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1713 | 
         
             
                  "dev": true,
         
     | 
| 1714 | 
         
             
                  "dependencies": {
         
     | 
| 1715 | 
         
            -
                    "@babel/helper-compilation-targets": "^7.24. 
     | 
| 1716 | 
         
            -
                    "@babel/helper- 
     | 
| 1717 | 
         
            -
                    "@babel/ 
     | 
| 1718 | 
         
             
                  },
         
     | 
| 1719 | 
         
             
                  "engines": {
         
     | 
| 1720 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -1740,12 +1676,12 @@ 
     | 
|
| 1740 | 
         
             
                  }
         
     | 
| 1741 | 
         
             
                },
         
     | 
| 1742 | 
         
             
                "node_modules/@babel/plugin-transform-literals": {
         
     | 
| 1743 | 
         
            -
                  "version": "7. 
     | 
| 1744 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7. 
     | 
| 1745 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1746 | 
         
             
                  "dev": true,
         
     | 
| 1747 | 
         
             
                  "dependencies": {
         
     | 
| 1748 | 
         
            -
                    "@babel/helper-plugin-utils": "^7.24. 
     | 
| 1749 | 
         
             
                  },
         
     | 
| 1750 | 
         
             
                  "engines": {
         
     | 
| 1751 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -1819,15 +1755,15 @@ 
     | 
|
| 1819 | 
         
             
                  }
         
     | 
| 1820 | 
         
             
                },
         
     | 
| 1821 | 
         
             
                "node_modules/@babel/plugin-transform-modules-systemjs": {
         
     | 
| 1822 | 
         
            -
                  "version": "7. 
     | 
| 1823 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7. 
     | 
| 1824 | 
         
            -
                  "integrity": "sha512- 
     | 
| 1825 | 
         
             
                  "dev": true,
         
     | 
| 1826 | 
         
             
                  "dependencies": {
         
     | 
| 1827 | 
         
            -
                    "@babel/helper- 
     | 
| 1828 | 
         
            -
                    "@babel/helper- 
     | 
| 1829 | 
         
            -
                    "@babel/helper- 
     | 
| 1830 | 
         
            -
                    "@babel/ 
     | 
| 1831 | 
         
             
                  },
         
     | 
| 1832 | 
         
             
                  "engines": {
         
     | 
| 1833 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         @@ -2393,33 +2329,30 @@ 
     | 
|
| 2393 | 
         
             
                  }
         
     | 
| 2394 | 
         
             
                },
         
     | 
| 2395 | 
         
             
                "node_modules/@babel/template": {
         
     | 
| 2396 | 
         
            -
                  "version": "7. 
     | 
| 2397 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/template/-/template-7. 
     | 
| 2398 | 
         
            -
                  "integrity": "sha512- 
     | 
| 2399 | 
         
             
                  "dev": true,
         
     | 
| 2400 | 
         
             
                  "dependencies": {
         
     | 
| 2401 | 
         
             
                    "@babel/code-frame": "^7.24.7",
         
     | 
| 2402 | 
         
            -
                    "@babel/parser": "^7. 
     | 
| 2403 | 
         
            -
                    "@babel/types": "^7. 
     | 
| 2404 | 
         
             
                  },
         
     | 
| 2405 | 
         
             
                  "engines": {
         
     | 
| 2406 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 2407 | 
         
             
                  }
         
     | 
| 2408 | 
         
             
                },
         
     | 
| 2409 | 
         
             
                "node_modules/@babel/traverse": {
         
     | 
| 2410 | 
         
            -
                  "version": "7. 
     | 
| 2411 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7. 
     | 
| 2412 | 
         
            -
                  "integrity": "sha512- 
     | 
| 2413 | 
         
             
                  "dev": true,
         
     | 
| 2414 | 
         
             
                  "dependencies": {
         
     | 
| 2415 | 
         
             
                    "@babel/code-frame": "^7.24.7",
         
     | 
| 2416 | 
         
            -
                    "@babel/generator": "^7. 
     | 
| 2417 | 
         
            -
                    "@babel/ 
     | 
| 2418 | 
         
            -
                    "@babel/ 
     | 
| 2419 | 
         
            -
                    "@babel/ 
     | 
| 2420 | 
         
            -
                    "@babel/helper-split-export-declaration": "^7.24.7",
         
     | 
| 2421 | 
         
            -
                    "@babel/parser": "^7.24.8",
         
     | 
| 2422 | 
         
            -
                    "@babel/types": "^7.24.8",
         
     | 
| 2423 | 
         
             
                    "debug": "^4.3.1",
         
     | 
| 2424 | 
         
             
                    "globals": "^11.1.0"
         
     | 
| 2425 | 
         
             
                  },
         
     | 
| 
         @@ -2428,12 +2361,12 @@ 
     | 
|
| 2428 | 
         
             
                  }
         
     | 
| 2429 | 
         
             
                },
         
     | 
| 2430 | 
         
             
                "node_modules/@babel/traverse/node_modules/@babel/generator": {
         
     | 
| 2431 | 
         
            -
                  "version": "7. 
     | 
| 2432 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7. 
     | 
| 2433 | 
         
            -
                  "integrity": "sha512- 
     | 
| 2434 | 
         
             
                  "dev": true,
         
     | 
| 2435 | 
         
             
                  "dependencies": {
         
     | 
| 2436 | 
         
            -
                    "@babel/types": "^7. 
     | 
| 2437 | 
         
             
                    "@jridgewell/gen-mapping": "^0.3.5",
         
     | 
| 2438 | 
         
             
                    "@jridgewell/trace-mapping": "^0.3.25",
         
     | 
| 2439 | 
         
             
                    "jsesc": "^2.5.1"
         
     | 
| 
         @@ -2442,22 +2375,10 @@ 
     | 
|
| 2442 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 2443 | 
         
             
                  }
         
     | 
| 2444 | 
         
             
                },
         
     | 
| 2445 | 
         
            -
                "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": {
         
     | 
| 2446 | 
         
            -
                  "version": "7.24.7",
         
     | 
| 2447 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
         
     | 
| 2448 | 
         
            -
                  "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
         
     | 
| 2449 | 
         
            -
                  "dev": true,
         
     | 
| 2450 | 
         
            -
                  "dependencies": {
         
     | 
| 2451 | 
         
            -
                    "@babel/types": "^7.24.7"
         
     | 
| 2452 | 
         
            -
                  },
         
     | 
| 2453 | 
         
            -
                  "engines": {
         
     | 
| 2454 | 
         
            -
                    "node": ">=6.9.0"
         
     | 
| 2455 | 
         
            -
                  }
         
     | 
| 2456 | 
         
            -
                },
         
     | 
| 2457 | 
         
             
                "node_modules/@babel/types": {
         
     | 
| 2458 | 
         
            -
                  "version": "7. 
     | 
| 2459 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@babel/types/-/types-7. 
     | 
| 2460 | 
         
            -
                  "integrity": "sha512- 
     | 
| 2461 | 
         
             
                  "dev": true,
         
     | 
| 2462 | 
         
             
                  "dependencies": {
         
     | 
| 2463 | 
         
             
                    "@babel/helper-string-parser": "^7.24.8",
         
     | 
| 
         @@ -4148,9 +4069,9 @@ 
     | 
|
| 4148 | 
         
             
                  }
         
     | 
| 4149 | 
         
             
                },
         
     | 
| 4150 | 
         
             
                "node_modules/@rollup/rollup-android-arm-eabi": {
         
     | 
| 4151 | 
         
            -
                  "version": "4. 
     | 
| 4152 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4. 
     | 
| 4153 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4154 | 
         
             
                  "cpu": [
         
     | 
| 4155 | 
         
             
                    "arm"
         
     | 
| 4156 | 
         
             
                  ],
         
     | 
| 
         @@ -4161,9 +4082,9 @@ 
     | 
|
| 4161 | 
         
             
                  ]
         
     | 
| 4162 | 
         
             
                },
         
     | 
| 4163 | 
         
             
                "node_modules/@rollup/rollup-android-arm64": {
         
     | 
| 4164 | 
         
            -
                  "version": "4. 
     | 
| 4165 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4. 
     | 
| 4166 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4167 | 
         
             
                  "cpu": [
         
     | 
| 4168 | 
         
             
                    "arm64"
         
     | 
| 4169 | 
         
             
                  ],
         
     | 
| 
         @@ -4174,9 +4095,9 @@ 
     | 
|
| 4174 | 
         
             
                  ]
         
     | 
| 4175 | 
         
             
                },
         
     | 
| 4176 | 
         
             
                "node_modules/@rollup/rollup-darwin-arm64": {
         
     | 
| 4177 | 
         
            -
                  "version": "4. 
     | 
| 4178 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4. 
     | 
| 4179 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4180 | 
         
             
                  "cpu": [
         
     | 
| 4181 | 
         
             
                    "arm64"
         
     | 
| 4182 | 
         
             
                  ],
         
     | 
| 
         @@ -4187,9 +4108,9 @@ 
     | 
|
| 4187 | 
         
             
                  ]
         
     | 
| 4188 | 
         
             
                },
         
     | 
| 4189 | 
         
             
                "node_modules/@rollup/rollup-darwin-x64": {
         
     | 
| 4190 | 
         
            -
                  "version": "4. 
     | 
| 4191 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4. 
     | 
| 4192 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4193 | 
         
             
                  "cpu": [
         
     | 
| 4194 | 
         
             
                    "x64"
         
     | 
| 4195 | 
         
             
                  ],
         
     | 
| 
         @@ -4200,9 +4121,9 @@ 
     | 
|
| 4200 | 
         
             
                  ]
         
     | 
| 4201 | 
         
             
                },
         
     | 
| 4202 | 
         
             
                "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
         
     | 
| 4203 | 
         
            -
                  "version": "4. 
     | 
| 4204 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4. 
     | 
| 4205 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4206 | 
         
             
                  "cpu": [
         
     | 
| 4207 | 
         
             
                    "arm"
         
     | 
| 4208 | 
         
             
                  ],
         
     | 
| 
         @@ -4213,9 +4134,9 @@ 
     | 
|
| 4213 | 
         
             
                  ]
         
     | 
| 4214 | 
         
             
                },
         
     | 
| 4215 | 
         
             
                "node_modules/@rollup/rollup-linux-arm-musleabihf": {
         
     | 
| 4216 | 
         
            -
                  "version": "4. 
     | 
| 4217 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4. 
     | 
| 4218 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4219 | 
         
             
                  "cpu": [
         
     | 
| 4220 | 
         
             
                    "arm"
         
     | 
| 4221 | 
         
             
                  ],
         
     | 
| 
         @@ -4226,9 +4147,9 @@ 
     | 
|
| 4226 | 
         
             
                  ]
         
     | 
| 4227 | 
         
             
                },
         
     | 
| 4228 | 
         
             
                "node_modules/@rollup/rollup-linux-arm64-gnu": {
         
     | 
| 4229 | 
         
            -
                  "version": "4. 
     | 
| 4230 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4. 
     | 
| 4231 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4232 | 
         
             
                  "cpu": [
         
     | 
| 4233 | 
         
             
                    "arm64"
         
     | 
| 4234 | 
         
             
                  ],
         
     | 
| 
         @@ -4239,9 +4160,9 @@ 
     | 
|
| 4239 | 
         
             
                  ]
         
     | 
| 4240 | 
         
             
                },
         
     | 
| 4241 | 
         
             
                "node_modules/@rollup/rollup-linux-arm64-musl": {
         
     | 
| 4242 | 
         
            -
                  "version": "4. 
     | 
| 4243 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4. 
     | 
| 4244 | 
         
            -
                  "integrity": "sha512 
     | 
| 4245 | 
         
             
                  "cpu": [
         
     | 
| 4246 | 
         
             
                    "arm64"
         
     | 
| 4247 | 
         
             
                  ],
         
     | 
| 
         @@ -4252,9 +4173,9 @@ 
     | 
|
| 4252 | 
         
             
                  ]
         
     | 
| 4253 | 
         
             
                },
         
     | 
| 4254 | 
         
             
                "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
         
     | 
| 4255 | 
         
            -
                  "version": "4. 
     | 
| 4256 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4. 
     | 
| 4257 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4258 | 
         
             
                  "cpu": [
         
     | 
| 4259 | 
         
             
                    "ppc64"
         
     | 
| 4260 | 
         
             
                  ],
         
     | 
| 
         @@ -4265,9 +4186,9 @@ 
     | 
|
| 4265 | 
         
             
                  ]
         
     | 
| 4266 | 
         
             
                },
         
     | 
| 4267 | 
         
             
                "node_modules/@rollup/rollup-linux-riscv64-gnu": {
         
     | 
| 4268 | 
         
            -
                  "version": "4. 
     | 
| 4269 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4. 
     | 
| 4270 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4271 | 
         
             
                  "cpu": [
         
     | 
| 4272 | 
         
             
                    "riscv64"
         
     | 
| 4273 | 
         
             
                  ],
         
     | 
| 
         @@ -4278,9 +4199,9 @@ 
     | 
|
| 4278 | 
         
             
                  ]
         
     | 
| 4279 | 
         
             
                },
         
     | 
| 4280 | 
         
             
                "node_modules/@rollup/rollup-linux-s390x-gnu": {
         
     | 
| 4281 | 
         
            -
                  "version": "4. 
     | 
| 4282 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4. 
     | 
| 4283 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4284 | 
         
             
                  "cpu": [
         
     | 
| 4285 | 
         
             
                    "s390x"
         
     | 
| 4286 | 
         
             
                  ],
         
     | 
| 
         @@ -4291,9 +4212,9 @@ 
     | 
|
| 4291 | 
         
             
                  ]
         
     | 
| 4292 | 
         
             
                },
         
     | 
| 4293 | 
         
             
                "node_modules/@rollup/rollup-linux-x64-gnu": {
         
     | 
| 4294 | 
         
            -
                  "version": "4. 
     | 
| 4295 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4. 
     | 
| 4296 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4297 | 
         
             
                  "cpu": [
         
     | 
| 4298 | 
         
             
                    "x64"
         
     | 
| 4299 | 
         
             
                  ],
         
     | 
| 
         @@ -4304,9 +4225,9 @@ 
     | 
|
| 4304 | 
         
             
                  ]
         
     | 
| 4305 | 
         
             
                },
         
     | 
| 4306 | 
         
             
                "node_modules/@rollup/rollup-linux-x64-musl": {
         
     | 
| 4307 | 
         
            -
                  "version": "4. 
     | 
| 4308 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4. 
     | 
| 4309 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4310 | 
         
             
                  "cpu": [
         
     | 
| 4311 | 
         
             
                    "x64"
         
     | 
| 4312 | 
         
             
                  ],
         
     | 
| 
         @@ -4317,9 +4238,9 @@ 
     | 
|
| 4317 | 
         
             
                  ]
         
     | 
| 4318 | 
         
             
                },
         
     | 
| 4319 | 
         
             
                "node_modules/@rollup/rollup-win32-arm64-msvc": {
         
     | 
| 4320 | 
         
            -
                  "version": "4. 
     | 
| 4321 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4. 
     | 
| 4322 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4323 | 
         
             
                  "cpu": [
         
     | 
| 4324 | 
         
             
                    "arm64"
         
     | 
| 4325 | 
         
             
                  ],
         
     | 
| 
         @@ -4330,9 +4251,9 @@ 
     | 
|
| 4330 | 
         
             
                  ]
         
     | 
| 4331 | 
         
             
                },
         
     | 
| 4332 | 
         
             
                "node_modules/@rollup/rollup-win32-ia32-msvc": {
         
     | 
| 4333 | 
         
            -
                  "version": "4. 
     | 
| 4334 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4. 
     | 
| 4335 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4336 | 
         
             
                  "cpu": [
         
     | 
| 4337 | 
         
             
                    "ia32"
         
     | 
| 4338 | 
         
             
                  ],
         
     | 
| 
         @@ -4343,9 +4264,9 @@ 
     | 
|
| 4343 | 
         
             
                  ]
         
     | 
| 4344 | 
         
             
                },
         
     | 
| 4345 | 
         
             
                "node_modules/@rollup/rollup-win32-x64-msvc": {
         
     | 
| 4346 | 
         
            -
                  "version": "4. 
     | 
| 4347 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4. 
     | 
| 4348 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4349 | 
         
             
                  "cpu": [
         
     | 
| 4350 | 
         
             
                    "x64"
         
     | 
| 4351 | 
         
             
                  ],
         
     | 
| 
         @@ -4560,9 +4481,9 @@ 
     | 
|
| 4560 | 
         
             
                  }
         
     | 
| 4561 | 
         
             
                },
         
     | 
| 4562 | 
         
             
                "node_modules/@types/eslint": {
         
     | 
| 4563 | 
         
            -
                  "version": " 
     | 
| 4564 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint- 
     | 
| 4565 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4566 | 
         
             
                  "dev": true,
         
     | 
| 4567 | 
         
             
                  "dependencies": {
         
     | 
| 4568 | 
         
             
                    "@types/estree": "*",
         
     | 
| 
         @@ -4616,9 +4537,9 @@ 
     | 
|
| 4616 | 
         
             
                  "dev": true
         
     | 
| 4617 | 
         
             
                },
         
     | 
| 4618 | 
         
             
                "node_modules/@types/http-proxy": {
         
     | 
| 4619 | 
         
            -
                  "version": "1.17. 
     | 
| 4620 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17. 
     | 
| 4621 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4622 | 
         
             
                  "dev": true,
         
     | 
| 4623 | 
         
             
                  "dependencies": {
         
     | 
| 4624 | 
         
             
                    "@types/node": "*"
         
     | 
| 
         @@ -4643,12 +4564,12 @@ 
     | 
|
| 4643 | 
         
             
                  "dev": true
         
     | 
| 4644 | 
         
             
                },
         
     | 
| 4645 | 
         
             
                "node_modules/@types/node": {
         
     | 
| 4646 | 
         
            -
                  "version": " 
     | 
| 4647 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@types/node/-/node- 
     | 
| 4648 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4649 | 
         
             
                  "dev": true,
         
     | 
| 4650 | 
         
             
                  "dependencies": {
         
     | 
| 4651 | 
         
            -
                    "undici-types": "~ 
     | 
| 4652 | 
         
             
                  }
         
     | 
| 4653 | 
         
             
                },
         
     | 
| 4654 | 
         
             
                "node_modules/@types/node-forge": {
         
     | 
| 
         @@ -4718,9 +4639,9 @@ 
     | 
|
| 4718 | 
         
             
                  }
         
     | 
| 4719 | 
         
             
                },
         
     | 
| 4720 | 
         
             
                "node_modules/@types/ws": {
         
     | 
| 4721 | 
         
            -
                  "version": "8.5. 
     | 
| 4722 | 
         
            -
                  "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5. 
     | 
| 4723 | 
         
            -
                  "integrity": "sha512- 
     | 
| 4724 | 
         
             
                  "dev": true,
         
     | 
| 4725 | 
         
             
                  "dependencies": {
         
     | 
| 4726 | 
         
             
                    "@types/node": "*"
         
     | 
| 
         @@ -5440,9 +5361,9 @@ 
     | 
|
| 5440 | 
         
             
                  }
         
     | 
| 5441 | 
         
             
                },
         
     | 
| 5442 | 
         
             
                "node_modules/browserslist": {
         
     | 
| 5443 | 
         
            -
                  "version": "4.23. 
     | 
| 5444 | 
         
            -
                  "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23. 
     | 
| 5445 | 
         
            -
                  "integrity": "sha512- 
     | 
| 5446 | 
         
             
                  "dev": true,
         
     | 
| 5447 | 
         
             
                  "funding": [
         
     | 
| 5448 | 
         
             
                    {
         
     | 
| 
         @@ -5459,9 +5380,9 @@ 
     | 
|
| 5459 | 
         
             
                    }
         
     | 
| 5460 | 
         
             
                  ],
         
     | 
| 5461 | 
         
             
                  "dependencies": {
         
     | 
| 5462 | 
         
            -
                    "caniuse-lite": "^1.0. 
     | 
| 5463 | 
         
            -
                    "electron-to-chromium": "^1.4 
     | 
| 5464 | 
         
            -
                    "node-releases": "^2.0. 
     | 
| 5465 | 
         
             
                    "update-browserslist-db": "^1.1.0"
         
     | 
| 5466 | 
         
             
                  },
         
     | 
| 5467 | 
         
             
                  "bin": {
         
     | 
| 
         @@ -5621,9 +5542,9 @@ 
     | 
|
| 5621 | 
         
             
                  }
         
     | 
| 5622 | 
         
             
                },
         
     | 
| 5623 | 
         
             
                "node_modules/caniuse-lite": {
         
     | 
| 5624 | 
         
            -
                  "version": "1.0. 
     | 
| 5625 | 
         
            -
                  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0. 
     | 
| 5626 | 
         
            -
                  "integrity": "sha512- 
     | 
| 5627 | 
         
             
                  "dev": true,
         
     | 
| 5628 | 
         
             
                  "funding": [
         
     | 
| 5629 | 
         
             
                    {
         
     | 
| 
         @@ -6060,12 +5981,12 @@ 
     | 
|
| 6060 | 
         
             
                  }
         
     | 
| 6061 | 
         
             
                },
         
     | 
| 6062 | 
         
             
                "node_modules/core-js-compat": {
         
     | 
| 6063 | 
         
            -
                  "version": "3. 
     | 
| 6064 | 
         
            -
                  "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3. 
     | 
| 6065 | 
         
            -
                  "integrity": "sha512- 
     | 
| 6066 | 
         
             
                  "dev": true,
         
     | 
| 6067 | 
         
             
                  "dependencies": {
         
     | 
| 6068 | 
         
            -
                    "browserslist": "^4.23. 
     | 
| 6069 | 
         
             
                  },
         
     | 
| 6070 | 
         
             
                  "funding": {
         
     | 
| 6071 | 
         
             
                    "type": "opencollective",
         
     | 
| 
         @@ -6340,9 +6261,9 @@ 
     | 
|
| 6340 | 
         
             
                  }
         
     | 
| 6341 | 
         
             
                },
         
     | 
| 6342 | 
         
             
                "node_modules/debug": {
         
     | 
| 6343 | 
         
            -
                  "version": "4.3. 
     | 
| 6344 | 
         
            -
                  "resolved": "https://registry.npmjs.org/debug/-/debug-4.3. 
     | 
| 6345 | 
         
            -
                  "integrity": "sha512- 
     | 
| 6346 | 
         
             
                  "dev": true,
         
     | 
| 6347 | 
         
             
                  "dependencies": {
         
     | 
| 6348 | 
         
             
                    "ms": "2.1.2"
         
     | 
| 
         @@ -6541,9 +6462,9 @@ 
     | 
|
| 6541 | 
         
             
                  "dev": true
         
     | 
| 6542 | 
         
             
                },
         
     | 
| 6543 | 
         
             
                "node_modules/electron-to-chromium": {
         
     | 
| 6544 | 
         
            -
                  "version": "1. 
     | 
| 6545 | 
         
            -
                  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1. 
     | 
| 6546 | 
         
            -
                  "integrity": "sha512- 
     | 
| 6547 | 
         
             
                  "dev": true
         
     | 
| 6548 | 
         
             
                },
         
     | 
| 6549 | 
         
             
                "node_modules/emoji-regex": {
         
     | 
| 
         @@ -6624,9 +6545,9 @@ 
     | 
|
| 6624 | 
         
             
                  }
         
     | 
| 6625 | 
         
             
                },
         
     | 
| 6626 | 
         
             
                "node_modules/enhanced-resolve": {
         
     | 
| 6627 | 
         
            -
                  "version": "5.17. 
     | 
| 6628 | 
         
            -
                  "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17. 
     | 
| 6629 | 
         
            -
                  "integrity": "sha512- 
     | 
| 6630 | 
         
             
                  "dev": true,
         
     | 
| 6631 | 
         
             
                  "dependencies": {
         
     | 
| 6632 | 
         
             
                    "graceful-fs": "^4.2.4",
         
     | 
| 
         @@ -7216,9 +7137,9 @@ 
     | 
|
| 7216 | 
         
             
                  }
         
     | 
| 7217 | 
         
             
                },
         
     | 
| 7218 | 
         
             
                "node_modules/foreground-child": {
         
     | 
| 7219 | 
         
            -
                  "version": "3. 
     | 
| 7220 | 
         
            -
                  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3. 
     | 
| 7221 | 
         
            -
                  "integrity": "sha512- 
     | 
| 7222 | 
         
             
                  "dev": true,
         
     | 
| 7223 | 
         
             
                  "dependencies": {
         
     | 
| 7224 | 
         
             
                    "cross-spawn": "^7.0.0",
         
     | 
| 
         @@ -7861,9 +7782,9 @@ 
     | 
|
| 7861 | 
         
             
                  }
         
     | 
| 7862 | 
         
             
                },
         
     | 
| 7863 | 
         
             
                "node_modules/immutable": {
         
     | 
| 7864 | 
         
            -
                  "version": "4.3. 
     | 
| 7865 | 
         
            -
                  "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3. 
     | 
| 7866 | 
         
            -
                  "integrity": "sha512- 
     | 
| 7867 | 
         
             
                  "dev": true
         
     | 
| 7868 | 
         
             
                },
         
     | 
| 7869 | 
         
             
                "node_modules/import-fresh": {
         
     | 
| 
         @@ -8020,9 +7941,9 @@ 
     | 
|
| 8020 | 
         
             
                  }
         
     | 
| 8021 | 
         
             
                },
         
     | 
| 8022 | 
         
             
                "node_modules/is-core-module": {
         
     | 
| 8023 | 
         
            -
                  "version": "2. 
     | 
| 8024 | 
         
            -
                  "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2. 
     | 
| 8025 | 
         
            -
                  "integrity": "sha512- 
     | 
| 8026 | 
         
             
                  "dev": true,
         
     | 
| 8027 | 
         
             
                  "dependencies": {
         
     | 
| 8028 | 
         
             
                    "hasown": "^2.0.2"
         
     | 
| 
         @@ -8464,9 +8385,9 @@ 
     | 
|
| 8464 | 
         
             
                  ]
         
     | 
| 8465 | 
         
             
                },
         
     | 
| 8466 | 
         
             
                "node_modules/karma": {
         
     | 
| 8467 | 
         
            -
                  "version": "6.4. 
     | 
| 8468 | 
         
            -
                  "resolved": "https://registry.npmjs.org/karma/-/karma-6.4. 
     | 
| 8469 | 
         
            -
                  "integrity": "sha512- 
     | 
| 8470 | 
         
             
                  "dev": true,
         
     | 
| 8471 | 
         
             
                  "dependencies": {
         
     | 
| 8472 | 
         
             
                    "@colors/colors": "1.5.0",
         
     | 
| 
         @@ -8693,9 +8614,9 @@ 
     | 
|
| 8693 | 
         
             
                  }
         
     | 
| 8694 | 
         
             
                },
         
     | 
| 8695 | 
         
             
                "node_modules/launch-editor": {
         
     | 
| 8696 | 
         
            -
                  "version": "2.8. 
     | 
| 8697 | 
         
            -
                  "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8. 
     | 
| 8698 | 
         
            -
                  "integrity": "sha512- 
     | 
| 8699 | 
         
             
                  "dev": true,
         
     | 
| 8700 | 
         
             
                  "dependencies": {
         
     | 
| 8701 | 
         
             
                    "picocolors": "^1.0.0",
         
     | 
| 
         @@ -9264,9 +9185,9 @@ 
     | 
|
| 9264 | 
         
             
                  "dev": true
         
     | 
| 9265 | 
         
             
                },
         
     | 
| 9266 | 
         
             
                "node_modules/minipass-json-stream": {
         
     | 
| 9267 | 
         
            -
                  "version": "1.0. 
     | 
| 9268 | 
         
            -
                  "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0. 
     | 
| 9269 | 
         
            -
                  "integrity": "sha512- 
     | 
| 9270 | 
         
             
                  "dev": true,
         
     | 
| 9271 | 
         
             
                  "dependencies": {
         
     | 
| 9272 | 
         
             
                    "jsonparse": "^1.3.1",
         
     | 
| 
         @@ -9639,9 +9560,9 @@ 
     | 
|
| 9639 | 
         
             
                  }
         
     | 
| 9640 | 
         
             
                },
         
     | 
| 9641 | 
         
             
                "node_modules/node-releases": {
         
     | 
| 9642 | 
         
            -
                  "version": "2.0. 
     | 
| 9643 | 
         
            -
                  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0. 
     | 
| 9644 | 
         
            -
                  "integrity": "sha512- 
     | 
| 9645 | 
         
             
                  "dev": true
         
     | 
| 9646 | 
         
             
                },
         
     | 
| 9647 | 
         
             
                "node_modules/nopt": {
         
     | 
| 
         @@ -11031,9 +10952,9 @@ 
     | 
|
| 11031 | 
         
             
                  }
         
     | 
| 11032 | 
         
             
                },
         
     | 
| 11033 | 
         
             
                "node_modules/rollup": {
         
     | 
| 11034 | 
         
            -
                  "version": "4. 
     | 
| 11035 | 
         
            -
                  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4. 
     | 
| 11036 | 
         
            -
                  "integrity": "sha512- 
     | 
| 11037 | 
         
             
                  "dev": true,
         
     | 
| 11038 | 
         
             
                  "dependencies": {
         
     | 
| 11039 | 
         
             
                    "@types/estree": "1.0.5"
         
     | 
| 
         @@ -11046,22 +10967,22 @@ 
     | 
|
| 11046 | 
         
             
                    "npm": ">=8.0.0"
         
     | 
| 11047 | 
         
             
                  },
         
     | 
| 11048 | 
         
             
                  "optionalDependencies": {
         
     | 
| 11049 | 
         
            -
                    "@rollup/rollup-android-arm-eabi": "4. 
     | 
| 11050 | 
         
            -
                    "@rollup/rollup-android-arm64": "4. 
     | 
| 11051 | 
         
            -
                    "@rollup/rollup-darwin-arm64": "4. 
     | 
| 11052 | 
         
            -
                    "@rollup/rollup-darwin-x64": "4. 
     | 
| 11053 | 
         
            -
                    "@rollup/rollup-linux-arm-gnueabihf": "4. 
     | 
| 11054 | 
         
            -
                    "@rollup/rollup-linux-arm-musleabihf": "4. 
     | 
| 11055 | 
         
            -
                    "@rollup/rollup-linux-arm64-gnu": "4. 
     | 
| 11056 | 
         
            -
                    "@rollup/rollup-linux-arm64-musl": "4. 
     | 
| 11057 | 
         
            -
                    "@rollup/rollup-linux-powerpc64le-gnu": "4. 
     | 
| 11058 | 
         
            -
                    "@rollup/rollup-linux-riscv64-gnu": "4. 
     | 
| 11059 | 
         
            -
                    "@rollup/rollup-linux-s390x-gnu": "4. 
     | 
| 11060 | 
         
            -
                    "@rollup/rollup-linux-x64-gnu": "4. 
     | 
| 11061 | 
         
            -
                    "@rollup/rollup-linux-x64-musl": "4. 
     | 
| 11062 | 
         
            -
                    "@rollup/rollup-win32-arm64-msvc": "4. 
     | 
| 11063 | 
         
            -
                    "@rollup/rollup-win32-ia32-msvc": "4. 
     | 
| 11064 | 
         
            -
                    "@rollup/rollup-win32-x64-msvc": "4. 
     | 
| 11065 | 
         
             
                    "fsevents": "~2.3.2"
         
     | 
| 11066 | 
         
             
                  }
         
     | 
| 11067 | 
         
             
                },
         
     | 
| 
         @@ -12265,9 +12186,9 @@ 
     | 
|
| 12265 | 
         
             
                  }
         
     | 
| 12266 | 
         
             
                },
         
     | 
| 12267 | 
         
             
                "node_modules/undici-types": {
         
     | 
| 12268 | 
         
            -
                  "version": " 
     | 
| 12269 | 
         
            -
                  "resolved": "https://registry.npmjs.org/undici-types/-/undici-types- 
     | 
| 12270 | 
         
            -
                  "integrity": "sha512- 
     | 
| 12271 | 
         
             
                  "dev": true
         
     | 
| 12272 | 
         
             
                },
         
     | 
| 12273 | 
         
             
                "node_modules/unicode-canonical-property-names-ecmascript": {
         
     | 
| 
         @@ -13430,9 +13351,9 @@ 
     | 
|
| 13430 | 
         
             
                  }
         
     | 
| 13431 | 
         
             
                },
         
     | 
| 13432 | 
         
             
                "node_modules/zone.js": {
         
     | 
| 13433 | 
         
            -
                  "version": "0.14. 
     | 
| 13434 | 
         
            -
                  "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14. 
     | 
| 13435 | 
         
            -
                  "integrity": "sha512- 
     | 
| 13436 | 
         
             
                }
         
     | 
| 13437 | 
         
             
              }
         
     | 
| 13438 | 
         
             
            }
         
     | 
| 
         | 
|
| 266 | 
         
             
                  }
         
     | 
| 267 | 
         
             
                },
         
     | 
| 268 | 
         
             
                "node_modules/@angular/animations": {
         
     | 
| 269 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 270 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.12.tgz",
         
     | 
| 271 | 
         
            +
                  "integrity": "sha512-9hsdWF4gRRcVJtPcCcYLaX1CIyM9wUu6r+xRl6zU5hq8qhl35hig6ounz7CXFAzLf0WDBdM16bPHouVGaG76lg==",
         
     | 
| 272 | 
         
             
                  "dependencies": {
         
     | 
| 273 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 274 | 
         
             
                  },
         
     | 
| 
         | 
|
| 276 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 277 | 
         
             
                  },
         
     | 
| 278 | 
         
             
                  "peerDependencies": {
         
     | 
| 279 | 
         
            +
                    "@angular/core": "17.3.12"
         
     | 
| 280 | 
         
             
                  }
         
     | 
| 281 | 
         
             
                },
         
     | 
| 282 | 
         
             
                "node_modules/@angular/cdk": {
         
     | 
| 
         | 
|
| 330 | 
         
             
                  }
         
     | 
| 331 | 
         
             
                },
         
     | 
| 332 | 
         
             
                "node_modules/@angular/common": {
         
     | 
| 333 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 334 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.12.tgz",
         
     | 
| 335 | 
         
            +
                  "integrity": "sha512-vabJzvrx76XXFrm1RJZ6o/CyG32piTB/1sfFfKHdlH1QrmArb8It4gyk9oEjZ1IkAD0HvBWlfWmn+T6Vx3pdUw==",
         
     | 
| 336 | 
         
             
                  "dependencies": {
         
     | 
| 337 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 338 | 
         
             
                  },
         
     | 
| 
         | 
|
| 340 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 341 | 
         
             
                  },
         
     | 
| 342 | 
         
             
                  "peerDependencies": {
         
     | 
| 343 | 
         
            +
                    "@angular/core": "17.3.12",
         
     | 
| 344 | 
         
             
                    "rxjs": "^6.5.3 || ^7.4.0"
         
     | 
| 345 | 
         
             
                  }
         
     | 
| 346 | 
         
             
                },
         
     | 
| 347 | 
         
             
                "node_modules/@angular/compiler": {
         
     | 
| 348 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 349 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.12.tgz",
         
     | 
| 350 | 
         
            +
                  "integrity": "sha512-vwI8oOL/gM+wPnptOVeBbMfZYwzRxQsovojZf+Zol9szl0k3SZ3FycWlxxXZGFu3VIEfrP6pXplTmyODS/Lt1w==",
         
     | 
| 351 | 
         
             
                  "dependencies": {
         
     | 
| 352 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 353 | 
         
             
                  },
         
     | 
| 
         | 
|
| 355 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 356 | 
         
             
                  },
         
     | 
| 357 | 
         
             
                  "peerDependencies": {
         
     | 
| 358 | 
         
            +
                    "@angular/core": "17.3.12"
         
     | 
| 359 | 
         
             
                  },
         
     | 
| 360 | 
         
             
                  "peerDependenciesMeta": {
         
     | 
| 361 | 
         
             
                    "@angular/core": {
         
     | 
| 
         | 
|
| 364 | 
         
             
                  }
         
     | 
| 365 | 
         
             
                },
         
     | 
| 366 | 
         
             
                "node_modules/@angular/compiler-cli": {
         
     | 
| 367 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 368 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.12.tgz",
         
     | 
| 369 | 
         
            +
                  "integrity": "sha512-1F8M7nWfChzurb7obbvuE7mJXlHtY1UG58pcwcomVtpPb+kPavgAO8OEvJHYBMV+bzSxkXt5UIwL9lt9jHUxZA==",
         
     | 
| 370 | 
         
             
                  "dev": true,
         
     | 
| 371 | 
         
             
                  "dependencies": {
         
     | 
| 372 | 
         
             
                    "@babel/core": "7.23.9",
         
     | 
| 
         | 
|
| 387 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 388 | 
         
             
                  },
         
     | 
| 389 | 
         
             
                  "peerDependencies": {
         
     | 
| 390 | 
         
            +
                    "@angular/compiler": "17.3.12",
         
     | 
| 391 | 
         
             
                    "typescript": ">=5.2 <5.5"
         
     | 
| 392 | 
         
             
                  }
         
     | 
| 393 | 
         
             
                },
         
     | 
| 
         | 
|
| 437 | 
         
             
                  }
         
     | 
| 438 | 
         
             
                },
         
     | 
| 439 | 
         
             
                "node_modules/@angular/core": {
         
     | 
| 440 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 441 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.12.tgz",
         
     | 
| 442 | 
         
            +
                  "integrity": "sha512-MuFt5yKi161JmauUta4Dh0m8ofwoq6Ino+KoOtkYMBGsSx+A7dSm+DUxxNwdj7+DNyg3LjVGCFgBFnq4g8z06A==",
         
     | 
| 443 | 
         
             
                  "dependencies": {
         
     | 
| 444 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 445 | 
         
             
                  },
         
     | 
| 
         | 
|
| 468 | 
         
             
                  }
         
     | 
| 469 | 
         
             
                },
         
     | 
| 470 | 
         
             
                "node_modules/@angular/forms": {
         
     | 
| 471 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 472 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.12.tgz",
         
     | 
| 473 | 
         
            +
                  "integrity": "sha512-tV6r12Q3yEUlXwpVko4E+XscunTIpPkLbaiDn/MTL3Vxi2LZnsLgHyd/i38HaHN+e/H3B0a1ToSOhV5wf3ay4Q==",
         
     | 
| 474 | 
         
             
                  "dependencies": {
         
     | 
| 475 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 476 | 
         
             
                  },
         
     | 
| 
         | 
|
| 478 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 479 | 
         
             
                  },
         
     | 
| 480 | 
         
             
                  "peerDependencies": {
         
     | 
| 481 | 
         
            +
                    "@angular/common": "17.3.12",
         
     | 
| 482 | 
         
            +
                    "@angular/core": "17.3.12",
         
     | 
| 483 | 
         
            +
                    "@angular/platform-browser": "17.3.12",
         
     | 
| 484 | 
         
             
                    "rxjs": "^6.5.3 || ^7.4.0"
         
     | 
| 485 | 
         
             
                  }
         
     | 
| 486 | 
         
             
                },
         
     | 
| 
         | 
|
| 549 | 
         
             
                  }
         
     | 
| 550 | 
         
             
                },
         
     | 
| 551 | 
         
             
                "node_modules/@angular/platform-browser": {
         
     | 
| 552 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 553 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.12.tgz",
         
     | 
| 554 | 
         
            +
                  "integrity": "sha512-DYY04ptWh/ulMHzd+y52WCE8QnEYGeIiW3hEIFjCN8z0kbIdFdUtEB0IK5vjNL3ejyhUmphcpeT5PYf3YXtqWQ==",
         
     | 
| 555 | 
         
             
                  "dependencies": {
         
     | 
| 556 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 557 | 
         
             
                  },
         
     | 
| 
         | 
|
| 559 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 560 | 
         
             
                  },
         
     | 
| 561 | 
         
             
                  "peerDependencies": {
         
     | 
| 562 | 
         
            +
                    "@angular/animations": "17.3.12",
         
     | 
| 563 | 
         
            +
                    "@angular/common": "17.3.12",
         
     | 
| 564 | 
         
            +
                    "@angular/core": "17.3.12"
         
     | 
| 565 | 
         
             
                  },
         
     | 
| 566 | 
         
             
                  "peerDependenciesMeta": {
         
     | 
| 567 | 
         
             
                    "@angular/animations": {
         
     | 
| 
         | 
|
| 570 | 
         
             
                  }
         
     | 
| 571 | 
         
             
                },
         
     | 
| 572 | 
         
             
                "node_modules/@angular/platform-browser-dynamic": {
         
     | 
| 573 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 574 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.12.tgz",
         
     | 
| 575 | 
         
            +
                  "integrity": "sha512-DQwV7B2x/DRLRDSisngZRdLqHdYbbrqZv2Hmu4ZbnNYaWPC8qvzgE/0CvY+UkDat3nCcsfwsMnlDeB6TL7/IaA==",
         
     | 
| 576 | 
         
             
                  "dependencies": {
         
     | 
| 577 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 578 | 
         
             
                  },
         
     | 
| 
         | 
|
| 580 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 581 | 
         
             
                  },
         
     | 
| 582 | 
         
             
                  "peerDependencies": {
         
     | 
| 583 | 
         
            +
                    "@angular/common": "17.3.12",
         
     | 
| 584 | 
         
            +
                    "@angular/compiler": "17.3.12",
         
     | 
| 585 | 
         
            +
                    "@angular/core": "17.3.12",
         
     | 
| 586 | 
         
            +
                    "@angular/platform-browser": "17.3.12"
         
     | 
| 587 | 
         
             
                  }
         
     | 
| 588 | 
         
             
                },
         
     | 
| 589 | 
         
             
                "node_modules/@angular/router": {
         
     | 
| 590 | 
         
            +
                  "version": "17.3.12",
         
     | 
| 591 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.12.tgz",
         
     | 
| 592 | 
         
            +
                  "integrity": "sha512-dg7PHBSW9fmPKTVzwvHEeHZPZdpnUqW/U7kj8D29HTP9ur8zZnx9QcnbplwPeYb8yYa62JMnZSEel2X4PxdYBg==",
         
     | 
| 593 | 
         
             
                  "dependencies": {
         
     | 
| 594 | 
         
             
                    "tslib": "^2.3.0"
         
     | 
| 595 | 
         
             
                  },
         
     | 
| 
         | 
|
| 597 | 
         
             
                    "node": "^18.13.0 || >=20.9.0"
         
     | 
| 598 | 
         
             
                  },
         
     | 
| 599 | 
         
             
                  "peerDependencies": {
         
     | 
| 600 | 
         
            +
                    "@angular/common": "17.3.12",
         
     | 
| 601 | 
         
            +
                    "@angular/core": "17.3.12",
         
     | 
| 602 | 
         
            +
                    "@angular/platform-browser": "17.3.12",
         
     | 
| 603 | 
         
             
                    "rxjs": "^6.5.3 || ^7.4.0"
         
     | 
| 604 | 
         
             
                  }
         
     | 
| 605 | 
         
             
                },
         
     | 
| 
         | 
|
| 617 | 
         
             
                  }
         
     | 
| 618 | 
         
             
                },
         
     | 
| 619 | 
         
             
                "node_modules/@babel/compat-data": {
         
     | 
| 620 | 
         
            +
                  "version": "7.25.2",
         
     | 
| 621 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
         
     | 
| 622 | 
         
            +
                  "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
         
     | 
| 623 | 
         
             
                  "dev": true,
         
     | 
| 624 | 
         
             
                  "engines": {
         
     | 
| 625 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 711 | 
         
             
                  }
         
     | 
| 712 | 
         
             
                },
         
     | 
| 713 | 
         
             
                "node_modules/@babel/helper-compilation-targets": {
         
     | 
| 714 | 
         
            +
                  "version": "7.25.2",
         
     | 
| 715 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
         
     | 
| 716 | 
         
            +
                  "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
         
     | 
| 717 | 
         
             
                  "dev": true,
         
     | 
| 718 | 
         
             
                  "dependencies": {
         
     | 
| 719 | 
         
            +
                    "@babel/compat-data": "^7.25.2",
         
     | 
| 720 | 
         
             
                    "@babel/helper-validator-option": "^7.24.8",
         
     | 
| 721 | 
         
             
                    "browserslist": "^4.23.1",
         
     | 
| 722 | 
         
             
                    "lru-cache": "^5.1.1",
         
     | 
| 
         | 
|
| 736 | 
         
             
                  }
         
     | 
| 737 | 
         
             
                },
         
     | 
| 738 | 
         
             
                "node_modules/@babel/helper-create-class-features-plugin": {
         
     | 
| 739 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 740 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz",
         
     | 
| 741 | 
         
            +
                  "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==",
         
     | 
| 742 | 
         
             
                  "dev": true,
         
     | 
| 743 | 
         
             
                  "dependencies": {
         
     | 
| 744 | 
         
             
                    "@babel/helper-annotate-as-pure": "^7.24.7",
         
     | 
| 
         | 
|
| 
         | 
|
| 745 | 
         
             
                    "@babel/helper-member-expression-to-functions": "^7.24.8",
         
     | 
| 746 | 
         
             
                    "@babel/helper-optimise-call-expression": "^7.24.7",
         
     | 
| 747 | 
         
            +
                    "@babel/helper-replace-supers": "^7.25.0",
         
     | 
| 748 | 
         
             
                    "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
         
     | 
| 749 | 
         
            +
                    "@babel/traverse": "^7.25.0",
         
     | 
| 750 | 
         
             
                    "semver": "^6.3.1"
         
     | 
| 751 | 
         
             
                  },
         
     | 
| 752 | 
         
             
                  "engines": {
         
     | 
| 
         | 
|
| 768 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 769 | 
         
             
                  }
         
     | 
| 770 | 
         
             
                },
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 771 | 
         
             
                "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
         
     | 
| 772 | 
         
             
                  "version": "6.3.1",
         
     | 
| 773 | 
         
             
                  "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
         
     | 
| 
         | 
|
| 778 | 
         
             
                  }
         
     | 
| 779 | 
         
             
                },
         
     | 
| 780 | 
         
             
                "node_modules/@babel/helper-create-regexp-features-plugin": {
         
     | 
| 781 | 
         
            +
                  "version": "7.25.2",
         
     | 
| 782 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
         
     | 
| 783 | 
         
            +
                  "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
         
     | 
| 784 | 
         
             
                  "dev": true,
         
     | 
| 785 | 
         
             
                  "dependencies": {
         
     | 
| 786 | 
         
             
                    "@babel/helper-annotate-as-pure": "^7.24.7",
         
     | 
| 
         | 
|
| 843 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 844 | 
         
             
                  }
         
     | 
| 845 | 
         
             
                },
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 846 | 
         
             
                "node_modules/@babel/helper-member-expression-to-functions": {
         
     | 
| 847 | 
         
             
                  "version": "7.24.8",
         
     | 
| 848 | 
         
             
                  "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
         
     | 
| 
         | 
|
| 870 | 
         
             
                  }
         
     | 
| 871 | 
         
             
                },
         
     | 
| 872 | 
         
             
                "node_modules/@babel/helper-module-transforms": {
         
     | 
| 873 | 
         
            +
                  "version": "7.25.2",
         
     | 
| 874 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
         
     | 
| 875 | 
         
            +
                  "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
         
     | 
| 876 | 
         
             
                  "dev": true,
         
     | 
| 877 | 
         
             
                  "dependencies": {
         
     | 
| 
         | 
|
| 878 | 
         
             
                    "@babel/helper-module-imports": "^7.24.7",
         
     | 
| 879 | 
         
             
                    "@babel/helper-simple-access": "^7.24.7",
         
     | 
| 880 | 
         
            +
                    "@babel/helper-validator-identifier": "^7.24.7",
         
     | 
| 881 | 
         
            +
                    "@babel/traverse": "^7.25.2"
         
     | 
| 882 | 
         
             
                  },
         
     | 
| 883 | 
         
             
                  "engines": {
         
     | 
| 884 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 887 | 
         
             
                    "@babel/core": "^7.0.0"
         
     | 
| 888 | 
         
             
                  }
         
     | 
| 889 | 
         
             
                },
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 890 | 
         
             
                "node_modules/@babel/helper-optimise-call-expression": {
         
     | 
| 891 | 
         
             
                  "version": "7.24.7",
         
     | 
| 892 | 
         
             
                  "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
         
     | 
| 
         | 
|
| 909 | 
         
             
                  }
         
     | 
| 910 | 
         
             
                },
         
     | 
| 911 | 
         
             
                "node_modules/@babel/helper-remap-async-to-generator": {
         
     | 
| 912 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 913 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
         
     | 
| 914 | 
         
            +
                  "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
         
     | 
| 915 | 
         
             
                  "dev": true,
         
     | 
| 916 | 
         
             
                  "dependencies": {
         
     | 
| 917 | 
         
             
                    "@babel/helper-annotate-as-pure": "^7.24.7",
         
     | 
| 918 | 
         
            +
                    "@babel/helper-wrap-function": "^7.25.0",
         
     | 
| 919 | 
         
            +
                    "@babel/traverse": "^7.25.0"
         
     | 
| 920 | 
         
             
                  },
         
     | 
| 921 | 
         
             
                  "engines": {
         
     | 
| 922 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 938 | 
         
             
                  }
         
     | 
| 939 | 
         
             
                },
         
     | 
| 940 | 
         
             
                "node_modules/@babel/helper-replace-supers": {
         
     | 
| 941 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 942 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
         
     | 
| 943 | 
         
            +
                  "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
         
     | 
| 944 | 
         
             
                  "dev": true,
         
     | 
| 945 | 
         
             
                  "dependencies": {
         
     | 
| 946 | 
         
            +
                    "@babel/helper-member-expression-to-functions": "^7.24.8",
         
     | 
| 947 | 
         
            +
                    "@babel/helper-optimise-call-expression": "^7.24.7",
         
     | 
| 948 | 
         
            +
                    "@babel/traverse": "^7.25.0"
         
     | 
| 949 | 
         
             
                  },
         
     | 
| 950 | 
         
             
                  "engines": {
         
     | 
| 951 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 1020 | 
         
             
                  }
         
     | 
| 1021 | 
         
             
                },
         
     | 
| 1022 | 
         
             
                "node_modules/@babel/helper-wrap-function": {
         
     | 
| 1023 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 1024 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
         
     | 
| 1025 | 
         
            +
                  "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
         
     | 
| 1026 | 
         
             
                  "dev": true,
         
     | 
| 1027 | 
         
             
                  "dependencies": {
         
     | 
| 1028 | 
         
            +
                    "@babel/template": "^7.25.0",
         
     | 
| 1029 | 
         
            +
                    "@babel/traverse": "^7.25.0",
         
     | 
| 1030 | 
         
            +
                    "@babel/types": "^7.25.0"
         
     | 
| 
         | 
|
| 1031 | 
         
             
                  },
         
     | 
| 1032 | 
         
             
                  "engines": {
         
     | 
| 1033 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 1034 | 
         
             
                  }
         
     | 
| 1035 | 
         
             
                },
         
     | 
| 1036 | 
         
             
                "node_modules/@babel/helpers": {
         
     | 
| 1037 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 1038 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz",
         
     | 
| 1039 | 
         
            +
                  "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==",
         
     | 
| 1040 | 
         
             
                  "dev": true,
         
     | 
| 1041 | 
         
             
                  "dependencies": {
         
     | 
| 1042 | 
         
            +
                    "@babel/template": "^7.25.0",
         
     | 
| 1043 | 
         
            +
                    "@babel/types": "^7.25.0"
         
     | 
| 1044 | 
         
             
                  },
         
     | 
| 1045 | 
         
             
                  "engines": {
         
     | 
| 1046 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 1062 | 
         
             
                  }
         
     | 
| 1063 | 
         
             
                },
         
     | 
| 1064 | 
         
             
                "node_modules/@babel/parser": {
         
     | 
| 1065 | 
         
            +
                  "version": "7.25.3",
         
     | 
| 1066 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
         
     | 
| 1067 | 
         
            +
                  "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
         
     | 
| 1068 | 
         
             
                  "dev": true,
         
     | 
| 1069 | 
         
            +
                  "dependencies": {
         
     | 
| 1070 | 
         
            +
                    "@babel/types": "^7.25.2"
         
     | 
| 1071 | 
         
            +
                  },
         
     | 
| 1072 | 
         
             
                  "bin": {
         
     | 
| 1073 | 
         
             
                    "parser": "bin/babel-parser.js"
         
     | 
| 1074 | 
         
             
                  },
         
     | 
| 
         | 
|
| 1077 | 
         
             
                  }
         
     | 
| 1078 | 
         
             
                },
         
     | 
| 1079 | 
         
             
                "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
         
     | 
| 1080 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 1081 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz",
         
     | 
| 1082 | 
         
            +
                  "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
         
     | 
| 1083 | 
         
             
                  "dev": true,
         
     | 
| 1084 | 
         
             
                  "dependencies": {
         
     | 
| 1085 | 
         
            +
                    "@babel/helper-plugin-utils": "^7.24.8"
         
     | 
| 1086 | 
         
             
                  },
         
     | 
| 1087 | 
         
             
                  "engines": {
         
     | 
| 1088 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 1109 | 
         
             
                  }
         
     | 
| 1110 | 
         
             
                },
         
     | 
| 1111 | 
         
             
                "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
         
     | 
| 1112 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 1113 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
         
     | 
| 1114 | 
         
            +
                  "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
         
     | 
| 1115 | 
         
             
                  "dev": true,
         
     | 
| 1116 | 
         
             
                  "dependencies": {
         
     | 
| 1117 | 
         
            +
                    "@babel/helper-plugin-utils": "^7.24.8",
         
     | 
| 1118 | 
         
            +
                    "@babel/traverse": "^7.25.0"
         
     | 
| 1119 | 
         
             
                  },
         
     | 
| 1120 | 
         
             
                  "engines": {
         
     | 
| 1121 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 1437 | 
         
             
                  }
         
     | 
| 1438 | 
         
             
                },
         
     | 
| 1439 | 
         
             
                "node_modules/@babel/plugin-transform-block-scoping": {
         
     | 
| 1440 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 1441 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
         
     | 
| 1442 | 
         
            +
                  "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
         
     | 
| 1443 | 
         
             
                  "dev": true,
         
     | 
| 1444 | 
         
             
                  "dependencies": {
         
     | 
| 1445 | 
         
            +
                    "@babel/helper-plugin-utils": "^7.24.8"
         
     | 
| 1446 | 
         
             
                  },
         
     | 
| 1447 | 
         
             
                  "engines": {
         
     | 
| 1448 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 1485 | 
         
             
                  }
         
     | 
| 1486 | 
         
             
                },
         
     | 
| 1487 | 
         
             
                "node_modules/@babel/plugin-transform-classes": {
         
     | 
| 1488 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 1489 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz",
         
     | 
| 1490 | 
         
            +
                  "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==",
         
     | 
| 1491 | 
         
             
                  "dev": true,
         
     | 
| 1492 | 
         
             
                  "dependencies": {
         
     | 
| 1493 | 
         
             
                    "@babel/helper-annotate-as-pure": "^7.24.7",
         
     | 
| 1494 | 
         
             
                    "@babel/helper-compilation-targets": "^7.24.8",
         
     | 
| 
         | 
|
| 
         | 
|
| 1495 | 
         
             
                    "@babel/helper-plugin-utils": "^7.24.8",
         
     | 
| 1496 | 
         
            +
                    "@babel/helper-replace-supers": "^7.25.0",
         
     | 
| 1497 | 
         
            +
                    "@babel/traverse": "^7.25.0",
         
     | 
| 1498 | 
         
             
                    "globals": "^11.1.0"
         
     | 
| 1499 | 
         
             
                  },
         
     | 
| 1500 | 
         
             
                  "engines": {
         
     | 
| 
         | 
|
| 1516 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 1517 | 
         
             
                  }
         
     | 
| 1518 | 
         
             
                },
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 1519 | 
         
             
                "node_modules/@babel/plugin-transform-computed-properties": {
         
     | 
| 1520 | 
         
             
                  "version": "7.24.7",
         
     | 
| 1521 | 
         
             
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
         
     | 
| 
         | 
|
| 1643 | 
         
             
                  }
         
     | 
| 1644 | 
         
             
                },
         
     | 
| 1645 | 
         
             
                "node_modules/@babel/plugin-transform-function-name": {
         
     | 
| 1646 | 
         
            +
                  "version": "7.25.1",
         
     | 
| 1647 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
         
     | 
| 1648 | 
         
            +
                  "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
         
     | 
| 1649 | 
         
             
                  "dev": true,
         
     | 
| 1650 | 
         
             
                  "dependencies": {
         
     | 
| 1651 | 
         
            +
                    "@babel/helper-compilation-targets": "^7.24.8",
         
     | 
| 1652 | 
         
            +
                    "@babel/helper-plugin-utils": "^7.24.8",
         
     | 
| 1653 | 
         
            +
                    "@babel/traverse": "^7.25.1"
         
     | 
| 1654 | 
         
             
                  },
         
     | 
| 1655 | 
         
             
                  "engines": {
         
     | 
| 1656 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 1676 | 
         
             
                  }
         
     | 
| 1677 | 
         
             
                },
         
     | 
| 1678 | 
         
             
                "node_modules/@babel/plugin-transform-literals": {
         
     | 
| 1679 | 
         
            +
                  "version": "7.25.2",
         
     | 
| 1680 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
         
     | 
| 1681 | 
         
            +
                  "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
         
     | 
| 1682 | 
         
             
                  "dev": true,
         
     | 
| 1683 | 
         
             
                  "dependencies": {
         
     | 
| 1684 | 
         
            +
                    "@babel/helper-plugin-utils": "^7.24.8"
         
     | 
| 1685 | 
         
             
                  },
         
     | 
| 1686 | 
         
             
                  "engines": {
         
     | 
| 1687 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 1755 | 
         
             
                  }
         
     | 
| 1756 | 
         
             
                },
         
     | 
| 1757 | 
         
             
                "node_modules/@babel/plugin-transform-modules-systemjs": {
         
     | 
| 1758 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 1759 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
         
     | 
| 1760 | 
         
            +
                  "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
         
     | 
| 1761 | 
         
             
                  "dev": true,
         
     | 
| 1762 | 
         
             
                  "dependencies": {
         
     | 
| 1763 | 
         
            +
                    "@babel/helper-module-transforms": "^7.25.0",
         
     | 
| 1764 | 
         
            +
                    "@babel/helper-plugin-utils": "^7.24.8",
         
     | 
| 1765 | 
         
            +
                    "@babel/helper-validator-identifier": "^7.24.7",
         
     | 
| 1766 | 
         
            +
                    "@babel/traverse": "^7.25.0"
         
     | 
| 1767 | 
         
             
                  },
         
     | 
| 1768 | 
         
             
                  "engines": {
         
     | 
| 1769 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 
         | 
|
| 2329 | 
         
             
                  }
         
     | 
| 2330 | 
         
             
                },
         
     | 
| 2331 | 
         
             
                "node_modules/@babel/template": {
         
     | 
| 2332 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 2333 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
         
     | 
| 2334 | 
         
            +
                  "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
         
     | 
| 2335 | 
         
             
                  "dev": true,
         
     | 
| 2336 | 
         
             
                  "dependencies": {
         
     | 
| 2337 | 
         
             
                    "@babel/code-frame": "^7.24.7",
         
     | 
| 2338 | 
         
            +
                    "@babel/parser": "^7.25.0",
         
     | 
| 2339 | 
         
            +
                    "@babel/types": "^7.25.0"
         
     | 
| 2340 | 
         
             
                  },
         
     | 
| 2341 | 
         
             
                  "engines": {
         
     | 
| 2342 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 2343 | 
         
             
                  }
         
     | 
| 2344 | 
         
             
                },
         
     | 
| 2345 | 
         
             
                "node_modules/@babel/traverse": {
         
     | 
| 2346 | 
         
            +
                  "version": "7.25.3",
         
     | 
| 2347 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
         
     | 
| 2348 | 
         
            +
                  "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
         
     | 
| 2349 | 
         
             
                  "dev": true,
         
     | 
| 2350 | 
         
             
                  "dependencies": {
         
     | 
| 2351 | 
         
             
                    "@babel/code-frame": "^7.24.7",
         
     | 
| 2352 | 
         
            +
                    "@babel/generator": "^7.25.0",
         
     | 
| 2353 | 
         
            +
                    "@babel/parser": "^7.25.3",
         
     | 
| 2354 | 
         
            +
                    "@babel/template": "^7.25.0",
         
     | 
| 2355 | 
         
            +
                    "@babel/types": "^7.25.2",
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 2356 | 
         
             
                    "debug": "^4.3.1",
         
     | 
| 2357 | 
         
             
                    "globals": "^11.1.0"
         
     | 
| 2358 | 
         
             
                  },
         
     | 
| 
         | 
|
| 2361 | 
         
             
                  }
         
     | 
| 2362 | 
         
             
                },
         
     | 
| 2363 | 
         
             
                "node_modules/@babel/traverse/node_modules/@babel/generator": {
         
     | 
| 2364 | 
         
            +
                  "version": "7.25.0",
         
     | 
| 2365 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
         
     | 
| 2366 | 
         
            +
                  "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
         
     | 
| 2367 | 
         
             
                  "dev": true,
         
     | 
| 2368 | 
         
             
                  "dependencies": {
         
     | 
| 2369 | 
         
            +
                    "@babel/types": "^7.25.0",
         
     | 
| 2370 | 
         
             
                    "@jridgewell/gen-mapping": "^0.3.5",
         
     | 
| 2371 | 
         
             
                    "@jridgewell/trace-mapping": "^0.3.25",
         
     | 
| 2372 | 
         
             
                    "jsesc": "^2.5.1"
         
     | 
| 
         | 
|
| 2375 | 
         
             
                    "node": ">=6.9.0"
         
     | 
| 2376 | 
         
             
                  }
         
     | 
| 2377 | 
         
             
                },
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 2378 | 
         
             
                "node_modules/@babel/types": {
         
     | 
| 2379 | 
         
            +
                  "version": "7.25.2",
         
     | 
| 2380 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
         
     | 
| 2381 | 
         
            +
                  "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
         
     | 
| 2382 | 
         
             
                  "dev": true,
         
     | 
| 2383 | 
         
             
                  "dependencies": {
         
     | 
| 2384 | 
         
             
                    "@babel/helper-string-parser": "^7.24.8",
         
     | 
| 
         | 
|
| 4069 | 
         
             
                  }
         
     | 
| 4070 | 
         
             
                },
         
     | 
| 4071 | 
         
             
                "node_modules/@rollup/rollup-android-arm-eabi": {
         
     | 
| 4072 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4073 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz",
         
     | 
| 4074 | 
         
            +
                  "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==",
         
     | 
| 4075 | 
         
             
                  "cpu": [
         
     | 
| 4076 | 
         
             
                    "arm"
         
     | 
| 4077 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4082 | 
         
             
                  ]
         
     | 
| 4083 | 
         
             
                },
         
     | 
| 4084 | 
         
             
                "node_modules/@rollup/rollup-android-arm64": {
         
     | 
| 4085 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4086 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz",
         
     | 
| 4087 | 
         
            +
                  "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==",
         
     | 
| 4088 | 
         
             
                  "cpu": [
         
     | 
| 4089 | 
         
             
                    "arm64"
         
     | 
| 4090 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4095 | 
         
             
                  ]
         
     | 
| 4096 | 
         
             
                },
         
     | 
| 4097 | 
         
             
                "node_modules/@rollup/rollup-darwin-arm64": {
         
     | 
| 4098 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4099 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz",
         
     | 
| 4100 | 
         
            +
                  "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==",
         
     | 
| 4101 | 
         
             
                  "cpu": [
         
     | 
| 4102 | 
         
             
                    "arm64"
         
     | 
| 4103 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4108 | 
         
             
                  ]
         
     | 
| 4109 | 
         
             
                },
         
     | 
| 4110 | 
         
             
                "node_modules/@rollup/rollup-darwin-x64": {
         
     | 
| 4111 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4112 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz",
         
     | 
| 4113 | 
         
            +
                  "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==",
         
     | 
| 4114 | 
         
             
                  "cpu": [
         
     | 
| 4115 | 
         
             
                    "x64"
         
     | 
| 4116 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4121 | 
         
             
                  ]
         
     | 
| 4122 | 
         
             
                },
         
     | 
| 4123 | 
         
             
                "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
         
     | 
| 4124 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4125 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz",
         
     | 
| 4126 | 
         
            +
                  "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==",
         
     | 
| 4127 | 
         
             
                  "cpu": [
         
     | 
| 4128 | 
         
             
                    "arm"
         
     | 
| 4129 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4134 | 
         
             
                  ]
         
     | 
| 4135 | 
         
             
                },
         
     | 
| 4136 | 
         
             
                "node_modules/@rollup/rollup-linux-arm-musleabihf": {
         
     | 
| 4137 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4138 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz",
         
     | 
| 4139 | 
         
            +
                  "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==",
         
     | 
| 4140 | 
         
             
                  "cpu": [
         
     | 
| 4141 | 
         
             
                    "arm"
         
     | 
| 4142 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4147 | 
         
             
                  ]
         
     | 
| 4148 | 
         
             
                },
         
     | 
| 4149 | 
         
             
                "node_modules/@rollup/rollup-linux-arm64-gnu": {
         
     | 
| 4150 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4151 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz",
         
     | 
| 4152 | 
         
            +
                  "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==",
         
     | 
| 4153 | 
         
             
                  "cpu": [
         
     | 
| 4154 | 
         
             
                    "arm64"
         
     | 
| 4155 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4160 | 
         
             
                  ]
         
     | 
| 4161 | 
         
             
                },
         
     | 
| 4162 | 
         
             
                "node_modules/@rollup/rollup-linux-arm64-musl": {
         
     | 
| 4163 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4164 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz",
         
     | 
| 4165 | 
         
            +
                  "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==",
         
     | 
| 4166 | 
         
             
                  "cpu": [
         
     | 
| 4167 | 
         
             
                    "arm64"
         
     | 
| 4168 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4173 | 
         
             
                  ]
         
     | 
| 4174 | 
         
             
                },
         
     | 
| 4175 | 
         
             
                "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
         
     | 
| 4176 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4177 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz",
         
     | 
| 4178 | 
         
            +
                  "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==",
         
     | 
| 4179 | 
         
             
                  "cpu": [
         
     | 
| 4180 | 
         
             
                    "ppc64"
         
     | 
| 4181 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4186 | 
         
             
                  ]
         
     | 
| 4187 | 
         
             
                },
         
     | 
| 4188 | 
         
             
                "node_modules/@rollup/rollup-linux-riscv64-gnu": {
         
     | 
| 4189 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4190 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz",
         
     | 
| 4191 | 
         
            +
                  "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==",
         
     | 
| 4192 | 
         
             
                  "cpu": [
         
     | 
| 4193 | 
         
             
                    "riscv64"
         
     | 
| 4194 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4199 | 
         
             
                  ]
         
     | 
| 4200 | 
         
             
                },
         
     | 
| 4201 | 
         
             
                "node_modules/@rollup/rollup-linux-s390x-gnu": {
         
     | 
| 4202 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4203 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz",
         
     | 
| 4204 | 
         
            +
                  "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==",
         
     | 
| 4205 | 
         
             
                  "cpu": [
         
     | 
| 4206 | 
         
             
                    "s390x"
         
     | 
| 4207 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4212 | 
         
             
                  ]
         
     | 
| 4213 | 
         
             
                },
         
     | 
| 4214 | 
         
             
                "node_modules/@rollup/rollup-linux-x64-gnu": {
         
     | 
| 4215 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4216 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz",
         
     | 
| 4217 | 
         
            +
                  "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==",
         
     | 
| 4218 | 
         
             
                  "cpu": [
         
     | 
| 4219 | 
         
             
                    "x64"
         
     | 
| 4220 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4225 | 
         
             
                  ]
         
     | 
| 4226 | 
         
             
                },
         
     | 
| 4227 | 
         
             
                "node_modules/@rollup/rollup-linux-x64-musl": {
         
     | 
| 4228 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4229 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz",
         
     | 
| 4230 | 
         
            +
                  "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==",
         
     | 
| 4231 | 
         
             
                  "cpu": [
         
     | 
| 4232 | 
         
             
                    "x64"
         
     | 
| 4233 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4238 | 
         
             
                  ]
         
     | 
| 4239 | 
         
             
                },
         
     | 
| 4240 | 
         
             
                "node_modules/@rollup/rollup-win32-arm64-msvc": {
         
     | 
| 4241 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4242 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz",
         
     | 
| 4243 | 
         
            +
                  "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==",
         
     | 
| 4244 | 
         
             
                  "cpu": [
         
     | 
| 4245 | 
         
             
                    "arm64"
         
     | 
| 4246 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4251 | 
         
             
                  ]
         
     | 
| 4252 | 
         
             
                },
         
     | 
| 4253 | 
         
             
                "node_modules/@rollup/rollup-win32-ia32-msvc": {
         
     | 
| 4254 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4255 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz",
         
     | 
| 4256 | 
         
            +
                  "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==",
         
     | 
| 4257 | 
         
             
                  "cpu": [
         
     | 
| 4258 | 
         
             
                    "ia32"
         
     | 
| 4259 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4264 | 
         
             
                  ]
         
     | 
| 4265 | 
         
             
                },
         
     | 
| 4266 | 
         
             
                "node_modules/@rollup/rollup-win32-x64-msvc": {
         
     | 
| 4267 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 4268 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz",
         
     | 
| 4269 | 
         
            +
                  "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==",
         
     | 
| 4270 | 
         
             
                  "cpu": [
         
     | 
| 4271 | 
         
             
                    "x64"
         
     | 
| 4272 | 
         
             
                  ],
         
     | 
| 
         | 
|
| 4481 | 
         
             
                  }
         
     | 
| 4482 | 
         
             
                },
         
     | 
| 4483 | 
         
             
                "node_modules/@types/eslint": {
         
     | 
| 4484 | 
         
            +
                  "version": "9.6.0",
         
     | 
| 4485 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz",
         
     | 
| 4486 | 
         
            +
                  "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==",
         
     | 
| 4487 | 
         
             
                  "dev": true,
         
     | 
| 4488 | 
         
             
                  "dependencies": {
         
     | 
| 4489 | 
         
             
                    "@types/estree": "*",
         
     | 
| 
         | 
|
| 4537 | 
         
             
                  "dev": true
         
     | 
| 4538 | 
         
             
                },
         
     | 
| 4539 | 
         
             
                "node_modules/@types/http-proxy": {
         
     | 
| 4540 | 
         
            +
                  "version": "1.17.15",
         
     | 
| 4541 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
         
     | 
| 4542 | 
         
            +
                  "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
         
     | 
| 4543 | 
         
             
                  "dev": true,
         
     | 
| 4544 | 
         
             
                  "dependencies": {
         
     | 
| 4545 | 
         
             
                    "@types/node": "*"
         
     | 
| 
         | 
|
| 4564 | 
         
             
                  "dev": true
         
     | 
| 4565 | 
         
             
                },
         
     | 
| 4566 | 
         
             
                "node_modules/@types/node": {
         
     | 
| 4567 | 
         
            +
                  "version": "22.2.0",
         
     | 
| 4568 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz",
         
     | 
| 4569 | 
         
            +
                  "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==",
         
     | 
| 4570 | 
         
             
                  "dev": true,
         
     | 
| 4571 | 
         
             
                  "dependencies": {
         
     | 
| 4572 | 
         
            +
                    "undici-types": "~6.13.0"
         
     | 
| 4573 | 
         
             
                  }
         
     | 
| 4574 | 
         
             
                },
         
     | 
| 4575 | 
         
             
                "node_modules/@types/node-forge": {
         
     | 
| 
         | 
|
| 4639 | 
         
             
                  }
         
     | 
| 4640 | 
         
             
                },
         
     | 
| 4641 | 
         
             
                "node_modules/@types/ws": {
         
     | 
| 4642 | 
         
            +
                  "version": "8.5.12",
         
     | 
| 4643 | 
         
            +
                  "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz",
         
     | 
| 4644 | 
         
            +
                  "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==",
         
     | 
| 4645 | 
         
             
                  "dev": true,
         
     | 
| 4646 | 
         
             
                  "dependencies": {
         
     | 
| 4647 | 
         
             
                    "@types/node": "*"
         
     | 
| 
         | 
|
| 5361 | 
         
             
                  }
         
     | 
| 5362 | 
         
             
                },
         
     | 
| 5363 | 
         
             
                "node_modules/browserslist": {
         
     | 
| 5364 | 
         
            +
                  "version": "4.23.3",
         
     | 
| 5365 | 
         
            +
                  "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
         
     | 
| 5366 | 
         
            +
                  "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
         
     | 
| 5367 | 
         
             
                  "dev": true,
         
     | 
| 5368 | 
         
             
                  "funding": [
         
     | 
| 5369 | 
         
             
                    {
         
     | 
| 
         | 
|
| 5380 | 
         
             
                    }
         
     | 
| 5381 | 
         
             
                  ],
         
     | 
| 5382 | 
         
             
                  "dependencies": {
         
     | 
| 5383 | 
         
            +
                    "caniuse-lite": "^1.0.30001646",
         
     | 
| 5384 | 
         
            +
                    "electron-to-chromium": "^1.5.4",
         
     | 
| 5385 | 
         
            +
                    "node-releases": "^2.0.18",
         
     | 
| 5386 | 
         
             
                    "update-browserslist-db": "^1.1.0"
         
     | 
| 5387 | 
         
             
                  },
         
     | 
| 5388 | 
         
             
                  "bin": {
         
     | 
| 
         | 
|
| 5542 | 
         
             
                  }
         
     | 
| 5543 | 
         
             
                },
         
     | 
| 5544 | 
         
             
                "node_modules/caniuse-lite": {
         
     | 
| 5545 | 
         
            +
                  "version": "1.0.30001651",
         
     | 
| 5546 | 
         
            +
                  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz",
         
     | 
| 5547 | 
         
            +
                  "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==",
         
     | 
| 5548 | 
         
             
                  "dev": true,
         
     | 
| 5549 | 
         
             
                  "funding": [
         
     | 
| 5550 | 
         
             
                    {
         
     | 
| 
         | 
|
| 5981 | 
         
             
                  }
         
     | 
| 5982 | 
         
             
                },
         
     | 
| 5983 | 
         
             
                "node_modules/core-js-compat": {
         
     | 
| 5984 | 
         
            +
                  "version": "3.38.0",
         
     | 
| 5985 | 
         
            +
                  "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz",
         
     | 
| 5986 | 
         
            +
                  "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==",
         
     | 
| 5987 | 
         
             
                  "dev": true,
         
     | 
| 5988 | 
         
             
                  "dependencies": {
         
     | 
| 5989 | 
         
            +
                    "browserslist": "^4.23.3"
         
     | 
| 5990 | 
         
             
                  },
         
     | 
| 5991 | 
         
             
                  "funding": {
         
     | 
| 5992 | 
         
             
                    "type": "opencollective",
         
     | 
| 
         | 
|
| 6261 | 
         
             
                  }
         
     | 
| 6262 | 
         
             
                },
         
     | 
| 6263 | 
         
             
                "node_modules/debug": {
         
     | 
| 6264 | 
         
            +
                  "version": "4.3.6",
         
     | 
| 6265 | 
         
            +
                  "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
         
     | 
| 6266 | 
         
            +
                  "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
         
     | 
| 6267 | 
         
             
                  "dev": true,
         
     | 
| 6268 | 
         
             
                  "dependencies": {
         
     | 
| 6269 | 
         
             
                    "ms": "2.1.2"
         
     | 
| 
         | 
|
| 6462 | 
         
             
                  "dev": true
         
     | 
| 6463 | 
         
             
                },
         
     | 
| 6464 | 
         
             
                "node_modules/electron-to-chromium": {
         
     | 
| 6465 | 
         
            +
                  "version": "1.5.6",
         
     | 
| 6466 | 
         
            +
                  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz",
         
     | 
| 6467 | 
         
            +
                  "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==",
         
     | 
| 6468 | 
         
             
                  "dev": true
         
     | 
| 6469 | 
         
             
                },
         
     | 
| 6470 | 
         
             
                "node_modules/emoji-regex": {
         
     | 
| 
         | 
|
| 6545 | 
         
             
                  }
         
     | 
| 6546 | 
         
             
                },
         
     | 
| 6547 | 
         
             
                "node_modules/enhanced-resolve": {
         
     | 
| 6548 | 
         
            +
                  "version": "5.17.1",
         
     | 
| 6549 | 
         
            +
                  "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
         
     | 
| 6550 | 
         
            +
                  "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
         
     | 
| 6551 | 
         
             
                  "dev": true,
         
     | 
| 6552 | 
         
             
                  "dependencies": {
         
     | 
| 6553 | 
         
             
                    "graceful-fs": "^4.2.4",
         
     | 
| 
         | 
|
| 7137 | 
         
             
                  }
         
     | 
| 7138 | 
         
             
                },
         
     | 
| 7139 | 
         
             
                "node_modules/foreground-child": {
         
     | 
| 7140 | 
         
            +
                  "version": "3.3.0",
         
     | 
| 7141 | 
         
            +
                  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
         
     | 
| 7142 | 
         
            +
                  "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
         
     | 
| 7143 | 
         
             
                  "dev": true,
         
     | 
| 7144 | 
         
             
                  "dependencies": {
         
     | 
| 7145 | 
         
             
                    "cross-spawn": "^7.0.0",
         
     | 
| 
         | 
|
| 7782 | 
         
             
                  }
         
     | 
| 7783 | 
         
             
                },
         
     | 
| 7784 | 
         
             
                "node_modules/immutable": {
         
     | 
| 7785 | 
         
            +
                  "version": "4.3.7",
         
     | 
| 7786 | 
         
            +
                  "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz",
         
     | 
| 7787 | 
         
            +
                  "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
         
     | 
| 7788 | 
         
             
                  "dev": true
         
     | 
| 7789 | 
         
             
                },
         
     | 
| 7790 | 
         
             
                "node_modules/import-fresh": {
         
     | 
| 
         | 
|
| 7941 | 
         
             
                  }
         
     | 
| 7942 | 
         
             
                },
         
     | 
| 7943 | 
         
             
                "node_modules/is-core-module": {
         
     | 
| 7944 | 
         
            +
                  "version": "2.15.0",
         
     | 
| 7945 | 
         
            +
                  "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
         
     | 
| 7946 | 
         
            +
                  "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
         
     | 
| 7947 | 
         
             
                  "dev": true,
         
     | 
| 7948 | 
         
             
                  "dependencies": {
         
     | 
| 7949 | 
         
             
                    "hasown": "^2.0.2"
         
     | 
| 
         | 
|
| 8385 | 
         
             
                  ]
         
     | 
| 8386 | 
         
             
                },
         
     | 
| 8387 | 
         
             
                "node_modules/karma": {
         
     | 
| 8388 | 
         
            +
                  "version": "6.4.4",
         
     | 
| 8389 | 
         
            +
                  "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz",
         
     | 
| 8390 | 
         
            +
                  "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==",
         
     | 
| 8391 | 
         
             
                  "dev": true,
         
     | 
| 8392 | 
         
             
                  "dependencies": {
         
     | 
| 8393 | 
         
             
                    "@colors/colors": "1.5.0",
         
     | 
| 
         | 
|
| 8614 | 
         
             
                  }
         
     | 
| 8615 | 
         
             
                },
         
     | 
| 8616 | 
         
             
                "node_modules/launch-editor": {
         
     | 
| 8617 | 
         
            +
                  "version": "2.8.1",
         
     | 
| 8618 | 
         
            +
                  "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz",
         
     | 
| 8619 | 
         
            +
                  "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==",
         
     | 
| 8620 | 
         
             
                  "dev": true,
         
     | 
| 8621 | 
         
             
                  "dependencies": {
         
     | 
| 8622 | 
         
             
                    "picocolors": "^1.0.0",
         
     | 
| 
         | 
|
| 9185 | 
         
             
                  "dev": true
         
     | 
| 9186 | 
         
             
                },
         
     | 
| 9187 | 
         
             
                "node_modules/minipass-json-stream": {
         
     | 
| 9188 | 
         
            +
                  "version": "1.0.2",
         
     | 
| 9189 | 
         
            +
                  "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz",
         
     | 
| 9190 | 
         
            +
                  "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==",
         
     | 
| 9191 | 
         
             
                  "dev": true,
         
     | 
| 9192 | 
         
             
                  "dependencies": {
         
     | 
| 9193 | 
         
             
                    "jsonparse": "^1.3.1",
         
     | 
| 
         | 
|
| 9560 | 
         
             
                  }
         
     | 
| 9561 | 
         
             
                },
         
     | 
| 9562 | 
         
             
                "node_modules/node-releases": {
         
     | 
| 9563 | 
         
            +
                  "version": "2.0.18",
         
     | 
| 9564 | 
         
            +
                  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
         
     | 
| 9565 | 
         
            +
                  "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
         
     | 
| 9566 | 
         
             
                  "dev": true
         
     | 
| 9567 | 
         
             
                },
         
     | 
| 9568 | 
         
             
                "node_modules/nopt": {
         
     | 
| 
         | 
|
| 10952 | 
         
             
                  }
         
     | 
| 10953 | 
         
             
                },
         
     | 
| 10954 | 
         
             
                "node_modules/rollup": {
         
     | 
| 10955 | 
         
            +
                  "version": "4.20.0",
         
     | 
| 10956 | 
         
            +
                  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz",
         
     | 
| 10957 | 
         
            +
                  "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==",
         
     | 
| 10958 | 
         
             
                  "dev": true,
         
     | 
| 10959 | 
         
             
                  "dependencies": {
         
     | 
| 10960 | 
         
             
                    "@types/estree": "1.0.5"
         
     | 
| 
         | 
|
| 10967 | 
         
             
                    "npm": ">=8.0.0"
         
     | 
| 10968 | 
         
             
                  },
         
     | 
| 10969 | 
         
             
                  "optionalDependencies": {
         
     | 
| 10970 | 
         
            +
                    "@rollup/rollup-android-arm-eabi": "4.20.0",
         
     | 
| 10971 | 
         
            +
                    "@rollup/rollup-android-arm64": "4.20.0",
         
     | 
| 10972 | 
         
            +
                    "@rollup/rollup-darwin-arm64": "4.20.0",
         
     | 
| 10973 | 
         
            +
                    "@rollup/rollup-darwin-x64": "4.20.0",
         
     | 
| 10974 | 
         
            +
                    "@rollup/rollup-linux-arm-gnueabihf": "4.20.0",
         
     | 
| 10975 | 
         
            +
                    "@rollup/rollup-linux-arm-musleabihf": "4.20.0",
         
     | 
| 10976 | 
         
            +
                    "@rollup/rollup-linux-arm64-gnu": "4.20.0",
         
     | 
| 10977 | 
         
            +
                    "@rollup/rollup-linux-arm64-musl": "4.20.0",
         
     | 
| 10978 | 
         
            +
                    "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0",
         
     | 
| 10979 | 
         
            +
                    "@rollup/rollup-linux-riscv64-gnu": "4.20.0",
         
     | 
| 10980 | 
         
            +
                    "@rollup/rollup-linux-s390x-gnu": "4.20.0",
         
     | 
| 10981 | 
         
            +
                    "@rollup/rollup-linux-x64-gnu": "4.20.0",
         
     | 
| 10982 | 
         
            +
                    "@rollup/rollup-linux-x64-musl": "4.20.0",
         
     | 
| 10983 | 
         
            +
                    "@rollup/rollup-win32-arm64-msvc": "4.20.0",
         
     | 
| 10984 | 
         
            +
                    "@rollup/rollup-win32-ia32-msvc": "4.20.0",
         
     | 
| 10985 | 
         
            +
                    "@rollup/rollup-win32-x64-msvc": "4.20.0",
         
     | 
| 10986 | 
         
             
                    "fsevents": "~2.3.2"
         
     | 
| 10987 | 
         
             
                  }
         
     | 
| 10988 | 
         
             
                },
         
     | 
| 
         | 
|
| 12186 | 
         
             
                  }
         
     | 
| 12187 | 
         
             
                },
         
     | 
| 12188 | 
         
             
                "node_modules/undici-types": {
         
     | 
| 12189 | 
         
            +
                  "version": "6.13.0",
         
     | 
| 12190 | 
         
            +
                  "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz",
         
     | 
| 12191 | 
         
            +
                  "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==",
         
     | 
| 12192 | 
         
             
                  "dev": true
         
     | 
| 12193 | 
         
             
                },
         
     | 
| 12194 | 
         
             
                "node_modules/unicode-canonical-property-names-ecmascript": {
         
     | 
| 
         | 
|
| 13351 | 
         
             
                  }
         
     | 
| 13352 | 
         
             
                },
         
     | 
| 13353 | 
         
             
                "node_modules/zone.js": {
         
     | 
| 13354 | 
         
            +
                  "version": "0.14.10",
         
     | 
| 13355 | 
         
            +
                  "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz",
         
     | 
| 13356 | 
         
            +
                  "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ=="
         
     | 
| 13357 | 
         
             
                }
         
     | 
| 13358 | 
         
             
              }
         
     | 
| 13359 | 
         
             
            }
         
     | 
    	
        src/.DS_Store
    CHANGED
    
    | 
         Binary files a/src/.DS_Store and b/src/.DS_Store differ 
     | 
| 
         | 
    	
        src/app/.DS_Store
    ADDED
    
    | 
         Binary file (6.15 kB). View file 
     | 
| 
         | 
    	
        src/app/app.routes.ts
    CHANGED
    
    | 
         @@ -7,6 +7,8 @@ import {DatasetsComponent} from "./components/body/datasets/datasets.component"; 
     | 
|
| 7 | 
         
             
            import {AboutComponent} from "./components/body/about/about.component";
         
     | 
| 8 | 
         
             
            import {TaskComponent} from "./components/body/tasks/task/task.component";
         
     | 
| 9 | 
         
             
            import {SubmittingComponent} from "./components/body/submitting/submitting.component";
         
     | 
| 
         | 
|
| 
         | 
|
| 10 | 
         | 
| 11 | 
         
             
            export const routes: Routes = [
         
     | 
| 12 | 
         
             
              {path: '', component : BodyComponent},
         
     | 
| 
         @@ -18,4 +20,5 @@ export const routes: Routes = [ 
     | 
|
| 18 | 
         
             
              {path: 'about', component: AboutComponent},
         
     | 
| 19 | 
         
             
              {path: 'leaderboards', component: LeaderboardsComponent},
         
     | 
| 20 | 
         
             
              {path: 'leaderboards/:task', component: LeaderboardsComponent},
         
     | 
| 
         | 
|
| 21 | 
         
             
            ];
         
     | 
| 
         | 
|
| 7 | 
         
             
            import {AboutComponent} from "./components/body/about/about.component";
         
     | 
| 8 | 
         
             
            import {TaskComponent} from "./components/body/tasks/task/task.component";
         
     | 
| 9 | 
         
             
            import {SubmittingComponent} from "./components/body/submitting/submitting.component";
         
     | 
| 10 | 
         
            +
            import {ControlPanelComponent} from "./components/body/control-panel/control-panel.component";
         
     | 
| 11 | 
         
            +
            import {AdminLoginComponent} from "./components/body/control-panel/admin-login/admin-login.component";
         
     | 
| 12 | 
         | 
| 13 | 
         
             
            export const routes: Routes = [
         
     | 
| 14 | 
         
             
              {path: '', component : BodyComponent},
         
     | 
| 
         | 
|
| 20 | 
         
             
              {path: 'about', component: AboutComponent},
         
     | 
| 21 | 
         
             
              {path: 'leaderboards', component: LeaderboardsComponent},
         
     | 
| 22 | 
         
             
              {path: 'leaderboards/:task', component: LeaderboardsComponent},
         
     | 
| 23 | 
         
            +
              {path: 'control', component: ControlPanelComponent},
         
     | 
| 24 | 
         
             
            ];
         
     | 
    	
        src/{assets β app/components}/.DS_Store
    RENAMED
    
    | 
         Binary files a/src/assets/.DS_Store and b/src/app/components/.DS_Store differ 
     | 
| 
         | 
    	
        src/app/components/body/control-panel/admin-login/admin-login.component.css
    ADDED
    
    | 
         @@ -0,0 +1,43 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            /* CSS for the Angular component */
         
     | 
| 2 | 
         
            +
             
     | 
| 3 | 
         
            +
            .login-container {
         
     | 
| 4 | 
         
            +
              display: flex;
         
     | 
| 5 | 
         
            +
              justify-content: center;
         
     | 
| 6 | 
         
            +
              align-items: center;
         
     | 
| 7 | 
         
            +
              height: 100vh;
         
     | 
| 8 | 
         
            +
              width: 100%;
         
     | 
| 9 | 
         
            +
              padding: 16px;
         
     | 
| 10 | 
         
            +
              box-sizing: border-box;
         
     | 
| 11 | 
         
            +
            }
         
     | 
| 12 | 
         
            +
             
     | 
| 13 | 
         
            +
            mat-card {
         
     | 
| 14 | 
         
            +
              width: 100%;
         
     | 
| 15 | 
         
            +
              max-width: 400px; /* Optional: Limit the maximum width of the card */
         
     | 
| 16 | 
         
            +
              padding: 24px;
         
     | 
| 17 | 
         
            +
              box-sizing: border-box;
         
     | 
| 18 | 
         
            +
              display: flex;
         
     | 
| 19 | 
         
            +
              justify-content: center;
         
     | 
| 20 | 
         
            +
              align-items: center;
         
     | 
| 21 | 
         
            +
            }
         
     | 
| 22 | 
         
            +
             
     | 
| 23 | 
         
            +
            .login-content {
         
     | 
| 24 | 
         
            +
              display: flex;
         
     | 
| 25 | 
         
            +
              flex-direction: column;
         
     | 
| 26 | 
         
            +
              align-items: center;
         
     | 
| 27 | 
         
            +
              width: 100%;
         
     | 
| 28 | 
         
            +
            }
         
     | 
| 29 | 
         
            +
             
     | 
| 30 | 
         
            +
            mat-form-field {
         
     | 
| 31 | 
         
            +
              width: 100%;
         
     | 
| 32 | 
         
            +
              margin-bottom: 16px;
         
     | 
| 33 | 
         
            +
            }
         
     | 
| 34 | 
         
            +
             
     | 
| 35 | 
         
            +
            button {
         
     | 
| 36 | 
         
            +
              width: 100%;
         
     | 
| 37 | 
         
            +
              margin-top: 8px;
         
     | 
| 38 | 
         
            +
            }
         
     | 
| 39 | 
         
            +
             
     | 
| 40 | 
         
            +
            mat-label {
         
     | 
| 41 | 
         
            +
              margin-top: 16px;
         
     | 
| 42 | 
         
            +
              text-align: center;
         
     | 
| 43 | 
         
            +
            }
         
     | 
    	
        src/app/components/body/control-panel/admin-login/admin-login.component.html
    ADDED
    
    | 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            <div class="login-container">
         
     | 
| 2 | 
         
            +
              <mat-card>
         
     | 
| 3 | 
         
            +
                <div class="login-content">
         
     | 
| 4 | 
         
            +
                  <h2>Login</h2>
         
     | 
| 5 | 
         
            +
                  <form (ngSubmit)="onSubmit()">
         
     | 
| 6 | 
         
            +
                    <mat-form-field appearance="fill">
         
     | 
| 7 | 
         
            +
                      <mat-label>Password</mat-label>
         
     | 
| 8 | 
         
            +
                      <input
         
     | 
| 9 | 
         
            +
                        matInput
         
     | 
| 10 | 
         
            +
                        type="password"
         
     | 
| 11 | 
         
            +
                        [(ngModel)]="password"
         
     | 
| 12 | 
         
            +
                        name="password"
         
     | 
| 13 | 
         
            +
                        required
         
     | 
| 14 | 
         
            +
                      />
         
     | 
| 15 | 
         
            +
                    </mat-form-field>
         
     | 
| 16 | 
         
            +
                    <button mat-raised-button color="primary" type="submit">Login</button>
         
     | 
| 17 | 
         
            +
                  </form>
         
     | 
| 18 | 
         
            +
                  <mat-label *ngIf="(authenticationState | async)">
         
     | 
| 19 | 
         
            +
                    {{ (authenticationState | async) }}
         
     | 
| 20 | 
         
            +
                  </mat-label>
         
     | 
| 21 | 
         
            +
                </div>
         
     | 
| 22 | 
         
            +
              </mat-card>
         
     | 
| 23 | 
         
            +
            </div>
         
     | 
    	
        src/app/components/body/control-panel/admin-login/admin-login.component.spec.ts
    ADDED
    
    | 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            import { ComponentFixture, TestBed } from '@angular/core/testing';
         
     | 
| 2 | 
         
            +
             
     | 
| 3 | 
         
            +
            import { AdminLoginComponent } from './admin-login.component';
         
     | 
| 4 | 
         
            +
             
     | 
| 5 | 
         
            +
            describe('AdminLoginComponent', () => {
         
     | 
| 6 | 
         
            +
              let component: AdminLoginComponent;
         
     | 
| 7 | 
         
            +
              let fixture: ComponentFixture<AdminLoginComponent>;
         
     | 
| 8 | 
         
            +
             
     | 
| 9 | 
         
            +
              beforeEach(async () => {
         
     | 
| 10 | 
         
            +
                await TestBed.configureTestingModule({
         
     | 
| 11 | 
         
            +
                  imports: [AdminLoginComponent]
         
     | 
| 12 | 
         
            +
                })
         
     | 
| 13 | 
         
            +
                .compileComponents();
         
     | 
| 14 | 
         
            +
                
         
     | 
| 15 | 
         
            +
                fixture = TestBed.createComponent(AdminLoginComponent);
         
     | 
| 16 | 
         
            +
                component = fixture.componentInstance;
         
     | 
| 17 | 
         
            +
                fixture.detectChanges();
         
     | 
| 18 | 
         
            +
              });
         
     | 
| 19 | 
         
            +
             
     | 
| 20 | 
         
            +
              it('should create', () => {
         
     | 
| 21 | 
         
            +
                expect(component).toBeTruthy();
         
     | 
| 22 | 
         
            +
              });
         
     | 
| 23 | 
         
            +
            });
         
     | 
    	
        src/app/components/body/control-panel/admin-login/admin-login.component.ts
    ADDED
    
    | 
         @@ -0,0 +1,39 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            import { Component } from '@angular/core';
         
     | 
| 2 | 
         
            +
            import {MatCard} from "@angular/material/card";
         
     | 
| 3 | 
         
            +
            import {FormsModule} from "@angular/forms";
         
     | 
| 4 | 
         
            +
            import {MatFormField, MatLabel} from "@angular/material/form-field";
         
     | 
| 5 | 
         
            +
            import {MatButton} from "@angular/material/button";
         
     | 
| 6 | 
         
            +
            import {MatInput} from "@angular/material/input";
         
     | 
| 7 | 
         
            +
            import {AppStateService} from "../../../../state_management/services/app-state.service";
         
     | 
| 8 | 
         
            +
            import {map} from "rxjs";
         
     | 
| 9 | 
         
            +
            import {AsyncPipe, NgIf} from "@angular/common";
         
     | 
| 10 | 
         
            +
             
     | 
| 11 | 
         
            +
            @Component({
         
     | 
| 12 | 
         
            +
              selector: 'app-admin-login',
         
     | 
| 13 | 
         
            +
              standalone: true,
         
     | 
| 14 | 
         
            +
              imports: [
         
     | 
| 15 | 
         
            +
                MatCard,
         
     | 
| 16 | 
         
            +
                FormsModule,
         
     | 
| 17 | 
         
            +
                MatFormField,
         
     | 
| 18 | 
         
            +
                MatButton,
         
     | 
| 19 | 
         
            +
                MatInput,
         
     | 
| 20 | 
         
            +
                MatLabel,
         
     | 
| 21 | 
         
            +
                NgIf,
         
     | 
| 22 | 
         
            +
                AsyncPipe
         
     | 
| 23 | 
         
            +
              ],
         
     | 
| 24 | 
         
            +
              templateUrl: './admin-login.component.html',
         
     | 
| 25 | 
         
            +
              styleUrl: './admin-login.component.css'
         
     | 
| 26 | 
         
            +
            })
         
     | 
| 27 | 
         
            +
            export class AdminLoginComponent {
         
     | 
| 28 | 
         
            +
              password: string = '';
         
     | 
| 29 | 
         
            +
             
     | 
| 30 | 
         
            +
              constructor(private stateService: AppStateService) {}
         
     | 
| 31 | 
         
            +
             
     | 
| 32 | 
         
            +
              authenticationState = this.stateService.state$.pipe(
         
     | 
| 33 | 
         
            +
                map(state => state.adminSessionStatus)
         
     | 
| 34 | 
         
            +
              );
         
     | 
| 35 | 
         
            +
             
     | 
| 36 | 
         
            +
              onSubmit() {
         
     | 
| 37 | 
         
            +
                this.stateService.authenticate(this.password);
         
     | 
| 38 | 
         
            +
              }
         
     | 
| 39 | 
         
            +
            }
         
     | 
    	
        src/app/components/body/control-panel/control-panel.component.css
    ADDED
    
    | 
         @@ -0,0 +1,36 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            .full-width {
         
     | 
| 2 | 
         
            +
              width: 100%;
         
     | 
| 3 | 
         
            +
            }
         
     | 
| 4 | 
         
            +
             
     | 
| 5 | 
         
            +
            .table-container {
         
     | 
| 6 | 
         
            +
              width: 100%;
         
     | 
| 7 | 
         
            +
              overflow-x: auto;
         
     | 
| 8 | 
         
            +
              margin-top: 16px;
         
     | 
| 9 | 
         
            +
            }
         
     | 
| 10 | 
         
            +
             
     | 
| 11 | 
         
            +
            .responsive-table {
         
     | 
| 12 | 
         
            +
              min-width: 800px; /* Adjust based on your needs */
         
     | 
| 13 | 
         
            +
              width: 100%;
         
     | 
| 14 | 
         
            +
              table-layout: auto;
         
     | 
| 15 | 
         
            +
            }
         
     | 
| 16 | 
         
            +
             
     | 
| 17 | 
         
            +
            .mat-header-cell, .mat-cell {
         
     | 
| 18 | 
         
            +
              padding: 8px;
         
     | 
| 19 | 
         
            +
              text-align: left;
         
     | 
| 20 | 
         
            +
              white-space: nowrap;
         
     | 
| 21 | 
         
            +
            }
         
     | 
| 22 | 
         
            +
             
     | 
| 23 | 
         
            +
            .actions-cell {
         
     | 
| 24 | 
         
            +
              min-width: 220px; /* Adjust this value as necessary */
         
     | 
| 25 | 
         
            +
            }
         
     | 
| 26 | 
         
            +
             
     | 
| 27 | 
         
            +
            .mat-header-row, .mat-row {
         
     | 
| 28 | 
         
            +
              display: table-row;
         
     | 
| 29 | 
         
            +
            }
         
     | 
| 30 | 
         
            +
             
     | 
| 31 | 
         
            +
            .mat-header-row.sticky {
         
     | 
| 32 | 
         
            +
              background-color: white; /* Ensure the header has a background */
         
     | 
| 33 | 
         
            +
              position: sticky;
         
     | 
| 34 | 
         
            +
              top: 0;
         
     | 
| 35 | 
         
            +
              z-index: 1;
         
     | 
| 36 | 
         
            +
            }
         
     | 
    	
        src/app/components/body/control-panel/control-panel.component.html
    ADDED
    
    | 
         @@ -0,0 +1,144 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            <app-admin-login *ngIf="(authenticationState | async) != 'authenticated'"></app-admin-login>
         
     | 
| 2 | 
         
            +
             
     | 
| 3 | 
         
            +
            <div *ngIf="(authenticationState | async) == 'authenticated'">
         
     | 
| 4 | 
         
            +
              <!-- Admin Control Panel -->
         
     | 
| 5 | 
         
            +
              <mat-card>
         
     | 
| 6 | 
         
            +
                <button mat-raised-button color="primary" class="full-width" (click)="refresh()">Refresh List</button>
         
     | 
| 7 | 
         
            +
             
     | 
| 8 | 
         
            +
                <div class="table-container">
         
     | 
| 9 | 
         
            +
                  <table mat-table [dataSource]="dataSource" class="mat-elevation-z8 responsive-table">
         
     | 
| 10 | 
         
            +
             
     | 
| 11 | 
         
            +
                    <!-- Team Column -->
         
     | 
| 12 | 
         
            +
                    <ng-container matColumnDef="team">
         
     | 
| 13 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Team </mat-header-cell>
         
     | 
| 14 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 15 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.team }}</span>
         
     | 
| 16 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.team" (keyup.enter)="saveEdit(entry)">
         
     | 
| 17 | 
         
            +
                      </mat-cell>
         
     | 
| 18 | 
         
            +
                    </ng-container>
         
     | 
| 19 | 
         
            +
             
     | 
| 20 | 
         
            +
                    <!-- Task Column -->
         
     | 
| 21 | 
         
            +
                    <ng-container matColumnDef="task">
         
     | 
| 22 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Task </mat-header-cell>
         
     | 
| 23 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 24 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.task }}</span>
         
     | 
| 25 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.task" (keyup.enter)="saveEdit(entry)">
         
     | 
| 26 | 
         
            +
                      </mat-cell>
         
     | 
| 27 | 
         
            +
                    </ng-container>
         
     | 
| 28 | 
         
            +
             
     | 
| 29 | 
         
            +
                    <!-- Dataset Column -->
         
     | 
| 30 | 
         
            +
                    <ng-container matColumnDef="dataset">
         
     | 
| 31 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Dataset </mat-header-cell>
         
     | 
| 32 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 33 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.dataset }}</span>
         
     | 
| 34 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.dataset" (keyup.enter)="saveEdit(entry)">
         
     | 
| 35 | 
         
            +
                      </mat-cell>
         
     | 
| 36 | 
         
            +
                    </ng-container>
         
     | 
| 37 | 
         
            +
             
     | 
| 38 | 
         
            +
                    <!-- Model Column -->
         
     | 
| 39 | 
         
            +
                    <ng-container matColumnDef="model">
         
     | 
| 40 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Model </mat-header-cell>
         
     | 
| 41 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 42 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.model }}</span>
         
     | 
| 43 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.model" (keyup.enter)="saveEdit(entry)">
         
     | 
| 44 | 
         
            +
                      </mat-cell>
         
     | 
| 45 | 
         
            +
                    </ng-container>
         
     | 
| 46 | 
         
            +
             
     | 
| 47 | 
         
            +
                    <!-- Link Column -->
         
     | 
| 48 | 
         
            +
                    <ng-container matColumnDef="link">
         
     | 
| 49 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Link </mat-header-cell>
         
     | 
| 50 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 51 | 
         
            +
                        <a *ngIf="!isEditing(entry)" [href]="entry.link" target="_blank">{{ entry.link }}</a>
         
     | 
| 52 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.link" (keyup.enter)="saveEdit(entry)">
         
     | 
| 53 | 
         
            +
                      </mat-cell>
         
     | 
| 54 | 
         
            +
                    </ng-container>
         
     | 
| 55 | 
         
            +
             
     | 
| 56 | 
         
            +
                    <!-- Email Column -->
         
     | 
| 57 | 
         
            +
                    <ng-container matColumnDef="email">
         
     | 
| 58 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Email </mat-header-cell>
         
     | 
| 59 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 60 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.email }}</span>
         
     | 
| 61 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.email" (keyup.enter)="saveEdit(entry)">
         
     | 
| 62 | 
         
            +
                      </mat-cell>
         
     | 
| 63 | 
         
            +
                    </ng-container>
         
     | 
| 64 | 
         
            +
             
     | 
| 65 | 
         
            +
                    <!-- Status Column -->
         
     | 
| 66 | 
         
            +
                    <ng-container matColumnDef="status">
         
     | 
| 67 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Status </mat-header-cell>
         
     | 
| 68 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 69 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.status }}</span>
         
     | 
| 70 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.status" (keyup.enter)="saveEdit(entry)">
         
     | 
| 71 | 
         
            +
                      </mat-cell>
         
     | 
| 72 | 
         
            +
                    </ng-container>
         
     | 
| 73 | 
         
            +
             
     | 
| 74 | 
         
            +
                    <!-- Time Column -->
         
     | 
| 75 | 
         
            +
                    <ng-container matColumnDef="time">
         
     | 
| 76 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Time </mat-header-cell>
         
     | 
| 77 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 78 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.time }}</span>
         
     | 
| 79 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.time" (keyup.enter)="saveEdit(entry)">
         
     | 
| 80 | 
         
            +
                      </mat-cell>
         
     | 
| 81 | 
         
            +
                    </ng-container>
         
     | 
| 82 | 
         
            +
             
     | 
| 83 | 
         
            +
                    <!-- Is Public Column -->
         
     | 
| 84 | 
         
            +
                    <ng-container matColumnDef="is_public">
         
     | 
| 85 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Is Public </mat-header-cell>
         
     | 
| 86 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 87 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.is_public }}</span>
         
     | 
| 88 | 
         
            +
                        <input *ngIf="isEditing(entry)" type="checkbox" [(ngModel)]="entry.is_public" (keyup.enter)="saveEdit(entry)">
         
     | 
| 89 | 
         
            +
                      </mat-cell>
         
     | 
| 90 | 
         
            +
                    </ng-container>
         
     | 
| 91 | 
         
            +
             
     | 
| 92 | 
         
            +
                    <!-- Accuracy Column -->
         
     | 
| 93 | 
         
            +
                    <ng-container matColumnDef="accuracy">
         
     | 
| 94 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Accuracy </mat-header-cell>
         
     | 
| 95 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 96 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.accuracy | number: '1.2-2' }}</span>
         
     | 
| 97 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.accuracy" (keyup.enter)="saveEdit(entry)">
         
     | 
| 98 | 
         
            +
                      </mat-cell>
         
     | 
| 99 | 
         
            +
                    </ng-container>
         
     | 
| 100 | 
         
            +
             
     | 
| 101 | 
         
            +
                    <!-- Precision Column -->
         
     | 
| 102 | 
         
            +
                    <ng-container matColumnDef="precision">
         
     | 
| 103 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Precision </mat-header-cell>
         
     | 
| 104 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 105 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.precision | number: '1.2-2' }}</span>
         
     | 
| 106 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.precision" (keyup.enter)="saveEdit(entry)">
         
     | 
| 107 | 
         
            +
                      </mat-cell>
         
     | 
| 108 | 
         
            +
                    </ng-container>
         
     | 
| 109 | 
         
            +
             
     | 
| 110 | 
         
            +
                    <!-- Recall Column -->
         
     | 
| 111 | 
         
            +
                    <ng-container matColumnDef="recall">
         
     | 
| 112 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> Recall </mat-header-cell>
         
     | 
| 113 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 114 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.recall | number: '1.2-2'}}</span>
         
     | 
| 115 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.recall" (keyup.enter)="saveEdit(entry)">
         
     | 
| 116 | 
         
            +
                      </mat-cell>
         
     | 
| 117 | 
         
            +
                    </ng-container>
         
     | 
| 118 | 
         
            +
             
     | 
| 119 | 
         
            +
                    <!-- F1 Score Column -->
         
     | 
| 120 | 
         
            +
                    <ng-container matColumnDef="f1_score">
         
     | 
| 121 | 
         
            +
                      <mat-header-cell *matHeaderCellDef> F1 Score </mat-header-cell>
         
     | 
| 122 | 
         
            +
                      <mat-cell *matCellDef="let entry">
         
     | 
| 123 | 
         
            +
                        <span *ngIf="!isEditing(entry)">{{ entry.f1_score | number: '1.2-2' }}</span>
         
     | 
| 124 | 
         
            +
                        <input *ngIf="isEditing(entry)" [(ngModel)]="entry.f1_score" (keyup.enter)="saveEdit(entry)">
         
     | 
| 125 | 
         
            +
                      </mat-cell>
         
     | 
| 126 | 
         
            +
                    </ng-container>
         
     | 
| 127 | 
         
            +
             
     | 
| 128 | 
         
            +
                    <ng-container matColumnDef="actions">
         
     | 
| 129 | 
         
            +
                      <mat-header-cell *matHeaderCellDef class="actions-cell"> Actions </mat-header-cell>
         
     | 
| 130 | 
         
            +
                      <mat-cell *matCellDef="let entry" class="actions-cell">
         
     | 
| 131 | 
         
            +
                        <button *ngIf="!isEditing(entry)" mat-button (click)="editRow(entry)">Edit</button>
         
     | 
| 132 | 
         
            +
                        <button *ngIf="isEditing(entry)" mat-button (click)="saveEdit(entry)">Save</button>
         
     | 
| 133 | 
         
            +
                        <button *ngIf="isEditing(entry)" mat-button (click)="cancelEdit(entry)">Cancel</button>
         
     | 
| 134 | 
         
            +
                        <button mat-button color="warn" (click)="deleteRow(entry.id)">Delete</button>
         
     | 
| 135 | 
         
            +
                      </mat-cell>
         
     | 
| 136 | 
         
            +
                    </ng-container>
         
     | 
| 137 | 
         
            +
             
     | 
| 138 | 
         
            +
                    <mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></mat-header-row>
         
     | 
| 139 | 
         
            +
                    <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
         
     | 
| 140 | 
         
            +
             
     | 
| 141 | 
         
            +
                  </table>
         
     | 
| 142 | 
         
            +
                </div>
         
     | 
| 143 | 
         
            +
              </mat-card>
         
     | 
| 144 | 
         
            +
            </div>
         
     | 
    	
        src/app/components/body/control-panel/control-panel.component.spec.ts
    ADDED
    
    | 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            import { ComponentFixture, TestBed } from '@angular/core/testing';
         
     | 
| 2 | 
         
            +
             
     | 
| 3 | 
         
            +
            import { ControlPanelComponent } from './control-panel.component';
         
     | 
| 4 | 
         
            +
             
     | 
| 5 | 
         
            +
            describe('ControlPanelComponent', () => {
         
     | 
| 6 | 
         
            +
              let component: ControlPanelComponent;
         
     | 
| 7 | 
         
            +
              let fixture: ComponentFixture<ControlPanelComponent>;
         
     | 
| 8 | 
         
            +
             
     | 
| 9 | 
         
            +
              beforeEach(async () => {
         
     | 
| 10 | 
         
            +
                await TestBed.configureTestingModule({
         
     | 
| 11 | 
         
            +
                  imports: [ControlPanelComponent]
         
     | 
| 12 | 
         
            +
                })
         
     | 
| 13 | 
         
            +
                .compileComponents();
         
     | 
| 14 | 
         
            +
                
         
     | 
| 15 | 
         
            +
                fixture = TestBed.createComponent(ControlPanelComponent);
         
     | 
| 16 | 
         
            +
                component = fixture.componentInstance;
         
     | 
| 17 | 
         
            +
                fixture.detectChanges();
         
     | 
| 18 | 
         
            +
              });
         
     | 
| 19 | 
         
            +
             
     | 
| 20 | 
         
            +
              it('should create', () => {
         
     | 
| 21 | 
         
            +
                expect(component).toBeTruthy();
         
     | 
| 22 | 
         
            +
              });
         
     | 
| 23 | 
         
            +
            });
         
     | 
    	
        src/app/components/body/control-panel/control-panel.component.ts
    ADDED
    
    | 
         @@ -0,0 +1,110 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            import {Component, OnInit} from '@angular/core';
         
     | 
| 2 | 
         
            +
            import {AppStateService} from "../../../state_management/services/app-state.service";
         
     | 
| 3 | 
         
            +
            import {map} from "rxjs";
         
     | 
| 4 | 
         
            +
            import {AdminLoginComponent} from "./admin-login/admin-login.component";
         
     | 
| 5 | 
         
            +
            import {AsyncPipe, DecimalPipe, NgIf} from "@angular/common";
         
     | 
| 6 | 
         
            +
            import {MatButton} from "@angular/material/button";
         
     | 
| 7 | 
         
            +
            import {MatCard, MatCardContent} from "@angular/material/card";
         
     | 
| 8 | 
         
            +
            import {ControlPanelEntry} from "../../../state_management/models/control-panel-entry.model";
         
     | 
| 9 | 
         
            +
            import {
         
     | 
| 10 | 
         
            +
              MatCell,
         
     | 
| 11 | 
         
            +
              MatCellDef,
         
     | 
| 12 | 
         
            +
              MatColumnDef,
         
     | 
| 13 | 
         
            +
              MatHeaderCell, MatHeaderCellDef,
         
     | 
| 14 | 
         
            +
              MatHeaderRow,
         
     | 
| 15 | 
         
            +
              MatHeaderRowDef,
         
     | 
| 16 | 
         
            +
              MatRow, MatRowDef, MatTable, MatTableDataSource
         
     | 
| 17 | 
         
            +
            } from "@angular/material/table";
         
     | 
| 18 | 
         
            +
            import {FormsModule} from "@angular/forms";
         
     | 
| 19 | 
         
            +
             
     | 
| 20 | 
         
            +
            @Component({
         
     | 
| 21 | 
         
            +
              selector: 'app-control-panel',
         
     | 
| 22 | 
         
            +
              standalone: true,
         
     | 
| 23 | 
         
            +
              imports: [
         
     | 
| 24 | 
         
            +
                AdminLoginComponent,
         
     | 
| 25 | 
         
            +
                NgIf,
         
     | 
| 26 | 
         
            +
                AsyncPipe,
         
     | 
| 27 | 
         
            +
                MatButton,
         
     | 
| 28 | 
         
            +
                MatCard,
         
     | 
| 29 | 
         
            +
                MatCardContent,
         
     | 
| 30 | 
         
            +
                MatCell,
         
     | 
| 31 | 
         
            +
                MatCellDef,
         
     | 
| 32 | 
         
            +
                MatColumnDef,
         
     | 
| 33 | 
         
            +
                MatHeaderCell,
         
     | 
| 34 | 
         
            +
                MatHeaderRow,
         
     | 
| 35 | 
         
            +
                MatHeaderRowDef,
         
     | 
| 36 | 
         
            +
                MatRow,
         
     | 
| 37 | 
         
            +
                MatRowDef,
         
     | 
| 38 | 
         
            +
                MatTable,
         
     | 
| 39 | 
         
            +
                FormsModule,
         
     | 
| 40 | 
         
            +
                MatHeaderCellDef,
         
     | 
| 41 | 
         
            +
                DecimalPipe
         
     | 
| 42 | 
         
            +
              ],
         
     | 
| 43 | 
         
            +
              templateUrl: './control-panel.component.html',
         
     | 
| 44 | 
         
            +
              styleUrl: './control-panel.component.css'
         
     | 
| 45 | 
         
            +
            })
         
     | 
| 46 | 
         
            +
            export class ControlPanelComponent implements OnInit {
         
     | 
| 47 | 
         
            +
             
     | 
| 48 | 
         
            +
              authenticationState = this.stateService.state$.pipe(
         
     | 
| 49 | 
         
            +
                map(state => state.adminSessionStatus)
         
     | 
| 50 | 
         
            +
              );
         
     | 
| 51 | 
         
            +
             
     | 
| 52 | 
         
            +
              submissions = this.stateService.state$.pipe(
         
     | 
| 53 | 
         
            +
                map(
         
     | 
| 54 | 
         
            +
                  state => state.controlPanelSubmissions
         
     | 
| 55 | 
         
            +
                )
         
     | 
| 56 | 
         
            +
              );
         
     | 
| 57 | 
         
            +
             
     | 
| 58 | 
         
            +
              dataSource = new MatTableDataSource<ControlPanelEntry>();
         
     | 
| 59 | 
         
            +
             
     | 
| 60 | 
         
            +
              displayedColumns: string[] = [
         
     | 
| 61 | 
         
            +
                'team', 'task', 'dataset', 'model', 'link', 'email',
         
     | 
| 62 | 
         
            +
                'status', 'time', 'is_public', 'accuracy', 'precision',
         
     | 
| 63 | 
         
            +
                'recall', 'f1_score', 'actions' // Including 'actions' for edit/delete/save buttons
         
     | 
| 64 | 
         
            +
              ];
         
     | 
| 65 | 
         
            +
             
     | 
| 66 | 
         
            +
              editingState: { [key: number]: boolean } = {};
         
     | 
| 67 | 
         
            +
             
     | 
| 68 | 
         
            +
              constructor(private stateService: AppStateService) {
         
     | 
| 69 | 
         
            +
              }
         
     | 
| 70 | 
         
            +
             
     | 
| 71 | 
         
            +
              ngOnInit() {
         
     | 
| 72 | 
         
            +
                this.submissions.subscribe(
         
     | 
| 73 | 
         
            +
                  data => {
         
     | 
| 74 | 
         
            +
                    this.dataSource.data = data;
         
     | 
| 75 | 
         
            +
                  }
         
     | 
| 76 | 
         
            +
                )
         
     | 
| 77 | 
         
            +
                this.refresh();
         
     | 
| 78 | 
         
            +
              }
         
     | 
| 79 | 
         
            +
             
     | 
| 80 | 
         
            +
              refresh() {
         
     | 
| 81 | 
         
            +
                this.stateService.updateControlPanel();
         
     | 
| 82 | 
         
            +
              }
         
     | 
| 83 | 
         
            +
             
     | 
| 84 | 
         
            +
              editRow(entry: ControlPanelEntry) {
         
     | 
| 85 | 
         
            +
                this.editingState[entry.id] = true;
         
     | 
| 86 | 
         
            +
              }
         
     | 
| 87 | 
         
            +
             
     | 
| 88 | 
         
            +
              saveEdit(entry: ControlPanelEntry) {
         
     | 
| 89 | 
         
            +
                this.editingState[entry.id] = false;
         
     | 
| 90 | 
         
            +
                // Modify the entry in the local data source
         
     | 
| 91 | 
         
            +
                const index = this.dataSource.data.findIndex(e => e.id === entry.id);
         
     | 
| 92 | 
         
            +
                this.dataSource.data[index] = entry;
         
     | 
| 93 | 
         
            +
                this.stateService.forceUpdateSubmission(entry);
         
     | 
| 94 | 
         
            +
              }
         
     | 
| 95 | 
         
            +
             
     | 
| 96 | 
         
            +
              deleteRow(id: number) {
         
     | 
| 97 | 
         
            +
                // remove the entry from the local data source
         
     | 
| 98 | 
         
            +
                this.dataSource.data = this.dataSource.data.filter(entry => entry.id !== id);
         
     | 
| 99 | 
         
            +
                this.stateService.deleteSubmission(id);
         
     | 
| 100 | 
         
            +
              }
         
     | 
| 101 | 
         
            +
             
     | 
| 102 | 
         
            +
              isEditing(entry: ControlPanelEntry): boolean {
         
     | 
| 103 | 
         
            +
                return this.editingState[entry.id] || false;
         
     | 
| 104 | 
         
            +
              }
         
     | 
| 105 | 
         
            +
             
     | 
| 106 | 
         
            +
              cancelEdit(entry: ControlPanelEntry) {
         
     | 
| 107 | 
         
            +
                this.editingState[entry.id] = false;
         
     | 
| 108 | 
         
            +
              }
         
     | 
| 109 | 
         
            +
             
     | 
| 110 | 
         
            +
            }
         
     | 
    	
        src/app/state_management/models/control-panel-entry.model.ts
    ADDED
    
    | 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            export interface ControlPanelEntry {
         
     | 
| 2 | 
         
            +
              id: number;
         
     | 
| 3 | 
         
            +
              task: string;
         
     | 
| 4 | 
         
            +
              dataset: string;
         
     | 
| 5 | 
         
            +
              model: string;
         
     | 
| 6 | 
         
            +
              link: string;
         
     | 
| 7 | 
         
            +
              team: string;
         
     | 
| 8 | 
         
            +
              email: string;
         
     | 
| 9 | 
         
            +
              status: string;
         
     | 
| 10 | 
         
            +
              time: string;
         
     | 
| 11 | 
         
            +
              is_public: boolean;
         
     | 
| 12 | 
         
            +
              accuracy: number;
         
     | 
| 13 | 
         
            +
              precision: number;
         
     | 
| 14 | 
         
            +
              recall: number;
         
     | 
| 15 | 
         
            +
              f1_score: number;
         
     | 
| 16 | 
         
            +
            }
         
     | 
    	
        src/app/state_management/models/leaderboard-entry.model.ts
    CHANGED
    
    | 
         @@ -2,10 +2,8 @@ export interface LeaderboardEntry { 
     | 
|
| 2 | 
         
             
                task: string;
         
     | 
| 3 | 
         
             
                dataset: string;
         
     | 
| 4 | 
         
             
                model: string;
         
     | 
| 5 | 
         
            -
                size: number;
         
     | 
| 6 | 
         
             
                accuracy: number;
         
     | 
| 7 | 
         
             
                precision: number;
         
     | 
| 8 | 
         
             
                recall: number;
         
     | 
| 9 | 
         
             
                f1_score: number;
         
     | 
| 10 | 
         
            -
                overall_score: number;
         
     | 
| 11 | 
         
             
            }
         
     | 
| 
         | 
|
| 2 | 
         
             
                task: string;
         
     | 
| 3 | 
         
             
                dataset: string;
         
     | 
| 4 | 
         
             
                model: string;
         
     | 
| 
         | 
|
| 5 | 
         
             
                accuracy: number;
         
     | 
| 6 | 
         
             
                precision: number;
         
     | 
| 7 | 
         
             
                recall: number;
         
     | 
| 8 | 
         
             
                f1_score: number;
         
     | 
| 
         | 
|
| 9 | 
         
             
            }
         
     | 
    	
        src/app/state_management/models/state.model.ts
    CHANGED
    
    | 
         @@ -2,10 +2,14 @@ import {TaskModel} from "./task.mode"; 
     | 
|
| 2 | 
         
             
            import {DatasetModel} from "./dataset.model";
         
     | 
| 3 | 
         
             
            import {SubmissionEntry} from "./submission-entry.model";
         
     | 
| 4 | 
         
             
            import {LeaderboardEntry} from "./leaderboard-entry.model";
         
     | 
| 
         | 
|
| 
         | 
|
| 5 | 
         | 
| 6 | 
         
             
            export interface StateModel{
         
     | 
| 7 | 
         
             
                leaderboards: LeaderboardEntry[];
         
     | 
| 8 | 
         
             
                submissions: SubmissionEntry[];
         
     | 
| 9 | 
         
             
                datasets: DatasetModel[];
         
     | 
| 10 | 
         
             
                tasks: TaskModel[];
         
     | 
| 
         | 
|
| 
         | 
|
| 11 | 
         
             
            }
         
     | 
| 
         | 
|
| 2 | 
         
             
            import {DatasetModel} from "./dataset.model";
         
     | 
| 3 | 
         
             
            import {SubmissionEntry} from "./submission-entry.model";
         
     | 
| 4 | 
         
             
            import {LeaderboardEntry} from "./leaderboard-entry.model";
         
     | 
| 5 | 
         
            +
            import {ControlPanelEntry} from "./control-panel-entry.model";
         
     | 
| 6 | 
         
            +
            import {Observable} from "rxjs";
         
     | 
| 7 | 
         | 
| 8 | 
         
             
            export interface StateModel{
         
     | 
| 9 | 
         
             
                leaderboards: LeaderboardEntry[];
         
     | 
| 10 | 
         
             
                submissions: SubmissionEntry[];
         
     | 
| 11 | 
         
             
                datasets: DatasetModel[];
         
     | 
| 12 | 
         
             
                tasks: TaskModel[];
         
     | 
| 13 | 
         
            +
                controlPanelSubmissions: ControlPanelEntry[];
         
     | 
| 14 | 
         
            +
                adminSessionStatus: string;
         
     | 
| 15 | 
         
             
            }
         
     | 
    	
        src/app/state_management/services/app-state.service.ts
    CHANGED
    
    | 
         @@ -1,8 +1,9 @@ 
     | 
|
| 1 | 
         
             
            import { Injectable } from '@angular/core';
         
     | 
| 2 | 
         
             
            import {environment} from "../../../environments/environment";
         
     | 
| 3 | 
         
            -
            import {BehaviorSubject, Observable} from "rxjs";
         
     | 
| 4 | 
         
             
            import {HttpClient} from "@angular/common/http";
         
     | 
| 5 | 
         
             
            import {StateModel} from "../models/state.model";
         
     | 
| 
         | 
|
| 6 | 
         | 
| 7 | 
         
             
            @Injectable({
         
     | 
| 8 | 
         
             
              providedIn: 'root'
         
     | 
| 
         @@ -15,19 +16,30 @@ export class AppStateService { 
     | 
|
| 15 | 
         
             
                  leaderboards: [],
         
     | 
| 16 | 
         
             
                  submissions: [],
         
     | 
| 17 | 
         
             
                  datasets: [],
         
     | 
| 18 | 
         
            -
                  tasks: []
         
     | 
| 
         | 
|
| 
         | 
|
| 19 | 
         
             
                  }
         
     | 
| 20 | 
         
             
              );
         
     | 
| 21 | 
         | 
| 22 | 
         
             
              public readonly state$ = this._state.asObservable();
         
     | 
| 23 | 
         | 
| 24 | 
         
            -
              constructor(public http: HttpClient 
     | 
| 
         | 
|
| 25 | 
         
             
                console.log('AppStateService created');
         
     | 
| 26 | 
         
             
                console.log(this._apiUrl)
         
     | 
| 27 | 
         
             
                this.updateTasks();
         
     | 
| 28 | 
         
             
                this.updateDatasets();
         
     | 
| 29 | 
         
             
                this.updateLeaderboards();
         
     | 
| 30 | 
         
             
                this.updateSubmissions();
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 31 | 
         
             
              }
         
     | 
| 32 | 
         | 
| 33 | 
         
             
              private _setState(state: StateModel): void {
         
     | 
| 
         @@ -102,4 +114,50 @@ export class AppStateService { 
     | 
|
| 102 | 
         
             
                  }
         
     | 
| 103 | 
         
             
                );
         
     | 
| 104 | 
         
             
              }
         
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 105 | 
         
             
            }
         
     | 
| 
         | 
|
| 1 | 
         
             
            import { Injectable } from '@angular/core';
         
     | 
| 2 | 
         
             
            import {environment} from "../../../environments/environment";
         
     | 
| 3 | 
         
            +
            import {BehaviorSubject, catchError, Observable} from "rxjs";
         
     | 
| 4 | 
         
             
            import {HttpClient} from "@angular/common/http";
         
     | 
| 5 | 
         
             
            import {StateModel} from "../models/state.model";
         
     | 
| 6 | 
         
            +
            import {AuthenticationService} from "./authentication.service";
         
     | 
| 7 | 
         | 
| 8 | 
         
             
            @Injectable({
         
     | 
| 9 | 
         
             
              providedIn: 'root'
         
     | 
| 
         | 
|
| 16 | 
         
             
                  leaderboards: [],
         
     | 
| 17 | 
         
             
                  submissions: [],
         
     | 
| 18 | 
         
             
                  datasets: [],
         
     | 
| 19 | 
         
            +
                  tasks: [],
         
     | 
| 20 | 
         
            +
                  controlPanelSubmissions: [],
         
     | 
| 21 | 
         
            +
                  adminSessionStatus: ''
         
     | 
| 22 | 
         
             
                  }
         
     | 
| 23 | 
         
             
              );
         
     | 
| 24 | 
         | 
| 25 | 
         
             
              public readonly state$ = this._state.asObservable();
         
     | 
| 26 | 
         | 
| 27 | 
         
            +
              constructor(public http: HttpClient,
         
     | 
| 28 | 
         
            +
                          public authService: AuthenticationService) {
         
     | 
| 29 | 
         
             
                console.log('AppStateService created');
         
     | 
| 30 | 
         
             
                console.log(this._apiUrl)
         
     | 
| 31 | 
         
             
                this.updateTasks();
         
     | 
| 32 | 
         
             
                this.updateDatasets();
         
     | 
| 33 | 
         
             
                this.updateLeaderboards();
         
     | 
| 34 | 
         
             
                this.updateSubmissions();
         
     | 
| 35 | 
         
            +
                authService.$authStatus.subscribe(
         
     | 
| 36 | 
         
            +
                  (status: string) => {
         
     | 
| 37 | 
         
            +
                    this._setState({
         
     | 
| 38 | 
         
            +
                      ...this.getState(),
         
     | 
| 39 | 
         
            +
                      adminSessionStatus: status
         
     | 
| 40 | 
         
            +
                    });
         
     | 
| 41 | 
         
            +
                  }
         
     | 
| 42 | 
         
            +
                );
         
     | 
| 43 | 
         
             
              }
         
     | 
| 44 | 
         | 
| 45 | 
         
             
              private _setState(state: StateModel): void {
         
     | 
| 
         | 
|
| 114 | 
         
             
                  }
         
     | 
| 115 | 
         
             
                );
         
     | 
| 116 | 
         
             
              }
         
     | 
| 117 | 
         
            +
             
     | 
| 118 | 
         
            +
              public authenticate(password : string) {
         
     | 
| 119 | 
         
            +
                this.authService.login(password).subscribe(
         
     | 
| 120 | 
         
            +
                  () => {
         
     | 
| 121 | 
         
            +
                    this.updateControlPanel();
         
     | 
| 122 | 
         
            +
                  }
         
     | 
| 123 | 
         
            +
                );
         
     | 
| 124 | 
         
            +
              }
         
     | 
| 125 | 
         
            +
             
     | 
| 126 | 
         
            +
              public updateControlPanel() {
         
     | 
| 127 | 
         
            +
                const headers = this.authService.getAuthHeaders();
         
     | 
| 128 | 
         
            +
                this.http.get(`${this._apiUrl}/controlPanelSubmissions`, { headers }).subscribe(
         
     | 
| 129 | 
         
            +
                  (data: any) => {
         
     | 
| 130 | 
         
            +
                    this._setState({
         
     | 
| 131 | 
         
            +
                      ...this.getState(),
         
     | 
| 132 | 
         
            +
                      controlPanelSubmissions: data
         
     | 
| 133 | 
         
            +
                    });
         
     | 
| 134 | 
         
            +
                  }
         
     | 
| 135 | 
         
            +
                );
         
     | 
| 136 | 
         
            +
              }
         
     | 
| 137 | 
         
            +
             
     | 
| 138 | 
         
            +
              public forceUpdateSubmission(entry: any){
         
     | 
| 139 | 
         
            +
                const headers = this.authService.getAuthHeaders();
         
     | 
| 140 | 
         
            +
                this.http.put(`${this._apiUrl}/controlPanelSubmission/${entry.id}`, entry, { headers }).subscribe(
         
     | 
| 141 | 
         
            +
                  () => {
         
     | 
| 142 | 
         
            +
                    this.updateControlPanel();
         
     | 
| 143 | 
         
            +
                  }
         
     | 
| 144 | 
         
            +
                );
         
     | 
| 145 | 
         
            +
              }
         
     | 
| 146 | 
         
            +
             
     | 
| 147 | 
         
            +
              public deleteSubmission(id: number){
         
     | 
| 148 | 
         
            +
                const headers = this.authService.getAuthHeaders();
         
     | 
| 149 | 
         
            +
                console.log('Deleting submission with id: ' + id);
         
     | 
| 150 | 
         
            +
                this.http.delete(`${this._apiUrl}/controlPanelSubmission/` + id, { headers })
         
     | 
| 151 | 
         
            +
                  .pipe(
         
     | 
| 152 | 
         
            +
                    catchError(error => {
         
     | 
| 153 | 
         
            +
                      console.log(error);
         
     | 
| 154 | 
         
            +
                      return error;
         
     | 
| 155 | 
         
            +
                    }
         
     | 
| 156 | 
         
            +
                  ))
         
     | 
| 157 | 
         
            +
                  .subscribe(
         
     | 
| 158 | 
         
            +
                  () => {
         
     | 
| 159 | 
         
            +
                    this.updateControlPanel();
         
     | 
| 160 | 
         
            +
                  }
         
     | 
| 161 | 
         
            +
                );
         
     | 
| 162 | 
         
            +
              }
         
     | 
| 163 | 
         
             
            }
         
     | 
    	
        src/app/state_management/services/authentication.service.spec.ts
    ADDED
    
    | 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            import { TestBed } from '@angular/core/testing';
         
     | 
| 2 | 
         
            +
             
     | 
| 3 | 
         
            +
            import { AuthenticationService } from './authentication.service';
         
     | 
| 4 | 
         
            +
             
     | 
| 5 | 
         
            +
            describe('AuthenticationService', () => {
         
     | 
| 6 | 
         
            +
              let service: AuthenticationService;
         
     | 
| 7 | 
         
            +
             
     | 
| 8 | 
         
            +
              beforeEach(() => {
         
     | 
| 9 | 
         
            +
                TestBed.configureTestingModule({});
         
     | 
| 10 | 
         
            +
                service = TestBed.inject(AuthenticationService);
         
     | 
| 11 | 
         
            +
              });
         
     | 
| 12 | 
         
            +
             
     | 
| 13 | 
         
            +
              it('should be created', () => {
         
     | 
| 14 | 
         
            +
                expect(service).toBeTruthy();
         
     | 
| 15 | 
         
            +
              });
         
     | 
| 16 | 
         
            +
            });
         
     | 
    	
        src/app/state_management/services/authentication.service.ts
    ADDED
    
    | 
         @@ -0,0 +1,74 @@ 
     | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
| 
         | 
|
| 1 | 
         
            +
            import {Injectable} from '@angular/core';
         
     | 
| 2 | 
         
            +
            import {HttpClient, HttpHeaders} from "@angular/common/http";
         
     | 
| 3 | 
         
            +
            import {BehaviorSubject, catchError, Observable, tap, throwError} from "rxjs";
         
     | 
| 4 | 
         
            +
            import {environment} from "../../../environments/environment";
         
     | 
| 5 | 
         
            +
             
     | 
| 6 | 
         
            +
            @Injectable({
         
     | 
| 7 | 
         
            +
              providedIn: 'root'
         
     | 
| 8 | 
         
            +
            })
         
     | 
| 9 | 
         
            +
            export class AuthenticationService {
         
     | 
| 10 | 
         
            +
             
     | 
| 11 | 
         
            +
              private readonly apiUrl = environment.apiUrl;
         
     | 
| 12 | 
         
            +
              private token: string | null = this.getTokenFromLocalStorage();
         
     | 
| 13 | 
         
            +
              public $authStatus = new BehaviorSubject<string>(
         
     | 
| 14 | 
         
            +
                this.token !== null ? 'authenticated' : ''
         
     | 
| 15 | 
         
            +
              );
         
     | 
| 16 | 
         
            +
             
     | 
| 17 | 
         
            +
             
     | 
| 18 | 
         
            +
              constructor(
         
     | 
| 19 | 
         
            +
                private http: HttpClient
         
     | 
| 20 | 
         
            +
              ) {
         
     | 
| 21 | 
         
            +
             
     | 
| 22 | 
         
            +
              }
         
     | 
| 23 | 
         
            +
             
     | 
| 24 | 
         
            +
              private getTokenFromLocalStorage(): string | null {
         
     | 
| 25 | 
         
            +
                try {
         
     | 
| 26 | 
         
            +
                  return localStorage.getItem('auth_token');
         
     | 
| 27 | 
         
            +
                } catch (e) {
         
     | 
| 28 | 
         
            +
                  return null;
         
     | 
| 29 | 
         
            +
                }
         
     | 
| 30 | 
         
            +
              }
         
     | 
| 31 | 
         
            +
             
     | 
| 32 | 
         
            +
              public getAuthHeaders(): HttpHeaders {
         
     | 
| 33 | 
         
            +
                return new HttpHeaders({
         
     | 
| 34 | 
         
            +
                  'Content-Type': 'application/json',
         
     | 
| 35 | 
         
            +
                  Authorization: `Bearer ${this.token}`,
         
     | 
| 36 | 
         
            +
                });
         
     | 
| 37 | 
         
            +
              }
         
     | 
| 38 | 
         
            +
             
     | 
| 39 | 
         
            +
              public login(password: string): Observable<{ access_token: string; token_type: string }> {
         
     | 
| 40 | 
         
            +
                // Create the request payload
         
     | 
| 41 | 
         
            +
                const payload = new URLSearchParams();
         
     | 
| 42 | 
         
            +
                payload.set('username', 'admin'); // Username is not used in this case
         
     | 
| 43 | 
         
            +
                payload.set('password', password);
         
     | 
| 44 | 
         
            +
             
     | 
| 45 | 
         
            +
                // Send POST request to the backend
         
     | 
| 46 | 
         
            +
                return this.http.post<{ access_token: string; token_type: string }>
         
     | 
| 47 | 
         
            +
                (
         
     | 
| 48 | 
         
            +
                  this.apiUrl + '/token', payload.toString(),
         
     | 
| 49 | 
         
            +
                  {
         
     | 
| 50 | 
         
            +
                    headers: {
         
     | 
| 51 | 
         
            +
                      'Content-Type': 'application/x-www-form-urlencoded', // Set content type for form data
         
     | 
| 52 | 
         
            +
                    },
         
     | 
| 53 | 
         
            +
                  }).pipe(
         
     | 
| 54 | 
         
            +
                  tap(response => {
         
     | 
| 55 | 
         
            +
                    this.token = response.access_token;
         
     | 
| 56 | 
         
            +
                    localStorage.setItem('auth_token', this.token);
         
     | 
| 57 | 
         
            +
                    this.$authStatus.next('authenticated');
         
     | 
| 58 | 
         
            +
                  }),
         
     | 
| 59 | 
         
            +
                  catchError(error => {
         
     | 
| 60 | 
         
            +
                    if (error.status === 401) {
         
     | 
| 61 | 
         
            +
                      this.$authStatus.next('wrong password');
         
     | 
| 62 | 
         
            +
                    } else {
         
     | 
| 63 | 
         
            +
                      this.$authStatus.next('server error');
         
     | 
| 64 | 
         
            +
                    }
         
     | 
| 65 | 
         
            +
                    // Return an observable to continue the stream
         
     | 
| 66 | 
         
            +
                    return throwError(() => error);
         
     | 
| 67 | 
         
            +
                  })
         
     | 
| 68 | 
         
            +
                );
         
     | 
| 69 | 
         
            +
              }
         
     | 
| 70 | 
         
            +
             
     | 
| 71 | 
         
            +
              public isAuthenticated(): boolean {
         
     | 
| 72 | 
         
            +
                return this.token !== null;
         
     | 
| 73 | 
         
            +
              }
         
     | 
| 74 | 
         
            +
            }
         
     | 
    	
        src/styles.css
    CHANGED
    
    | 
         @@ -2,9 +2,7 @@ 
     | 
|
| 2 | 
         | 
| 3 | 
         
             
            html, body { height: 100%; }
         
     | 
| 4 | 
         
             
            body {
         
     | 
| 5 | 
         
            -
              margin 
     | 
| 6 | 
         
            -
              margin-right: 3%;
         
     | 
| 7 | 
         
            -
              margin-top: 0;
         
     | 
| 8 | 
         
             
              font-family: Roboto, "Helvetica Neue", sans-serif;
         
     | 
| 9 | 
         
             
              font-size: 15px;
         
     | 
| 10 | 
         
             
            }
         
     | 
| 
         | 
|
| 2 | 
         | 
| 3 | 
         
             
            html, body { height: 100%; }
         
     | 
| 4 | 
         
             
            body {
         
     | 
| 5 | 
         
            +
              margin: 1%;
         
     | 
| 
         | 
|
| 
         | 
|
| 6 | 
         
             
              font-family: Roboto, "Helvetica Neue", sans-serif;
         
     | 
| 7 | 
         
             
              font-size: 15px;
         
     | 
| 8 | 
         
             
            }
         
     |