@unifylib/ui-lib 1.1.3 → 1.1.4
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/esm2022/iq-ui-lib.mjs +5 -0
- package/esm2022/lib/base-model/SearchStrConfig.mjs +11 -0
- package/esm2022/lib/base-model/api-response.mjs +2 -0
- package/esm2022/lib/base-model/audit-log-entry.mjs +3 -0
- package/esm2022/lib/base-model/button-action-settings.mjs +16 -0
- package/esm2022/lib/base-model/column-def.model.mjs +28 -0
- package/esm2022/lib/base-model/do-action-request.mjs +8 -0
- package/esm2022/lib/base-model/field-action.mjs +6 -0
- package/esm2022/lib/base-model/field-filter.model.mjs +3 -0
- package/esm2022/lib/base-model/field-info.mjs +57 -0
- package/esm2022/lib/base-model/field-predicate.model.mjs +10 -0
- package/esm2022/lib/base-model/filter-request.mjs +13 -0
- package/esm2022/lib/base-model/filter.model.mjs +25 -0
- package/esm2022/lib/base-model/get-items-list.mjs +10 -0
- package/esm2022/lib/base-model/index.mjs +12 -0
- package/esm2022/lib/base-model/items-total.model.mjs +8 -0
- package/esm2022/lib/base-model/line-item.model.mjs +11 -0
- package/esm2022/lib/base-model/lookupItem.mjs +16 -0
- package/esm2022/lib/base-model/page-info.mjs +17 -0
- package/esm2022/lib/base-model/report-request.model.mjs +17 -0
- package/esm2022/lib/base-model/response-envelop.model.mjs +10 -0
- package/esm2022/lib/base-model/snack-message.model.mjs +11 -0
- package/esm2022/lib/base-model/table-column.interface.mjs +2 -0
- package/esm2022/lib/base-model/table-page-user-action.interface.mjs +21 -0
- package/esm2022/lib/base-model/workflow/workflow-steps.model.mjs +9 -0
- package/esm2022/lib/base-model/workflow/workflow.model.mjs +42 -0
- package/esm2022/lib/components/action-comment/action-comment.component.mjs +101 -0
- package/esm2022/lib/components/action-confirmation/action-confirmation.component.mjs +55 -0
- package/esm2022/lib/components/activity-report-form/activity-report-form.component.mjs +499 -0
- package/esm2022/lib/components/advanced-filter/field-filter/field-filter.component.mjs +41 -0
- package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +162 -0
- package/esm2022/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.mjs +70 -0
- package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +99 -0
- package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +292 -0
- package/esm2022/lib/components/base-form/base-form.component.mjs +297 -0
- package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +591 -0
- package/esm2022/lib/components/base-input-dialog/base-input-dialog.component.mjs +72 -0
- package/esm2022/lib/components/base-table/base-table.component.mjs +514 -0
- package/esm2022/lib/components/button-actions/button-actions.component.mjs +70 -0
- package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +496 -0
- package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +112 -0
- package/esm2022/lib/components/item-line-editor/item-line-editor.component.mjs +299 -0
- package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +278 -0
- package/esm2022/lib/components/paginator/paginator.component.mjs +91 -0
- package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +102 -0
- package/esm2022/lib/components/report-form/report-form.component.mjs +498 -0
- package/esm2022/lib/components/search-bar/search-bar.component.mjs +62 -0
- package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +81 -0
- package/esm2022/lib/components/shared/action-button/action-button.component.mjs +59 -0
- package/esm2022/lib/components/shared/action-card/action-card.component.mjs +93 -0
- package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +70 -0
- package/esm2022/lib/components/shared-list/shared-list.component.mjs +47 -0
- package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +43 -0
- package/esm2022/lib/components/title-bar/title-bar.component.mjs +119 -0
- package/esm2022/lib/services/backend-service.mjs +240 -0
- package/esm2022/lib/services/index.mjs +4 -0
- package/esm2022/lib/services/top-panel.mjs +22 -0
- package/esm2022/lib/services/trigger-form.service.mjs +17 -0
- package/esm2022/lib/utils/base-utils.mjs +97 -0
- package/esm2022/lib/validators/date-range-validator.mjs +27 -0
- package/esm2022/lib/validators/index.mjs +4 -0
- package/esm2022/lib/validators/match-list.validator.mjs +9 -0
- package/esm2022/lib/validators/multi-email-validator.mjs +13 -0
- package/esm2022/public-api.mjs +29 -0
- package/esm2022/q-btech-ui-lib.mjs +5 -0
- package/esm2022/unifylib-ui-lib.mjs +5 -0
- package/fesm2022/iq-ui-lib.mjs +5625 -0
- package/fesm2022/iq-ui-lib.mjs.map +1 -0
- package/fesm2022/q-btech-ui-lib.mjs +5619 -0
- package/fesm2022/q-btech-ui-lib.mjs.map +1 -0
- package/fesm2022/unifylib-ui-lib.mjs +5625 -0
- package/fesm2022/unifylib-ui-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/base-model/SearchStrConfig.d.ts +8 -0
- package/{src/lib/base-model/api-response.ts → lib/base-model/api-response.d.ts} +21 -23
- package/lib/base-model/audit-log-entry.d.ts +7 -0
- package/lib/base-model/button-action-settings.d.ts +15 -0
- package/lib/base-model/column-def.model.d.ts +11 -0
- package/lib/base-model/do-action-request.d.ts +10 -0
- package/lib/base-model/field-action.d.ts +6 -0
- package/lib/base-model/field-filter.model.d.ts +7 -0
- package/lib/base-model/field-info.d.ts +53 -0
- package/lib/base-model/field-predicate.model.d.ts +7 -0
- package/lib/base-model/filter-request.d.ts +15 -0
- package/lib/base-model/filter.model.d.ts +22 -0
- package/lib/base-model/get-items-list.d.ts +21 -0
- package/lib/base-model/index.d.ts +11 -0
- package/lib/base-model/items-total.model.d.ts +6 -0
- package/lib/base-model/line-item.model.d.ts +9 -0
- package/lib/base-model/lookupItem.d.ts +13 -0
- package/lib/base-model/page-info.d.ts +52 -0
- package/lib/base-model/report-request.model.d.ts +18 -0
- package/lib/base-model/response-envelop.model.d.ts +8 -0
- package/lib/base-model/snack-message.model.d.ts +7 -0
- package/lib/base-model/table-column.interface.d.ts +28 -0
- package/lib/base-model/table-page-user-action.interface.d.ts +14 -0
- package/lib/base-model/workflow/workflow-steps.model.d.ts +7 -0
- package/lib/base-model/workflow/workflow.model.d.ts +13 -0
- package/lib/components/action-comment/action-comment.component.d.ts +32 -0
- package/lib/components/action-confirmation/action-confirmation.component.d.ts +19 -0
- package/lib/components/activity-report-form/activity-report-form.component.d.ts +93 -0
- package/lib/components/advanced-filter/field-filter/field-filter.component.d.ts +20 -0
- package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +28 -0
- package/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.d.ts +25 -0
- package/lib/components/audit-log-list/audit-log.component.d.ts +36 -0
- package/lib/components/auto-complete/auto-complete.component.d.ts +51 -0
- package/lib/components/base-form/base-form.component.d.ts +59 -0
- package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +124 -0
- package/lib/components/base-input-dialog/base-input-dialog.component.d.ts +23 -0
- package/lib/components/base-table/base-table.component.d.ts +128 -0
- package/lib/components/button-actions/button-actions.component.d.ts +17 -0
- package/lib/components/editable-base-table/editable-base-table.component.d.ts +106 -0
- package/lib/components/equation-builder/equation-builder.component.d.ts +23 -0
- package/lib/components/item-line-editor/item-line-editor.component.d.ts +64 -0
- package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +51 -0
- package/lib/components/paginator/paginator.component.d.ts +26 -0
- package/lib/components/report-details-dialog/report-details-dialog.component.d.ts +34 -0
- package/lib/components/report-form/report-form.component.d.ts +92 -0
- package/lib/components/search-bar/search-bar.component.d.ts +29 -0
- package/lib/components/section-form-canvas/section-form-canvas.component.d.ts +27 -0
- package/lib/components/shared/action-button/action-button.component.d.ts +17 -0
- package/lib/components/shared/action-card/action-card.component.d.ts +37 -0
- package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +16 -0
- package/lib/components/shared-list/shared-list.component.d.ts +21 -0
- package/lib/components/snackbar-static/snackbar-static.component.d.ts +15 -0
- package/lib/components/title-bar/title-bar.component.d.ts +42 -0
- package/lib/services/backend-service.d.ts +59 -0
- package/{src/lib/services/index.ts → lib/services/index.d.ts} +3 -3
- package/lib/services/top-panel.d.ts +8 -0
- package/lib/services/trigger-form.service.d.ts +7 -0
- package/lib/utils/base-utils.d.ts +13 -0
- package/lib/validators/date-range-validator.d.ts +2 -0
- package/{src/lib/validators/index.ts → lib/validators/index.d.ts} +3 -3
- package/lib/validators/match-list.validator.d.ts +4 -0
- package/lib/validators/multi-email-validator.d.ts +6 -0
- package/package.json +27 -14
- package/{src/public-api.ts → public-api.d.ts} +25 -29
- package/ng-package.json +0 -7
- package/src/lib/base-model/SearchStrConfig.ts +0 -12
- package/src/lib/base-model/audit-log-entry.ts +0 -7
- package/src/lib/base-model/button-action-settings.ts +0 -29
- package/src/lib/base-model/column-def.model.ts +0 -34
- package/src/lib/base-model/do-action-request.ts +0 -11
- package/src/lib/base-model/feature-item.ts +0 -9
- package/src/lib/base-model/field-action.ts +0 -7
- package/src/lib/base-model/field-filter.model.ts +0 -7
- package/src/lib/base-model/field-info.ts +0 -102
- package/src/lib/base-model/field-predicate.model.ts +0 -7
- package/src/lib/base-model/filter-request.ts +0 -27
- package/src/lib/base-model/filter.model.ts +0 -49
- package/src/lib/base-model/get-items-list.ts +0 -24
- package/src/lib/base-model/index.ts +0 -11
- package/src/lib/base-model/items-total.model.ts +0 -12
- package/src/lib/base-model/line-item.model.ts +0 -18
- package/src/lib/base-model/lookupItem.ts +0 -21
- package/src/lib/base-model/null-snackmessage.ts +0 -9
- package/src/lib/base-model/page-info.ts +0 -54
- package/src/lib/base-model/report-request.model.ts +0 -33
- package/src/lib/base-model/response-envelop.model.ts +0 -15
- package/src/lib/base-model/snack-message.model.ts +0 -14
- package/src/lib/base-model/snackmessage-interface.ts +0 -7
- package/src/lib/base-model/table-column.interface.ts +0 -29
- package/src/lib/base-model/table-page-user-action.interface.ts +0 -33
- package/src/lib/base-model/workflow/workflow-steps.model.ts +0 -9
- package/src/lib/base-model/workflow/workflow.model.ts +0 -52
- package/src/lib/components/action-comment/action-comment.component.css +0 -52
- package/src/lib/components/action-comment/action-comment.component.html +0 -47
- package/src/lib/components/action-comment/action-comment.component.spec.ts +0 -23
- package/src/lib/components/action-comment/action-comment.component.ts +0 -102
- package/src/lib/components/action-confirmation/action-confirmation.component.css +0 -46
- package/src/lib/components/action-confirmation/action-confirmation.component.html +0 -32
- package/src/lib/components/action-confirmation/action-confirmation.component.spec.ts +0 -23
- package/src/lib/components/action-confirmation/action-confirmation.component.ts +0 -58
- package/src/lib/components/activity-report-form/activity-report-form.component.html +0 -110
- package/src/lib/components/activity-report-form/activity-report-form.component.scss +0 -69
- package/src/lib/components/activity-report-form/activity-report-form.component.spec.ts +0 -25
- package/src/lib/components/activity-report-form/activity-report-form.component.ts +0 -616
- package/src/lib/components/advanced-filter/field-filter/field-filter.component.html +0 -8
- package/src/lib/components/advanced-filter/field-filter/field-filter.component.scss +0 -0
- package/src/lib/components/advanced-filter/field-filter/field-filter.component.spec.ts +0 -25
- package/src/lib/components/advanced-filter/field-filter/field-filter.component.ts +0 -55
- package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.html +0 -36
- package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.scss +0 -130
- package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.spec.ts +0 -25
- package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.ts +0 -186
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.css +0 -51
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.html +0 -23
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.spec.ts +0 -23
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.ts +0 -69
- package/src/lib/components/audit-log-list/audit-log.component.html +0 -26
- package/src/lib/components/audit-log-list/audit-log.component.scss +0 -50
- package/src/lib/components/audit-log-list/audit-log.component.spec.ts +0 -25
- package/src/lib/components/audit-log-list/audit-log.component.ts +0 -114
- package/src/lib/components/auto-complete/auto-complete.component.css +0 -55
- package/src/lib/components/auto-complete/auto-complete.component.html +0 -45
- package/src/lib/components/auto-complete/auto-complete.component.spec.ts +0 -23
- package/src/lib/components/auto-complete/auto-complete.component.ts +0 -331
- package/src/lib/components/base-form/base-form.component.html +0 -59
- package/src/lib/components/base-form/base-form.component.scss +0 -68
- package/src/lib/components/base-form/base-form.component.spec.ts +0 -25
- package/src/lib/components/base-form/base-form.component.ts +0 -323
- package/src/lib/components/base-form-canvas/base-form-canvas.component.css +0 -196
- package/src/lib/components/base-form-canvas/base-form-canvas.component.html +0 -1095
- package/src/lib/components/base-form-canvas/base-form-canvas.component.spec.ts +0 -23
- package/src/lib/components/base-form-canvas/base-form-canvas.component.ts +0 -680
- package/src/lib/components/base-input-dialog/base-input-dialog.component.css +0 -67
- package/src/lib/components/base-input-dialog/base-input-dialog.component.html +0 -47
- package/src/lib/components/base-input-dialog/base-input-dialog.component.spec.ts +0 -23
- package/src/lib/components/base-input-dialog/base-input-dialog.component.ts +0 -77
- package/src/lib/components/base-table/base-table.component.html +0 -268
- package/src/lib/components/base-table/base-table.component.scss +0 -140
- package/src/lib/components/base-table/base-table.component.spec.ts +0 -25
- package/src/lib/components/base-table/base-table.component.ts +0 -621
- package/src/lib/components/button-actions/button-actions.component.html +0 -27
- package/src/lib/components/button-actions/button-actions.component.scss +0 -101
- package/src/lib/components/button-actions/button-actions.component.spec.ts +0 -23
- package/src/lib/components/button-actions/button-actions.component.ts +0 -70
- package/src/lib/components/editable-base-table/editable-base-table.component.html +0 -337
- package/src/lib/components/editable-base-table/editable-base-table.component.scss +0 -126
- package/src/lib/components/editable-base-table/editable-base-table.component.spec.ts +0 -25
- package/src/lib/components/editable-base-table/editable-base-table.component.ts +0 -579
- package/src/lib/components/equation-builder/equation-builder.component.css +0 -39
- package/src/lib/components/equation-builder/equation-builder.component.html +0 -31
- package/src/lib/components/equation-builder/equation-builder.component.spec.ts +0 -23
- package/src/lib/components/equation-builder/equation-builder.component.ts +0 -119
- package/src/lib/components/item-line-editor/item-line-editor.component.html +0 -102
- package/src/lib/components/item-line-editor/item-line-editor.component.scss +0 -152
- package/src/lib/components/item-line-editor/item-line-editor.component.spec.ts +0 -23
- package/src/lib/components/item-line-editor/item-line-editor.component.ts +0 -306
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.css +0 -19
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.html +0 -38
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.spec.ts +0 -23
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.ts +0 -315
- package/src/lib/components/paginator/paginator.component.css +0 -65
- package/src/lib/components/paginator/paginator.component.html +0 -30
- package/src/lib/components/paginator/paginator.component.ts +0 -87
- package/src/lib/components/report-details-dialog/report-details-dialog.component.css +0 -17
- package/src/lib/components/report-details-dialog/report-details-dialog.component.html +0 -16
- package/src/lib/components/report-details-dialog/report-details-dialog.component.spec.ts +0 -23
- package/src/lib/components/report-details-dialog/report-details-dialog.component.ts +0 -111
- package/src/lib/components/report-form/report-form.component.html +0 -92
- package/src/lib/components/report-form/report-form.component.scss +0 -51
- package/src/lib/components/report-form/report-form.component.spec.ts +0 -25
- package/src/lib/components/report-form/report-form.component.ts +0 -599
- package/src/lib/components/search-bar/search-bar.component.html +0 -51
- package/src/lib/components/search-bar/search-bar.component.scss +0 -63
- package/src/lib/components/search-bar/search-bar.component.spec.ts +0 -25
- package/src/lib/components/search-bar/search-bar.component.ts +0 -68
- package/src/lib/components/section-form-canvas/section-form-canvas.component.html +0 -43
- package/src/lib/components/section-form-canvas/section-form-canvas.component.scss +0 -81
- package/src/lib/components/section-form-canvas/section-form-canvas.component.spec.ts +0 -23
- package/src/lib/components/section-form-canvas/section-form-canvas.component.ts +0 -67
- package/src/lib/components/shared/action-button/action-button.component.html +0 -12
- package/src/lib/components/shared/action-button/action-button.component.scss +0 -45
- package/src/lib/components/shared/action-button/action-button.component.ts +0 -51
- package/src/lib/components/shared/action-card/action-card.component.html +0 -78
- package/src/lib/components/shared/action-card/action-card.component.scss +0 -238
- package/src/lib/components/shared/action-card/action-card.component.ts +0 -56
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.css +0 -135
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.html +0 -36
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.spec.ts +0 -23
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.ts +0 -71
- package/src/lib/components/shared-list/shared-list.component.css +0 -0
- package/src/lib/components/shared-list/shared-list.component.html +0 -17
- package/src/lib/components/shared-list/shared-list.component.spec.ts +0 -23
- package/src/lib/components/shared-list/shared-list.component.ts +0 -53
- package/src/lib/components/snackbar-static/snackbar-static.component.html +0 -20
- package/src/lib/components/snackbar-static/snackbar-static.component.scss +0 -135
- package/src/lib/components/snackbar-static/snackbar-static.component.ts +0 -26
- package/src/lib/components/title-bar/title-bar.component.css +0 -0
- package/src/lib/components/title-bar/title-bar.component.css.map +0 -1
- package/src/lib/components/title-bar/title-bar.component.html +0 -35
- package/src/lib/components/title-bar/title-bar.component.scss +0 -126
- package/src/lib/components/title-bar/title-bar.component.spec.ts +0 -23
- package/src/lib/components/title-bar/title-bar.component.ts +0 -126
- package/src/lib/services/backend-service.ts +0 -287
- package/src/lib/services/top-panel.ts +0 -17
- package/src/lib/services/trigger-form.service.ts +0 -11
- package/src/lib/share-module/shared-module.ts +0 -10
- package/src/lib/utils/base-utils.ts +0 -102
- package/src/lib/validators/date-range-validator.ts +0 -31
- package/src/lib/validators/match-list.validator.ts +0 -10
- package/src/lib/validators/multi-email-validator.ts +0 -15
- package/tsconfig.lib.json +0 -15
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.spec.json +0 -15
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
import { Component, effect, EventEmitter, Inject, Input, Output } from "@angular/core";
|
|
2
|
+
import { MatCell, MatCellDef, MatColumnDef, MatHeaderCell, MatHeaderCellDef, MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable, MatTableDataSource } from "@angular/material/table";
|
|
3
|
+
import { TranslateModule } from "@ngx-translate/core";
|
|
4
|
+
import { MatSortModule } from "@angular/material/sort";
|
|
5
|
+
import { CurrencyPipe, DatePipe, DecimalPipe, JsonPipe, NgClass, NgForOf, NgIf, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, UpperCasePipe } from "@angular/common";
|
|
6
|
+
import { MatIcon } from "@angular/material/icon";
|
|
7
|
+
import { MatButton, MatButtonModule, MatIconButton } from "@angular/material/button";
|
|
8
|
+
import { NgxPaginationModule } from "ngx-pagination";
|
|
9
|
+
import { ButtonActionsComponent } from "../button-actions/button-actions.component";
|
|
10
|
+
import { BaseUtils } from "../../utils/base-utils";
|
|
11
|
+
import { FilterRequest } from "../../base-model/filter-request";
|
|
12
|
+
import { EMPTY_PAGE_INFO, FRONT_END_COLUMN_TYPES, TABLE_RECORD_ACTION } from "../../base-model";
|
|
13
|
+
import { ReportRequest } from "../../base-model/report-request.model";
|
|
14
|
+
import { ResponseEnvelop } from "../../base-model/response-envelop.model";
|
|
15
|
+
import { MatLabel } from "@angular/material/form-field";
|
|
16
|
+
import { MatChipListbox, MatChipOption } from "@angular/material/chips";
|
|
17
|
+
import { MatButtonToggle, MatButtonToggleGroup } from "@angular/material/button-toggle";
|
|
18
|
+
import { TitleBarComponent } from "../title-bar/title-bar.component";
|
|
19
|
+
import { PaginatorComponent } from "../paginator/paginator.component";
|
|
20
|
+
import { MatCheckbox } from "@angular/material/checkbox";
|
|
21
|
+
import { BaseFormCanvasComponent } from "../base-form-canvas/base-form-canvas.component";
|
|
22
|
+
import { FilterBuilderComponent } from "../advanced-filter/filter-builder/filter-builder.component";
|
|
23
|
+
import { MatMenu, MatMenuItem, MatMenuTrigger } from "@angular/material/menu";
|
|
24
|
+
import * as i0 from "@angular/core";
|
|
25
|
+
import * as i1 from "../../services/backend-service";
|
|
26
|
+
import * as i2 from "@ngx-translate/core";
|
|
27
|
+
import * as i3 from "../../services/trigger-form.service";
|
|
28
|
+
import * as i4 from "@angular/router";
|
|
29
|
+
import * as i5 from "@angular/material/sort";
|
|
30
|
+
import * as i6 from "@angular/material/button";
|
|
31
|
+
export class BaseTableComponent extends BaseUtils {
|
|
32
|
+
constructor(backendService, translateService, shareDataService, securityManager, router) {
|
|
33
|
+
super();
|
|
34
|
+
this.backendService = backendService;
|
|
35
|
+
this.translateService = translateService;
|
|
36
|
+
this.shareDataService = shareDataService;
|
|
37
|
+
this.securityManager = securityManager;
|
|
38
|
+
this.router = router;
|
|
39
|
+
this.types = ["pdf", "csv", "xlsx"];
|
|
40
|
+
this.collection = { count: 60, data: [] };
|
|
41
|
+
this.config = {
|
|
42
|
+
itemsPerPage: 15,
|
|
43
|
+
currentPage: 1,
|
|
44
|
+
totalItems: this.collection.count
|
|
45
|
+
};
|
|
46
|
+
this.maxSize = 7;
|
|
47
|
+
this.directionLinks = true;
|
|
48
|
+
this.autoHide = false;
|
|
49
|
+
this.responsive = true;
|
|
50
|
+
this.labels = {
|
|
51
|
+
previousLabel: '<',
|
|
52
|
+
nextLabel: '>',
|
|
53
|
+
screenReaderPaginationLabel: 'Pagination',
|
|
54
|
+
screenReaderPageLabel: 'page',
|
|
55
|
+
screenReaderCurrentLabel: `You're on page`
|
|
56
|
+
};
|
|
57
|
+
this.noDataFoundIcon = 'close';
|
|
58
|
+
this.noDataFoundTitle = 'noDataFoundTitle';
|
|
59
|
+
this.noDataFoundSubtitle = 'noDataFoundSubtitle';
|
|
60
|
+
this.totalElements = 0;
|
|
61
|
+
this.pagesCount = 0;
|
|
62
|
+
this.pageIndex = 1;
|
|
63
|
+
this.pageSize = 15;
|
|
64
|
+
this.selectedStatusFilter = [];
|
|
65
|
+
this.advancedAppliedFilter = [];
|
|
66
|
+
this.searchStr = '';
|
|
67
|
+
this.filterRequest = new FilterRequest();
|
|
68
|
+
this.pageInfo = EMPTY_PAGE_INFO;
|
|
69
|
+
this.enablePagination = true;
|
|
70
|
+
this.listAction = [];
|
|
71
|
+
this.filters = [];
|
|
72
|
+
this.enforceRefresh = false;
|
|
73
|
+
this.isPending = false;
|
|
74
|
+
this.trigger = false;
|
|
75
|
+
this.reportRequest = new ReportRequest({});
|
|
76
|
+
this.manageablePages = false;
|
|
77
|
+
this.totalPagesCount = 0;
|
|
78
|
+
this.currentPageIndex = 0;
|
|
79
|
+
this.pageChange = new EventEmitter();
|
|
80
|
+
this.userAction = new EventEmitter();
|
|
81
|
+
this.hyperLinkAction = new EventEmitter();
|
|
82
|
+
this.extraAction = new EventEmitter();
|
|
83
|
+
this.selectedColumn = new EventEmitter();
|
|
84
|
+
this.listActionClicked = new EventEmitter();
|
|
85
|
+
this.showDialog = new EventEmitter();
|
|
86
|
+
this.selectedRowIndex = -1;
|
|
87
|
+
this.noDataFound = false;
|
|
88
|
+
this.totalRequiredCountItem = 0;
|
|
89
|
+
this.clickRoutePage = new EventEmitter();
|
|
90
|
+
this.groupNames = [];
|
|
91
|
+
this.groupSpans = new Map();
|
|
92
|
+
this.dataSource = new MatTableDataSource();
|
|
93
|
+
this.columns = [];
|
|
94
|
+
this.filterRequest = new FilterRequest();
|
|
95
|
+
effect(() => {
|
|
96
|
+
if (this.pageInfo.lazyLoadData !== true || this.enforceRefresh === true) {
|
|
97
|
+
this.loadData();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
ngOnDestroy() {
|
|
102
|
+
}
|
|
103
|
+
ngOnInit() {
|
|
104
|
+
this.backendService.isEmptyItems = this.dataSource.data.length <= 0;
|
|
105
|
+
if (this.customizedData) {
|
|
106
|
+
this.dataSource = this.customizedData;
|
|
107
|
+
}
|
|
108
|
+
if (this.manageablePages) {
|
|
109
|
+
this.pagesCount = this.totalPagesCount;
|
|
110
|
+
this.pageIndex = this.currentPageIndex;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
onPageChange(event) {
|
|
114
|
+
this.pageIndex = event;
|
|
115
|
+
this.getNext(this.pageIndex - 1);
|
|
116
|
+
if (this.manageablePages) {
|
|
117
|
+
this.pageChange.emit(this.pageIndex);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
extractFieldName(element, property) {
|
|
121
|
+
if (property.includes('.')) {
|
|
122
|
+
return property.split('.').reduce((acc, part) => acc && acc[part], element);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const c = this.columns.find(c => c.property === property);
|
|
126
|
+
if (Array.isArray(element[property]) && c.arraySubProperty) {
|
|
127
|
+
const fieldValues = element[property].map(f => f[c.arraySubProperty]);
|
|
128
|
+
return fieldValues.join(', ');
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
return element[property];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
get visibleColumns() {
|
|
136
|
+
this.buildGroups();
|
|
137
|
+
return this.columns.filter(column => column.visible).map(column => column.property);
|
|
138
|
+
}
|
|
139
|
+
getNext(pageIndex) {
|
|
140
|
+
this.reportRequest.filterRequest.pageIndex = pageIndex;
|
|
141
|
+
this.reportRequest.filterRequest.pageSize = this.pageSize;
|
|
142
|
+
this.loadData();
|
|
143
|
+
}
|
|
144
|
+
onPageSizeChange(event) {
|
|
145
|
+
this.pageSize = event;
|
|
146
|
+
this.pageIndex = 1; // reset to first page on page size change
|
|
147
|
+
this.reportRequest.filterRequest.pageSize = this.pageSize;
|
|
148
|
+
this.getNext(0);
|
|
149
|
+
}
|
|
150
|
+
loadData() {
|
|
151
|
+
clearTimeout(this.timer);
|
|
152
|
+
if (!this.reportRequest.filterRequest) {
|
|
153
|
+
this.reportRequest.filterRequest = new FilterRequest(this.pageInfo.pageSize);
|
|
154
|
+
this.reportRequest.filterRequest.filters = this.advancedAppliedFilter;
|
|
155
|
+
}
|
|
156
|
+
if (this.separateEndpointData || !this.pageInfo.apiUri || this.pageInfo.apiUri.length === 0) {
|
|
157
|
+
this.dataSource.data = this.separateEndpointData;
|
|
158
|
+
}
|
|
159
|
+
else if (this.reportRequest == undefined) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
else if (!this.manageablePages) {
|
|
163
|
+
this.timer = setTimeout(() => {
|
|
164
|
+
this.reportRequest.filterRequest.columns = this.columns?.filter(c => FRONT_END_COLUMN_TYPES.indexOf(c.type) < 0).map(c => c.property) || [];
|
|
165
|
+
this.reportRequest.filterRequest.pendingPage = this.isPending;
|
|
166
|
+
this.reportRequest.filterRequest.filters = this.advancedAppliedFilter;
|
|
167
|
+
this.backendService.getItemsByFilter(this.reportRequest?.filterRequest, this.pageInfo.apiUri).subscribe(resp => {
|
|
168
|
+
const responseEnvelope = new ResponseEnvelop(resp);
|
|
169
|
+
if (responseEnvelope.valid) {
|
|
170
|
+
this.totalRequiredCountItem = this.reportRequest.filterRequest.pageSize;
|
|
171
|
+
this.noDataFound = responseEnvelope.body.length < 1;
|
|
172
|
+
this.dataSource.data = responseEnvelope.body;
|
|
173
|
+
this.backendService.isEmptyItems = this.dataSource.data.length <= 0;
|
|
174
|
+
this.totalElements = responseEnvelope.totalSize || 0;
|
|
175
|
+
this.pagesCount = Math.ceil(this.totalElements / this.pageSize) || 1;
|
|
176
|
+
this.pageIndex = (this.reportRequest.filterRequest.pageIndex || 0) + 1;
|
|
177
|
+
this.config.totalItems = responseEnvelope.totalSize || 0;
|
|
178
|
+
this.config.currentPage = this.pageIndex + 1;
|
|
179
|
+
// this.pageSize = this.reportRequest.filterRequest.pageSize;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}, 300);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
getStatusDescription(element) {
|
|
186
|
+
return this.backendService.getStatusDescription(element, this.usedWorkflow);
|
|
187
|
+
}
|
|
188
|
+
getStateType(element) {
|
|
189
|
+
return element.stateType;
|
|
190
|
+
}
|
|
191
|
+
ngOnChanges(changes) {
|
|
192
|
+
if (changes["customizedData"] && !changes["customizedData"].isFirstChange()) {
|
|
193
|
+
this.dataSource.data = changes["customizedData"].currentValue?.data || []; // Update data source with new data
|
|
194
|
+
this.pagesCount = this.totalPagesCount;
|
|
195
|
+
this.pageIndex = this.currentPageIndex;
|
|
196
|
+
}
|
|
197
|
+
if (changes["enforceRefresh"] && !changes["enforceRefresh"].isFirstChange()) {
|
|
198
|
+
this.loadData();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
getCroppedText(elementValue, subWidth = 20) {
|
|
202
|
+
return elementValue && elementValue.length > subWidth ? elementValue.substring(0, subWidth) + "..." : elementValue;
|
|
203
|
+
}
|
|
204
|
+
emitEvent(element) {
|
|
205
|
+
this.showDialog.emit(element);
|
|
206
|
+
}
|
|
207
|
+
extractFormat(column) {
|
|
208
|
+
return column?.format || 'd/M/yyyy, h:mm a';
|
|
209
|
+
}
|
|
210
|
+
actionListClicked(listAction, element) {
|
|
211
|
+
this.listActionClicked.emit({ action: listAction, row: element });
|
|
212
|
+
}
|
|
213
|
+
hyperLinkClicked(actionName, element) {
|
|
214
|
+
const action = TABLE_RECORD_ACTION;
|
|
215
|
+
action.actionKey = actionName;
|
|
216
|
+
action.item = element;
|
|
217
|
+
action.pageInfo = this.pageInfo;
|
|
218
|
+
this.hyperLinkAction.emit(action);
|
|
219
|
+
}
|
|
220
|
+
emitRoutePage(element) {
|
|
221
|
+
this.clickRoutePage.emit(element);
|
|
222
|
+
}
|
|
223
|
+
onSelectItem(row) {
|
|
224
|
+
if (this.pageInfo.selfRouting) {
|
|
225
|
+
const mode = this.isPending ? 'pending' : 'view';
|
|
226
|
+
const url = `${this.pageInfo.listRoutePath || this.router.url}/view`;
|
|
227
|
+
const encryptedId = this.backendService.encrypt(String(row.id));
|
|
228
|
+
const encryptedMode = this.backendService.encrypt(mode);
|
|
229
|
+
const encryptedRow = this.backendService.encrypt(JSON.stringify(row));
|
|
230
|
+
this.router.navigate([url], {
|
|
231
|
+
queryParams: { token: encryptedId, mode: encryptedMode },
|
|
232
|
+
state: { raw: encryptedRow },
|
|
233
|
+
});
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// const action = SELECT_RECORD_ACTION;
|
|
237
|
+
// action.id = row?.id;
|
|
238
|
+
// action.item = row;
|
|
239
|
+
// this.userAction.emit(action)
|
|
240
|
+
}
|
|
241
|
+
openNewTab(row) {
|
|
242
|
+
if (!this.pageInfo.embededTableOnly) {
|
|
243
|
+
const mode = this.isPending ? 'pending' : 'view';
|
|
244
|
+
window.open(`${this.pageInfo.listRoutePath}/${mode}` + '/' + row?.id);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
switchViewMode(b) {
|
|
248
|
+
this.isPending = !this.isPending;
|
|
249
|
+
this.loadData();
|
|
250
|
+
}
|
|
251
|
+
onAddNewAction($event) {
|
|
252
|
+
const url = `${this.pageInfo.listRoutePath || this.router.url}/view`;
|
|
253
|
+
const encryptedId = this.backendService.encrypt("-1");
|
|
254
|
+
const encryptedMode = this.backendService.encrypt("pending");
|
|
255
|
+
this.router.navigate([`${url}`], { queryParams: { token: encryptedId, mode: encryptedMode } });
|
|
256
|
+
// const action = SELECT_RECORD_ACTION;
|
|
257
|
+
// action.id = row?.id;
|
|
258
|
+
// action.item = row;
|
|
259
|
+
// this.userAction.emit(action)
|
|
260
|
+
}
|
|
261
|
+
showAddNew() {
|
|
262
|
+
return this.pageInfo.hasAddButton;
|
|
263
|
+
}
|
|
264
|
+
onExtraButtionAction($event) {
|
|
265
|
+
this.extraAction.emit($event);
|
|
266
|
+
}
|
|
267
|
+
hasGroups() {
|
|
268
|
+
let b = this.columns.findIndex(p => p.group);
|
|
269
|
+
return b >= 0;
|
|
270
|
+
}
|
|
271
|
+
buildGroups() {
|
|
272
|
+
let count = 0;
|
|
273
|
+
this.groupNames = [];
|
|
274
|
+
this.groupSpans.clear();
|
|
275
|
+
if (this.hasGroups() === false) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
this.columns
|
|
279
|
+
.filter(column => column.visible === true)
|
|
280
|
+
.forEach((column) => {
|
|
281
|
+
if (column.group === "-") {
|
|
282
|
+
this.groupNames.push(count.toString());
|
|
283
|
+
this.insertInMap(count);
|
|
284
|
+
count++;
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
else if (!this.groupNames.includes(column.group)) {
|
|
288
|
+
this.groupNames.push(column.group);
|
|
289
|
+
this.insertInMap(column.group);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
this.insertInMap(column.group);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
insertInMap(key) {
|
|
296
|
+
if (this.groupSpans.has(key)) {
|
|
297
|
+
this.groupSpans.set(key.toString(), this.groupSpans.get(key) + 1);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
this.groupSpans.set(key.toString(), 1);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
isHumanMade(str) {
|
|
304
|
+
return isNaN(str);
|
|
305
|
+
}
|
|
306
|
+
actionButtonClicked(actionKey, item) {
|
|
307
|
+
if (actionKey === 'navigate') {
|
|
308
|
+
this.handleNavigateAction(item);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
this.emitTableAction(actionKey, item);
|
|
312
|
+
}
|
|
313
|
+
handleNavigateAction(item) {
|
|
314
|
+
const mode = this.isPending ? 'pending' : 'view';
|
|
315
|
+
const basePath = this.pageInfo.listRoutePath || this.router.url;
|
|
316
|
+
const url = `${basePath}/view`;
|
|
317
|
+
const encryptedId = this.backendService.encrypt(item.id.toString());
|
|
318
|
+
const encryptedMode = this.backendService.encrypt(mode);
|
|
319
|
+
this.router.navigate([url], {
|
|
320
|
+
queryParams: { token: encryptedId, mode: encryptedMode }
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
emitTableAction(actionKey, item) {
|
|
324
|
+
const action = TABLE_RECORD_ACTION;
|
|
325
|
+
action.actionKey = actionKey;
|
|
326
|
+
action.item = item;
|
|
327
|
+
action.pageInfo = this.pageInfo;
|
|
328
|
+
this.userAction.emit(action);
|
|
329
|
+
}
|
|
330
|
+
extractReport(reportType) {
|
|
331
|
+
const myFilters = this.reportRequest.filterRequest;
|
|
332
|
+
const reportRequest = this.backendService.buildReportRequest(this.columns, this.pageInfo.labelsSection + '.list_title', myFilters, reportType, this.pageInfo, this.searchStr, 'LANDSCAPE');
|
|
333
|
+
this.backendService.downloadReport(reportRequest, this.pageInfo.apiUri);
|
|
334
|
+
}
|
|
335
|
+
getIcon(status) {
|
|
336
|
+
switch (status) {
|
|
337
|
+
case 'pass': return 'check_circle';
|
|
338
|
+
case 'warning': return 'warning';
|
|
339
|
+
case 'error': return 'error';
|
|
340
|
+
default: return 'help';
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
actionCheckedClicked(property, element) {
|
|
344
|
+
element[property] = !element[property];
|
|
345
|
+
this.actionButtonClicked(property, element);
|
|
346
|
+
}
|
|
347
|
+
isDarkHighlight(row) {
|
|
348
|
+
const groupByProp = this.pageInfo?.groupByProperty;
|
|
349
|
+
const groupByValues = this.pageInfo?.groupByValue;
|
|
350
|
+
if (!groupByProp || !groupByValues || !row[groupByProp]) {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
const cellValue = row[groupByProp].toString();
|
|
354
|
+
return groupByValues.some(val => cellValue.includes(val) && cellValue.length > val.length);
|
|
355
|
+
}
|
|
356
|
+
shouldRenderAsHyperLink(element) {
|
|
357
|
+
const groupByProp = this.pageInfo?.groupByProperty;
|
|
358
|
+
const groupByValues = this.pageInfo?.groupByValue;
|
|
359
|
+
if (!groupByProp || !groupByValues || !element[groupByProp]) {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
const value = element[groupByProp].toString();
|
|
363
|
+
return !groupByValues.some(v => value.includes(v) && value.length >= v.length);
|
|
364
|
+
}
|
|
365
|
+
onSortAction($event) {
|
|
366
|
+
this.reportRequest.filterRequest.sortKey = $event.active && $event.direction ?
|
|
367
|
+
this.columns.find(c => c.property === $event.active)?.orderByProperty || $event.active
|
|
368
|
+
: 'id';
|
|
369
|
+
this.reportRequest.filterRequest.sortDirection = $event.direction === 'asc' ? 'ASC' : 'DESC';
|
|
370
|
+
this.reportRequest.filterRequest.pageIndex = 0;
|
|
371
|
+
this.selectedColumn.emit($event);
|
|
372
|
+
this.loadData();
|
|
373
|
+
}
|
|
374
|
+
shouldShowButton(element) {
|
|
375
|
+
const groupByProp = this.pageInfo?.groupByProperty;
|
|
376
|
+
const groupByValues = this.pageInfo?.groupByValue;
|
|
377
|
+
if (!groupByProp || !groupByValues || !element[groupByProp]) {
|
|
378
|
+
return true;
|
|
379
|
+
}
|
|
380
|
+
const value = element[groupByProp].toString();
|
|
381
|
+
return !groupByValues.some(v => value.includes(v) && value.length >= v.length);
|
|
382
|
+
}
|
|
383
|
+
doAdvancedSearch($event) {
|
|
384
|
+
this.advancedAppliedFilter = [];
|
|
385
|
+
if ($event.length === 0) {
|
|
386
|
+
this.advancedAppliedFilter = [];
|
|
387
|
+
this.loadData();
|
|
388
|
+
// this.paginator.firstPage();
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
this.advancedAppliedFilter = $event;
|
|
392
|
+
this.loadData();
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
resetData($event) {
|
|
396
|
+
if ($event) {
|
|
397
|
+
this.advancedAppliedFilter = [];
|
|
398
|
+
this.loadData();
|
|
399
|
+
// this.paginator.firstPage();
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }, { token: i3.ShareDataService }, { token: 'securityManager' }, { token: i4.Router }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
403
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseTableComponent, isStandalone: true, selector: "app-base-table", inputs: { filterFields: "filterFields", noDataFoundIcon: "noDataFoundIcon", noDataFoundTitle: "noDataFoundTitle", noDataFoundSubtitle: "noDataFoundSubtitle", pageInfo: "pageInfo", enablePagination: "enablePagination", data: "data", listAction: "listAction", columns: "columns", filters: "filters", pathParam: "pathParam", extraButton: "extraButton", enforceRefresh: "enforceRefresh", isPending: "isPending", trigger: "trigger", reportRequest: "reportRequest", separateEndpointData: "separateEndpointData", manageablePages: "manageablePages", totalPagesCount: "totalPagesCount", currentPageIndex: "currentPageIndex", customizedData: "customizedData" }, outputs: { pageChange: "pageChange", userAction: "userAction", hyperLinkAction: "hyperLinkAction", extraAction: "extraAction", selectedColumn: "selectedColumn", listActionClicked: "listActionClicked", showDialog: "showDialog", clickRoutePage: "clickRoutePage" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex-column baseTable\">\r\n <div class=\"flex-row flex-100\" *ngIf=\"!pageInfo.hideTitle\">\r\n <div [class.flex-50]=\"pageInfo.draftSupported\" [class.flex-100]=\"!pageInfo.draftSupported\" class=\"flex-column align-start\">\r\n <app-title-bar\r\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"showAddNew()\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\r\n [extraButton]=\"extraButton\"\r\n (newActionClicked)=\"onAddNewAction($event)\"\r\n (extractReport)=\"extractReport($event)\"\r\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\r\n </app-title-bar>\r\n </div>\r\n <div class=\"flex-50 flex-column align-end\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-listbox aria-label=\"Color selection\" [multiple]=\"false\">\r\n <mat-chip-option [selected]=\"!this.isPending\" [color]=\"'accent'\" [value]=\"'COMPLETED'\" (click)=\"switchViewMode(false)\">\r\n {{'finished' | translate}}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"this.isPending\" [color]=\"'accent'\" [value]=\"'PENDING'\" (click)=\"switchViewMode(true)\">\r\n {{'todo' | translate}}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\r\n <app-filter-builder\r\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n [filterFields]=\"filterFields\"\r\n (filterInformation)=\"doAdvancedSearch($event)\"\r\n (isEmpty)=\"resetData($event)\">\r\n </app-filter-builder>\r\n\r\n <div class=\"button-group\" >\r\n\r\n <button *ngIf=\"!pageInfo.hideExtractButton\"\r\n mat-flat-button\r\n [matMenuTriggerFor]=\"exportMenu\"\r\n color=\"primary\"\r\n class=\"btn-none-background-primary btn-export\"\r\n >\r\n <div class=\"button-text\">\r\n <mat-icon>file_export</mat-icon>\r\n <span>{{ 'export' | translate }}</span>\r\n <mat-icon class=\"arrow-icon\">arrow_drop_down</mat-icon>\r\n </div>\r\n </button>\r\n\r\n <mat-menu #exportMenu=\"matMenu\">\r\n <button\r\n mat-menu-item\r\n *ngFor=\"let type of types\"\r\n (click)=\"extractReport(type)\"\r\n >\r\n <span>{{ type | uppercase }}</span>\r\n </button>\r\n </mat-menu>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\r\n <div class=\"flex-100\">\r\n <div class=\"flex-row flex-100 mainTable\">\r\n <table [dataSource]=\"dataSource\" class=\"flex-fill\" mat-table matSort (matSortChange)=\"onSortAction($event)\">\r\n <ng-container *ngFor=\"let column of this.columns; let last=last\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container *ngIf=\"column.enableSorting; else withoutSortingColumn\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell mat-sort-header>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n </ng-container>\r\n <ng-template #withoutSortingColumn>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n </ng-template>\r\n\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary\" mat-cell>\r\n <button mat-button class=\"wfStatus {{ getStatusDescription(element)}}\" [attr.id]=\"'table-btn-wf-'+column.property+'-'+(element.id || element.key || '')\">{{ getStatusDescription(element) }}</button>\r\n </td>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <button mat-button class=\"wfStatus {{ getStatusDescription(element)}}\" [attr.id]=\"'table-btn-wf2-'+column.property+'-'+(element.id || element.key || '')\">{{ getStatusDescription(element) }}</button>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'hyper-text'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" (click)=\"hyperLinkClicked(column.property,element)\" mat-cell>\r\n <mat-label [ngClass]=\"{'hyper-link': shouldRenderAsHyperLink(element)}\">\r\n {{ extractFieldName(element, column.property) }}\r\n </mat-label>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary\" mat-cell>\r\n <button *ngIf=\"shouldShowButton(element)\" mat-button class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(column.property, element)\" [attr.id]=\"'table-btn-action-'+column.property\">\r\n {{ labelKey(column) + '_title' | translate }}\r\n </button>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'icon'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\" mat-cell>\r\n <mat-icon [ngClass]=\"{\r\n 'mainTable__td__icon-green': element[column.property] === 'pass',\r\n 'mainTable__td__icon-orange': element[column.property] === 'warning',\r\n 'mainTable__td__icon-red': element[column.property] === 'error'\r\n }\">\r\n {{ getIcon(element[column.property]) }}\r\n </mat-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary\" mat-cell>\r\n <mat-checkbox class=\"primary\" [checked]=\"element[column.property]\" (click)=\"$event.stopPropagation();actionCheckedClicked(column.property,element)\"></mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary\" mat-cell>\r\n <button mat-button class=\"stateType {{ element[column.property]}}\" [attr.id]=\"'table-btn-state-'+column.property\">{{ labelKeyByValue(column, element) | translate}}</button>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n {{ extractFieldName(element, column.property) | date:'yyyy-MM-dd' }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'croppedText'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n {{ getCroppedText(element[column.property], element[column.width]) }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'download'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" style=\"padding: 0;margin: 0;text-align: center;\" mat-cell>\r\n <mat-icon class=\"mainTable__td__icon-blue\">system_update_alt</mat-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'onOff'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <mat-icon *ngIf=\"element[column.property] === null\" class=\"mainTable__td__icon-darkorange\">flag</mat-icon>\r\n <mat-icon *ngIf=\"element[column.property] === false\" class=\"mainTable__td__icon-red\">flag</mat-icon>\r\n <mat-icon *ngIf=\"element[column.property] === true\" class=\"mainTable__td__icon-green\">flag</mat-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <span *ngIf=\"element[column.property] === null || element[column.property] === false\">\r\n {{ pageInfo.labelsSection + '.' + column.label + 'InActive' | translate }}\r\n </span>\r\n <span *ngIf=\"element[column.property] === true\">\r\n {{ pageInfo.labelsSection + '.' + column.label + 'Active' | translate }}\r\n </span>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'info'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td text-secondary\" mat-cell>\r\n <button mat-icon-button (click)=\"$event.stopPropagation();emitEvent(element)\" [attr.id]=\"'table-btn-info-'+element.id\">\r\n <mat-icon>info</mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <small><sup class=\"mainTable__td__currency\">{{element[column.currency]}}</sup></small>\r\n <span class=\"mainTable__td__property\">{{ extractFieldName(element, column.property) | currency:element[column.currency] :'' }}</span> of\r\n {{ extractFieldName(element, column.additionalProperty) | currency:element[column.currency] :'' }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n {{ extractFieldName(element, column.property) | date : extractFormat(column) }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <small><sup class=\"mainTable__td__currency\">{{element[column.currency]}}</sup></small>\r\n {{ extractFieldName(element, column.property) | number : (column.digitInfo || '1.3-5') }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'listAction'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" style=\"padding: 0!important;\" mat-cell>\r\n <app-button-actions \r\n [buttonsAction]=\"column.viewType === 'buttonsAction'\"\r\n [listAction]=\"listAction\" \r\n [actions]=\"listAction\" \r\n (clickedButton)=\"actionListClicked($event,element)\">\r\n </app-button-actions>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"column.translate; else noTranslate\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" (click)=\"emitRoutePage(element)\" mat-cell>\r\n {{ extractFieldName(element, column.property) | translate }}\r\n </td>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" (click)=\"emitRoutePage(element)\" mat-cell [innerHtml]='extractFieldName(element, column.property)'></td>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasGroups()\">\r\n <ng-container *ngFor=\"let groupName of this.groupNames\">\r\n <ng-container matColumnDef=\"{{groupName}}\">\r\n <th mat-header-cell class=\"extra-header\" *matHeaderCellDef [attr.colspan]=\"groupSpans.get(groupName)\">\r\n {{ (isHumanMade(groupName) ? groupName : \"\") | translate }}\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"this.groupNames\"></tr>\r\n </ng-container>\r\n\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (auxclick)=\"openNewTab(row)\" (click)=\"$event.stopPropagation(); onSelectItem(row)\" *matRowDef=\"let row; columns: visibleColumns\"\r\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'mainTable__highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'mainTable__dark_highlight': isDarkHighlight(row)\r\n }\"\r\n mat-row>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\r\n <mat-icon class=\"dataNotFound__icon\">{{ noDataFoundIcon }}</mat-icon>\r\n <span class=\"dataNotFound__title\">{{ noDataFoundTitle | translate}}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ noDataFoundSubtitle | translate}}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\r\n <ng-container *ngIf=\"enablePagination\">\r\n <div class=\"flex-column flex-100\">\r\n <app-paginator\r\n [currentPage]=\"pageIndex\"\r\n [totalItems]=\"totalElements\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\">\r\n </app-paginator>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;text-align:center}.dataNotFound__icon{color:var(--primary-color-3nd);font-size:40px;height:40px;width:40px;margin-bottom:8px}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex;align-items:center;width:100%;gap:12px}.filter-row app-filter-builder{flex:1}.button-group{width:15%;display:flex;justify-content:flex-end;gap:8px}.btn-export{height:44px!important}.arrow-icon{font-size:20px;margin-left:4px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{width:100%;justify-content:flex-start}.btn-export{width:100%}}.stateType{font-size:14px!important}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ButtonActionsComponent, selector: "app-button-actions", inputs: ["actions", "disabled", "buttonsAction", "listAction"], outputs: ["clickedButton"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: FilterBuilderComponent, selector: "app-filter-builder", inputs: ["columns", "isChecked", "filterFields", "pageInfo"], outputs: ["filterInformation", "isEmpty"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: 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: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "pipe", type: UpperCasePipe, name: "uppercase" }], animations: [] }); }
|
|
404
|
+
}
|
|
405
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, decorators: [{
|
|
406
|
+
type: Component,
|
|
407
|
+
args: [{ selector: 'app-base-table', standalone: true, animations: [], imports: [
|
|
408
|
+
NgStyle,
|
|
409
|
+
NgClass,
|
|
410
|
+
TranslateModule,
|
|
411
|
+
MatIcon,
|
|
412
|
+
MatSortModule,
|
|
413
|
+
MatColumnDef,
|
|
414
|
+
MatHeaderCellDef,
|
|
415
|
+
NgIf,
|
|
416
|
+
MatTable,
|
|
417
|
+
MatHeaderCell,
|
|
418
|
+
NgSwitch,
|
|
419
|
+
MatButtonModule,
|
|
420
|
+
MatCell,
|
|
421
|
+
MatCellDef,
|
|
422
|
+
DatePipe,
|
|
423
|
+
CurrencyPipe,
|
|
424
|
+
NgxPaginationModule,
|
|
425
|
+
MatRow,
|
|
426
|
+
MatRowDef,
|
|
427
|
+
MatHeaderRow,
|
|
428
|
+
NgSwitchCase,
|
|
429
|
+
NgSwitchDefault,
|
|
430
|
+
MatHeaderRowDef,
|
|
431
|
+
MatIconButton,
|
|
432
|
+
NgForOf,
|
|
433
|
+
JsonPipe,
|
|
434
|
+
MatButton,
|
|
435
|
+
ButtonActionsComponent,
|
|
436
|
+
MatLabel,
|
|
437
|
+
MatChipListbox,
|
|
438
|
+
MatChipOption,
|
|
439
|
+
MatButtonToggleGroup,
|
|
440
|
+
MatButtonToggle,
|
|
441
|
+
TitleBarComponent,
|
|
442
|
+
PaginatorComponent,
|
|
443
|
+
DecimalPipe,
|
|
444
|
+
MatCheckbox,
|
|
445
|
+
BaseFormCanvasComponent,
|
|
446
|
+
FilterBuilderComponent,
|
|
447
|
+
MatMenuTrigger,
|
|
448
|
+
MatMenu,
|
|
449
|
+
MatMenuItem,
|
|
450
|
+
UpperCasePipe,
|
|
451
|
+
], template: "<div class=\"flex-column baseTable\">\r\n <div class=\"flex-row flex-100\" *ngIf=\"!pageInfo.hideTitle\">\r\n <div [class.flex-50]=\"pageInfo.draftSupported\" [class.flex-100]=\"!pageInfo.draftSupported\" class=\"flex-column align-start\">\r\n <app-title-bar\r\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"showAddNew()\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\r\n [extraButton]=\"extraButton\"\r\n (newActionClicked)=\"onAddNewAction($event)\"\r\n (extractReport)=\"extractReport($event)\"\r\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\r\n </app-title-bar>\r\n </div>\r\n <div class=\"flex-50 flex-column align-end\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-listbox aria-label=\"Color selection\" [multiple]=\"false\">\r\n <mat-chip-option [selected]=\"!this.isPending\" [color]=\"'accent'\" [value]=\"'COMPLETED'\" (click)=\"switchViewMode(false)\">\r\n {{'finished' | translate}}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"this.isPending\" [color]=\"'accent'\" [value]=\"'PENDING'\" (click)=\"switchViewMode(true)\">\r\n {{'todo' | translate}}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\r\n <app-filter-builder\r\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n [filterFields]=\"filterFields\"\r\n (filterInformation)=\"doAdvancedSearch($event)\"\r\n (isEmpty)=\"resetData($event)\">\r\n </app-filter-builder>\r\n\r\n <div class=\"button-group\" >\r\n\r\n <button *ngIf=\"!pageInfo.hideExtractButton\"\r\n mat-flat-button\r\n [matMenuTriggerFor]=\"exportMenu\"\r\n color=\"primary\"\r\n class=\"btn-none-background-primary btn-export\"\r\n >\r\n <div class=\"button-text\">\r\n <mat-icon>file_export</mat-icon>\r\n <span>{{ 'export' | translate }}</span>\r\n <mat-icon class=\"arrow-icon\">arrow_drop_down</mat-icon>\r\n </div>\r\n </button>\r\n\r\n <mat-menu #exportMenu=\"matMenu\">\r\n <button\r\n mat-menu-item\r\n *ngFor=\"let type of types\"\r\n (click)=\"extractReport(type)\"\r\n >\r\n <span>{{ type | uppercase }}</span>\r\n </button>\r\n </mat-menu>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\r\n <div class=\"flex-100\">\r\n <div class=\"flex-row flex-100 mainTable\">\r\n <table [dataSource]=\"dataSource\" class=\"flex-fill\" mat-table matSort (matSortChange)=\"onSortAction($event)\">\r\n <ng-container *ngFor=\"let column of this.columns; let last=last\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container *ngIf=\"column.enableSorting; else withoutSortingColumn\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell mat-sort-header>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n </ng-container>\r\n <ng-template #withoutSortingColumn>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n </ng-template>\r\n\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary\" mat-cell>\r\n <button mat-button class=\"wfStatus {{ getStatusDescription(element)}}\" [attr.id]=\"'table-btn-wf-'+column.property+'-'+(element.id || element.key || '')\">{{ getStatusDescription(element) }}</button>\r\n </td>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <button mat-button class=\"wfStatus {{ getStatusDescription(element)}}\" [attr.id]=\"'table-btn-wf2-'+column.property+'-'+(element.id || element.key || '')\">{{ getStatusDescription(element) }}</button>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'hyper-text'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" (click)=\"hyperLinkClicked(column.property,element)\" mat-cell>\r\n <mat-label [ngClass]=\"{'hyper-link': shouldRenderAsHyperLink(element)}\">\r\n {{ extractFieldName(element, column.property) }}\r\n </mat-label>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary\" mat-cell>\r\n <button *ngIf=\"shouldShowButton(element)\" mat-button class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(column.property, element)\" [attr.id]=\"'table-btn-action-'+column.property\">\r\n {{ labelKey(column) + '_title' | translate }}\r\n </button>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'icon'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\" mat-cell>\r\n <mat-icon [ngClass]=\"{\r\n 'mainTable__td__icon-green': element[column.property] === 'pass',\r\n 'mainTable__td__icon-orange': element[column.property] === 'warning',\r\n 'mainTable__td__icon-red': element[column.property] === 'error'\r\n }\">\r\n {{ getIcon(element[column.property]) }}\r\n </mat-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary\" mat-cell>\r\n <mat-checkbox class=\"primary\" [checked]=\"element[column.property]\" (click)=\"$event.stopPropagation();actionCheckedClicked(column.property,element)\"></mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary\" mat-cell>\r\n <button mat-button class=\"stateType {{ element[column.property]}}\" [attr.id]=\"'table-btn-state-'+column.property\">{{ labelKeyByValue(column, element) | translate}}</button>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n {{ extractFieldName(element, column.property) | date:'yyyy-MM-dd' }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'croppedText'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n {{ getCroppedText(element[column.property], element[column.width]) }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'download'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" style=\"padding: 0;margin: 0;text-align: center;\" mat-cell>\r\n <mat-icon class=\"mainTable__td__icon-blue\">system_update_alt</mat-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'onOff'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <mat-icon *ngIf=\"element[column.property] === null\" class=\"mainTable__td__icon-darkorange\">flag</mat-icon>\r\n <mat-icon *ngIf=\"element[column.property] === false\" class=\"mainTable__td__icon-red\">flag</mat-icon>\r\n <mat-icon *ngIf=\"element[column.property] === true\" class=\"mainTable__td__icon-green\">flag</mat-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <span *ngIf=\"element[column.property] === null || element[column.property] === false\">\r\n {{ pageInfo.labelsSection + '.' + column.label + 'InActive' | translate }}\r\n </span>\r\n <span *ngIf=\"element[column.property] === true\">\r\n {{ pageInfo.labelsSection + '.' + column.label + 'Active' | translate }}\r\n </span>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'info'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td text-secondary\" mat-cell>\r\n <button mat-icon-button (click)=\"$event.stopPropagation();emitEvent(element)\" [attr.id]=\"'table-btn-info-'+element.id\">\r\n <mat-icon>info</mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <small><sup class=\"mainTable__td__currency\">{{element[column.currency]}}</sup></small>\r\n <span class=\"mainTable__td__property\">{{ extractFieldName(element, column.property) | currency:element[column.currency] :'' }}</span> of\r\n {{ extractFieldName(element, column.additionalProperty) | currency:element[column.currency] :'' }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n {{ extractFieldName(element, column.property) | date : extractFormat(column) }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <small><sup class=\"mainTable__td__currency\">{{element[column.currency]}}</sup></small>\r\n {{ extractFieldName(element, column.property) | number : (column.digitInfo || '1.3-5') }}\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'listAction'\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" style=\"padding: 0!important;\" mat-cell>\r\n <app-button-actions \r\n [buttonsAction]=\"column.viewType === 'buttonsAction'\"\r\n [listAction]=\"listAction\" \r\n [actions]=\"listAction\" \r\n (clickedButton)=\"actionListClicked($event,element)\">\r\n </app-button-actions>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"column.translate; else noTranslate\">\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" (click)=\"emitRoutePage(element)\" mat-cell>\r\n {{ extractFieldName(element, column.property) | translate }}\r\n </td>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" (click)=\"emitRoutePage(element)\" mat-cell [innerHtml]='extractFieldName(element, column.property)'></td>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasGroups()\">\r\n <ng-container *ngFor=\"let groupName of this.groupNames\">\r\n <ng-container matColumnDef=\"{{groupName}}\">\r\n <th mat-header-cell class=\"extra-header\" *matHeaderCellDef [attr.colspan]=\"groupSpans.get(groupName)\">\r\n {{ (isHumanMade(groupName) ? groupName : \"\") | translate }}\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"this.groupNames\"></tr>\r\n </ng-container>\r\n\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (auxclick)=\"openNewTab(row)\" (click)=\"$event.stopPropagation(); onSelectItem(row)\" *matRowDef=\"let row; columns: visibleColumns\"\r\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'mainTable__highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'mainTable__dark_highlight': isDarkHighlight(row)\r\n }\"\r\n mat-row>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\r\n <mat-icon class=\"dataNotFound__icon\">{{ noDataFoundIcon }}</mat-icon>\r\n <span class=\"dataNotFound__title\">{{ noDataFoundTitle | translate}}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ noDataFoundSubtitle | translate}}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\r\n <ng-container *ngIf=\"enablePagination\">\r\n <div class=\"flex-column flex-100\">\r\n <app-paginator\r\n [currentPage]=\"pageIndex\"\r\n [totalItems]=\"totalElements\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\">\r\n </app-paginator>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;text-align:center}.dataNotFound__icon{color:var(--primary-color-3nd);font-size:40px;height:40px;width:40px;margin-bottom:8px}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex;align-items:center;width:100%;gap:12px}.filter-row app-filter-builder{flex:1}.button-group{width:15%;display:flex;justify-content:flex-end;gap:8px}.btn-export{height:44px!important}.arrow-icon{font-size:20px;margin-left:4px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{width:100%;justify-content:flex-start}.btn-export{width:100%}}.stateType{font-size:14px!important}\n"] }]
|
|
452
|
+
}], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }, { type: i3.ShareDataService }, { type: undefined, decorators: [{
|
|
453
|
+
type: Inject,
|
|
454
|
+
args: ['securityManager']
|
|
455
|
+
}] }, { type: i4.Router }], propDecorators: { filterFields: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], noDataFoundIcon: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], noDataFoundTitle: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], noDataFoundSubtitle: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], pageInfo: [{
|
|
464
|
+
type: Input
|
|
465
|
+
}], enablePagination: [{
|
|
466
|
+
type: Input
|
|
467
|
+
}], data: [{
|
|
468
|
+
type: Input
|
|
469
|
+
}], listAction: [{
|
|
470
|
+
type: Input
|
|
471
|
+
}], columns: [{
|
|
472
|
+
type: Input
|
|
473
|
+
}], filters: [{
|
|
474
|
+
type: Input
|
|
475
|
+
}], pathParam: [{
|
|
476
|
+
type: Input
|
|
477
|
+
}], extraButton: [{
|
|
478
|
+
type: Input
|
|
479
|
+
}], enforceRefresh: [{
|
|
480
|
+
type: Input
|
|
481
|
+
}], isPending: [{
|
|
482
|
+
type: Input
|
|
483
|
+
}], trigger: [{
|
|
484
|
+
type: Input
|
|
485
|
+
}], reportRequest: [{
|
|
486
|
+
type: Input
|
|
487
|
+
}], separateEndpointData: [{
|
|
488
|
+
type: Input
|
|
489
|
+
}], manageablePages: [{
|
|
490
|
+
type: Input
|
|
491
|
+
}], totalPagesCount: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], currentPageIndex: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], pageChange: [{
|
|
496
|
+
type: Output
|
|
497
|
+
}], userAction: [{
|
|
498
|
+
type: Output
|
|
499
|
+
}], hyperLinkAction: [{
|
|
500
|
+
type: Output
|
|
501
|
+
}], extraAction: [{
|
|
502
|
+
type: Output
|
|
503
|
+
}], selectedColumn: [{
|
|
504
|
+
type: Output
|
|
505
|
+
}], listActionClicked: [{
|
|
506
|
+
type: Output
|
|
507
|
+
}], showDialog: [{
|
|
508
|
+
type: Output
|
|
509
|
+
}], customizedData: [{
|
|
510
|
+
type: Input
|
|
511
|
+
}], clickRoutePage: [{
|
|
512
|
+
type: Output
|
|
513
|
+
}] } });
|
|
514
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLE9BQU8sRUFDUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGVBQWUsRUFDZixNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEsRUFDUixrQkFBa0IsRUFDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxhQUFhLEVBQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsRUFBRSxXQUFXLEVBQ3JCLFFBQVEsRUFDUixPQUFPLEVBQ1AsT0FBTyxFQUNQLElBQUksRUFDSixPQUFPLEVBQ1AsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBQUUsYUFBYSxFQUMvQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRixPQUFP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O3dCQUNsQixXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsdUJBQXVCO3dCQUN2QixzQkFBc0I7d0JBQ3RCLGNBQWM7d0JBQ2QsT0FBTzt3QkFDUCxXQUFXO3dCQUNYLGFBQWE7cUJBQ2Q7OzBCQTBISSxNQUFNOzJCQUFDLGlCQUFpQjs4REFuRzdCLFlBQVk7c0JBRFgsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBV0csUUFBUTtzQkFEaEIsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFJTixjQUFjO3NCQURiLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSztnQkFHTixlQUFlO3NCQURkLEtBQUs7Z0JBR04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxNQUFNO2dCQUtQLFVBQVU7c0JBRFQsTUFBTTtnQkFHUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsV0FBVztzQkFEVixNQUFNO2dCQUlQLGNBQWM7c0JBRGIsTUFBTTtnQkFJUCxpQkFBaUI7c0JBRGhCLE1BQU07Z0JBT1AsVUFBVTtzQkFEVCxNQUFNO2dCQVFQLGNBQWM7c0JBRGIsS0FBSztnQkFTTixjQUFjO3NCQURiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBlZmZlY3QsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXNcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIE1hdENlbGwsXHJcbiAgTWF0Q2VsbERlZixcclxuICBNYXRDb2x1bW5EZWYsXHJcbiAgTWF0SGVhZGVyQ2VsbCxcclxuICBNYXRIZWFkZXJDZWxsRGVmLFxyXG4gIE1hdEhlYWRlclJvdyxcclxuICBNYXRIZWFkZXJSb3dEZWYsXHJcbiAgTWF0Um93LFxyXG4gIE1hdFJvd0RlZixcclxuICBNYXRUYWJsZSxcclxuICBNYXRUYWJsZURhdGFTb3VyY2VcclxufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7TWF0U29ydE1vZHVsZSwgU29ydH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NvcnRcIjtcclxuaW1wb3J0IHtcclxuICBDdXJyZW5jeVBpcGUsXHJcbiAgRGF0ZVBpcGUsIERlY2ltYWxQaXBlLFxyXG4gIEpzb25QaXBlLFxyXG4gIE5nQ2xhc3MsXHJcbiAgTmdGb3JPZixcclxuICBOZ0lmLFxyXG4gIE5nU3R5bGUsXHJcbiAgTmdTd2l0Y2gsXHJcbiAgTmdTd2l0Y2hDYXNlLFxyXG4gIE5nU3dpdGNoRGVmYXVsdCwgVXBwZXJDYXNlUGlwZVxyXG59IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge01hdEJ1dHRvbiwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uQnV0dG9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7Tmd4UGFnaW5hdGlvbk1vZHVsZX0gZnJvbSBcIm5neC1wYWdpbmF0aW9uXCI7XHJcbmltcG9ydCB7QnV0dG9uQWN0aW9uc0NvbXBvbmVudH0gZnJvbSBcIi4uL2J1dHRvbi1hY3Rpb25zL2J1dHRvbi1hY3Rpb25zLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1NoYXJlRGF0YVNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy90cmlnZ2VyLWZvcm0uc2VydmljZVwiO1xyXG5pbXBvcnQge0Jhc2VVdGlsc30gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtCYWNrZW5kU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2JhY2tlbmQtc2VydmljZVwiO1xyXG5pbXBvcnQge0ZpbHRlcn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmlsdGVyLm1vZGVsXCI7XHJcbmltcG9ydCB7RmlsdGVyUmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmlsdGVyLXJlcXVlc3RcIjtcclxuaW1wb3J0IHtcclxuICBBRERfTkVXX1JFQ09SRF9BQ1RJT04sXHJcbiAgQnV0dG9uQWN0aW9uU2V0dGluZ3MsXHJcbiAgRU1QVFlfUEFHRV9JTkZPLCBGaWVsZEluZm8sXHJcbiAgRlJPTlRfRU5EX0NPTFVNTl9UWVBFUyxcclxuICBQYWdlSW5mbyxcclxuICBTRUxFQ1RfUkVDT1JEX0FDVElPTiwgVEFCTEVfUkVDT1JEX0FDVElPTixcclxuICBUYWJsZUNvbHVtblxyXG59IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XHJcbmltcG9ydCB7UmVwb3J0UmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvcmVwb3J0LXJlcXVlc3QubW9kZWxcIjtcclxuaW1wb3J0IHtUYWJsZVBhZ2VVc2VyQWN0aW9ufSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC90YWJsZS1wYWdlLXVzZXItYWN0aW9uLmludGVyZmFjZVwiO1xyXG5pbXBvcnQge1dvcmtmbG93fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC93b3JrZmxvdy93b3JrZmxvdy5tb2RlbFwiO1xyXG5pbXBvcnQge1Jlc3BvbnNlRW52ZWxvcH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvcmVzcG9uc2UtZW52ZWxvcC5tb2RlbFwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge01hdExhYmVsfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQge01hdENoaXBMaXN0Ym94LCBNYXRDaGlwT3B0aW9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHNcIjtcclxuaW1wb3J0IHtNYXRCdXR0b25Ub2dnbGUsIE1hdEJ1dHRvblRvZ2dsZUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uLXRvZ2dsZVwiO1xyXG5pbXBvcnQge1RpdGxlQmFyQ29tcG9uZW50fSBmcm9tIFwiLi4vdGl0bGUtYmFyL3RpdGxlLWJhci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtQYWdpbmF0b3JDb21wb25lbnR9IGZyb20gXCIuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge01hdENoZWNrYm94fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcclxuaW1wb3J0IHtCYXNlRm9ybUNhbnZhc0NvbXBvbmVudH0gZnJvbSBcIi4uL2Jhc2UtZm9ybS1jYW52YXMvYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtGaWx0ZXJCdWlsZGVyQ29tcG9uZW50fSBmcm9tIFwiLi4vYWR2YW5jZWQtZmlsdGVyL2ZpbHRlci1idWlsZGVyL2ZpbHRlci1idWlsZGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0ZpZWxkRmlsdGVyfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWVsZC1maWx0ZXIubW9kZWxcIjtcclxuaW1wb3J0IHtNYXRNZW51LCBNYXRNZW51SXRlbSwgTWF0TWVudVRyaWdnZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9tZW51XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1iYXNlLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXNlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9iYXNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW10sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdTdHlsZSxcclxuICAgIE5nQ2xhc3MsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBNYXRJY29uLFxyXG4gICAgTWF0U29ydE1vZHVsZSxcclxuICAgIE1hdENvbHVtbkRlZixcclxuICAgIE1hdEhlYWRlckNlbGxEZWYsXHJcbiAgICBOZ0lmLFxyXG4gICAgTWF0VGFibGUsXHJcbiAgICBNYXRIZWFkZXJDZWxsLFxyXG4gICAgTmdTd2l0Y2gsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRDZWxsLFxyXG4gICAgTWF0Q2VsbERlZixcclxuICAgIERhdGVQaXBlLFxyXG4gICAgQ3VycmVuY3lQaXBlLFxyXG4gICAgTmd4UGFnaW5hdGlvbk1vZHVsZSxcclxuICAgIE1hdFJvdyxcclxuICAgIE1hdFJvd0RlZixcclxuICAgIE1hdEhlYWRlclJvdyxcclxuICAgIE5nU3dpdGNoQ2FzZSxcclxuICAgIE5nU3dpdGNoRGVmYXVsdCxcclxuICAgIE1hdEhlYWRlclJvd0RlZixcclxuICAgIE1hdEljb25CdXR0b24sXHJcbiAgICBOZ0Zvck9mLFxyXG4gICAgSnNvblBpcGUsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBCdXR0b25BY3Rpb25zQ29tcG9uZW50LFxyXG4gICAgTWF0TGFiZWwsXHJcbiAgICBNYXRDaGlwTGlzdGJveCxcclxuICAgIE1hdENoaXBPcHRpb24sXHJcbiAgICBNYXRCdXR0b25Ub2dnbGVHcm91cCxcclxuICAgIE1hdEJ1dHRvblRvZ2dsZSxcclxuICAgIFRpdGxlQmFyQ29tcG9uZW50LFxyXG4gICAgUGFnaW5hdG9yQ29tcG9uZW50LFxyXG4gICAgRGVjaW1hbFBpcGUsXHJcbiAgICBNYXRDaGVja2JveCxcclxuICAgIEJhc2VGb3JtQ2FudmFzQ29tcG9uZW50LFxyXG4gICAgRmlsdGVyQnVpbGRlckNvbXBvbmVudCxcclxuICAgIE1hdE1lbnVUcmlnZ2VyLFxyXG4gICAgTWF0TWVudSxcclxuICAgIE1hdE1lbnVJdGVtLFxyXG4gICAgVXBwZXJDYXNlUGlwZSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBCYXNlVXRpbHMgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICB0eXBlczogc3RyaW5nW10gPSBbXCJwZGZcIiwgXCJjc3ZcIiwgXCJ4bHN4XCJdXHJcbiAgY29sbGVjdGlvbiA9IHtjb3VudDogNjAsIGRhdGE6IFtdfTtcclxuICBjb25maWcgPSB7XHJcbiAgICBpdGVtc1BlclBhZ2U6IDE1LFxyXG4gICAgY3VycmVudFBhZ2U6IDEsXHJcbiAgICB0b3RhbEl0ZW1zOiB0aGlzLmNvbGxlY3Rpb24uY291bnRcclxuICB9O1xyXG4gIHB1YmxpYyBtYXhTaXplOiBudW1iZXIgPSA3O1xyXG4gIHB1YmxpYyBkaXJlY3Rpb25MaW5rczogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGF1dG9IaWRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHJlc3BvbnNpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBsYWJlbHM6IGFueSA9IHtcclxuICAgIHByZXZpb3VzTGFiZWw6ICc8JyxcclxuICAgIG5leHRMYWJlbDogJz4nLFxyXG4gICAgc2NyZWVuUmVhZGVyUGFnaW5hdGlvbkxhYmVsOiAnUGFnaW5hdGlvbicsXHJcbiAgICBzY3JlZW5SZWFkZXJQYWdlTGFiZWw6ICdwYWdlJyxcclxuICAgIHNjcmVlblJlYWRlckN1cnJlbnRMYWJlbDogYFlvdSdyZSBvbiBwYWdlYFxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZmlsdGVyRmllbGRzOiBGaWVsZEluZm9bXTtcclxuICBASW5wdXQoKSBub0RhdGFGb3VuZEljb24gPSAnY2xvc2UnO1xyXG4gIEBJbnB1dCgpIG5vRGF0YUZvdW5kVGl0bGUgPSAnbm9EYXRhRm91bmRUaXRsZSc7XHJcbiAgQElucHV0KCkgbm9EYXRhRm91bmRTdWJ0aXRsZSA9ICdub0RhdGFGb3VuZFN1YnRpdGxlJztcclxuICB0b3RhbEVsZW1lbnRzID0gMDtcclxuICBwYWdlc0NvdW50ID0gMDtcclxuICBwYWdlSW5kZXggPSAxO1xyXG4gIHBhZ2VTaXplID0gMTU7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZFN0YXR1c0ZpbHRlcjogRmlsdGVyW10gPSBbXTtcclxuICBhZHZhbmNlZEFwcGxpZWRGaWx0ZXI6IGFueVtdID0gW107XHJcbiAgc2VhcmNoU3RyOiBzdHJpbmcgPSAnJztcclxuICBwcml2YXRlIGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xyXG4gIHByaXZhdGUgdGltZXI6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIG92ZXJyaWRlIHBhZ2VJbmZvOiBQYWdlSW5mbyA9IEVNUFRZX1BBR0VfSU5GTztcclxuXHJcbiAgQElucHV0KClcclxuICBlbmFibGVQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgZGF0YT86IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xyXG4gIEBJbnB1dCgpXHJcbiAgbGlzdEFjdGlvbjogQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbHVtbnM6IFRhYmxlQ29sdW1uPGFueT5bXTtcclxuXHJcbiAgQElucHV0KClcclxuICBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSAvL0B0cy1pZ25vcmVcclxuICBwYXRoUGFyYW06IG51bWJlcjtcclxuXHJcbiAgQElucHV0KCkgLy9AdHMtaWdub3JlXHJcbiAgZXh0cmFCdXR0b246IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgLy9AdHMtaWdub3JlXHJcbiAgZW5mb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBpc1BlbmRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICB0cmlnZ2VyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcmVwb3J0UmVxdWVzdDogUmVwb3J0UmVxdWVzdCA9IG5ldyBSZXBvcnRSZXF1ZXN0KHt9KTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXBhcmF0ZUVuZHBvaW50RGF0YTogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgbWFuYWdlYWJsZVBhZ2VzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICB0b3RhbFBhZ2VzQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgQElucHV0KClcclxuICBjdXJyZW50UGFnZUluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHVzZXJBY3Rpb246IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2VVc2VyQWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4oKTtcclxuICBAT3V0cHV0KClcclxuICBoeXBlckxpbmtBY3Rpb246IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2VVc2VyQWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgZXh0cmFBY3Rpb246IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2VVc2VyQWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWRDb2x1bW46IEV2ZW50RW1pdHRlcjxTb3J0PiA9IG5ldyBFdmVudEVtaXR0ZXI8U29ydD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgbGlzdEFjdGlvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjx7IGFjdGlvbjogQnV0dG9uQWN0aW9uU2V0dGluZ3MsIHJvdzogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLFxyXG4gICAgcm93OiBhbnlcclxuICB9PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBzaG93RGlhbG9nOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICB1c2VkV29ya2Zsb3chOiBXb3JrZmxvdztcclxuXHJcbiAgbW9kZTphbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY3VzdG9taXplZERhdGE/OiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBzZWxlY3RlZFJvd0luZGV4ID0gLTE7XHJcbiAgbm9EYXRhRm91bmQgPSBmYWxzZTtcclxuICB0b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gMDtcclxuXHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNsaWNrUm91dGVQYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICAgcHJpdmF0ZSBiYWNrZW5kU2VydmljZTogQmFja2VuZFNlcnZpY2UsXHJcbiAgICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICBwdWJsaWMgc2hhcmVEYXRhU2VydmljZTogU2hhcmVEYXRhU2VydmljZSxcclxuICAgICAgQEluamVjdCgnc2VjdXJpdHlNYW5hZ2VyJykgcHJpdmF0ZSBzZWN1cml0eU1hbmFnZXI6IGFueSxcclxuICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKCk7XHJcbiAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdCA9IG5ldyBGaWx0ZXJSZXF1ZXN0KCk7XHJcblxyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMucGFnZUluZm8ubGF6eUxvYWREYXRhICE9PSB0cnVlIHx8IHRoaXMuZW5mb3JjZVJlZnJlc2ggPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmlzRW1wdHlJdGVtcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA8PSAwO1xyXG4gICAgaWYgKHRoaXMuY3VzdG9taXplZERhdGEpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5jdXN0b21pemVkRGF0YTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XHJcbiAgICAgIHRoaXMucGFnZXNDb3VudCA9IHRoaXMudG90YWxQYWdlc0NvdW50O1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMuY3VycmVudFBhZ2VJbmRleDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudDtcclxuICAgIHRoaXMuZ2V0TmV4dCh0aGlzLnBhZ2VJbmRleCAtIDEpO1xyXG4gICAgaWYgKHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XHJcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMucGFnZUluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBleHRyYWN0RmllbGROYW1lKGVsZW1lbnQ6IGFueSwgcHJvcGVydHk6IHN0cmluZykge1xyXG4gICAgaWYgKHByb3BlcnR5LmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IGFjYyAmJiBhY2NbcGFydF0sIGVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50W3Byb3BlcnR5XSkgJiYgYy5hcnJheVN1YlByb3BlcnR5ICkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZWxlbWVudFtwcm9wZXJ0eV0ubWFwKGYgPT4gZltjLmFycmF5U3ViUHJvcGVydHldKTtcclxuICAgICAgICByZXR1cm4gIGZpZWxkVmFsdWVzLmpvaW4oJywgJyk7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHRoaXMuYnVpbGRHcm91cHMoKVxyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XHJcbiAgfVxyXG5cclxuICBnZXROZXh0KHBhZ2VJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgfVxyXG4gIG9uUGFnZVNpemVDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50O1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSAxOyAvLyByZXNldCB0byBmaXJzdCBwYWdlIG9uIHBhZ2Ugc2l6ZSBjaGFuZ2VcclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcclxuICAgIHRoaXMuZ2V0TmV4dCgwKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcHJpdmF0ZSBsb2FkRGF0YSgpIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcclxuICAgIGlmICghdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCh0aGlzLnBhZ2VJbmZvLnBhZ2VTaXplKTtcclxuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VwYXJhdGVFbmRwb2ludERhdGEgfHwgIXRoaXMucGFnZUluZm8uYXBpVXJpIHx8IHRoaXMucGFnZUluZm8uYXBpVXJpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuc2VwYXJhdGVFbmRwb2ludERhdGE7XHJcbiAgICB9IGVsc2UgaWYodGhpcy5yZXBvcnRSZXF1ZXN0ID09IHVuZGVmaW5lZCl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZighdGhpcy5tYW5hZ2VhYmxlUGFnZXMpICB7XHJcbiAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmNvbHVtbnMgPSB0aGlzLmNvbHVtbnM/LmZpbHRlcihjID0+IEZST05UX0VORF9DT0xVTU5fVFlQRVMuaW5kZXhPZihjLnR5cGUpIDwgMCApLm1hcChjID0+IGMucHJvcGVydHkpIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGVuZGluZ1BhZ2UgPSB0aGlzLmlzUGVuZGluZztcclxuICAgICAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmZpbHRlcnMgPSB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlcjtcclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRJdGVtc0J5RmlsdGVyKHRoaXMucmVwb3J0UmVxdWVzdD8uZmlsdGVyUmVxdWVzdCwgdGhpcy5wYWdlSW5mby5hcGlVcmkpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUVudmVsb3BlID0gbmV3IFJlc3BvbnNlRW52ZWxvcChyZXNwKTtcclxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2VFbnZlbG9wZS52YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemVcclxuICAgICAgICAgICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSByZXNwb25zZUVudmVsb3BlLmJvZHkubGVuZ3RoIDwgMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gcmVzcG9uc2VFbnZlbG9wZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPD0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMudG90YWxFbGVtZW50cyA9IHJlc3BvbnNlRW52ZWxvcGUudG90YWxTaXplIHx8IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzQ291bnQgPSBNYXRoLmNlaWwodGhpcy50b3RhbEVsZW1lbnRzIC8gdGhpcy5wYWdlU2l6ZSkgfHwgMTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gKHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCB8fCAwKSArIDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy50b3RhbEl0ZW1zID0gcmVzcG9uc2VFbnZlbG9wZS50b3RhbFNpemUgfHwgMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlSW5kZXggKyAxO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5wYWdlU2l6ZSA9IHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAsIDMwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0dXNEZXNjcmlwdGlvbihlbGVtZW50OiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldFN0YXR1c0Rlc2NyaXB0aW9uKGVsZW1lbnQsIHRoaXMudXNlZFdvcmtmbG93KTtcclxuICB9XHJcblxyXG4gIGdldFN0YXRlVHlwZShlbGVtZW50OiBhbnkpIHtcclxuICAgIHJldHVybiBlbGVtZW50LnN0YXRlVHlwZVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJjdXN0b21pemVkRGF0YVwiXSAmJiAhY2hhbmdlc1tcImN1c3RvbWl6ZWREYXRhXCJdLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGNoYW5nZXNbXCJjdXN0b21pemVkRGF0YVwiXS5jdXJyZW50VmFsdWU/LmRhdGEgfHwgW107ICAvLyBVcGRhdGUgZGF0YSBzb3VyY2Ugd2l0aCBuZXcgZGF0YVxyXG4gICAgICB0aGlzLnBhZ2VzQ291bnQ9dGhpcy50b3RhbFBhZ2VzQ291bnQ7XHJcbiAgICAgIHRoaXMucGFnZUluZGV4PXRoaXMuY3VycmVudFBhZ2VJbmRleDtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzW1wiZW5mb3JjZVJlZnJlc2hcIl0gJiYgIWNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRDcm9wcGVkVGV4dChlbGVtZW50VmFsdWU6IGFueSwgc3ViV2lkdGg6IG51bWJlciA9IDIwKSB7XHJcbiAgICByZXR1cm4gZWxlbWVudFZhbHVlICYmIGVsZW1lbnRWYWx1ZS5sZW5ndGggPiBzdWJXaWR0aCA/IGVsZW1lbnRWYWx1ZS5zdWJzdHJpbmcoMCwgc3ViV2lkdGgpICsgXCIuLi5cIiA6IGVsZW1lbnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGVtaXRFdmVudChlbGVtZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2hvd0RpYWxvZy5lbWl0KGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgZXh0cmFjdEZvcm1hdChjb2x1bW46IFRhYmxlQ29sdW1uPGFueT4pIHtcclxuICAgIHJldHVybiBjb2x1bW4/LmZvcm1hdCB8fCAnZC9NL3l5eXksIGg6bW0gYSc7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25MaXN0Q2xpY2tlZChsaXN0QWN0aW9uOiBCdXR0b25BY3Rpb25TZXR0aW5ncywgZWxlbWVudDogYW55KSB7XHJcbiAgICB0aGlzLmxpc3RBY3Rpb25DbGlja2VkLmVtaXQoe2FjdGlvbjpsaXN0QWN0aW9uLCByb3c6IGVsZW1lbnR9KTtcclxuICB9XHJcblxyXG4gIGh5cGVyTGlua0NsaWNrZWQoYWN0aW9uTmFtZTogc3RyaW5nLCBlbGVtZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGFjdGlvbiA9IFRBQkxFX1JFQ09SRF9BQ1RJT047XHJcbiAgICBhY3Rpb24uYWN0aW9uS2V5ID0gYWN0aW9uTmFtZTtcclxuICAgIGFjdGlvbi5pdGVtID0gZWxlbWVudDtcclxuICAgIGFjdGlvbi5wYWdlSW5mbyA9IHRoaXMucGFnZUluZm87XHJcbiAgICB0aGlzLmh5cGVyTGlua0FjdGlvbi5lbWl0KGFjdGlvbilcclxuICB9XHJcblxyXG5cclxuICBlbWl0Um91dGVQYWdlKGVsZW1lbnQ6IGFueSl7XHJcbiAgICB0aGlzLmNsaWNrUm91dGVQYWdlLmVtaXQoZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdEl0ZW0ocm93OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnBhZ2VJbmZvLnNlbGZSb3V0aW5nKSB7XHJcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmlzUGVuZGluZyA/ICdwZW5kaW5nJyA6ICd2aWV3JztcclxuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5wYWdlSW5mby5saXN0Um91dGVQYXRoIHx8IHRoaXMucm91dGVyLnVybH0vdmlld2A7XHJcblxyXG4gICAgICBjb25zdCBlbmNyeXB0ZWRJZCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChTdHJpbmcocm93LmlkKSk7XHJcbiAgICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQobW9kZSk7XHJcblxyXG4gICAgICBjb25zdCBlbmNyeXB0ZWRSb3cgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkocm93KSk7XHJcblxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSwge1xyXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCwgbW9kZTogZW5jcnlwdGVkTW9kZSB9LFxyXG4gICAgICAgIHN0YXRlOiB7IHJhdzogZW5jcnlwdGVkUm93IH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcclxuICAgIC8vIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XHJcbiAgICAvLyBhY3Rpb24uaXRlbSA9IHJvdztcclxuICAgIC8vIHRoaXMudXNlckFjdGlvbi5lbWl0KGFjdGlvbilcclxuICB9XHJcblxyXG4gIG9wZW5OZXdUYWIocm93KSB7XHJcbiAgICBpZiAoIXRoaXMucGFnZUluZm8uZW1iZWRlZFRhYmxlT25seSkge1xyXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aH0vJHttb2RlfWAgKyAnLycgKyByb3c/LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN3aXRjaFZpZXdNb2RlKGI6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNQZW5kaW5nID0gIXRoaXMuaXNQZW5kaW5nO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgb25BZGROZXdBY3Rpb24oJGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aCB8fCB0aGlzLnJvdXRlci51cmx9L3ZpZXdgO1xyXG4gICAgY29uc3QgZW5jcnlwdGVkSWQgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoXCItMVwiKTtcclxuICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoXCJwZW5kaW5nXCIpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH1gXSxcclxuICAgICAgeyBxdWVyeVBhcmFtczogeyB0b2tlbjogZW5jcnlwdGVkSWQgLCBtb2RlIDogZW5jcnlwdGVkTW9kZSB9IH0pO1xyXG5cclxuICAgIC8vIGNvbnN0IGFjdGlvbiA9IFNFTEVDVF9SRUNPUkRfQUNUSU9OO1xyXG4gICAgLy8gYWN0aW9uLmlkID0gcm93Py5pZDtcclxuICAgIC8vIGFjdGlvbi5pdGVtID0gcm93O1xyXG4gICAgLy8gdGhpcy51c2VyQWN0aW9uLmVtaXQoYWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgc2hvd0FkZE5ldygpIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2VJbmZvLmhhc0FkZEJ1dHRvbiA7XHJcbiAgfVxyXG5cclxuICBvbkV4dHJhQnV0dGlvbkFjdGlvbigkZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5leHRyYUFjdGlvbi5lbWl0KCRldmVudCk7XHJcblxyXG4gIH1cclxuXHJcbiAgaGFzR3JvdXBzKCkge1xyXG4gICAgbGV0IGIgPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KHAgPT4gcC5ncm91cCk7XHJcbiAgICByZXR1cm4gYiA+PSAwO1xyXG4gIH1cclxuICBncm91cE5hbWVzOiBhbnkgPSBbXVxyXG4gIGdyb3VwU3BhbnM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIGJ1aWxkR3JvdXBzKCl7XHJcbiAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgdGhpcy5ncm91cE5hbWVzID0gW107XHJcbiAgICB0aGlzLmdyb3VwU3BhbnMuY2xlYXIoKTtcclxuICAgIGlmKHRoaXMuaGFzR3JvdXBzKCkgPT09IGZhbHNlKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlID09PSB0cnVlKVxyXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbHVtbi5ncm91cCA9PT0gXCItXCIpIHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lcy5wdXNoKGNvdW50LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgdGhpcy5pbnNlcnRJbk1hcChjb3VudCk7XHJcbiAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZ3JvdXBOYW1lcy5pbmNsdWRlcyhjb2x1bW4uZ3JvdXApKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwTmFtZXMucHVzaChjb2x1bW4uZ3JvdXApO1xyXG4gICAgICAgICAgdGhpcy5pbnNlcnRJbk1hcChjb2x1bW4uZ3JvdXApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluc2VydEluTWFwKGNvbHVtbi5ncm91cCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0SW5NYXAoa2V5KXtcclxuICAgIGlmKHRoaXMuZ3JvdXBTcGFucy5oYXMoa2V5KSl7XHJcbiAgICAgIHRoaXMuZ3JvdXBTcGFucy5zZXQoa2V5LnRvU3RyaW5nKCksIHRoaXMuZ3JvdXBTcGFucy5nZXQoa2V5KSArIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncm91cFNwYW5zLnNldChrZXkudG9TdHJpbmcoKSwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0h1bWFuTWFkZShzdHIpe1xyXG4gICAgcmV0dXJuIGlzTmFOKHN0cik7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25CdXR0b25DbGlja2VkKGFjdGlvbktleTogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChhY3Rpb25LZXkgPT09ICduYXZpZ2F0ZScpIHtcclxuICAgICAgdGhpcy5oYW5kbGVOYXZpZ2F0ZUFjdGlvbihpdGVtKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFRhYmxlQWN0aW9uKGFjdGlvbktleSwgaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRlQWN0aW9uKGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xyXG4gICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVBhdGh9L3ZpZXdgO1xyXG5cclxuICAgIGNvbnN0IGVuY3J5cHRlZElkID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KGl0ZW0uaWQudG9TdHJpbmcoKSk7XHJcbiAgICBjb25zdCBlbmNyeXB0ZWRNb2RlID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KG1vZGUpO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdLCB7XHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCwgbW9kZTogZW5jcnlwdGVkTW9kZSB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdFRhYmxlQWN0aW9uKGFjdGlvbktleTogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFjdGlvbiA9IFRBQkxFX1JFQ09SRF9BQ1RJT047XHJcbiAgICBhY3Rpb24uYWN0aW9uS2V5ID0gYWN0aW9uS2V5O1xyXG4gICAgYWN0aW9uLml0ZW0gPSBpdGVtO1xyXG4gICAgYWN0aW9uLnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcclxuICAgIHRoaXMudXNlckFjdGlvbi5lbWl0KGFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0UmVwb3J0KHJlcG9ydFR5cGU6IGFueSkge1xyXG4gICAgY29uc3QgbXlGaWx0ZXJzID0gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Q7XHJcbiAgICBjb25zdCByZXBvcnRSZXF1ZXN0ID0gdGhpcy5iYWNrZW5kU2VydmljZS5idWlsZFJlcG9ydFJlcXVlc3QodGhpcy5jb2x1bW5zLCB0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLmxpc3RfdGl0bGUnLFxyXG4gICAgICBteUZpbHRlcnMsIHJlcG9ydFR5cGUsIHRoaXMucGFnZUluZm8sIHRoaXMuc2VhcmNoU3RyLCAnTEFORFNDQVBFJyk7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvd25sb2FkUmVwb3J0KHJlcG9ydFJlcXVlc3QsIHRoaXMucGFnZUluZm8uYXBpVXJpKTtcclxuICB9XHJcblxyXG4gIGdldEljb24oc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgY2FzZSAncGFzcyc6IHJldHVybiAnY2hlY2tfY2lyY2xlJztcclxuICAgICAgY2FzZSAnd2FybmluZyc6IHJldHVybiAnd2FybmluZyc7XHJcbiAgICAgIGNhc2UgJ2Vycm9yJzogcmV0dXJuICdlcnJvcic7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnaGVscCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25DaGVja2VkQ2xpY2tlZChwcm9wZXJ0eTogc3RyaW5nLCBlbGVtZW50KSB7XHJcbiAgICBlbGVtZW50W3Byb3BlcnR5XT0gIWVsZW1lbnRbcHJvcGVydHldO1xyXG4gICAgdGhpcy5hY3Rpb25CdXR0b25DbGlja2VkKHByb3BlcnR5LCBlbGVtZW50KTtcclxuICB9XHJcblxyXG5cclxuICBpc0RhcmtIaWdobGlnaHQocm93OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFyb3dbZ3JvdXBCeVByb3BdKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjZWxsVmFsdWUgPSByb3dbZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwQnlWYWx1ZXMuc29tZSh2YWwgPT5cclxuICAgICAgY2VsbFZhbHVlLmluY2x1ZGVzKHZhbCkgJiYgY2VsbFZhbHVlLmxlbmd0aCA+IHZhbC5sZW5ndGhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzaG91bGRSZW5kZXJBc0h5cGVyTGluayhlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFlbGVtZW50W2dyb3VwQnlQcm9wXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBlbGVtZW50W2dyb3VwQnlQcm9wXS50b1N0cmluZygpO1xyXG5cclxuICAgIHJldHVybiAhZ3JvdXBCeVZhbHVlcy5zb21lKHYgPT4gdmFsdWUuaW5jbHVkZXModikgJiYgdmFsdWUubGVuZ3RoID49IHYubGVuZ3RoKTtcclxuICB9XHJcblxyXG5cclxuICBvblNvcnRBY3Rpb24oJGV2ZW50OiBTb3J0KSB7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5zb3J0S2V5ID0gJGV2ZW50LmFjdGl2ZSAmJiAkZXZlbnQuZGlyZWN0aW9uID9cclxuICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLnByb3BlcnR5ID09PSAkZXZlbnQuYWN0aXZlKT8ub3JkZXJCeVByb3BlcnR5IHx8ICRldmVudC5hY3RpdmVcclxuICAgICAgOiAnaWQnO1xyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydERpcmVjdGlvbiA9ICRldmVudC5kaXJlY3Rpb24gPT09ICdhc2MnID8gJ0FTQycgOiAnREVTQyc7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSAwO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uLmVtaXQoJGV2ZW50KTtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkU2hvd0J1dHRvbihlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFlbGVtZW50W2dyb3VwQnlQcm9wXSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnRbZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuICFncm91cEJ5VmFsdWVzLnNvbWUodiA9PiB2YWx1ZS5pbmNsdWRlcyh2KSAmJiB2YWx1ZS5sZW5ndGggPj0gdi5sZW5ndGgpO1xyXG4gIH1cclxuICBkb0FkdmFuY2VkU2VhcmNoKCRldmVudDogRmllbGRGaWx0ZXJbXSkge1xyXG4gICAgdGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgPSBbXTtcclxuICAgIGlmICgkZXZlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyID0gW107XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgICAgLy8gdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciA9ICRldmVudDtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXNldERhdGEoJGV2ZW50OiBib29sZWFuKSB7XHJcbiAgICBpZiAoJGV2ZW50KSB7XHJcbiAgICAgIHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyID0gW107XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgICAgLy8gdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBiYXNlVGFibGVcIj5cclxuICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZmxleC0xMDBcIiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlVGl0bGVcIj5cclxuICAgIDxkaXYgW2NsYXNzLmZsZXgtNTBdPVwicGFnZUluZm8uZHJhZnRTdXBwb3J0ZWRcIiBbY2xhc3MuZmxleC0xMDBdPVwiIXBhZ2VJbmZvLmRyYWZ0U3VwcG9ydGVkXCIgY2xhc3M9XCJmbGV4LWNvbHVtbiBhbGlnbi1zdGFydFwiPlxyXG4gICAgICA8YXBwLXRpdGxlLWJhclxyXG4gICAgICAgIFtwYWdlVGl0bGVdPVwicGFnZUluZm8uaGlkZVRpdGxlID8gJycgOiBwYWdlSW5mby5sYWJlbHNTZWN0aW9uKycubGlzdF90aXRsZSdcIlxyXG4gICAgICAgIFt0aXRsZU1vZGVdPVwiJydcIlxyXG4gICAgICAgIFtuZXdBY3Rpb25dPVwic2hvd0FkZE5ldygpXCJcclxuICAgICAgICBbc2hvd0V4dHJhY3RCdXR0b25dPVwiIXBhZ2VJbmZvLmhpZGVFeHRyYWN0QnV0dG9uXCJcclxuICAgICAgICBbZXh0cmFCdXR0b25dPVwiZXh0cmFCdXR0b25cIlxyXG4gICAgICAgIChuZXdBY3Rpb25DbGlja2VkKT1cIm9uQWRkTmV3QWN0aW9uKCRldmVudClcIlxyXG4gICAgICAgIChleHRyYWN0UmVwb3J0KT1cImV4dHJhY3RSZXBvcnQoJGV2ZW50KVwiXHJcbiAgICAgICAgW3RvdGFsRWxlbWVudHNdPVwicGFnZUluZm8uaGlkZVRpdGxlID8gdW5kZWZpbmVkIDogdG90YWxFbGVtZW50c1wiPlxyXG4gICAgICA8L2FwcC10aXRsZS1iYXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LTUwIGZsZXgtY29sdW1uIGFsaWduLWVuZFwiICpuZ0lmPVwicGFnZUluZm8uZHJhZnRTdXBwb3J0ZWRcIj5cclxuICAgICAgPG1hdC1jaGlwLWxpc3Rib3ggYXJpYS1sYWJlbD1cIkNvbG9yIHNlbGVjdGlvblwiIFttdWx0aXBsZV09XCJmYWxzZVwiPlxyXG4gICAgICAgIDxtYXQtY2hpcC1vcHRpb24gW3NlbGVjdGVkXT1cIiF0aGlzLmlzUGVuZGluZ1wiIFtjb2xvcl09XCInYWNjZW50J1wiIFt2YWx1ZV09XCInQ09NUExFVEVEJ1wiIChjbGljayk9XCJzd2l0Y2hWaWV3TW9kZShmYWxzZSlcIj5cclxuICAgICAgICAgIHt7J2ZpbmlzaGVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1jaGlwLW9wdGlvbiBbc2VsZWN0ZWRdPVwidGhpcy5pc1BlbmRpbmdcIiBbY29sb3JdPVwiJ2FjY2VudCdcIiBbdmFsdWVdPVwiJ1BFTkRJTkcnXCIgKGNsaWNrKT1cInN3aXRjaFZpZXdNb2RlKHRydWUpXCI+XHJcbiAgICAgICAgICB7eyd0b2RvJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LWNoaXAtbGlzdGJveD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXJvd1wiICpuZ0lmPVwiIXBhZ2VJbmZvLmhpZGVBZHZhbmNlZEZpbHRlclwiPlxyXG4gICAgPGFwcC1maWx0ZXItYnVpbGRlclxyXG4gICAgICAqbmdJZj1cIiFwYWdlSW5mby5oaWRlQWR2YW5jZWRGaWx0ZXJcIlxyXG4gICAgICBbcGFnZUluZm9dPVwicGFnZUluZm9cIlxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgW2ZpbHRlckZpZWxkc109XCJmaWx0ZXJGaWVsZHNcIlxyXG4gICAgICAoZmlsdGVySW5mb3JtYXRpb24pPVwiZG9BZHZhbmNlZFNlYXJjaCgkZXZlbnQpXCJcclxuICAgICAgKGlzRW1wdHkpPVwicmVzZXREYXRhKCRldmVudClcIj5cclxuICAgIDwvYXBwLWZpbHRlci1idWlsZGVyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJidXR0b24tZ3JvdXBcIiA+XHJcblxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiIXBhZ2VJbmZvLmhpZGVFeHRyYWN0QnV0dG9uXCJcclxuICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZXhwb3J0TWVudVwiXHJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICBjbGFzcz1cImJ0bi1ub25lLWJhY2tncm91bmQtcHJpbWFyeSBidG4tZXhwb3J0XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmZpbGVfZXhwb3J0PC9tYXQtaWNvbj5cclxuICAgICAgICAgIDxzcGFuPnt7ICdleHBvcnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYXJyb3ctaWNvblwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPG1hdC1tZW51ICNleHBvcnRNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIG1hdC1tZW51LWl0ZW1cclxuICAgICAgICAgICpuZ0Zvcj1cImxldCB0eXBlIG9mIHR5cGVzXCJcclxuICAgICAgICAgIChjbGljayk9XCJleHRyYWN0UmVwb3J0KHR5cGUpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3Bhbj57eyB0eXBlIHwgdXBwZXJjYXNlIH19PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L21hdC1tZW51PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZsZXgtMTAwIGJhc2VUYWJsZV9fZGV0YWlsc0NvbHVtblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgtMTAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMCBtYWluVGFibGVcIj5cclxuICAgICAgICA8dGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIGNsYXNzPVwiZmxleC1maWxsXCIgbWF0LXRhYmxlIG1hdFNvcnQgKG1hdFNvcnRDaGFuZ2UpPVwib25Tb3J0QWN0aW9uKCRldmVudClcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0aGlzLmNvbHVtbnM7IGxldCBsYXN0PWxhc3RcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5wcm9wZXJ0eX19XCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5lbmFibGVTb3J0aW5nOyBlbHNlIHdpdGhvdXRTb3J0aW5nQ29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhvdXRTb3J0aW5nQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4udHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3dvcmtmbG93U3RhdHVzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeVwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cIndmU3RhdHVzIHt7IGdldFN0YXR1c0Rlc2NyaXB0aW9uKGVsZW1lbnQpfX1cIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLXdmLScrY29sdW1uLnByb3BlcnR5KyctJysoZWxlbWVudC5pZCB8fCBlbGVtZW50LmtleSB8fCAnJylcIj57eyBnZXRTdGF0dXNEZXNjcmlwdGlvbihlbGVtZW50KSB9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJ3ZlN0YXR1cyB7eyBnZXRTdGF0dXNEZXNjcmlwdGlvbihlbGVtZW50KX19XCIgW2F0dHIuaWRdPVwiJ3RhYmxlLWJ0bi13ZjItJytjb2x1bW4ucHJvcGVydHkrJy0nKyhlbGVtZW50LmlkIHx8IGVsZW1lbnQua2V5IHx8ICcnKVwiPnt7IGdldFN0YXR1c0Rlc2NyaXB0aW9uKGVsZW1lbnQpIH19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaHlwZXItdGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGQgbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkXCIgKGNsaWNrKT1cImh5cGVyTGlua0NsaWNrZWQoY29sdW1uLnByb3BlcnR5LGVsZW1lbnQpXCIgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBbbmdDbGFzc109XCJ7J2h5cGVyLWxpbmsnOiBzaG91bGRSZW5kZXJBc0h5cGVyTGluayhlbGVtZW50KX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUoZWxlbWVudCwgY29sdW1uLnByb3BlcnR5KSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIj5cclxuICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGQgbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvdWxkU2hvd0J1dHRvbihlbGVtZW50KVwiIG1hdC1idXR0b24gY2xhc3M9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgYWN0aW9uQnV0dG9uQ2xpY2tlZChjb2x1bW4ucHJvcGVydHksIGVsZW1lbnQpXCIgW2F0dHIuaWRdPVwiJ3RhYmxlLWJ0bi1hY3Rpb24tJytjb2x1bW4ucHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgKyAnX3RpdGxlJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCIgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICdtYWluVGFibGVfX3RkX19pY29uLWdyZWVuJzogZWxlbWVudFtjb2x1bW4ucHJvcGVydHldID09PSAncGFzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1vcmFuZ2UnOiBlbGVtZW50W2NvbHVtbi5wcm9wZXJ0eV0gPT09ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICAgICdtYWluVGFibGVfX3RkX19pY29uLXJlZCc6IGVsZW1lbnRbY29sdW1uLnByb3BlcnR5XSA9PT0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEljb24oZWxlbWVudFtjb2x1bW4ucHJvcGVydHldKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkIG1haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5XCIgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInByaW1hcnlcIiBbY2hlY2tlZF09XCJlbGVtZW50W2NvbHVtbi5wcm9wZXJ0eV1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2FjdGlvbkNoZWNrZWRDbGlja2VkKGNvbHVtbi5wcm9wZXJ0eSxlbGVtZW50KVwiPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXRlVHlwZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGQgbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJzdGF0ZVR5cGUge3sgZWxlbWVudFtjb2x1bW4ucHJvcGVydHldfX1cIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLXN0YXRlLScrY29sdW1uLnByb3BlcnR5XCI+e3sgbGFiZWxLZXlCeVZhbHVlKGNvbHVtbiwgZWxlbWVudCkgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkIG1haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZFwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUoZWxlbWVudCwgY29sdW1uLnByb3BlcnR5KSB8IGRhdGU6J3l5eXktTU0tZGQnIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3JvcHBlZFRleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkIG1haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZFwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldENyb3BwZWRUZXh0KGVsZW1lbnRbY29sdW1uLnByb3BlcnR5XSwgZWxlbWVudFtjb2x1bW4ud2lkdGhdKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Rvd25sb2FkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiBzdHlsZT1cInBhZGRpbmc6IDA7bWFyZ2luOiAwO3RleHQtYWxpZ246IGNlbnRlcjtcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYWluVGFibGVfX3RkX19pY29uLWJsdWVcIj5zeXN0ZW1fdXBkYXRlX2FsdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInb25PZmYnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkIG1haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZFwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImVsZW1lbnRbY29sdW1uLnByb3BlcnR5XSA9PT0gbnVsbFwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1kYXJrb3JhbmdlXCI+ZmxhZzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZWxlbWVudFtjb2x1bW4ucHJvcGVydHldID09PSBmYWxzZVwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1yZWRcIj5mbGFnPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJlbGVtZW50W2NvbHVtbi5wcm9wZXJ0eV0gPT09IHRydWVcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tZ3JlZW5cIj5mbGFnPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0dXMnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkIG1haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZFwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZWxlbWVudFtjb2x1bW4ucHJvcGVydHldID09PSBudWxsIHx8IGVsZW1lbnRbY29sdW1uLnByb3BlcnR5XSA9PT0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLicgKyBjb2x1bW4ubGFiZWwgKyAnSW5BY3RpdmUnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZWxlbWVudFtjb2x1bW4ucHJvcGVydHldID09PSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgY29sdW1uLmxhYmVsICsgJ0FjdGl2ZScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5mbydcIj5cclxuICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGQgdGV4dC1zZWNvbmRhcnlcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2VtaXRFdmVudChlbGVtZW50KVwiIFthdHRyLmlkXT1cIid0YWJsZS1idG4taW5mby0nK2VsZW1lbnQuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIiduZXRBbW91bnQnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkIG1haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZFwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbD48c3VwIGNsYXNzPVwibWFpblRhYmxlX190ZF9fY3VycmVuY3lcIj57e2VsZW1lbnRbY29sdW1uLmN1cnJlbmN5XX19PC9zdXA+PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX3Byb3BlcnR5XCI+e3sgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50LCBjb2x1bW4ucHJvcGVydHkpIHwgY3VycmVuY3k6ZWxlbWVudFtjb2x1bW4uY3VycmVuY3ldIDonJyB9fTwvc3Bhbj4gb2ZcclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKGVsZW1lbnQsIGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHkpIHwgY3VycmVuY3k6ZWxlbWVudFtjb2x1bW4uY3VycmVuY3ldIDonJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xvY2FsRGF0ZVRpbWUnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkIG1haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZFwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUoZWxlbWVudCwgY29sdW1uLnByb3BlcnR5KSB8IGRhdGUgOiBleHRyYWN0Rm9ybWF0KGNvbHVtbikgfX1cclxuICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidiaWdkZWNpbWFsJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGw+PHN1cCBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2N1cnJlbmN5XCI+e3tlbGVtZW50W2NvbHVtbi5jdXJyZW5jeV19fTwvc3VwPjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50LCBjb2x1bW4ucHJvcGVydHkpIHwgbnVtYmVyIDogKGNvbHVtbi5kaWdpdEluZm8gfHwgJzEuMy01JykgfX1cclxuICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0QWN0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiBzdHlsZT1cInBhZGRpbmc6IDAhaW1wb3J0YW50O1wiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtYnV0dG9uLWFjdGlvbnMgXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uc0FjdGlvbl09XCJjb2x1bW4udmlld1R5cGUgPT09ICdidXR0b25zQWN0aW9uJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbGlzdEFjdGlvbl09XCJsaXN0QWN0aW9uXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc109XCJsaXN0QWN0aW9uXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZEJ1dHRvbik9XCJhY3Rpb25MaXN0Q2xpY2tlZCgkZXZlbnQsZWxlbWVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2FwcC1idXR0b24tYWN0aW9ucz5cclxuICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50cmFuc2xhdGU7IGVsc2Ugbm9UcmFuc2xhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiAoY2xpY2spPVwiZW1pdFJvdXRlUGFnZShlbGVtZW50KVwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50LCBjb2x1bW4ucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9UcmFuc2xhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGQgbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkXCIgKGNsaWNrKT1cImVtaXRSb3V0ZVBhZ2UoZWxlbWVudClcIiBtYXQtY2VsbCBbaW5uZXJIdG1sXT0nZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50LCBjb2x1bW4ucHJvcGVydHkpJz48L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0dyb3VwcygpXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwTmFtZSBvZiB0aGlzLmdyb3VwTmFtZXNcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7Z3JvdXBOYW1lfX1cIj5cclxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgY2xhc3M9XCJleHRyYS1oZWFkZXJcIiAqbWF0SGVhZGVyQ2VsbERlZiBbYXR0ci5jb2xzcGFuXT1cImdyb3VwU3BhbnMuZ2V0KGdyb3VwTmFtZSlcIj5cclxuICAgICAgICAgICAgICAgICAge3sgKGlzSHVtYW5NYWRlKGdyb3VwTmFtZSkgPyBncm91cE5hbWUgOiBcIlwiKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwidGhpcy5ncm91cE5hbWVzXCI+PC90cj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDx0ciAqbWF0SGVhZGVyUm93RGVmPVwidmlzaWJsZUNvbHVtbnNcIiBtYXQtaGVhZGVyLXJvdz48L3RyPlxyXG4gICAgICAgICAgPHRyIChhdXhjbGljayk9XCJvcGVuTmV3VGFiKHJvdylcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBvblNlbGVjdEl0ZW0ocm93KVwiICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiB2aXNpYmxlQ29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ3RhYmxlLXJvdy0nICsgKHJvdz8uaWQgfHwgcm93Py5rZXkgfHwgJycpXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAnbWFpblRhYmxlX19oaWdobGlnaHQnOiBzZWxlY3RlZFJvd0luZGV4ID09IHJvdy5pZCB8fCAocGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5ICYmIHBhZ2VJbmZvLmdyb3VwQnlWYWx1ZT8uaW5jbHVkZXMocm93W3BhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eV0pKSxcclxuICAgICAgICAgICAgICAgICdtYWluVGFibGVfX2RhcmtfaGlnaGxpZ2h0JzogaXNEYXJrSGlnaGxpZ2h0KHJvdylcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBtYXQtcm93PlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJub0RhdGFGb3VuZFwiIGNsYXNzPVwiZGF0YU5vdEZvdW5kIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZGF0YU5vdEZvdW5kX19pY29uXCI+e3sgbm9EYXRhRm91bmRJY29uIH19PC9tYXQtaWNvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fdGl0bGVcIj57eyBub0RhdGFGb3VuZFRpdGxlIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRhTm90Rm91bmRfX3N1YnRpdGxlXCI+e3sgbm9EYXRhRm91bmRTdWJ0aXRsZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICA8ZGl2ICAqbmdJZj1cIihkYXRhU291cmNlLmRhdGE/Lmxlbmd0aCA+IDAgfHwgY3VzdG9taXplZERhdGEpICYmICFwYWdlSW5mby5oaWRlUGFnaW5hdGlvblwiIGNsYXNzPVwibWFpbi1wYWdpbmF0aW9uIGZsZXgtcm93XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZVBhZ2luYXRpb25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBmbGV4LTEwMFwiPlxyXG4gICAgICAgICAgICA8YXBwLXBhZ2luYXRvclxyXG4gICAgICAgICAgICAgIFtjdXJyZW50UGFnZV09XCJwYWdlSW5kZXhcIlxyXG4gICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsRWxlbWVudHNcIlxyXG4gICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbNSwgMTAsIDI1LCA1MF1cIlxyXG4gICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDwvYXBwLXBhZ2luYXRvcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|