@one-paragon/angular-utilities 1.2.12 → 1.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/action-state/action-state-spinner/action-state-spinner.component.d.ts +12 -0
- package/action-state/action-state-ui/action-state-ui.module.d.ts +7 -0
- package/{src/action-state/index.ts → action-state/index.d.ts} +4 -8
- package/action-state/ngrx-ext/ngrx-ext.module.d.ts +8 -0
- package/action-state/ngrx.d.ts +31 -0
- package/esm2022/action-state/action-state-spinner/action-state-spinner.component.mjs +24 -0
- package/esm2022/action-state/action-state-ui/action-state-ui.module.mjs +20 -0
- package/esm2022/action-state/index.mjs +8 -0
- package/esm2022/action-state/ngrx-ext/ngrx-ext.module.mjs +23 -0
- package/esm2022/action-state/ngrx.mjs +47 -0
- package/esm2022/http-request-state/HttpRequestStateFactory.mjs +51 -0
- package/esm2022/http-request-state/HttpRequestStateStore.mjs +121 -0
- package/esm2022/http-request-state/directives/HttpStateDirectiveBase.mjs +30 -0
- package/esm2022/http-request-state/directives/http-error-state-directive.mjs +23 -0
- package/esm2022/http-request-state/directives/http-inProgress-state-directive.mjs +23 -0
- package/esm2022/http-request-state/directives/http-notStarted-state-directive.mjs +23 -0
- package/esm2022/http-request-state/directives/http-success-state-directive.mjs +29 -0
- package/esm2022/http-request-state/directives/index.mjs +6 -0
- package/esm2022/http-request-state/directives/request-state-directive.mjs +61 -0
- package/esm2022/http-request-state/helpers.mjs +22 -0
- package/esm2022/http-request-state/http-request-state.mjs +39 -0
- package/esm2022/http-request-state/http-state-module.mjs +40 -0
- package/esm2022/http-request-state/index.mjs +7 -0
- package/esm2022/http-request-state/rxjs/getRequestorBody.mjs +4 -0
- package/esm2022/http-request-state/rxjs/getRequestorState.mjs +3 -0
- package/esm2022/http-request-state/rxjs/index.mjs +5 -0
- package/esm2022/http-request-state/rxjs/tapError.mjs +12 -0
- package/esm2022/http-request-state/rxjs/tapSuccess.mjs +12 -0
- package/esm2022/http-request-state/types.mjs +16 -0
- package/esm2022/ngrx/actionable-selector.mjs +71 -0
- package/esm2022/ngrx/index.mjs +2 -0
- package/esm2022/one-paragon-angular-utilities.mjs +5 -0
- package/esm2022/public-api.mjs +20 -0
- package/esm2022/rxjs/defaultShareReplay.mjs +7 -0
- package/esm2022/rxjs/index.mjs +6 -0
- package/esm2022/rxjs/mapError.mjs +8 -0
- package/esm2022/rxjs/rxjs-operators.mjs +92 -0
- package/esm2022/rxjs/subjectifier.mjs +15 -0
- package/esm2022/rxjs/subscriber.directive.mjs +50 -0
- package/esm2022/table-builder/classes/DefaultSettings.mjs +6 -0
- package/esm2022/table-builder/classes/MatTableObservableDataSource.mjs +23 -0
- package/esm2022/table-builder/classes/TableBuilderConfig.mjs +18 -0
- package/esm2022/table-builder/classes/TableBuilderDataSource.mjs +45 -0
- package/esm2022/table-builder/classes/TableState.mjs +49 -0
- package/esm2022/table-builder/classes/data-store.mjs +15 -0
- package/esm2022/table-builder/classes/display-col.mjs +2 -0
- package/esm2022/table-builder/classes/filter-info.mjs +61 -0
- package/esm2022/table-builder/classes/table-builder-general-settings.mjs +112 -0
- package/esm2022/table-builder/classes/table-builder.mjs +77 -0
- package/esm2022/table-builder/classes/table-store.mjs +383 -0
- package/esm2022/table-builder/components/array-column.component.mjs +53 -0
- package/esm2022/table-builder/components/column-builder/column-builder.component.mjs +134 -0
- package/esm2022/table-builder/components/column-builder/column-helpers.mjs +45 -0
- package/esm2022/table-builder/components/date-filter/date-filter.component.mjs +29 -0
- package/esm2022/table-builder/components/date-time-filter/date-time-filter.component.mjs +24 -0
- package/esm2022/table-builder/components/filter/filter.component.mjs +64 -0
- package/esm2022/table-builder/components/filter/in-list/in-list-filter.component.mjs +102 -0
- package/esm2022/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +47 -0
- package/esm2022/table-builder/components/generic-table/generic-table.component.mjs +301 -0
- package/esm2022/table-builder/components/generic-table/paginator.component.mjs +100 -0
- package/esm2022/table-builder/components/group-by-list/group-by-list.component.mjs +21 -0
- package/esm2022/table-builder/components/header-menu/header-menu.component.mjs +103 -0
- package/esm2022/table-builder/components/in-filter/in-filter.component.mjs +65 -0
- package/esm2022/table-builder/components/index.mjs +10 -0
- package/esm2022/table-builder/components/initialization-component/initialization-component.mjs +47 -0
- package/esm2022/table-builder/components/link-column.component.mjs +74 -0
- package/esm2022/table-builder/components/number-filter/number-filter.component.mjs +29 -0
- package/esm2022/table-builder/components/profiles-menu/profiles-menu.component.mjs +64 -0
- package/esm2022/table-builder/components/scroll-strategy.mjs +60 -0
- package/esm2022/table-builder/components/sort-menu/sort-menu.component-store.mjs +46 -0
- package/esm2022/table-builder/components/sort-menu/sort-menu.component.mjs +82 -0
- package/esm2022/table-builder/components/table-container/table-container-imports.mjs +26 -0
- package/esm2022/table-builder/components/table-container/table-container.helpers/data-state.helpers.mjs +135 -0
- package/esm2022/table-builder/components/table-container/table-container.helpers/filter-state.helpers.mjs +83 -0
- package/esm2022/table-builder/components/table-container/table-container.helpers/groupBy.helpers.mjs +71 -0
- package/esm2022/table-builder/components/table-container/table-container.helpers/sort-state.helpers.mjs +36 -0
- package/esm2022/table-builder/components/table-container/table-container.mjs +327 -0
- package/esm2022/table-builder/components/table-container/tableProps.mjs +8 -0
- package/esm2022/table-builder/components/table-container/virtual-scroll-container.mjs +151 -0
- package/esm2022/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +44 -0
- package/esm2022/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +36 -0
- package/esm2022/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +25 -0
- package/esm2022/table-builder/directives/custom-cell-directive.mjs +73 -0
- package/esm2022/table-builder/directives/index.mjs +6 -0
- package/esm2022/table-builder/directives/multi-sort.directive.mjs +50 -0
- package/esm2022/table-builder/directives/resize-column.directive.mjs +87 -0
- package/esm2022/table-builder/directives/table-wrapper.directive.mjs +18 -0
- package/esm2022/table-builder/directives/tb-filter.directive.mjs +396 -0
- package/esm2022/table-builder/enums/filterTypes.mjs +29 -0
- package/esm2022/table-builder/functions/boolean-filter-function.mjs +10 -0
- package/esm2022/table-builder/functions/date-filter-function.mjs +58 -0
- package/esm2022/table-builder/functions/download-data.mjs +12 -0
- package/esm2022/table-builder/functions/null-filter-function.mjs +8 -0
- package/esm2022/table-builder/functions/number-filter-function.mjs +32 -0
- package/esm2022/table-builder/functions/sort-data-function.mjs +17 -0
- package/esm2022/table-builder/functions/string-filter-function.mjs +41 -0
- package/esm2022/table-builder/interfaces/ColumnInfo.mjs +2 -0
- package/esm2022/table-builder/interfaces/dictionary.mjs +2 -0
- package/esm2022/table-builder/interfaces/report-def.mjs +50 -0
- package/esm2022/table-builder/ngrx/tableBuilderStateStore.mjs +154 -0
- package/esm2022/table-builder/pipes/column-total.pipe.mjs +22 -0
- package/esm2022/table-builder/pipes/format-filter-type.pipe.mjs +18 -0
- package/esm2022/table-builder/pipes/format-filter-value.pipe.mjs +43 -0
- package/esm2022/table-builder/pipes/key-display.mjs +18 -0
- package/esm2022/table-builder/services/export-to-csv.service.mjs +75 -0
- package/esm2022/table-builder/services/link-creator.service.mjs +50 -0
- package/esm2022/table-builder/services/table-template-service.mjs +60 -0
- package/esm2022/table-builder/services/transform-creator.mjs +100 -0
- package/esm2022/table-builder/table-builder.module.mjs +124 -0
- package/esm2022/utilities/array-helpers.mjs +14 -0
- package/esm2022/utilities/directives/auto-focus.directive.mjs +25 -0
- package/esm2022/utilities/directives/clickEmitterDirective.mjs +22 -0
- package/esm2022/utilities/directives/clickSubject.mjs +29 -0
- package/esm2022/utilities/directives/conditional-classes.directive.mjs +36 -0
- package/esm2022/utilities/directives/dialog-service.mjs +21 -0
- package/esm2022/utilities/directives/dialog.mjs +145 -0
- package/esm2022/utilities/directives/mat-toggle-group-directive.mjs +59 -0
- package/esm2022/utilities/directives/prevent-enter.directive.mjs +20 -0
- package/esm2022/utilities/directives/stop-propagation.directive.mjs +26 -0
- package/esm2022/utilities/directives/styler.mjs +41 -0
- package/esm2022/utilities/directives/trim-whitespace.directive.mjs +28 -0
- package/esm2022/utilities/index.mjs +16 -0
- package/esm2022/utilities/module.mjs +90 -0
- package/esm2022/utilities/pipes/function.pipe.mjs +22 -0
- package/esm2022/utilities/pipes/phone.pipe.mjs +20 -0
- package/esm2022/utilities/pipes/space-case.pipes.mjs +28 -0
- package/fesm2022/one-paragon-angular-utilities.mjs +5670 -0
- package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -0
- package/http-request-state/HttpRequestStateFactory.d.ts +17 -0
- package/http-request-state/HttpRequestStateStore.d.ts +54 -0
- package/http-request-state/directives/HttpStateDirectiveBase.d.ts +14 -0
- package/http-request-state/directives/http-error-state-directive.d.ts +9 -0
- package/http-request-state/directives/http-inProgress-state-directive.d.ts +9 -0
- package/http-request-state/directives/http-notStarted-state-directive.d.ts +9 -0
- package/http-request-state/directives/http-success-state-directive.d.ts +16 -0
- package/{src/http-request-state/directives/index.ts → http-request-state/directives/index.d.ts} +5 -5
- package/http-request-state/directives/request-state-directive.d.ts +34 -0
- package/http-request-state/helpers.d.ts +9 -0
- package/http-request-state/http-request-state.d.ts +12 -0
- package/http-request-state/http-state-module.d.ts +11 -0
- package/{src/http-request-state/index.ts → http-request-state/index.d.ts} +6 -6
- package/http-request-state/rxjs/getRequestorBody.d.ts +3 -0
- package/http-request-state/rxjs/getRequestorState.d.ts +3 -0
- package/{src/http-request-state/rxjs/index.ts → http-request-state/rxjs/index.d.ts} +4 -4
- package/http-request-state/rxjs/tapError.d.ts +3 -0
- package/http-request-state/rxjs/tapSuccess.d.ts +3 -0
- package/http-request-state/types.d.ts +41 -0
- package/index.d.ts +5 -0
- package/ngrx/actionable-selector.d.ts +17 -0
- package/ngrx/index.d.ts +1 -0
- package/package.json +30 -16
- package/{src/public-api.ts → public-api.d.ts} +16 -35
- package/rxjs/defaultShareReplay.d.ts +2 -0
- package/{src/rxjs/index.ts → rxjs/index.d.ts} +5 -5
- package/rxjs/mapError.d.ts +2 -0
- package/rxjs/rxjs-operators.d.ts +13 -0
- package/rxjs/subjectifier.d.ts +8 -0
- package/rxjs/subscriber.directive.d.ts +14 -0
- package/table-builder/classes/DefaultSettings.d.ts +9 -0
- package/table-builder/classes/MatTableObservableDataSource.d.ts +9 -0
- package/table-builder/classes/TableBuilderConfig.d.ts +21 -0
- package/table-builder/classes/TableBuilderDataSource.d.ts +12 -0
- package/table-builder/classes/TableState.d.ts +67 -0
- package/table-builder/classes/data-store.d.ts +8 -0
- package/{src/table-builder/classes/display-col.ts → table-builder/classes/display-col.d.ts} +5 -5
- package/table-builder/classes/filter-info.d.ts +35 -0
- package/table-builder/classes/table-builder-general-settings.d.ts +78 -0
- package/table-builder/classes/table-builder.d.ts +18 -0
- package/table-builder/classes/table-store.d.ts +138 -0
- package/table-builder/components/array-column.component.d.ts +15 -0
- package/table-builder/components/column-builder/column-builder.component.d.ts +47 -0
- package/table-builder/components/column-builder/column-helpers.d.ts +36 -0
- package/table-builder/components/date-filter/date-filter.component.d.ts +37 -0
- package/table-builder/components/date-time-filter/date-time-filter.component.d.ts +37 -0
- package/table-builder/components/filter/filter.component.d.ts +46 -0
- package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +24 -0
- package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +17 -0
- package/table-builder/components/generic-table/generic-table.component.d.ts +83 -0
- package/table-builder/components/generic-table/paginator.component.d.ts +30 -0
- package/table-builder/components/group-by-list/group-by-list.component.d.ts +7 -0
- package/table-builder/components/header-menu/header-menu.component.d.ts +51 -0
- package/table-builder/components/in-filter/in-filter.component.d.ts +20 -0
- package/{src/table-builder/components/index.ts → table-builder/components/index.d.ts} +9 -9
- package/table-builder/components/initialization-component/initialization-component.d.ts +13 -0
- package/table-builder/components/link-column.component.d.ts +25 -0
- package/table-builder/components/number-filter/number-filter.component.d.ts +39 -0
- package/table-builder/components/profiles-menu/profiles-menu.component.d.ts +32 -0
- package/table-builder/components/scroll-strategy.d.ts +22 -0
- package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +24 -0
- package/table-builder/components/sort-menu/sort-menu.component.d.ts +24 -0
- package/{src/table-builder/components/table-container/table-container-imports.ts → table-builder/components/table-container/table-container-imports.d.ts} +14 -32
- package/table-builder/components/table-container/table-container.d.ts +79 -0
- package/table-builder/components/table-container/table-container.helpers/data-state.helpers.d.ts +6 -0
- package/table-builder/components/table-container/table-container.helpers/filter-state.helpers.d.ts +17 -0
- package/table-builder/components/table-container/table-container.helpers/groupBy.helpers.d.ts +17 -0
- package/table-builder/components/table-container/table-container.helpers/sort-state.helpers.d.ts +8 -0
- package/table-builder/components/table-container/tableProps.d.ts +12 -0
- package/table-builder/components/table-container/virtual-scroll-container.d.ts +35 -0
- package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +15 -0
- package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +12 -0
- package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +14 -0
- package/table-builder/directives/custom-cell-directive.d.ts +33 -0
- package/{src/table-builder/directives/index.ts → table-builder/directives/index.d.ts} +5 -6
- package/table-builder/directives/multi-sort.directive.d.ts +10 -0
- package/table-builder/directives/resize-column.directive.d.ts +43 -0
- package/table-builder/directives/table-wrapper.directive.d.ts +8 -0
- package/table-builder/directives/tb-filter.directive.d.ts +115 -0
- package/table-builder/enums/filterTypes.d.ts +36 -0
- package/table-builder/functions/boolean-filter-function.d.ts +3 -0
- package/table-builder/functions/date-filter-function.d.ts +4 -0
- package/table-builder/functions/download-data.d.ts +1 -0
- package/table-builder/functions/null-filter-function.d.ts +2 -0
- package/table-builder/functions/number-filter-function.d.ts +4 -0
- package/table-builder/functions/sort-data-function.d.ts +6 -0
- package/table-builder/functions/string-filter-function.d.ts +5 -0
- package/{src/table-builder/interfaces/ColumnInfo.ts → table-builder/interfaces/ColumnInfo.d.ts} +6 -7
- package/{src/table-builder/interfaces/dictionary.ts → table-builder/interfaces/dictionary.d.ts} +3 -3
- package/table-builder/interfaces/report-def.d.ts +147 -0
- package/table-builder/ngrx/tableBuilderStateStore.d.ts +70 -0
- package/table-builder/pipes/column-total.pipe.d.ts +8 -0
- package/table-builder/pipes/format-filter-type.pipe.d.ts +8 -0
- package/table-builder/pipes/format-filter-value.pipe.d.ts +12 -0
- package/table-builder/pipes/key-display.d.ts +10 -0
- package/table-builder/services/export-to-csv.service.d.ts +14 -0
- package/table-builder/services/link-creator.service.d.ts +16 -0
- package/table-builder/services/table-template-service.d.ts +14 -0
- package/table-builder/services/transform-creator.d.ts +16 -0
- package/table-builder/table-builder.module.d.ts +21 -0
- package/utilities/array-helpers.d.ts +1 -0
- package/utilities/directives/auto-focus.directive.d.ts +9 -0
- package/utilities/directives/clickEmitterDirective.d.ts +7 -0
- package/utilities/directives/clickSubject.d.ts +9 -0
- package/utilities/directives/conditional-classes.directive.d.ts +13 -0
- package/utilities/directives/dialog-service.d.ts +10 -0
- package/utilities/directives/dialog.d.ts +44 -0
- package/utilities/directives/mat-toggle-group-directive.d.ts +21 -0
- package/utilities/directives/prevent-enter.directive.d.ts +6 -0
- package/utilities/directives/stop-propagation.directive.d.ts +7 -0
- package/utilities/directives/styler.d.ts +15 -0
- package/utilities/directives/trim-whitespace.directive.d.ts +7 -0
- package/{src/utilities/index.ts → utilities/index.d.ts} +15 -22
- package/utilities/module.d.ts +19 -0
- package/utilities/pipes/function.pipe.d.ts +7 -0
- package/utilities/pipes/phone.pipe.d.ts +7 -0
- package/utilities/pipes/space-case.pipes.d.ts +17 -0
- package/karma.conf.js +0 -44
- package/ng-package.json +0 -7
- package/src/action-state/action-state-spinner/action-state-spinner.component.css +0 -16
- package/src/action-state/action-state-spinner/action-state-spinner.component.html +0 -6
- package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +0 -25
- package/src/action-state/action-state-spinner/action-state-spinner.component.ts +0 -26
- package/src/action-state/action-state-ui/action-state-ui.module.ts +0 -13
- package/src/action-state/ngrx-ext/ngrx-ext.module.ts +0 -15
- package/src/action-state/ngrx.ts +0 -69
- package/src/http-request-state/HttpRequestStateFactory.ts +0 -66
- package/src/http-request-state/HttpRequestStateStore.ts +0 -173
- package/src/http-request-state/directives/HttpStateDirectiveBase.ts +0 -29
- package/src/http-request-state/directives/http-error-state-directive.ts +0 -21
- package/src/http-request-state/directives/http-inProgress-state-directive.ts +0 -19
- package/src/http-request-state/directives/http-notStarted-state-directive.ts +0 -19
- package/src/http-request-state/directives/http-success-state-directive.ts +0 -29
- package/src/http-request-state/directives/request-state-directive.spec.ts +0 -72
- package/src/http-request-state/directives/request-state-directive.ts +0 -78
- package/src/http-request-state/helpers.ts +0 -30
- package/src/http-request-state/http-request-state.ts +0 -69
- package/src/http-request-state/http-state-module.ts +0 -23
- package/src/http-request-state/observable.spec.ts +0 -43
- package/src/http-request-state/rxjs/getRequestorBody.ts +0 -10
- package/src/http-request-state/rxjs/getRequestorState.ts +0 -8
- package/src/http-request-state/rxjs/tapError.ts +0 -16
- package/src/http-request-state/rxjs/tapSuccess.ts +0 -16
- package/src/http-request-state/strategies.spec.ts +0 -42
- package/src/http-request-state/types.ts +0 -55
- package/src/ngrx/actionable-selector.ts +0 -95
- package/src/ngrx/index.ts +0 -1
- package/src/rxjs/defaultShareReplay.ts +0 -8
- package/src/rxjs/mapError.ts +0 -8
- package/src/rxjs/rxjs-operators.ts +0 -132
- package/src/rxjs/subjectifier.ts +0 -17
- package/src/rxjs/subscriber.directive.ts +0 -57
- package/src/specs/clickSubject.spec.ts +0 -95
- package/src/specs/dialog.spec.ts +0 -101
- package/src/specs/toggleGroupDirective.spec.ts +0 -229
- package/src/table-builder/classes/DefaultSettings.ts +0 -11
- package/src/table-builder/classes/MatTableObservableDataSource.ts +0 -23
- package/src/table-builder/classes/TableBuilderConfig.ts +0 -35
- package/src/table-builder/classes/TableBuilderDataSource.ts +0 -80
- package/src/table-builder/classes/TableState.ts +0 -96
- package/src/table-builder/classes/data-store.ts +0 -10
- package/src/table-builder/classes/filter-info.ts +0 -108
- package/src/table-builder/classes/table-builder-general-settings.ts +0 -129
- package/src/table-builder/classes/table-builder.ts +0 -94
- package/src/table-builder/classes/table-store.ts +0 -471
- package/src/table-builder/components/array-column.component.ts +0 -36
- package/src/table-builder/components/column-builder/column-builder.component.html +0 -61
- package/src/table-builder/components/column-builder/column-builder.component.scss +0 -43
- package/src/table-builder/components/column-builder/column-builder.component.spec.ts +0 -49
- package/src/table-builder/components/column-builder/column-builder.component.ts +0 -135
- package/src/table-builder/components/column-builder/column-helpers.ts +0 -53
- package/src/table-builder/components/date-filter/date-filter.component.html +0 -23
- package/src/table-builder/components/date-filter/date-filter.component.ts +0 -24
- package/src/table-builder/components/date-time-filter/date-time-filter.component.html +0 -9
- package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +0 -22
- package/src/table-builder/components/filter/filter.component.html +0 -91
- package/src/table-builder/components/filter/filter.component.scss +0 -64
- package/src/table-builder/components/filter/filter.component.spec.ts +0 -87
- package/src/table-builder/components/filter/filter.component.ts +0 -60
- package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +0 -93
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +0 -55
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +0 -57
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +0 -59
- package/src/table-builder/components/generic-table/generic-table.component.html +0 -78
- package/src/table-builder/components/generic-table/generic-table.component.scss +0 -42
- package/src/table-builder/components/generic-table/generic-table.component.ts +0 -299
- package/src/table-builder/components/generic-table/paginator.component.ts +0 -99
- package/src/table-builder/components/group-by-list/group-by-list.component.css +0 -8
- package/src/table-builder/components/group-by-list/group-by-list.component.html +0 -12
- package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +0 -23
- package/src/table-builder/components/group-by-list/group-by-list.component.ts +0 -21
- package/src/table-builder/components/header-menu/header-menu.component.html +0 -104
- package/src/table-builder/components/header-menu/header-menu.component.scss +0 -96
- package/src/table-builder/components/header-menu/header-menu.component.ts +0 -99
- package/src/table-builder/components/in-filter/in-filter.component.css +0 -3
- package/src/table-builder/components/in-filter/in-filter.component.html +0 -20
- package/src/table-builder/components/in-filter/in-filter.component.ts +0 -66
- package/src/table-builder/components/initialization-component/initialization-component.html +0 -29
- package/src/table-builder/components/initialization-component/initialization-component.ts +0 -24
- package/src/table-builder/components/link-column.component.ts +0 -47
- package/src/table-builder/components/number-filter/number-filter.component.css +0 -10
- package/src/table-builder/components/number-filter/number-filter.component.html +0 -19
- package/src/table-builder/components/number-filter/number-filter.component.spec.ts +0 -30
- package/src/table-builder/components/number-filter/number-filter.component.ts +0 -25
- package/src/table-builder/components/profiles-menu/profiles-menu.component.html +0 -74
- package/src/table-builder/components/profiles-menu/profiles-menu.component.scss +0 -98
- package/src/table-builder/components/profiles-menu/profiles-menu.component.spec.ts +0 -23
- package/src/table-builder/components/profiles-menu/profiles-menu.component.ts +0 -65
- package/src/table-builder/components/scroll-strategy.ts +0 -76
- package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +0 -66
- package/src/table-builder/components/sort-menu/sort-menu.component.html +0 -111
- package/src/table-builder/components/sort-menu/sort-menu.component.scss +0 -119
- package/src/table-builder/components/sort-menu/sort-menu.component.ts +0 -98
- package/src/table-builder/components/table-container/table-container.css +0 -54
- package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +0 -141
- package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +0 -106
- package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +0 -86
- package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +0 -45
- package/src/table-builder/components/table-container/table-container.html +0 -95
- package/src/table-builder/components/table-container/table-container.spec.ts +0 -154
- package/src/table-builder/components/table-container/table-container.ts +0 -356
- package/src/table-builder/components/table-container/tableProps.ts +0 -20
- package/src/table-builder/components/table-container/virtual-scroll-container.ts +0 -145
- package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +0 -31
- package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +0 -46
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +0 -42
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +0 -10
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +0 -86
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +0 -34
- package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +0 -23
- package/src/table-builder/directives/custom-cell-directive.ts +0 -58
- package/src/table-builder/directives/multi-sort.directive.spec.ts +0 -124
- package/src/table-builder/directives/multi-sort.directive.ts +0 -51
- package/src/table-builder/directives/resize-column.directive.ts +0 -108
- package/src/table-builder/directives/table-wrapper.directive.ts +0 -14
- package/src/table-builder/directives/tb-filter.directive.ts +0 -396
- package/src/table-builder/enums/filterTypes.ts +0 -40
- package/src/table-builder/functions/boolean-filter-function.ts +0 -12
- package/src/table-builder/functions/date-filter-function.ts +0 -68
- package/src/table-builder/functions/download-data.ts +0 -11
- package/src/table-builder/functions/null-filter-function.ts +0 -9
- package/src/table-builder/functions/number-filter-function.ts +0 -41
- package/src/table-builder/functions/sort-data-function.ts +0 -23
- package/src/table-builder/functions/string-filter-function.ts +0 -51
- package/src/table-builder/interfaces/column-template.ts +0 -9
- package/src/table-builder/interfaces/report-def.ts +0 -155
- package/src/table-builder/ngrx/tableBuilderStateStore.ts +0 -199
- package/src/table-builder/pipes/column-total.pipe.ts +0 -17
- package/src/table-builder/pipes/format-filter-type.pipe.ts +0 -12
- package/src/table-builder/pipes/format-filter-value.pipe.ts +0 -42
- package/src/table-builder/pipes/key-display.ts +0 -16
- package/src/table-builder/services/export-to-csv.service.ts +0 -97
- package/src/table-builder/services/link-creator.service.ts +0 -67
- package/src/table-builder/services/table-template-service.ts +0 -59
- package/src/table-builder/services/transform-creator.ts +0 -95
- package/src/table-builder/specs/table-custom-filters.spec.ts +0 -262
- package/src/table-builder/styles/collapser.styles.scss +0 -16
- package/src/table-builder/table-builder.module.ts +0 -73
- package/src/test.ts +0 -17
- package/src/utilities/array-helpers.ts +0 -13
- package/src/utilities/directives/auto-focus.directive.ts +0 -21
- package/src/utilities/directives/clickEmitterDirective.ts +0 -16
- package/src/utilities/directives/clickSubject.ts +0 -20
- package/src/utilities/directives/conditional-classes.directive.ts +0 -36
- package/src/utilities/directives/dialog-service.ts +0 -19
- package/src/utilities/directives/dialog.ts +0 -144
- package/src/utilities/directives/mat-toggle-group-directive.ts +0 -61
- package/src/utilities/directives/prevent-enter.directive.ts +0 -13
- package/src/utilities/directives/stop-propagation.directive.ts +0 -20
- package/src/utilities/directives/styler.ts +0 -40
- package/src/utilities/directives/trim-whitespace.directive.ts +0 -21
- package/src/utilities/module.ts +0 -55
- package/src/utilities/pipes/function.pipe.ts +0 -16
- package/src/utilities/pipes/phone.pipe.ts +0 -15
- package/src/utilities/pipes/space-case.pipes.spec.ts +0 -47
- package/src/utilities/pipes/space-case.pipes.ts +0 -23
- package/tsconfig.lib.json +0 -19
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -17
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy, inject, computed } from '@angular/core';
|
|
2
|
+
import { TableStore } from '../../classes/table-store';
|
|
3
|
+
import { DragDropModule } from '@angular/cdk/drag-drop';
|
|
4
|
+
import { AsyncPipe } from '@angular/common';
|
|
5
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
6
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
8
|
+
import { MatMenuModule } from '@angular/material/menu';
|
|
9
|
+
import { SpaceCasePipe, StopPropagationDirective } from '../../../utilities';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/material/tooltip";
|
|
12
|
+
import * as i2 from "@angular/material/icon";
|
|
13
|
+
import * as i3 from "@angular/material/button";
|
|
14
|
+
import * as i4 from "@angular/material/menu";
|
|
15
|
+
import * as i5 from "@angular/cdk/drag-drop";
|
|
16
|
+
export class GenColDisplayerComponent {
|
|
17
|
+
tableState = inject(TableStore);
|
|
18
|
+
$columns = computed(() => this.tableState.$orderedCodeVisibleMetaDatas().map(md => ({
|
|
19
|
+
key: md.key,
|
|
20
|
+
displayName: md.displayName,
|
|
21
|
+
isVisible: !this.tableState.$hiddenKeys().includes(md.key)
|
|
22
|
+
})));
|
|
23
|
+
reset(displayCols) {
|
|
24
|
+
displayCols.forEach(c => c.isVisible = true);
|
|
25
|
+
this.emit(displayCols);
|
|
26
|
+
}
|
|
27
|
+
drop(event) {
|
|
28
|
+
this.tableState.setUserDefinedOrder({ newOrder: event.currentIndex, oldOrder: event.previousIndex });
|
|
29
|
+
}
|
|
30
|
+
unset(displayCols) {
|
|
31
|
+
displayCols.forEach(c => c.isVisible = false);
|
|
32
|
+
this.emit(displayCols);
|
|
33
|
+
}
|
|
34
|
+
emit(displayCols) {
|
|
35
|
+
this.tableState.setHiddenColumns(displayCols.map(c => ({ key: c.key, visible: c.isVisible })));
|
|
36
|
+
}
|
|
37
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenColDisplayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenColDisplayerComponent, isStandalone: true, selector: "tb-col-displayer", ngImport: i0, template: "@if($columns(); as displayCols){\r\n <span matTooltip=\"Show/hide columns\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n </button>\r\n </span>\r\n <mat-menu #menu=\"matMenu\" class=\"my-mat-menu\">\r\n\r\n <button mat-menu-item>\r\n <span matTooltip=\"Close\">\r\n <button class=\"filter-button\" mat-icon-button>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <button mat-menu-item stop-propagation>\r\n <span matTooltip=\"Show all columns\">\r\n <button mat-icon-button (click)=\"reset(displayCols)\">\r\n <mat-icon color=\"primary\">done_all</mat-icon>\r\n </button>\r\n </span>\r\n\r\n <span matTooltip=\"Hide all columns\">\r\n <button mat-icon-button (click)=\"unset(displayCols)\">\r\n <mat-icon color=\"primary\">cancel</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\" stop-propagation [cdkDropListLockAxis]=\"'y'\">\r\n @for (col of displayCols; track col.key) {\r\n <button [class.isHidden]=\"!col.isVisible\" stop-propagation mat-menu-item cdkDrag [cdkDragData]=\"col\">\r\n <div (click)=\"col.isVisible = !col.isVisible; emit(displayCols)\" style=\"display: flex; align-items: center;\">\r\n @if(col.isVisible){\r\n <button mat-icon-button matTooltip=\"Hide Column\" class=\"show-hide\">\r\n <mat-icon color=\"primary\">check_box</mat-icon>\r\n </button>\r\n } @else {\r\n <button mat-icon-button matTooltip=\"Show Column\" class=\"show-hide\">\r\n <mat-icon>indeterminate_check_box</mat-icon>\r\n </button>\r\n }\r\n \r\n <p class=\"label\">\r\n {{col.displayName || (col.key | spaceCase) }}\r\n </p>\r\n\r\n </div>\r\n </button>\r\n }\r\n\r\n </div>\r\n </mat-menu>\r\n}", styles: [".show-hide{margin-right:15px;height:24px;width:24px;padding:4px}.label{color:#6495ed;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:left;margin:0;font-size:17px;font-weight:700;display:inline-block;width:66%}.row{margin:0;padding:0}.isHidden{background-color:#d3d3d3;color:#a9a9a9;font-weight:700;font-size:17px;white-space:nowrap}.filter-button{margin-top:10px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.mdc-list-item__primary-text{display:inline-block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: SpaceCasePipe, name: "spaceCase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
39
|
+
}
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenColDisplayerComponent, decorators: [{
|
|
41
|
+
type: Component,
|
|
42
|
+
args: [{ selector: 'tb-col-displayer', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
43
|
+
AsyncPipe, MatTooltipModule, MatIconModule, MatButtonModule, MatMenuModule, StopPropagationDirective,
|
|
44
|
+
DragDropModule, SpaceCasePipe
|
|
45
|
+
], template: "@if($columns(); as displayCols){\r\n <span matTooltip=\"Show/hide columns\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n </button>\r\n </span>\r\n <mat-menu #menu=\"matMenu\" class=\"my-mat-menu\">\r\n\r\n <button mat-menu-item>\r\n <span matTooltip=\"Close\">\r\n <button class=\"filter-button\" mat-icon-button>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <button mat-menu-item stop-propagation>\r\n <span matTooltip=\"Show all columns\">\r\n <button mat-icon-button (click)=\"reset(displayCols)\">\r\n <mat-icon color=\"primary\">done_all</mat-icon>\r\n </button>\r\n </span>\r\n\r\n <span matTooltip=\"Hide all columns\">\r\n <button mat-icon-button (click)=\"unset(displayCols)\">\r\n <mat-icon color=\"primary\">cancel</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\" stop-propagation [cdkDropListLockAxis]=\"'y'\">\r\n @for (col of displayCols; track col.key) {\r\n <button [class.isHidden]=\"!col.isVisible\" stop-propagation mat-menu-item cdkDrag [cdkDragData]=\"col\">\r\n <div (click)=\"col.isVisible = !col.isVisible; emit(displayCols)\" style=\"display: flex; align-items: center;\">\r\n @if(col.isVisible){\r\n <button mat-icon-button matTooltip=\"Hide Column\" class=\"show-hide\">\r\n <mat-icon color=\"primary\">check_box</mat-icon>\r\n </button>\r\n } @else {\r\n <button mat-icon-button matTooltip=\"Show Column\" class=\"show-hide\">\r\n <mat-icon>indeterminate_check_box</mat-icon>\r\n </button>\r\n }\r\n \r\n <p class=\"label\">\r\n {{col.displayName || (col.key | spaceCase) }}\r\n </p>\r\n\r\n </div>\r\n </button>\r\n }\r\n\r\n </div>\r\n </mat-menu>\r\n}", styles: [".show-hide{margin-right:15px;height:24px;width:24px;padding:4px}.label{color:#6495ed;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:left;margin:0;font-size:17px;font-weight:700;display:inline-block;width:66%}.row{margin:0;padding:0}.isHidden{background-color:#d3d3d3;color:#a9a9a9;font-weight:700;font-size:17px;white-space:nowrap}.filter-button{margin-top:10px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.mdc-list-item__primary-text{display:inline-block;width:100%}\n"] }]
|
|
46
|
+
}] });
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuLWNvbC1kaXNwbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy9nZW4tY29sLWRpc3BsYXllci9nZW4tY29sLWRpc3BsYXllci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbi1jb2wtZGlzcGxheWVyL2dlbi1jb2wtZGlzcGxheWVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFjLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFhN0UsTUFBTSxPQUFPLHdCQUF3QjtJQUMzQixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLEdBQUcsQ0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1FBQ1gsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO1FBQzNCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7S0FDM0QsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVMLEtBQUssQ0FBQyxXQUF5QjtRQUM3QixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBNEI7UUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtJQUNyRyxDQUFDO0lBQ0QsS0FBSyxDQUFDLFdBQXlCO1FBQzdCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksQ0FBQyxXQUF5QjtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRyxDQUFDO3VHQXRCVSx3QkFBd0I7MkZBQXhCLHdCQUF3Qiw0RUN0QnJDLDhnRUFzREMseXVCRHBDYyxnQkFBZ0IsNFRBQUUsYUFBYSxtTEFBRSxlQUFlLDJJQUFFLGFBQWEsOHZCQUFFLHdCQUF3Qiw4REFDcEcsY0FBYyx3L0JBQUUsYUFBYTs7MkZBR3BCLHdCQUF3QjtrQkFYcEMsU0FBUzsrQkFDRSxrQkFBa0IsbUJBR1gsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLHdCQUF3Qjt3QkFDcEcsY0FBYyxFQUFFLGFBQWE7cUJBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgaW5qZWN0LCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEaXNwbGF5Q29sIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9kaXNwbGF5LWNvbCc7XHJcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcclxuaW1wb3J0IHtDZGtEcmFnRHJvcCwgRHJhZ0Ryb3BNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQgeyBTcGFjZUNhc2VQaXBlLCBTdG9wUHJvcGFnYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Yi1jb2wtZGlzcGxheWVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuLWNvbC1kaXNwbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlbi1jb2wtZGlzcGxheWVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2ggLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQXN5bmNQaXBlLCBNYXRUb29sdGlwTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdE1lbnVNb2R1bGUsIFN0b3BQcm9wYWdhdGlvbkRpcmVjdGl2ZSxcclxuICAgIERyYWdEcm9wTW9kdWxlLCBTcGFjZUNhc2VQaXBlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2VuQ29sRGlzcGxheWVyQ29tcG9uZW50IHtcclxuICBwcml2YXRlIHRhYmxlU3RhdGUgPSBpbmplY3QoVGFibGVTdG9yZSk7XHJcbiAgJGNvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRhYmxlU3RhdGUuJG9yZGVyZWRDb2RlVmlzaWJsZU1ldGFEYXRhcygpLm1hcCggbWQgPT4gKHtcclxuICAgIGtleTogbWQua2V5LFxyXG4gICAgZGlzcGxheU5hbWU6IG1kLmRpc3BsYXlOYW1lLFxyXG4gICAgaXNWaXNpYmxlOiAhdGhpcy50YWJsZVN0YXRlLiRoaWRkZW5LZXlzKCkuaW5jbHVkZXMobWQua2V5KVxyXG4gIH0pKSk7XHJcblxyXG4gIHJlc2V0KGRpc3BsYXlDb2xzOiBEaXNwbGF5Q29sW10pIHtcclxuICAgIGRpc3BsYXlDb2xzLmZvckVhY2goYyA9PiBjLmlzVmlzaWJsZSA9IHRydWUpO1xyXG4gICAgdGhpcy5lbWl0KGRpc3BsYXlDb2xzKTtcclxuICB9XHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICB0aGlzLnRhYmxlU3RhdGUuc2V0VXNlckRlZmluZWRPcmRlcih7IG5ld09yZGVyOiBldmVudC5jdXJyZW50SW5kZXgsIG9sZE9yZGVyOmV2ZW50LnByZXZpb3VzSW5kZXggfSlcclxuICB9XHJcbiAgdW5zZXQoZGlzcGxheUNvbHM6IERpc3BsYXlDb2xbXSkge1xyXG4gICAgZGlzcGxheUNvbHMuZm9yRWFjaChjID0+IGMuaXNWaXNpYmxlID0gZmFsc2UpO1xyXG4gICAgdGhpcy5lbWl0KGRpc3BsYXlDb2xzKTtcclxuICB9XHJcblxyXG4gIGVtaXQoZGlzcGxheUNvbHM6IERpc3BsYXlDb2xbXSkge1xyXG4gICAgdGhpcy50YWJsZVN0YXRlLnNldEhpZGRlbkNvbHVtbnMoZGlzcGxheUNvbHMubWFwKCBjID0+ICh7a2V5OiBjLmtleSwgdmlzaWJsZTogYy5pc1Zpc2libGV9KSkpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYoJGNvbHVtbnMoKTsgYXMgZGlzcGxheUNvbHMpe1xyXG4gIDxzcGFuIG1hdFRvb2x0aXA9XCJTaG93L2hpZGUgY29sdW1uc1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cclxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiPnZpc2liaWxpdHlfb2ZmPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvc3Bhbj5cclxuICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJteS1tYXQtbWVudVwiPlxyXG5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT5cclxuICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIkNsb3NlXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZpbHRlci1idXR0b25cIiBtYXQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gc3RvcC1wcm9wYWdhdGlvbj5cclxuICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIlNob3cgYWxsIGNvbHVtbnNcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVzZXQoZGlzcGxheUNvbHMpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+ZG9uZV9hbGw8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiBtYXRUb29sdGlwPVwiSGlkZSBhbGwgY29sdW1uc1wiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ1bnNldChkaXNwbGF5Q29scylcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCIgc3RvcC1wcm9wYWdhdGlvbiBbY2RrRHJvcExpc3RMb2NrQXhpc109XCIneSdcIj5cclxuICAgICAgQGZvciAoY29sIG9mIGRpc3BsYXlDb2xzOyB0cmFjayBjb2wua2V5KSB7XHJcbiAgICAgICAgPGJ1dHRvbiBbY2xhc3MuaXNIaWRkZW5dPVwiIWNvbC5pc1Zpc2libGVcIiBzdG9wLXByb3BhZ2F0aW9uIG1hdC1tZW51LWl0ZW0gY2RrRHJhZyBbY2RrRHJhZ0RhdGFdPVwiY29sXCI+XHJcbiAgICAgICAgPGRpdiAoY2xpY2spPVwiY29sLmlzVmlzaWJsZSA9ICFjb2wuaXNWaXNpYmxlOyBlbWl0KGRpc3BsYXlDb2xzKVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cclxuICAgICAgICAgIEBpZihjb2wuaXNWaXNpYmxlKXtcclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIkhpZGUgQ29sdW1uXCIgY2xhc3M9XCJzaG93LWhpZGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+Y2hlY2tfYm94PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlNob3cgQ29sdW1uXCIgY2xhc3M9XCJzaG93LWhpZGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+aW5kZXRlcm1pbmF0ZV9jaGVja19ib3g8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJsYWJlbFwiPlxyXG4gICAgICAgICAgICB7e2NvbC5kaXNwbGF5TmFtZSB8fCAoY29sLmtleSB8IHNwYWNlQ2FzZSkgfX1cclxuICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9tYXQtbWVudT5cclxufSJdfQ==
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { Component, ViewChild, Input, ChangeDetectionStrategy, Output, ViewContainerRef, Injector, EventEmitter, computed, inject, input, viewChild, effect, untracked, signal } from '@angular/core';
|
|
2
|
+
import { MatFooterRowDef, MatHeaderRowDef, MatTable, MatTableModule } from '@angular/material/table';
|
|
3
|
+
import { SelectionModel } from '@angular/cdk/collections';
|
|
4
|
+
import { TableStore } from '../../classes/table-store';
|
|
5
|
+
import { map } from 'rxjs/operators';
|
|
6
|
+
import { ColumnBuilderComponent } from '../column-builder/column-builder.component';
|
|
7
|
+
import { FieldType } from '../../interfaces/report-def';
|
|
8
|
+
import { previousAndCurrent } from '../../../rxjs/rxjs-operators';
|
|
9
|
+
import { CdkDropList, DragDropModule } from '@angular/cdk/drag-drop';
|
|
10
|
+
import { FunctionPipe } from '../../../utilities';
|
|
11
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
12
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
13
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
14
|
+
import { AsyncPipe, NgTemplateOutlet } from '@angular/common';
|
|
15
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
16
|
+
import { TransformCreator } from '../../services/transform-creator';
|
|
17
|
+
import { initIndexSymbol } from '../table-container/table-container.helpers/sort-state.helpers';
|
|
18
|
+
import { toObservable } from '@angular/core/rxjs-interop';
|
|
19
|
+
import { DataStore } from '../../classes/data-store';
|
|
20
|
+
import * as i0 from "@angular/core";
|
|
21
|
+
import * as i1 from "@angular/material/table";
|
|
22
|
+
import * as i2 from "@angular/cdk/drag-drop";
|
|
23
|
+
import * as i3 from "@angular/material/checkbox";
|
|
24
|
+
import * as i4 from "@angular/material/button";
|
|
25
|
+
import * as i5 from "@angular/material/icon";
|
|
26
|
+
export class GenericTableComponent {
|
|
27
|
+
state = inject(TableStore);
|
|
28
|
+
dataStore = inject(DataStore);
|
|
29
|
+
viewContainer = inject(ViewContainerRef);
|
|
30
|
+
transformCreator = inject(TransformCreator);
|
|
31
|
+
$headerRow = viewChild(MatHeaderRowDef);
|
|
32
|
+
$footerRow = viewChild(MatFooterRowDef);
|
|
33
|
+
$table = viewChild(MatTable);
|
|
34
|
+
drop(event) {
|
|
35
|
+
this.state.setUserDefinedOrder({ newOrder: event.currentIndex, oldOrder: event.previousIndex });
|
|
36
|
+
}
|
|
37
|
+
_trackBy;
|
|
38
|
+
set trackBy(trackBy) {
|
|
39
|
+
if (trackBy) {
|
|
40
|
+
this._trackBy = trackBy;
|
|
41
|
+
this.trackByFunction = (index, item) => item[trackBy];
|
|
42
|
+
}
|
|
43
|
+
this.setUpSelections(trackBy);
|
|
44
|
+
}
|
|
45
|
+
get trackBy() { return this._trackBy; }
|
|
46
|
+
$displayData = input.required({ alias: 'displayData' });
|
|
47
|
+
$displayDataLength = computed(() => this.$displayData()?.length || 0);
|
|
48
|
+
$hasFooterMeta = computed(() => this.state.$metaDataArray().some(md => !!md.additional?.footer));
|
|
49
|
+
$data = input.required({ alias: 'data' });
|
|
50
|
+
data$ = toObservable(this.$data);
|
|
51
|
+
rows;
|
|
52
|
+
columnBuilders;
|
|
53
|
+
$columnInfos = input.required({ alias: 'columnInfos' });
|
|
54
|
+
$hasCustomFooter = computed(() => this.$columnInfos()?.some(ci => !!ci.customCell?.columnDef?.footerCell));
|
|
55
|
+
dropList;
|
|
56
|
+
$footerRowStyle = computed(() => {
|
|
57
|
+
const hasData = !!this.$displayDataLength();
|
|
58
|
+
const metaFooter = this.$hasFooterMeta();
|
|
59
|
+
const customFooter = this.$hasCustomFooter();
|
|
60
|
+
const hasSelectionColumn = this.state.props().selectionColumn;
|
|
61
|
+
return customFooter || (hasData && (metaFooter || hasSelectionColumn)) ? 'regular-footer' : hasData ? 'no-footer' : 'small-footer';
|
|
62
|
+
});
|
|
63
|
+
$showFooterRow = computed(() => this.$footerRowStyle() !== 'no-footer');
|
|
64
|
+
currentColumns;
|
|
65
|
+
_injector = inject(Injector);
|
|
66
|
+
injector = Injector.create({
|
|
67
|
+
providers: [
|
|
68
|
+
{ provide: MatTable, useFactory: () => this.$table() },
|
|
69
|
+
{ provide: CdkDropList, useFactory: () => this.dropList },
|
|
70
|
+
],
|
|
71
|
+
parent: this._injector
|
|
72
|
+
});
|
|
73
|
+
rowDefArr = [];
|
|
74
|
+
$hasSelectColumn = computed(() => this.state.selectSignal(state => state.props.selectionColumn)());
|
|
75
|
+
$hasIndexColumn = computed(() => this.state.selectSignal(state => state.props.indexColumn)());
|
|
76
|
+
myColumns = signal({});
|
|
77
|
+
$showHeader = computed(() => !this.state.tableSettings().hideColumnHeader);
|
|
78
|
+
offset$ = this.dataStore.select(s => s.virtualScrollOffset);
|
|
79
|
+
dataView;
|
|
80
|
+
constructor() {
|
|
81
|
+
this.setUpSelections();
|
|
82
|
+
effect(() => {
|
|
83
|
+
const columnInfos = this.$columnInfos() || [];
|
|
84
|
+
untracked(() => {
|
|
85
|
+
Object.entries(this.myColumns()).forEach(([key, value]) => {
|
|
86
|
+
const columnInfo = columnInfos.find(ci => ci.metaData.key === key);
|
|
87
|
+
if (!columnInfo || columnInfo.customCell !== value.customCell) {
|
|
88
|
+
delete this.myColumns()[key];
|
|
89
|
+
this.$table()?.removeColumnDef(value.columnDef);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
columnInfos.forEach(ci => this.addMetaData(ci));
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
effect(() => {
|
|
96
|
+
const headerRow = this.$headerRow();
|
|
97
|
+
const showHeader = this.$showHeader();
|
|
98
|
+
const table = this.$table();
|
|
99
|
+
untracked(() => {
|
|
100
|
+
if (headerRow && showHeader && table)
|
|
101
|
+
table.addHeaderRowDef(headerRow);
|
|
102
|
+
else if (headerRow && table)
|
|
103
|
+
table.removeHeaderRowDef(headerRow);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
effect(() => {
|
|
107
|
+
const footerRow = this.$footerRow();
|
|
108
|
+
const showFooter = this.$showFooterRow();
|
|
109
|
+
const table = this.$table();
|
|
110
|
+
untracked(() => {
|
|
111
|
+
if (footerRow && showFooter && table)
|
|
112
|
+
table.addFooterRowDef(footerRow);
|
|
113
|
+
else if (footerRow && table)
|
|
114
|
+
table.removeFooterRowDef(footerRow);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
defaultTrackBy = (index, item) => item[initIndexSymbol];
|
|
119
|
+
trackByFunction = this.defaultTrackBy;
|
|
120
|
+
ngOnChanges(changes) {
|
|
121
|
+
if (changes.rows && this.rows && this.myColumns().length) {
|
|
122
|
+
this.initializeRowDefs([...this.rows]);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
$keys = computed(() => {
|
|
126
|
+
const displayed = this.state.$orderedVisibleColumns();
|
|
127
|
+
const built = this.myColumns();
|
|
128
|
+
const keys = displayed.filter(d => !!built[d]);
|
|
129
|
+
if (this.$hasSelectColumn()) {
|
|
130
|
+
keys.unshift('select');
|
|
131
|
+
}
|
|
132
|
+
if (this.$hasIndexColumn()) {
|
|
133
|
+
keys.unshift('index');
|
|
134
|
+
}
|
|
135
|
+
return keys;
|
|
136
|
+
});
|
|
137
|
+
keys$ = toObservable(this.$keys);
|
|
138
|
+
ngOnInit() {
|
|
139
|
+
this.initializeRowDefs([...this.rows]);
|
|
140
|
+
this.state.on(this.keys$, keys => {
|
|
141
|
+
this.rowDefArr?.forEach(row => row.columns = keys);
|
|
142
|
+
});
|
|
143
|
+
this.state.on(this.selectableData$, (data) => {
|
|
144
|
+
if (this.selection.selected.length) {
|
|
145
|
+
const trackByFunction = this.trackBy ? (s) => data.every(d => d[this.trackBy] !== s[this.trackBy]) : s => !data.includes(s);
|
|
146
|
+
const removed = this.selection.selected.filter(trackByFunction);
|
|
147
|
+
this.selection.deselect(...removed);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
$usePaginator = computed(() => this.state.tableSettings().usePaginator);
|
|
152
|
+
$useVirtualScroll = computed(() => this.state.$viewType().includes('virtual'));
|
|
153
|
+
$offsetIndex = computed(() => {
|
|
154
|
+
const virtualStart = this.dataStore.selectSignal(d => d.virtualEnds.start)();
|
|
155
|
+
const pageSize = this.state.$pageSize();
|
|
156
|
+
const currentPage = this.state.$currentPage();
|
|
157
|
+
if (this.$useVirtualScroll()) {
|
|
158
|
+
return virtualStart;
|
|
159
|
+
}
|
|
160
|
+
if (this.$usePaginator()) {
|
|
161
|
+
return pageSize * currentPage;
|
|
162
|
+
}
|
|
163
|
+
return 0;
|
|
164
|
+
});
|
|
165
|
+
isGroupHeader(_, row) {
|
|
166
|
+
return row.isGroupHeader;
|
|
167
|
+
}
|
|
168
|
+
setExpanded(key, groupKey, isExpanded) {
|
|
169
|
+
this.state.updateExpandedGroups({ key, isExpanded, groupKey });
|
|
170
|
+
}
|
|
171
|
+
addMetaData(column) {
|
|
172
|
+
const columnBuilder = this.myColumns()[column.metaData.key];
|
|
173
|
+
if (columnBuilder) {
|
|
174
|
+
columnBuilder.metaData = column.metaData;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
const component = this.viewContainer.createComponent(ColumnBuilderComponent, {
|
|
178
|
+
index: 0,
|
|
179
|
+
injector: this.injector
|
|
180
|
+
});
|
|
181
|
+
component.instance.customCell = column.customCell;
|
|
182
|
+
component.instance.metaData = column.metaData;
|
|
183
|
+
component.instance.data$ = this.data$;
|
|
184
|
+
this.myColumns.update(mc => ({ ...mc, [column.metaData.key]: component.instance }));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
initializeRowDefs = (defs) => {
|
|
188
|
+
const table = this.$table();
|
|
189
|
+
if (!table)
|
|
190
|
+
return;
|
|
191
|
+
this.rowDefArr.forEach(r => table.removeRowDef(r));
|
|
192
|
+
this.rowDefArr = defs;
|
|
193
|
+
defs.forEach(r => {
|
|
194
|
+
r.columns = this.$keys().concat(Object.values(this.myColumns()).filter(c => c.metaData.fieldType !== FieldType.Hidden).map(c => c.metaData.key));
|
|
195
|
+
table.addRowDef(r);
|
|
196
|
+
});
|
|
197
|
+
};
|
|
198
|
+
selection;
|
|
199
|
+
selection$ = new EventEmitter();
|
|
200
|
+
masterToggleChecked$ = this.selection$.pipe(map(() => this.selection.hasValue() && this.isAllSelected()));
|
|
201
|
+
masterToggleIndeterminate$ = this.selection$.pipe(map(() => this.selection.hasValue() && !this.isAllSelected()));
|
|
202
|
+
setUpSelections(trackBy) {
|
|
203
|
+
this.selection = trackBy ? new SelectionModel(true, [], true, (a, b) => a[trackBy] === b[trackBy]) : new SelectionModel(true, []);
|
|
204
|
+
this.state.on(this.selection.changed, c => this.selection$.emit(c));
|
|
205
|
+
}
|
|
206
|
+
$selectableData = computed(() => {
|
|
207
|
+
if (this.state.$viewType() === 'virtual paginator' || this.state.$viewType() === 'paginator') {
|
|
208
|
+
const previousPageRecords = this.state.$currentPage() * this.state.$pageSize();
|
|
209
|
+
return this.$data().slice(previousPageRecords, previousPageRecords + this.state.$pageSize());
|
|
210
|
+
}
|
|
211
|
+
else if (this.state.$viewType() === 'all' || this.state.$viewType() === 'virtual all') {
|
|
212
|
+
return this.$data();
|
|
213
|
+
}
|
|
214
|
+
return [];
|
|
215
|
+
});
|
|
216
|
+
selectableData$ = toObservable(this.$selectableData);
|
|
217
|
+
isAllSelected() {
|
|
218
|
+
const numSelected = this.selection.selected.length;
|
|
219
|
+
const numRows = this.$selectableData()?.length || 0;
|
|
220
|
+
return numSelected === numRows;
|
|
221
|
+
}
|
|
222
|
+
/** Selects all rows if they are not all selected; otherwise clear selection. */
|
|
223
|
+
masterToggle() {
|
|
224
|
+
if (this.isAllSelected()) {
|
|
225
|
+
this.selection.clear();
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
this.selection.select(...this.$selectableData());
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
tableWidth = this.state.getUserDefinedTableSize$.pipe(previousAndCurrent(0), map(([previousUserDefinedWidth, currentUserDefinedWidth]) => {
|
|
232
|
+
if (currentUserDefinedWidth) {
|
|
233
|
+
return ({ width: `${currentUserDefinedWidth}px` });
|
|
234
|
+
}
|
|
235
|
+
if (wasReset()) {
|
|
236
|
+
return ({ width: 'initial' });
|
|
237
|
+
}
|
|
238
|
+
return ({});
|
|
239
|
+
function wasReset() {
|
|
240
|
+
return (previousUserDefinedWidth ?? 0) >= 0 && currentUserDefinedWidth == null;
|
|
241
|
+
}
|
|
242
|
+
}));
|
|
243
|
+
getTransform = (key, val) => {
|
|
244
|
+
if (val == undefined || val === 'null')
|
|
245
|
+
return '';
|
|
246
|
+
try {
|
|
247
|
+
return this.transformCreator.createTransformer(this.myColumns[key].metaData, true)({ [key]: val });
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
return val;
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
$rowHeight = this.state.selectSignal(s => {
|
|
254
|
+
if (this.state.$isVirtual() && s.notPersistedTableSettings.useVirtualScroll?.enforceRowHeight) {
|
|
255
|
+
const height = s.notPersistedTableSettings.useVirtualScroll.rowHeight;
|
|
256
|
+
return height + 'px';
|
|
257
|
+
}
|
|
258
|
+
if (typeof s.notPersistedTableSettings.rowHeight === 'number') {
|
|
259
|
+
return s.notPersistedTableSettings.rowHeight + 'px';
|
|
260
|
+
}
|
|
261
|
+
return s.notPersistedTableSettings.rowHeight;
|
|
262
|
+
});
|
|
263
|
+
$headerHeight = this.state.selectSignal(s => {
|
|
264
|
+
if (this.state.$isVirtual() && s.notPersistedTableSettings.useVirtualScroll?.enforceHeaderHeight) {
|
|
265
|
+
const height = s.notPersistedTableSettings.useVirtualScroll.headerHeight;
|
|
266
|
+
return height + 'px';
|
|
267
|
+
}
|
|
268
|
+
if (typeof s.notPersistedTableSettings.headerHeight === 'number') {
|
|
269
|
+
return s.notPersistedTableSettings.headerHeight + 'px';
|
|
270
|
+
}
|
|
271
|
+
return s.notPersistedTableSettings.headerHeight;
|
|
272
|
+
});
|
|
273
|
+
$groupHeaderHeight = this.state.selectSignal(s => {
|
|
274
|
+
if (s.notPersistedTableSettings.groupHeaderHeight) {
|
|
275
|
+
return s.notPersistedTableSettings.groupHeaderHeight + 'px';
|
|
276
|
+
}
|
|
277
|
+
return this.$rowHeight();
|
|
278
|
+
});
|
|
279
|
+
$stickyFooter = computed(() => this.state.props().stickyFooter || this.state.$isVirtual());
|
|
280
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenericTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
281
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: false, isRequired: false, transformFunction: null }, $displayData: { classPropertyName: "$displayData", publicName: "displayData", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: false, isRequired: false, transformFunction: null }, columnBuilders: { classPropertyName: "columnBuilders", publicName: "columnBuilders", isSignal: false, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selection$: "selection$" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "dropList", first: true, predicate: CdkDropList, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}mat-table{overflow-x:auto}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: FunctionPipe, name: "func" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
282
|
+
}
|
|
283
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenericTableComponent, decorators: [{
|
|
284
|
+
type: Component,
|
|
285
|
+
args: [{ selector: 'tb-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
286
|
+
MatTableModule, DragDropModule, MatCheckboxModule, MatButtonModule, MatIconModule, NgTemplateOutlet,
|
|
287
|
+
MatTooltipModule, AsyncPipe, FunctionPipe,
|
|
288
|
+
], template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}mat-table{overflow-x:auto}\n"] }]
|
|
289
|
+
}], ctorParameters: () => [], propDecorators: { trackBy: [{
|
|
290
|
+
type: Input
|
|
291
|
+
}], rows: [{
|
|
292
|
+
type: Input
|
|
293
|
+
}], columnBuilders: [{
|
|
294
|
+
type: Input
|
|
295
|
+
}], dropList: [{
|
|
296
|
+
type: ViewChild,
|
|
297
|
+
args: [CdkDropList, { static: true }]
|
|
298
|
+
}], selection$: [{
|
|
299
|
+
type: Output
|
|
300
|
+
}] } });
|
|
301
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFvQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4TyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBYSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEgsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXBGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVsRSxPQUFPLEVBQWUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdC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aUJBQWlCLG9ZQUFFLGVBQWUsMklBQUUsYUFBYSxvTEFBRSxnQkFBZ0IsbUpBQ25HLGdCQUFnQiwwQkFBRSxTQUFTLHlDQUFFLFlBQVk7OzJGQUdoQyxxQkFBcUI7a0JBWGpDLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLGNBQWMsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0I7d0JBQ25HLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxZQUFZO3FCQUMxQzt3REFnQlksT0FBTztzQkFBbkIsS0FBSztnQkFhRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFHb0MsUUFBUTtzQkFBakQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQXNKOUIsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDb250YWluZXJSZWYsIEluamVjdG9yLCBFdmVudEVtaXR0ZXIsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCB2aWV3Q2hpbGQsIGVmZmVjdCwgdW50cmFja2VkLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9vdGVyUm93RGVmLCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvd0RlZiwgTWF0VGFibGUsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbkNoYW5nZSwgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBUYWJsZVN0b3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90YWJsZS1zdG9yZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbi1idWlsZGVyL2NvbHVtbi1idWlsZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpY3Rpb25hcnknO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1kZWYnO1xyXG5pbXBvcnQgeyBwcmV2aW91c0FuZEN1cnJlbnQgfSBmcm9tICcuLi8uLi8uLi9yeGpzL3J4anMtb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQ29sdW1uSW5mbyc7XHJcbmltcG9ydCB7IENka0RyYWdEcm9wLCBDZGtEcm9wTGlzdCwgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgRnVuY3Rpb25QaXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBUcmFuc2Zvcm1DcmVhdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNmb3JtLWNyZWF0b3InO1xyXG5pbXBvcnQgeyBpbml0SW5kZXhTeW1ib2wgfSBmcm9tICcuLi90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmhlbHBlcnMvc29ydC1zdGF0ZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgVmlydHVhbFNjcm9sbE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLWJ1aWxkZXItZ2VuZXJhbC1zZXR0aW5ncyc7XHJcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgRGF0YVN0b3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9kYXRhLXN0b3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGItZ2VuZXJpYy10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdFRhYmxlTW9kdWxlLCBEcmFnRHJvcE1vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsIEFzeW5jUGlwZSwgRnVuY3Rpb25QaXBlLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHByb3RlY3RlZCBzdGF0ZSA9IGluamVjdChUYWJsZVN0b3JlKTtcclxuICBwcml2YXRlIGRhdGFTdG9yZSA9IGluamVjdChEYXRhU3RvcmUpO1xyXG4gIHByaXZhdGUgdmlld0NvbnRhaW5lciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcclxuICBwcml2YXRlIHRyYW5zZm9ybUNyZWF0b3IgPSBpbmplY3QoVHJhbnNmb3JtQ3JlYXRvcik7XHJcblxyXG4gICRoZWFkZXJSb3cgPSB2aWV3Q2hpbGQoTWF0SGVhZGVyUm93RGVmKTtcclxuICAkZm9vdGVyUm93ID0gdmlld0NoaWxkKE1hdEZvb3RlclJvd0RlZik7XHJcbiAgJHRhYmxlID0gdmlld0NoaWxkKE1hdFRhYmxlKTtcclxuXHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICB0aGlzLnN0YXRlLnNldFVzZXJEZWZpbmVkT3JkZXIoeyBuZXdPcmRlcjpldmVudC5jdXJyZW50SW5kZXgsIG9sZE9yZGVyOmV2ZW50LnByZXZpb3VzSW5kZXggfSlcclxuICB9XHJcbiAgX3RyYWNrQnk/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2V0IHRyYWNrQnkodHJhY2tCeTogc3RyaW5nKXtcclxuICAgIGlmKHRyYWNrQnkpe1xyXG4gICAgICB0aGlzLl90cmFja0J5ID0gdHJhY2tCeTtcclxuICAgICAgdGhpcy50cmFja0J5RnVuY3Rpb24gPSAoaW5kZXg6bnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW1bdHJhY2tCeV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFVwU2VsZWN0aW9ucyh0cmFja0J5KTtcclxuICB9XHJcbiAgZ2V0IHRyYWNrQnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3RyYWNrQnkgfVxyXG4gICRkaXNwbGF5RGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGlzcGxheURhdGEnIH0pO1xyXG4gICRkaXNwbGF5RGF0YUxlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuJGRpc3BsYXlEYXRhKCk/Lmxlbmd0aCB8fCAwKTtcclxuICAkaGFzRm9vdGVyTWV0YSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUuJG1ldGFEYXRhQXJyYXkoKS5zb21lKG1kID0+ICEhbWQuYWRkaXRpb25hbD8uZm9vdGVyKSlcclxuICAkZGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGF0YScgfSlcclxuICBkYXRhJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLiRkYXRhKTtcclxuICBASW5wdXQoKSByb3dzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxhbnk+PjtcclxuICBASW5wdXQoKSBjb2x1bW5CdWlsZGVycyE6IENvbHVtbkJ1aWxkZXJDb21wb25lbnRbXTtcclxuICAkY29sdW1uSW5mb3MgPSBpbnB1dC5yZXF1aXJlZDxDb2x1bW5JbmZvW10+KHsgYWxpYXM6ICdjb2x1bW5JbmZvcycgfSk7XHJcbiAgJGhhc0N1c3RvbUZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuJGNvbHVtbkluZm9zKCk/LnNvbWUoY2kgPT4gISFjaS5jdXN0b21DZWxsPy5jb2x1bW5EZWY/LmZvb3RlckNlbGwpKVxyXG4gIEBWaWV3Q2hpbGQoQ2RrRHJvcExpc3QsIHsgc3RhdGljOiB0cnVlIH0pIGRyb3BMaXN0ITogQ2RrRHJvcExpc3Q7XHJcbiAgJGZvb3RlclJvd1N0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgaGFzRGF0YSA9ICEhdGhpcy4kZGlzcGxheURhdGFMZW5ndGgoKTtcclxuICAgIGNvbnN0IG1ldGFGb290ZXIgPSB0aGlzLiRoYXNGb290ZXJNZXRhKCk7XHJcbiAgICBjb25zdCBjdXN0b21Gb290ZXIgPSB0aGlzLiRoYXNDdXN0b21Gb290ZXIoKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbkNvbHVtbiA9IHRoaXMuc3RhdGUucHJvcHMoKS5zZWxlY3Rpb25Db2x1bW47XHJcbiAgICByZXR1cm4gY3VzdG9tRm9vdGVyIHx8IChoYXNEYXRhICYmIChtZXRhRm9vdGVyIHx8IGhhc1NlbGVjdGlvbkNvbHVtbikpID8gJ3JlZ3VsYXItZm9vdGVyJyA6IGhhc0RhdGEgPyAnbm8tZm9vdGVyJyA6ICdzbWFsbC1mb290ZXInO1xyXG4gIH0pO1xyXG4gICRzaG93Rm9vdGVyUm93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4kZm9vdGVyUm93U3R5bGUoKSAhPT0gJ25vLWZvb3RlcicpO1xyXG4gIGN1cnJlbnRDb2x1bW5zITogc3RyaW5nW107XHJcbiAgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuICBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAge3Byb3ZpZGU6IE1hdFRhYmxlLCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuJHRhYmxlKCkgfSxcclxuICAgICAge3Byb3ZpZGU6IENka0Ryb3BMaXN0LCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuZHJvcExpc3QgfSxcclxuICAgIF0sXHJcbiAgICBwYXJlbnQ6IHRoaXMuX2luamVjdG9yXHJcbiAgfSk7XHJcbiAgcm93RGVmQXJyIDpNYXRSb3dEZWY8YW55PltdID0gW107XHJcbiAgJGhhc1NlbGVjdENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHN0YXRlID0+IHN0YXRlLnByb3BzLnNlbGVjdGlvbkNvbHVtbikoKSk7XHJcbiAgJGhhc0luZGV4Q29sdW1uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwoc3RhdGUgPT4gc3RhdGUucHJvcHMuaW5kZXhDb2x1bW4pKCkpO1xyXG4gIG15Q29sdW1ucyA9IHNpZ25hbDxEaWN0aW9uYXJ5PENvbHVtbkJ1aWxkZXJDb21wb25lbnQ+Pih7fSk7XHJcbiAgJHNob3dIZWFkZXIgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzKCkuaGlkZUNvbHVtbkhlYWRlcilcclxuICBvZmZzZXQkID0gdGhpcy5kYXRhU3RvcmUuc2VsZWN0KCBzID0+IHMudmlydHVhbFNjcm9sbE9mZnNldCApO1xyXG4gIGRhdGFWaWV3ITogT2JzZXJ2YWJsZTxhbnlbXT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5zZXRVcFNlbGVjdGlvbnMoKTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkluZm9zID0gdGhpcy4kY29sdW1uSW5mb3MoKSB8fCBbXTtcclxuICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm15Q29sdW1ucygpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkluZm8gPSBjb2x1bW5JbmZvcy5maW5kKGNpID0+IGNpLm1ldGFEYXRhLmtleSA9PT0ga2V5KTtcclxuICAgICAgICAgIGlmKCFjb2x1bW5JbmZvIHx8IGNvbHVtbkluZm8uY3VzdG9tQ2VsbCAhPT0gdmFsdWUuY3VzdG9tQ2VsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5teUNvbHVtbnMoKVtrZXldO1xyXG4gICAgICAgICAgICB0aGlzLiR0YWJsZSgpPy5yZW1vdmVDb2x1bW5EZWYodmFsdWUuY29sdW1uRGVmKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbHVtbkluZm9zLmZvckVhY2goY2kgPT4gdGhpcy5hZGRNZXRhRGF0YShjaSkpXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMuJGhlYWRlclJvdygpO1xyXG4gICAgICBjb25zdCBzaG93SGVhZGVyID0gdGhpcy4kc2hvd0hlYWRlcigpO1xyXG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMuJHRhYmxlKCk7XHJcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XHJcbiAgICAgICAgaWYoaGVhZGVyUm93ICYmIHNob3dIZWFkZXIgJiYgdGFibGUpIHRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3cpO1xyXG4gICAgICAgIGVsc2UgaWYoaGVhZGVyUm93ICYmIHRhYmxlKSB0YWJsZS5yZW1vdmVIZWFkZXJSb3dEZWYoaGVhZGVyUm93KTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgY29uc3QgZm9vdGVyUm93ID0gdGhpcy4kZm9vdGVyUm93KCk7XHJcbiAgICAgIGNvbnN0IHNob3dGb290ZXIgPSB0aGlzLiRzaG93Rm9vdGVyUm93KCk7XHJcbiAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy4kdGFibGUoKTtcclxuICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICBpZihmb290ZXJSb3cgJiYgc2hvd0Zvb3RlciAmJiB0YWJsZSkgdGFibGUuYWRkRm9vdGVyUm93RGVmKGZvb3RlclJvdyk7XHJcbiAgICAgICAgZWxzZSBpZihmb290ZXJSb3cgJiYgdGFibGUpIHRhYmxlLnJlbW92ZUZvb3RlclJvd0RlZihmb290ZXJSb3cpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0VHJhY2tCeSA9IChpbmRleDpudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbVtpbml0SW5kZXhTeW1ib2xdO1xyXG4gIHRyYWNrQnlGdW5jdGlvbiA9IHRoaXMuZGVmYXVsdFRyYWNrQnk7XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMucm93cyAmJiB0aGlzLnJvd3MgJiYgdGhpcy5teUNvbHVtbnMoKS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gICRrZXlzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgZGlzcGxheWVkID0gdGhpcy5zdGF0ZS4kb3JkZXJlZFZpc2libGVDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBidWlsdCA9IHRoaXMubXlDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBrZXlzID0gZGlzcGxheWVkLmZpbHRlcihkID0+ICEhYnVpbHRbZF0pO1xyXG4gICAgaWYodGhpcy4kaGFzU2VsZWN0Q29sdW1uKCkpe1xyXG4gICAgICBrZXlzLnVuc2hpZnQoJ3NlbGVjdCcpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy4kaGFzSW5kZXhDb2x1bW4oKSkge1xyXG4gICAgICBrZXlzLnVuc2hpZnQoJ2luZGV4Jyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9KVxyXG4gIGtleXMkID0gdG9PYnNlcnZhYmxlKHRoaXMuJGtleXMpO1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5vbih0aGlzLmtleXMkLCBrZXlzID0+IHtcclxuICAgICAgdGhpcy5yb3dEZWZBcnI/LmZvckVhY2gocm93ID0+IHJvdy5jb2x1bW5zID0ga2V5cylcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5zZWxlY3RhYmxlRGF0YSQsIChkYXRhKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCl7XHJcbiAgICAgICAgY29uc3QgdHJhY2tCeUZ1bmN0aW9uID0gdGhpcy50cmFja0J5ID8gKHMpID0+IGRhdGEuZXZlcnkoZCA9PiAgZFt0aGlzLnRyYWNrQnkhXSAhPT0gc1t0aGlzLnRyYWNrQnkhXSkgOiBzID0+ICFkYXRhLmluY2x1ZGVzKHMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5maWx0ZXIodHJhY2tCeUZ1bmN0aW9uKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdCguLi5yZW1vdmVkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgJHVzZVBhZ2luYXRvciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUudGFibGVTZXR0aW5ncygpLnVzZVBhZ2luYXRvcik7XHJcbiAgJHVzZVZpcnR1YWxTY3JvbGwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpLmluY2x1ZGVzKCd2aXJ0dWFsJykpO1xyXG4gICRvZmZzZXRJbmRleCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHZpcnR1YWxTdGFydCA9IHRoaXMuZGF0YVN0b3JlLnNlbGVjdFNpZ25hbChkID0+IGQudmlydHVhbEVuZHMuc3RhcnQpKCk7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuc3RhdGUuJHBhZ2VTaXplKCk7XHJcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuc3RhdGUuJGN1cnJlbnRQYWdlKCk7XHJcbiAgICBpZih0aGlzLiR1c2VWaXJ0dWFsU2Nyb2xsKCkpe1xyXG4gICAgICByZXR1cm4gdmlydHVhbFN0YXJ0O1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy4kdXNlUGFnaW5hdG9yKCkpe1xyXG4gICAgICByZXR1cm4gcGFnZVNpemUgKiBjdXJyZW50UGFnZTtcclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH0pO1xyXG5cclxuXHJcbiAgaXNHcm91cEhlYWRlcihfOiBudW1iZXIsIHJvdzogeyBpc0dyb3VwSGVhZGVyOiBib29sZWFuIH0pIHtcclxuICAgIHJldHVybiByb3cuaXNHcm91cEhlYWRlcjtcclxuICB9XHJcblxyXG4gIHNldEV4cGFuZGVkKGtleTogc3RyaW5nLCBncm91cEtleTogc3RyaW5nLCBpc0V4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZUV4cGFuZGVkR3JvdXBzKHsga2V5ICwgaXNFeHBhbmRlZCwgZ3JvdXBLZXkgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRNZXRhRGF0YShjb2x1bW46IENvbHVtbkluZm8pIHtcclxuICAgIGNvbnN0IGNvbHVtbkJ1aWxkZXIgPSB0aGlzLm15Q29sdW1ucygpW2NvbHVtbi5tZXRhRGF0YS5rZXldO1xyXG4gICAgaWYoY29sdW1uQnVpbGRlcikge1xyXG4gICAgICBjb2x1bW5CdWlsZGVyLm1ldGFEYXRhID0gY29sdW1uLm1ldGFEYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChDb2x1bW5CdWlsZGVyQ29tcG9uZW50LCB7XHJcbiAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3JcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5jdXN0b21DZWxsID0gY29sdW1uLmN1c3RvbUNlbGw7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5tZXRhRGF0YSA9IGNvbHVtbi5tZXRhRGF0YTtcclxuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLmRhdGEkID0gdGhpcy5kYXRhJDtcclxuICAgICAgdGhpcy5teUNvbHVtbnMudXBkYXRlKG1jID0+ICh7Li4ubWMsIFtjb2x1bW4ubWV0YURhdGEua2V5XTogY29tcG9uZW50Lmluc3RhbmNlfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZVJvd0RlZnMgPSAoZGVmczpNYXRSb3dEZWY8YW55PltdKT0+e1xyXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLiR0YWJsZSgpO1xyXG4gICAgaWYoIXRhYmxlKSByZXR1cm47XHJcbiAgICB0aGlzLnJvd0RlZkFyci5mb3JFYWNoKHI9PiB0YWJsZS5yZW1vdmVSb3dEZWYocikpO1xyXG4gICAgdGhpcy5yb3dEZWZBcnIgPSBkZWZzO1xyXG4gICAgZGVmcy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICByLmNvbHVtbnMgPSB0aGlzLiRrZXlzKCkuY29uY2F0KE9iamVjdC52YWx1ZXModGhpcy5teUNvbHVtbnMoKSkuZmlsdGVyKGMgPT4gYy5tZXRhRGF0YS5maWVsZFR5cGUgIT09IEZpZWxkVHlwZS5IaWRkZW4pLm1hcChjID0+IGMubWV0YURhdGEua2V5KSk7XHJcbiAgICAgIHRhYmxlLmFkZFJvd0RlZihyKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb24hIDogU2VsZWN0aW9uTW9kZWw8YW55PjtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uJCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlPGFueT4+KCk7XHJcbiAgbWFzdGVyVG9nZ2xlQ2hlY2tlZCQgPSB0aGlzLnNlbGVjdGlvbiQucGlwZShtYXAoKCk9PnRoaXMuc2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgdGhpcy5pc0FsbFNlbGVjdGVkKCkpKTtcclxuICBtYXN0ZXJUb2dnbGVJbmRldGVybWluYXRlJCA9IHRoaXMuc2VsZWN0aW9uJC5waXBlKG1hcCgoKT0+dGhpcy5zZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhdGhpcy5pc0FsbFNlbGVjdGVkKCkpKTtcclxuICBzZXRVcFNlbGVjdGlvbnModHJhY2tCeT86IHN0cmluZyl7XHJcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHRyYWNrQnkgPyBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSwgdHJ1ZSwgKGEsIGIpID0+IGFbdHJhY2tCeV0gPT09IGJbdHJhY2tCeV0pIDogbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xyXG4gICAgdGhpcy5zdGF0ZS5vbih0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLCBjID0+IHRoaXMuc2VsZWN0aW9uJC5lbWl0KGMpKTtcclxuICB9XHJcbiAgJHNlbGVjdGFibGVEYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYodGhpcy5zdGF0ZS4kdmlld1R5cGUoKSA9PT0gJ3ZpcnR1YWwgcGFnaW5hdG9yJyB8fCB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAncGFnaW5hdG9yJyl7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzUGFnZVJlY29yZHMgPSB0aGlzLnN0YXRlLiRjdXJyZW50UGFnZSgpICogdGhpcy5zdGF0ZS4kcGFnZVNpemUoKTtcclxuICAgICAgcmV0dXJuIHRoaXMuJGRhdGEoKS5zbGljZShwcmV2aW91c1BhZ2VSZWNvcmRzLCBwcmV2aW91c1BhZ2VSZWNvcmRzICsgdGhpcy5zdGF0ZS4kcGFnZVNpemUoKSk7XHJcbiAgICB9ZWxzZSBpZih0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAnYWxsJyB8fCB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAndmlydHVhbCBhbGwnKXtcclxuICAgICAgcmV0dXJuIHRoaXMuJGRhdGEoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9KTtcclxuICBzZWxlY3RhYmxlRGF0YSQgPSB0b09ic2VydmFibGUodGhpcy4kc2VsZWN0YWJsZURhdGEpO1xyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLiRzZWxlY3RhYmxlRGF0YSgpPy5sZW5ndGggfHwgMDtcclxuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcclxuICB9XHJcblxyXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXHJcbiAgbWFzdGVyVG9nZ2xlKCkge1xyXG4gICAgaWYodGhpcy5pc0FsbFNlbGVjdGVkKCkpe1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoLi4udGhpcy4kc2VsZWN0YWJsZURhdGEoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0YWJsZVdpZHRoID0gdGhpcy5zdGF0ZS5nZXRVc2VyRGVmaW5lZFRhYmxlU2l6ZSQucGlwZShcclxuICAgIHByZXZpb3VzQW5kQ3VycmVudDxudW1iZXIgfCB1bmRlZmluZWQ+KDApLFxyXG4gICAgbWFwKChbcHJldmlvdXNVc2VyRGVmaW5lZFdpZHRoLCBjdXJyZW50VXNlckRlZmluZWRXaWR0aF0pID0+IHtcclxuICAgICAgaWYoIGN1cnJlbnRVc2VyRGVmaW5lZFdpZHRoKXtcclxuICAgICAgICByZXR1cm4gKHt3aWR0aDpgJHtjdXJyZW50VXNlckRlZmluZWRXaWR0aH1weGB9KTtcclxuICAgICAgfSBpZiggd2FzUmVzZXQoKSApe1xyXG4gICAgICAgIHJldHVybiAoe3dpZHRoOidpbml0aWFsJ30pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoe30pO1xyXG5cclxuICAgICAgZnVuY3Rpb24gd2FzUmVzZXQoKXtcclxuICAgICAgICByZXR1cm4gKHByZXZpb3VzVXNlckRlZmluZWRXaWR0aCA/PyAwKSA+PTAgJiYgY3VycmVudFVzZXJEZWZpbmVkV2lkdGggPT0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBnZXRUcmFuc2Zvcm0gPSAoa2V5OiBzdHJpbmcsIHZhbDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZih2YWwgPT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJ251bGwnKSByZXR1cm4gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1DcmVhdG9yLmNyZWF0ZVRyYW5zZm9ybWVyKHRoaXMubXlDb2x1bW5zW2tleV0ubWV0YURhdGEsIHRydWUpKHsgW2tleV06IHZhbH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICRyb3dIZWlnaHQgPSB0aGlzLnN0YXRlLnNlbGVjdFNpZ25hbChzID0+IHtcclxuICAgICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZVJvd0hlaWdodCl7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKSEucm93SGVpZ2h0O1xyXG4gICAgICAgIHJldHVybiBoZWlnaHQgKyAncHgnIDtcclxuICAgICAgfVxyXG4gICAgICBpZih0eXBlb2Ygcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnJvd0hlaWdodCA9PT0gJ251bWJlcicpe1xyXG4gICAgICAgIHJldHVybiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3Mucm93SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnJvd0hlaWdodDtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgJGhlYWRlckhlaWdodCA9IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHMgPT4ge1xyXG4gICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZUhlYWRlckhlaWdodCl7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IChzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MudXNlVmlydHVhbFNjcm9sbCBhcyBWaXJ0dWFsU2Nyb2xsT3B0aW9ucykhLmhlYWRlckhlaWdodDtcclxuICAgICAgcmV0dXJuIGhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICBpZih0eXBlb2Ygcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodCA9PT0gJ251bWJlcicpe1xyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodDtcclxuICB9KTtcclxuXHJcbiAgJGdyb3VwSGVhZGVySGVpZ2h0ID0gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwocyA9PiB7XHJcbiAgICBpZihzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuZ3JvdXBIZWFkZXJIZWlnaHQpe1xyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLiRyb3dIZWlnaHQoKTtcclxuICB9KTtcclxuXHJcbiAgJHN0aWNreUZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUucHJvcHMoKS5zdGlja3lGb290ZXIgfHwgdGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkpO1xyXG59XHJcbiIsIjxtYXQtdGFibGVcclxuICBjZGtEcm9wTGlzdFxyXG4gIGNka0Ryb3BMaXN0TG9ja0F4aXM9J3gnXHJcbiAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxyXG4gIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcclxuICBjbGFzcz1cInRhYmxlLWRyYWctbGlzdFwiXHJcbiAgW2NsYXNzXT1cIigkZm9vdGVyUm93U3R5bGUoKSlcIlxyXG4gICN0YWJsZVxyXG4gIFtkYXRhU291cmNlXT1cInN0YXRlLnByb3BzKCkuZGF0YVNvdXJjZSFcIlxyXG4gIFt0cmFja0J5XT1cInRyYWNrQnlGdW5jdGlvblwiXHJcbiAgW3N0eWxlXT1cInRhYmxlV2lkdGggfCBhc3luYyBcIlxyXG4+XHJcblxyXG4gIDwhLS0gc2VsZWN0IGNvbHVtbiAtLT5cclxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxyXG5cclxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgIGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxyXG4gICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIShtYXN0ZXJUb2dnbGVDaGVja2VkJCB8IGFzeW5jKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwibWFzdGVyVG9nZ2xlSW5kZXRlcm1pbmF0ZSQgfCBhc3luY1wiPlxyXG4gICAgICA8L21hdC1jaGVja2JveD5cclxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG5cclxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cclxuICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiLz5cclxuICAgIDwvbWF0LWNlbGw+XHJcblxyXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cclxuICAgICAge3sgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCB9fVxyXG4gICAgPC9tYXQtZm9vdGVyLWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICA8IS0tIGluZGV4IGNvbHVtbiAtLT5cclxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XHJcbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiZi1tYXQtaGVhZGVyLWNlbGxcIiBjbGFzcz1cImluZGV4LWNvbHVtblwiPiNcclxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cImluZGV4LWNvbHVtblwiPlxyXG4gICAgICB7eyAxICsgaSArICRvZmZzZXRJbmRleCgpIH19XHJcbiAgICA8L21hdC1jZWxsPlxyXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cImluZGV4LWNvbHVtblwiPjwvbWF0LWZvb3Rlci1jZWxsPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEdyb3VwaW5nIC0tPlxyXG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cclxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgQGxldCBleHBhbmRlZCA9IChzdGF0ZS5nZXRJc0V4cGFuZGVkIHwgZnVuYyA6IHJvdy5rZXkgOiByb3cuZ3JvdXBOYW1lICk7XHJcbiAgICAgIDxkaXYgW3N0eWxlLnBhZGRpbmdMZWZ0XT1cInJvdy5wYWRkaW5nICsgJ3B4ICFpbXBvcnRhbnQnXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNldEV4cGFuZGVkKHJvdy5rZXksIHJvdy5ncm91cE5hbWUsICFleHBhbmRlZCgpKTtcIj5cclxuICAgICAgICAgIEBpZiAoIWV4cGFuZGVkKCkpIHtcclxuICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAge3sgZ2V0VHJhbnNmb3JtIHwgZnVuYyA6IHJvdy5rZXkgOiAgcm93Lmdyb3VwSGVhZGVyRGlzcGxheSB9fSAoe3sgcm93Lmxlbmd0aCB9fSlcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWdyb3c6IDFcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhdGUucHJvcHMoKS5ncm91cEhlYWRlclRlbXBsYXRlITsgY29udGV4dDogeyBlbGVtZW50OiByb3cgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxtYXQtcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogJGtleXMoKTsgbGV0IGkgPSBpbmRleFwiLz5cclxuICA8bWF0LXJvdyBbc3R5bGUuaGVpZ2h0XT1cInN0YXRlLnByb3BzKCkuZ3JvdXBIZWFkZXJIZWlnaHQgPyBzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JyA6ICRncm91cEhlYWRlckhlaWdodCgpXCJcclxuICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodF09XCJzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ID8gc3RhdGUucHJvcHMoKS5ncm91cEhlYWRlckhlaWdodCArICdweCcgOiAkZ3JvdXBIZWFkZXJIZWlnaHQoKVwiXHJcbiAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cEhlYWRlclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIvPlxyXG48L21hdC10YWJsZT5cclxuXHJcbjxtYXQtaGVhZGVyLXJvdyBbc3R5bGUuaGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiIFtzdHlsZS5taW4taGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiXHJcbiAgKm1hdEhlYWRlclJvd0RlZj1cIiRrZXlzKCk7IHN0aWNreTogc3RhdGUucHJvcHMoKS5pc1N0aWNreVwiIFtzdHlsZS50b3AucHhdPVwiKChvZmZzZXQkIHwgYXN5bmMpISAqIC0xKVwiLz5cclxuPG1hdC1mb290ZXItcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAqbWF0Rm9vdGVyUm93RGVmPVwiJGtleXMoKTsgc3RpY2t5OiAkc3RpY2t5Rm9vdGVyKCkgXCJcclxuICBbc3R5bGUuYm90dG9tLnB4XT1cIiRzdGlja3lGb290ZXIoKSA/IChvZmZzZXQkIHwgYXN5bmMpIDogdW5kZWZpbmVkXCIvPiJdfQ==
|