From be8c722eb7a1645bff90fe82c34c486be892abd2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 5 Jun 2023 11:29:42 +0200 Subject: [PATCH] code base copy --- .gitignore | 1 + plp-angular/.browserslistrc | 12 + plp-angular/.editorconfig | 13 + plp-angular/.gitignore | 49 + plp-angular/.htaccess | 84 + plp-angular/.htpasswd | 1 + plp-angular/README.md | 27 + plp-angular/angular.json | 149 + plp-angular/e2e/protractor.conf.js | 32 + plp-angular/e2e/src/app.e2e-spec.ts | 23 + plp-angular/e2e/src/app.po.ts | 11 + plp-angular/e2e/tsconfig.json | 13 + plp-angular/karma.conf.js | 32 + plp-angular/package-lock.json | 12215 ++++++++++++++++ plp-angular/package.json | 58 + plp-angular/src/app/app-routing.module.ts | 39 + plp-angular/src/app/app.component.html | 16 + plp-angular/src/app/app.component.scss | 0 plp-angular/src/app/app.component.ts | 53 + plp-angular/src/app/app.module.ts | 151 + .../app/components/ag-grid-component-const.ts | 158 + .../src/app/components/ag-grid-component.ts | 466 + .../app/components/aside/aside.component.html | 9 + .../app/components/aside/aside.component.scss | 0 .../app/components/aside/aside.component.ts | 37 + .../calendar-legend.component.html | 3 + .../calendar-legend.component.scss | 0 .../calendar-legend.component.ts | 34 + .../src/app/components/form-component.ts | 37 + .../components/message/message.component.html | 18 + .../components/message/message.component.scss | 0 .../components/message/message.component.ts | 141 + .../app/components/modal/modal.component.html | 8 + .../app/components/modal/modal.component.scss | 0 .../app/components/modal/modal.component.ts | 79 + .../src/app/components/tab/tab.component.html | 3 + .../src/app/components/tab/tab.component.scss | 0 .../src/app/components/tab/tab.component.ts | 21 + .../app/components/tabs/tabs.component.html | 10 + .../app/components/tabs/tabs.component.scss | 0 .../src/app/components/tabs/tabs.component.ts | 99 + plp-angular/src/app/factory/factory.ts | 186 + .../grid-blocked-editor.component.html | 1 + .../grid-blocked-editor.component.scss | 1 + .../grid-blocked-editor.component.ts | 19 + .../grid-blocked-renderer.component.html | 1 + .../grid-blocked-renderer.component.scss | 0 .../grid-blocked-renderer.component.ts | 21 + .../grid-cell-editor-params.ts | 9 + .../app/grid-cellrenderer/grid-cell-params.ts | 8 + .../grid-checkbox-editor.component.html | 3 + .../grid-checkbox-editor.component.scss | 0 .../grid-checkbox-editor.component.ts | 41 + .../grid-checkbox-renderer.component.html | 8 + .../grid-checkbox-renderer.component.scss | 0 .../grid-checkbox-renderer.component.ts | 34 + .../grid-date-editor.component.html | 1 + .../grid-date-editor.component.scss | 0 .../grid-date-editor.component.ts | 12 + .../grid-date-renderer.component.html | 1 + .../grid-date-renderer.component.scss | 0 .../grid-date-renderer.component.ts | 27 + .../grid-editor-component.ts | 82 + .../src/app/grid-cellrenderer/grid-factory.ts | 20 + .../grid-input-editor.component.html | 1 + .../grid-input-editor.component.scss | 0 .../grid-input-editor.component.ts | 107 + .../grid-input-renderer.component.html | 1 + .../grid-input-renderer.component.scss | 0 .../grid-input-renderer.component.ts | 27 + .../grid-renderer-component.ts | 49 + .../grid-select-editor.component.html | 4 + .../grid-select-editor.component.scss | 8 + .../grid-select-editor.component.ts | 104 + .../grid-select/grid-select-factory.ts | 123 + .../grid-select/grid-select-item.ts | 4 + .../grid-select-renderer.component.html | 1 + .../grid-select-renderer.component.scss | 0 .../grid-select-renderer.component.ts | 83 + .../grid-text-editor.component.html | 0 .../grid-text-editor.component.scss | 0 .../grid-text-editor.component.ts | 24 + .../grid-text-renderer.component.html | 1 + .../grid-text-renderer.component.scss | 0 .../grid-text-renderer.component.ts | 27 + .../src/app/interceptor/route-interceptor.ts | 34 + plp-angular/src/app/lang/ag-gridlocale.ts | 96 + plp-angular/src/app/model/constants/tools.ts | 24 + .../src/app/model/entities/calendar-legend.ts | 5 + plp-angular/src/app/model/entities/country.ts | 5 + .../app/model/entities/customer-contact.ts | 21 + .../entities/customer-meeting-participant.ts | 6 + .../app/model/entities/customer-meeting.ts | 24 + .../src/app/model/entities/customer-note.ts | 22 + .../src/app/model/entities/customer.ts | 26 + .../entities/internal-meeting-participant.ts | 6 + .../app/model/entities/internal-meeting.ts | 9 + .../src/app/model/entities/meeting-type.ts | 6 + .../src/app/model/entities/user-type.ts | 7 + plp-angular/src/app/model/entities/user.ts | 12 + .../app/model/interface/entity-interface.ts | 3 + .../app/model/interface/meeting-interface.ts | 13 + .../src/app/model/virtual/api-response.ts | 13 + .../model/virtual/app-service-data-item.ts | 7 + .../src/app/model/virtual/app-service-data.ts | 17 + plp-angular/src/app/model/virtual/config.ts | 12 + .../src/app/model/virtual/customer-data.ts | 9 + .../model/virtual/grid-validation-errors.ts | 4 + .../src/app/model/virtual/login-state.ts | 10 + .../src/app/model/virtual/meeting-data.ts | 7 + plp-angular/src/app/model/virtual/message.ts | 10 + plp-angular/src/app/model/virtual/role.ts | 5 + plp-angular/src/app/services/app.service.ts | 148 + plp-angular/src/app/services/cache.service.ts | 36 + .../src/app/services/common.service.ts | 46 + .../src/app/services/customer.service.ts | 197 + .../src/app/services/http.interceptor.ts | 18 + plp-angular/src/app/services/http.service.ts | 167 + .../src/app/services/meeting.service.ts | 223 + .../src/app/services/message.service.ts | 69 + plp-angular/src/app/utils/const.ts | 25 + plp-angular/src/app/utils/service-helper.ts | 42 + .../src/app/utils/tools-error-handler.ts | 11 + plp-angular/src/app/utils/utils.ts | 185 + .../accounting/accounting.component.html | 1 + .../accounting/accounting.component.scss | 0 .../views/accounting/accounting.component.ts | 16 + .../customer-contact-list.component.html | 28 + .../customer-contact-list.component.scss | 11 + .../customer-contact-list.component.ts | 159 + .../customer-list.component.html | 23 + .../customer-list.component.scss | 14 + .../customer-list/customer-list.component.ts | 112 + .../customer-management.component.html | 33 + .../customer-management.component.scss | 0 .../customer-management.component.ts | 265 + ...tomer-contact-person-detail.component.html | 50 + ...tomer-contact-person-detail.component.scss | 0 ...ustomer-contact-person-detail.component.ts | 99 + ...ustomer-contact-person-edit.component.html | 135 + ...ustomer-contact-person-edit.component.scss | 0 .../customer-contact-person-edit.component.ts | 76 + ...ustomer-contact-person-view.component.html | 35 + ...ustomer-contact-person-view.component.scss | 14 + .../customer-contact-person-view.component.ts | 172 + .../customer-data-edit.component.html | 127 + .../customer-data-edit.component.scss | 0 .../customer-data-edit.component.ts | 75 + .../customer-data-view.component.html | 40 + .../customer-data-view.component.scss | 0 .../customer-data-view.component.ts | 65 + .../customer-meeting-detail.component.html | 80 + .../customer-meeting-detail.component.scss | 0 .../customer-meeting-detail.component.ts | 199 + .../customer-meeting-edit.component.html | 208 + .../customer-meeting-edit.component.scss | 0 .../customer-meeting-edit.component.ts | 248 + .../customer-meeting-view.component.html | 33 + .../customer-meeting-view.component.scss | 14 + .../customer-meeting-view.component.ts | 192 + .../customer-note-detail.component.html | 44 + .../customer-note-detail.component.scss | 0 .../customer-note-detail.component.ts | 92 + .../customer-note-edit.component.html | 127 + .../customer-note-edit.component.scss | 0 .../customer-note-edit.component.ts | 120 + .../customer-note-view.component.html | 32 + .../customer-note-view.component.scss | 14 + .../customer-note-view.component.ts | 154 + .../customer-view.component.html | 32 + .../customer-view.component.scss | 0 .../customer-view/customer-view.component.ts | 155 + .../src/app/views/login/login.component.html | 34 + .../src/app/views/login/login.component.scss | 0 .../src/app/views/login/login.component.ts | 75 + .../src/app/views/sales/sales.component.html | 1 + .../src/app/views/sales/sales.component.scss | 0 .../src/app/views/sales/sales.component.ts | 16 + .../internal-meeting-detail.component.html | 57 + .../internal-meeting-detail.component.scss | 0 .../internal-meeting-detail.component.ts | 182 + .../internal-meeting-edit.component.html | 98 + .../internal-meeting-edit.component.scss | 0 .../internal-meeting-edit.component.ts | 198 + .../meeting-calendar.component.html | 43 + .../meeting-calendar.component.scss | 0 .../meeting-calendar.component.ts | 320 + .../meeting-list/meeting-list.component.html | 30 + .../meeting-list/meeting-list.component.scss | 18 + .../meeting-list/meeting-list.component.ts | 199 + .../src/app/views/start/start.component.html | 43 + .../src/app/views/start/start.component.scss | 18 + .../src/app/views/start/start.component.ts | 209 + .../views/technique/technique.component.html | 1 + .../views/technique/technique.component.scss | 0 .../views/technique/technique.component.ts | 16 + plp-angular/src/assets/.gitkeep | 0 plp-angular/src/assets/apple-touch-icon.png | Bin 0 -> 14674 bytes plp-angular/src/assets/elements/close-x.svg | 17 + .../src/assets/elements/select-arrow.svg | 1 + plp-angular/src/assets/elements/spinner.gif | Bin 0 -> 129285 bytes plp-angular/src/assets/favicon-small.png | Bin 0 -> 3704 bytes plp-angular/src/assets/favicon.png | Bin 0 -> 8503 bytes plp-angular/src/assets/mstile-144x144.png | Bin 0 -> 12254 bytes plp-angular/src/assets/wall.png | Bin 0 -> 8769 bytes .../src/environments/environment.beta.ts | 14 + .../src/environments/environment.gamma.ts | 14 + .../src/environments/environment.prod.ts | 3 + plp-angular/src/environments/environment.ts | 33 + plp-angular/src/environments/path.ts | 11 + plp-angular/src/favicon.ico | Bin 0 -> 3128 bytes plp-angular/src/index.html | 19 + plp-angular/src/main.ts | 12 + plp-angular/src/polyfills.ts | 63 + plp-angular/src/scss/_reset.scss | 367 + plp-angular/src/scss/_variables.scss | 20 + plp-angular/src/scss/components/_ag-grid.scss | 37 + .../src/scss/components/_breadcrumb.scss | 24 + .../src/scss/components/_calendar.scss | 87 + plp-angular/src/scss/components/_forms.scss | 202 + plp-angular/src/scss/components/_message.scss | 64 + plp-angular/src/scss/components/_modal.scss | 93 + .../src/scss/components/_navigation.scss | 17 + .../src/scss/components/_search_bar.scss | 49 + .../src/scss/components/_structure.scss | 245 + plp-angular/src/scss/components/_tabs.scss | 73 + plp-angular/src/scss/styles.scss | 111 + plp-angular/src/test.ts | 20 + plp-angular/tsconfig.app.json | 21 + plp-angular/tsconfig.json | 26 + plp-angular/tsconfig.spec.json | 18 + plp-angular/tslint.json | 155 + 232 files changed, 23389 insertions(+) create mode 100644 .gitignore create mode 100644 plp-angular/.browserslistrc create mode 100644 plp-angular/.editorconfig create mode 100644 plp-angular/.gitignore create mode 100644 plp-angular/.htaccess create mode 100644 plp-angular/.htpasswd create mode 100644 plp-angular/README.md create mode 100644 plp-angular/angular.json create mode 100644 plp-angular/e2e/protractor.conf.js create mode 100644 plp-angular/e2e/src/app.e2e-spec.ts create mode 100644 plp-angular/e2e/src/app.po.ts create mode 100644 plp-angular/e2e/tsconfig.json create mode 100644 plp-angular/karma.conf.js create mode 100644 plp-angular/package-lock.json create mode 100644 plp-angular/package.json create mode 100644 plp-angular/src/app/app-routing.module.ts create mode 100644 plp-angular/src/app/app.component.html create mode 100644 plp-angular/src/app/app.component.scss create mode 100644 plp-angular/src/app/app.component.ts create mode 100644 plp-angular/src/app/app.module.ts create mode 100644 plp-angular/src/app/components/ag-grid-component-const.ts create mode 100644 plp-angular/src/app/components/ag-grid-component.ts create mode 100644 plp-angular/src/app/components/aside/aside.component.html create mode 100644 plp-angular/src/app/components/aside/aside.component.scss create mode 100644 plp-angular/src/app/components/aside/aside.component.ts create mode 100644 plp-angular/src/app/components/calendar-legend/calendar-legend.component.html create mode 100644 plp-angular/src/app/components/calendar-legend/calendar-legend.component.scss create mode 100644 plp-angular/src/app/components/calendar-legend/calendar-legend.component.ts create mode 100644 plp-angular/src/app/components/form-component.ts create mode 100644 plp-angular/src/app/components/message/message.component.html create mode 100644 plp-angular/src/app/components/message/message.component.scss create mode 100644 plp-angular/src/app/components/message/message.component.ts create mode 100644 plp-angular/src/app/components/modal/modal.component.html create mode 100644 plp-angular/src/app/components/modal/modal.component.scss create mode 100644 plp-angular/src/app/components/modal/modal.component.ts create mode 100644 plp-angular/src/app/components/tab/tab.component.html create mode 100644 plp-angular/src/app/components/tab/tab.component.scss create mode 100644 plp-angular/src/app/components/tab/tab.component.ts create mode 100644 plp-angular/src/app/components/tabs/tabs.component.html create mode 100644 plp-angular/src/app/components/tabs/tabs.component.scss create mode 100644 plp-angular/src/app/components/tabs/tabs.component.ts create mode 100644 plp-angular/src/app/factory/factory.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-cell-editor-params.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-cell-params.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-editor-component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-factory.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-renderer-component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-factory.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-item.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.ts create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.html create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.scss create mode 100644 plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.ts create mode 100644 plp-angular/src/app/interceptor/route-interceptor.ts create mode 100644 plp-angular/src/app/lang/ag-gridlocale.ts create mode 100644 plp-angular/src/app/model/constants/tools.ts create mode 100644 plp-angular/src/app/model/entities/calendar-legend.ts create mode 100644 plp-angular/src/app/model/entities/country.ts create mode 100644 plp-angular/src/app/model/entities/customer-contact.ts create mode 100644 plp-angular/src/app/model/entities/customer-meeting-participant.ts create mode 100644 plp-angular/src/app/model/entities/customer-meeting.ts create mode 100644 plp-angular/src/app/model/entities/customer-note.ts create mode 100644 plp-angular/src/app/model/entities/customer.ts create mode 100644 plp-angular/src/app/model/entities/internal-meeting-participant.ts create mode 100644 plp-angular/src/app/model/entities/internal-meeting.ts create mode 100644 plp-angular/src/app/model/entities/meeting-type.ts create mode 100644 plp-angular/src/app/model/entities/user-type.ts create mode 100644 plp-angular/src/app/model/entities/user.ts create mode 100644 plp-angular/src/app/model/interface/entity-interface.ts create mode 100644 plp-angular/src/app/model/interface/meeting-interface.ts create mode 100644 plp-angular/src/app/model/virtual/api-response.ts create mode 100644 plp-angular/src/app/model/virtual/app-service-data-item.ts create mode 100644 plp-angular/src/app/model/virtual/app-service-data.ts create mode 100644 plp-angular/src/app/model/virtual/config.ts create mode 100644 plp-angular/src/app/model/virtual/customer-data.ts create mode 100644 plp-angular/src/app/model/virtual/grid-validation-errors.ts create mode 100644 plp-angular/src/app/model/virtual/login-state.ts create mode 100644 plp-angular/src/app/model/virtual/meeting-data.ts create mode 100644 plp-angular/src/app/model/virtual/message.ts create mode 100644 plp-angular/src/app/model/virtual/role.ts create mode 100644 plp-angular/src/app/services/app.service.ts create mode 100644 plp-angular/src/app/services/cache.service.ts create mode 100644 plp-angular/src/app/services/common.service.ts create mode 100644 plp-angular/src/app/services/customer.service.ts create mode 100644 plp-angular/src/app/services/http.interceptor.ts create mode 100644 plp-angular/src/app/services/http.service.ts create mode 100644 plp-angular/src/app/services/meeting.service.ts create mode 100644 plp-angular/src/app/services/message.service.ts create mode 100644 plp-angular/src/app/utils/const.ts create mode 100644 plp-angular/src/app/utils/service-helper.ts create mode 100644 plp-angular/src/app/utils/tools-error-handler.ts create mode 100644 plp-angular/src/app/utils/utils.ts create mode 100644 plp-angular/src/app/views/accounting/accounting.component.html create mode 100644 plp-angular/src/app/views/accounting/accounting.component.scss create mode 100644 plp-angular/src/app/views/accounting/accounting.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-list/customer-list.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-list/customer-list.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-list/customer-list.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-management.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-management.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-management.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.ts create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-view.component.html create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-view.component.scss create mode 100644 plp-angular/src/app/views/customer-management/customer-view/customer-view.component.ts create mode 100644 plp-angular/src/app/views/login/login.component.html create mode 100644 plp-angular/src/app/views/login/login.component.scss create mode 100644 plp-angular/src/app/views/login/login.component.ts create mode 100644 plp-angular/src/app/views/sales/sales.component.html create mode 100644 plp-angular/src/app/views/sales/sales.component.scss create mode 100644 plp-angular/src/app/views/sales/sales.component.ts create mode 100644 plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.html create mode 100644 plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.scss create mode 100644 plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.ts create mode 100644 plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.html create mode 100644 plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.scss create mode 100644 plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.ts create mode 100644 plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.html create mode 100644 plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.scss create mode 100644 plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.ts create mode 100644 plp-angular/src/app/views/start/meeting-list/meeting-list.component.html create mode 100644 plp-angular/src/app/views/start/meeting-list/meeting-list.component.scss create mode 100644 plp-angular/src/app/views/start/meeting-list/meeting-list.component.ts create mode 100644 plp-angular/src/app/views/start/start.component.html create mode 100644 plp-angular/src/app/views/start/start.component.scss create mode 100644 plp-angular/src/app/views/start/start.component.ts create mode 100644 plp-angular/src/app/views/technique/technique.component.html create mode 100644 plp-angular/src/app/views/technique/technique.component.scss create mode 100644 plp-angular/src/app/views/technique/technique.component.ts create mode 100644 plp-angular/src/assets/.gitkeep create mode 100644 plp-angular/src/assets/apple-touch-icon.png create mode 100644 plp-angular/src/assets/elements/close-x.svg create mode 100644 plp-angular/src/assets/elements/select-arrow.svg create mode 100644 plp-angular/src/assets/elements/spinner.gif create mode 100644 plp-angular/src/assets/favicon-small.png create mode 100644 plp-angular/src/assets/favicon.png create mode 100644 plp-angular/src/assets/mstile-144x144.png create mode 100644 plp-angular/src/assets/wall.png create mode 100644 plp-angular/src/environments/environment.beta.ts create mode 100644 plp-angular/src/environments/environment.gamma.ts create mode 100644 plp-angular/src/environments/environment.prod.ts create mode 100644 plp-angular/src/environments/environment.ts create mode 100644 plp-angular/src/environments/path.ts create mode 100644 plp-angular/src/favicon.ico create mode 100644 plp-angular/src/index.html create mode 100644 plp-angular/src/main.ts create mode 100644 plp-angular/src/polyfills.ts create mode 100644 plp-angular/src/scss/_reset.scss create mode 100644 plp-angular/src/scss/_variables.scss create mode 100644 plp-angular/src/scss/components/_ag-grid.scss create mode 100644 plp-angular/src/scss/components/_breadcrumb.scss create mode 100644 plp-angular/src/scss/components/_calendar.scss create mode 100644 plp-angular/src/scss/components/_forms.scss create mode 100644 plp-angular/src/scss/components/_message.scss create mode 100644 plp-angular/src/scss/components/_modal.scss create mode 100644 plp-angular/src/scss/components/_navigation.scss create mode 100644 plp-angular/src/scss/components/_search_bar.scss create mode 100644 plp-angular/src/scss/components/_structure.scss create mode 100644 plp-angular/src/scss/components/_tabs.scss create mode 100644 plp-angular/src/scss/styles.scss create mode 100644 plp-angular/src/test.ts create mode 100644 plp-angular/tsconfig.app.json create mode 100644 plp-angular/tsconfig.json create mode 100644 plp-angular/tsconfig.spec.json create mode 100644 plp-angular/tslint.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a09c56d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.idea diff --git a/plp-angular/.browserslistrc b/plp-angular/.browserslistrc new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/plp-angular/.browserslistrc @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/plp-angular/.editorconfig b/plp-angular/.editorconfig new file mode 100644 index 0000000..b585a76 --- /dev/null +++ b/plp-angular/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/plp-angular/.gitignore b/plp-angular/.gitignore new file mode 100644 index 0000000..67cb607 --- /dev/null +++ b/plp-angular/.gitignore @@ -0,0 +1,49 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +# cache etc +/.angular diff --git a/plp-angular/.htaccess b/plp-angular/.htaccess new file mode 100644 index 0000000..385fcfa --- /dev/null +++ b/plp-angular/.htaccess @@ -0,0 +1,84 @@ +RewriteEngine on + +# Don't rewrite files or directories +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Rewrite everything else to index.html to allow html5 state links +RewriteRule ^ index.html [L] + + +# Enable Compression + + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/vnd.ms-fontobject + AddOutputFilterByType DEFLATE application/x-font + AddOutputFilterByType DEFLATE application/x-font-opentype + AddOutputFilterByType DEFLATE application/x-font-otf + AddOutputFilterByType DEFLATE application/x-font-truetype + AddOutputFilterByType DEFLATE application/x-font-ttf + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/atom_xml + AddOutputFilterByType DEFLATE application/x-shockwave-flash + AddOutputFilterByType DEFLATE font/opentype + AddOutputFilterByType DEFLATE font/otf + AddOutputFilterByType DEFLATE font/ttf + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE image/x-icon + AddOutputFilterByType DEFLATE image/jpeg + AddOutputFilterByType DEFLATE image/png + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/javascript + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/xml + + + mod_gzip_on Yes + mod_gzip_dechunk Yes + mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ + mod_gzip_item_include handler ^cgi-script$ + mod_gzip_item_include mime ^text/.* + mod_gzip_item_include mime ^application/x-javascript.* + mod_gzip_item_exclude mime ^image/.* + mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* + + +# Leverage Browser Caching + + ExpiresActive On + ExpiresByType image/jpg "access 1 year" + ExpiresByType image/jpeg "access 1 year" + ExpiresByType image/gif "access 1 year" + ExpiresByType image/png "access 1 year" + ExpiresByType text/css "access 1 month" + ExpiresByType text/html "access 1 month" + ExpiresByType application/pdf "access 1 month" + ExpiresByType text/x-javascript "access 1 month" + ExpiresByType application/x-shockwave-flash "access 1 month" + ExpiresByType image/x-icon "access 1 year" + ExpiresDefault "access 1 month" + + + + Header set Cache-Control "max-age=2678400, public" + + + Header set Cache-Control "max-age=7200, private, must-revalidate" + + + Header set Cache-Control "max-age=86400, public" + + + Header set Cache-Control "max-age=2678400, private" + + + +AuthType Basic +AuthName "Password Protected Area" +AuthUserFile /var/www/vhosts/plp-tool.de/httpdocs/plp-tool-live/plp-angular/dist/plp-angular/.htpasswd +Require valid-user diff --git a/plp-angular/.htpasswd b/plp-angular/.htpasswd new file mode 100644 index 0000000..98c6d92 --- /dev/null +++ b/plp-angular/.htpasswd @@ -0,0 +1 @@ +plp:$2y$10$FvzeO0lzdARUTVPMithMoO9lYM7tTCniHb2DiHjKt.YGAdtuVpodG \ No newline at end of file diff --git a/plp-angular/README.md b/plp-angular/README.md new file mode 100644 index 0000000..1cad39f --- /dev/null +++ b/plp-angular/README.md @@ -0,0 +1,27 @@ +# PlpAngular + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.5. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/plp-angular/angular.json b/plp-angular/angular.json new file mode 100644 index 0000000..714ac4a --- /dev/null +++ b/plp-angular/angular.json @@ -0,0 +1,149 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "plp-angular": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "crossOrigin": "anonymous", + "outputPath": "dist/plp-angular", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": true, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/scss/styles.scss", + "./node_modules/angular-calendar/css/angular-calendar.css", + "./node_modules/ag-grid-community/styles/ag-grid.css", + "./node_modules/ag-grid-community/styles/ag-theme-balham.css" + ], + "scripts": [] + }, + "configurations": { + "gamma": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.gamma.ts" + } + ] + }, + "beta": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.beta.ts" + } + ] + }, + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "plp-angular:build" + }, + "configurations": { + "production": { + "browserTarget": "plp-angular:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "plp-angular:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/scss/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "plp-angular:serve" + }, + "configurations": { + "production": { + "devServerTarget": "plp-angular:serve:production" + } + } + } + } + }}, + "defaultProject": "plp-angular" +} \ No newline at end of file diff --git a/plp-angular/e2e/protractor.conf.js b/plp-angular/e2e/protractor.conf.js new file mode 100644 index 0000000..73e4e68 --- /dev/null +++ b/plp-angular/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/plp-angular/e2e/src/app.e2e-spec.ts b/plp-angular/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..07e5fd5 --- /dev/null +++ b/plp-angular/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('plp-angular app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/plp-angular/e2e/src/app.po.ts b/plp-angular/e2e/src/app.po.ts new file mode 100644 index 0000000..b8498c2 --- /dev/null +++ b/plp-angular/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/plp-angular/e2e/tsconfig.json b/plp-angular/e2e/tsconfig.json new file mode 100644 index 0000000..c92199c --- /dev/null +++ b/plp-angular/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es2018", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/plp-angular/karma.conf.js b/plp-angular/karma.conf.js new file mode 100644 index 0000000..c8e7aee --- /dev/null +++ b/plp-angular/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/plp-angular'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/plp-angular/package-lock.json b/plp-angular/package-lock.json new file mode 100644 index 0000000..1675531 --- /dev/null +++ b/plp-angular/package-lock.json @@ -0,0 +1,12215 @@ +{ + "name": "plp-angular", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "plp-angular", + "version": "0.0.0", + "dependencies": { + "@angular-devkit/build-angular": "^15.2.8", + "@angular-devkit/schematics": "^15.2.8", + "@angular/animations": "^15.2.8", + "@angular/common": "^15.2.8", + "@angular/compiler": "^15.2.8", + "@angular/core": "^15.2.8", + "@angular/forms": "^15.2.8", + "@angular/platform-browser": "^15.2.8", + "@angular/platform-browser-dynamic": "^15.2.8", + "@angular/router": "^15.2.8", + "@ng-bootstrap/ng-bootstrap": "^14.1.1", + "@npmcli/fs": "^3.1.0", + "ag-grid-angular": "^29.3.5", + "ag-grid-community": "^29.3.5", + "angular-calendar": "^0.31.0", + "angularx-flatpickr": "^6.2.0", + "codelyzer": "^6.0.2", + "date-fns": "^1.30.1", + "eslint": "^8.40.0", + "file-saver": "^2.0.2", + "flatpickr": "^4.6.13", + "ng6-breadcrumbs": "^1.0.7", + "rxjs": "~6.6.7", + "tslib": "^2.0.0", + "zone.js": "~0.13.0" + }, + "devDependencies": { + "@angular/cli": "^15.2.8", + "@angular/compiler-cli": "^15.2.8", + "@angular/language-service": "^15.2.8", + "@types/file-saver": "^2.0.1", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "^2.0.8", + "@types/node": "^20.1.5", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.0", + "ts-node": "~7.0.0", + "typescript": "~4.9.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1502.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.8.tgz", + "integrity": "sha512-rTltw2ABHrcKc8EGimALvXmrDTP5hlNbEy6nYolJoXEI9EwHgriWrVLVPs3OEF+/ed47dbJi9EGOXUOgzgpB5A==", + "dependencies": { + "@angular-devkit/core": "15.2.8", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.8.tgz", + "integrity": "sha512-TGDnXhhOG6h6TOrWWzfnkha7wYBOXi7iJc1o1w1VKCayE3T6TZZdF847aK66vL9KG7AKYVdGhWEGw2WBHUBUpg==", + "dependencies": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1502.8", + "@angular-devkit/build-webpack": "0.1502.8", + "@angular-devkit/core": "15.2.8", + "@babel/core": "7.20.12", + "@babel/generator": "7.20.14", + "@babel/helper-annotate-as-pure": "7.18.6", + "@babel/helper-split-export-declaration": "7.18.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.20.7", + "@babel/plugin-transform-runtime": "7.19.6", + "@babel/preset-env": "7.20.2", + "@babel/runtime": "7.20.13", + "@babel/template": "7.20.7", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "15.2.8", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.13", + "babel-loader": "9.1.2", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "4.21.5", + "cacache": "17.0.4", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.16", + "css-loader": "6.7.3", + "esbuild-wasm": "0.17.8", + "glob": "8.1.0", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.29.0", + "mini-css-extract-plugin": "2.7.2", + "open": "8.4.1", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "piscina": "3.2.0", + "postcss": "8.4.21", + "postcss-loader": "7.0.2", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.58.1", + "sass-loader": "13.2.0", + "semver": "7.3.8", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.16.3", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.5.0", + "webpack": "5.76.1", + "webpack-dev-middleware": "6.0.1", + "webpack-dev-server": "4.11.1", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.17.8" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0", + "@angular/localize": "^15.0.0", + "@angular/platform-server": "^15.0.0", + "@angular/service-worker": "^15.0.0", + "karma": "^6.3.0", + "ng-packagr": "^15.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.8.2 <5.0" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1502.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.8.tgz", + "integrity": "sha512-jWtNv+S03FFLDe/C8SPCcRvkz3bSb2R+919IT086Q9axIPQ1VowOEwzt2k3qXPSSrC7GSYuASM+X92dB47NTQQ==", + "dependencies": { + "@angular-devkit/architect": "0.1502.8", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.8.tgz", + "integrity": "sha512-Lo4XrbDMtXarKnMrFgWLmQdSX+3QPNAg4otG8cmp/U4jJyjV4dAYKEAsb1sCNGUSM4h4v09EQU/5ugVjDU29lQ==", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.8.tgz", + "integrity": "sha512-w6EUGC96kVsH9f8sEzajzbONMawezyVBiSo+JYp5r25rQArAz/a+KZntbuETWHQ0rQOEsKmUNKxwmr11BaptSQ==", + "dependencies": { + "@angular-devkit/core": "15.2.8", + "jsonc-parser": "3.2.0", + "magic-string": "0.29.0", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/animations": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.2.9.tgz", + "integrity": "sha512-GQujLhI0cQFcl4Q8y0oSYKSRnW23GIeSL+Arl4eFufziJ9hGAAQNuesaNs/7i+9UlTHDMkPH3kd5ScXuYYz6wg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.9" + } + }, + "node_modules/@angular/cli": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.2.8.tgz", + "integrity": "sha512-3VlTfm6DUZfFHBY43vQSAaqmFTxy3VtRd/iDBCHcEPhHwYLWBvNwReJuJfNja8O105QQ6DBiYVBExEBtPmjQ4w==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1502.8", + "@angular-devkit/core": "15.2.8", + "@angular-devkit/schematics": "15.2.8", + "@schematics/angular": "15.2.8", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "3.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.1", + "ora": "5.4.1", + "pacote": "15.1.0", + "resolve": "1.22.1", + "semver": "7.3.8", + "symbol-observable": "4.0.0", + "yargs": "17.6.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.9.tgz", + "integrity": "sha512-LM9/UHG2dRrOzlu2KovrFwWIziFMjRxHzSP3Igw6Symw/wIl0kXGq8Fn6RpFP78zmLqnv+IQOoRiby9MCXsI4g==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.9", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.9.tgz", + "integrity": "sha512-MoKugbjk+E0wRBj12uvIyDLELlVLonnqjA2+XiF+7FxALIeyds3/qQeEoMmYIqAbN3NnTT5pV92RxWwG4tHFwA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.9" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.9.tgz", + "integrity": "sha512-zsbI8G2xHOeYWI0hjFzrI//ZhZV9il/uQW5dAimfwJp06KZDeXZ3PdwY9JQslf6F+saLwOObxy6QMrIVvfjy9w==", + "dependencies": { + "@babel/core": "7.19.3", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.27.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/main-ngcc.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "15.2.9", + "typescript": ">=4.8.2 <5.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/compiler-cli/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/core": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.9.tgz", + "integrity": "sha512-w46Z1yUXCQfKV7XfnamOoLA2VD0MVUUYVrUjO73mHSskDXSXxfZAEHO9kfUS71Cj35PvhP3mbkqWscpea2WeYg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" + } + }, + "node_modules/@angular/forms": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.9.tgz", + "integrity": "sha512-sk0pC2EFi2Ohg5J0q0NYptbT+2WOkoiERSMYA39ncDvlSZBWsNlxpkbGUSck7NIxjK2QfcVN1ldGbHlZTFvtqg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.9.tgz", + "integrity": "sha512-B7lP4q/eHge2lZezOXS96EYzVf4stMCWfOnz7+pUUi0HbF+A5QCV65SWQddS/M+NM2jj8N2L/j+6UCH8lJjTQA==", + "dev": true, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + } + }, + "node_modules/@angular/localize": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-15.2.9.tgz", + "integrity": "sha512-7ZGK3BWwIukSK5ORWjM3y/FYj7/ZJFl1RO1GCeL/tHD4nq0kd3q3pYvcpnoi9HGl+q8AkL24xdsfzgCFo8SB0g==", + "peer": true, + "dependencies": { + "@babel/core": "7.19.3", + "glob": "8.1.0", + "yargs": "^17.2.1" + }, + "bin": { + "localize-extract": "tools/bundles/src/extract/cli.js", + "localize-migrate": "tools/bundles/src/migrate/cli.js", + "localize-translate": "tools/bundles/src/translate/cli.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "15.2.9", + "@angular/compiler-cli": "15.2.9" + } + }, + "node_modules/@angular/localize/node_modules/@babel/core": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/localize/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/platform-browser": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.9.tgz", + "integrity": "sha512-ufCHeSX+U6d43YOMkn3igwfqtlozoCXADcbyfUEG8m2y9XASobqmCKvdSk/zfl62oyiA8msntWBJVBE2l4xKXg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "15.2.9", + "@angular/common": "15.2.9", + "@angular/core": "15.2.9" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.9.tgz", + "integrity": "sha512-ZIYDM6MShblb8OyV1m4+18lJJ2LCeICmeg2uSbpFYptYBSOClrTiYOOFVDJvn7HLvNzljLs16XPrgyaYVqNpcw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.9", + "@angular/compiler": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9" + } + }, + "node_modules/@angular/router": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.2.9.tgz", + "integrity": "sha512-UCbh5DLSDhybv0xKYT7kGQMfOVdyhHIHOZz5EYVebbhste6S+W1LE57vTHq7QtxJsyKBa/WSkaUkCLXD6ntCAg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", + "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "dependencies": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", + "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", + "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", + "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", + "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "dependencies": { + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "devOptional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.8.tgz", + "integrity": "sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz", + "integrity": "sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.8.tgz", + "integrity": "sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz", + "integrity": "sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz", + "integrity": "sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz", + "integrity": "sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz", + "integrity": "sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz", + "integrity": "sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz", + "integrity": "sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz", + "integrity": "sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz", + "integrity": "sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz", + "integrity": "sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz", + "integrity": "sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz", + "integrity": "sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz", + "integrity": "sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz", + "integrity": "sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz", + "integrity": "sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz", + "integrity": "sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz", + "integrity": "sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz", + "integrity": "sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz", + "integrity": "sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz", + "integrity": "sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mattlewis92/dom-autoscroller": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@mattlewis92/dom-autoscroller/-/dom-autoscroller-2.4.2.tgz", + "integrity": "sha512-YbrUWREPGEjE/FU6foXcAT1YbVwqD/jkYnY1dFb0o4AxtP3s4xKBthlELjndZih8uwsDWgQZx1eNskRNe2BgZQ==" + }, + "node_modules/@ng-bootstrap/ng-bootstrap": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-14.1.1.tgz", + "integrity": "sha512-3EIc+lCmqUlr7sghzx0r28sjk771zvyqe3SXkrT7grYFzQCVbjtms6Wr9OPbdbmpqDNXG6a8llUoyVgtp1B2Tg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^15.0.0", + "@angular/core": "^15.0.0", + "@angular/forms": "^15.0.0", + "@angular/localize": "^15.0.0", + "@popperjs/core": "^2.11.6", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.8.tgz", + "integrity": "sha512-BJexeT4FxMtToVBGa3wdl6rrkYXgilP0kkSH4Qzu4MPlLPbeBSr4XQalQriewlpC2uzG0r2SJfrAe2eDhtSykA==", + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0", + "typescript": ">=4.8.2 <5.0", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", + "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", + "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@scarf/scarf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz", + "integrity": "sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ==", + "hasInstallScript": true + }, + "node_modules/@schematics/angular": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.8.tgz", + "integrity": "sha512-F49IEzCFxQlpaMIgTO/wF1l/CLQKif7VaiDdyiTKOeT22IMmyd61FUmWDyZYfCBqMlvBmvDGx64HaHWes1HYCg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.2.8", + "@angular-devkit/schematics": "15.2.8", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "devOptional": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "devOptional": true + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "devOptional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.16.tgz", + "integrity": "sha512-Nveep4zKGby8uIvG2AEUyYOwZS8uVeHK9TgbuWYSawUDDdIgfhCKz28QzamTo//Jk7Ztt9PO3f+vzlB6a4GV1Q==", + "dev": true + }, + "node_modules/@types/jasminewd2": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", + "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", + "dev": true, + "dependencies": { + "@types/jasmine": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.5.tgz", + "integrity": "sha512-IvGD1CD/nego63ySR7vrAKEX3AJTcmrAN2kn+/sDNLi1Ff5kBzDeEdqWDplK+0HAEoLYej137Sk0cUU8OLOlMg==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/ag-grid-angular": { + "version": "29.3.5", + "resolved": "https://registry.npmjs.org/ag-grid-angular/-/ag-grid-angular-29.3.5.tgz", + "integrity": "sha512-UWDZvDSrS9Z+LFZ1G0HFOeamITD8kEHgO9eooJV4DxSmYoBGMGruLZV1QIPhjQwBVe8ib5TWw3Q1erSf/bcVSw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">= 12.0.0", + "@angular/core": ">= 12.0.0", + "ag-grid-community": "~29.3.5" + } + }, + "node_modules/ag-grid-community": { + "version": "29.3.5", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.5.tgz", + "integrity": "sha512-LxUo21f2/CH31ACEs1C7Q/ggGGI1fQPSTB4aY5OThmM+lBkygZ7QszBE8jpfgWOIjvjdtcdIeQbmbjkHeMsA7A==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/angular-calendar": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/angular-calendar/-/angular-calendar-0.31.0.tgz", + "integrity": "sha512-QGPObUmOYLr4IeSaj1pzZjcycN6otYx+SbeezJuujstXR9f2wo4CtMlBQ+SU+ZF5VFfrdYge8qkxMGCLBLBRrw==", + "dependencies": { + "@scarf/scarf": "^1.1.1", + "angular-draggable-droppable": "^8.0.0", + "angular-resizable-element": "^7.0.0", + "calendar-utils": "^0.10.4", + "positioning": "^2.0.1", + "tslib": "^2.4.1" + }, + "funding": { + "url": "https://github.com/sponsors/mattlewis92" + }, + "peerDependencies": { + "@angular/core": ">=15.0.0" + } + }, + "node_modules/angular-draggable-droppable": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/angular-draggable-droppable/-/angular-draggable-droppable-8.0.0.tgz", + "integrity": "sha512-+gpSNBbygjV1pxTxsM3UPJKcXHXJabYoTtKcgQe74rGnb1umKc07XCBD1qDzvlG/kocthvhQ12qfYOYzHnE3ZA==", + "dependencies": { + "@mattlewis92/dom-autoscroller": "^2.4.2", + "tslib": "^2.4.1" + }, + "peerDependencies": { + "@angular/core": ">=15.0.0" + } + }, + "node_modules/angular-resizable-element": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/angular-resizable-element/-/angular-resizable-element-7.0.2.tgz", + "integrity": "sha512-/BGuNiA38n9klexHO1xgnsA3VYigj9v+jUGjKtBRgfB26bCxZKsNWParSu2k3EqbATrfAJC4Nl8f7cORpJFf4w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=15.0.0" + } + }, + "node_modules/angularx-flatpickr": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/angularx-flatpickr/-/angularx-flatpickr-6.6.0.tgz", + "integrity": "sha512-n/csZmAwfL32P7pUv52FXihSbPjVAjiKglbY8WO9hsBKvAk7mw8PKNjiovln4+fuscJwKo0wSsw+s7A+JpetQg==", + "dependencies": { + "tslib": "^1.9.0" + }, + "peerDependencies": { + "@angular/core": ">=5.0.0", + "@angular/forms": ">=5.0.0", + "flatpickr": "^4.5.0" + } + }, + "node_modules/angularx-flatpickr/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==", + "dependencies": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dependencies": { + "ast-types-flow": "0.0.7" + } + }, + "node_modules/babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dependencies": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "devOptional": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "devOptional": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "devOptional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "devOptional": true + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", + "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^8.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/calendar-utils": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/calendar-utils/-/calendar-utils-0.10.4.tgz", + "integrity": "sha512-gBK4xCJ42yjaUKwuUha6cZOfxAmGzvSgbdAaX3xLRioeKbYoOK1x1qeD6dch72rsMZlTgATPbBBx42bnkStqgQ==" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001487", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", + "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/codelyzer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", + "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==", + "dependencies": { + "@angular/compiler": "9.0.0", + "@angular/core": "9.0.0", + "app-root-path": "^3.0.0", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "rxjs": "^6.5.3", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2", + "tslib": "^1.10.0", + "zone.js": "~0.10.3" + }, + "peerDependencies": { + "@angular/compiler": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", + "@angular/core": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", + "tslint": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/codelyzer/node_modules/@angular/compiler": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", + "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", + "peerDependencies": { + "tslib": "^1.10.0" + } + }, + "node_modules/codelyzer/node_modules/@angular/core": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", + "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", + "peerDependencies": { + "rxjs": "^6.5.3", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + } + }, + "node_modules/codelyzer/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/codelyzer/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/codelyzer/node_modules/zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "devOptional": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "devOptional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "devOptional": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "devOptional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "dependencies": { + "browserslist": "^4.21.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "devOptional": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==", + "dependencies": { + "through": "X.X.X" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "devOptional": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "devOptional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "devOptional": true + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "devOptional": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.394", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.394.tgz", + "integrity": "sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "devOptional": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "devOptional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "devOptional": true + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "node_modules/esbuild": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz", + "integrity": "sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==", + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.8", + "@esbuild/android-arm64": "0.17.8", + "@esbuild/android-x64": "0.17.8", + "@esbuild/darwin-arm64": "0.17.8", + "@esbuild/darwin-x64": "0.17.8", + "@esbuild/freebsd-arm64": "0.17.8", + "@esbuild/freebsd-x64": "0.17.8", + "@esbuild/linux-arm": "0.17.8", + "@esbuild/linux-arm64": "0.17.8", + "@esbuild/linux-ia32": "0.17.8", + "@esbuild/linux-loong64": "0.17.8", + "@esbuild/linux-mips64el": "0.17.8", + "@esbuild/linux-ppc64": "0.17.8", + "@esbuild/linux-riscv64": "0.17.8", + "@esbuild/linux-s390x": "0.17.8", + "@esbuild/linux-x64": "0.17.8", + "@esbuild/netbsd-x64": "0.17.8", + "@esbuild/openbsd-x64": "0.17.8", + "@esbuild/sunos-x64": "0.17.8", + "@esbuild/win32-arm64": "0.17.8", + "@esbuild/win32-ia32": "0.17.8", + "@esbuild/win32-x64": "0.17.8" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz", + "integrity": "sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ==", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "devOptional": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "devOptional": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "devOptional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "devOptional": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "devOptional": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatpickr": { + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", + "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "devOptional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==" + }, + "node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "devOptional": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", + "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.8.0.tgz", + "integrity": "sha512-zl0nZWDrmbCiKns0NcjkFGYkVTGCPUgoHypTaj+G2AzaWus7QGoXARSlYsSle2VRpSdfJmM+hzmFKzQNhF2kHg==", + "dev": true + }, + "node_modules/jasmine-spec-reporter": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", + "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "dev": true, + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "devOptional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "devOptional": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/mattlewis92" + } + }, + "node_modules/karma-jasmine": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz", + "integrity": "sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==", + "dev": true, + "dependencies": { + "jasmine-core": "^3.6.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "karma": "*" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": ">=3.8", + "karma": ">=0.9", + "karma-jasmine": ">=1.1" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "devOptional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "devOptional": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "devOptional": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "devOptional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "devOptional": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", + "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "devOptional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/ng6-breadcrumbs": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ng6-breadcrumbs/-/ng6-breadcrumbs-1.0.7.tgz", + "integrity": "sha512-U/WRZ/iFMFq1zxwnY9VnvhT556+5XythO5g3EXidR5wIctUWwb6WCIevLExmFyU/ATaplruGtVZR8zQyyABA3g==" + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", + "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz", + "integrity": "sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.1.tgz", + "integrity": "sha512-UgmoiySyjFxP6tscZDgWGEAgsW5ok8W3F5CJDnnH2pozwSTGE6eH7vwTotMwATWA2r5xqdkKdxYPkwlJjAI/3g==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz", + "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/positioning": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/positioning/-/positioning-2.0.1.tgz", + "integrity": "sha512-DsAgM42kV/ObuwlRpAzDTjH9E8fGKkMDJHWFX+kfNXSxh7UCCQxEmdjv/Ws5Ft1XDnt3JT8fIDYeKNSE2TbttA==" + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", + "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "devOptional": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "devOptional": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-package-json": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", + "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.4.tgz", + "integrity": "sha512-fDboBse/sl1oXSLhIp0FcCJgzW9KmhC/q8ULTKC82zc+DL3TL7FNb8qlt5qqXN53MsKEUSIcb+7DLmEygOE5Yw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0 || ^6.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minipass": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz", + "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "devOptional": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", + "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng==", + "dependencies": { + "semver": "^5.3.0" + } + }, + "node_modules/semver-dsl/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sigstore": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.5.0.tgz", + "integrity": "sha512-i3nhvdobiPj8XrXNIggjeur6+A5iAQ4f+r1bR5SGitFJBbthy/6c7Fz0h+kY70Wua1FSMdDr/UEhXSVRXNpynw==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.1.3" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "devOptional": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "devOptional": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "devOptional": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/ssri": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "devOptional": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", + "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/terser": { + "version": "5.16.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", + "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.17.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", + "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "peer": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true + }, + "node_modules/tuf-js": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", + "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "devOptional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.76.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", + "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz", + "integrity": "sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.0.tgz", + "integrity": "sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ==", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/plp-angular/package.json b/plp-angular/package.json new file mode 100644 index 0000000..2d45f1b --- /dev/null +++ b/plp-angular/package.json @@ -0,0 +1,58 @@ +{ + "name": "plp-angular", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular-devkit/build-angular": "^15.2.8", + "@angular-devkit/schematics": "^15.2.8", + "@angular/animations": "^15.2.8", + "@angular/common": "^15.2.8", + "@angular/compiler": "^15.2.8", + "@angular/core": "^15.2.8", + "@angular/forms": "^15.2.8", + "@angular/platform-browser": "^15.2.8", + "@angular/platform-browser-dynamic": "^15.2.8", + "@angular/router": "^15.2.8", + "@ng-bootstrap/ng-bootstrap": "^14.1.1", + "@npmcli/fs": "^3.1.0", + "ag-grid-angular": "^29.3.5", + "ag-grid-community": "^29.3.5", + "angular-calendar": "^0.31.0", + "angularx-flatpickr": "^6.2.0", + "codelyzer": "^6.0.2", + "date-fns": "^1.30.1", + "eslint": "^8.40.0", + "file-saver": "^2.0.2", + "flatpickr": "^4.6.13", + "ng6-breadcrumbs": "^1.0.7", + "rxjs": "~6.6.7", + "tslib": "^2.0.0", + "zone.js": "~0.13.0" + }, + "devDependencies": { + "@angular/cli": "^15.2.8", + "@angular/compiler-cli": "^15.2.8", + "@angular/language-service": "^15.2.8", + "@types/file-saver": "^2.0.1", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "^2.0.8", + "@types/node": "^20.1.5", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.0", + "ts-node": "~7.0.0", + "typescript": "~4.9.5" + } +} diff --git a/plp-angular/src/app/app-routing.module.ts b/plp-angular/src/app/app-routing.module.ts new file mode 100644 index 0000000..1264143 --- /dev/null +++ b/plp-angular/src/app/app-routing.module.ts @@ -0,0 +1,39 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { StartComponent } from './views/start/start.component'; +import {CustomerManagementComponent} from './views/customer-management/customer-management.component'; +import {LoginComponent} from './views/login/login.component'; +import {RouteInterceptor} from './interceptor/route-interceptor'; +import {AccountingComponent} from './views/accounting/accounting.component'; +import {TechniqueComponent} from './views/technique/technique.component'; +import {SalesComponent} from './views/sales/sales.component'; + + +const routes: Routes = [ + {path: '', redirectTo: '/start', pathMatch: 'full'}, + {path: 'login', component: LoginComponent, data: {breadcrumb: 'Login'}}, + {path: 'start', component: StartComponent, data: {breadcrumb: 'Home'}, canActivate: [RouteInterceptor]}, + {path: 'customer-management', component: CustomerManagementComponent, data: {breadcrumb: 'Kunden'}, canActivate: [RouteInterceptor]}, + // {path: 'accounting', component: AccountingComponent, data: {breadcrumb: 'Buchhaltung'}, canActivate: [RouteInterceptor]}, + // {path: 'technique', component: TechniqueComponent, data: {breadcrumb: 'Technik'}, canActivate: [RouteInterceptor]}, + // {path: 'sales', component: SalesComponent, data: {breadcrumb: 'Vertrieb'}, canActivate: [RouteInterceptor]}, + {path: '**', redirectTo: '/start', pathMatch: 'full'}, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, {useHash: true})], + exports: [RouterModule] +}) + +export class AppRoutingModule { + +} + +export const routingComponents = [ + LoginComponent, + StartComponent, + CustomerManagementComponent, + AccountingComponent, + TechniqueComponent, + SalesComponent, +]; diff --git a/plp-angular/src/app/app.component.html b/plp-angular/src/app/app.component.html new file mode 100644 index 0000000..0141938 --- /dev/null +++ b/plp-angular/src/app/app.component.html @@ -0,0 +1,16 @@ +
+ +
+ +
+ +
+
+
+ \ No newline at end of file diff --git a/plp-angular/src/app/app.component.scss b/plp-angular/src/app/app.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/app.component.ts b/plp-angular/src/app/app.component.ts new file mode 100644 index 0000000..78499ca --- /dev/null +++ b/plp-angular/src/app/app.component.ts @@ -0,0 +1,53 @@ +import {Component, OnDestroy, OnInit} from '@angular/core'; +import {AppService} from './services/app.service'; +import {Subscription} from 'rxjs'; +import {IUser} from './model/entities/user'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) + +export class AppComponent implements OnInit, OnDestroy { + + private loginSub: Subscription; + private userSub: Subscription; + public isLoggedIn: boolean; + public activeUser: IUser; + + constructor(public appService: AppService) { + + } + + ngOnInit() { + this.isLoggedIn = false; + // Observe login state + this.loginSub = this.appService.getLoginState$().subscribe( + data => { + if (data !== null) { + this.isLoggedIn = true; + } else { + this.isLoggedIn = false; + } + } + ); + + this.userSub = this.appService.getUser$().subscribe( + data => { + this.activeUser = data as IUser; + } + ); + + } + + /** + * Destroy + */ + ngOnDestroy(): void { + if (this.loginSub !== null && this.loginSub !== undefined) { + this.loginSub.unsubscribe(); + } + } + +} diff --git a/plp-angular/src/app/app.module.ts b/plp-angular/src/app/app.module.ts new file mode 100644 index 0000000..8e86486 --- /dev/null +++ b/plp-angular/src/app/app.module.ts @@ -0,0 +1,151 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FlatpickrModule } from 'angularx-flatpickr'; +import { NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; +import {AppRoutingModule, routingComponents} from './app-routing.module'; +import { AppComponent } from './app.component'; +import { StartComponent } from './views/start/start.component'; +import { BrowserAnimationsModule} from '@angular/platform-browser/animations'; +import {CalendarModule, DateAdapter} from 'angular-calendar'; +import { adapterFactory} from 'angular-calendar/date-adapters/date-fns'; +import {registerLocaleData} from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import { CustomerManagementComponent } from './views/customer-management/customer-management.component'; +import { AgGridModule } from 'ag-grid-angular'; +import { LoginComponent } from './views/login/login.component'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import { AsideComponent } from './components/aside/aside.component'; +import {AppService} from './services/app.service'; +import {CacheService} from './services/cache.service'; +import {MessageService} from './services/message.service'; +import {HttpService} from './services/http.service'; +import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http'; +import {HttpClientInterceptor} from './services/http.interceptor'; +import {RouteInterceptor} from './interceptor/route-interceptor'; +import { TechniqueComponent } from './views/technique/technique.component'; +import { SalesComponent } from './views/sales/sales.component'; +import { AccountingComponent } from './views/accounting/accounting.component'; +import { ModalComponent } from './components/modal/modal.component'; +import { CustomerViewComponent } from './views/customer-management/customer-view/customer-view.component'; +import { TabsComponent } from './components/tabs/tabs.component'; +import { TabComponent } from './components/tab/tab.component'; +import { CustomerDataViewComponent } from './views/customer-management/customer-view/customer-data-view/customer-data-view.component'; +import { CustomerDataEditComponent } from './views/customer-management/customer-view/customer-data-edit/customer-data-edit.component'; +import { CustomerContactPersonViewComponent } from './views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component'; +import { CustomerContactPersonEditComponent } from './views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component'; +import { CustomerNoteViewComponent } from './views/customer-management/customer-view/customer-note-view/customer-note-view.component'; +import { CustomerNoteEditComponent } from './views/customer-management/customer-view/customer-note-edit/customer-note-edit.component'; +import {CustomerService} from './services/customer.service'; +import { CustomerNoteDetailComponent } from './views/customer-management/customer-view/customer-note-detail/customer-note-detail.component'; +import {GridCheckboxRendererComponent} from './grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component'; +import {GridCheckboxEditorComponent} from './grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component'; +import {GridSelectEditorComponent} from './grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component'; +import {GridSelectRendererComponent} from './grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component'; +import {GridDateEditorComponent} from './grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component'; +import {GridDateRendererComponent} from './grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component'; +import {GridTextRendererComponent} from './grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component'; +import {GridTextEditorComponent} from './grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component'; +import {GridInputRendererComponent} from './grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component'; +import {GridInputEditorComponent} from './grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component'; +import {GridBlockedRendererComponent} from './grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component'; +import {GridBlockedEditorComponent} from './grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component'; +import { CustomerMeetingViewComponent } from './views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component'; +import { CustomerMeetingEditComponent } from './views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component'; +import { CustomerMeetingDetailComponent } from './views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component'; +import { MessageComponent } from './components/message/message.component'; +import { CustomerListComponent } from './views/customer-management/customer-list/customer-list.component'; +import { CustomerContactListComponent } from './views/customer-management/customer-contact-list/customer-contact-list.component'; +import { MeetingListComponent } from './views/start/meeting-list/meeting-list.component'; +import { MeetingCalendarComponent } from './views/start/meeting-calendar/meeting-calendar.component'; +import { CustomerContactPersonDetailComponent } from './views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component'; +import { InternalMeetingEditComponent } from './views/start/internal-meeting-edit/internal-meeting-edit.component'; +import { InternalMeetingDetailComponent } from './views/start/internal-meeting-detail/internal-meeting-detail.component'; +import { CalendarLegendComponent } from './components/calendar-legend/calendar-legend.component'; +import { CommonService } from './services/common.service'; +import {GridRendererComponent} from './grid-cellrenderer/grid-renderer-component'; +import {GridEditorComponent} from './grid-cellrenderer/grid-editor-component'; + + +registerLocaleData(localeDe); + +@NgModule({ + declarations: [ + AppComponent, + routingComponents, + StartComponent, + CustomerManagementComponent, + LoginComponent, + AsideComponent, + TechniqueComponent, + SalesComponent, + AccountingComponent, + ModalComponent, + CustomerViewComponent, + TabsComponent, + TabComponent, + CustomerDataViewComponent, + CustomerDataEditComponent, + CustomerContactPersonViewComponent, + CustomerContactPersonEditComponent, + CustomerNoteViewComponent, + CustomerNoteEditComponent, + CustomerNoteDetailComponent, + GridRendererComponent, + GridEditorComponent, + GridCheckboxRendererComponent, + GridCheckboxEditorComponent, + GridSelectEditorComponent, + GridSelectRendererComponent, + GridDateEditorComponent, + GridDateRendererComponent, + GridBlockedRendererComponent, + GridTextRendererComponent, + GridTextEditorComponent, + GridInputRendererComponent, + GridInputEditorComponent, + GridBlockedEditorComponent, + CustomerMeetingViewComponent, + CustomerMeetingEditComponent, + CustomerMeetingDetailComponent, + MessageComponent, + CustomerListComponent, + CustomerContactListComponent, + MeetingListComponent, + MeetingCalendarComponent, + CustomerContactPersonDetailComponent, + InternalMeetingEditComponent, + InternalMeetingDetailComponent, + CalendarLegendComponent, + ], + imports: [ + BrowserModule, + CommonModule, + NgbModalModule, + FlatpickrModule.forRoot(), + AppRoutingModule, + HttpClientModule, + ReactiveFormsModule, + FormsModule, + BrowserAnimationsModule, + // ScrollToModule.forRoot(), + CalendarModule.forRoot({ + provide: DateAdapter, + useFactory: adapterFactory + }), + AgGridModule, + ], + providers: [ + AppService, + RouteInterceptor, + CacheService, + MessageService, + HttpService, + CustomerService, + CommonService, + {provide: HTTP_INTERCEPTORS, useClass: HttpClientInterceptor, multi: true}, + ], + bootstrap: [AppComponent] +}) + +export class AppModule { } diff --git a/plp-angular/src/app/components/ag-grid-component-const.ts b/plp-angular/src/app/components/ag-grid-component-const.ts new file mode 100644 index 0000000..6c0ceb7 --- /dev/null +++ b/plp-angular/src/app/components/ag-grid-component-const.ts @@ -0,0 +1,158 @@ +import {GridFactory} from '../grid-cellrenderer/grid-factory'; +import {IGridCellParams} from '../grid-cellrenderer/grid-cell-params'; +import {Const} from '../utils/const'; + +export class AgGridComponentConst { + + // Key for cell type (must be used in data of grid item) + public static CELL_KEY_TYPE = 'cellKeyType'; + // Cell renderers + public static CELL_RENDERER_CHECKBOX = 'gridCheckboxRenderer'; + public static CELL_RENDERER_TEXT = 'gridTextRenderer'; + public static CELL_RENDERER_DATE = 'gridDateRenderer'; + public static CELL_RENDERER_INPUT = 'gridInputRenderer'; + public static CELL_RENDERER_SELECT = 'gridSelectRenderer'; + public static CELL_RENDERER_BLOCKED = 'gridBlockedRenderer'; + public static CELL_RENDERER_DEFAULT = ''; + // Cell editors + public static CELL_EDITOR_CHECKBOX = 'gridCheckboxEditor'; + public static CELL_EDITOR_TEXT = 'gridTextEditor'; + public static CELL_EDITOR_DATE = 'gridDateEditor'; + public static CELL_EDITOR_INPUT = 'gridInputEditor'; + public static CELL_EDITOR_SELECT = 'gridSelectEditor'; + public static CELL_EDITOR_BLOCKED = 'gridBlockedEditor'; + public static CELL_EDITOR_DEFAULT = ''; + // Cell types + public static CELL_TYPE_DEFAULT = 'default'; + public static CELL_TYPE_CHECKBOX = 'checkbox'; + public static CELL_TYPE_TEXT = 'text'; + public static CELL_TYPE_DATE = 'date'; + public static CELL_TYPE_INPUT = 'input'; + public static CELL_TYPE_SELECT = 'select'; + public static CELL_TYPE_BLOCKED = 'blocked'; + + // Cell units + public static CELL_UNIT_PERCENT = '%'; + public static CELL_UNIT_EURO = '€'; + public static CELL_UNIT_DAYS = ' Tage'; + public static CELL_UNIT_SQUARE_METER: string = ' ' + Const.UNIT_SQUARE_METER; + + // Cell value types + public static CELL_VALUE_TYPE_BOOL = 'bool'; + public static CELL_VALUE_TYPE_INT = 'int'; + public static CELL_VALUE_TYPE_FLOAT = 'float'; + public static CELL_VALUE_TYPE_STRING = 'string'; + + public static validCellUnits: string[] = [ + AgGridComponentConst.CELL_UNIT_PERCENT, + AgGridComponentConst.CELL_UNIT_EURO, + AgGridComponentConst.CELL_UNIT_DAYS, + AgGridComponentConst.CELL_UNIT_SQUARE_METER, + ]; + + public static validCellValueTypes: string[] = [ + AgGridComponentConst.CELL_VALUE_TYPE_BOOL, + AgGridComponentConst.CELL_VALUE_TYPE_INT, + AgGridComponentConst.CELL_VALUE_TYPE_FLOAT, + AgGridComponentConst.CELL_VALUE_TYPE_STRING, + ]; + + public static gridInputError: string; + + /** + * Sets input error + */ + public static setGridInputError(errorMessage: string = null): void { + AgGridComponentConst.gridInputError = errorMessage; + if (null !== errorMessage) { + setTimeout(() => { + AgGridComponentConst.setGridInputError(); + }, 10); + } + } + + /** + * Returns a cell renderer for given type with given parameters + */ + public static cellRendererSelector(params: any, gridCellParams: IGridCellParams = null): {} { + if (null === gridCellParams) { + gridCellParams = GridFactory.getGridCellParams(); + } + + AgGridComponentConst.checkCellValueType(gridCellParams.type); + AgGridComponentConst.checkCellUnit(gridCellParams.unit); + switch (params.data[AgGridComponentConst.CELL_KEY_TYPE]) { + case AgGridComponentConst.CELL_TYPE_CHECKBOX: + return {component: AgGridComponentConst.CELL_RENDERER_CHECKBOX, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_TEXT: + return {component: AgGridComponentConst.CELL_RENDERER_TEXT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_INPUT: + return {component: AgGridComponentConst.CELL_RENDERER_INPUT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_DATE: + return {component: AgGridComponentConst.CELL_RENDERER_DATE, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_SELECT: + return {component: AgGridComponentConst.CELL_RENDERER_SELECT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_BLOCKED: + return {component: AgGridComponentConst.CELL_RENDERER_BLOCKED, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_DEFAULT: + // Nothing specific, so ag grid will take it's own default cell renderer + return; + default: + throw new Error('Unknown cell type'); + } + } + + /** + * Returns a cell editor for given type with given parameters + */ + public static cellEditorSelector(params: any, gridCellParams: IGridCellParams = null) { + if (null === gridCellParams) { + gridCellParams = GridFactory.getGridCellParams(); + } + + AgGridComponentConst.checkCellValueType(gridCellParams.type); + AgGridComponentConst.checkCellUnit(gridCellParams.unit); + switch (params.data[AgGridComponentConst.CELL_KEY_TYPE]) { + case AgGridComponentConst.CELL_TYPE_CHECKBOX: + // NOTE: Overwrite any given type for checkbox with boolean, since checkbox can only hold boolean values + gridCellParams.type = AgGridComponentConst.CELL_VALUE_TYPE_BOOL; + return {component: AgGridComponentConst.CELL_EDITOR_CHECKBOX, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_TEXT: + return {component: AgGridComponentConst.CELL_EDITOR_TEXT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_INPUT: + return {component: AgGridComponentConst.CELL_EDITOR_INPUT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_DATE: + return {component: AgGridComponentConst.CELL_EDITOR_DATE, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_SELECT: + return {component: AgGridComponentConst.CELL_EDITOR_SELECT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_BLOCKED: + return {component: AgGridComponentConst.CELL_EDITOR_BLOCKED, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_DEFAULT: + // Nothing specific, so ag grid will take it's own default cell editor + return; + default: + throw new Error('Unknown cell type'); + } + } + + /** + * Checks if cell value type is valid + * @param {string} type + */ + private static checkCellValueType(type: string = null): void { + if (null !== type && AgGridComponentConst.validCellValueTypes.indexOf(type) < 0) { + throw new Error('Unknown cell value type'); + } + } + + /** + * Checks if cell unit is valid + * @param {string} type + */ + private static checkCellUnit(type: string = null): void { + if (null !== type && AgGridComponentConst.validCellUnits.indexOf(type) < 0) { + throw new Error('Unknown cell value type'); + } + } + +} diff --git a/plp-angular/src/app/components/ag-grid-component.ts b/plp-angular/src/app/components/ag-grid-component.ts new file mode 100644 index 0000000..83bc7a8 --- /dev/null +++ b/plp-angular/src/app/components/ag-grid-component.ts @@ -0,0 +1,466 @@ +import {path} from '../../environments/path'; +import {AgGridLocale} from '../lang/ag-gridlocale'; +import {IGridValidationErrors} from '../model/virtual/grid-validation-errors'; +import {GridSelectEditorComponent} from '../grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component'; +import {GridSelectRendererComponent} from '../grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component'; +import {GridCheckboxRendererComponent} from '../grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component'; +import {GridCheckboxEditorComponent} from '../grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component'; +import {GridDateRendererComponent} from '../grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component'; +import {GridDateEditorComponent} from '../grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component'; +import {GridTextRendererComponent} from '../grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component'; +import {GridTextEditorComponent} from '../grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component'; +import {AgGridComponentConst} from './ag-grid-component-const'; +import {GridInputRendererComponent} from '../grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component'; +import {GridInputEditorComponent} from '../grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component'; +import {GridBlockedRendererComponent} from '../grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component'; +import {GridBlockedEditorComponent} from '../grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component'; +import {Utils} from '../utils/utils'; + +export class AgGridComponent { + static readonly MIN_HEIGHT: number = 16; + public params: any; + public columnDefs: any[] = []; + public defaultColDef: {} = {}; + public rowData: any[] = []; + public rowSelection: string; + public gridParamsColumnApi; + public gridParamsApi; + public apiAssetsPath: string; + public resetSearchBtn: boolean; + public localeText: {}; + public frameworkComponents: {}; + public bSizeColumnsToFit: boolean; + public gridErrors: IGridValidationErrors[]; + public errorIndex: number; + public resetValueByError: boolean; + public errorMessage: string; + public nextAddedItemId: number; + + /** + * Constructor + */ + constructor(bSizeColumnsToFit: boolean = true) { + AgGridComponentConst.setGridInputError(); + this.rowData = []; + this.columnDefs = []; + this.rowSelection = 'multiple'; + this.defaultColDef = { + editable: true + }; + this.apiAssetsPath = path.path_assets; + this.frameworkComponents = {}; + this.localeText = AgGridLocale.getLocale(); + this.bSizeColumnsToFit = bSizeColumnsToFit; + this.gridErrors = []; + this.errorIndex = -1; + this.resetValueByError = false; + this.errorMessage = null; + this.nextAddedItemId = null; + + this.frameworkComponents = { + gridSelectEditor: GridSelectEditorComponent, + gridSelectRenderer: GridSelectRendererComponent, + gridCheckboxRenderer: GridCheckboxRendererComponent, + gridCheckboxEditor: GridCheckboxEditorComponent, + gridDateRenderer: GridDateRendererComponent, + gridDateEditor: GridDateEditorComponent, + gridInputRenderer: GridInputRendererComponent, + gridInputEditor: GridInputEditorComponent, + gridTextRenderer: GridTextRendererComponent, + gridTextEditor: GridTextEditorComponent, + gridBlockedRenderer: GridBlockedRendererComponent, + gridBlockedEditor: GridBlockedEditorComponent + }; + } + + /** + * Callback on grid ready + */ + public onGridReady(params): void { + this.params = params; + this.gridParamsColumnApi = params.columnApi; + this.gridParamsApi = params.api; + + // Set for cadasters + if (!this.bSizeColumnsToFit) { + const allColumnIds = []; + this.gridParamsColumnApi.getAllColumns().forEach((column) => { + allColumnIds.push(column.colId); + }); + this.gridParamsColumnApi.autoSizeColumns(allColumnIds); + } + } + + /** + * On row clicked + */ + public onRowClicked(e): void { + // Reset error message + AgGridComponentConst.setGridInputError(); + this.errorMessage = null; + } + + /** + * On cell editing stopped + */ + public onCellEditingStopped(e): void { + if (null !== AgGridComponentConst.gridInputError) { + this.errorMessage = AgGridComponentConst.gridInputError; + e.api.ensureIndexVisible(e.rowIndex, 'middle'); + e.api.ensureColumnVisible(e.colDef.field.toString()); + } else { + this.errorMessage = null; + } + } + + /** + * Sizes columns to fit + */ + public onFirstDataRendered(params: any): void { + // Set for info components + if (this.bSizeColumnsToFit) { + params.api.sizeColumnsToFit(); + } + } + + /** + * Resizes grid + */ + public gridSizeChanged(params: any): void { + if (undefined !== this.gridParamsApi) { + this.gridParamsApi.sizeColumnsToFit(); + } + } + + /** + * Search Form + */ + public searchFormSubmit(params: any): void { + if (params.target.value !== '') { + this.resetSearchBtn = true; + this.gridParamsApi.setQuickFilter(params.target.value); + } else { + this.resetSearchBtn = false; + this.gridParamsApi.setQuickFilter(null); + } + } + + /** + * Reset search input + */ + public resetSearch(e: any): void { + e.originalTarget[0].value = ''; + this.resetSearchBtn = false; + this.gridParamsApi.setQuickFilter(null); + } + + /** + * Stop editing state + */ + public stopEditing(): void { + this.params.api.stopEditing(); + } + + /** + * Configures scrollToService - https://www.npmjs.com/package/@nicky-lenaers/ngx-scroll-to + */ + public scrollTo(targetFieldName: string = null, lastFieldName: string = null): void { + if (null !== targetFieldName) { + if (null !== lastFieldName) { + // Scroll to last field first to ensure our target field name is on left-hand side + this.params.api.ensureColumnVisible(lastFieldName); + } + this.params.api.ensureColumnVisible(targetFieldName); + } + } + + /** + * Cell renderer selector for individual cells with optional default parameters + */ + public cellRendererSelector(params: any): {} { + return AgGridComponentConst.cellRendererSelector(params); + } + + /** + * Cell editor selector for individual cells + */ + public cellEditorSelector(params: any): {} { + return AgGridComponentConst.cellEditorSelector(params); + } + + /** + * Validates grid + */ + public validateGrid(): boolean { + const oldErrors: IGridValidationErrors[] = this.gridErrors; + this.gridErrors = []; + this.errorIndex = -1; + + const primaryColumns = this.params.api.columnController.primaryColumns; + const errorColumn: any[] = []; + const errors: IGridValidationErrors[] = []; + + primaryColumns.forEach((value) => { + if (undefined !== value.colDef.cellEditorParams) { + if (undefined !== value.colDef.cellEditorParams.mandatory && true === value.colDef.cellEditorParams.mandatory) { + errorColumn.push(value.colDef.field); + } + } + }); + + errorColumn.forEach((value, i) => { + this.params.api.forEachNode((rowNode, index) => { + if (null === rowNode.data[value] || undefined === rowNode.data[value]) { + errors.push({ + column: value, + row: index + }); + } + }); + }); + this.gridErrors = errors; + + if (this.gridErrors.length !== 0) { + if (oldErrors.length !== this.gridErrors.length) { + this.params.api.ensureIndexVisible(this.gridErrors[0].row, 'middle'); + this.params.api.ensureColumnVisible(this.gridErrors[0].column); + } + } + + return this.gridErrors.length === 0; + } + + /** + * Jumps to error + */ + public jumpToError(direction: string): void { + const errorLength: number = this.gridErrors.length - 1; + // If any errors + if (errorLength >= 0) { + // if errorIndex is smaller or same as list of all errors + if (errorLength === 0) { + this.errorIndex = 0; + } else { + if (direction === 'next') { + this.errorIndex = this.errorIndex < errorLength ? this.errorIndex + 1 : 0; + } else { + this.errorIndex = this.errorIndex <= 0 ? errorLength : this.errorIndex - 1; + } + } + this.params.api.ensureIndexVisible(this.gridErrors[this.errorIndex].row, 'middle'); + this.params.api.ensureColumnVisible(this.gridErrors[this.errorIndex].column); + } else { + // reset errorIndex if no errors + this.errorIndex = -1; + } + } + + /** + * Shows input error + */ + public showInputError(positionIndex: number, field: string, oldValue: string, type: string): void { + this.resetValueByError = true; + this.params.api.clearFocusedCell(); + this.params.api.ensureIndexVisible(positionIndex, 'middle'); + this.params.api.ensureColumnVisible(field); + // Lifecycle hack + setTimeout(() => { + // Reset to old value + this.params.api.getRowNode(positionIndex).setDataValue(field, oldValue); + this.params.api.startEditingCell({ + rowIndex: positionIndex, + colKey: field, + }); + switch (type) { + case 'int': + this.errorMessage = 'Bitte geben Sie einen ganzzahligen Wert ein.'; + break; + case 'float': + this.errorMessage = 'Bitte geben Sie einen dezimalen oder ganzzahligen Wert ein.'; + break; + } + }, 10); + } + + /** + * Add row to grid and returns position index + */ + public addRow(item: {}): number { + this.initNextAddedItemId(); + const rowModel = this.gridParamsApi.rowModel; + // Note: default is last row + let addIndex: number = rowModel.rowsToDisplay.length + 1; + rowModel.rowsToDisplay.forEach((row, i) => { + if (row.selected === true) { + // Note: Add index is the row after selected row + addIndex = i + 1; + return; + } + }); + this.gridParamsApi.updateRowData({ + add: [item], + addIndex + }); + return addIndex; + } + + /** + * Removes selected rows + */ + public removeRows(): void { + this.initNextAddedItemId(); + const selectedRows: {}[] = this.gridParamsApi.getSelectedRows(); + this.gridParamsApi.updateRowData({remove: selectedRows}); + } + + /** + * Gets next row position + */ + public getNextRowPosition(): number { + return this.gridParamsApi.rowModel.length + 1; + } + + /** + * inits next dummy id for next added entry, if necessary + */ + private initNextAddedItemId(): void { + if (this.nextAddedItemId === null) { + this.nextAddedItemId = (this.rowData.length + 1) * -1; + } + } + + /** + * Returns dummy id for added entry + */ + public getNextAddedItemId(): number { + this.initNextAddedItemId(); + const res: number = this.nextAddedItemId; + this.nextAddedItemId--; + return res; + } + + /** + * column resize event + */ + public onColumnResized(event): void { + if (event.finished !== false) { + event.api.setHeaderHeight(AgGridComponent.MIN_HEIGHT); + const headerCells = Array.from(document.querySelectorAll('.content .ag-header-cell-label')); + let minHeight: number = AgGridComponent.MIN_HEIGHT; + headerCells.forEach(cell => { + minHeight = Math.max(minHeight, cell.scrollHeight); + }); + + // set header height to calculated height + padding (top: 8px, bottom: 8px) + event.api.setHeaderHeight(minHeight + 16); + } + if (event.finished) { + this.gridParamsApi.resetRowHeights(); + } + } + + /** + * Renders colored dot + */ + public dotRenderer(params): string { + return ''; + } + + /** + * Renders email address + */ + public emailRenderer(params): string { + return null !== params.value ? '' + params.value + '' : ''; + } + + /** + * Renders phone number + */ + public phoneRenderer(params): string { + return null !== params.value ? '' + params.value + '' : ''; + } + + /** + * Renders phone number + */ + public urlRenderer(params): string { + return null !== params.value ? '' + params.value + '' : ''; + } + + /** + * option renderer + */ + public optionRenderer(params): string { + return params.data.is_option_meeting ? 'Ja' : ''; + } + + /** + * address renderer + */ + public addressRenderer(params): string { + let address = ''; + if (params.data.typeType === 'visit') { + const street = params.data.street !== null ? params.data.street : ''; + const streetNo = params.data.street_no !== null ? params.data.street_no : ''; + const zip = params.data.zip !== null ? params.data.zip : ''; + const city = params.data.city !== null ? params.data.city : ''; + let br = ''; + if (zip !== null || city !== null) { + br = '
'; + } + address = street + ' ' + streetNo + ' ' + br + zip + ' ' + city; + } + return address; + } + + /** + * participants renderer + */ + public participantsRenderer(params): string { + let participantNames = ''; + params.data.participants.forEach((value) => { + participantNames += params.data.that.appService.getConfig().vc_user_by_id[value.participant_user_id].firstname + + ' ' + params.data.that.appService.getConfig().vc_user_by_id[value.participant_user_id].lastname + '
'; + }); + return participantNames; + } + + /** + * Time renderer + */ + public timeRenderer(params): string { + return Utils.getDateTimeToDisplay(params.value, false, true); + } + + /** + * Date renderer + */ + public dateRenderer(params): string { + return Utils.getDateTimeToDisplay(params.value); + } + + /** + * Datetime renderer + */ + public dateTimeRenderer(params): string { + return Utils.getDateTimeToDisplay(params.value, true, true); + } + + /** + * Date comparator + */ + public dateComparator(date1, date2, callbackCheck: boolean = true) { + if (date1 === null && date2 === null) { + return 0; + } + if (date1 === null) { + return -1; + } + if (date2 === null) { + return 1; + } + const stamp1: number = Utils.getParsedDate(date1); + const stamp2: number = Utils.getParsedDate(date2); + return stamp1 < stamp2 ? 1 : stamp1 === stamp2 ? 0 : -1; + } +} diff --git a/plp-angular/src/app/components/aside/aside.component.html b/plp-angular/src/app/components/aside/aside.component.html new file mode 100644 index 0000000..c967d23 --- /dev/null +++ b/plp-angular/src/app/components/aside/aside.component.html @@ -0,0 +1,9 @@ +
+ Startseite +
+ +
Logout
\ No newline at end of file diff --git a/plp-angular/src/app/components/aside/aside.component.scss b/plp-angular/src/app/components/aside/aside.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/aside/aside.component.ts b/plp-angular/src/app/components/aside/aside.component.ts new file mode 100644 index 0000000..9756e76 --- /dev/null +++ b/plp-angular/src/app/components/aside/aside.component.ts @@ -0,0 +1,37 @@ +import { Component, OnInit } from '@angular/core'; +import {AppService} from '../../services/app.service'; + +@Component({ + selector: 'app-aside', + templateUrl: './aside.component.html', + styleUrls: ['./aside.component.scss'] +}) + +export class AsideComponent implements OnInit { + + /* Navigation items */ + public navItems: Array; + + constructor(public appService: AppService) { } + + ngOnInit() { + this.navItems = []; + this.navItems.push({name: 'Kunden', route: '/customer-management', className: 'customer-management'}); + this.navItems.push({name: 'Betreiber', route: '/operators', className: 'operators'}); + this.navItems.push({name: 'Produzenten', route: '/productions', className: 'productions'}); + this.navItems.push({name: 'Service', route: '/service', className: 'service'}); + // this.navItems.push({name: 'Buchhaltung', route: '/accounting', className: 'accounting'}); + // this.navItems.push({name: 'Produktion', route: '/production', className: 'production'}); + // this.navItems.push({name: 'Service', route: '/service', className: 'service'}); + // this.navItems.push({name: 'Technik', route: '/technique', className: 'technique'}); + // this.navItems.push({name: 'Vertrieb', route: '/sales', className: 'sales'}); + } + + /** + * Logout + */ + public logout(): void { + this.appService.logout(); + } + +} diff --git a/plp-angular/src/app/components/calendar-legend/calendar-legend.component.html b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.html new file mode 100644 index 0000000..bc9edcc --- /dev/null +++ b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.html @@ -0,0 +1,3 @@ +
    +
  • {{l.name}}
  • +
\ No newline at end of file diff --git a/plp-angular/src/app/components/calendar-legend/calendar-legend.component.scss b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/calendar-legend/calendar-legend.component.ts b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.ts new file mode 100644 index 0000000..e039a39 --- /dev/null +++ b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; +import {ICalendarLegend} from '../../model/entities/calendar-legend'; + +@Component({ + selector: 'app-calendar-legend', + templateUrl: './calendar-legend.component.html', + styleUrls: ['./calendar-legend.component.scss'] +}) +export class CalendarLegendComponent implements OnInit { + + public legendEntries: ICalendarLegend[]; + + constructor() { } + + ngOnInit() { + // this.legendEntries = []; + this.legendEntries = [ + {id: 1, type: 'customer', name: 'Kunden'}, + {id: 2, type: 'operator', name: 'Betreiber'}, + {id: 3, type: 'internal', name: 'Intern'}, + {id: 4, type: 'production', name: 'Produzenten'}, + {id: 5, type: 'service', name: 'Service'}, + ]; + } + + /** + * + * @param legendEntries + */ + public setData(legendEntries: []): void { + // this.legendEntries = legendEntries; + } + +} diff --git a/plp-angular/src/app/components/form-component.ts b/plp-angular/src/app/components/form-component.ts new file mode 100644 index 0000000..a76d8c2 --- /dev/null +++ b/plp-angular/src/app/components/form-component.ts @@ -0,0 +1,37 @@ +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; + +export class FormComponent { + public errorMsg: string; + public isCreationMode: boolean; + // protected scrollToService: ScrollToService; + + + // constructor(scrollToService: ScrollToService) { + // this.scrollToService = scrollToService; + // this.errorMsg = ''; + // this.isCreationMode = false; + // } + + constructor() { + this.errorMsg = ''; + this.isCreationMode = false; + } + + public checkDate(e: any): void { + const checkedDate: Date = new Date(e.target.value.replace(/\s/, 'T')); + const today: Date = new Date(); + today.setHours(0); + today.setMinutes(0); + today.setSeconds(1); + if (checkedDate < today) { + alert('Hinweis: Das Datum liegt in der Vergangenheit.\nVergangene Termine können nicht bearbeitet oder gelöscht werden.'); + } + } + + /** + * Configures scrollToService - https://www.npmjs.com/package/@nicky-lenaers/ngx-scroll-to + */ + // public scrollUp(identifier: string): void { + // this.scrollToService.scrollTo({target: identifier}); + // } +} diff --git a/plp-angular/src/app/components/message/message.component.html b/plp-angular/src/app/components/message/message.component.html new file mode 100644 index 0000000..10967d7 --- /dev/null +++ b/plp-angular/src/app/components/message/message.component.html @@ -0,0 +1,18 @@ +
+
+

{{message}}

+

+ +
+
+
+
+

{{message}}

+
+
+
+
+

{{message}}

+ +
+
\ No newline at end of file diff --git a/plp-angular/src/app/components/message/message.component.scss b/plp-angular/src/app/components/message/message.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/message/message.component.ts b/plp-angular/src/app/components/message/message.component.ts new file mode 100644 index 0000000..9803b22 --- /dev/null +++ b/plp-angular/src/app/components/message/message.component.ts @@ -0,0 +1,141 @@ +import {Component, OnDestroy, OnInit} from '@angular/core'; +import {MessageService} from '../../services/message.service'; +import {Subscription} from 'rxjs'; + +@Component({ + selector: 'app-message', + templateUrl: './message.component.html', + styleUrls: ['./message.component.scss'] +}) + +export class MessageComponent implements OnInit, OnDestroy { + + // Message display time in milliseconds + static MESSAGE_DISPLAY_TIME = 2000; + + // Client Error codes + static CLIENT_ERROR_DATA = 1; + static CLIENT_ERROR_VALIDATION_FAILED = 2; + + + private messageSub: Subscription; + public showError: boolean; + public showSuccess: boolean; + public showInfo: boolean; + public showClientError: boolean; + public message: string; + public optionalInfo: string; + + public errorMessages: string[]; + public successMessages: string[]; + public infoMessages: string[]; + public clientErrorMessages: string[]; + + constructor(private messageService: MessageService) { + // Init client error messages + this.clientErrorMessages = []; + this.clientErrorMessages[MessageComponent.CLIENT_ERROR_DATA] = 'Die Daten sind unvollständig oder fehlerhaft.'; + this.clientErrorMessages[MessageComponent.CLIENT_ERROR_VALIDATION_FAILED] = 'Die Daten sind nicht valide, kein Speichern möglich. Bitte überprüfen Sie Ihre Eingaben.'; + } + + ngOnInit() { + this.messageSub = this.messageService.getMessage$().subscribe( + data => { + if (data !== null) { + if (data.error_code != 0) { + this.showErrorMessage(data.error_code, data.error_msg, data.optional_info); + } else if (data.success_code != 0) { + this.showSuccessMessage(data.success_code, data.success_msg); + } else if (data.info_code != 0) { + this.showInfoMessage(data.info_code, data.info_msg); + } else if (data.client_error_code != 0) { + this.showClientErrorMessage(data.client_error_code); + } + } + }); + + this.showError = false; + this.showSuccess = false; + this.showInfo = false; + this.showClientError = false; + this.message = ''; + this.optionalInfo = null; + } + + /** + * Shows error message + * @param {number} errorCode + * @param {string} errorMsg + * @param {string} optionalInfo + */ + public showErrorMessage(errorCode: number, errorMsg: string, optionalInfo: string = null): void { + this.showError = true; + this.showSuccess = false; + this.showInfo = false; + this.showClientError = false; + this.message = errorMsg; + // Set optional info (if exists) + this.optionalInfo = null !== optionalInfo ? optionalInfo : null; + } + + /** + * Shows success message + * @param {number} successCode + * @param {string} successMsg + */ + public showSuccessMessage(successCode: number, successMsg: string): void { + this.showSuccess = true; + this.showError = false; + this.showInfo = false; + this.showClientError = false; + const me: MessageComponent = this; + this.message = successMsg; + setTimeout(function() { + me.closeComponent(); + }, MessageComponent.MESSAGE_DISPLAY_TIME); + } + + /** + * Shows info message + * @param {number} infoCode + * @param {string} infoMsg + */ + public showInfoMessage(infoCode: number, infoMsg: string): void { + this.showInfo = true; + this.showSuccess = false; + this.showError = false; + this.showClientError = false; + this.message = infoMsg; + } + + /** + * Shows client error message + * @param {number} clientErrorCode + */ + public showClientErrorMessage(clientErrorCode: number): void { + this.showInfo = false; + this.showSuccess = false; + this.showError = false; + this.showClientError = true; + if (this.clientErrorMessages[clientErrorCode]) { + this.message = this.clientErrorMessages[clientErrorCode]; + } + } + + /** + * Hides error- / success-message + */ + public closeComponent(): void { + this.showError = false; + this.showSuccess = false; + this.showInfo = false; + this.showClientError = false; + this.message = ''; + } + + ngOnDestroy(): void { + if (this.messageSub !== null) { + this.messageSub.unsubscribe(); + } + } +} diff --git a/plp-angular/src/app/components/modal/modal.component.html b/plp-angular/src/app/components/modal/modal.component.html new file mode 100644 index 0000000..2ec0a7e --- /dev/null +++ b/plp-angular/src/app/components/modal/modal.component.html @@ -0,0 +1,8 @@ + + + diff --git a/plp-angular/src/app/components/modal/modal.component.scss b/plp-angular/src/app/components/modal/modal.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/modal/modal.component.ts b/plp-angular/src/app/components/modal/modal.component.ts new file mode 100644 index 0000000..5b8bcab --- /dev/null +++ b/plp-angular/src/app/components/modal/modal.component.ts @@ -0,0 +1,79 @@ +import {AfterContentInit, Component, EventEmitter, OnInit, Input, Output, Renderer2} from '@angular/core'; + +@Component({ + selector: 'app-spt-modal', + templateUrl: './modal.component.html', + styleUrls: ['./modal.component.scss'] +}) + +export class ModalComponent implements OnInit, AfterContentInit { + + @Input() autoclose = true; + @Input() overlay = false; + @Output() state: EventEmitter = new EventEmitter(); + @Output() onClose: EventEmitter = new EventEmitter(); + + public showModal: boolean; + public isVisible: boolean; + + constructor(private renderer: Renderer2) { } + + ngOnInit() { + this.showModal = false; + this.isVisible = false; + } + + /** + * After content children are set + */ + ngAfterContentInit() { + this.isVisible = true; + } + + /** + * Opens modal dialog + */ + public openModal(): void { + this.showModal = true; + this.renderer.addClass(document.body, 'body--modal-open'); + this.state.emit(this.showModal); + } + + /** + * Closes modal dialog if no parameter showDialog == false + */ + public closeModal(): void { + if (!this.autoclose) { + this.onClose.emit(true); + } else { + this.exitModal(); + } + } + + /** + * Closes modal dialog with confirm message + */ + public closeWithConfirm(message: string): boolean { + if (confirm(message)) { + this.exitModal(); + return true; + } + return false; + } + + /** + * Closes modal dialog + */ + public exitModal(): void { + this.showModal = false; + this.renderer.removeClass(document.body, 'body--modal-open'); + this.state.emit(this.showModal); + } + + /** + * Returns if modal is open + */ + public isOpen(): boolean { + return this.showModal; + } +} diff --git a/plp-angular/src/app/components/tab/tab.component.html b/plp-angular/src/app/components/tab/tab.component.html new file mode 100644 index 0000000..66cb94a --- /dev/null +++ b/plp-angular/src/app/components/tab/tab.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/plp-angular/src/app/components/tab/tab.component.scss b/plp-angular/src/app/components/tab/tab.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/tab/tab.component.ts b/plp-angular/src/app/components/tab/tab.component.ts new file mode 100644 index 0000000..dd0ef26 --- /dev/null +++ b/plp-angular/src/app/components/tab/tab.component.ts @@ -0,0 +1,21 @@ +import {Component, Input, OnInit} from '@angular/core'; + +@Component({ + selector: 'app-tab', + templateUrl: './tab.component.html', + styleUrls: ['./tab.component.scss'] +}) + +export class TabComponent implements OnInit { + + @Input('tabTitle') title: string; + @Input('tabIndex') index: number; + @Input() active = false; + @Input() disabled = false; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/plp-angular/src/app/components/tabs/tabs.component.html b/plp-angular/src/app/components/tabs/tabs.component.html new file mode 100644 index 0000000..dc8a927 --- /dev/null +++ b/plp-angular/src/app/components/tabs/tabs.component.html @@ -0,0 +1,10 @@ +
+
    +
  • + {{tab.title}} +
  • +
+
+ +
+
diff --git a/plp-angular/src/app/components/tabs/tabs.component.scss b/plp-angular/src/app/components/tabs/tabs.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/tabs/tabs.component.ts b/plp-angular/src/app/components/tabs/tabs.component.ts new file mode 100644 index 0000000..cd7e58c --- /dev/null +++ b/plp-angular/src/app/components/tabs/tabs.component.ts @@ -0,0 +1,99 @@ +import { + AfterContentInit, + Component, + ContentChildren, + EventEmitter, + Input, + Output, + QueryList +} from '@angular/core'; +import {TabComponent} from '../tab/tab.component'; + +@Component({ + selector: 'app-tabs', + templateUrl: './tabs.component.html', + styleUrls: ['./tabs.component.scss'] +}) + +export class TabsComponent implements AfterContentInit { + + @ContentChildren(TabComponent) tabs: QueryList; + @Input() notifyOnChange = false; + @Output() onChange: EventEmitter = new EventEmitter(); + + constructor() { } + + /** + * After content children are set + */ + public ngAfterContentInit(): void { + // get all active tabs + const activeTabs = this.tabs.filter((tab) => tab.active); + + // if there is no active tab set, activate the first + if (activeTabs.length === 0) { + this.setSelectedTabIndex(0); + } + } + + /** + * Eventlistener for tab change + * @param {TabComponent} tab + */ + public selectTab(tab: TabComponent): void { + if (!tab.disabled) { + if (this.notifyOnChange) { + this.onChange.emit(tab.index); + } else { + this.setSelectedTabIndex(tab.index); + } + } + } + + /** + * Sets selected tab by given + * @param {number} i + */ + public setSelectedTabIndex(i: number): void { + if (this.tabs != null) { + const tabsArray: TabComponent[] = this.tabs.toArray(); + if (i < tabsArray.length) { + // Deactivate all tabs + tabsArray.forEach(tab => tab.active = false); + // Activate the tab the user has clicked on. + tabsArray[i].active = true; + } + } + } + + /** + * Disable tab at given index + * @param {number} i + */ + public disableTabIndex(i: number): void { + this.toggleTabIndex(i, false); + } + + /** + * Enable tab at given index + * @param {number} i + */ + public enableTabIndex(i: number): void { + this.toggleTabIndex(i, true); + } + + /** + * Sets selected tab disabled/enabled + * @param {number} i + * @param {boolean} enable + */ + private toggleTabIndex(i: number, enable: boolean): void { + if (this.tabs != null) { + const tabsArray: TabComponent[] = this.tabs.toArray(); + if (i < tabsArray.length) { + tabsArray[i].disabled = !enable; + } + } + } + +} diff --git a/plp-angular/src/app/factory/factory.ts b/plp-angular/src/app/factory/factory.ts new file mode 100644 index 0000000..54f3469 --- /dev/null +++ b/plp-angular/src/app/factory/factory.ts @@ -0,0 +1,186 @@ +import {IMessage} from '../model/virtual/message'; +import {ICustomer} from '../model/entities/customer'; +import {ICustomerContact} from '../model/entities/customer-contact'; +import {ICustomerNote} from '../model/entities/customer-note'; +import {ICustomerMeeting} from '../model/entities/customer-meeting'; +import {IUser} from '../model/entities/user'; +import {IMeetingType} from '../model/entities/meeting-type'; +import {IInternalMeeting} from '../model/entities/internal-meeting'; +import {Utils} from '../utils/utils'; +export class Factory { + + static getEmptyUser(): IUser { + const emptyUser: {} = { + id: null, + email: null, + firstname: null, + lastname: null, + active: false + }; + return emptyUser as IUser; + } + + /** + * Returns empty message + */ + static getEmptyMessage(errorCode: number, errorMsg: string, successCode: number, successMsg: string, + infoCode: number, infoMsg: string, clientErrorCode: number, optionalInfo: string = null): IMessage { + const emptyMessage: {} = { + error_code: errorCode, + error_msg: errorMsg, + success_code: successCode, + success_msg: successMsg, + info_code: infoCode, + info_msg: infoMsg, + client_error_code: clientErrorCode, + optional_info: optionalInfo + }; + return emptyMessage as IMessage; + } + + /** + * Returns empty customer + */ + static getEmptyCustomer(): ICustomer { + const emptyCustomer: {} = { + id: null, + old_plp_id: null, + name: null, + name_additional: null, + consultant_user_id: null, + street: null, + street_no: null, + zip: null, + city: null, + country_id: null, + url: null, + email: null, + phone_no: null, + mobile_no: null, + fax_no: null, + comment: null, + active: true, + }; + return emptyCustomer as ICustomer; + } + + /** + * Returns empty customer contact person + */ + static getEmptyCustomerContact(customerId: number = null): ICustomerContact { + const emptyCustomerContact: {} = { + id: null, + customer_id: customerId, + gender: null, + firstname: null, + lastname: null, + email: null, + phone_no: null, + mobile_no: null, + fax_no: null, + department: null, + date_of_birth: null, + comment: null, + street: null, + street_no: null, + zip: null, + city: null, + country_id: null, + is_xmas_mail_recipient: false, + }; + return emptyCustomerContact as ICustomerContact; + } + + static getEmptyCustomerNote(customerId: number = null, noteDate: string = null): ICustomerNote { + const emptyCustomerNote: {} = { + id: customerId, + customer_id: null, + customer_contact_id: null, + user_id: null, + gender: null, + firstname: null, + lastname: null, + email: null, + phone_no: null, + mobile_no: null, + fax_no: null, + department: null, + title: null, + comment: null, + note_date: noteDate, + creation_date: null, + creation_user_id: null, + creation_user_firstname: null, + creation_user_lastname: null + }; + return emptyCustomerNote as ICustomerNote; + } + + static getEmptyCustomerMeeting(customerId: number = null): ICustomerMeeting { + const emptyCustomerMeeting: {} = { + id: null, + customer_id: customerId, + creation_user_id: null, + owner_user_id: null, + meeting_type_id: null, + is_option_meeting: false, + title: null, + description: null, + start_date: Utils.getCurrentDate() + ' 09:00:00', + end_date: Utils.getCurrentDate() + ' 18:00:00', + customer_contact_id: null, + gender: null, + firstname: null, + lastname: null, + email: null, + phone_no: null, + mobile_no: null, + department: null, + street: null, + street_no: null, + zip: null, + city: null, + country_id: null, + report: null, + first_reminder_sent: false, + second_reminder_sent: false, + report_done: false, + report_reminder_sent: false, + creation_date: null, + v_participants: [], + v_is_editable: true + }; + return emptyCustomerMeeting as ICustomerMeeting; + } + + static getEmptyInternalMeeting(): IInternalMeeting { + const emptyInternalMeeting: {} = { + id: null, + creation_user_id: null, + owner_user_id: null, + title: null, + description: null, + start_date: Utils.getCurrentDate() + ' 09:00:00', + end_date: Utils.getCurrentDate() + ' 18:00:00', + report: null, + first_reminder_sent: false, + second_reminder_sent: false, + report_done: false, + report_reminder_sent: false, + creation_date: null, + v_participants: [], + v_is_editable: true + }; + return emptyInternalMeeting as IInternalMeeting; + } + + static getEmptyMeetingType(): IMeetingType { + const emptyMeetingType: {} = { + id: null, + type: null, + name: null, + }; + return emptyMeetingType as IMeetingType; + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.html new file mode 100644 index 0000000..5a2e602 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.scss new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.scss @@ -0,0 +1 @@ + diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.ts new file mode 100644 index 0000000..83cc74e --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.ts @@ -0,0 +1,19 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; + +@Component({ + selector: 'app-grid-blocked-editor', + templateUrl: './grid-blocked-editor.component.html', + styleUrls: ['./grid-blocked-editor.component.scss'] +}) + +export class GridBlockedEditorComponent extends GridEditorComponent { + + /** + * Sets focus + */ + public afterGuiAttached(): void { + + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.html new file mode 100644 index 0000000..5a2e602 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.ts new file mode 100644 index 0000000..a6eaa3d --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.ts @@ -0,0 +1,21 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; + +@Component({ + selector: 'app-grid-blocked-renderer', + templateUrl: './grid-blocked-renderer.component.html', + styleUrls: ['./grid-blocked-renderer.component.scss'] +}) + +export class GridBlockedRendererComponent extends GridRendererComponent { + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + * @param params + */ + agInit(params: any): void { + params.eGridCell.classList.remove('error'); + + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-cell-editor-params.ts b/plp-angular/src/app/grid-cellrenderer/grid-cell-editor-params.ts new file mode 100644 index 0000000..c751526 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-cell-editor-params.ts @@ -0,0 +1,9 @@ +export interface IGridCellEditorParams { + itemKey: string; + itemValueKeys: string[]; + relatesOnDgField: string; + values: any[]; + exclusive: boolean; + exclusiveCompareDataKey: string; + exclusiveCompareData: any[]; +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-cell-params.ts b/plp-angular/src/app/grid-cellrenderer/grid-cell-params.ts new file mode 100644 index 0000000..b758593 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-cell-params.ts @@ -0,0 +1,8 @@ +export interface IGridCellParams { + type: string; + min: number; + max: number; + unit: string; + mandatory: boolean; + altVal: number; +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.html new file mode 100644 index 0000000..270f14d --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.html @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.ts new file mode 100644 index 0000000..d90839b --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.ts @@ -0,0 +1,41 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; +import {Utils} from '../../../utils/utils'; + +@Component({ + selector: 'app-grid-checkbox-editor', + templateUrl: './grid-checkbox-editor.component.html', + styleUrls: ['./grid-checkbox-editor.component.scss'] +}) + +export class GridCheckboxEditorComponent extends GridEditorComponent { + + /** + * Initialize checkbox editor (called after double-click) + * @param params + */ + agInit(params: any): void { + super.agInit(params); + + // Set true to false, because of single click + this.value = null === this.value ? true : !this.value; + if (!Utils.isBoolean(this.value)) { + throw new Error('checkbox requires boolean value'); + } + } + + /** + * Changes value on checkbox click + * @param e + */ + public valueIsChanged = (e) => { + this.value = !this.value; + } + + /** + * Overwrite + */ + public afterGuiAttached(): void { + // do nothing + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.html new file mode 100644 index 0000000..48f0a45 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.html @@ -0,0 +1,8 @@ + + + + + + diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.ts new file mode 100644 index 0000000..14973ca --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.ts @@ -0,0 +1,34 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; +import {Utils} from '../../../utils/utils'; + +@Component({ + selector: 'app-grid-checkbox-renderer', + templateUrl: './grid-checkbox-renderer.component.html', + styleUrls: ['./grid-checkbox-renderer.component.scss'] +}) + +export class GridCheckboxRendererComponent extends GridRendererComponent { + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + * @param params + */ + agInit(params: any): void { + super.agInit(params); + this.value = null === this.value ? false : this.value; + if (!Utils.isBoolean(this.value)) { + throw new Error('checkbox requires boolean value'); + } + } + + /** + * Triggers cell editing start without using "singleClickEdit" + */ + public startEditing(): void { + const startEditingParams: {} = { + rowIndex: this.params.rowIndex, + colKey: this.params.column.getId() + }; + this.params.api.startEditingCell(startEditingParams); + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.html new file mode 100644 index 0000000..c88fc5f --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.ts new file mode 100644 index 0000000..bd48b97 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.ts @@ -0,0 +1,12 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; + +@Component({ + selector: 'app-grid-checkbox-editor', + templateUrl: './grid-date-editor.component.html', + styleUrls: ['./grid-date-editor.component.scss'] +}) + +export class GridDateEditorComponent extends GridEditorComponent { + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.html new file mode 100644 index 0000000..6e27280 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.html @@ -0,0 +1 @@ +{{displayedValue}} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.ts new file mode 100644 index 0000000..8c80f31 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.ts @@ -0,0 +1,27 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; + +@Component({ + selector: 'app-grid-date-renderer', + templateUrl: './grid-date-renderer.component.html', + styleUrls: ['./grid-date-renderer.component.scss'] +}) + +export class GridDateRendererComponent extends GridRendererComponent { + + public displayedValue: string; + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + let tempValue: string[] = []; + if (null === this.value || undefined === this.value) { + this.displayedValue = ''; + } else { + tempValue = this.value.split('-'); + this.displayedValue = tempValue[2] + '.' + tempValue[1] + '.' + tempValue[0]; + } + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-editor-component.ts b/plp-angular/src/app/grid-cellrenderer/grid-editor-component.ts new file mode 100644 index 0000000..b01cd73 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-editor-component.ts @@ -0,0 +1,82 @@ +import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; +import {ICellEditorAngularComp} from 'ag-grid-angular'; +import {IGridCellParams} from './grid-cell-params'; + +@Component({ + template: '', +}) + +export class GridEditorComponent implements OnInit, ICellEditorAngularComp { + + @ViewChild('editorInput', { static: true }) inputField: ElementRef; + + readonly GRID_ERROR_EMPTY: string = 'Bitte geben Sie einen Wert ein.'; + readonly GRID_ERROR_INT: string = 'Bitte geben Sie einen ganzahligen Wert ein.'; + readonly GRID_ERROR_FLOAT: string = 'Bitte geben Sie einen dezimalen oder ganzzahligen Wert ein.'; + readonly GRID_ERROR_RANGE_MIN: string = 'Minimaler Wert: '; + readonly GRID_ERROR_RANGE_MAX: string = 'Maximaler Wert: '; + readonly GRID_ERROR_RANGE_ALTERNATIVE: string = 'Alternativer Wert: '; + + public value: any; + public params: any; + public cellParams: IGridCellParams; + + constructor() { + this.cellParams = {} as IGridCellParams; + } + + ngOnInit() { + } + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + this.params = params; + this.cellParams.type = params.type; + this.cellParams.min = params.min; + this.cellParams.max = params.max; + this.cellParams.unit = params.unit; + this.cellParams.mandatory = params.mandatory; + this.cellParams.altVal = params.altVal; + this.value = params.value; + } + + /** + * Returns value to cell renderer + */ + getValue(): any { + return this.value; + } + + /** + * Cancels before value input (this editor is never editable) + */ + public isCancelBeforeStart(): boolean { + return false; + } + + /** + * Cancels input of inserted value under certain conditions + */ + isCancelAfterEnd(): boolean { + return false; + } + + /** + * Changes value on click + */ + public valueIsChanged = (e) => { + this.value = e.srcElement.value; + } + + + /** + * Sets focus + */ + public afterGuiAttached(): void { + this.inputField.nativeElement.focus(); + this.inputField.nativeElement.select(); + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-factory.ts b/plp-angular/src/app/grid-cellrenderer/grid-factory.ts new file mode 100644 index 0000000..5ea5210 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-factory.ts @@ -0,0 +1,20 @@ +import {IGridCellParams} from './grid-cell-params'; + +export class GridFactory { + /** + * Returns param object for cell renderer and -editors + */ + static getGridCellParams(type: string = null, min: number = null, + max: number = null, unit: string = null, + mandatory: boolean = false, altValue: number = null): IGridCellParams { + const gridCellParams: IGridCellParams = {} as IGridCellParams; + gridCellParams.type = type; + gridCellParams.min = min; + gridCellParams.max = max; + gridCellParams.unit = unit; + gridCellParams.mandatory = mandatory; + gridCellParams.altVal = altValue; + + return gridCellParams; + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.html new file mode 100644 index 0000000..f5046dd --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.ts new file mode 100644 index 0000000..69fa365 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.ts @@ -0,0 +1,107 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; +import {AgGridComponentConst} from '../../../components/ag-grid-component-const'; +import {Utils} from '../../../utils/utils'; + +@Component({ + selector: 'app-grid-input-editor', + templateUrl: './grid-input-editor.component.html', + styleUrls: ['./grid-input-editor.component.scss'] +}) + +export class GridInputEditorComponent extends GridEditorComponent { + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + + if (this.cellParams !== undefined && this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + // Replace "." with "," for display purpose + this.value = isNaN(this.value) || null === this.value ? '' : parseFloat(this.value).toFixed(2).replace('.', ','); + } + } + + /** + * Returns value to cell renderer + */ + getValue(): any { + if (this.cellParams !== undefined && this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + // Replace "." with "," for display purpose and cast back to number + this.value = this.value.replace(',', '.'); + this.value = isNaN(this.value) || null === this.value ? '' : Number(parseFloat(this.value).toFixed(2)); + } + return this.value; + } + + /** + * Cancels input of inserted value under certain conditions + */ + isCancelAfterEnd(): boolean { + if (this.cellParams.mandatory && (null === this.value || this.value.toString().trim() === '')) { + // Null value or empty string + AgGridComponentConst.setGridInputError(this.GRID_ERROR_EMPTY); + return true; + } + + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_INT && !Utils.isInteger(this.value)) { + // No int value given + AgGridComponentConst.setGridInputError(this.GRID_ERROR_INT); + return true; + } + + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT && !Utils.isFloat(this.value)) { + // No float value given + AgGridComponentConst.setGridInputError(this.GRID_ERROR_FLOAT); + return true; + } + + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_INT || + this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + const numericVal: number = Number(String(this.value).replace(',', '.')); + if (null !== this.cellParams.min && numericVal < Number(this.cellParams.min)) { + // Check on alternative value + if (null !== this.cellParams.altVal) { + if (numericVal === this.cellParams.altVal) { + // Alternative value (to min and max) -> no error + return false; + } else { + // Value is not in range and not alternative value - cancel value input + AgGridComponentConst.setGridInputError(this.GRID_ERROR_RANGE_MIN + this.cellParams.min + ' (' + this.GRID_ERROR_RANGE_ALTERNATIVE + this.cellParams.altVal + ')'); + return true; + } + } else { + // Value is not in range - cancel value input + AgGridComponentConst.setGridInputError(this.GRID_ERROR_RANGE_MIN + this.cellParams.min); + return true; + } + } + if (null !== this.cellParams.max && numericVal > Number(this.cellParams.max)) { + // Check on alternative value + if (null !== this.cellParams.altVal) { + if (numericVal === this.cellParams.altVal) { + // Alternative value (to min and max) -> no error + return false; + } else { + // Value is not in range and not alternative value - cancel value input + AgGridComponentConst.setGridInputError(this.GRID_ERROR_RANGE_MAX + this.cellParams.max + ' (' + this.GRID_ERROR_RANGE_ALTERNATIVE + this.cellParams.altVal + ')'); + return true; + } + } else { + // Value is not in range - cancel value input + AgGridComponentConst.setGridInputError(this.GRID_ERROR_RANGE_MAX + this.cellParams.max); + return true; + } + } + } + return false; + } + + /** + * Changes value on click + * todo maybe this should get refacotred properly? + */ + public valueIsChanged = (e) => { + this.value = e.srcElement.value; + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.html new file mode 100644 index 0000000..27fa371 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.html @@ -0,0 +1 @@ +{{value}}{{cellParams.unit}} \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.ts new file mode 100644 index 0000000..7b3d2e1 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.ts @@ -0,0 +1,27 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; +import {AgGridComponentConst} from '../../../components/ag-grid-component-const'; + +@Component({ + selector: 'app-grid-input-renderer', + templateUrl: './grid-input-renderer.component.html', + styleUrls: ['./grid-input-renderer.component.scss'] +}) + +export class GridInputRendererComponent extends GridRendererComponent { + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + if (this.cellParams !== undefined) { + // Replace "." with "," for display purpose + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + this.value = isNaN(this.value) || null === this.value ? '' : parseFloat(parseFloat(this.value).toFixed(2)).toLocaleString('de-DE'); + } + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_INT) { + this.value = isNaN(this.value) || null === this.value ? '' : parseInt(parseInt(this.value).toFixed(2)).toLocaleString('de-DE'); + } + } + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-renderer-component.ts b/plp-angular/src/app/grid-cellrenderer/grid-renderer-component.ts new file mode 100644 index 0000000..074fe18 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-renderer-component.ts @@ -0,0 +1,49 @@ +import {Component, OnInit} from '@angular/core'; +import {ICellRendererAngularComp} from 'ag-grid-angular'; +import {IGridCellParams} from './grid-cell-params'; + +@Component({ + template: '', +}) + +export class GridRendererComponent implements OnInit, ICellRendererAngularComp { + + public value: any; + public params: any; + public cellParams: IGridCellParams; + + constructor() { + this.cellParams = {} as IGridCellParams; + } + + ngOnInit() { + } + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + this.params = params; + this.cellParams.type = params.type; + this.cellParams.min = params.min; + this.cellParams.max = params.max; + this.cellParams.unit = params.unit; + this.cellParams.mandatory = params.mandatory; + this.value = params.value; + } + + /** + * Sets value + */ + setValue(value: any): void { + this.value = value; + } + + /** + * Refreshes cell - Gets called after editing + */ + refresh(params: any): boolean { + return false; + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.html new file mode 100644 index 0000000..2e1b444 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.html @@ -0,0 +1,4 @@ + +Keine Werte vorhanden \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.scss new file mode 100644 index 0000000..8febdc6 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.scss @@ -0,0 +1,8 @@ + + +/* NOTE: column width 100% (app-grid-select-editor) in basic.scss */ + +select { + width: 100%; + max-width: 250px; +} \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.ts new file mode 100644 index 0000000..89a43ad --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.ts @@ -0,0 +1,104 @@ +import {Component} from '@angular/core'; +import {IGridSelectItem} from '../grid-select-item'; +import {GridEditorComponent} from '../../grid-editor-component'; +import {GridSelectFactory} from '../grid-select-factory'; +import {IGridCellEditorParams} from '../../grid-cell-editor-params'; + +@Component({ + selector: 'app-grid-select-editor', + templateUrl: './grid-select-editor.component.html', + styleUrls: ['./grid-select-editor.component.scss'] +}) + +export class GridSelectEditorComponent extends GridEditorComponent { + + public values: IGridSelectItem[]; + public selectedItem: IGridSelectItem; + public newValue: IGridSelectItem; + public itemKey: string; + public itemValueKeys: string[]; + public noValueAvailable: boolean; + + /** + * Initialize select editor (called after double-click) + */ + agInit(params: any): void { + super.agInit(params); + this.noValueAvailable = false; + const cellEditorParams: IGridCellEditorParams = params.column.colDef.cellEditorParams as IGridCellEditorParams; + this.values = []; + + this.itemKey = cellEditorParams.itemKey; + this.itemValueKeys = cellEditorParams.itemValueKeys; + const relatedValue: string | null = cellEditorParams.relatesOnDgField; + + if (null !== relatedValue) { + const itemRange: any[] = (params.node.data.hasOwnProperty(relatedValue) && null !== params.node.data[relatedValue]) ? + cellEditorParams.values[params.node.data[relatedValue]] : null; + + if (null !== itemRange && undefined !== itemRange) { + itemRange.forEach(item => { + this.values.push(GridSelectFactory.getGridSelectItem(item, this.itemKey, this.itemValueKeys)); + }); + } + + } else if (cellEditorParams.exclusive === true) { + // Filter all items used by other selects (compareData) + const compareExcludeKey: string = cellEditorParams.exclusiveCompareDataKey; + const excludedItemKeys: {} = {}; + cellEditorParams.exclusiveCompareData.forEach(item => { + if (item[compareExcludeKey] !== this.value) { + excludedItemKeys[item[compareExcludeKey]] = 1; + } + }); + // This select contains only values that are not selected by other selects and it's own current item + cellEditorParams.values.forEach(item => { + if (!excludedItemKeys.hasOwnProperty(item[this.itemKey])) { + this.values.push(GridSelectFactory.getGridSelectItem(item, this.itemKey, this.itemValueKeys)); + } + }); + } else { + // Static values (default behaviour) + this.values = params.values; + } + this.selectedItem = this.getSelectedItem(params.value); + } + + /** + * Returns value to cell renderer + */ + getValue(): any { + return null === this.newValue ?? this.newValue.key; + } + + /** + * Makes selectItem out of ID + */ + public getSelectedItem(e: any): IGridSelectItem { + if (null !== e && e !== '') { + for (const item of this.values) { + if (item.key === e) { + this.newValue = item; + break; + } + } + } else { + if (this.values.length > 0) { + this.newValue = this.values[0]; + } else { + // No value in select available + this.noValueAvailable = true; + this.newValue = null; + return; + } + } + return this.newValue; + } + + /** + * Overwrite + */ + public afterGuiAttached(): void { + // do nothing + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-factory.ts b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-factory.ts new file mode 100644 index 0000000..5b4e3f7 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-factory.ts @@ -0,0 +1,123 @@ +import {Const} from '../../utils/const'; +import {IGridSelectItem} from './grid-select-item'; + + +export class GridSelectFactory { + /** + * Returns select item for grid + */ + static getGridSelect(headerName: string, field: string, editable: boolean, values: any[], itemKey: string, + itemValueKeys: string[], mandatory: boolean = true, relatesOnDgField: string = null, + headerClass: string = null, pinned: boolean = false, cellClass: any = null, + exclusive: boolean = false, exclusiveCompareData: any = null, exclusiveCompareDataKey: string = null): {} { + + if (null !== relatesOnDgField && exclusive) { + // NOTE: This is not allowed for now, maybe needed in future + throw new Error('Select can be either relative or exclusive'); + } + + const res = { + headerName, + field, + headerClass, + pinned, + editable, + cellClass: null === cellClass ?? (editable ? '' : Const.CSS_NO_EDIT), + cellRenderer: 'gridSelectRenderer', + cellEditor: 'gridSelectEditor', + cellEditorParams: { + values: null === relatesOnDgField && !exclusive ? GridSelectFactory.getGridSelectItems(values, itemKey, itemValueKeys, mandatory) : values, + itemKey, + itemValueKeys, + mandatory, + relatesOnDgField, + exclusive, + exclusiveCompareData, + exclusiveCompareDataKey + } + }; + if (mandatory) { + res['cellClassRules'] = { + error(params) { + return params.value == null; + } + }; + } + return res; + } + + /** + * Returns select item for grid without renderer and editor + */ + static getGridSelectForSelectors(headerName: string, field: string, editable: boolean, values: any[], itemKey: string, + itemValueKeys: string[], mandatory: boolean = true, relatesOnDgField: string = null, + headerClass: string = null, pinned: boolean = false, cellClass: any = null, + exclusive: boolean = false, exclusiveCompareData: any = null, exclusiveCompareDataKey: string = null): {} { + + const res: {} = GridSelectFactory.getGridSelect( + headerName, field, editable, values, itemKey, itemValueKeys, mandatory, relatesOnDgField, + headerClass, pinned, cellClass, exclusive, exclusiveCompareData, exclusiveCompareDataKey + ); + delete res['cellRenderer']; + delete res['cellEditor']; + return res; + } + + /** + * Returns array of grid select items + */ + static getGridSelectItems(objArray: any[], key: string, valueKeys: string[], mandatory: boolean = true): IGridSelectItem[] { + const res: IGridSelectItem[] = []; + + if (!mandatory) { + // Add empty item (null value) + res.push(GridSelectFactory.getGridSelectItem({key: null, value: '-'}, 'key', valueKeys, true)); + } + + objArray.forEach(item => { + res.push(GridSelectFactory.getGridSelectItem(item, key, valueKeys)); + }); + return res; + } + + /** + * Returns single grid select item + */ + static getGridSelectItem(obj: any, key: string, valueKeys: string[], isNullItem: boolean = false): IGridSelectItem { + if (!obj.hasOwnProperty(key)) { + throw new Error('GridFactory: Key not found: ' + key); + } + + let gridItem: {} = {}; + if (!isNullItem) { + for (const item of valueKeys) { + if (!obj.hasOwnProperty(key) || !obj.hasOwnProperty(item)) { + throw new Error('GridFactory: Value not found: ' + item); + } + } + gridItem = { + key: obj[key], + value: GridSelectFactory.getGridSelectItemValue(obj, valueKeys) + }; + } else { + // Empty placeholder item + gridItem = { + key: obj.key, + value: obj.value + }; + } + return gridItem as IGridSelectItem; + } + + /** + * Returns displayed value of grid item + */ + static getGridSelectItemValue(obj: any, valueKeys: string[]): string { + let value = ''; + for (let i = 0; i < valueKeys.length; i++) { + value += obj[valueKeys[i]]; + value += i < (valueKeys.length - 1) ? ' - ' : ''; + } + return value; + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-item.ts b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-item.ts new file mode 100644 index 0000000..e700617 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-item.ts @@ -0,0 +1,4 @@ +export interface IGridSelectItem { + key: string; + value: string; +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.html new file mode 100644 index 0000000..b26a235 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.html @@ -0,0 +1 @@ +{{value}} \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.ts new file mode 100644 index 0000000..bd66b53 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.ts @@ -0,0 +1,83 @@ +import {Component} from '@angular/core'; +import {IGridSelectItem} from '../grid-select-item'; +import {GridRendererComponent} from '../../grid-renderer-component'; +import {GridSelectFactory} from '../grid-select-factory'; + +@Component({ + selector: 'app-grid-select-renderer', + templateUrl: './grid-select-renderer.component.html', + styleUrls: ['./grid-select-renderer.component.scss'] +}) + +export class GridSelectRendererComponent extends GridRendererComponent { + + public itemRange: IGridSelectItem[]; + public currentIndex: number; + + constructor() { + super(); + this.itemRange = null; + this.currentIndex = null; + } + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + if (null === params.colDef.cellEditorParams.relatesOnDgField) { + // Static item range (default behaviour) + this.setStaticValue(params); + } else { + // Item range relates on other dg field + this.setRelatedValue(params); + } + } + + /** + * Case for static item range (all items in column have the same select items - default) + */ + private setStaticValue(params: any): void { + if (this.itemRange === null || undefined === this.itemRange) { + // Item range is the same for all rows + this.itemRange = params.colDef.cellEditorParams.values as IGridSelectItem[]; + if (null !== params.value) { + for (const item of this.itemRange) { + if (item.key === params.value) { + this.value = item.value; + break; + } + } + } else { + this.value = params.colDef.cellEditorParams.mandatory ? 'Bitte wählen' : ''; + } + } + } + + /** + * Case for item range related on other dg grid field (Select has always to be updated within init) + */ + private setRelatedValue(params: any): void { + // @TODO: Might be checked + const relatedValue: any = params.colDef.cellEditorParams.relatesOnDgField; + const itemKey: any = params.colDef.cellEditorParams.itemKey; + const itemValueKeys: string[] = params.colDef.cellEditorParams.itemValueKeys; + + // Get item range by related value + this.itemRange = params.data.hasOwnProperty(relatedValue) && null !== params.data[relatedValue] ? + params.colDef.cellEditorParams.values[params.data[relatedValue]] : null; + + if (null !== params.value && null !== this.itemRange) { + // let value: string = GridFactory.getGridSelectItemValue() + for (const item of this.itemRange) { + if (item[itemKey] === params.value) { + this.value = GridSelectFactory.getGridSelectItemValue(item, itemValueKeys); + break; + } + } + } else { + this.value = 'Bitte wählen'; + } + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.html new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.ts new file mode 100644 index 0000000..9989c55 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.ts @@ -0,0 +1,24 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; + +@Component({ + selector: 'app-grid-text-editor', + templateUrl: './grid-text-editor.component.html', + styleUrls: ['./grid-text-editor.component.scss'] +}) + +export class GridTextEditorComponent extends GridEditorComponent { + /** + * Cancels before value input (this editor is never editable) + */ + public isCancelBeforeStart(): boolean { + return true; + } + + /** + * Overwrite + */ + public afterGuiAttached(): void { + // do nothing + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.html new file mode 100644 index 0000000..9296c73 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.html @@ -0,0 +1 @@ +
{{value}}
\ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.ts new file mode 100644 index 0000000..db4f660 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.ts @@ -0,0 +1,27 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; +import {AgGridComponentConst} from '../../../components/ag-grid-component-const'; + +@Component({ + selector: 'app-grid-text-renderer', + templateUrl: './grid-text-renderer.component.html', + styleUrls: ['./grid-text-renderer.component.scss'] +}) + +export class GridTextRendererComponent extends GridRendererComponent { + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + if (undefined !== this.cellParams) { + // Replace "." with "," for display purpose + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + this.value = isNaN(this.value) || null === this.value ? '' : parseFloat(parseFloat(this.value).toFixed(2)).toLocaleString('de-DE'); + } + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_INT) { + this.value = isNaN(this.value) || null === this.value? '' : this.value = parseInt(parseInt(this.value).toFixed(2)).toLocaleString('de-DE'); + } + } + } +} diff --git a/plp-angular/src/app/interceptor/route-interceptor.ts b/plp-angular/src/app/interceptor/route-interceptor.ts new file mode 100644 index 0000000..66e0dbc --- /dev/null +++ b/plp-angular/src/app/interceptor/route-interceptor.ts @@ -0,0 +1,34 @@ +import {Injectable} from '@angular/core'; +import { Router } from '@angular/router'; +import {AppService} from '../services/app.service'; +import {Subscription} from 'rxjs/index'; +import {ILoginState} from '../model/virtual/login-state'; + +@Injectable({ + providedIn: 'root' +}) +export class RouteInterceptor { + private loginSub: Subscription; + private loginState: ILoginState; + + /** + * Constructor of router service + */ + constructor(private router: Router, private appService: AppService) { + // Observe login state + this.loginSub = this.appService.getLoginState$().subscribe( + data => this.loginState = data); + } + + /** + * Checks if user is logged in and redirects to login page if not + * @returns {boolean} + */ + canActivate(): boolean { + if (this.loginState == null || !this.loginState.isLoggedIn) { + this.router.navigate(['./login']); + return false; + } + return true; + } +} diff --git a/plp-angular/src/app/lang/ag-gridlocale.ts b/plp-angular/src/app/lang/ag-gridlocale.ts new file mode 100644 index 0000000..dac4c38 --- /dev/null +++ b/plp-angular/src/app/lang/ag-gridlocale.ts @@ -0,0 +1,96 @@ +export class AgGridLocale { + static getLocale(): {} { + return { + // for filter panel + page: 'Seite', + more: 'mehr', + to: 'bis', + of: 'von', + next: 'nächstes', + last: 'letztes', + first: 'erstes', + previous: 'vorheriges', + loadingOoo: 'lade...', + + // for set filter + selectAll: 'Alle auswählen', + searchOoo: 'Suche...', + blanks: 'leer', + + // for number filter and text filter + filterOoo: 'Filter...', + applyFilter: 'Filter anwenden...', + equals: 'gleich', + notEquals: 'nicht gleich', + notEqual: 'nicht gleich', + + // for number filter + lessThan: 'weniger als', + greaterThan: 'größer als', + lessThanOrEqual: 'weniger oder gleich', + greaterThanOrEqual: 'größer oder gleich', + inRange: 'in Spanne', + + // for text filter + contains: 'beinhaltet', + notContains: 'beinhaltet nicht', + startsWith: 'beginnt mit', + endsWith: 'endet mit', + + // the header of the default group column + group: 'Gruppe', + + // tool panel + columns: 'Spalten', + filters: 'Filter', + rowGroupColumns: 'Pivot Spalten', + rowGroupColumnsEmptyMessage: 'Ziehe Spalten in Gruppe', + valueColumns: 'Spalten Werte', + pivotMode: 'Pivot-Mode', + groups: 'Gruppen', + values: 'Werte', + pivots: 'Pivots', + valueColumnsEmptyMessage: 'Ziehe Spalten zum zusammen', + pivotColumnsEmptyMessage: 'Für Pivot hierher ziehen', + toolPanelButton: 'Tool Feld', + + // other + noRowsToShow: 'Keine Zeilen', + + // enterprise menu + pinColumn: 'Spalte anpinnen', + valueAggregation: 'Agg Wert', + autosizeThiscolumn: 'Auto-Breite für diese Spalte', + autosizeAllColumns: 'Auto-Breite für alle Spalte', + groupBy: 'Gruppieren nach', + ungroupBy: 'Gruppierung aufheben nach', + resetColumns: 'Spalten zurücksetzen', + expandAll: 'Alle öffnen', + collapseAll: 'Alle schließen', + toolPanel: 'Tool Feld', + export: 'Export', + csvExport: 'CSV Export', + excelExport: 'Excel Export', + + // enterprise menu pinning + pinLeft: 'Anpinnen <<', + pinRight: 'Anpinnen >>', + noPin: 'Nicht anpinnen <>', + + // enterprise menu aggregation and status bar + sum: 'Summe', + min: 'Min', + max: 'Max', + none: 'Nichts', + count: 'Anzahl', + average: 'Durchschnitt', + + // standard menu + copy: 'Kopieren', + copyWithHeaders: 'Mit Köpfen kopieren', + ctrlC: 'strg und C', + paste: 'Einfügen', + ctrlV: 'strg und V' + }; + } +} diff --git a/plp-angular/src/app/model/constants/tools.ts b/plp-angular/src/app/model/constants/tools.ts new file mode 100644 index 0000000..a2d6788 --- /dev/null +++ b/plp-angular/src/app/model/constants/tools.ts @@ -0,0 +1,24 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const tools = { + ROLE_ADMIN: 'ROLE_ADMIN', + ROLE_SALES: 'ROLE_SALES', + ROLE_TECHNIQUE: 'ROLE_TECHNIQUE', + ROLE_PRODUCTION: 'ROLE_PRODUCTION', + ROLE_ACCOUNTING: 'ROLE_ACCOUNTING', + ROLE_SERVICE: 'ROLE_SERVICE', + + COLORS: [ + '#4397d4', // blue + '#b56cdc', // purple + '#dd6bbe', // pink + '#45d4a7', // green + '#fede62', // yellow + '#fdb753', // orange + '#808080', // grey + '#363636' // black + ], +}; diff --git a/plp-angular/src/app/model/entities/calendar-legend.ts b/plp-angular/src/app/model/entities/calendar-legend.ts new file mode 100644 index 0000000..73d7978 --- /dev/null +++ b/plp-angular/src/app/model/entities/calendar-legend.ts @@ -0,0 +1,5 @@ +export interface ICalendarLegend { + id: number; + type: string; + name: string; +} diff --git a/plp-angular/src/app/model/entities/country.ts b/plp-angular/src/app/model/entities/country.ts new file mode 100644 index 0000000..961d04e --- /dev/null +++ b/plp-angular/src/app/model/entities/country.ts @@ -0,0 +1,5 @@ +export interface ICountry { + id: number; + name: string; + iso_code: string; +} diff --git a/plp-angular/src/app/model/entities/customer-contact.ts b/plp-angular/src/app/model/entities/customer-contact.ts new file mode 100644 index 0000000..38750aa --- /dev/null +++ b/plp-angular/src/app/model/entities/customer-contact.ts @@ -0,0 +1,21 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface ICustomerContact extends EntityInterface { + customer_id: string; + gender: string; + firstname: string; + lastname: string; + email: string; + phone_no: string; + mobile_no: string; + fax_no: string; + department: string; + date_of_birth: string; + comment: string; + street: string; + street_no: string; + zip: string; + city: string; + country_id: number; + is_xmas_mail_recipient: boolean; +} diff --git a/plp-angular/src/app/model/entities/customer-meeting-participant.ts b/plp-angular/src/app/model/entities/customer-meeting-participant.ts new file mode 100644 index 0000000..1a363a3 --- /dev/null +++ b/plp-angular/src/app/model/entities/customer-meeting-participant.ts @@ -0,0 +1,6 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface ICustomerMeetingParticipant extends EntityInterface { + customer_meeting_id: number; + participant_user_id: number; +} diff --git a/plp-angular/src/app/model/entities/customer-meeting.ts b/plp-angular/src/app/model/entities/customer-meeting.ts new file mode 100644 index 0000000..2a8f0c3 --- /dev/null +++ b/plp-angular/src/app/model/entities/customer-meeting.ts @@ -0,0 +1,24 @@ +import {EntityInterface} from '../interface/entity-interface'; +import {ICustomerMeetingParticipant} from './customer-meeting-participant'; +import {MeetingInterface} from '../interface/meeting-interface'; + +export interface ICustomerMeeting extends EntityInterface, MeetingInterface { + customer_id: number; + meeting_type_id: number; + is_option_meeting: boolean; + customer_contact_id: number; + gender: string; + firstname: string; + lastname: string; + email: string; + phone_no: string; + mobile_no: string; + department: string; + street: string; + street_no: string; + zip: string; + city: string; + country_id: number; + v_participants: ICustomerMeetingParticipant[]; + v_is_editable: boolean; +} diff --git a/plp-angular/src/app/model/entities/customer-note.ts b/plp-angular/src/app/model/entities/customer-note.ts new file mode 100644 index 0000000..387b7e6 --- /dev/null +++ b/plp-angular/src/app/model/entities/customer-note.ts @@ -0,0 +1,22 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface ICustomerNote extends EntityInterface { + customer_id: number; + customer_contact_id: number; + user_id: number; + gender: string; + firstname: string; + lastname: string; + email: string; + phone_no: string; + mobile_no: string; + fax_no: string; + department: string; + title: string; + comment: string; + note_date: string; + creation_date: string; + creation_user_id: number; + creation_user_firstname: string; + creation_user_lastname: string; +} diff --git a/plp-angular/src/app/model/entities/customer.ts b/plp-angular/src/app/model/entities/customer.ts new file mode 100644 index 0000000..3bd401f --- /dev/null +++ b/plp-angular/src/app/model/entities/customer.ts @@ -0,0 +1,26 @@ +import {ICustomerContact} from './customer-contact'; +import {EntityInterface} from '../interface/entity-interface'; +import {ICustomerMeeting} from './customer-meeting'; +import {ICustomerNote} from './customer-note'; + +export interface ICustomer extends EntityInterface { + old_plp_id: string; + name: string; + name_additional: string; + consultant_user_id: number; + street: string; + street_no: string; + zip: string; + city: string; + country_id: number; + url: string; + email: string; + phone_no: string; + mobile_no: string; + fax_no: string; + comment: string; + active: boolean; + v_customer_contacts: ICustomerContact[]; + v_customer_notes: ICustomerNote[]; + v_customer_meetings: ICustomerMeeting[]; +} diff --git a/plp-angular/src/app/model/entities/internal-meeting-participant.ts b/plp-angular/src/app/model/entities/internal-meeting-participant.ts new file mode 100644 index 0000000..8197996 --- /dev/null +++ b/plp-angular/src/app/model/entities/internal-meeting-participant.ts @@ -0,0 +1,6 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface IInternalMeetingParticipant extends EntityInterface { + internal_meeting_id: number; + participant_user_id: number; +} diff --git a/plp-angular/src/app/model/entities/internal-meeting.ts b/plp-angular/src/app/model/entities/internal-meeting.ts new file mode 100644 index 0000000..4286a90 --- /dev/null +++ b/plp-angular/src/app/model/entities/internal-meeting.ts @@ -0,0 +1,9 @@ +import {EntityInterface} from '../interface/entity-interface'; +import {IInternalMeetingParticipant} from './internal-meeting-participant'; +import {MeetingInterface} from '../interface/meeting-interface'; + +export interface IInternalMeeting extends EntityInterface, MeetingInterface { + creation_user_id: number; + v_participants: IInternalMeetingParticipant[]; + v_is_editable: boolean; +} diff --git a/plp-angular/src/app/model/entities/meeting-type.ts b/plp-angular/src/app/model/entities/meeting-type.ts new file mode 100644 index 0000000..a88d2ff --- /dev/null +++ b/plp-angular/src/app/model/entities/meeting-type.ts @@ -0,0 +1,6 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface IMeetingType extends EntityInterface { + type: string; + name: string; +} diff --git a/plp-angular/src/app/model/entities/user-type.ts b/plp-angular/src/app/model/entities/user-type.ts new file mode 100644 index 0000000..2b1c075 --- /dev/null +++ b/plp-angular/src/app/model/entities/user-type.ts @@ -0,0 +1,7 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface IUserType extends EntityInterface { + user_type_id: number; + type: string; + v_roles: string[]; +} diff --git a/plp-angular/src/app/model/entities/user.ts b/plp-angular/src/app/model/entities/user.ts new file mode 100644 index 0000000..3731ac8 --- /dev/null +++ b/plp-angular/src/app/model/entities/user.ts @@ -0,0 +1,12 @@ +import {IUserType} from './user-type'; +import {EntityInterface} from '../interface/entity-interface'; + +export interface IUser extends EntityInterface { + email: string; + firstname: string; + lastname: string; + active: boolean; + visible: boolean; + v_translated_role: string; + v_user_type: IUserType; +} diff --git a/plp-angular/src/app/model/interface/entity-interface.ts b/plp-angular/src/app/model/interface/entity-interface.ts new file mode 100644 index 0000000..396fa22 --- /dev/null +++ b/plp-angular/src/app/model/interface/entity-interface.ts @@ -0,0 +1,3 @@ +export interface EntityInterface { + id: number; +} diff --git a/plp-angular/src/app/model/interface/meeting-interface.ts b/plp-angular/src/app/model/interface/meeting-interface.ts new file mode 100644 index 0000000..ba6cfb9 --- /dev/null +++ b/plp-angular/src/app/model/interface/meeting-interface.ts @@ -0,0 +1,13 @@ +export interface MeetingInterface { + creation_user_id: number; + owner_user_id: number; + title: string; + description: string; + start_date: string; + end_date: string; + report: string; + first_reminder_sent: boolean; + second_reminder_sent: boolean; + report_reminder_sent: boolean; + creation_date: string; +} \ No newline at end of file diff --git a/plp-angular/src/app/model/virtual/api-response.ts b/plp-angular/src/app/model/virtual/api-response.ts new file mode 100644 index 0000000..6eb8362 --- /dev/null +++ b/plp-angular/src/app/model/virtual/api-response.ts @@ -0,0 +1,13 @@ +import {IAppServiceData} from './app-service-data'; + +export interface IApiResponse { + result_data: any; + success_code: number; + success_msg: string; + info_code: number; + info_msg: string; + error_code: number; + error_msg: string; + optional_info: string; + service_data: IAppServiceData; +} diff --git a/plp-angular/src/app/model/virtual/app-service-data-item.ts b/plp-angular/src/app/model/virtual/app-service-data-item.ts new file mode 100644 index 0000000..e4a7a08 --- /dev/null +++ b/plp-angular/src/app/model/virtual/app-service-data-item.ts @@ -0,0 +1,7 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface IAppServiceDataItem { + add: EntityInterface[]; + edit: EntityInterface[]; + delete: number[]; +} diff --git a/plp-angular/src/app/model/virtual/app-service-data.ts b/plp-angular/src/app/model/virtual/app-service-data.ts new file mode 100644 index 0000000..af257a6 --- /dev/null +++ b/plp-angular/src/app/model/virtual/app-service-data.ts @@ -0,0 +1,17 @@ +import {IAppServiceDataItem} from './app-service-data-item'; + +export interface IAppServiceData { + customers: IAppServiceDataItem; + operators: IAppServiceDataItem; + productions: IAppServiceDataItem; + services: IAppServiceDataItem; + customerContacts: IAppServiceDataItem; + operatorContacts: IAppServiceDataItem; + serviceContacts: IAppServiceDataItem; + productionContacts: IAppServiceDataItem; + customerMeetings: IAppServiceDataItem; + operatorMeetings: IAppServiceDataItem; + productionMeetings: IAppServiceDataItem; + serviceMeetings: IAppServiceDataItem; + internalMeetings: IAppServiceDataItem; +} diff --git a/plp-angular/src/app/model/virtual/config.ts b/plp-angular/src/app/model/virtual/config.ts new file mode 100644 index 0000000..1c80507 --- /dev/null +++ b/plp-angular/src/app/model/virtual/config.ts @@ -0,0 +1,12 @@ +import {IUser} from '../entities/user'; +import {IMeetingType} from '../entities/meeting-type'; +import {ICountry} from '../entities/country'; + +export interface IConfig { + users: IUser[]; + meeting_types: IMeetingType[]; + countries: ICountry[]; + vc_user_by_id: {}; + vc_meeting_types_by_id: {}; + vc_countries_by_id: {}; +} diff --git a/plp-angular/src/app/model/virtual/customer-data.ts b/plp-angular/src/app/model/virtual/customer-data.ts new file mode 100644 index 0000000..7c8fd25 --- /dev/null +++ b/plp-angular/src/app/model/virtual/customer-data.ts @@ -0,0 +1,9 @@ +import {ICustomer} from '../entities/customer'; +import {ICustomerContact} from '../entities/customer-contact'; +import {ICustomerMeeting} from '../entities/customer-meeting'; + +export interface ICustomerData { + customers: ICustomer[]; + customerContacts: ICustomerContact[]; + customerMeetings: ICustomerMeeting[]; +} diff --git a/plp-angular/src/app/model/virtual/grid-validation-errors.ts b/plp-angular/src/app/model/virtual/grid-validation-errors.ts new file mode 100644 index 0000000..f3c63a3 --- /dev/null +++ b/plp-angular/src/app/model/virtual/grid-validation-errors.ts @@ -0,0 +1,4 @@ +export interface IGridValidationErrors { + column: number; + row: string; +} diff --git a/plp-angular/src/app/model/virtual/login-state.ts b/plp-angular/src/app/model/virtual/login-state.ts new file mode 100644 index 0000000..c91235f --- /dev/null +++ b/plp-angular/src/app/model/virtual/login-state.ts @@ -0,0 +1,10 @@ +import {IUser} from '../entities/user'; +import {IConfig} from './config'; + +export interface ILoginState { + message: string; + resultCode: number; + isLoggedIn: boolean; + user: IUser; + config: IConfig; +} diff --git a/plp-angular/src/app/model/virtual/meeting-data.ts b/plp-angular/src/app/model/virtual/meeting-data.ts new file mode 100644 index 0000000..035749b --- /dev/null +++ b/plp-angular/src/app/model/virtual/meeting-data.ts @@ -0,0 +1,7 @@ +import {ICustomerMeeting} from '../entities/customer-meeting'; +import {IInternalMeeting} from '../entities/internal-meeting'; + +export interface IMeetingData { + customerMeetings: ICustomerMeeting[]; + internalMeetings: IInternalMeeting[]; +} diff --git a/plp-angular/src/app/model/virtual/message.ts b/plp-angular/src/app/model/virtual/message.ts new file mode 100644 index 0000000..38c1d84 --- /dev/null +++ b/plp-angular/src/app/model/virtual/message.ts @@ -0,0 +1,10 @@ +export interface IMessage { + success_code: number; + success_msg: string; + info_code: number; + info_msg: string; + error_code: number; + error_msg: string; + client_error_code: number; + optional_info: string; +} diff --git a/plp-angular/src/app/model/virtual/role.ts b/plp-angular/src/app/model/virtual/role.ts new file mode 100644 index 0000000..f35ce4a --- /dev/null +++ b/plp-angular/src/app/model/virtual/role.ts @@ -0,0 +1,5 @@ +export interface IRole { + user_type_id: number; + roles: string[]; + translation: string; +} diff --git a/plp-angular/src/app/services/app.service.ts b/plp-angular/src/app/services/app.service.ts new file mode 100644 index 0000000..a2f73b9 --- /dev/null +++ b/plp-angular/src/app/services/app.service.ts @@ -0,0 +1,148 @@ +import {Injectable} from '@angular/core'; +import {BehaviorSubject, Observable} from 'rxjs'; +import {IUser} from '../model/entities/user'; +import {CacheService} from './cache.service'; +import {ILoginState} from '../model/virtual/login-state'; +import {Router} from '@angular/router'; +import {IConfig} from '../model/virtual/config'; +import {HttpService} from './http.service'; +import {IApiResponse} from '../model/virtual/api-response'; +import {Utils} from '../utils/utils'; +import {CustomerService} from './customer.service'; +import {MeetingService} from './meeting.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AppService { + + private loginState: BehaviorSubject; + private user: BehaviorSubject; + private dataLoginState$: Observable; + private dataUser$: Observable; + private config: IConfig; + + constructor( + private httpService: HttpService, + private cacheService: CacheService, + private router: Router, + private customerService: CustomerService, + private meetingService: MeetingService, + ) { + this.loginState = new BehaviorSubject(cacheService.getItem('loginState') as ILoginState); + this.user = new BehaviorSubject(cacheService.getItem('user') as IUser); + this.dataLoginState$ = this.loginState.asObservable(); + this.dataUser$ = this.user.asObservable(); + this.config = this.cacheService.getItem('config') as IConfig; + } + + /** + * Returns observable of login state + * @returns {Observable} + */ + public getLoginState$(): Observable { + return this.dataLoginState$; + } + + /** + * Returns observable of user + * @returns {Observable} + */ + public getUser$(): Observable { + return this.dataUser$; + } + + /** + * Returns config object + */ + public getConfig(): IConfig { + return this.config; + } + + /** + * CHecks is current app user has given role + * @param {string} role + * @returns {boolean} + */ + public userHasRole(role: string): boolean { + return this.getAppUser().v_user_type.v_roles.indexOf(role) > -1; + } + + /** + * Returns app user without beeing an observable + * @returns {IUser} + */ + public getAppUser(): IUser { + return this.user.getValue(); + } + + /** + * Login call + * @param email + * @param password + */ + public login(email: string, password: string): void { + // Do login call + const postData: FormData = new FormData(); + postData.append('email', email); + postData.append('password', password); + this.httpService.apiPost('login', postData).subscribe( + data => { + const result: ILoginState = data as ILoginState; + this.cacheService.setItem('loginState', result); + this.cacheService.setItem('user', result.user); + this.loginState.next(data); + this.user.next(data.user); + this.setConfig(data.config); + } + ); + } + + /** + * Checks on running process + * @param {number} processId + * @returns {Observable} + */ + public apiCheckProcess(processId: number): Observable { + const formData = new FormData(); + formData.append('processId', JSON.stringify(processId)); + return this.httpService.apiPost('process-check', formData, true, false); + } + + /** + * Logout call + */ + public logout(): void { + this.httpService.apiPost('logout', null).subscribe( + data => { + localStorage.clear(); + this.loginState.next(null); + this.user.next(null); + this.customerService.resetCustomerServiceData(); + this.meetingService.resetMeetingServiceData(); + this.router.navigate(['./login']); + } + ); + } + + /** + * Returns the current user + * @returns {Observable} + */ + public getUser(): Observable { + return this.httpService.apiGet('get-user'); + } + + /** + * Sets and processes config + * @param {IConfig} config + */ + private setConfig(config: IConfig): void { + this.config = config; + this.config.vc_user_by_id = Utils.getSortedObjFromArray(this.config.users, 'id'); + this.config.vc_meeting_types_by_id = Utils.getSortedObjFromArray(this.config.meeting_types, 'id'); + this.config.vc_countries_by_id = Utils.getSortedObjFromArray(this.config.countries, 'id'); + this.cacheService.setItem('config', this.config); + } + +} diff --git a/plp-angular/src/app/services/cache.service.ts b/plp-angular/src/app/services/cache.service.ts new file mode 100644 index 0000000..915c141 --- /dev/null +++ b/plp-angular/src/app/services/cache.service.ts @@ -0,0 +1,36 @@ +import {Injectable} from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) + +export class CacheService { + + constructor() { + } + + /** + * Gets item + * @param key + */ + public getItem(key: string): any { + return localStorage.getItem(key) ? JSON.parse(localStorage.getItem(key)) : null; + } + + /** + * Sets item + * @param key + * @param item + */ + public setItem(key: string, item: any): void { + localStorage.setItem(key, JSON.stringify(item)); + } + + /** + * Removes item + * @param key + */ + public removeItem(key): void { + localStorage.removeItem(key); + } +} diff --git a/plp-angular/src/app/services/common.service.ts b/plp-angular/src/app/services/common.service.ts new file mode 100644 index 0000000..23ff428 --- /dev/null +++ b/plp-angular/src/app/services/common.service.ts @@ -0,0 +1,46 @@ +import {Injectable} from '@angular/core'; +import {HttpService} from './http.service'; +import {saveAs} from 'file-saver'; + +@Injectable({ + providedIn: 'root' +}) +export class CommonService { + + constructor(private httpService: HttpService) { + + } + + /** + * Returns xmas contact list pdf + * @param type + */ + public apiExportContactsPdf(filename: string, type: string): void { + const formData = new FormData(); + formData.append('type', type); + this.httpService.apiFilePost('export-contacts-pdf', formData).subscribe( + data => { + saveAs(new Blob([data], {type: 'pdf'}), filename + '.pdf'); + }, + error => { + } + ); + } + + /** + * Returns xmas contact list pdf + * @param filename + * @param type + */ + public apiExportXmasPdf(filename: string, type: string): void { + const formData = new FormData(); + formData.append('type', type); + this.httpService.apiFilePost('create-xmas-pdf', formData).subscribe( + data => { + saveAs(new Blob([data], {type: 'pdf'}), filename + '.pdf'); + }, + error => { + } + ); + } +} diff --git a/plp-angular/src/app/services/customer.service.ts b/plp-angular/src/app/services/customer.service.ts new file mode 100644 index 0000000..597b6d0 --- /dev/null +++ b/plp-angular/src/app/services/customer.service.ts @@ -0,0 +1,197 @@ +import {Injectable} from '@angular/core'; +import {BehaviorSubject, Observable, Subscription} from 'rxjs'; +import {CacheService} from './cache.service'; +import {Router} from '@angular/router'; +import {HttpService} from './http.service'; +import {ICustomer} from '../model/entities/customer'; +import {IApiResponse} from '../model/virtual/api-response'; +import {ICustomerContact} from '../model/entities/customer-contact'; +import {IAppServiceData} from '../model/virtual/app-service-data'; +import {ServiceHelper} from '../utils/service-helper'; +import {ICustomerNote} from '../model/entities/customer-note'; +import {ICustomerData} from '../model/virtual/customer-data'; + +@Injectable({ + providedIn: 'root' +}) +export class CustomerService { + + private customers: BehaviorSubject; + private dataCustomers$: Observable; + private customerContacts: BehaviorSubject; + private dataCustomerContacts$: Observable; + private serviceDataSub: Subscription; + + constructor(private httpService: HttpService, private cacheService: CacheService, private router: Router) { + this.customers = new BehaviorSubject(null); + this.dataCustomers$ = this.customers.asObservable(); + this.customerContacts = new BehaviorSubject(null); + this.dataCustomerContacts$ = this.customerContacts.asObservable(); + + // Subscription for service data + this.serviceDataSub = this.httpService.getServiceData$().subscribe( + data => { + this.handleServiceData(data as IAppServiceData); + }, error => { + } + ); + } + + /** + * Handles service data updates + */ + public handleServiceData(serviceData: IAppServiceData = null): void { + if (null !== serviceData) { + let bSetNewData = false; + let updatedCustomers: ICustomer[] = this.customers.getValue(); + let updatedCustomerContacts: ICustomerContact[] = this.customerContacts.getValue(); + if (null !== serviceData.customers) { + // Update service data + updatedCustomers = ServiceHelper.updateServiceEntries(serviceData.customers, this.customers.getValue()) as ICustomer[]; + bSetNewData = true; + } + if (null !== serviceData.customerContacts) { + // Update service data + updatedCustomerContacts = ServiceHelper.updateServiceEntries(serviceData.customerContacts, this.customerContacts.getValue()) as ICustomerContact[]; + bSetNewData = true; + } + if (bSetNewData) { + this.setCustomerServiceData(updatedCustomers, updatedCustomerContacts); + } + } + } + + /** + * Sets customer service and cache data + */ + private setCustomerServiceData(customers: ICustomer[], customerContacts: ICustomerContact[]) { + this.customers.next(customers); + this.customerContacts.next(customerContacts); + } + + /** + * Reset service data (on logout) + */ + public resetCustomerServiceData() { + this.customers.next(null); + this.customerContacts.next(null); + } + + /** + * Returns observable of customers + */ + public getCustomers$(): Observable { + return this.dataCustomers$; + }; + + /** + * Returns observable of customer contacts + */ + public getCustomerContacts$(): Observable { + return this.dataCustomerContacts$; + } + + /** + * Gets all customers + */ + public apiGetCustomerData(): void { + this.httpService.apiGet('get-customer-data').subscribe( + data => { + const res: ICustomerData = data.result_data as ICustomerData; + this.setCustomerServiceData(res.customers, res.customerContacts); + }, + error => {} + ); + } + + /** + * Returns full customer + */ + public apiGetCustomerFull(customerId: number): Observable { + const formData = new FormData(); + formData.append('customerId', JSON.stringify(customerId)); + return this.httpService.apiPost('get-customer-full', formData); + } + + /** + * Create customer + */ + public apiCreateCustomer(customer: ICustomer): Observable { + const formData = new FormData(); + formData.append('customer', JSON.stringify(customer)); + return this.httpService.apiPost('create-customer', formData); + } + + /** + * Edit customer + */ + public apiEditCustomer(customer: ICustomer): Observable { + const formData = new FormData(); + formData.append('customer', JSON.stringify(customer)); + return this.httpService.apiPost('edit-customer', formData); + } + + /** + * Create customer contact + */ + public apiCreateCustomerContact(customerContact: ICustomerContact): Observable { + const formData = new FormData(); + formData.append('customerContact', JSON.stringify(customerContact)); + return this.httpService.apiPost('create-customer-contact', formData); + } + + /** + * Edit customer contact + */ + public apiEditCustomerContact(customerContact: ICustomerContact): Observable { + const formData = new FormData(); + formData.append('customerContact', JSON.stringify(customerContact)); + return this.httpService.apiPost('edit-customer-contact', formData); + } + + /** + * Delete customer contact + */ + public apiDeleteCustomerContact(customerContactId: number): Observable { + const formData = new FormData(); + formData.append('customerContactId', JSON.stringify(customerContactId)); + return this.httpService.apiPost('delete-customer-contact', formData); + } + + /** + * Create customer note + */ + public apiCreateCustomerNote(customerNote: ICustomerNote): Observable { + const formData = new FormData(); + formData.append('customerNote', JSON.stringify(customerNote)); + return this.httpService.apiPost('create-customer-note', formData); + } + + /** + * Edit customer note + */ + public apiEditCustomerNote(customerNote: ICustomerNote): Observable { + const formData = new FormData(); + formData.append('customerNote', JSON.stringify(customerNote)); + return this.httpService.apiPost('edit-customer-note', formData); + } + + /** + * Delete customer note + */ + public apiDeleteCustomerNote(customerNoteId: number): Observable { + const formData = new FormData(); + formData.append('customerNoteId', JSON.stringify(customerNoteId)); + return this.httpService.apiPost('delete-customer-note', formData); + } + + /** + * Edit customer meeting report + */ + public apiEditCustomerMeetingReport(customerMeetingId: number, customerMeetingReport: string): Observable { + const formData = new FormData(); + formData.append('customerMeetingId', JSON.stringify(customerMeetingId)); + formData.append('customerMeetingReport', JSON.stringify(customerMeetingReport)); + return this.httpService.apiPost('edit-customer-meeting-report', formData); + } +} diff --git a/plp-angular/src/app/services/http.interceptor.ts b/plp-angular/src/app/services/http.interceptor.ts new file mode 100644 index 0000000..62f2082 --- /dev/null +++ b/plp-angular/src/app/services/http.interceptor.ts @@ -0,0 +1,18 @@ +import {Injectable} from '@angular/core'; +import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http'; + +import {Observable} from 'rxjs'; + +/** Pass untouched request through to the next request handler. */ +@Injectable({ + providedIn: 'root' +}) +export class HttpClientInterceptor implements HttpInterceptor { + + intercept(req: HttpRequest, next: HttpHandler): + Observable> { + // Does nothing at the moment + return next.handle(req); + } + +} diff --git a/plp-angular/src/app/services/http.service.ts b/plp-angular/src/app/services/http.service.ts new file mode 100644 index 0000000..c21bf4a --- /dev/null +++ b/plp-angular/src/app/services/http.service.ts @@ -0,0 +1,167 @@ +import {Injectable, Renderer2, RendererFactory2} from '@angular/core'; +import {HttpClient, HttpErrorResponse} from '@angular/common/http'; +import {BehaviorSubject, Observable} from 'rxjs'; +import {environment} from '../../environments/environment'; +import {finalize, tap} from 'rxjs/operators'; +import {MessageService} from './message.service'; +import {IApiResponse} from '../model/virtual/api-response'; +import {CacheService} from './cache.service'; +import {IAppServiceData} from '../model/virtual/app-service-data'; + + +@Injectable({ + providedIn: 'root' +}) +export class HttpService { + + /** + * Constructor + */ + constructor(private httpClient: HttpClient, private messageService: MessageService, private rendererFactory: RendererFactory2) { + this.renderer = this.rendererFactory.createRenderer(null, null); + this.serviceData = new BehaviorSubject(null); + this.dataServiceData$ = this.serviceData.asObservable(); + } + + private static AUTHENTICATION_ERROR_CODE = 401; + private static AUTHENTICATION_ERROR_MESSAGE = 'Sie sind nicht mehr im System eingeloggt. Bitte loggen Sie sich erneut ein.'; + private renderer: Renderer2; + + private dataServiceData$: Observable; + private serviceData: BehaviorSubject; + + /** + * Returns location observable + */ + public getServiceData$(): Observable { + return this.dataServiceData$; + } + + /** + * Processes optional cache service data delivered by call + */ + private checkMessages(data: IApiResponse): void { + // Show optional success message + if (undefined !== data.success_code && null !== data.success_code && data.success_code !== 0) { + this.messageService.setSuccess(data.success_code, data.success_msg); + } + + // Show optional info message + if (undefined !== data.info_code && null !== data.info_code && data.info_code !== 0) { + this.messageService.setInfoCode(data.info_code, data.info_msg); + } + + // Show optional error message + if (undefined !== data.error_code && null !== data.error_code && data.error_code !== 0) { + this.messageService.setError(data.error_code, data.error_msg); + } + } + + /** + * Handles http error repsonse + */ + private handleError(error: HttpErrorResponse, serviceDataCheck: boolean): void { + if (error.status === HttpService.AUTHENTICATION_ERROR_CODE) { + this.messageService.setError(HttpService.AUTHENTICATION_ERROR_CODE, HttpService.AUTHENTICATION_ERROR_MESSAGE); + } else { + const response: IApiResponse = error.error as IApiResponse; + this.messageService.setError(response.error_code, response.error_msg, response.optional_info); + if (serviceDataCheck) { + this.serviceData.next(response.service_data); + } + } + } + + /** + * Toggles loader icon + */ + public showLoader(show: boolean): void { + show ? + this.renderer.addClass(document.body, 'loading') : + this.renderer.removeClass(document.body, 'loading'); + } + + /** + * Api get call + */ + public apiGet(urlResource: string, id: number = null, serviceDataCheck: boolean = true, loaderIcon: boolean = true): Observable { + this.showLoader(true); + return this.httpClient.get( + // Always add active mandator id here + environment.apiUrl + urlResource + environment.debugParam, + {withCredentials: true} + ).pipe( + tap( + data => { + this.checkMessages(data); + if (serviceDataCheck) { + this.serviceData.next(data.service_data as IAppServiceData); + } + }, + error => { + this.handleError(error, serviceDataCheck); + } + ), + finalize(() => { + this.showLoader(false); + }) + ); + } + + /** + * Post api call + */ + public apiPost(urlResource: string, formData: FormData, serviceDataCheck: boolean = true, withLoaderIcon: boolean = true): Observable { + if (withLoaderIcon) { + this.showLoader(true); + } + + return this.httpClient.post( + environment.apiUrl + urlResource + environment.debugParam, + formData, + {withCredentials: true} + ).pipe( + tap( + data => { + this.checkMessages(data); + if (serviceDataCheck) { + this.serviceData.next(data.service_data as IAppServiceData); + } + }, + error => { + this.handleError(error, serviceDataCheck); + } + ), + finalize(() => { + if (withLoaderIcon) { + this.showLoader(false); + } + }) + ); + } + + /** + * Post call for excel files + */ + public apiFilePost(urlResource: string, formData: FormData): Observable { + this.showLoader(true); + return this.httpClient.post( + environment.apiUrl + urlResource + environment.debugParam, + formData, + {withCredentials: true, responseType: 'blob'}, + ).pipe( + tap( + data => { + // do nothing here + }, + error => { + this.handleError(error, false); + } + ), + finalize(() => { + this.showLoader(false); + }) + ); + } + +} diff --git a/plp-angular/src/app/services/meeting.service.ts b/plp-angular/src/app/services/meeting.service.ts new file mode 100644 index 0000000..14dfd6c --- /dev/null +++ b/plp-angular/src/app/services/meeting.service.ts @@ -0,0 +1,223 @@ +import {Injectable} from '@angular/core'; +import {BehaviorSubject, Observable, Subscription} from 'rxjs'; +import {CacheService} from './cache.service'; +import {Router} from '@angular/router'; +import {HttpService} from './http.service'; +import {IApiResponse} from '../model/virtual/api-response'; +import {IAppServiceData} from '../model/virtual/app-service-data'; +import {saveAs} from 'file-saver'; +import {ServiceHelper} from '../utils/service-helper'; +import {ICustomerMeeting} from '../model/entities/customer-meeting'; +import {IInternalMeeting} from '../model/entities/internal-meeting'; +import {IMeetingData} from '../model/virtual/meeting-data'; + +@Injectable({ + providedIn: 'root' +}) +export class MeetingService { + + private customerMeetings: BehaviorSubject; + private customerMeetings$: Observable; + private internalMeetings: BehaviorSubject; + private internalMeetings$: Observable; + private meetingData: BehaviorSubject; + private meetingData$: Observable; + private serviceDataSub: Subscription; + + constructor(private httpService: HttpService, private cacheService: CacheService, private router: Router) { + this.customerMeetings = new BehaviorSubject(null); + this.customerMeetings$ = this.customerMeetings.asObservable(); + this.internalMeetings = new BehaviorSubject(null); + this.internalMeetings$ = this.internalMeetings.asObservable(); + + this.meetingData = new BehaviorSubject(null); + this.meetingData$ = this.meetingData.asObservable(); + + // Subscription for service data + this.serviceDataSub = this.httpService.getServiceData$().subscribe( + data => { + this.handleServiceData(data as IAppServiceData); + }, error => { + } + ); + } + + /** + * Handles service data updates + */ + public handleServiceData(serviceData: IAppServiceData = null): void { + if (null !== serviceData) { + let bSetNewData = false; + let updatedCustomerMeetings: ICustomerMeeting[] = this.customerMeetings.getValue(); + let updatedInternalMeetings: IInternalMeeting[] = this.internalMeetings.getValue(); + if (null !== serviceData.customerMeetings) { + // Update service data + updatedCustomerMeetings = ServiceHelper.updateServiceEntries(serviceData.customerMeetings, this.customerMeetings.getValue()) as ICustomerMeeting[]; + bSetNewData = true; + } + if (null !== serviceData.internalMeetings) { + // Update service data + updatedInternalMeetings = ServiceHelper.updateServiceEntries(serviceData.internalMeetings, this.internalMeetings.getValue()) as IInternalMeeting[]; + bSetNewData = true; + } + + if (bSetNewData) { + const meetingData: {} = { + customerMeetings: updatedCustomerMeetings, + internalMeetings: updatedInternalMeetings, + }; + this.setMeetingServiceData(meetingData as IMeetingData); + } + } + } + + /** + * Sets customer service and cache data + */ + private setMeetingServiceData(meetingData: IMeetingData) { + this.meetingData.next(meetingData); + this.customerMeetings.next(meetingData.customerMeetings); + this.internalMeetings.next(meetingData.internalMeetings); + } + + /** + * Reset service data (on logout) + */ + public resetMeetingServiceData() { + this.meetingData.next(null); + this.customerMeetings.next(null); + this.internalMeetings.next(null); + } + + public getMeetingsData$(): Observable { + return this.meetingData$; + } + + public getCustomerMeetings$(): Observable { + return this.customerMeetings$; + } + + public getInternalMeetings$(): Observable { + return this.internalMeetings$; + } + + /** + * Gets meeting data + */ + public apiGetMeetingData(): void { + this.httpService.apiGet('get-meeting-data').subscribe( + data => { + const res: IMeetingData = data.result_data as IMeetingData; + this.setMeetingServiceData(res); + }, + error => {} + ); + } + + /** + * Create customer meeting + */ + public apiCreateCustomerMeeting(customerMeeting: ICustomerMeeting): Observable { + const formData = new FormData(); + formData.append('customerMeeting', JSON.stringify(customerMeeting)); + return this.httpService.apiPost('create-customer-meeting', formData); + } + + /** + * Edit customer meeting + */ + public apiEditCustomerMeeting(customerMeeting: ICustomerMeeting): Observable { + const formData = new FormData(); + formData.append('customerMeeting', JSON.stringify(customerMeeting)); + return this.httpService.apiPost('edit-customer-meeting', formData); + } + + /** + * Delete customer meeting + */ + public apiDeleteCustomerMeeting(customerMeetingId: number): Observable { + const formData = new FormData(); + formData.append('customerMeetingId', JSON.stringify(customerMeetingId)); + return this.httpService.apiPost('delete-customer-meeting', formData); + } + + /** + * Checks customer meeting report + */ + public apiCheckCustomerMeetingReport(customerMeetingId: number): Observable { + const formData = new FormData(); + formData.append('customerMeetingId', JSON.stringify(customerMeetingId)); + return this.httpService.apiPost('check-customer-meeting-report', formData, true); + } + + /** + * Edit customer meeting report + */ + public apiEditCustomerMeetingReport(customerMeetingId: number, customerMeetingReport: string): Observable { + const formData = new FormData(); + formData.append('customerMeetingId', JSON.stringify(customerMeetingId)); + formData.append('customerMeetingReport', JSON.stringify(customerMeetingReport)); + return this.httpService.apiPost('edit-customer-meeting-report', formData); + } + + /** + * Create internal meeting + */ + public apiCreateInternalMeeting(internalMeeting: IInternalMeeting): Observable { + const formData = new FormData(); + formData.append('internalMeeting', JSON.stringify(internalMeeting)); + return this.httpService.apiPost('create-internal-meeting', formData); + } + + /** + * Edit internal meeting + */ + public apiEditInternalMeeting(internalMeeting: IInternalMeeting): Observable { + const formData = new FormData(); + formData.append('internalMeeting', JSON.stringify(internalMeeting)); + return this.httpService.apiPost('edit-internal-meeting', formData); + } + + /** + * Delete internal meeting + */ + public apiDeleteInternalMeeting(internalMeetingId: number): Observable { + const formData = new FormData(); + formData.append('internalMeetingId', JSON.stringify(internalMeetingId)); + return this.httpService.apiPost('delete-internal-meeting', formData); + } + + /** + * Checks internal meeting report + */ + public apiCheckInternalMeetingReport(internalMeetingId: number): Observable { + const formData = new FormData(); + formData.append('internalMeetingId', JSON.stringify(internalMeetingId)); + return this.httpService.apiPost('check-internal-meeting-report', formData, false); + } + + /** + * Edit internal meeting report + */ + public apiEditInternalMeetingReport(internalMeetingId: number, internalMeetingReport: string): Observable { + const formData = new FormData(); + formData.append('internalMeetingId', JSON.stringify(internalMeetingId)); + formData.append('internalMeetingReport', JSON.stringify(internalMeetingReport)); + return this.httpService.apiPost('edit-internal-meeting-report', formData); + } + + /** + * Returns meeting list as excel + */ + public apiExportMeetingList(meetingList: {}[], fileName: string): void { + const formData = new FormData(); + formData.append('meetingList', JSON.stringify(meetingList)); + this.httpService.apiFilePost('export-meeting-list', formData).subscribe( + data => { + saveAs(new Blob([data], {type: 'xlsx'}), fileName + '.xlsx'); + }, + error => { + } + ); + } +} diff --git a/plp-angular/src/app/services/message.service.ts b/plp-angular/src/app/services/message.service.ts new file mode 100644 index 0000000..773f276 --- /dev/null +++ b/plp-angular/src/app/services/message.service.ts @@ -0,0 +1,69 @@ +import {Injectable} from '@angular/core'; +import {BehaviorSubject, Observable} from 'rxjs'; +import {IMessage} from '../model/virtual/message'; +import {Factory} from '../factory/factory'; + +@Injectable({ + providedIn: 'root' +}) +export class MessageService { + + private message: BehaviorSubject; + private dataMessage$: Observable; + + /** + * Constructor + */ + constructor() { + this.message = new BehaviorSubject(Factory.getEmptyMessage(0, null, 0, null, 0, null, 0)); + this.dataMessage$ = this.message.asObservable(); + } + + /** + * Returns message observable + * @returns {Observable} + */ + public getMessage$(): Observable { + return this.dataMessage$; + } + + /** + * Sets error code in message observable (listening components will be notified) + * @param {number} errorCode + * @param {string} errorMsg + * @param {string} optionalInfo + */ + public setError(errorCode: number, errorMsg: string, optionalInfo: string = null): void { + this.message.next(Factory.getEmptyMessage(errorCode, errorMsg, 0, null, 0, null, 0, optionalInfo)); + } + + /** + * Sets success code in message observable (listening components will be notified) + * @param {number} successCode + * @param {string} successMsg + * @param {string} optionalInfo + */ + public setSuccess(successCode: number, successMsg: string, optionalInfo: string = null): void { + this.message.next(Factory.getEmptyMessage(0, null, successCode, successMsg, 0, null, 0, optionalInfo)); + } + + /** + * Sets info code in message observable (listening components will be notified) + * @param {number} infoCode + * @param {string} infoMsg + * @param {string} optionalInfo + */ + public setInfoCode(infoCode: number, infoMsg: string, optionalInfo: string = null): void { + this.message.next(Factory.getEmptyMessage(0, null, 0, null, infoCode, infoMsg, 0, optionalInfo)); + } + + /** + * Sets client error code in message observable (listening components will be notified) + * @param {number} clientErrorCode + * @param {string} optionalInfo + */ + public setClientErrorCode(clientErrorCode: number, optionalInfo: string = null): void { + this.message.next(Factory.getEmptyMessage(0, null, 0, null, 0, null, clientErrorCode, optionalInfo)); + } + +} diff --git a/plp-angular/src/app/utils/const.ts b/plp-angular/src/app/utils/const.ts new file mode 100644 index 0000000..152bf57 --- /dev/null +++ b/plp-angular/src/app/utils/const.ts @@ -0,0 +1,25 @@ +export class Const { + static readonly USER_ROLE_ADMIN: string = 'ROLE_ADMIN'; + static readonly USER_ROLE_USER: string = 'ROLE_USER'; + static readonly USER_ROLE_SALES: string = 'ROLE_SALES'; + static readonly USER_ROLE_TECHNIQUE: string = 'ROLE_TECHNIQUE'; + static readonly USER_ROLE_PRODUCTION: string = 'ROLE_PRODUCTION'; + static readonly USER_ROLE_ACCOUNTING: string = 'ROLE_ACCOUNTING'; + static readonly USER_ROLE_SERVICE: string = 'ROLE_SERVICE'; + + static readonly CSS_NO_EDIT: string = 'not-editable'; + + static readonly SMALL_INT_MIN: number = -32768; + static readonly SMALL_INT_MAX: number = 32767; + + static readonly WORKING_DAYS_MIN: number = 0; + static readonly WORKING_DAYS_MAX: number = 7; + + static readonly PROCESS_STATE_SCHEDULED: string = 'scheduled'; + static readonly PROCESS_STATE_IN_PROCESS: string = 'in_process'; + static readonly PROCESS_STATE_ABORTED: string = 'aborted'; + static readonly PROCESS_STATE_FINISHED: string = 'finished'; + + static readonly UNIT_SQUARE_METER: string = 'm²'; + +} diff --git a/plp-angular/src/app/utils/service-helper.ts b/plp-angular/src/app/utils/service-helper.ts new file mode 100644 index 0000000..64a4c25 --- /dev/null +++ b/plp-angular/src/app/utils/service-helper.ts @@ -0,0 +1,42 @@ +import {EntityInterface} from '../model/interface/entity-interface'; +import {IAppServiceDataItem} from '../model/virtual/app-service-data-item'; +import {Utils} from './utils'; + +export class ServiceHelper { + /** + * Returns updated service data + * @param serviceDataItem + * @param serviceEntities + */ + public static updateServiceEntries(serviceDataItem: IAppServiceDataItem, serviceEntities: EntityInterface[]): EntityInterface[] { + let res: EntityInterface[] = []; + const editEntriesById: {} = Utils.getSortedObjFromArray(serviceDataItem.edit, 'id'); + const deleteEntryIdsById: {} = Utils.getSortedObjFromArray(serviceDataItem.delete, 'id'); + + if (serviceDataItem.edit.length > 0 || serviceDataItem.delete.length > 0) { + for (let i = 0; i < serviceEntities.length; i++) { + // Add edited entry + if (editEntriesById.hasOwnProperty(serviceEntities[i].id)) { + res.push(editEntriesById[serviceEntities[i].id]); + } else if (deleteEntryIdsById.hasOwnProperty(serviceEntities[i].id)) { + // Skip deleted entry + } else { + // Keep entry as is + res.push(serviceEntities[i]); + } + } + } else { + // Nothing to edit or delete, so take origin service entries + res = serviceEntities; + } + + // Add new entries + if (serviceDataItem.add.length > 0) { + for (let a = 0; a < serviceDataItem.add.length; a++) { + serviceEntities.push(serviceDataItem.add[a]); + } + } + return res; + } + +} diff --git a/plp-angular/src/app/utils/tools-error-handler.ts b/plp-angular/src/app/utils/tools-error-handler.ts new file mode 100644 index 0000000..d919560 --- /dev/null +++ b/plp-angular/src/app/utils/tools-error-handler.ts @@ -0,0 +1,11 @@ +import {ErrorHandler} from '@angular/core'; + +export class ToolsErrorHandler implements ErrorHandler { + + handleError(error: any) { + // console.error(Object.getOwnPropertyNames(error)) + // Object.getOwnPropertyNames(error).forEach(p => console.error(error[p])) + console.error(error.fileName, error.lineNumber, ':', error.columnNumber, '\n', error.message, error.rejection); + } + +} diff --git a/plp-angular/src/app/utils/utils.ts b/plp-angular/src/app/utils/utils.ts new file mode 100644 index 0000000..3d9d35c --- /dev/null +++ b/plp-angular/src/app/utils/utils.ts @@ -0,0 +1,185 @@ + +export class Utils { + + /** + * Sorts array of objects by given criteria + */ + static sortObjArrayByStringCriteria(paramArray: Array, criteria: string): Array { + const sortedArray: Array = paramArray.sort((obj1, obj2) => { + if (obj1[criteria].toLowerCase() > obj2[criteria].toLowerCase()) { + return 1; + } + if (obj1[criteria].toLowerCase() > obj2[criteria].toLowerCase()) { + return -1; + } + return 0; + }); + return sortedArray; + } + + /** + * Returns a sorted object by given array an criteria + */ + static getSortedObjFromArray(paramArray: Array = null, criteria: string = null) { + const res: {} = {}; + if (null !== paramArray ) { + if (null !== criteria) { + for (const item of paramArray) { + res[item[criteria]] = item; + } + } else { + for (const item of paramArray) { + res[item] = item; + } + } + } + return res; + } + + /** + * Deep clones object + */ + static deepClone(object: any) { + return JSON.parse(JSON.stringify(object)); + } + + /** + * Checks if a file is an image file + */ + static isImageFile(file: File): boolean { + return file.type.toString() === 'image/gif' || + file.type.toString() === 'image/png' || + file.type.toString() === 'image/jpeg'; + } + + /** + * Checks if a file is an Excel file + */ + static isExcelFile(file: File): boolean { + return file.type.toString() === 'application/vnd.ms-excel' || + file.type.toString() === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; + } + + /** + * Strips spaces from string and sets string to lowercase + */ + static stripString(s: string): string { + return s.replace(/[\s]/g, '').toLowerCase(); + } + + /** + * Checks if a given value is an integer + */ + static isInteger(value: any): boolean { + return Number.isInteger(Number(value)); + } + + /** + * Checks if a given value is a decimal / float + */ + static isFloat(value: any): boolean { + const val: any = value.replace(',', '.'); + return Number.isInteger(Number(val)) || !isNaN(val); + } + + /** + * Checks if a given value is a boolean + */ + static isBoolean(value: any): boolean { + return typeof value === 'boolean'; + } + + static isValidDate(d): boolean { + const today = new Date(d.replace(/\s/, 'T')); + return today instanceof Date && !isNaN(today.getTime()); + } + + /** + * Returns current date + */ + static getCurrentDate(withTime: boolean = false): string { + let res: string; + const today = new Date(); + const dd = today.getDate(); + const mm = today.getMonth() + 1; // January is 0! + const yyyy = today.getFullYear(); + + const day: string = dd < 10 ? '0' + dd : dd.toString(); + const month: string = mm < 10 ? '0' + mm : mm.toString(); + const year: string = yyyy.toString(); + + res = year + '-' + month + '-' + day; + if (withTime) { + res += ' ' + (today.getHours() < 10 ? '0' + today.getHours() : today.getHours()) + ':' + + (today.getMinutes() < 10 ? '0' + today.getMinutes() : today.getMinutes()) + ':' + + (today.getSeconds() < 10 ? '0' + today.getSeconds() : today.getSeconds()); + } + return res; + } + + /** + * Returns date and time in german format + */ + static getDateTimeToDisplay( + dateString: string = null, + withDate: boolean = true, + withTime: boolean = false, + withSeconds: boolean = false, + forDatePicker: boolean = false): string { + let res = ''; + const date: Date = null === dateString ? new Date() : new Date(dateString.replace(/\s/, 'T')); + const day: number = date.getDate(); + const month: number = date.getMonth() + 1; + const year: number = date.getFullYear(); + const hours: number = date.getHours(); + const minutes: number = date.getMinutes(); + const seconds: number = date.getSeconds(); + + if (forDatePicker) { + res += year; + res += '-' + (month < 10 ? '0' + month : month); + res += '-' + (day < 10 ? '0' + day : day); + } else { + if (withDate) { + res += day < 10 ? '0' + day : day; + res += '.' + (month < 10 ? '0' + month : month); + res += '.' + year; + } + if (withTime) { + res += withDate ? ' ' : ''; + res += (hours < 10 ? '0' + hours : hours); + res += ':' + (minutes < 10 ? '0' + minutes : minutes); + res += withSeconds ? ':' + (seconds < 10 ? '0' + seconds : seconds) : ''; + } + } + return res; + } + + /** + * Returns parsed date + * @param dateString + */ + static getParsedDate(dateString: string): number { + return Date.parse(dateString.replace(/\s/, 'T')); + } + + /** + * Checks URL + */ + static checkUrl(url: string): string { + if (null !== url) { + let newUrl = decodeURIComponent(url); + newUrl = newUrl.trim().replace(/\s/g, ''); + if (/^(:\/\/)/.test(newUrl)) { + return `http${newUrl}`; + } + if (!/^(f|ht)tps?:\/\//i.test(newUrl)) { + return `http://${newUrl}`; + } + return newUrl; + } else { + return null; + } + } + +} diff --git a/plp-angular/src/app/views/accounting/accounting.component.html b/plp-angular/src/app/views/accounting/accounting.component.html new file mode 100644 index 0000000..70dd05a --- /dev/null +++ b/plp-angular/src/app/views/accounting/accounting.component.html @@ -0,0 +1 @@ +

accounting works!

diff --git a/plp-angular/src/app/views/accounting/accounting.component.scss b/plp-angular/src/app/views/accounting/accounting.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/accounting/accounting.component.ts b/plp-angular/src/app/views/accounting/accounting.component.ts new file mode 100644 index 0000000..ef564cd --- /dev/null +++ b/plp-angular/src/app/views/accounting/accounting.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-accounting', + templateUrl: './accounting.component.html', + styleUrls: ['./accounting.component.scss'] +}) + +export class AccountingComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.html b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.html new file mode 100644 index 0000000..9a83c32 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.html @@ -0,0 +1,28 @@ +
Ansprechpartner exportieren
+
Weihnachtspost-Etiketten
+
+ + +
+ +
+ + +
+ + + + diff --git a/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.scss b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.scss new file mode 100644 index 0000000..fed11bc --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.scss @@ -0,0 +1,11 @@ +#xmas-mail { + position: absolute; + right: 0; + top: 0; +} + +#export-customer-contacts { + position: absolute; + right: 225px; + top: 0; +} \ No newline at end of file diff --git a/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.ts b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.ts new file mode 100644 index 0000000..0bade80 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.ts @@ -0,0 +1,159 @@ +import {Component, EventEmitter, NgModule, OnInit, Output, ViewChild} from '@angular/core'; +import {AgGridComponent} from '../../../components/ag-grid-component'; +import {ICustomer} from '../../../model/entities/customer'; +import {ICustomerContact} from '../../../model/entities/customer-contact'; +import {ModalComponent} from '../../../components/modal/modal.component'; +import {CustomerContactPersonDetailComponent} from '../customer-view/customer-contact-person-detail/customer-contact-person-detail.component'; +import {Utils} from '../../../utils/utils'; +import {CustomerService} from '../../../services/customer.service'; +import {Const} from '../../../utils/const'; +import {AppService} from '../../../services/app.service'; +import {CommonService} from '../../../services/common.service'; +import {AgGridAngular} from 'ag-grid-angular'; + +@Component({ + selector: 'app-customer-contact-list', + templateUrl: './customer-contact-list.component.html', + styleUrls: ['./customer-contact-list.component.scss'] +}) + +export class CustomerContactListComponent extends AgGridComponent implements OnInit { + + @Output() shortcut: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerContactPersonDetailList', { static: true }) modalCustomerContactPersonDetailList: ModalComponent; + @ViewChild('customerContactPersonDetailList', { static: true }) customerContactPersonDetailList: CustomerContactPersonDetailComponent; + + public customers: ICustomer[]; + public customersById: {}; + private customerContacts: ICustomerContact[]; + public customerContactsById: {}; + public hasAdminRights: boolean; + public hasExportRights: boolean; + + constructor(private customerService: CustomerService, private appService: AppService, private commonService: CommonService) { + super(); + } + + ngOnInit() { + this.hasAdminRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.hasExportRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.customers = []; + this.customersById = {}; + this.customerContacts = []; + this.customerContactsById = {}; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'ID', field: 'id', width: 60 }, + {headerName: 'Kunden ID', field: 'customer_id', width: 100 }, + {headerName: 'Kunde', field: 'customer' }, + {headerName: 'Vorname', field: 'firstname' }, + {headerName: 'Nachname', field: 'lastname' }, + {headerName: 'Abteilung', field: 'department' }, + {headerName: 'E-Mail Adresse', field: 'email', cellRenderer: this.emailRenderer }, + {headerName: 'Telefon', field: 'phone_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Mobil', field: 'mobile_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Fax', field: 'fax_no' }, + {headerName: 'Bemerkungen', field: 'comment' } + ]; + + this.rowSelection = 'single'; + } + + /** + * Sets data + */ + public setData(customers: ICustomer[], customerContacts: ICustomerContact[]): void { + this.customers = customers; + this.customersById = Utils.getSortedObjFromArray(this.customers, 'id'); + this.customerContacts = customerContacts; + this.customerContactsById = Utils.getSortedObjFromArray(this.customerContacts, 'id'); + this.generateEntries(); + } + + /** + * Generates AG grid entries for customer grid + */ + public generateEntries(): void { + this.rowData = []; + if (null !== this.customerContacts){ + for (let i = 0; i < this.customerContacts.length; i++) { + this.rowData.push({ + id: this.customerContacts[i].id, + customer_id: this.customerContacts[i].customer_id, + customer: this.customersById[this.customerContacts[i].customer_id].name, + firstname: this.customerContacts[i].firstname, + lastname: this.customerContacts[i].lastname, + department: this.customerContacts[i].department, + email: this.customerContacts[i].email, + phone_no: this.customerContacts[i].phone_no, + mobile_no: this.customerContacts[i].mobile_no, + fax_no: this.customerContacts[i].fax_no, + comment: this.customerContacts[i].comment + }); + } + } + } + + /** + * Row is clicked + * @param e + */ + public rowClicked(e: any): void { + this.modalCustomerContactPersonDetailList.openModal(); + this.customerContactPersonDetailList.setData(this.customersById[e.data.customer_id], Utils.deepClone(this.customerContactsById[e.data.id]) as ICustomerContact); + } + + /** + * Edit customer contact + * @param customerContact + */ + public editCustomerContactFunction(customerContact: ICustomerContact): void { + this.customerService.apiEditCustomerContact(customerContact).subscribe( + data => { + this.customerContactPersonDetailList.updateData(data.result_data as ICustomer); + }, + error => {} + ); + }; + + /** + * Delete customer contact + * @param contactId + */ + public deleteCustomerContactFunction(contactId: number): void { + this.customerService.apiDeleteCustomerContact(contactId).subscribe( + data => { + this.modalCustomerContactPersonDetailList.closeModal(); + }, + error => {} + ); + }; + + /** + * Shortcut to customer detail + * @param customer + */ + public shortcutFunction(customer: ICustomer): void { + this.modalCustomerContactPersonDetailList.closeModal(); + this.shortcut.emit(customer); + }; + + /** + * Export customer contacts pdf + */ + public exportCustomerContactsPdf(): void { + this.commonService.apiExportContactsPdf('Kunden_Kontakte', 'customer'); + }; + + /** + * Export customer xmas pdf + */ + public exportXmasPdf(): void { + this.commonService.apiExportXmasPdf('Kunden_Weihnachten', 'customer'); + }; +} diff --git a/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.html b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.html new file mode 100644 index 0000000..e9465c6 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.html @@ -0,0 +1,23 @@ +
Kunden anlegen
+ +
+ + +
+ +
+ + +
diff --git a/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.scss b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.scss new file mode 100644 index 0000000..29db3a8 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.scss @@ -0,0 +1,14 @@ +#create-customer { + position: absolute; + right: 0; + top: 0; +} + +@media only screen and (max-width: 1004px) { + #create-customer { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.ts b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.ts new file mode 100644 index 0000000..de0aa4a --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.ts @@ -0,0 +1,112 @@ +import {Component, EventEmitter, OnInit, Output} from '@angular/core'; +import {AgGridComponent} from '../../../components/ag-grid-component'; +import {ICustomer} from '../../../model/entities/customer'; +import {AppService} from '../../../services/app.service'; +import {Const} from '../../../utils/const'; + +@Component({ + selector: 'app-customer-list', + templateUrl: './customer-list.component.html', + styleUrls: ['./customer-list.component.scss'] +}) + +export class CustomerListComponent extends AgGridComponent implements OnInit { + + @Output() rowIsClicked: EventEmitter = new EventEmitter(); + @Output() createNewCustomer: EventEmitter = new EventEmitter(); + + private customers: ICustomer[]; + public rowClassRules: {}; + public hasSalesRights: boolean; + public usersById: {}; + + constructor(public appService: AppService) { + super(); + } + + ngOnInit() { + this.usersById = this.appService.getConfig().vc_user_by_id; + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.customers = []; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'ID', field: 'customer_id', width: 60 }, + {headerName: 'Status', field: 'active', width: 90 }, + {headerName: 'Name', field: 'customer_name' }, + {headerName: 'Name Zusatz', field: 'customer_name_additional' }, + {headerName: 'Alte PLP Kennung', field: 'old_plp_id' }, + {headerName: 'PLP Mediaberater', field: 'v_consultant' }, + {headerName: 'Straße', field: 'street' }, + {headerName: 'Hausnummer', field: 'street_no' }, + {headerName: 'PLZ', field: 'zip' }, + {headerName: 'Ort', field: 'city' }, + {headerName: 'Internetadresse', field: 'url', cellRenderer: this.urlRenderer }, + {headerName: 'Bemerkungen (Allgemein)', field: 'comment' } + ]; + + this.rowSelection = 'single'; + + this.rowClassRules = { + inactive(params) { + return !params.data.active_state; + } + }; + } + + /** + * Sets data + */ + public setData(customers: ICustomer[]): void { + this.customers = customers; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.generateEntries(); + } + + /** + * Generates AG grid entries for customer grid + */ + public generateEntries(): void { + this.rowData = []; + if (null !== this.customers) { + for (let i = 0; i < this.customers.length; i++) { + this.rowData.push({ + customer_id: this.customers[i].id, + active_state: this.customers[i].active, + active: this.customers[i].active ? 'Aktiv' : 'Inaktiv', + customer_name: this.customers[i].name, + customer_name_additional: this.customers[i].name_additional, + old_plp_id: this.customers[i].old_plp_id, + v_consultant: null !== this.customers[i].consultant_user_id ?? + this.usersById[this.customers[i].consultant_user_id].firstname + ' ' + this.usersById[this.customers[i].consultant_user_id].lastname, + street: this.customers[i].street, + street_no: this.customers[i].street_no, + zip: this.customers[i].zip, + city: this.customers[i].city, + url: this.customers[i].url, + comment: this.customers[i].comment, + }); + } + } + } + + /** + * Row is clicked + * @param e + */ + public rowClicked(e: any) { + this.rowIsClicked.emit(e); + } + + /** + * OnClick Create customer + */ + public createCustomer(): void { + this.createNewCustomer.emit(true); + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-management.component.html b/plp-angular/src/app/views/customer-management/customer-management.component.html new file mode 100644 index 0000000..d80fd4e --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-management.component.html @@ -0,0 +1,33 @@ +
+

Kunden

+ + + + + + + + + +
+ + + + + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-management.component.scss b/plp-angular/src/app/views/customer-management/customer-management.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-management.component.ts b/plp-angular/src/app/views/customer-management/customer-management.component.ts new file mode 100644 index 0000000..04b12eb --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-management.component.ts @@ -0,0 +1,265 @@ +import {AfterContentInit, Component, ElementRef, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {ModalComponent} from '../../components/modal/modal.component'; +import {AgGridComponent} from '../../components/ag-grid-component'; +import {ICustomer} from '../../model/entities/customer'; +import {Subscription} from 'rxjs/index'; +import {AppService} from '../../services/app.service'; +import {CustomerService} from '../../services/customer.service'; +import {CustomerViewComponent} from './customer-view/customer-view.component'; +import {CustomerDataEditComponent} from './customer-view/customer-data-edit/customer-data-edit.component'; +import {Factory} from '../../factory/factory'; +import {ICustomerContact} from '../../model/entities/customer-contact'; +import {ICustomerNote} from '../../model/entities/customer-note'; +import {TabsComponent} from '../../components/tabs/tabs.component'; +import {ICustomerMeeting} from '../../model/entities/customer-meeting'; +import {CustomerListComponent} from './customer-list/customer-list.component'; +import {CustomerContactListComponent} from './customer-contact-list/customer-contact-list.component'; +import {MeetingService} from '../../services/meeting.service'; + +@Component({ + selector: 'app-customer-management', + templateUrl: './customer-management.component.html', + styleUrls: ['./customer-management.component.scss'] +}) + +export class CustomerManagementComponent extends AgGridComponent implements OnInit, OnDestroy { + + @ViewChild('tabsCM', { static: true }) tabsCM: TabsComponent; + @ViewChild('modalCM', { static: true }) modalCM: ModalComponent; + @ViewChild('customerView', { static: true }) customerView: CustomerViewComponent; + @ViewChild('customerList', { static: true }) customerList: CustomerListComponent; + @ViewChild('customerContactList', { static: true }) customerContactList: CustomerContactListComponent; + @ViewChild('modalCustomerDataEdit', { static: true }) modalCustomerDataEdit: ModalComponent; + @ViewChild('customerDataEdit', { static: true }) customerDataEdit: CustomerDataEditComponent; + @ViewChild('headline', { static: true }) headline: ElementRef; + @ViewChild('content', { static: true }) content: ElementRef; + + private customers: ICustomer[]; + private customersSub: Subscription; + private customerContactsSub: Subscription; + public customerContacts: ICustomerContact[]; + + constructor(private appService: AppService, private customerService: CustomerService, private meetingService: MeetingService) { + super(); + this.customerService.apiGetCustomerData(); + } + + ngOnInit() { + this.customers = null; + this.customerContacts = null; + + this.customersSub = this.customerService.getCustomers$().subscribe( + data => { + this.customers = data; + this.setComponentData(); + } + ); + + this.customerContactsSub = this.customerService.getCustomerContacts$().subscribe( + data => { + this.customerContacts = data; + this.setComponentData(); + } + ); + } + + /** + * Set component data after all data has been received + */ + private setComponentData() { + if (null !== this.customers && null !== this.customerContacts){ + this.customerList.setData(this.customers); + this.customerContactList.setData(this.customers, this.customerContacts); + } + } + + /** + * Customer row is clicked + */ + public rowClickedCustomer(e: any): void { + this.customerService.apiGetCustomerFull(e.data.customer_id).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + this.modalCM.openModal(); + }, + error => {} + ); + } + + /** + * OnClick Create customer + */ + public createCustomer(): void { + this.modalCustomerDataEdit.openModal(); + this.customerDataEdit.setData(Factory.getEmptyCustomer()); + } + + /** + * Creates customer + */ + public createCustomerFunction(customer: ICustomer): void { + this.customerService.apiCreateCustomer(customer).subscribe( + data => { + this.modalCustomerDataEdit.closeModal(); + }, + error => {} + ); + } + + /** + * Saves customer + */ + public editCustomerFunction(customer: ICustomer): void { + this.customerService.apiEditCustomer(customer).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Creates customer contact + */ + public createCustomerContactFunction(customerContact: ICustomerContact): void { + this.customerService.apiCreateCustomerContact(customerContact).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Edit customer contact + */ + public editCustomerContactFunction(customerContact: ICustomerContact): void { + this.customerService.apiEditCustomerContact(customerContact).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer, true); + }, + error => {} + ); + } + + /** + * Deletes customer contact + */ + public deleteCustomerContactFunction(contactId: number): void { + this.customerService.apiDeleteCustomerContact(contactId).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Creates customer note entry + */ + public createCustomerNoteFunction(customerNote: ICustomerNote): void { + this.customerService.apiCreateCustomerNote(customerNote).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Edits customer note entry + */ + public editCustomerNoteFunction(customerNote: ICustomerNote): void { + this.customerService.apiEditCustomerNote(customerNote).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer, true); + }, + error => {} + ); + } + + /** + * Deletes customer note entry + */ + public deleteCustomerNoteFunction(customerNoteId: number): void { + this.customerService.apiDeleteCustomerNote(customerNoteId).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Creates customer meeting entry + */ + public createCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.meetingService.apiCreateCustomerMeeting(customerMeeting).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Edits customer meeting entry + */ + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.meetingService.apiEditCustomerMeeting(customerMeeting).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer, true); + }, + error => {} + ); + } + + /** + * Deletes customer meeting entry + */ + public deleteCustomerMeetingFunction(customerMeetingId: number): void { + this.meetingService.apiDeleteCustomerMeeting(customerMeetingId).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + }; + + /** + * Edit report after meeting has started + */ + public editCustomerMeetingReportFunction(reportValues: any): void { + const meetingId: number = reportValues.id; + const report: string = reportValues.report; + this.meetingService.apiEditCustomerMeetingReport(meetingId, report).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer, true); + }, + error => {} + ); + } + + /** + * Shortcut to customer detail + */ + public shortcutFunction(customer: ICustomer) : void { + this.customerService.apiGetCustomerFull(customer.id).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + this.modalCM.openModal(); + }, + error => {} + ); + } + + /** + * Destroy + */ + ngOnDestroy(): void { + if(this.customersSub !== null && this.customersSub !== undefined) { + this.customersSub.unsubscribe(); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.html new file mode 100644 index 0000000..c8032ba --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.html @@ -0,0 +1,50 @@ +
+

Ansprechpartner Detail

+
+
+
+
Gesprächspartner:
+
Herr + Frau + Divers {{customerContact.firstname}} {{customerContact.lastname}}
+
Abteilung:
+
{{customerContact.department}}
+
E-Mail:
+
{{customerContact.email}}
+
Telefon:
+
{{customerContact.phone_no}}
+
Mobil:
+
{{customerContact.mobile_no}}
+
Fax:
+
{{customerContact.fax_no}}
+
Adresse:
+
{{customerContact.street}} {{customerContact.street_no}}
+ {{customerContact.zip}} {{customerContact.city}} +
{{config.vc_countries_by_id[customerContact.country_id]['name']}}
+
Notiz:
+
{{customerContact.comment}}
+
Markiert für Weihnachtspost:
+
+ Ja + Nein +
+
+ +
+
+
+
+
+
+ Zum Kundenprofil +
Eintrag bearbeiten
+
Eintrag löschen
+
+
+
+
+
+
+ +
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.ts new file mode 100644 index 0000000..e9bf152 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.ts @@ -0,0 +1,99 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomer} from '../../../../model/entities/customer'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {Factory} from '../../../../factory/factory'; +import {AppService} from '../../../../services/app.service'; +import {IConfig} from '../../../../model/virtual/config'; +import {Utils} from '../../../../utils/utils'; +import {CustomerContactPersonEditComponent} from '../customer-contact-person-edit/customer-contact-person-edit.component'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-contact-person-detail', + templateUrl: './customer-contact-person-detail.component.html', + styleUrls: ['./customer-contact-person-detail.component.scss'] +}) + +export class CustomerContactPersonDetailComponent implements OnInit { + + @Output() deleteCustomerContact: EventEmitter = new EventEmitter(); + @Output() editCustomerContact: EventEmitter = new EventEmitter(); + @Output() shortcut: EventEmitter = new EventEmitter(); + @ViewChild('customerContactEdit', { static: true }) customerContactEdit: CustomerContactPersonEditComponent; + + public isEditMode: boolean; + public customer: ICustomer; + public customerContact: ICustomerContact; + public config: IConfig; + public hasSalesRights: boolean; + + constructor(public appService: AppService) { } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.config = this.appService.getConfig(); + this.isEditMode = false; + this.customer = Factory.getEmptyCustomer(); + this.customerContact = Factory.getEmptyCustomerContact(); + } + + /** + * Sets data + */ + public setData(customer: ICustomer, customerContact: ICustomerContact): void { + this.setContactPersonData(customer); + this.customerContact = customerContact; + } + + /** + * Updates data + */ + public updateData(customer: ICustomer): void { + this.setContactPersonData(customer); + this.customer.v_customer_contacts.forEach((value) => { + if (value.id === this.customerContact.id) { + this.customerContact = value; + } + }); + } + + /** + * Sets contact person data + */ + public setContactPersonData(customer: ICustomer): void { + this.isEditMode = false; + this.customer = customer; + } + + /** + * Edit contact entry + */ + public editEntry(): void { + this.isEditMode = true; + this.customerContactEdit.setData(Utils.deepClone(this.customerContact) as ICustomerContact); + } + + /** + * Edits meeting entry + */ + public editCustomerContactFunction(customerContact: ICustomerContact) { + this.editCustomerContact.emit(customerContact); + } + + /** + * Delete contact entry + */ + public deleteEntry(): void { + const confirmAction = confirm('Wollen Sie diesen Ansprechpartner wirklich löschen?'); + if (confirmAction == true) { + this.deleteCustomerContact.emit(this.customerContact.id); + } + } + + /** + * Shortcut to customer detail + */ + public customerShortcut(): void { + this.shortcut.emit(this.customer); + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.html new file mode 100644 index 0000000..e44f8aa --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.html @@ -0,0 +1,135 @@ +

Ansprechpartner anlegen

+

Ansprechpartner bearbeiten

+
+
+
+

{{ errorMsg }}

+

+ Anrede ist ein Pflichtfeld. +

+

+ Nachname ist ein Pflichtfeld. +

+

+ Bitte gültige E-Mail Adresse eingeben. +

+
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.ts new file mode 100644 index 0000000..0a32720 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.ts @@ -0,0 +1,76 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {Factory} from '../../../../factory/factory'; +import {NgForm} from '@angular/forms'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {AppService} from '../../../../services/app.service'; +import {IConfig} from '../../../../model/virtual/config'; +import {FormComponent} from '../../../../components/form-component'; +import {Utils} from '../../../../utils/utils'; + +@Component({ + selector: 'app-customer-contact-person-edit', + templateUrl: './customer-contact-person-edit.component.html', + styleUrls: ['./customer-contact-person-edit.component.scss'] +}) + +export class CustomerContactPersonEditComponent extends FormComponent implements OnInit { + + @Output() createCustomerContact: EventEmitter = new EventEmitter(); + @Output() editCustomerContact: EventEmitter = new EventEmitter(); + @ViewChild('customerContactForm', { static: true }) customerContactForm: NgForm; + + public customerContact: ICustomerContact; + public config: IConfig; + + constructor(private appService: AppService, /*protected scrollToService: ScrollToService*/) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.customerContact = Factory.getEmptyCustomerContact(); + this.config = this.appService.getConfig(); + } + + /** + * Sets data + */ + public setData(customerContact: ICustomerContact): void { + this.customerContact = customerContact; + this.isCreationMode = null === this.customerContact.id; + this.errorMsg = ''; + this.resetFormValidation(); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.customerContactForm.form.markAsUntouched(); + } + + /** + * Saves customer + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + // Check if date is valid + if (null === this.customerContact.date_of_birth || + (null !== this.customerContact.date_of_birth && Utils.isValidDate(this.customerContact.date_of_birth))) { + if (this.isCreationMode) { + this.createCustomerContact.emit(this.customerContact); + } else { + this.editCustomerContact.emit(this.customerContact); + } + this.errorMsg = ''; + } else { + this.errorMsg = 'Bitte korrektes Datum eingeben.'; + // todo this.scrollUp(this.isCreationMode ? 'customer-contact-person-modal' : 'customer-contact-person-edit-modal'); + } + } else { + // todo this.scrollUp(this.isCreationMode ? 'customer-contact-person-modal' : 'customer-contact-person-edit-modal'); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.html new file mode 100644 index 0000000..f694f1c --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.html @@ -0,0 +1,35 @@ +

Ansprechpartner

+

Hier sind die Ansprechpartner zu sehen:

+
Ansprechpartner anlegen
+
+ + +
+
+ + +
+ + + + + + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.scss new file mode 100644 index 0000000..e571d97 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.scss @@ -0,0 +1,14 @@ +#create-customer-contact { + position: absolute; + right: 0; + top: -6rem; +} + +@media only screen and (max-width: 1004px) { + #create-customer-contact { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.ts new file mode 100644 index 0000000..2116435 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.ts @@ -0,0 +1,172 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Factory} from '../../../../factory/factory'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {AgGridComponent} from '../../../../components/ag-grid-component'; +import {ModalComponent} from '../../../../components/modal/modal.component'; +import {CustomerContactPersonEditComponent} from '../customer-contact-person-edit/customer-contact-person-edit.component'; +import {Utils} from '../../../../utils/utils'; +import {IConfig} from '../../../../model/virtual/config'; +import {AppService} from '../../../../services/app.service'; +import {CustomerContactPersonDetailComponent} from '../customer-contact-person-detail/customer-contact-person-detail.component'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-contact-person-view', + templateUrl: './customer-contact-person-view.component.html', + styleUrls: ['./customer-contact-person-view.component.scss'] +}) + +export class CustomerContactPersonViewComponent extends AgGridComponent implements OnInit { + + @Output() createCustomerContact: EventEmitter = new EventEmitter(); + @Output() editCustomerContact: EventEmitter = new EventEmitter(); + @Output() deleteCustomerContact: EventEmitter = new EventEmitter(); + @Output() shortcut: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerContactPersonEdit', { static: true }) modalCustomerContactPersonEdit: ModalComponent; + @ViewChild('customerContactPersonEdit', { static: true }) customerContactPersonEdit: CustomerContactPersonEditComponent; + @ViewChild('modalCustomerContactPersonDetail', { static: true }) modalCustomerContactPersonDetail: ModalComponent; + @ViewChild('customerContactPersonDetail', { static: true }) customerContactPersonDetail: CustomerContactPersonDetailComponent; + + public customer: ICustomer; + public customerContacts: ICustomerContact[]; + public customerContactsById: {}; + public config: IConfig; + public hasSalesRights: boolean; + + constructor(private appService: AppService) { + super(); + } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.config = this.appService.getConfig(); + this.customer = Factory.getEmptyCustomer(); + this.customerContacts = []; + this.customerContactsById = {}; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'Anrede', field: 'gender', width: 90 }, + {headerName: 'Vorname', field: 'firstname' }, + {headerName: 'Nachname', field: 'lastname' }, + {headerName: 'Abteilung', field: 'department' }, + {headerName: 'E-Mail Adresse', field: 'email', cellRenderer: this.emailRenderer }, + {headerName: 'Telefon', field: 'phone_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Mobil', field: 'mobile_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Fax', field: 'fax_no' }, + {headerName: 'Straße', field: 'street' }, + {headerName: 'Hausnummer', field: 'street_no' }, + {headerName: 'PLZ', field: 'zip' }, + {headerName: 'Ort', field: 'city' }, + {headerName: 'Land', field: 'country' }, + {headerName: 'Bemerkungen', field: 'comment' } + ]; + } + + /** + * Sets data + * @param customer + * @param isUpdate + */ + public setData(customer: ICustomer, isUpdate: boolean): void { + this.customer = customer; + this.customerContacts = this.customer.v_customer_contacts; + this.customerContactsById = Utils.getSortedObjFromArray(this.customerContacts, 'id'); + this.modalCustomerContactPersonEdit.closeModal(); + this.generateEntries(); + if (isUpdate) { + this.customerContactPersonDetail.updateData(customer); + } else { + this.modalCustomerContactPersonDetail.closeModal(); + } + } + + /** + * Generates AG grid entries + */ + public generateEntries(): void { + this.rowData = []; + for (let i = 0; i < this.customerContacts.length; i++) { + let ccGender: string; + if (this.customerContacts[i].gender == 'male') { + ccGender = 'Herr'; + } else if (this.customerContacts[i].gender == 'female') { + ccGender = 'Frau'; + } else { + ccGender = 'Divers'; + } + this.rowData.push({ + id: this.customerContacts[i].id, + gender: ccGender, + firstname: this.customerContacts[i].firstname, + lastname: this.customerContacts[i].lastname, + department: this.customerContacts[i].department, + email: this.customerContacts[i].email, + phone_no: this.customerContacts[i].phone_no, + mobile_no: this.customerContacts[i].mobile_no, + fax_no: this.customerContacts[i].fax_no, + street: this.customerContacts[i].street, + street_no: this.customerContacts[i].street_no, + zip: this.customerContacts[i].zip, + city: this.customerContacts[i].city, + country: null !== this.customerContacts[i].country_id ? this.config.vc_countries_by_id[this.customerContacts[i].country_id].name : null, + comment: this.customerContacts[i].comment, + }); + } + } + + /** + * On row click + * @param e + */ + public rowClicked(e: any) { + this.modalCustomerContactPersonDetail.openModal(); + this.customerContactPersonDetail.setData(this.customer, Utils.deepClone(this.customerContactsById[e.data.id]) as ICustomerContact); + } + + /** + * On create click + */ + public create(): void { + this.modalCustomerContactPersonEdit.openModal(); + this.customerContactPersonEdit.setData(Factory.getEmptyCustomerContact(this.customer.id)); + } + + /** + * Creates customer contact + * @param customerContact + */ + public createCustomerContactFunction(customerContact: ICustomerContact): void { + this.createCustomerContact.emit(customerContact); + } + + /** + * Edit customer contact + * @param customerContact + */ + public editCustomerContactFunction(customerContact: ICustomerContact): void { + this.editCustomerContact.emit(customerContact); + } + + /** + * Deletes customer contact + * @param contactId + */ + public deleteCustomerContactFunction(contactId: number): void { + this.deleteCustomerContact.emit(contactId); + } + + /** + * Shortcut to customer detail + * @param customer + */ + public shortcutFunction(customer: ICustomer): void { + this.modalCustomerContactPersonDetail.closeModal(); + this.shortcut.emit(customer); + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.html new file mode 100644 index 0000000..e4a9052 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.html @@ -0,0 +1,127 @@ +

{{customer.name}} bearbeiten

+

Kunden anlegen

+
+
+
+

{{ errorMsg }}

+

+ Name ist ein Pflichtfeld. +

+

+ Bitte gültige E-Mail Adresse eingeben. +

+
+
+
+
+

Aktivität

+ + +
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ + +
+
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.ts new file mode 100644 index 0000000..a2257e6 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.ts @@ -0,0 +1,75 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Factory} from '../../../../factory/factory'; +import {NgForm} from '@angular/forms'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {AppService} from '../../../../services/app.service'; +import {IConfig} from '../../../../model/virtual/config'; +import {FormComponent} from '../../../../components/form-component'; +import {IUser} from '../../../../model/entities/user'; + +@Component({ + selector: 'app-customer-data-edit', + templateUrl: './customer-data-edit.component.html', + styleUrls: ['./customer-data-edit.component.scss'] +}) + +export class CustomerDataEditComponent extends FormComponent implements OnInit { + + @Output() editCustomer: EventEmitter = new EventEmitter(); + @Output() createCustomer: EventEmitter = new EventEmitter(); + @ViewChild('customerDataForm', { static: true }) customerDataForm: NgForm; + + public customer: ICustomer; + public config: IConfig; + public users: IUser[]; + public usersById: {}; + public consultant: IUser; + + constructor(private appService: AppService, /*protected scrollToService: ScrollToService*/) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.customer = Factory.getEmptyCustomer(); + this.config = this.appService.getConfig(); + this.users = this.appService.getConfig().users; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.consultant = null; + } + + /** + * Sets data + */ + public setData(customer: ICustomer): void { + this.customer = customer; + this.isCreationMode = null === this.customer.id; + this.errorMsg = ''; + this.resetFormValidation(); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.customerDataForm.form.markAsUntouched(); + } + + /** + * Saves customer + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + if (this.isCreationMode) { + this.createCustomer.emit(this.customer); + } else { + this.editCustomer.emit(this.customer); + } + this.errorMsg = ''; + } else { + // todo this.scrollUp(this.isCreationMode ? 'customer-data-modal' : 'customer-data-edit-modal'); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.html new file mode 100644 index 0000000..654f766 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.html @@ -0,0 +1,40 @@ +

Kundendaten

+
+
+
+
Status:
+
AktivInaktiv
+
Firma:
+
{{customer.name}} ({{customer.old_plp_id}})
+
Zusatz:
+
{{customer.name_additional}}
+
PLP Mediaberater:
+
{{usersById[customer.consultant_user_id]['firstname']}} {{usersById[customer.consultant_user_id]['lastname']}}
+
Adresse:
+
{{customer.street}} {{customer.street_no}}
+ {{customer.zip}} {{customer.city}} +
{{config.vc_countries_by_id[customer.country_id]['name']}}
+
Internetadresse:
+
{{checkedUrl}}
+
E-Mail (Zentrale):
+
{{customer.email}}
+
Telefon (Zentrale):
+
{{customer.phone_no}}
+
Mobil (Zentrale):
+
{{customer.mobile_no}}
+
Fax (Zentrale):
+
{{customer.fax_no}}
+
Bemerkung:
+
{{customer.comment}}
+
+
+
+
bearbeiten
+
+
+ + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.ts new file mode 100644 index 0000000..5bcb0ca --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.ts @@ -0,0 +1,65 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Factory} from '../../../../factory/factory'; +import {Utils} from '../../../../utils/utils'; +import {ModalComponent} from '../../../../components/modal/modal.component'; +import {CustomerDataEditComponent} from '../customer-data-edit/customer-data-edit.component'; +import {AppService} from '../../../../services/app.service'; +import {IConfig} from '../../../../model/virtual/config'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-data-view', + templateUrl: './customer-data-view.component.html', + styleUrls: ['./customer-data-view.component.scss'] +}) + +export class CustomerDataViewComponent implements OnInit { + + @Output() editCustomer: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerDataEdit', { static: true }) modalCustomerDataEdit: ModalComponent; + @ViewChild('customerDataEdit', { static: true }) customerDataEdit: CustomerDataEditComponent; + + public customer: ICustomer; + public checkedUrl: string; + public config: IConfig; + public hasSalesRights: boolean; + public usersById: {}; + + constructor(private appService: AppService) { } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.config = this.appService.getConfig(); + this.customer = Factory.getEmptyCustomer(); + this.checkedUrl = ''; + this.usersById = this.appService.getConfig().vc_user_by_id; + } + + /** + * Sets data + * @param customer + */ + public setData(customer: ICustomer): void { + this.customer = customer; + this.checkedUrl = Utils.checkUrl(this.customer.url); + this.modalCustomerDataEdit.closeModal(); + } + + /** + * On edit click + */ + public edit(): void { + this.modalCustomerDataEdit.openModal(); + this.customerDataEdit.setData(Utils.deepClone(this.customer) as ICustomer); + } + + /** + * Saves customer + * @param customer + */ + public editCustomerFunction(customer: ICustomer): void { + this.editCustomer.emit(customer); + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.html new file mode 100644 index 0000000..5c31c79 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.html @@ -0,0 +1,80 @@ +
+

Termin mit Kunde: {{customer.name}}

+

{{date}} {{timeStart}} Uhr bis {{timeEnd}} Uhr

+

{{customerMeeting.title}}

+
Erstellt von: {{creator.firstname}} {{creator.lastname}}
+

{{customerMeeting.description}}

+
+
+
+
+
Termin-Art:
+
{{meetingType.name}} +
Optionstermin
+
+
PLP Verantwortlicher:
+
{{owner.firstname}} {{owner.lastname}}
+
Teilnehmer:
+
+ + {{p.firstname}} {{p.lastname}}
+
+
+
Adresse:
+
{{customerMeeting.street}} {{customerMeeting.street_no}}
+ {{customerMeeting.zip}} {{customerMeeting.city}} +
{{config.vc_countries_by_id[customerMeeting.country_id]['name']}}
+
Gesprächspartner:
+
Herr + Frau + Divers {{customerMeeting.firstname}} {{customerMeeting.lastname}}
+
Abteilung:
+
{{customerMeeting.department}}
+
E-Mail:
+
{{customerMeeting.email}}
+
Telefon:
+
{{customerMeeting.phone_no}}
+
Mobil:
+
{{customerMeeting.mobile_no}}
+
Report:
+
{{reportOld}}
+
+
+
+ +
+
+
+
+
+
+
Eintrag bearbeiten
+
Eintrag löschen
+
Report bearbeiten
+
+
+
+
+
+
+

{{ errorMsg }}

+
+
+
+ + +
+
+
+
+ +
+
+
+
+
+
+
+ +
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.ts new file mode 100644 index 0000000..8207f94 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.ts @@ -0,0 +1,199 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + OnInit, + Output, + ViewChild +} from '@angular/core'; +import {ICustomerMeeting} from '../../../../model/entities/customer-meeting'; +import {CustomerMeetingEditComponent} from '../customer-meeting-edit/customer-meeting-edit.component'; +import {Factory} from '../../../../factory/factory'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Utils} from '../../../../utils/utils'; +import {IUser} from '../../../../model/entities/user'; +import {AppService} from '../../../../services/app.service'; +import {IMeetingType} from '../../../../model/entities/meeting-type'; +import {IConfig} from '../../../../model/virtual/config'; +import {NgForm} from '@angular/forms'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {CustomerService} from '../../../../services/customer.service'; +import {MeetingService} from '../../../../services/meeting.service'; +import {FormComponent} from '../../../../components/form-component'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-meeting-detail', + templateUrl: './customer-meeting-detail.component.html', + styleUrls: ['./customer-meeting-detail.component.scss'], + // NOTE: We need manual change detection in this component + changeDetection: ChangeDetectionStrategy.OnPush, +}) + +export class CustomerMeetingDetailComponent extends FormComponent implements OnInit { + + @Output() editMeeting: EventEmitter = new EventEmitter(); + @Output() deleteMeeting: EventEmitter = new EventEmitter(); + @Output() editMeetingReport: EventEmitter = new EventEmitter(); + @ViewChild('customerMeetingDetailEdit', { static: true }) customerMeetingDetailEdit: CustomerMeetingEditComponent; + @ViewChild('customerMeetingReportForm', { static: true }) customerMeetingReportForm: NgForm; + + public customer: ICustomer; + public customerMeeting: ICustomerMeeting; + public isEditMode: boolean; + public creator: IUser; + public owner: IUser; + public participants: IUser[]; + public meetingType: IMeetingType; + public date: string; + public timeStart: string; + public timeEnd: string; + public config: IConfig; + public reportFormVisible: boolean; + public reportOld: string; + public hasEditRights: boolean; + public hasReportRights: boolean; + + constructor(public appService: AppService, private customerService: CustomerService, private meetingService: MeetingService, /*protected scrollToService: ScrollToService,*/ private ref: ChangeDetectorRef) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.hasEditRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.hasReportRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.config = this.appService.getConfig(); + this.customer = Factory.getEmptyCustomer(); + this.customerMeeting = Factory.getEmptyCustomerMeeting(); + this.creator = Factory.getEmptyUser(); + this.owner = Factory.getEmptyUser(); + this.participants = []; + this.meetingType = Factory.getEmptyMeetingType(); + this.date = ''; + this.timeStart = ''; + this.timeEnd = ''; + this.reportFormVisible = false; + this.reportOld = ''; + } + + /** + * Set data + */ + public setData(customer: ICustomer, customerMeeting: ICustomerMeeting): void { + this.customer = customer; + this.customerMeeting = customerMeeting; + this.hasEditRights = + this.appService.userHasRole(Const.USER_ROLE_ADMIN) || + this.appService.getAppUser().id === customerMeeting.creation_user_id || + this.appService.getAppUser().id === customerMeeting.owner_user_id; + this.hasReportRights = + this.appService.userHasRole(Const.USER_ROLE_ADMIN) || + this.appService.getAppUser().id === customerMeeting.owner_user_id; + this.setMeetingData(); + } + + /** + * Updates data + */ + public updateData(customer: ICustomer): void { + this.customer = customer; + if (null !== this.customerMeeting.id){ + this.customer.v_customer_meetings.forEach(item => { + if (item.id === this.customerMeeting.id) { + this.customerMeeting = item; + } + }); + this.setMeetingData(); + } + } + + /** + * Sets variables for meeting + */ + public setMeetingData(): void { + this.errorMsg = ''; + this.reportFormVisible = false; + this.reportOld = this.customerMeeting.report; + this.creator = this.appService.getConfig().vc_user_by_id[this.customerMeeting.creation_user_id]; + this.owner = this.appService.getConfig().vc_user_by_id[this.customerMeeting.owner_user_id]; + this.participants = []; + this.customerMeeting.v_participants.forEach(item => { + this.participants.push(this.appService.getConfig().vc_user_by_id[item.participant_user_id]); + }); + this.meetingType = this.appService.getConfig().vc_meeting_types_by_id[this.customerMeeting.meeting_type_id]; + this.date = Utils.getDateTimeToDisplay(this.customerMeeting.start_date); + this.timeStart = Utils.getDateTimeToDisplay(this.customerMeeting.start_date, false, true); + this.timeEnd = Utils.getDateTimeToDisplay(this.customerMeeting.end_date, false, true); + this.isEditMode = false; + this.resetFormValidation(); + // NOTE: We need manual change detection in this component + this.ref.detectChanges(); + } + + /** + * Edit meeting entry + */ + public editEntry(): void { + this.isEditMode = true; + this.customerMeetingDetailEdit.setData(this.customer, Utils.deepClone(this.customerMeeting) as ICustomerMeeting); + } + + /** + * Edits meeting entry + */ + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.editMeeting.emit(customerMeeting); + } + + /** + * Delete meeting entry + */ + public deleteEntry(): void { + const confirmAction = confirm('Wollen Sie diesen Eintrag wirklich löschen?'); + if (confirmAction === true) { + this.deleteMeeting.emit(this.customerMeeting.id); + } + } + + /** + * Check if edit report after meeting has started + */ + public editReport(): void { + this.meetingService.apiCheckCustomerMeetingReport(this.customerMeeting.id).subscribe( + data => { + this.reportFormVisible = data.result_data as boolean; + // NOTE: We need manual change detection in this component + this.ref.detectChanges(); + // todo this.scrollUp('customer-meeting-edit-report'); + }, + error => { + } + ); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + if (this.reportFormVisible) { + this.customerMeetingReportForm.form.markAsUntouched(); + } + } + + /** + * Saves customer meeting report + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + this.editMeetingReport.emit({ + id: this.customerMeeting.id, + report: this.customerMeeting.report + }); + this.errorMsg = ''; + } else { + // todo this.scrollUp('customer-meeting-edit-report'); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.html new file mode 100644 index 0000000..ac2af5d --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.html @@ -0,0 +1,208 @@ +

Kunden-Termin anlegen

+

Kunden-Termin bearbeiten

+
+
+
+

{{ errorMsg }}

+

+ Betreff ist ein Pflichtfeld. +

+

+ Datum ist ein Pflichtfeld. +

+

+ Uhrzeit (Start) ist ein Pflichtfeld. +

+

+ Uhrzeit (Ende) ist ein Pflichtfeld. +

+

+ Termin-Art ist ein Pflichtfeld. +

+

+ PLP Verantwortlicher ist ein Pflichtfeld. +

+ + + + + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+

 

+ + +
+
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+

Teilnehmer

+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+ + +
+
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.ts new file mode 100644 index 0000000..520c213 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.ts @@ -0,0 +1,248 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {NgForm} from '@angular/forms'; +import {ICustomerMeeting} from '../../../../model/entities/customer-meeting'; +import {ICustomer} from '../../../../model/entities/customer'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {Factory} from '../../../../factory/factory'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {Utils} from '../../../../utils/utils'; +import {AppService} from '../../../../services/app.service'; +import {IUser} from '../../../../model/entities/user'; +import {IMeetingType} from '../../../../model/entities/meeting-type'; +import {IConfig} from '../../../../model/virtual/config'; +import {FormComponent} from '../../../../components/form-component'; + +@Component({ + selector: 'app-customer-meeting-edit', + templateUrl: './customer-meeting-edit.component.html', + styleUrls: ['./customer-meeting-edit.component.scss'] +}) + +export class CustomerMeetingEditComponent extends FormComponent implements OnInit { + + @Output() createMeeting: EventEmitter = new EventEmitter(); + @Output() editMeeting: EventEmitter = new EventEmitter(); + @ViewChild('customerMeetingForm', { static: true }) customerMeetingForm: NgForm; + + public customer: ICustomer; + public customerMeeting: ICustomerMeeting; + public customerContacts: ICustomerContact[]; + public customerContactsById: {}; + public isExistingCustomerContact: boolean; + public users: IUser[]; + public usersById: {}; + public possibleOwners: IUser[]; + public participants: IUser[]; + public selectedParticipantsById: {}; + public selectedParticipantsByIdInitial: {}; + public owner: IUser; + public startDate: string; + public timeStart: string; + public timeEnd: string; + public meetingTypes: IMeetingType[]; + public contactPersonValue: string; + public config: IConfig; + + constructor(public appService: AppService, /*protected scrollToService: ScrollToService*/) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.config = this.appService.getConfig(); + this.customer = Factory.getEmptyCustomer(); + this.customerMeeting = Factory.getEmptyCustomerMeeting(); + this.customerContacts = []; + this.customerContactsById = {}; + this.isExistingCustomerContact = false; + this.users = this.appService.getConfig().users; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.possibleOwners = []; + this.participants = []; + this.selectedParticipantsById = {}; + this.selectedParticipantsByIdInitial = {}; + this.owner = Factory.getEmptyUser(); + this.startDate = ''; + this.timeStart = ''; + this.timeEnd = ''; + this.meetingTypes = []; + this.contactPersonValue = ''; + } + + /** + * Sets data + */ + public setData(customer: ICustomer, customerMeeting: ICustomerMeeting, isCreationMode: boolean = false): void { + this.customer = customer; + this.customerMeeting = customerMeeting; + this.customerContacts = this.customer.v_customer_contacts; + this.customerContactsById = Utils.getSortedObjFromArray(this.customerContacts, 'id'); + this.isCreationMode = isCreationMode; + this.startDate = Utils.getDateTimeToDisplay(this.customerMeeting.start_date, true, false, false, true); + this.timeStart = Utils.getDateTimeToDisplay(this.customerMeeting.start_date, false, true); + this.timeEnd = Utils.getDateTimeToDisplay(this.customerMeeting.end_date, false, true); + this.meetingTypes = this.appService.getConfig().meeting_types; + + this.owner = this.customerMeeting.owner_user_id !== null ? + this.appService.getConfig().vc_user_by_id[this.customerMeeting.owner_user_id] : null; + this.selectedParticipantsById = Utils.getSortedObjFromArray(this.customerMeeting.v_participants, 'participant_user_id'); + this.selectedParticipantsByIdInitial = Utils.getSortedObjFromArray(this.customerMeeting.v_participants, 'participant_user_id'); + this.participants = []; + + for (const p in this.usersById) { + if (this.isCreationMode) { + // New meeting + if (this.usersById[p].active) { + this.participants.push(this.usersById[p]); + this.possibleOwners.push(this.usersById[p]); + } + } else { + // Existing meeting + const userAttendsToMeeting: boolean = this.selectedParticipantsByIdInitial.hasOwnProperty(this.usersById[p].id); + if (this.usersById[p].id !== this.owner.id && (this.usersById[p].active || userAttendsToMeeting)) { + this.participants.push(this.usersById[p]); + this.possibleOwners.push(this.usersById[p]); + } + if (this.usersById[p].id === this.owner.id) { + this.possibleOwners.push(this.usersById[p]); + } + } + } + + if (null === this.customerMeeting.customer_contact_id) { + this.customerMeeting.customer_contact_id = -1; + } + if (this.customerMeeting.customer_contact_id > 0) { + this.isExistingCustomerContact = true; + } + this.errorMsg = ''; + this.resetFormValidation(); + } + + /** + * On select contact + */ + public selectContact(e: any) { + this.customerMeeting.customer_contact_id = e.target.value; + this.isExistingCustomerContact = false; + this.customerMeeting.gender = null; + this.customerMeeting.firstname = null; + this.customerMeeting.lastname = null; + this.customerMeeting.department = null; + this.customerMeeting.email = null; + this.customerMeeting.phone_no = null; + this.customerMeeting.mobile_no = null; + if (this.customerMeeting.customer_contact_id > 0) { + this.customerMeeting.gender = this.customerContactsById[this.customerMeeting.customer_contact_id].gender; + this.customerMeeting.firstname = this.customerContactsById[this.customerMeeting.customer_contact_id].firstname; + this.customerMeeting.lastname = this.customerContactsById[this.customerMeeting.customer_contact_id].lastname; + this.customerMeeting.department = this.customerContactsById[this.customerMeeting.customer_contact_id].department; + this.customerMeeting.email = this.customerContactsById[this.customerMeeting.customer_contact_id].email; + this.customerMeeting.phone_no = this.customerContactsById[this.customerMeeting.customer_contact_id].phone_no; + this.customerMeeting.mobile_no = this.customerContactsById[this.customerMeeting.customer_contact_id].mobile_no; + this.isExistingCustomerContact = true; + } + } + + /** + * On select owner + */ + public selectOwner(e: any) { + if (e.target.value !== '0: null') { + this.owner = this.usersById[e.target.value]; + if (this.selectedParticipantsById.hasOwnProperty(this.owner.id)) { + delete this.selectedParticipantsById[this.owner.id]; + } + } else { + this.owner = null; + } + this.participants = []; + for (const p in this.usersById) { + if ((this.owner == null || this.usersById[p].id !== this.owner.id) && this.usersById[p].active) { + this.participants.push(this.usersById[p]); + } + } + } + + /** + * On select meeting type + */ + public selectMeetingType(e: any) { + this.customerMeeting.meeting_type_id = e.target.value; + } + + /** + * On select participant + */ + public participantsChange(e: any) { + const participantUserId: number = parseInt(e.target.value); + if (this.selectedParticipantsById.hasOwnProperty(participantUserId)) { + delete this.selectedParticipantsById[participantUserId]; + } else { + let myId: number = null; + if (this.selectedParticipantsByIdInitial.hasOwnProperty(participantUserId)) { + myId = this.selectedParticipantsByIdInitial[participantUserId].id; + } + this.selectedParticipantsById[participantUserId] = { + id: myId, + customer_meeting_id: this.customerMeeting.id, + participant_user_id: participantUserId + }; + } + } + + /** + * Checks if participant is selected + */ + public checkParticipants(id: number) { + return this.selectedParticipantsById.hasOwnProperty(id); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.customerMeetingForm.form.markAsUntouched(); + } + + /** + * Saves customer meeting + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + const identifier: string = this.isCreationMode ? 'customer-meeting-modal' : 'customer-meeting-edit-modal'; + if (valid) { + // Check if start time before end time + if (parseInt(this.timeStart.replace(/\:/g, '')) - parseInt(this.timeEnd.replace(/\:/g, '')) > 0) { + this.errorMsg = 'Zeit (Ende) darf nicht vor Zeit (Start) liegen.'; + // todo this.scrollUp(identifier); + } else { + this.customerMeeting.start_date = this.startDate + ' ' + this.timeStart + ':00'; + this.customerMeeting.end_date = this.startDate + ' ' + this.timeEnd + ':00'; + // Check if date is valid + if (Utils.isValidDate(this.customerMeeting.start_date)) { + this.customerMeeting.v_participants = []; + for (const spId in this.selectedParticipantsById) { + this.customerMeeting.v_participants.push(this.selectedParticipantsById[spId]); + } + + if (this.customerMeeting.customer_contact_id === -1) { + this.customerMeeting.customer_contact_id = null; + } + + if (this.isCreationMode) { + this.createMeeting.emit(this.customerMeeting); + } else { + this.editMeeting.emit(this.customerMeeting); + } + this.errorMsg = ''; + } else { + this.errorMsg = 'Bitte korrektes Datum eingeben.'; + // todo this.scrollUp(identifier); + } + } + } else { + // todo this.scrollUp(identifier); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.html new file mode 100644 index 0000000..3031631 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.html @@ -0,0 +1,33 @@ +

Termine

+
Termin hinzufügen
+
+ + +
+
+ + +
+ + + + + + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.scss new file mode 100644 index 0000000..26b894d --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.scss @@ -0,0 +1,14 @@ +#create-meeting { + position: absolute; + right: 0; + top: -6rem; +} + +@media only screen and (max-width: 1004px) { + #create-meeting { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.ts new file mode 100644 index 0000000..eb7a170 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.ts @@ -0,0 +1,192 @@ +import {Component, EventEmitter, OnDestroy, OnInit, Output, ViewChild} from '@angular/core'; +import {AgGridComponent} from '../../../../components/ag-grid-component'; +import {ICustomerMeeting} from '../../../../model/entities/customer-meeting'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Factory} from '../../../../factory/factory'; +import {ModalComponent} from '../../../../components/modal/modal.component'; +import {CustomerMeetingEditComponent} from '../customer-meeting-edit/customer-meeting-edit.component'; +import {Utils} from '../../../../utils/utils'; +import {CustomerMeetingDetailComponent} from '../customer-meeting-detail/customer-meeting-detail.component'; +import {IUser} from '../../../../model/entities/user'; +import {IMeetingType} from '../../../../model/entities/meeting-type'; +import {AppService} from '../../../../services/app.service'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-meeting-view', + templateUrl: './customer-meeting-view.component.html', + styleUrls: ['./customer-meeting-view.component.scss'] +}) + +export class CustomerMeetingViewComponent extends AgGridComponent implements OnInit, OnDestroy { + + @Output() createMeeting: EventEmitter = new EventEmitter(); + @Output() editMeeting: EventEmitter = new EventEmitter(); + @Output() deleteMeeting: EventEmitter = new EventEmitter(); + @Output() editMeetingReport: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerMeetingEdit', {static: true}) modalCustomerMeetingEdit: ModalComponent; + @ViewChild('customerMeetingEdit', {static: true}) customerMeetingEdit: CustomerMeetingEditComponent; + @ViewChild('modalCustomerMeetingDetail', {static: true}) modalCustomerMeetingDetail: ModalComponent; + @ViewChild('customerMeetingDetail', {static: true}) customerMeetingDetail: CustomerMeetingDetailComponent; + + public customer: ICustomer; + public customerMeeting: ICustomerMeeting[]; + public customerMeetingEntriesById: {}; + public owner: IUser; + public participants: IUser[]; + public meetingType: IMeetingType; + public date: string; + public timeStart: string; + public timeEnd: string; + public hasSalesRights: boolean; + + constructor(public appService: AppService) { + super(); + } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.customer = Factory.getEmptyCustomer(); + this.customerMeeting = []; + this.customerMeetingEntriesById = {}; + this.owner = Factory.getEmptyUser(); + this.participants = []; + this.meetingType = Factory.getEmptyMeetingType(); + this.date = ''; + this.timeStart = ''; + this.timeEnd = ''; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'Datum', field: 'date', cellRenderer: this.dateRenderer, comparator: this.dateComparator}, + {headerName: 'Ersteller', field: 'creator' }, + {headerName: 'PLP Verantwortlicher', field: 'owner'}, + {headerName: 'Gesprächspartner', field: 'customerContactName'}, + {headerName: 'Titel', field: 'title'}, + {headerName: 'Uhrzeit (Start)', field: 'time_start', cellRenderer: this.timeRenderer}, + {headerName: 'Uhrzeit (Ende)', field: 'time_end', cellRenderer: this.timeRenderer}, + {headerName: 'Termin-Art', field: 'type'}, + {headerName: 'Optionstermin', field: 'is_option_meeting', cellRenderer: this.optionRenderer}, + {headerName: 'Adresse', field: 'address', cellRenderer: this.addressRenderer, autoHeight: true}, + { + headerName: 'Teilnehmer', + field: 'participants', + cellRenderer: this.participantsRenderer, + autoHeight: true + }, + {headerName: 'Abteilung', field: 'department'}, + {headerName: 'E-Mail', field: 'email'}, + {headerName: 'Telefon', field: 'phone'}, + {headerName: 'Mobil', field: 'mobile'}, + ]; + } + + /** + * Sets data + */ + public setData(customer: ICustomer, isUpdate: boolean): void { + this.customer = customer; + this.customerMeeting = this.customer.v_customer_meetings; + this.customerMeetingEntriesById = Utils.getSortedObjFromArray(this.customerMeeting, 'id'); + this.modalCustomerMeetingEdit.closeModal(); + this.generateEntries(); + if (isUpdate) { + this.customerMeetingDetail.updateData(customer); + } else { + this.modalCustomerMeetingDetail.closeModal(); + } + } + + /** + * Generates AG grid entries + */ + public generateEntries(): void { + this.rowData = []; + const items: {}[] = []; + this.customerMeeting.forEach((value) => { + this.owner = this.appService.getConfig().vc_user_by_id[value.owner_user_id]; + this.meetingType = this.appService.getConfig().vc_meeting_types_by_id[value.meeting_type_id]; + let customerContactName: string = null === value.firstname ? value.firstname + ' ' : ''; + customerContactName += null === value.lastname ? value.lastname : ''; + const creator: IUser = this.appService.getConfig().vc_user_by_id[value.creation_user_id]; + + items.push({ + that: this, + id: value.id, + title: value.title, + date: value.start_date, + time_start: value.start_date, + time_end: value.end_date, + type: this.meetingType.name, + typeType: this.meetingType.type, + is_option_meeting: value.is_option_meeting, + street: value.street, + street_no: value.street_no, + zip: value.zip, + city: value.city, + owner: this.owner.firstname + ' ' + this.owner.lastname, + creator: creator.firstname + ' ' + creator.lastname, + customerContactName, + participants: value.v_participants, + department: value.department, + email: value.email, + phone: value.phone_no, + mobile: value.mobile_no, + }); + this.rowData = items.sort((a: {} , b: {}) => this.dateComparator(a['date'], b['date'], false)); + }); + } + + /** + * On row click + */ + public rowClicked(e: any) { + this.modalCustomerMeetingDetail.openModal(); + this.customerMeetingDetail.setData(this.customer, this.customerMeetingEntriesById[e.data.id]); + } + + /** + * On create click + */ + public create(): void { + this.modalCustomerMeetingEdit.openModal(); + this.customerMeetingEdit.setData(this.customer, Factory.getEmptyCustomerMeeting(this.customer.id), true); + } + + /** + * Creates customer meeting + */ + public createCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.createMeeting.emit(customerMeeting); + } + + /** + * Edits meeting entry + */ + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting) { + this.editMeeting.emit(customerMeeting); + } + + /** + * Deletes customer meeting + */ + public deleteCustomerMeetingFunction(meetingId: number): void { + this.deleteMeeting.emit(meetingId); + } + + /** + * Edit report after meeting has started + */ + public editCustomerMeetingReportFunction(reportValues: any): void { + this.editMeetingReport.emit(reportValues); + } + + ngOnDestroy(): void { + + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.html new file mode 100644 index 0000000..bd74618 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.html @@ -0,0 +1,44 @@ +
+

Notiz Detail

+

Erstellt am {{creationDate}} von {{customerNote.creation_user_firstname}} + {{customerNote.creation_user_lastname}}

+
+
+
+
Datum:
+
{{noteDate}}
+
Betreff:
+
{{customerNote.title}}
+
Gesprächspartner:
+
Herr + Frau + Divers {{customerNote.firstname}} {{customerNote.lastname}}
+
Abteilung:
+
{{customerNote.department}}
+
E-Mail:
+
{{customerNote.email}}
+
Telefon:
+
{{customerNote.phone_no}}
+
Mobil:
+
{{customerNote.mobile_no}}
+
Fax:
+
{{customerNote.fax_no}}
+
Notiz:
+
{{customerNote.comment}}
+
+
+
+
+
+
+
Eintrag bearbeiten
+
Eintrag löschen
+
+
+
+
+
+
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.ts new file mode 100644 index 0000000..31065c3 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.ts @@ -0,0 +1,92 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomerNote} from '../../../../model/entities/customer-note'; +import {Factory} from '../../../../factory/factory'; +import {Utils} from '../../../../utils/utils'; +import {CustomerNoteEditComponent} from '../customer-note-edit/customer-note-edit.component'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Const} from '../../../../utils/const'; +import {AppService} from '../../../../services/app.service'; + +@Component({ + selector: 'app-customer-note-detail', + templateUrl: './customer-note-detail.component.html', + styleUrls: ['./customer-note-detail.component.scss'] +}) + +export class CustomerNoteDetailComponent implements OnInit { + + @Output() editNote: EventEmitter = new EventEmitter(); + @Output() deleteNote: EventEmitter = new EventEmitter(); + @ViewChild('customerNoteEdit', { static: true }) customerNoteEdit: CustomerNoteEditComponent; + + public customer: ICustomer; + public customerNote: ICustomerNote; + public creationDate: string; + public isEditMode: boolean; + public noteDate: string; + public hasSalesRights: boolean; + + constructor(public appService: AppService) { } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.customer = Factory.getEmptyCustomer(); + this.customerNote = Factory.getEmptyCustomerNote(); + this.creationDate = ''; + this.isEditMode = false; + this.noteDate = ''; + } + + /** + * Set data + */ + public setData(customer: ICustomer, customerNote: ICustomerNote): void { + this.customer = customer; + this.customerNote = customerNote; + this.creationDate = Utils.getDateTimeToDisplay(this.customerNote.creation_date); + this.isEditMode = false; + this.noteDate = Utils.getDateTimeToDisplay(this.customerNote.note_date); + } + + /** + * Updates data + * @param customer + */ + public updateData(customer: ICustomer): void { + this.customer = customer; + for (let i = 0; i < this.customer.v_customer_notes.length; i++) { + if (this.customer.v_customer_notes[i].id === this.customerNote.id) { + this.customerNote = this.customer.v_customer_notes[i]; + this.noteDate = Utils.getDateTimeToDisplay(this.customerNote.note_date); + } + } + this.isEditMode = false; + } + + /** + * Edit note entry + */ + public editEntry(): void { + this.isEditMode = true; + this.customerNoteEdit.setData(this.customer, Utils.deepClone(this.customerNote) as ICustomerNote); + } + + /** + * Edits note entry + * @param customerNote + */ + public editCustomerNoteFunction(customerNote: ICustomerNote) { + this.editNote.emit(customerNote); + } + + /** + * Delete note entry + */ + public deleteEntry(): void { + const confirmAction = confirm('Wollen Sie diesen Eintrag wirklich löschen?'); + if (confirmAction == true) { + this.deleteNote.emit(this.customerNote.id); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.html new file mode 100644 index 0000000..ffb6b16 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.html @@ -0,0 +1,127 @@ +

Notiz anlegen

+

Notiz bearbeiten

+
+
+
+

{{ errorMsg }}

+

+ Datum ist ein Pflichtfeld. +

+

+ Betreff ist ein Pflichtfeld. +

+ + + + + + + + + + + +
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+ + +
+
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.ts new file mode 100644 index 0000000..45806fc --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.ts @@ -0,0 +1,120 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomerNote} from '../../../../model/entities/customer-note'; +import {NgForm} from '@angular/forms'; +import {Factory} from '../../../../factory/factory'; +import {ICustomer} from '../../../../model/entities/customer'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {Utils} from '../../../../utils/utils'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {FormComponent} from '../../../../components/form-component'; + +@Component({ + selector: 'app-customer-note-edit', + templateUrl: './customer-note-edit.component.html', + styleUrls: ['./customer-note-edit.component.scss'] +}) + +export class CustomerNoteEditComponent extends FormComponent implements OnInit { + + @Output() createNote: EventEmitter = new EventEmitter(); + @Output() editNote: EventEmitter = new EventEmitter(); + @ViewChild('customerNoteForm', { static: true }) customerNoteForm: NgForm; + + public customer: ICustomer; + public customerNote: ICustomerNote; + public customerContacts: ICustomerContact[]; + public customerContactsById: {}; + public isExistingCustomerContact: boolean; + public contactId: string; + + constructor(/* protected scrollToService: ScrollToService */) { + super(/* scrollToService */); + } + + ngOnInit() { + this.customer = Factory.getEmptyCustomer(); + this.customerNote = Factory.getEmptyCustomerNote(); + this.customerContacts = []; + this.customerContactsById = {}; + this.errorMsg = ''; + this.contactId = ''; + this.isCreationMode = false; + this.isExistingCustomerContact = false; + } + + /** + * Sets data + */ + public setData(customer: ICustomer, customerNote: ICustomerNote, isCreationMode = false): void { + this.customer = customer; + this.customerNote = customerNote; + this.customerContacts = this.customer.v_customer_contacts; + this.customerContactsById = Utils.getSortedObjFromArray(this.customerContacts, 'id'); + this.customerNote.customer_id = this.customer.id; + this.contactId = ''; + this.isCreationMode = isCreationMode; + this.errorMsg = ''; + if (null === this.customerNote.customer_contact_id) { + this.customerNote.customer_contact_id = -1; + } + if (this.customerNote.customer_contact_id > 0) { + this.isExistingCustomerContact = true; + } + this.resetFormValidation(); + } + + /** + * On select contact + */ + public selectContact(e: any) { + this.customerNote.customer_contact_id = e.target.value; + this.isExistingCustomerContact = false; + this.customerNote.gender = null; + this.customerNote.firstname = null; + this.customerNote.lastname = null; + this.customerNote.department = null; + this.customerNote.email = null; + this.customerNote.phone_no = null; + this.customerNote.mobile_no = null; + this.customerNote.fax_no = null; + if (this.customerNote.customer_contact_id > 0) { + this.customerNote.gender = this.customerContactsById[this.customerNote.customer_contact_id].gender; + this.customerNote.firstname = this.customerContactsById[this.customerNote.customer_contact_id].firstname; + this.customerNote.lastname = this.customerContactsById[this.customerNote.customer_contact_id].lastname; + this.customerNote.department = this.customerContactsById[this.customerNote.customer_contact_id].department; + this.customerNote.email = this.customerContactsById[this.customerNote.customer_contact_id].email; + this.customerNote.phone_no = this.customerContactsById[this.customerNote.customer_contact_id].phone_no; + this.customerNote.mobile_no = this.customerContactsById[this.customerNote.customer_contact_id].mobile_no; + this.customerNote.fax_no = this.customerContactsById[this.customerNote.customer_contact_id].fax_no; + this.isExistingCustomerContact = true; + } + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.customerNoteForm.form.markAsUntouched(); + } + + /** + * Saves customer + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + if (this.customerNote.customer_contact_id == -1) { + this.customerNote.customer_contact_id = null; + } + if (this.isCreationMode) { + this.createNote.emit(this.customerNote); + } else { + this.editNote.emit(this.customerNote); + } + this.errorMsg = ''; + } else { + // todo this.scrollUp(this.isCreationMode ? 'customer-note-modal' : 'customer-note-edit-modal'); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.html new file mode 100644 index 0000000..61bbe45 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.html @@ -0,0 +1,32 @@ +

Notizen

+
Notiz hinzufügen
+
+ + +
+
+ + +
+ + + + + + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.scss new file mode 100644 index 0000000..f6cb50f --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.scss @@ -0,0 +1,14 @@ +#create-history { + position: absolute; + right: 0; + top: -6rem; +} + +@media only screen and (max-width: 1004px) { + #create-history { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.ts new file mode 100644 index 0000000..c0b14de --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.ts @@ -0,0 +1,154 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ModalComponent} from '../../../../components/modal/modal.component'; +import {ICustomerNote} from '../../../../model/entities/customer-note'; +import {CustomerNoteEditComponent} from '../customer-note-edit/customer-note-edit.component'; +import {Factory} from '../../../../factory/factory'; +import {ICustomer} from '../../../../model/entities/customer'; +import {AgGridComponent} from '../../../../components/ag-grid-component'; +import {Utils} from '../../../../utils/utils'; +import {CustomerNoteDetailComponent} from '../customer-note-detail/customer-note-detail.component'; +import {Const} from '../../../../utils/const'; +import {AppService} from '../../../../services/app.service'; + +@Component({ + selector: 'app-customer-note-view', + templateUrl: './customer-note-view.component.html', + styleUrls: ['./customer-note-view.component.scss'] +}) + +export class CustomerNoteViewComponent extends AgGridComponent implements OnInit { + + @Output() createNote: EventEmitter = new EventEmitter(); + @Output() editNote: EventEmitter = new EventEmitter(); + @Output() deleteNote: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerNoteEdit', { static: true }) modalCustomerNoteEdit: ModalComponent; + @ViewChild('customerNoteEdit', { static: true }) customerNoteEdit: CustomerNoteEditComponent; + @ViewChild('modalCustomerNoteDetail', { static: true }) modalCustomerNoteDetail: ModalComponent; + @ViewChild('customerNoteDetail', { static: true }) customerNoteDetail: CustomerNoteDetailComponent; + + public customer: ICustomer; + public customerNote: ICustomerNote[]; + public customerNoteEntriesById: {}; + public hasSalesRights: boolean; + + constructor(public appService: AppService) { + super(); + } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.customer = Factory.getEmptyCustomer(); + this.customerNote = []; + this.customerNoteEntriesById = {}; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'Erstellungsdatum', field: 'creation_date', cellRenderer: this.dateRenderer, comparator: this.dateComparator }, + {headerName: 'Ersteller', field: 'creator' }, + {headerName: 'Datum', field: 'date', cellRenderer: this.dateRenderer, comparator: this.dateComparator }, + {headerName: 'Betreff', field: 'title' }, + {headerName: 'Notiz', field: 'comment' }, + {headerName: 'Anrede', field: 'gender', width: 90 }, + {headerName: 'Vorname', field: 'firstname' }, + {headerName: 'Nachname', field: 'lastname' }, + {headerName: 'Abteilung', field: 'department' }, + {headerName: 'E-Mail Adresse', field: 'email', cellRenderer: this.emailRenderer }, + {headerName: 'Telefon', field: 'phone_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Mobil', field: 'mobile_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Fax', field: 'fax_no' }, + ]; + } + + /** + * Sets data + */ + public setData(customer: ICustomer, isUpdate: boolean): void { + this.customer = customer; + this.customerNote = this.customer.v_customer_notes; + this.customerNoteEntriesById = Utils.getSortedObjFromArray(this.customerNote, 'id'); + this.modalCustomerNoteEdit.closeModal(); + this.generateEntries(); + if (isUpdate) { + this.customerNoteDetail.updateData(customer); + } else { + this.modalCustomerNoteDetail.closeModal(); + } + } + + /** + * Generates AG grid entries + */ + public generateEntries(): void { + this.rowData = []; + const items: {}[] = []; + for (const item of this.customerNote) { + let ccGender = ''; + if (item.gender === 'male') { + ccGender = 'Herr'; + } else if (item.gender === 'female') { + ccGender = 'Frau'; + } else if (item.gender === 'diverse') { + ccGender = 'Divers'; + } + items.push({ + id: item.id, + date: item.note_date, + title: item.title, + comment: item.comment, + gender: ccGender, + firstname: item.firstname, + lastname: item.lastname, + email: item.email, + phone_no: item.phone_no, + mobile_no: item.mobile_no, + fax_no: item.fax_no, + department: item.department, + creation_date: item.creation_date, + creator: item.creation_user_firstname + ' ' + item.creation_user_lastname, + }); + } + this.rowData = items.sort((a: {} , b: {}) => this.dateComparator(a['date'], b['date'], false)); + } + + /** + * On row click + */ + public rowClicked(e: any) { + this.modalCustomerNoteDetail.openModal(); + this.customerNoteDetail.setData(this.customer, this.customerNoteEntriesById[e.data.id]); + } + + /** + * On create click + */ + public create(): void { + this.modalCustomerNoteEdit.openModal(); + this.customerNoteEdit.setData(this.customer, Factory.getEmptyCustomerNote(this.customer.id, Utils.getCurrentDate()), true); + } + + /** + * Creates customer note + */ + public createCustomerNoteFunction(customerNote: ICustomerNote): void { + this.createNote.emit(customerNote); + } + + /** + * Edits note entry + */ + public editCustomerNoteFunction(customerNote: ICustomerNote) { + this.editNote.emit(customerNote); + } + + /** + * Deletes customer note + */ + public deleteCustomerNoteFunction(noteId: number): void { + this.deleteNote.emit(noteId); + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.html new file mode 100644 index 0000000..ad4d93e --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.html @@ -0,0 +1,32 @@ +

{{customer.name}}

+ + +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.ts new file mode 100644 index 0000000..dfa7fd3 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.ts @@ -0,0 +1,155 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {TabsComponent} from '../../../components/tabs/tabs.component'; +import {ICustomer} from '../../../model/entities/customer'; +import {CustomerDataViewComponent} from './customer-data-view/customer-data-view.component'; +import {CustomerContactPersonViewComponent} from './customer-contact-person-view/customer-contact-person-view.component'; +import {CustomerNoteViewComponent} from './customer-note-view/customer-note-view.component'; +import {Factory} from '../../../factory/factory'; +import {ICustomerContact} from '../../../model/entities/customer-contact'; +import {ICustomerNote} from '../../../model/entities/customer-note'; +import {CustomerMeetingViewComponent} from './customer-meeting-view/customer-meeting-view.component'; +import {ICustomerMeeting} from '../../../model/entities/customer-meeting'; + +@Component({ + selector: 'app-customer-view', + templateUrl: './customer-view.component.html', + styleUrls: ['./customer-view.component.scss'] +}) + +export class CustomerViewComponent implements OnInit { + + @Output() editCustomer: EventEmitter = new EventEmitter(); + @Output() createCustomerContact: EventEmitter = new EventEmitter(); + @Output() editCustomerContact: EventEmitter = new EventEmitter(); + @Output() deleteCustomerContact: EventEmitter = new EventEmitter(); + @Output() createNote: EventEmitter = new EventEmitter(); + @Output() editNote: EventEmitter = new EventEmitter(); + @Output() deleteNote: EventEmitter = new EventEmitter(); + @Output() createMeeting: EventEmitter = new EventEmitter(); + @Output() editMeeting: EventEmitter = new EventEmitter(); + @Output() deleteMeeting: EventEmitter = new EventEmitter(); + @Output() editMeetingReport: EventEmitter = new EventEmitter(); + @Output() shortcut: EventEmitter = new EventEmitter(); + @ViewChild('tabsCMView', { static: true }) tabsCMView: TabsComponent; + @ViewChild('customerDataView', { static: true }) customerDataView: CustomerDataViewComponent; + @ViewChild('customerContactPersonView', { static: true }) customerContactPersonView: CustomerContactPersonViewComponent; + @ViewChild('customerNoteView', { static: true }) customerNoteView: CustomerNoteViewComponent; + @ViewChild('customerMeetingView', { static: true }) customerMeetingView: CustomerMeetingViewComponent; + + public customer: ICustomer; + + constructor() { } + + ngOnInit() { + this.customer = Factory.getEmptyCustomer(); + } + + /** + * Sets data + * @param customer + * @param isUpdate + */ + public setData(customer: ICustomer, isUpdate: boolean = false): void { + this.customer = customer; + this.customerDataView.setData(this.customer); + this.customerContactPersonView.setData(this.customer, isUpdate); + this.customerNoteView.setData(this.customer, isUpdate); + this.customerMeetingView.setData(this.customer, isUpdate); + } + + /** + * Saves customer + * @param customer + */ + public editCustomerFunction(customer: ICustomer): void { + this.editCustomer.emit(customer); + } + + /** + * Creates customer contact + * @param customerContact + */ + public createCustomerContactFunction(customerContact: ICustomerContact): void { + this.createCustomerContact.emit(customerContact); + } + + /** + * Edit customer contact + * @param customerContact + */ + public editCustomerContactFunction(customerContact: ICustomerContact): void { + this.editCustomerContact.emit(customerContact); + } + + /** + * Creates customer note + * @param customerNote + */ + public createCustomerNoteFunction(customerNote: ICustomerNote): void { + this.createNote.emit(customerNote); + } + + /** + * Edits note entry + * @param customerNote + */ + public editCustomerNoteFunction(customerNote: ICustomerNote) { + this.editNote.emit(customerNote); + } + + /** + * Deletes customer note + * @param noteId + */ + public deleteCustomerNoteFunction(noteId: number): void { + this.deleteNote.emit(noteId); + } + + /** + * Deletes customer contact + * @param contactId + */ + public deleteCustomerContactFunction(contactId: number): void { + this.deleteCustomerContact.emit(contactId); + } + + /** + * Creates customer meeting + * @param customerMeeting + */ + public createCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.createMeeting.emit(customerMeeting); + } + + /** + * Edits meeting entry + * @param customerMeeting + */ + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting) { + this.editMeeting.emit(customerMeeting); + } + + /** + * Deletes customer meeting + * @param meetingId + */ + public deleteCustomerMeetingFunction(meetingId: number): void { + this.deleteMeeting.emit(meetingId); + } + + /** + * Edit report after meeting has started + * @param reportValues + */ + public editCustomerMeetingReportFunction(reportValues: any): void { + this.editMeetingReport.emit(reportValues); + } + + /** + * Shortcut to customer detail + * @param customer + */ + public shortcutFunction(customer: ICustomer): void { + this.shortcut.emit(customer); + } +} diff --git a/plp-angular/src/app/views/login/login.component.html b/plp-angular/src/app/views/login/login.component.html new file mode 100644 index 0000000..ebdeace --- /dev/null +++ b/plp-angular/src/app/views/login/login.component.html @@ -0,0 +1,34 @@ +

Login

+
+
+
+

{{ errorMsg }}

+

+ E-Mail ist ein Pflichtfeld. +

+

+ Bitte gültige E-Mail Adresse eingeben. +

+

+ Passwort ist ein Pflichtfeld. +

+

+ Passwort benötigt mindestens {{ password.getError('minlength').requiredLength }} Zeichen. +

+
+
+
+ + +
+
+ + +
+
+ +
+
+Passwort vergessen \ No newline at end of file diff --git a/plp-angular/src/app/views/login/login.component.scss b/plp-angular/src/app/views/login/login.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/login/login.component.ts b/plp-angular/src/app/views/login/login.component.ts new file mode 100644 index 0000000..ce55fe1 --- /dev/null +++ b/plp-angular/src/app/views/login/login.component.ts @@ -0,0 +1,75 @@ +import { Component, OnInit } from '@angular/core'; +import {UntypedFormBuilder, UntypedFormGroup, Validators} from '@angular/forms'; +import {environment} from '../../../environments/environment'; +import {AppService} from '../../services/app.service'; +import {Subscription} from 'rxjs'; +import {Router} from '@angular/router'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) + +export class LoginComponent implements OnInit { + + private loginSub: Subscription; + public isLoggedIn: boolean; + public errorMsg: string; + public loginForm: UntypedFormGroup; + + /** + * Gets email + */ + get email() { + return this.loginForm.get('email'); + } + + /** + * Gets password + */ + get password() { + return this.loginForm.get('password'); + } + + constructor(private router: Router, public appService: AppService, private fb: UntypedFormBuilder) { + this.errorMsg = ''; + } + + ngOnInit() { + this.isLoggedIn = false; + this.loginForm = this.fb.group({ + email: ['', [Validators.required, Validators.email]], + password: [environment.password, [Validators.required, Validators.minLength(4)]] + }); + + // Observe login state + this.loginSub = this.appService.getLoginState$().subscribe( + data => { + if (data !== null) { + this.isLoggedIn = true; + this.router.navigate(['./start']); + } else { + this.isLoggedIn = false; + } + } + ); + } + + /** + * On form submit + */ + public onFormSubmit(): void { + if (this.loginForm.valid) { + this.appService.login(this.email.value, this.password.value); + } + } + + /** + * Forgot password + */ + public forgotPassword(): void { + alert('Hier folgt in Zukunft die Funktionalität \'Neues Passwort vergeben\'.\nBei Problemen wenden Sie sich bitte an admin@plp-tool.de.'); + } + +} diff --git a/plp-angular/src/app/views/sales/sales.component.html b/plp-angular/src/app/views/sales/sales.component.html new file mode 100644 index 0000000..82bf3fa --- /dev/null +++ b/plp-angular/src/app/views/sales/sales.component.html @@ -0,0 +1 @@ +

sales works!

diff --git a/plp-angular/src/app/views/sales/sales.component.scss b/plp-angular/src/app/views/sales/sales.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/sales/sales.component.ts b/plp-angular/src/app/views/sales/sales.component.ts new file mode 100644 index 0000000..832209e --- /dev/null +++ b/plp-angular/src/app/views/sales/sales.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-sales', + templateUrl: './sales.component.html', + styleUrls: ['./sales.component.scss'] +}) + +export class SalesComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.html b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.html new file mode 100644 index 0000000..d0b35a8 --- /dev/null +++ b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.html @@ -0,0 +1,57 @@ +
+

PLP interner Termin

+

{{dateStart}} {{timeStart}} Uhr bis {{dateEnd}} {{timeEnd}} Uhr

+

{{internalMeeting.title}}

+
Erstellt von: {{creator.firstname}} {{creator.lastname}}
+

{{internalMeeting.description}}

+
+
+
+
+
PLP Verantwortlicher:
+
{{owner.firstname}} {{owner.lastname}}
+
Teilnehmer:
+
+ + {{p.firstname}} {{p.lastname}}
+
+
+
Report:
+
{{reportOld}}
+
+
+
+
+
+
+
+
Eintrag bearbeiten
+
Eintrag löschen
+
Report bearbeiten
+
+
+
+
+
+
+

{{ errorMsg }}

+
+
+
+ + +
+
+
+
+ +
+
+
+
+
+
+
+ +
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.scss b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.ts b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.ts new file mode 100644 index 0000000..d7e3c07 --- /dev/null +++ b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.ts @@ -0,0 +1,182 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + OnInit, + Output, + ViewChild +} from '@angular/core'; +import {IInternalMeeting} from '../../../model/entities/internal-meeting'; +import {NgForm} from '@angular/forms'; +import {InternalMeetingEditComponent} from '../internal-meeting-edit/internal-meeting-edit.component'; +import {Utils} from '../../../utils/utils'; +import {Factory} from '../../../factory/factory'; +import {IConfig} from '../../../model/virtual/config'; +import {AppService} from '../../../services/app.service'; +import {IUser} from '../../../model/entities/user'; +import {FormComponent} from '../../../components/form-component'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {MeetingService} from '../../../services/meeting.service'; +import {Const} from '../../../utils/const'; + +@Component({ + selector: 'app-internal-meeting-detail', + templateUrl: './internal-meeting-detail.component.html', + styleUrls: ['./internal-meeting-detail.component.scss'], + // NOTE: We need manual change detection in this component + changeDetection: ChangeDetectionStrategy.OnPush, +}) + +export class InternalMeetingDetailComponent extends FormComponent implements OnInit { + + @Output() editMeeting: EventEmitter = new EventEmitter(); + @Output() deleteMeeting: EventEmitter = new EventEmitter(); + @Output() editMeetingReport: EventEmitter = new EventEmitter(); + @ViewChild('internalMeetingDetailEdit', { static: true }) internalMeetingDetailEdit: InternalMeetingEditComponent; + @ViewChild('internalMeetingReportForm', { static: true }) internalMeetingReportForm: NgForm; + + public internalMeeting: IInternalMeeting; + public creator: IUser; + public owner: IUser; + public participants: IUser[]; + public dateStart: string; + public dateEnd: string; + public timeStart: string; + public timeEnd: string; + public config: IConfig; + public isEditMode: boolean; + public errorMsg: string; + public reportFormVisible: boolean; + public reportOld: string; + public hasAdminRights: boolean; + + constructor(public appService: AppService, private meetingService: MeetingService, /*protected scrollToService: ScrollToService,*/ private ref: ChangeDetectorRef) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.hasAdminRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.config = this.appService.getConfig(); + this.internalMeeting = Factory.getEmptyInternalMeeting(); + this.creator = Factory.getEmptyUser(); + this.owner = Factory.getEmptyUser(); + this.participants = []; + this.dateStart = ''; + this.dateEnd = ''; + this.timeStart = ''; + this.timeEnd = ''; + this.isEditMode = false; + this.errorMsg = ''; + this.reportFormVisible = false; + this.reportOld = ''; + } + + /** + * Set data + */ + public setData(internalMeeting: IInternalMeeting): void { + this.internalMeeting = internalMeeting; + this.setMeetingData(); + } + + /** + * Updates data + */ + public updateData(internalMeeting: IInternalMeeting): void { + if (null !== this.internalMeeting.id) { + this.internalMeeting = internalMeeting; + this.setMeetingData(); + } + } + + /** + * Sets variables for meeting + */ + public setMeetingData() { + this.reportFormVisible = false; + this.reportOld = this.internalMeeting.report; + this.creator = this.config.vc_user_by_id[this.internalMeeting.creation_user_id]; + this.owner = this.config.vc_user_by_id[this.internalMeeting.owner_user_id]; + this.participants = []; + for (let i = 0; i < this.internalMeeting.v_participants.length; i++) { + this.participants.push(this.config.vc_user_by_id[this.internalMeeting.v_participants[i].participant_user_id]); + } + this.dateStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date); + this.dateEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date); + this.timeStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date, false, true); + this.timeEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date, false, true); + this.isEditMode = false; + this.errorMsg = ''; + this.resetFormValidation(); + // NOTE: We need manual change detection in this component + this.ref.detectChanges(); + } + + /** + * Edit meeting entry + */ + public editEntry(): void { + this.isEditMode = true; + this.internalMeetingDetailEdit.setData(Utils.deepClone(this.internalMeeting) as IInternalMeeting); + } + + /** + * Edits meeting entry + */ + public editInternalMeetingFunction(internalMeeting: IInternalMeeting) { + this.editMeeting.emit(internalMeeting); + } + + /** + * Delete meeting entry + */ + public deleteEntry(): void { + const confirmAction = confirm('Wollen Sie diesen Eintrag wirklich löschen?'); + if (confirmAction === true) { + this.deleteMeeting.emit(this.internalMeeting.id); + } + } + + /** + * Check if edit report after meeting has started + */ + public editReport(): void { + this.meetingService.apiCheckInternalMeetingReport(this.internalMeeting.id).subscribe( + data => { + this.reportFormVisible = data.result_data as boolean; + // NOTE: We need manual change detection in this component + this.ref.detectChanges(); + // todo this.scrollUp('internal-meeting-edit-report'); + }, + error => { + } + ); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + if (this.reportFormVisible) { + this.internalMeetingReportForm.form.markAsUntouched(); + } + } + + /** + * Saves internal meeting report + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + this.editMeetingReport.emit({ + id: this.internalMeeting.id, + report: this.internalMeeting.report + }); + this.errorMsg = ''; + } else { + // todo this.scrollUp('internal-meeting-edit-report'); + } + } + +} diff --git a/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.html b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.html new file mode 100644 index 0000000..1de7bef --- /dev/null +++ b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.html @@ -0,0 +1,98 @@ +

Internen Termin anlegen

+

Internen Termin bearbeiten

+
+
+
+

{{ errorMsg }}

+

+ Betreff ist ein Pflichtfeld. +

+

+ Datum ist ein Pflichtfeld. +

+

+ Uhrzeit (Start) ist ein Pflichtfeld. +

+

+ Uhrzeit (Ende) ist ein Pflichtfeld. +

+

+ PLP Verantwortlicher ist ein Pflichtfeld. +

+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+

Teilnehmer

+
+
+
+
+
+ + +
+
+
+
+
+ +
+
+ + +
+
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.scss b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.ts b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.ts new file mode 100644 index 0000000..e73d44a --- /dev/null +++ b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.ts @@ -0,0 +1,198 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {IConfig} from '../../../model/virtual/config'; +import {AppService} from '../../../services/app.service'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {NgForm} from '@angular/forms'; +import {Factory} from '../../../factory/factory'; +import {IInternalMeeting} from '../../../model/entities/internal-meeting'; +import {Utils} from '../../../utils/utils'; +import {IUser} from '../../../model/entities/user'; +import {FormComponent} from '../../../components/form-component'; + +@Component({ + selector: 'app-internal-meeting-edit', + templateUrl: './internal-meeting-edit.component.html', + styleUrls: ['./internal-meeting-edit.component.scss'] +}) + +export class InternalMeetingEditComponent extends FormComponent implements OnInit { + + @Output() createMeeting: EventEmitter = new EventEmitter(); + @Output() editMeeting: EventEmitter = new EventEmitter(); + @ViewChild('internalMeetingForm', { static: true }) internalMeetingForm: NgForm; + + public internalMeeting: IInternalMeeting; + public users: IUser[]; + public usersById: {}; + public possibleOwners: IUser[]; + public possibleOwnersById: {}; + public participants: IUser[]; + public selectedParticipantsById: {}; + public selectedParticipantsByIdInitial: {}; + public owner: IUser; + public dateStart: string; + public dateEnd: string; + public timeStart: string; + public timeEnd: string; + public config: IConfig; + + constructor(public appService: AppService, /*protected scrollToService: ScrollToService*/) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.config = this.appService.getConfig(); + this.internalMeeting = Factory.getEmptyInternalMeeting(); + this.users = []; + this.usersById = {}; + this.possibleOwners = []; + this.possibleOwnersById = {}; + this.participants = []; + this.selectedParticipantsById = {}; + this.selectedParticipantsByIdInitial = {}; + this.owner = Factory.getEmptyUser(); + this.dateStart = ''; + this.dateEnd = ''; + this.timeStart = ''; + this.timeEnd = ''; + } + + /** + * Sets data + */ + public setData(internalMeeting: IInternalMeeting, isCreationMode = false): void { + this.internalMeeting = internalMeeting; + this.users = this.appService.getConfig().users; + this.isCreationMode = isCreationMode; + this.owner = this.internalMeeting.owner_user_id !== null ? + this.appService.getConfig().vc_user_by_id[this.internalMeeting.owner_user_id] : null; + this.dateStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date, true, false, false, true); + this.dateEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date, true, false, false, true); + this.timeStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date, false, true); + this.timeEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date, false, true); + this.usersById = Utils.getSortedObjFromArray(this.appService.getConfig().users, 'id'); + this.selectedParticipantsById = Utils.getSortedObjFromArray(this.internalMeeting.v_participants, 'participant_user_id'); + this.selectedParticipantsByIdInitial = Utils.getSortedObjFromArray(this.internalMeeting.v_participants, 'participant_user_id'); + this.participants = []; + this.possibleOwners = []; + for (const p in this.usersById) { + if (this.isCreationMode) { + // New meeting + if (this.usersById[p].active) { + this.participants.push(this.usersById[p]); + this.possibleOwners.push(this.usersById[p]); + } + } else { + // Existing meeting + const userAttendsToMeeting: boolean = this.selectedParticipantsByIdInitial.hasOwnProperty(this.usersById[p].id); + if (this.usersById[p].id !== this.owner.id && (this.usersById[p].active || userAttendsToMeeting)) { + this.participants.push(this.usersById[p]); + this.possibleOwners.push(this.usersById[p]); + } + if (this.usersById[p].id === this.owner.id) { + this.possibleOwners.push(this.usersById[p]); + } + } + } + this.errorMsg = ''; + this.resetFormValidation(); + } + + /** + * On select owner + */ + public selectOwner(e: any) { + if (e.target.value !== '0: null') { + this.owner = this.usersById[e.target.value]; + if (this.selectedParticipantsById.hasOwnProperty(this.owner.id)) { + delete this.selectedParticipantsById[this.owner.id]; + } + } else { + this.owner = null; + } + this.participants = []; + for (const p in this.usersById) { + if ((this.owner == null || this.usersById[p].id !== this.owner.id) && this.usersById[p].active) { + this.participants.push(this.usersById[p]); + } + } + } + + /** + * On select participant + */ + public participantsChange(e: any) { + const participantUserId: number = parseInt(e.target.value); + if (this.selectedParticipantsById.hasOwnProperty(participantUserId)) { + delete this.selectedParticipantsById[participantUserId]; + } else { + let myId: number = null; + if (this.selectedParticipantsByIdInitial.hasOwnProperty(participantUserId)) { + myId = this.selectedParticipantsByIdInitial[participantUserId].id; + } + this.selectedParticipantsById[participantUserId] = { + id: myId, + customer_meeting_id: this.internalMeeting.id, + participant_user_id: participantUserId + }; + } + } + + /** + * Checks if participant is selected + */ + public checkParticipants(id: number) { + if (this.selectedParticipantsById.hasOwnProperty(id)) { + return true; + } else { + return false; + } + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.internalMeetingForm.form.markAsUntouched(); + } + + /** + * Saves internal meeting + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + const identifier: string = this.isCreationMode ? 'internal-meeting-modal' : 'internal-meeting-edit-modal'; + if (valid) { + // Check if start time before end time + const compareDateStart = new Date(this.dateStart + 'T' + this.timeStart + ':00'); + const compareDateEnd = new Date(this.dateEnd + 'T' + this.timeEnd + ':00'); + if (compareDateStart > compareDateEnd) { + this.errorMsg = 'Datum / Zeit (Ende) darf nicht vor Datum / Zeit (Start) liegen.'; + // todo this.scrollUp(identifier); + } else { + this.internalMeeting.start_date = this.dateStart + ' ' + this.timeStart + ':00'; + this.internalMeeting.end_date = this.dateEnd + ' ' + this.timeEnd + ':00'; + // Check if date is valid + if (Utils.isValidDate(this.internalMeeting.start_date)) { + this.internalMeeting.v_participants = []; + for (const spId in this.selectedParticipantsById) { + this.internalMeeting.v_participants.push(this.selectedParticipantsById[spId]); + } + + if (this.isCreationMode) { + this.createMeeting.emit(this.internalMeeting); + } else { + this.editMeeting.emit(this.internalMeeting); + } + this.errorMsg = ''; + } else { + this.errorMsg = 'Bitte korrektes Datum eingeben.'; + // todo this.scrollUp(identifier); + } + } + } else { + // todo this.scrollUp(identifier); + } + } + +} diff --git a/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.html b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.html new file mode 100644 index 0000000..7d496db --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.html @@ -0,0 +1,43 @@ +
+

Termin-Kalender

+
+
+ + +
+
+ +
+

{{ viewDate | calendarDate:(view + 'ViewTitle'):'de' }}

+
+
+ ← Vorheriger Monat +
+
+ Dieser Monat +
+
+ Nächster Monat → +
+
+
+
+ + +
+
diff --git a/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.scss b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.ts b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.ts new file mode 100644 index 0000000..5439dd7 --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.ts @@ -0,0 +1,320 @@ +import {Component, EventEmitter, OnInit, Output, TemplateRef, ViewChild} from '@angular/core'; +import {CalendarEvent, CalendarEventAction, CalendarEventTimesChangedEvent, CalendarView} from 'angular-calendar'; +import {Subject} from 'rxjs'; +import {addHours, endOfDay, isSameDay, isSameMonth, startOfDay} from 'date-fns'; +import {ICustomer} from '../../../model/entities/customer'; +import {ICustomerMeeting} from '../../../model/entities/customer-meeting'; +import {NgbModal} from '@ng-bootstrap/ng-bootstrap'; +import {Utils} from '../../../utils/utils'; +import {IUser} from '../../../model/entities/user'; +import {AppService} from '../../../services/app.service'; +import {IInternalMeeting} from '../../../model/entities/internal-meeting'; + +const colors: any = { + colorCustomer: { + primary: '#ad2121', + secondary: '#FAE3E3' + }, + colorInternal: { + primary: '#1e90ff', + secondary: '#D1E8FF' + }, + colorOperators: { + primary: '#e3bc08', + secondary: '#FDF1BA' + }, + colorProduction: { + primary: '#13f347', + secondary: '#D1E8FF' + }, + colorService: { + primary: '#ac1eff', + secondary: '#FDF1BA' + } +}; + +@Component({ + selector: 'app-meeting-calendar', + templateUrl: './meeting-calendar.component.html', + styleUrls: ['./meeting-calendar.component.scss'] +}) + +export class MeetingCalendarComponent implements OnInit { + + + constructor(private appService: AppService, private modal: NgbModal) { } + + static MEETING_TYPE_CUSTOMER = 'customer_meeting'; + static MEETING_TYPE_INTERNAL = 'internal_meeting'; + + @Output() editCustomerMeeting: EventEmitter = new EventEmitter(); + @Output() editInternalMeeting: EventEmitter = new EventEmitter(); + + @ViewChild('modalContent', { static: true }) modalContent: TemplateRef; + + public locale = 'de'; + public weekStartsOn = 1; + public weekendDays: number[] = [6, 0]; + + public view: CalendarView = CalendarView.Month; + public CalendarView = CalendarView; + public viewDate: Date = new Date(); + private modalData: { + action: string; + event: CalendarEvent; + }; + private actions: CalendarEventAction[]; + public refresh: Subject = new Subject(); + public events: CalendarEvent[]; + public activeDayIsOpen: boolean; + private customerMeetings: ICustomerMeeting[]; + private internalMeetings: IInternalMeeting[]; + private customerMeetingsById: {}; + private internalMeetingsById: {}; + private customersById: {}; + public users: IUser[]; + public usersById: {}; + public selectableUsers: IUser[]; + public selectedUserIndex: number; + + ngOnInit() { + this.customerMeetings = []; + this.customerMeetingsById = {}; + this.internalMeetings = []; + this.internalMeetingsById = {}; + this.customersById = {}; + this.activeDayIsOpen = false; + this.actions = [ + { + label: '', + a11yLabel: 'Edit', + onClick: ({ event }: { event: CalendarEvent }): void => { + // this.handleEvent('Edited', event); + // this.rowClicked(event); + } + } + ]; + this.events = []; + this.users = this.appService.getConfig().users; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.selectableUsers = []; + } + + /** + * Sets data + */ + public setData( + customersById: {}, + customerMeetings: ICustomerMeeting[], + internalMeetings: IInternalMeeting[], + ) { + this.customersById = customersById; + this.users = this.appService.getConfig().users; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.activeDayIsOpen = false; + this.customerMeetings = customerMeetings; + this.customerMeetingsById = Utils.getSortedObjFromArray(this.customerMeetings, 'id'); + this.internalMeetings = internalMeetings; + this.internalMeetingsById = Utils.getSortedObjFromArray(this.internalMeetings, 'id'); + this.selectableUsers = []; + this.users.forEach(item => { + if (item.active === true) { + this.selectableUsers.push(item); + } + }); + for (let k = 0; k < this.selectableUsers.length; k++) { + if (this.selectableUsers[k].id === this.appService.getAppUser().id) { + this.selectedUserIndex = k + 1; + break; + } + } + this.generateEntries(); + } + + /** + * Generates entries for AG grid + */ + private generateEntries() { + this.events = []; + this.closeOpenMonthViewDay(); + const filterUser: IUser = null !== this.selectedUserIndex ? this.selectableUsers[this.selectedUserIndex - 1] : null; + this.customerMeetings.forEach(item => { + if (null !== filterUser) { + if (filterUser.id !== item.owner_user_id) { + let isParticipant = false; + item.v_participants.forEach(item1 => { + if (filterUser.id === item1.participant_user_id) { + isParticipant = true; + } + }); + if (!isParticipant) { + // Don't show this meeting, since it does not involve filtered user + return; + } + } + } + const customer: ICustomer = this.customersById[item.customer_id]; + const user: IUser = this.appService.getConfig().vc_user_by_id[item.owner_user_id]; + const title: string = Utils.getDateTimeToDisplay(item.start_date, true, true) + ' bis ' + + Utils.getDateTimeToDisplay(item.end_date, true, true) + ' - ' + + user.firstname + ' ' + user.lastname + ': ' + + customer.name + ' [' + item.title + ']'; + this.events.push( + { + id: MeetingCalendarComponent.MEETING_TYPE_CUSTOMER + ':' + item.id, + start: addHours(Utils.getParsedDate(item.start_date), 1), + end: addHours(Utils.getParsedDate(item.end_date), 1), + title, + color: colors.colorCustomer, + actions: this.actions, + allDay: false, + resizable: { + beforeStart: true, + afterEnd: true + }, + draggable: false + } + ); + }); + + this.internalMeetings.forEach(item => { + const user: IUser = this.appService.getConfig().vc_user_by_id[item.owner_user_id]; + const title: string = Utils.getDateTimeToDisplay(item.start_date, true, true) + ' bis ' + + Utils.getDateTimeToDisplay(item.end_date, true, true) + ' - ' + + user.firstname + ' ' + user.lastname + ': ' + 'PLP intern [' + item.title + ']'; + if (null !== filterUser) { + if (filterUser.id !== item.owner_user_id) { + let isParticipant = false; + item.v_participants.forEach(item1 => { + if (filterUser.id === item1.participant_user_id) { + isParticipant = true; + } + }); + if (!isParticipant) { + // Don't show this meeting, since it does not involve filtered user + return; + } + } + } + + this.events.push( + { + id: MeetingCalendarComponent.MEETING_TYPE_INTERNAL + ':' + item.id, + start: addHours(Utils.getParsedDate(item.start_date), 1), + end: addHours(Utils.getParsedDate(item.end_date), 1), + title, + color: colors.colorInternal, + actions: this.actions, + allDay: false, + resizable: { + beforeStart: true, + afterEnd: true + }, + draggable: false + } + ); + }); + this.refresh.next(); + } + + /** + * Day is clicked + */ + public dayClicked({ date, events }: { date: Date; events: CalendarEvent[] }): void { + if (isSameMonth(date, this.viewDate)) { + if ( + (isSameDay(this.viewDate, date) && this.activeDayIsOpen === true) || + events.length === 0 + ) { + this.activeDayIsOpen = false; + } else { + this.activeDayIsOpen = true; + } + this.viewDate = date; + } + } + + /** + * Times changed event + */ + eventTimesChanged({ + event, + newStart, + newEnd + }: CalendarEventTimesChangedEvent): void { + this.events = this.events.map(iEvent => { + if (iEvent === event) { + return { + ...event, + start: newStart, + end: newEnd + }; + } + return iEvent; + }); + this.handleEvent('Dropped or resized', event); + } + + /** + * Handles event + */ + public handleEvent(action: string, event: CalendarEvent): void { + this.modalData = { event, action }; + // this.modal.open(this.modalContent, { size: 'lg' }); + + const idComponents: string[] = (event.id).toString().split(':'); + switch (idComponents[0]) { + case MeetingCalendarComponent.MEETING_TYPE_CUSTOMER: + this.editCustomerMeeting.emit(this.customerMeetingsById[idComponents[1]] as ICustomerMeeting); + break; + case MeetingCalendarComponent.MEETING_TYPE_INTERNAL: + this.editInternalMeeting.emit(this.internalMeetingsById[idComponents[1]] as IInternalMeeting); + break; + } + } + + /** + * Add event + */ + public addEvent(): void { + this.events = [ + ...this.events, + { + title: 'New event', + start: startOfDay(new Date()), + end: endOfDay(new Date()), + color: colors.red, + draggable: true, + resizable: { + beforeStart: true, + afterEnd: true + } + } + ]; + } + + /** + * Delete event + */ + public deleteEvent(eventToDelete: CalendarEvent) { + this.events = this.events.filter(event => event !== eventToDelete); + } + + /** + * Set view + */ + public setView(view: CalendarView) { + this.view = view; + } + + /** + * Close open month view + */ + public closeOpenMonthViewDay() { + this.activeDayIsOpen = false; + } + + public changeUserFilter(e: any) { + this.generateEntries(); + } +} diff --git a/plp-angular/src/app/views/start/meeting-list/meeting-list.component.html b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.html new file mode 100644 index 0000000..f3b61c6 --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.html @@ -0,0 +1,30 @@ +
+

Termin-Liste

+
+
+
+ + +
+
+
Aktuelle Ansicht exportieren
+
+
+
+ +
+ + +
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/start/meeting-list/meeting-list.component.scss b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.scss new file mode 100644 index 0000000..23ac560 --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.scss @@ -0,0 +1,18 @@ +.searchForm { + width: 100%; + .resetSearch { + right: 29px; + height: calc(100% - 3px); + } + .column { + position: relative; + } + .right { + padding: 0; + } + .button { + float: right; + margin: 0; + } +} + diff --git a/plp-angular/src/app/views/start/meeting-list/meeting-list.component.ts b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.ts new file mode 100644 index 0000000..4e2c78f --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.ts @@ -0,0 +1,199 @@ +import {Component, EventEmitter, OnDestroy, OnInit, Output} from '@angular/core'; +import {AgGridComponent} from '../../../components/ag-grid-component'; +import {ICustomer} from '../../../model/entities/customer'; +import {ICustomerMeeting} from '../../../model/entities/customer-meeting'; +import {IUser} from '../../../model/entities/user'; +import {IMeetingType} from '../../../model/entities/meeting-type'; +import {AppService} from '../../../services/app.service'; +import {IInternalMeeting} from '../../../model/entities/internal-meeting'; +import {MeetingService} from '../../../services/meeting.service'; +import {Utils} from '../../../utils/utils'; + +@Component({ + selector: 'app-meeting-list', + templateUrl: './meeting-list.component.html', + styleUrls: ['./meeting-list.component.scss'] +}) + +export class MeetingListComponent extends AgGridComponent implements OnInit, OnDestroy { + + @Output() editCustomerMeeting: EventEmitter = new EventEmitter(); + @Output() editInternalMeeting: EventEmitter = new EventEmitter(); + + private customerMeetings: ICustomerMeeting[]; + private internalMeetings: IInternalMeeting[]; + private customersById: {}; + private operatorsById: {}; + private productionsById: {}; + private servicesById: {}; + public participants: IUser[]; + + constructor(public appService: AppService, public meetingService: MeetingService) { + super(); + } + + ngOnInit() { + this.customersById = {}; + this.operatorsById = {}; + this.productionsById = {}; + this.servicesById = {}; + this.customerMeetings = []; + this.internalMeetings = []; + this.customersById = {}; + this.participants = []; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + + const that: MeetingListComponent = this; + this.columnDefs = [ + {headerName: 'Typ', field: 'itemType', cellRenderer: this.dotRenderer, width: 50}, + {headerName: 'Datum (Start)', field: 'dateStart', cellRenderer: this.dateTimeRenderer, comparator: this.dateComparator, that }, + {headerName: 'Datum (Ende)', field: 'dateEnd', cellRenderer: this.dateTimeRenderer, comparator: this.dateComparator, that }, + {headerName: 'Terminpartner (Firma)', field: 'objectName' }, + {headerName: 'PLP Verantwortlicher', field: 'owner' }, + {headerName: 'Ersteller', field: 'creator' }, + {headerName: 'Gesprächspartner', field: 'contactName' }, + {headerName: 'Titel', field: 'title' }, + {headerName: 'Termin-Art', field: 'type' }, + {headerName: 'Report vorhanden', field: 'reportExists' }, + {headerName: 'Optionstermin', field: 'is_option_meeting', cellRenderer: this.optionRenderer }, + {headerName: 'Adresse', field: 'address', cellRenderer: this.addressRenderer, autoHeight: true }, + {headerName: 'Teilnehmer', field: 'participants', cellRenderer: this.participantsRenderer, autoHeight: true }, + {headerName: 'Abteilung', field: 'department' }, + {headerName: 'E-Mail', field: 'email' }, + {headerName: 'Telefon', field: 'phone' }, + {headerName: 'Mobil', field: 'mobile' }, + ]; + } + + /** + * Sets data + */ + public setData( + customersById: {}, + customerMeetings: ICustomerMeeting[], + internalMeetings: IInternalMeeting[] + ): void { + this.customersById = customersById; + this.customerMeetings = customerMeetings; + this.internalMeetings = internalMeetings; + this.generateEntries(); + } + + /** + * Generates AG grid entries + */ + public generateEntries(): void { + this.rowData = []; + const items: {}[] = []; + let owner: IUser = null; + let meetingType: IMeetingType = null; + + this.customerMeetings.forEach(item => { + owner = this.appService.getConfig().vc_user_by_id[item.owner_user_id] as IUser; + meetingType = this.appService.getConfig().vc_meeting_types_by_id[item.meeting_type_id] as IMeetingType; + let customerContactName: string = null !== item.firstname ? item.firstname + ' ' : ''; + customerContactName += null !== item.lastname ? item.lastname : ''; + const customer: ICustomer = this.customersById[item.customer_id]; + const creator: IUser = this.appService.getConfig().vc_user_by_id[item.creation_user_id]; + + items.push({ + that: this, + itemType: 'customer', + objectId: customer.id, + id: item.id, + meeting: item, + title: item.title, + objectName: customer.name, + dateStart: item.start_date, + dateEnd: item.end_date, + type: meetingType.name, + typeType: meetingType.type, + reportExists: item.report !== null ? 'Ja' : 'Nein', + is_option_meeting: item.is_option_meeting, + street: item.street, + street_no: item.street_no, + zip: item.zip, + city: item.city, + owner: owner.firstname + ' ' + owner.lastname, + creator: creator.firstname + ' ' + creator.lastname, + contactName: customerContactName, + participants: item.v_participants, + department: item.department, + email: item.email, + phone: item.phone_no, + mobile: item.mobile_no, + }); + }); + this.internalMeetings.forEach(item => { + owner = this.appService.getConfig().vc_user_by_id[item.owner_user_id] as IUser; + const creator: IUser = this.appService.getConfig().vc_user_by_id[item.creation_user_id]; + items.push({ + that: this, + itemType: 'internal', + objectId: null, + id: item.id, + meeting: item, + title: item.title, + objectName: 'PLP Intern', + dateStart: item.start_date, + dateEnd: item.end_date, + type: 'Intern', + typeType: '', + reportExists: item.report !== null ? 'Ja' : 'Nein', + is_option_meeting: '-', + street: '', + street_no: '', + zip: '', + city: '', + owner: owner.firstname + ' ' + owner.lastname, + creator: creator.firstname + ' ' + creator.lastname, + contactName: null, + participants: item.v_participants, + department: null, + email: null, + phone: null, + mobile: null, + }); + }); + + this.rowData = items.sort((a: {} , b: {}) => this.dateComparator(a['dateStart'], b['dateStart'], false)); + } + + /** + * row is clicked + */ + public rowClicked(e: any): void { + switch (e.data.itemType) { + case 'customer': + this.editCustomerMeeting.emit(e.data.meeting); + break; + case 'internal': + this.editInternalMeeting.emit(e.data.meeting); + break; + } + } + + public exportFilteredMeetingList(e: any): void { + + const exportData: {}[] = []; + this.gridParamsApi.forEachNodeAfterFilter((rowNode, index) => { + const exportEntry: {} = rowNode.data; + delete exportEntry['that']; + delete exportEntry['participants']; + exportData.push(exportEntry); + }); + + const fileName: string = 'Termine_' + this.appService.getAppUser().firstname + '_' + this.appService.getAppUser().lastname + '_' + Utils.getCurrentDate(true); + this.meetingService.apiExportMeetingList(exportData, fileName); + } + + ngOnDestroy(): void { + + } + +} diff --git a/plp-angular/src/app/views/start/start.component.html b/plp-angular/src/app/views/start/start.component.html new file mode 100644 index 0000000..0323fa8 --- /dev/null +++ b/plp-angular/src/app/views/start/start.component.html @@ -0,0 +1,43 @@ +
+

Start

+
Internen Termin anlegen
+ + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + +
+
diff --git a/plp-angular/src/app/views/start/start.component.scss b/plp-angular/src/app/views/start/start.component.scss new file mode 100644 index 0000000..f95d326 --- /dev/null +++ b/plp-angular/src/app/views/start/start.component.scss @@ -0,0 +1,18 @@ +.content { + position: relative; +} + +#create-meeting-internal { + position: absolute; + right: 0; + top: 1rem; +} + +@media only screen and (max-width: 1004px) { + #create-meeting-internal { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/start/start.component.ts b/plp-angular/src/app/views/start/start.component.ts new file mode 100644 index 0000000..204ea27 --- /dev/null +++ b/plp-angular/src/app/views/start/start.component.ts @@ -0,0 +1,209 @@ +import {Component, ChangeDetectionStrategy, ViewChild, OnInit, OnDestroy, NgModule} from '@angular/core'; +import {Subscription} from 'rxjs'; +import {AppService} from '../../services/app.service'; +import {CustomerService} from '../../services/customer.service'; +import {ICustomer} from '../../model/entities/customer'; +import {ICustomerMeeting} from '../../model/entities/customer-meeting'; +import {MeetingCalendarComponent} from './meeting-calendar/meeting-calendar.component'; +import {TabsComponent} from '../../components/tabs/tabs.component'; +import {MeetingListComponent} from './meeting-list/meeting-list.component'; +import {MeetingService} from '../../services/meeting.service'; +import {IInternalMeeting} from '../../model/entities/internal-meeting'; +import {ModalComponent} from '../../components/modal/modal.component'; +import {CustomerMeetingDetailComponent} from '../customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component'; +import {Utils} from '../../utils/utils'; +import {CustomerMeetingEditComponent} from '../customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component'; +import {InternalMeetingEditComponent} from './internal-meeting-edit/internal-meeting-edit.component'; +import {Factory} from '../../factory/factory'; +import {InternalMeetingDetailComponent} from './internal-meeting-detail/internal-meeting-detail.component'; +import {IMeetingData} from '../../model/virtual/meeting-data'; +import {TabComponent} from '../../components/tab/tab.component'; + +@Component({ + selector: 'app-start', + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './start.component.html', + styleUrls: ['./start.component.scss'] +}) + +export class StartComponent implements OnInit, OnDestroy { + + @ViewChild('tabsStart', {static: true}) tabsStart: TabsComponent; + @ViewChild('meetingCalendar', {static: true}) meetingCalendar: MeetingCalendarComponent; + @ViewChild('meetingList', {static: true}) meetingList: MeetingListComponent; + @ViewChild('modalInternalMeetingEdit', {static: true}) modalInternalMeetingEdit: ModalComponent; + @ViewChild('modalInternalMeetingDetailStart', {static: true}) modalInternalMeetingDetailStart: ModalComponent; + @ViewChild('internalMeetingEdit', {static: true}) internalMeetingEdit: InternalMeetingEditComponent; + @ViewChild('internalMeetingDetailStart', {static: true}) internalMeetingDetailStart: InternalMeetingDetailComponent; + @ViewChild('modalCustomerMeetingDetailStart', {static: true}) modalCustomerMeetingDetailStart: ModalComponent; + @ViewChild('modalCustomerMeetingEditStart', {static: true}) modalCustomerMeetingEditStart: ModalComponent; + @ViewChild('customerMeetingDetailStart', {static: true}) customerMeetingDetailStart: CustomerMeetingDetailComponent; + @ViewChild('customerMeetingEditStart', {static: true}) customerMeetingEditStart: CustomerMeetingEditComponent; + + private customers: ICustomer[]; + private customersById: {}; + private operatorsById: {}; + private customersSub: Subscription; + private meetingData: IMeetingData; + private meetingsSub: Subscription; + private customerMeetings: ICustomerMeeting[]; + private internalMeetings: IInternalMeeting[]; + + constructor( + private appService: AppService, + private customerService: CustomerService, + private meetingService: MeetingService) { + + } + + ngOnInit() { + this.customers = null; + this.customersById = {}; + this.operatorsById = {}; + this.customerMeetings = null; + this.internalMeetings = null; + + this.customerService.apiGetCustomerData(); + this.meetingService.apiGetMeetingData(); + + this.customersSub = this.customerService.getCustomers$().subscribe( + data => { + this.customers = data; + this.customersById = Utils.getSortedObjFromArray(this.customers, 'id'); + this.setComponentData(); + } + ); + + this.meetingsSub = this.meetingService.getMeetingsData$().subscribe( + data => { + this.meetingData = data; + if (null !== data) { + this.customerMeetings = data.customerMeetings; + this.internalMeetings = data.internalMeetings; + } else { + this.customerMeetings = null; + this.internalMeetings = null; + } + this.setComponentData(); + } + ); + } + + /** + * Sets component data + */ + private setComponentData() { + if (null !== this.customers && + null !== this.customerMeetings && + null !== this.internalMeetings) { + this.meetingCalendar.setData( + this.customersById, + this.customerMeetings, + this.internalMeetings, + ); + this.meetingList.setData( + this.customersById, + this.customerMeetings, + this.internalMeetings, + ); + } + } + + public rowClickedCustomerMeeting(e: ICustomerMeeting): void { + this.modalCustomerMeetingDetailStart.openModal(); + this.customerMeetingDetailStart.setData(this.customersById[e.customer_id], e); + } + + public rowClickedInternalMeeting(e: IInternalMeeting): void { + this.modalInternalMeetingDetailStart.openModal(); + this.internalMeetingDetailStart.setData(e); + } + + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.meetingService.apiEditCustomerMeeting(customerMeeting).subscribe( + data => { + this.customerMeetingDetailStart.updateData(data.result_data as ICustomer); + }, + error => { + } + ); + } + + public editCustomerMeetingReportFunction(reportValues: any): void { + const meetingId: number = reportValues.id; + const report: string = reportValues.report; + this.meetingService.apiEditCustomerMeetingReport(meetingId, report).subscribe( + data => { + this.customerMeetingDetailStart.updateData(data.result_data as ICustomer); + }, + error => {} + ); + } + + public deleteCustomerMeetingFunction(customerMeetingId: number): void { + this.meetingService.apiDeleteCustomerMeeting(customerMeetingId).subscribe( + data => { + this.modalCustomerMeetingDetailStart.exitModal(); + }, + error => { + } + ); + } + + public editInternalMeetingFunction(internalMeeting: IInternalMeeting): void { + this.meetingService.apiEditInternalMeeting(internalMeeting).subscribe( + data => { + this.internalMeetingDetailStart.updateData(data.result_data as IInternalMeeting); + }, + error => { + } + ); + } + + public deleteInternalMeetingFunction(internalMeetingId: number): void { + this.meetingService.apiDeleteInternalMeeting(internalMeetingId).subscribe( + data => { + this.modalInternalMeetingDetailStart.closeModal(); + }, + error => { + } + ); + } + + public editInternalMeetingReportFunction(reportValues: any): void { + const meetingId: number = reportValues.id; + const report: string = reportValues.report; + this.meetingService.apiEditInternalMeetingReport(meetingId, report).subscribe( + data => { + this.internalMeetingDetailStart.setData(data.result_data as IInternalMeeting); + }, + error => {} + ); + } + + public openCreateMeeting(): void { + this.modalInternalMeetingEdit.openModal(); + this.internalMeetingEdit.setData(Factory.getEmptyInternalMeeting(), true); + } + + public createMeetingInternal(internalMeeting: IInternalMeeting): void { + this.meetingService.apiCreateInternalMeeting(internalMeeting).subscribe( + data => { + this.modalInternalMeetingEdit.closeModal(); + }, + error => {} + ); + } + + /** + * Destroy + */ + ngOnDestroy(): void { + if (this.customersSub !== null && this.customersSub !== undefined) { + this.customersSub.unsubscribe(); + } + if (this.meetingsSub !== null && this.meetingsSub !== undefined) { + this.meetingsSub.unsubscribe(); + } + } +} diff --git a/plp-angular/src/app/views/technique/technique.component.html b/plp-angular/src/app/views/technique/technique.component.html new file mode 100644 index 0000000..ccd6112 --- /dev/null +++ b/plp-angular/src/app/views/technique/technique.component.html @@ -0,0 +1 @@ +

technique works!

diff --git a/plp-angular/src/app/views/technique/technique.component.scss b/plp-angular/src/app/views/technique/technique.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/technique/technique.component.ts b/plp-angular/src/app/views/technique/technique.component.ts new file mode 100644 index 0000000..93abea7 --- /dev/null +++ b/plp-angular/src/app/views/technique/technique.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-technique', + templateUrl: './technique.component.html', + styleUrls: ['./technique.component.scss'] +}) + +export class TechniqueComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/plp-angular/src/assets/.gitkeep b/plp-angular/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/assets/apple-touch-icon.png b/plp-angular/src/assets/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2c08ebad2e1efd88a7ffeb7b0850ce933ae81e30 GIT binary patch literal 14674 zcmc(`WmH_vwl3U_I|=SI5Zv9}Ay{xi@TPGZcMlLCNYLQ!8X&kegb*Bp1&0uzfe_pS z+|GXYe)l=w*ykJP{<=NJ>RMfE&RNfVYSye(t5?NnYbxVnQD6Z809;iSg%^mj`OkrY zhWM5oN8>{jm{1jC4*&q0@XrARWaW?n0BG~}dPbf`8qdY7U7fisZCtIuT)xgwgfsvk zA?*vbv~~o0f~>$0dlyOiqt0G>kiCs0y`i86j|Nm8Y-g|H?+(`W*VME2ceEC@p_i5d zN%)E(3^;>5EkVA{PA(o|zLNC+uq%c*|5MFP5Bi6Qr=ujj?4JffMjF~6c~^HZNRUg2 z)0$U65F{+h#Vf=wAS%iM;^W~J;pP$H=H=()6%rHR5#!?n{qsYQXwBWmR_uj>(m&fm z{F0=%^Yny@adZ3l_;C5~bGf=hxOqiIMY(zSxcT@v5fYppelDJtzML)|4F9sA0QRtU zw}*P#ySjk>ShTcq_41UYM1qV6%-WX5%_PSh@i8v^tAln2y1AFsk(T0TDn++RTU)Z5umv2 z?QO(Fge^tER-$~IqF_rNP5}{78%|4pAs$XJ4_MGv2rM9A%Omm+TnK#yS8K079RAV& zEAVYxtr0fJB1|G(C&%FAoJyV}}2Auf2lP?iI!D#{D-iV6vF z@^SJ088iq8e_RE-+k1m;l-ymNLH`J5G5h~O-alaq{m(G}(nZkpH*xvUGBfZ zsMvcTBF^uhIYAff_RljXdjvMbSP`?d{xiN24p|~F)Bm&bKLG{{@C);Zh*)uohzeVB z3J3{n$~ufE)Xyx>2lNm@%2x3`oH(+e;2?1Z#?4uN(^l*4 zFvbGcYg?`G)mcDoCYs&2zzm|ar6>@bd5+wSC_ly({-^4{E)OnAOsx>gQe1GVL}Y}{ z21u&B5)PmB!&aeg-OLX`seEL6@JSR&k`R<}wB_H3w?0lV!gx_X2l7$@R)Q&1oG&A0 zo%vNF3}jUk?JA@gsVLBI!y;TL^zy}!)!wS1RgM}YQH9tRB*Jy4DOxWBxGZo>}%8F{GJFOhuTpf%p(AEu*(4eNkJk5DT)vpQ+k8I%z2p(;?Lgzkn3SfHvLPTz@@Hj&aaqU_(G!CtoqS>8=_ z9K)SdLjx9Nu=(B`6}(dJ4EI)T8MO;3lpMKT(~V{yAe{-9b?|<}8hb^BJC$V&yDQ2d zUTG2j8Z8vCi0rcj)QUI48ILHJ`_Xs_(`5@EPu>+3k>kw)cl zyp83?R>^!V0AH{SUK37}UAb3g zIV8rvFB z^2q0e)-HC%J1}g9oq=6lWXq*+ng;GtG^C5gmETt;Pm#X8FYg)1ukY?B`OK0t_5~nn-qP~%X!W|DbwNwpe&|6 zUvyOgeOyL;(Mx+eS}rIftz+MoE*;@0x6UE6%uq4OTVd#Y{r0ALr!ek=*D?~AIm)BJ zXAlqO)Np{af4apmt$QRZMO_W-Fj_iR1YMX76|_NyLeppbTJd`El4mA!MrHu7aN_+L za%L>9CMceZ2e(?^MabU!Z796OeZk4uW)~X#J(e{A-Qu*X?vj$smOEwZ2znu7fBqHy z+Hww|I}R3~J->j+m^XTGb7l;!QwU>+)H`3_4cdpc1WWVy$HLTQ9TG{~CMl9WkGIrL ziujT*T~QIOv7$_ockJQJDeqU^EvrRRE~-zOuacGQD08T8+J_1``6d41TfxXz39~soL$CA)I_UXH4|y+P4@CT_sd*(V7wB6aIcwWY~-7p zN14yC^}F7&Bbf%W9jpf%V*U)d4l1QNXyaBy_LS9(xlxB?1+L zllX)URO<65_M3l|0t|2RJmzrT(_FX9leX#%72^VWay#8vx4s1&-$yZRWbr(4xZB@Y zd?x@qWl+iW-bC)D)T;B^pc28Y%i$W7_RyFxt-!!LK))`~T`UGJHIpW6$GpvRly&%+ zNV(MMLU@>ZI4~qX7Ml*;gc^rRpV^g{6kjY5TsKj+GtQ(3*W+~->KrRP)Q}RDjk~C3 zT1ey?U>2o+j3Ox{Ed2CE@jA(McV2gY&112jnd}v^TK)9Jv!$)ji9R}N+d7A|y+LA0 zQ@+FZogGi}lA_1J;<2Iy$_%+=f}~Q%dB{PwoiLw+ESNd78dzwA%(+~GJAhgOZ~a&f zZ*@y~`L^5cyUizh9XXPG$zD(gH*7d!dlPxzpR$?H(Z7^B_^|bbfNYHJFwtC*)LYoK z=>99f>erS)YHqgkuPSa2KKsOZ>Yn!o$jv$jZPd3)?YlIL9WG22qTG+-!6ECS1B;!@ z1c^-CF=n^@VSFRL0!Z-0{B_hym}m(BrHs4!i_1Hmp%osS0?G#@=9$qGh-mr7ndz3? zbeurJvSU1&UGco5WGV&eyTvCdM{)7et-goCR2=?GPZG$DR)a+z-1PI|*NW=H!^m7`>Wl9)YU&TSU5hkN&C* zV{g6(+j)-Qi!|ngCsOIqt_lKijMc6+*P4Bdf-08Hs#F>AUnojZYSOr|3vo zEgtlF0m%*5oLG-b~*kLl(=Y{HG z@*@*j(5u-HGSe$s^?dSF-(xFU^*b^pc(glS^PXkkDzTc9w}O8h60OJ`j$tVgRU|2X zI$EVQ7KGGkuh}sTE65ht(C2pS*oJw_64gICAHsENp%~iJ-~PC-dw=p{(cnwyWhys| zTkZq<;@u0T0&27ObnEiSkDz1YDP-@%-zZ_{YAzd6sfndH?XaC9rw|om<@C(}S5+Qs zH{m2xq3`nHN4!F;A*U}q3tyHG+}3)fy|NoQdtg0@kj2m7oKB#T?sqifZ$h&smZ+I# z&pAF9Em1N7u@^X{;e}y$uyjti4>oAPZ9HkjvB;*P8b2I#If1Q9@TqrRh-4NC8>W3x< zTmUunQUQcx&N4C}w~&z+`*2XOl!^h>qC&}T3C6>p>`ARGwIF1Z*lkQGTh~mp)V^x$ z(3sR~Yo9*Ht+RSFGPU-gYGL55sX_YSG`S}2V3=jid#@5bj+Gzp z-Lu(Voe$pc4iZRW-D)`xjvu6zxI``bcMVmFYr04;wr0)+%M;hj~6W)_|%T2 zMJpPoJ0u*c2;xNJ!&Lq*e|*83)KQPz#^v}kSKn89yMN@deG_@f=OdEL)g!QY*_HpS z##>bOclOx9Nkv+Rs{&2yeA`v3a)xGkI)aa1XNEfZl()Ig(+Lye1@oTLUgeW3G*(49 zO(Jf7=mn|OWy#{4SPtGOl6wYZVl({gI>*_u0jeLC7D?OgTz?>;hSErC>774FoTdjk zN_;6|tQMXJRt{rsIp>8d(}r&hQm6Vgvj09#&7`6eyLNJfdbeX35MSw#Y32(_kH+7- zE!uKzQ*#`8pQftq=4zAMD}5?*IfnPg8Go2}-QU})%l&9nJRm6xEKr1PK6zH>V*6Oc z*w{Q9M?_ZC%4c%1pM+$Ndc$&NvSV&v%-M~nrVVvWAw=wmApSC(0Ky|HtzW|l$ zIAY^+A@gp)d4;8c{M&M;F(JwA`)bYmgD~PKo2FOG)3-f=&cq)RzdrqHOY8aOTu&<7 z)*304ReWkxK+;y?{+aC-3E$wYdM4>&TPfEO&Pl_Es1Rkbpe1(cpircNLC{<$&SX22 z{J~VrlZ&7L5w8vToz}$w=Q@+jBD1ZTqtXx4reAbd@Z$rI{e&eU!hCrE?t6>~tSgaU zJN!ybQxOm_1?qF1;M;0y3fp& z*GMAC`77o5Luo$BJlmno^G{o54`~hIt~H;gLQXICo57<4LNN$}?W%C5+@md2+0=Ao zhsw|(eta);q=bn-(?8no36nY;0@s_A&v`Us{Hro=(+`f=g@bjDC2qq5n^(uYH*wS? z$PGGtAE8%yvxG3ApW?*=)f#Q(9n*}wBH6YtL(3+H5?G;|8v&Pugt-}frD21guC$x< zjXXjVNQKK>&oK^8;Xm0V5^1)~;oCGhzLb|owSZ1&$F(QI2cI}4eprV2#OP1gveSs>$ zsJ;^AxOOF8-7v8W8+$=0OqRE}@N)^q+V@%OCb9w2oXUGGZTD|-?>~HE9JPKdOGvC; ze;bxPP}rsGE8sHg#r|79q6t4u6|hn|&FCQ4`VqD$6p)5LK{D+hE1lT;`R3>y$>1{* zK$eMuebH7c!HB;D?y@{>W3=Qu1M>cK&nR2i%qFWttPdS=o~Mf}@mV;#jQgv;ANjG= zo_a49Rx%)kRRK;0{Hb4KXM#jg=a%0XWEB{rTMS2WrzK+Db7BH135jdzDRN$6Pj(D0 z2PZwgobQ2F9=Uttr8^Hc0;cpnJ74fStsAH>;!aphnk^U(H5yan+>GW*jMMA+e%F}X zn%0qjT>B{^Aq|SD97c}pGU3`b$S1MsVlL3H+JHIudOA|%I71vGngVZEq;*~_ZaC4^ z`#K6NYSn3)NQBv77WjR&sOd>OHRcIiDk+4=XVYZp`|7<(7q}%hLGfed-Wq8h@Cl1M zQ7WQ2*u*U|W>d-_Fcix0YmOfVG9;RX5=}DsdA2a-+|%Di%>H=hdewOQ6_mlLZLcPB zw!l6DAZlo%)=~=iR9#*44rI|}4dtqBW}8mV_YT2%ad7V^Ob`QGygx-JHx7rNRdlqOoLB zGL+Pg7d_3l&9b`sZXh!IP4gm&N?9N656VX*7B&19){X}`a_kW4{$Nwu^Y(W&{g+l- zlV7GSdk@vzvYc1O@CHpNPFlzigsxyvVMq%Kom3uiX;@L_bor&t{@in_g&Bv4pF4`c zEJQ1O0lvqqk<^v2W3ac8_03#=bUWkOo3-hAGzcly9)?Ku@%aamB<|fB0koiKqJ{yI z>FCM5_VBffcu&jQ@QErWv8rU1x1%KN+j{u@rx)f`6fr&+)X|~K&NiMg-Vch<=31yH ztBu>sbU?$$s1S*udFM*QHi;#`cPGWBYUYtp$A0ak+d75%K%S79+bZCyJ@f2Ic3oBZ ze1MAY7JXB}E%m#tNmMr^8wprOrF4eWeV|Um?@SoJlxuu1fS%3ZH7Ry(h-0vxV>)`S7nnlw>s z&+sY^Df`0q8NvC?F8YLlJeRw;c333KC2}Ss%KK;#bdFtnGD^yvduS2XBAUnC`cN#S zm!<**w(b?CRTdTF+=}!`;9idP<)o40gUby-z%TPMVB@)oC@~?m*2ye}o5kGHgyY7m zNtA6xr0M+|O!t<1zw#)F_w&~r@Typ4!{R`nV5JN!Fw_9=l$!M6teu-FysEhA*ytIszulLfX;C>5e z?l(P|>~x?jxN6wR`v5au2Z6;OZD=Ij%zQF!7r&O(pcFcP5Z<=lP8~ny0fpip)uVL` za!s-LQb==@5F9{5KT6o8x;}Te9DI7Cr@7yNp0&qRT~&blmYSXqBRP7cxNJ-F+S9+_ z6gB1AgZVPVM$C`{4U$n!@oK5JlR{W-ks$HXYFEI;1%JDI5*br$qR0Ur{Hxt9wYoQT zm;jK#jU_lAh?J!^$3O~JQ($d}9SAR^0Bci~hfZ+aByboAZmY4dLR4!%-OhXlXmmgG zHGRmcvhs{UgWT1&*bJG`;ZL|kEa^t*q25f0;U`i2o=6>^Vd4|LL1~6pu40latFd>& zQX6l!8F6rg+>w)C$Pg;p`8}EV$zF~%wZ|%$xlUe8bvn`erL zla{yx<;#qA?(F4HY*|&$mdi^jPpp)ZI%}w4l|w zemo}dN+Cs{`h!ampO!ZaWG)ywXyD|$<#g8#<mUwPH;INhR2iyEpV1t-`pi&gGa zh)<*ZNgSFfc9}&L@z#7zuZM}l12aCRIhPn6BJ5OIoNPln zo|6J{YI&wY7pm1VbXrNdi-(6kFT7iC{3U@yCaE8~PNmqmM8& zbV#p0@sG#0(jLxXAr?ThQKUD(fSo!gO>iWSB5f?35oyZJn4N>=P+lJJBYv8{CmJ}^ z=6Am_zvt7Ke6_2W?u3iD3#7o*QwL@o9%5_b?UeKnJv!>+7Bwa@d-Ll3p7v*R8y~z#|OZKI0H~qD3vTuIZJ2uGF)9TjcUYESVW65GOe8_rVBlxEj*A#8`znq0FBnlqPS8f z^FZH}w6H9m2Ip@NB1*U`!nK?PXQMlQYZ^Rvl4P0*@d9_YvGB z1@(?Og)N5T0JgCh4yiJ-Xl>W_iHpCc>?vkgIH=)zMKndEvn}70+c5`F?XKMED3Vkr z%+O3I`6}*Gn10MYB{kI=v!cEmP z0bl0b{Qza-K02jZr^9;GD!HvhZ_$}rln+O=A=P#UDHwAG@t)3!GhNkpb)$_MgE6RgD_TPzBDhcfPW7Rxt;|$<3h>nrk;c5+B3eg9s>I z?XxFxkuO2cO7PtR183xC-6(hc?E5<&)hdJ-kyZ$z`^ubgc>uwYl!Kr+mzd4CE)y)S z(G(_KTN_RcK~wgwD8X{nV@Fei%LdJU^dbzuW@3N_P`Uh7l3NK;KzO*`CM9_z6kCQhfD+u`(?^<&c`J&lZL!d_@aJbWiR zuo2lV?6+1g{XXrn4O{#g%kJo-`ADk}vOvO@kYSs6_rA|E?DDnwcIYkVk*Jjs1A5}G z3aj<@K<-zBcgD)#mM;K}-yfGrd<#6cILuy01hB`J$|N7ik@vZ^pne~+Cqc8jO~V_x zgW;x#;&0DX@+`=Ip>{{MiaHH-^p;5>gr)GVH{$L#{bCe^Vv6Zs<31wpIwV9ot*qts z38}xrZ4w@E!;))}mLhx}yb?T{5_3b8a=ui>Uo-)^xzwq#wT9TE*T>hp1pp>%noJjF zoHOK|C<0zZrTt0o>8j8mFC+auN{9K^ykR-cyXzjm+(ytLaZATGzP|fll9;C{Op9el zgL^Y8d@_{p=4yEvsrJUi#8Cx|uQas%152u4idym7zOjJB8!ce4^L2YomdDRvdQ@@P3ZWtUX9#nQX7@H zT_iOiOF07#@uZ4#zYu*fX6)6fKsG4Abbf>56h78RjC>yrF^}|m*@L$5+EP2{Mag>u z0=bMLrUqPKcWQNoxA=$Tj5jS?z~kpXi>u083VRa|YvuUGI+}rMev>;g@G5GgEStrI zUaaI%gY$~@9ZyYospNT(W&hVa?ewfp|NAc&fO5Tbw6b6Vphb2EvjIwTms?AfRzoAq zxIKKQwSn-+rv;sc^ITO3DJQ50?)_kF$vv{1$J@@_g87Mvr)7oR7H{xKP3Ed$FTe^c zgKx}q`W|V_C-nq=-krwFax>gwAo89(hY=>1{bM?+?o($wa+`G}F`a{30GwhIZ!%t! zC~dL}9p(GsRx`&FnYj3-yUo6}DmLK>t59Cg%%EdCiKtbATO!FsDemRDE~GY63)hiy z9%otC>yb%(>d6;%Unnk%-m0?20w(YPhlBBIJ=n7vp0ha=Ho5Ulk&S1r*m`*cHC@{; zoYkG9Oq~S)*FaQgeP7~BY4od4VcPLa3U{@TZCz!8Pb(9}9>0b!cY@*oQ>Wfl++|w& zb1_0v?fB+_0c{&{`9IKI@_KbKeqWt@W(=HsS*`~A8Xs?IGzMjn4o=^=C_3o{vn877 z?7W$Gk-!983benf1^_fzTMOg9d93Jl+?C*Id45YiuVJNGWum?;(QD;O6ariu{Q6uP zr>rJ_x=*q}u#H(i-Cta{+}7GYC*>m4m;OZM`gyVEpti}ag~$7WZaj;xzEdoSKpx=3+?sP7)0}9r^YwCy&y!Dr-@Oo? zN%A|xzoHUDPJfgcvoDjEd`SVNmJ5^ZG9Q^&^J&8(9n!pDBA|Z$T@EJph-@wvV9F|T zz!JlJUQJ)i*)IzY?-`cj3LK)=UiazP78vadIjib>3Ws3PLn(%37p*NsJx}0m^Q#WSA}~pg__W znqFc(_vSJF4YiH>sNHF~miw9l;L3FZfH%>LwCp{Ldh{b$dw@B|5OZdwAcZdUt9 zvzGG;dJkV7L4!=k-3Q$2^9q0zbe-0+LF4WsI87O?BZ9L57k0)*ZDpdK@u#5+m=&u+ z!$4CuNBcJb&Bq_U7Gk$S=RbK_ld@w;R6^3V$bGQQ(d|F|CV}Tl&%?kdzvd(W8s4Lp zOfq0gAbR}iTuUq8qINXr~r8)NX{doVT_6+p>78NEq`b)EgRgs@| z0COzP=k59=_62NyEZauMAEi&vH?L`~Z&6X~#B5Ctkuy}hC?Np~@h=+OS}GD2jJRlh zUQV8eMfu;=S{R2jONLUiN00-TOJ5SryiW8C$HSPIH zG-l}|-DCphh6PeMMD?!-y;IP|!kDsw8=Jc)8VHJrhj{U~>#(j#*`d4H7rh+h3}r~H zR*zDWv<0S~qF;+4)qMfxV0`})CnUSkO^K0*(v{R+)-B)%$2@@^s-I4k0fTDE{oqgD z(Bo4ZC54s=_DKpM=LGAVY;d?i2|hfv60+VBWdE`e-?fAC)M)#0H%94goV*ql&J>7> zOK=od0&73CM(#-$uLMPjy=~THl25%;!n!#pN}T{dtdRQY6tU;V6tQS?Zw~;dK{I*- z;#fZ~b${wikyC1W7R)Xble~5c!0YYxxnlv&Qzr1o2k4zI zDJarY(O*kG@3xg8&^zR(EC_re;Xs3Fcsk;qpuHJE3#vh`wEI zzl4)3@lp!F#ud$KaMQzrAI%(pA7p+Xh_=#K&rkgnnsTy!|J2ikq>Cop6}TN)9UV*c zfi+ep@*RUl|Dt?A7EB9D@JToms7)dpk3Wz`Vk{8Ff~!NxLJaV_1(O(JJ^8azU`QpW zEp>t#xah?`tjUr*&V<_OLkN>mf=q3ZQnCB2CH1sX?Z_r*>gmxu(~vj8t#(|T*+?Im zUl8S^7#;G+hhCUi^M`(3=v~19O7ez<%+JaTXWj`VXT8SM;*{EjSekOy)DXfTL%*87 zEe8Hi!-QHUk+_`354HJvS}-TkrEOvalV&+ z9N5rFv-mNGxq@QzS)SX8oV5`*-4|Z`qp*B`9R2Rxc&~fGX6_7RyrlDmL;|Nyv&AZp%?cZU{|~)ZNBUf;+Mt&KiIV(ysmB!f)G9_>PwP zYe%o?XflPoY4m3P9)K{2W^Qo{YVkv@_LZ=|JXp(K^8jfAK z%vG;%cPll5B<}~E=N(H?q>Sr?T%;k3T#2vlWt=JwwmfgNjk zY%NBx^GSY@3Fg#L{h^mt$q{Wx6+ZVoy;!vba9_>9@x}c;TPdl7v?onO6YU+GBOA`s ztSu$_O`J-vvwKQ}Jh@{_C@X)lT{X$Jd~5&ja9(1Q<`Rk6tV;DZ5U~ zFT|U5(xXAsJil9lOc);C0&}=eo#NOcg>daY^lvg>-;`rz;vR_lhuYKp>W@omtmb;2 zwLrSBfp0~e=iP{f&$>8+p(FcK{R8^hoIK`&UBc;!NIA)fDK!Me1?QMeml7OGuD#XU zdL*Q7gZbdevsI`#&yadHLrB2+b6X{Rch!oHETW~GtgqAxAY6Wf;~QcpAPr4FcmF0( zuxHgQf;G)f#UBv*cz1Bn;HHiYRVTxs)#zua!2hT{BA+9w=lfGKRNZEBhk5xKsz(q; z_+V<>pv8XUQ$Q?|{2`A>{JDHrVx`Pe=>gqhYhYFM8}!ZCr#yuCWo)aLO8h)zGrLC$ zh3lDp;;$yDeTeilMfgZT%jv>1%$#jjvZbE+YjcvR;WGLs*_2uE zl3GnWz8Joa(*4D@0(Q8Dg+3iYg(;KCVAa>R(TaWGsSlz9`mb;#q0z-dg({9YeEA?7 zd}m!`eeto8^5&rE-y%lG+V6lB1t>( z56EpYW`2jvCRR86`~0T25F@NlSTT>R20?sRNOV-Qdwh3jR2L6Elye^N$>?q?Q$#FR~~xWC5x;+%8E zQ-Fpjwyr5Ly!~K|IbUA{$)$j*>+8aB%+hhhDw0V_R$Ivu4sx5(E{4%JdL;TK1-Xkb z4-vVm4-Ht+d2V=N7sXF_)0`UPPg8hQhAgxs1j_p4e|tI5uT+t9u#D-Kuh@4k&q_Q7 zC&68LvRh_;Vxl!udYIYEQBld1pxF(tYk+ovhUG>3MQ%qD5je(Q_U4%{Gx~B8KG0lruNo!JkxKxskCnudEfZb$F{O(S)U1Eu8Ec zY4SYcx24c-AZPw6zr>HfO_54MSP#UqLAnK%gHp;)yP@7GiqDUIy%ZDMdo9U+pS0s? zg1!~m9Va($gmd7;{!T7%t6wZ)zV`N*(b#)r(B3+E5UV^h;t~3>^&B-0 zoq)qkjo_zn*)hzVI5QR8a~1v9e7_e?IjH^pzyBzgp8JqB)%+};iRh&aq4K%v>jS}K zkw+Gyha#oipKFr^J!WEnwF1+ceDa2kf$1ps&-!D?x8_Km7Zxo1pTeo?WyhYekau{; zgqu^m=1n?y-M>94Z)wUd8k${)3cbX&b2T=#N$v;XiJpBCde_hYXkXGNLqD%qD6TTp z-u{6OW%aB$>1clE16_*f7TV@v;=5#JSw>{!0(LTufB}P~&gfp`C)Hzkvc8*0jkeX?7UXlE% zats0fyZk50I#XUsneQ>#Xl%xvP^O}=azg0eI+0?M_N0EKo#NW$l`wgu`trT_pv+IO z;bL}{y;`rV#-6^{)J*b+!aaXqhvzjLA4^=l<3HVH*$UpRfOrh?BSRts^>YlGSz1Dw z29@aQQ!xULuSvH~pS`(CtGPQS$KEcT;r&JE8ti0OMKgk%$6&knE0dgZq#zFsXCo?k zBQGQw^_FN@+l{QpyHw_v$X%-Va)pST$rGQXCf&0HqNEzPHLJryFI66`g!4!5w`1ge z-~(x+1m&K^C?APBb!~N~TEgq4F^h7z7Oa79 z+?S##0Yy+~*abYS?lrar`FF>{tZuJj-&q`3V&k2%O&fKZCoc}i&*1v?e%>x)LJ~2~ z++BQU>;Bn~^#y@)UV7g>@yzzecEVZNj{Tn{FsbKB7~~wp_#%Ar{IQ@}I+dKxQO_<3otUDH`=Cn&?e=nEta?aAs`nXZqXCvqyZhUK(si)O@)=yB<{) LH5KaQEW-Z}y|4tr literal 0 HcmV?d00001 diff --git a/plp-angular/src/assets/elements/close-x.svg b/plp-angular/src/assets/elements/close-x.svg new file mode 100644 index 0000000..e517eb6 --- /dev/null +++ b/plp-angular/src/assets/elements/close-x.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/plp-angular/src/assets/elements/select-arrow.svg b/plp-angular/src/assets/elements/select-arrow.svg new file mode 100644 index 0000000..6b82fba --- /dev/null +++ b/plp-angular/src/assets/elements/select-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plp-angular/src/assets/elements/spinner.gif b/plp-angular/src/assets/elements/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..48fbe00f8fbee14af31eb394071efeca1ce240dd GIT binary patch literal 129285 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

c<<2h~np_`jL0-nLGRwl42*Ji9nFi0=MQoua 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

ZE*f`rdK>l@kK%CCQ5U?)qheCf4IoMwK)!SV9ns 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 literal 0 HcmV?d00001 diff --git a/plp-angular/src/assets/favicon-small.png b/plp-angular/src/assets/favicon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..88bce976f969e721781bb7cf5680976619045003 GIT binary patch literal 3704 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 CwcY{% literal 0 HcmV?d00001 diff --git a/plp-angular/src/assets/favicon.png b/plp-angular/src/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..fb87db89e3f5094030374219983ea7d7a5256af4 GIT binary patch literal 8503 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 F{{rQ4yh;E7 literal 0 HcmV?d00001 diff --git a/plp-angular/src/assets/mstile-144x144.png b/plp-angular/src/assets/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..78efaa54c6eba63c1938e0a4bd7229445fadbd0a GIT binary patch literal 12254 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 Gq5lV>JQfiE literal 0 HcmV?d00001 diff --git a/plp-angular/src/assets/wall.png b/plp-angular/src/assets/wall.png new file mode 100644 index 0000000000000000000000000000000000000000..cf6fcf6df18dddf7f18732927c7c101da74f311c GIT binary patch literal 8769 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 BgAxD$ literal 0 HcmV?d00001 diff --git a/plp-angular/src/environments/environment.beta.ts b/plp-angular/src/environments/environment.beta.ts new file mode 100644 index 0000000..70350d1 --- /dev/null +++ b/plp-angular/src/environments/environment.beta.ts @@ -0,0 +1,14 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: true, + + // URL of development API + apiUrl: 'https://beta-api.plp-tool.de/', + apiAssetPath: 'https://beta-api.plp-tool.de/assets/', + debugParam: '', + password: '' +}; diff --git a/plp-angular/src/environments/environment.gamma.ts b/plp-angular/src/environments/environment.gamma.ts new file mode 100644 index 0000000..fce253a --- /dev/null +++ b/plp-angular/src/environments/environment.gamma.ts @@ -0,0 +1,14 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: true, + + // URL of development API + apiUrl: 'https://api.plp-tool.de/', + apiAssetPath: 'https://api.plp-tool.de/assets/', + debugParam: '', + password: '' +}; diff --git a/plp-angular/src/environments/environment.prod.ts b/plp-angular/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/plp-angular/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/plp-angular/src/environments/environment.ts b/plp-angular/src/environments/environment.ts new file mode 100644 index 0000000..f721fae --- /dev/null +++ b/plp-angular/src/environments/environment.ts @@ -0,0 +1,33 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +//////////////////////////////////////////////////////////////////// +// LOCAL 4 Spawntree ;) +// php bin/console server:status +// php bin/console server:start *:8001 +// php bin/console server:stop *:8001 +// https://symfony.com/doc/current/setup/built_in_web_server.html +// +// ng serve --port 4300 +//////////////////////////////////////////////////////////////////// + +export const environment = { + production: false, + + // URL of development API + apiUrl: 'http://localhost:8001/', + apiAssetPath: 'http://localhost:8001/assets/', + debugParam: '?XDEBUG_SESSION_START=', + password: 'plpSpawnTr33!' +}; + + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/plp-angular/src/environments/path.ts b/plp-angular/src/environments/path.ts new file mode 100644 index 0000000..99d6323 --- /dev/null +++ b/plp-angular/src/environments/path.ts @@ -0,0 +1,11 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +import {environment} from './environment'; + +export const path = { + path_assets: environment.apiAssetPath, + // path_contact_info: environment.apiAssetPath + "contact-info/", +}; diff --git a/plp-angular/src/favicon.ico b/plp-angular/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d36ae57c8cc2189913c7151b0cf835a0c4bf9506 GIT binary patch literal 3128 zcmcIm2T)X36g?`@vBWiIj7Et%F`|;u*kiAe0YOBBMT`_1AP6o?b6EjJ5M0Ox5ZHw+ z?1G|VK|xWlBcLK;k1-}j6UB%nF|lAQFZb=2;*3sAMw$2jeEz%l+;i_e@BW=MZA3em z{)W@NFI_!fT+Psho`B}G-?6Q5nO@Ls{mSl!@b?Y!_C~qrEiM8iSOV9CKpP58(7ReW zF(O?Abm7nhLK_b4QfQ=aEfy6d!+lNSV5au%l@-ks;ki(VVCbXXLM*~hpL#pCJyS0l zq>o0z7wnr6Oe=>@4z;gkW-v6NJT?7FP#OP6UW9L0+F3QibqC3N0o=8HjKy8FNb~ww|v8X5kA#la3P)WoUHd(KpjzO44^p^N0k6rC$X%Abu< zjr@<>!^Ic?##-H~3rV!vGp9b~`U9d1hJgYt2MHik+A_sXr(QVLkO<}Eiz}M3baxMm zn>6`?a@2DY12vTRWJkZi*Gh5H4#P@v37=MI!mv`8dVEu1)gf5theOUdJ{<>~vBeiT z(L5=Q3>khsQpI7sDUncEviMJ!HWHbEofH;K?NTJvpL~nwpvA?<9RCU{@We)+m+%Wc zu{x?-&oh-X^TJm}_sjRf(HWdlsUx=eLm$igMX}UAebinT{GQi}!mpoH-?qo9`{!-Stn#!^&I!_Yk&xj`-G&~&x>p{`&a>^8)E z>ztEio!2ckiIyfnB-N1DUmJu|b{M@&&%GWn$r|fYF)AEz#1RGw)S<}r#cns4U3$U| zuCm_cm8fY9F=%ft?Ftbs$_|qk@evXi_~-cJfD1aF`4!I@t}*<{aF_L~E(=pwRm=qG zma3N`Yb8`~!2a#EBd}#5md6cu$ct@v=VrpP-U_+7fG^GoIAPydRRMpeC$9#6XSl`i z$V7}PY$}4-Afv)k^?cH&*CPa8utNR<9CpG9I~32t_fs%%Z$96B%oLFy?fV*3(x&{6 z&4A?F$=u)}>s3)cW=A29^3b#x%ao#aBqkK3a)T!*|(fRxZ)NwE0G@Coa(f(WwH@MEWc!3s2Fs+g~ zNC|7n$uMTUDUMm7)ER62UTA~x*M*77ozbo8EO)PAn-^k-Cms!ezj7*n!lMf^&x(HFl zT+vd+Fb;K>nO&_Lc%WpyI%MpQB%U&Lxt3iYgV|X=Lad0mL1j*jI^riWt1s3w4pe=+@T5q z{^FLOR+Q?OSWMfTh})bhy%|-McG6X}T|)dPS{0{uJ#z_n`1^)sUUl}oHFnY2F`d~D zPhUOgf^7dr{K^>!NU;{|owNO)eU5uWusqfhPdSKr)ycAXB5jmtw>zqBaA+3R`qQZy z;=YSD-%Kr1+Et{X1oABHyiJIleeM6~t$QHw5AJDLZh) zvwl7Yabnx%@(Ely9hLT|a73;jirf*9?9~3|T>|k=b2{qSNS^Eui_z)iWsZM?DI>a2 zYc5WqIinN!*l&p-8R?0`m_A`eo2bKW(YCpY-u zGW+RqyYFgvfA2FIHR+-6m3Y4zzabDkkO*l&6?%XMBXzT3YriW(6DJ8&U%C@GVo?m3|3mgWE`xZLJE|bgw?gWk3^>u`f&VsLpiE4a@$W|Lelh*MX)Y z&Bh}$_@JYap6ieJ*d8h29ga9)>jJ34K=a{s?*H|@aS8J0W6x|*Uns6H{Rre;|2_x) E0q@}}SpWb4 literal 0 HcmV?d00001 diff --git a/plp-angular/src/index.html b/plp-angular/src/index.html new file mode 100644 index 0000000..9307dd1 --- /dev/null +++ b/plp-angular/src/index.html @@ -0,0 +1,19 @@ + + + + + PLP Verwaltungstool + + + + + + + + + + + + + + diff --git a/plp-angular/src/main.ts b/plp-angular/src/main.ts new file mode 100644 index 0000000..c7b673c --- /dev/null +++ b/plp-angular/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/plp-angular/src/polyfills.ts b/plp-angular/src/polyfills.ts new file mode 100644 index 0000000..aa665d6 --- /dev/null +++ b/plp-angular/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/plp-angular/src/scss/_reset.scss b/plp-angular/src/scss/_reset.scss new file mode 100644 index 0000000..c82caf8 --- /dev/null +++ b/plp-angular/src/scss/_reset.scss @@ -0,0 +1,367 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0-modified | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* make sure to set some focus styles for accessibility */ +:focus { + outline: 0; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +input[type=search]::-webkit-search-cancel-button, +input[type=search]::-webkit-search-decoration, +input[type=search]::-webkit-search-results-button, +input[type=search]::-webkit-search-results-decoration { + -webkit-appearance: none; + -moz-appearance: none; +} + +input[type=search] { + -webkit-appearance: none; + -moz-appearance: none; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +textarea { + overflow: auto; + vertical-align: top; + resize: vertical; +} + +/** + * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; + max-width: 100%; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. + * Known issue: no IE 6 support. + */ + +[hidden] { + display: none; +} + +/** + * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using + * `em` units. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-size: 100%; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/** + * Address `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/** + * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. + * 2. Improve image quality when scaled in IE 7. + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/** + * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. + */ + +figure { + margin: 0; +} + +/** + * Correct margin displayed oddly in IE 6/7. + */ + +form { + margin: 0; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct color not being inherited in IE 6/7/8/9. + * 2. Correct text not wrapping in Firefox 3. + * 3. Correct alignment displayed oddly in IE 6/7. + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/** + * 1. Correct font size not being inherited in all browsers. + * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, + * and Chrome. + * 3. Improve appearance and consistency in all browsers. + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/** + * Address Firefox 3+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + * 4. Remove inner spacing in IE 7 without affecting normal text inputs. + * Known issue: inner spacing remains in IE 6. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ + *overflow: visible; /* 4 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * 1. Address box sizing set to content-box in IE 8/9. + * 2. Remove excess padding in IE 8/9. + * 3. Remove excess padding in IE 7. + * Known issue: excess padding remains in IE 6. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 3+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * 1. Remove default vertical scrollbar in IE 6/7/8/9. + * 2. Improve readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +html, +button, +input, +select, +textarea { + color: #222; +} + + +::-moz-selection { + background: #b3d4fc; + text-shadow: none; +} + +::selection { + background: #b3d4fc; + text-shadow: none; +} + +img { + vertical-align: middle; +} + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +textarea { + resize: vertical; +} + +.chromeframe { + margin: 0.2em 0; + background: #ccc; + color: #000; + padding: 0.2em 0; +} + diff --git a/plp-angular/src/scss/_variables.scss b/plp-angular/src/scss/_variables.scss new file mode 100644 index 0000000..c7c51b0 --- /dev/null +++ b/plp-angular/src/scss/_variables.scss @@ -0,0 +1,20 @@ +/* Variables for plp project */ + +$color-default: rgba(51, 51, 51, 1); +$color-plp-primary: rgba(0, 122, 153, 1); +$color-plp-secondary: rgba(255, 252, 13, 1); +$color-plp-tertiary: rgba(197, 58, 122, 1); +$color-plp-tertiary-light: rgba(197, 58, 122, 0.6); +$color-plp-tertiary-light: rgba(197, 58, 122, 0.1); +$color-plp-grey: rgba(153, 153, 153, 1); +$color-plp-grey-light: rgba(200, 200, 200, 1); + +$color-white: rgba(255, 255, 255, 1); +$color-black: rgba(0, 0, 0, 1); +$color-red: rgba(251, 57, 62, 1); +$color-green: rgba(0, 153, 0, 1); +$color-blue: rgba(48, 155, 248, 1); + +$font-size-default: 14px; + +$line-height-default: 19px; \ No newline at end of file diff --git a/plp-angular/src/scss/components/_ag-grid.scss b/plp-angular/src/scss/components/_ag-grid.scss new file mode 100644 index 0000000..3706a10 --- /dev/null +++ b/plp-angular/src/scss/components/_ag-grid.scss @@ -0,0 +1,37 @@ +.content { + height: 100%; + position: relative; +} + +.ag-grid-box { + height: 500px; + min-height: auto; +} + +.inactive { + background: $color-plp-tertiary-light !important; + font-style: italic; + color: $color-plp-grey; +} + +.dot { + border-radius: 50%; + width: 10px; + height: 10px; + display: inline-block; + &--customer { + background: #ad2121; + } + &--operator { + background: #e3bc08; + } + &--internal { + background: #1e90ff; + } + &--production { + background: #13f347; + } + &--service { + background: #ac1eff; + } +} diff --git a/plp-angular/src/scss/components/_breadcrumb.scss b/plp-angular/src/scss/components/_breadcrumb.scss new file mode 100644 index 0000000..5aeb54b --- /dev/null +++ b/plp-angular/src/scss/components/_breadcrumb.scss @@ -0,0 +1,24 @@ +breadcrumb { + .container { + height: 2.5rem; + display: flex; + justify-content: center; + align-items: center; + background: $color-plp-tertiary; + color: $color-white; + } + ol { + li { + + } + } +} + +@media only screen and (max-width: 768px) { + breadcrumb { + .container { + padding-left: 2vw; + justify-content: left; + } + } +} diff --git a/plp-angular/src/scss/components/_calendar.scss b/plp-angular/src/scss/components/_calendar.scss new file mode 100644 index 0000000..a5c92c8 --- /dev/null +++ b/plp-angular/src/scss/components/_calendar.scss @@ -0,0 +1,87 @@ +#calendar, #c-list { + margin: 0 0 3rem 0; + h2 { + color: $color-plp-tertiary; + font-size: 1.5rem; + line-height: 1.75rem; + text-transform: uppercase; + } + .c-filter-box { + background: rgba(230, 230, 230, 1); + padding: 1.5rem 0 0 0; + margin: 0 0 2rem 0; + &--buttons { + display: flex; + justify-content: center; + padding: 0 0 2rem 0; + .button { + margin: 0 2rem; + width: 13rem; + text-align: center; + } + } + h3 { + text-align: center; + margin: 0 0 1rem 0; + } + } +} + +.calendar-legend { + display: block; + position: absolute; + right: 0; + top: 0; + li { + position: relative; + display: inline-block; + padding: 0 2rem; + &:last-child { + padding-right: 0; + } + &:after { + content: ""; + position: absolute; + left: 0; + top: calc(50% - 6px); + width: 10px; + height: 10px; + border-radius: 50%; + display: block; + } + &.legend-color--customer { + &:after { + background: #ad2121; + } + } + &.legend-color--operator { + &:after { + background: #e3bc08; + } + } + &.legend-color--internal { + &:after { + background: #1e90ff; + } + } + &.legend-color--production { + &:after { + background: #13f347; + } + } + &.legend-color--service { + &:after { + background: #ac1eff; + } + } + } +} + +.user-filter { + display: flex; + justify-content: flex-end; + padding: 0 0 2rem 0; + div { + width: 20rem; + } +} diff --git a/plp-angular/src/scss/components/_forms.scss b/plp-angular/src/scss/components/_forms.scss new file mode 100644 index 0000000..b139627 --- /dev/null +++ b/plp-angular/src/scss/components/_forms.scss @@ -0,0 +1,202 @@ +.form { + &--small { + width: 20vw; + .row { + display: block !important; + } + } + p.error { + display: block; + padding: 0.5rem 1rem; + margin: 0 0 0.5rem 0; + background: $color-plp-tertiary; + color: $color-white; + } + p.error-msg { + color: $color-plp-tertiary; + font-weight: bold; + margin: 0; + } + .row { + display: flex; + padding: 0 0 1rem 0; + &--last { + .column { + display: flex; + justify-content: flex-end; + } + .button { + margin-left: 1rem; + } + } + &--error { + padding: 0; + } + .error { + + } + } + .column { + flex: 1; + padding: 0 2rem 0 0; + &--checkbox { + overflow: hidden; + input { + float: left; + margin: 2px 10px 0 0; + } + label { + padding: 0 0 0 23px; + } + .checkbox-inner-column { + float: left; + width: 50%; + padding: 0 0 0.5rem 0; + &:nth-child(2n + 1) { + clear: both; + } + } + } + } + label, + p.label { + display: block; + padding: 0 0 0.5rem 0; + margin: 0; + &.error { + color: $color-plp-tertiary; + } + } + input, + textarea { + font-family: Helvetica, Arial, Verdana, sans-serif; + padding: 0.5rem; + display: block; + width: 100%; + background: $color-white; + border: 1px solid $color-plp-primary; + } + input { + &[type='checkbox'] { + width: auto; + } + &:disabled { + color: $color-plp-grey; + font-style: italic; + } + } + textarea { + height: 12.25rem; + } + select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0; + font-size: 1em; + width: 100%; + display: block; + border: 1px solid $color-plp-primary; + padding: calc(0.5rem - 2px) 0.5rem; + background: $color-white url("/assets/elements/select-arrow.svg") no-repeat calc(100% - 1rem) 50%/1rem auto; + &:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #000; + } + &::-ms-expand { + display:none; + } + &:disabled { + color: $color-plp-grey; + font-style: italic; + background: $color-white; + } + } + + input, + textarea, + select { + transition: 0.3s; + &.error { + border-color: $color-plp-tertiary; + background-color: $color-plp-tertiary-light; + } + } +} + +.button { + display: block; + padding: calc(0.5rem - 1px) 2rem; + background: $color-plp-tertiary; + color: $color-white; + border: none; + margin: 0 0 2rem 0; + cursor: pointer; + transition: 0.3s; + &:hover { + background-color: $color-plp-primary; + } + &[disabled] { + color: $color-plp-grey; + background: $color-plp-grey-light; + &:hover { + background-color: $color-plp-grey-light; + } + } + &--inline { + display: inline-block; + } +} + +.button-row { + position: relative; + .button-row--link { + cursor: pointer; + position: absolute; + left: 0; + top: 1rem; + color: $color-plp-tertiary; + text-decoration: underline; + &:hover { + color: $color-plp-primary; + } + } +} + +#forgot-pw { + cursor: pointer; +} + +@media only screen and (max-width: 1004px) { + .form { + &--small { + width: 60vw; + } + } +} + +@media only screen and (max-width: 768px) { + .form { + padding-bottom: 4rem; + &--small { + width: 80vw; + } + } +} + +@media only screen and (max-width: 400px) { + .form { + &--small { + .row { + padding: 0 0 1rem 0 !important; + } + } + .row { + display: block; + padding: 0; + } + .column { + padding: 0 0 1.5rem 0; + } + } +} diff --git a/plp-angular/src/scss/components/_message.scss b/plp-angular/src/scss/components/_message.scss new file mode 100644 index 0000000..50e2f1f --- /dev/null +++ b/plp-angular/src/scss/components/_message.scss @@ -0,0 +1,64 @@ +.message-modal { + position: fixed; + z-index: 9000; + left: 0; + top: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; + visibility: hidden; + opacity: 0; + transition: all 0.3s ease-in-out; + background: rgba(0, 0, 0, .7); + &.active { + visibility: visible; + opacity: 1; + } +} +.message { + position: fixed; + z-index: 9001; + left: 0; + top: 0; + right: 0; + width: 100%; + visibility: hidden; + opacity: 0; + padding: 30px; + text-align: center; + transition: all 0.3s ease-in-out; + &.active { + visibility: visible; + opacity: 1; + } + &.message--error { + background: $color-red; + } + &.message--success { + background: $color-green; + } + &.message--info { + background: $color-blue; + .button { + color: $color-blue; + } + } + p { + color: $color-white; + font-size: 1.5rem; + line-height: 2rem; + overflow: auto; + max-height: 400px; + } + .button { + margin: 0 auto; + background-color: $color-white; + border: 0.125rem solid $color-white; + color: $color-red; + &:hover { + background: $color-red; + color: $color-white; + } + } +} \ No newline at end of file diff --git a/plp-angular/src/scss/components/_modal.scss b/plp-angular/src/scss/components/_modal.scss new file mode 100644 index 0000000..066d59f --- /dev/null +++ b/plp-angular/src/scss/components/_modal.scss @@ -0,0 +1,93 @@ +body { + &.body--modal-open { + overflow: hidden; + } +} + +.modal { + opacity: 0; + visibility: hidden; + position: fixed; + z-index: 4999; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; + height: 100%; + background: rgba(0,0,0,.6); + transition: .3s; + &.modal-open { + visibility: visible; + opacity: 1; + } + &.overlay { + background: rgba(0,0,0,.8); + } +} +.modal-content { + position: fixed; + z-index: 5000; + left: 5vw; + right: 5vw; + bottom: -90vh; + background: $color-white; + border: 0.25rem solid $color-plp-tertiary; + border-bottom: none; + padding: 0.5rem; + height: 90vh; + transition: .6s; + &.modal-open { + bottom: 0; + } + &-inner { + overflow: auto; + height: 100%; + padding: 1rem; + } + &.overlay { + opacity: 0; + visibility: hidden; + border-bottom: 0.25rem solid $color-plp-primary; + border-color: $color-plp-primary; + left: 10vw; + right: 10vw; + top: 10vh; + bottom: 10vh; + height: 80vh; + &.modal-open { + visibility: visible; + opacity: 1; + } + } + .close { + cursor: pointer; + position: absolute; + right: 1.5rem; + top: 1.5rem; + display: block; + width: 27px; + height: 27px; + text-indent: -9999px; + font-size: 1px; + line-height: 1px; + background: transparent url("/assets/elements/close-x.svg") no-repeat left top; + background-size: 100% auto; + } +} + +@media only screen and (max-width: 1004px) { + .modal-content { + height: 96vh; + left: 2vw; + right: 2vw; + bottom: - 96vh; + &.overlay { + height: 96vh; + left: 2vw; + right: 2vw; + top: 2vh; + bottom: 2vh; + } + } +} diff --git a/plp-angular/src/scss/components/_navigation.scss b/plp-angular/src/scss/components/_navigation.scss new file mode 100644 index 0000000..7d391cf --- /dev/null +++ b/plp-angular/src/scss/components/_navigation.scss @@ -0,0 +1,17 @@ +#navigation { + li { + cursor: pointer; + margin: 0 0 0.5rem 0; + p { + + } + } +} +.home-btn { + cursor: pointer; + margin: 0 0 2rem 0; +} +#logout { + cursor: pointer; + margin: 2rem 0 0 0; +} diff --git a/plp-angular/src/scss/components/_search_bar.scss b/plp-angular/src/scss/components/_search_bar.scss new file mode 100644 index 0000000..02fc080 --- /dev/null +++ b/plp-angular/src/scss/components/_search_bar.scss @@ -0,0 +1,49 @@ +.searchForm { + position: relative; + display: inline-block; + margin: 0 0 2rem 0; + input { + font-family: Helvetica, Arial, Verdana, sans-serif; + padding: 0.5rem; + background: $color-white; + border: 1px solid $color-plp-primary; + } + .resetSearch { + position: absolute; + right: 1px; + top: 1px; + background: $color-white; + width: 36px; + height: calc(100% - 2px); + padding: 0; + border: none; + cursor: pointer; + text-indent: -9999px; + &::before, + &::after { + content: ""; + display: block; + position: absolute; + left: 50%; + top: calc(50% - 9px); + width: 2px; + height: 18px; + background: $color-plp-primary; + } + &::before { + transform: rotate(45deg); + } + &::after { + transform: rotate(-45deg); + } + } +} + +@media only screen and (max-width: 768px) { + .searchForm { + display: block; + input { + width: 100%; + } + } +} diff --git a/plp-angular/src/scss/components/_structure.scss b/plp-angular/src/scss/components/_structure.scss new file mode 100644 index 0000000..a311c9e --- /dev/null +++ b/plp-angular/src/scss/components/_structure.scss @@ -0,0 +1,245 @@ +#wrapper { + #header { + color: $color-plp-secondary; + height: 2.5rem; + font-size: 0.75rem; + letter-spacing: 0.1em; + .user { + position: absolute; + right: 2vw; + top: 0; + height: 2.5rem; + color: $color-white; + display: flex; + align-items: center; + } + } + #content { + display: flex; + align-items: stretch; + height: calc(100vh - 6.5rem); + margin: 2rem 0; + aside { + margin: 0 1vw 0 2vw; + width: 17vw; + background: $color-plp-primary; + color: $color-white; + overflow: auto; + padding: 1.5rem; + } + #main { + margin: 0 2vw 0 1vw; + border: 0.25vw solid $color-plp-primary; + width: 77vw; + padding: 1.5rem; + overflow: auto; + &.not-logged-in { + width: 97vw; + } + } + } +} + +body, table, td, th { + color: $color-default; +} + +a { + color: $color-plp-primary; + &:hover { + color: $color-plp-tertiary; + } +} + +h1 { + width: 50%; + padding: 1rem; + margin: 0 0 2rem 0; + background: $color-plp-primary; + color: $color-plp-secondary; + text-transform: uppercase; + font-size: 1.5rem; + line-height: 1.875rem; + font-weight: bold; +} + +h2 { + margin: 0 0 2rem 0; + color: $color-plp-tertiary; + text-transform: uppercase; + font-size: 2rem; + line-height: 2.5rem; + font-weight: bold; +} + +h3, h4, h5, h6 { + text-transform: uppercase; + font-weight: bold; + margin: 0 0 0.5rem 0; +} + +p { + margin: 0 0 2rem 0; +} + +input[type="text"], +input[type="password"], +input[type="number"], +input[type="search"], +textarea { + width: 30vw; +} + +.grid { + display: flex; + .grid-item { + flex: 1; + margin-right: 30px; + } +} + +.right { + float: right; +} + +dl { + overflow: hidden; + dt { + clear: both; + float: left; + width: 30%; + padding: 0.75rem 0; + border-top: 1px solid $color-plp-primary; + &:first-of-type { + border: none; + padding-top: 0; + } + } + dd { + float: right; + width: 70%; + padding: 0.75rem 0 0.75rem 2rem; + border-top: 1px solid $color-plp-primary; + &:first-of-type { + border: none; + padding-top: 0; + } + } +} +.comment { + border-top: 1px solid $color-plp-primary; + padding: 0.75rem 0; +} + +body { + &:after { + visibility: hidden; + opacity: 0; + content: ""; + position: fixed; + z-index: 9999; + left: 0; + top: 0; + right: 0; + bottom: 0; + width: 100vw; + height: 100vh; + transition: visibility 1s, opacity 1s, background-color 1s; + } +} +body.loading { + overflow: hidden; + &::after { + visibility: visible; + opacity: 1; + background: rgba(0,0,0,0.2) url("/assets/elements/spinner.gif") no-repeat 50% 50%/60px auto; + } +} + +@media only screen and (max-width: 1004px) { + #wrapper { + #content { + aside { + overflow: visible; + width: 5vw; + position: relative; + padding: 0; + &:before { + content: ""; + display: block; + position: absolute; + left: 0.1875rem; + top: 1.875rem; + right: 0.1875rem; + width: calc(100% - 0.375rem); + height: 0.1875rem; + background: #fff; + } + &:after { + content: ""; + display: block; + position: absolute; + left: 0.1875rem; + top: 1rem; + right: 0.1875rem; + width: calc(100% - 0.375rem); + height: 0.625rem; + border-top: 0.1875rem solid #fff; + border-bottom: 0.1875rem solid #fff; + } + .aside-inner { + z-index: 300; + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 0; + overflow: auto; + background: $color-plp-primary; + color: $color-white; + } + &:hover { + .aside-inner { + width: 50vw; + padding: 1.5rem; + } + } + } + #main { + width: 89vw; + } + } + } + h1 { + width: 100%; + } +} + +@media only screen and (max-width: 768px) { + .grid { + display: block; + .grid-item { + margin: 0 0 2rem 0; + } + } + .right { + float: none; + } +} + +@media only screen and (max-width: 400px) { + #wrapper { + #content { + aside { + &:hover { + .aside-inner { + width: 80vw; + } + } + } + } + } + h1 { + font-size: 1rem; + } +} diff --git a/plp-angular/src/scss/components/_tabs.scss b/plp-angular/src/scss/components/_tabs.scss new file mode 100644 index 0000000..f3c6bfc --- /dev/null +++ b/plp-angular/src/scss/components/_tabs.scss @@ -0,0 +1,73 @@ +.tabs { + display: block; + width: 100%; + box-sizing: border-box; + position: relative; +} +.tabs-nav { + padding-bottom: 30px; + padding-right: 40px; + display: flex; + position: relative; + width: 100%; + user-select: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + li { + font-size: 1rem; + text-align: center; + cursor: pointer; + //flex-grow: 1; + padding: 0.75rem 2rem; + &.disabled { + cursor: default; + opacity: 0.5; + } + &.active { + color: $color-plp-tertiary; + border-top: 1px solid $color-plp-tertiary; + border-bottom: 1px solid $color-plp-tertiary; + } + } +} +.tab-entries { + position: relative; + transition: all 0.3s ease-in-out; +} + +.tab-entry { + display: table !important; + width: 100%; + right: -9999px; + bottom: -9999px; + padding: 0 0 40px 0; + visibility: hidden; + opacity: 0; + background: transparent; + position: fixed; + &.active { + opacity: 1; + top: 0; + left: 0; + right: 0; + bottom: 0; + visibility: visible; + position: relative; + } +} + +@media only screen and (max-width: 768px) { + .tabs-nav { + display: block; + padding-right: 0; + li, + li.active { + border-bottom: 1px solid $color-plp-tertiary; + border-top: none; + &:first-child { + border-top: 1px solid $color-plp-tertiary; + } + } + } +} diff --git a/plp-angular/src/scss/styles.scss b/plp-angular/src/scss/styles.scss new file mode 100644 index 0000000..e3f4526 --- /dev/null +++ b/plp-angular/src/scss/styles.scss @@ -0,0 +1,111 @@ +@import "reset"; +@import "variables"; + +@import "components/structure"; +@import "components/ag-grid"; +@import "components/breadcrumb"; +@import "components/calendar"; +@import "components/forms"; +@import "components/message"; +@import "components/modal"; +@import "components/navigation"; +@import "components/search_bar"; +@import "components/tabs"; + +/* apply a natural box layout model to all elements, but allowing person to change */ +html {box-sizing:border-box;} +*, *:before, *:after {box-sizing:inherit;} + +/* Change font-size for mobile */ +html { + font-size: $font-size-default; +} +body, textarea { + font-size: $font-size-default; + line-height: $line-height-default; + color: $color-default; + font-family: Helvetica, Arial, Verdana, sans-serif; +} + +strong { + font-weight: bold; +} + +.pre-wrap { + white-space: pre-wrap; +} + +/* iOS Fix */ +div:hover, div:active, +span:hover, span:active { + -webkit-user-select: none; + -webkit-touch-callout: none; +} + +/* + 0.0625rem = 1px + 0.125rem = 2px + 0.25rem = 4px + 0.5rem = 8px + 0.625rem = 10px + 1rem = 16px + 1.25rem = 20px + 1.5rem = 24px + 1.75rem = 28px + 1.875rem = 30px + 2rem = 32px + 2.5rem = 40px + 3.125rem = 50px; + 4rem = 64px + 6.25rem = 100px + 12.5rem = 200px + 58rem = 928px + 62rem = 992px + 62.375rem = 998px + 62.75rem = 1004px +*/ + +.router-component {} + +/**************************/ + +.overview-box { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: flex-start; + padding: 0 14rem; + margin: 0 -1rem 3rem -1rem; + font-size: 0.75rem; + li { + width: 7rem; + height: 7rem; + /*width: 14rem; + height: 14rem;*/ + margin: 0 1rem 3rem 1rem; + background: transparent url('/assets/wall.png') no-repeat left top/100% auto; + position: relative; + cursor: pointer; + p { + position: absolute; + top: 7.5rem; + left: 0; + width: 100%; + text-align: center; + } + } +} + +@media only screen and (max-width: 1004px) { + .overview-box { + padding: 0 7rem; + li { + width: 3.5rem; + height: 3.5rem; + p { + top: 4rem; + overflow: hidden; + } + } + } +} diff --git a/plp-angular/src/test.ts b/plp-angular/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/plp-angular/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/plp-angular/tsconfig.app.json b/plp-angular/tsconfig.app.json new file mode 100644 index 0000000..1882923 --- /dev/null +++ b/plp-angular/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": ["node"] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/test.ts", + "src/**/*.spec.ts" + ], + "types": [ + + ] +} diff --git a/plp-angular/tsconfig.json b/plp-angular/tsconfig.json new file mode 100644 index 0000000..a409145 --- /dev/null +++ b/plp-angular/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "es2020", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/plp-angular/tsconfig.spec.json b/plp-angular/tsconfig.spec.json new file mode 100644 index 0000000..6400fde --- /dev/null +++ b/plp-angular/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/plp-angular/tslint.json b/plp-angular/tslint.json new file mode 100644 index 0000000..6ccb655 --- /dev/null +++ b/plp-angular/tslint.json @@ -0,0 +1,155 @@ +{ + "extends": "tslint:recommended", + "rules": { + "align": { + "options": [ + "parameters", + "statements" + ] + }, + "array-type": false, + "arrow-parens": false, + "arrow-return-shorthand": true, + "deprecation": { + "severity": "warning" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "curly": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "eofline": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": { + "options": [ + "spaces" + ] + }, + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "semicolon": { + "options": [ + "always" + ] + }, + "space-before-function-paren": { + "options": { + "anonymous": "never", + "asyncArrow": "always", + "constructor": "never", + "method": "never", + "named": "never" + } + }, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "typedef-whitespace": { + "options": [ + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ] + }, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "variable-name": { + "options": [ + "ban-keywords", + "check-format", + "allow-pascal-case" + ] + }, + "whitespace": { + "options": [ + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast" + ] + } + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file