@pega/angular-sdk-components 0.23.1
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/README.md +24 -0
- package/_shared/styles.scss +28 -0
- package/esm2022/lib/_bridge/angular-pconnect.mjs +416 -0
- package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +114 -0
- package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +228 -0
- package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +142 -0
- package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +50 -0
- package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +29 -0
- package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +31 -0
- package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +51 -0
- package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +80 -0
- package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +37 -0
- package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +31 -0
- package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +36 -0
- package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +25 -0
- package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +28 -0
- package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +42 -0
- package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +136 -0
- package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +33 -0
- package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +93 -0
- package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +18 -0
- package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +286 -0
- package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +98 -0
- package/esm2022/lib/_components/field/check-box/check-box.component.mjs +157 -0
- package/esm2022/lib/_components/field/currency/currency.component.mjs +160 -0
- package/esm2022/lib/_components/field/date/date.component.mjs +219 -0
- package/esm2022/lib/_components/field/date-time/date-time.component.mjs +200 -0
- package/esm2022/lib/_components/field/decimal/decimal.component.mjs +157 -0
- package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +197 -0
- package/esm2022/lib/_components/field/email/email.component.mjs +150 -0
- package/esm2022/lib/_components/field/integer/integer.component.mjs +155 -0
- package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +44 -0
- package/esm2022/lib/_components/field/percentage/percentage.component.mjs +155 -0
- package/esm2022/lib/_components/field/phone/phone.component.mjs +167 -0
- package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +189 -0
- package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +103 -0
- package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +95 -0
- package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +57 -0
- package/esm2022/lib/_components/field/text/text.component.mjs +138 -0
- package/esm2022/lib/_components/field/text-area/text-area.component.mjs +155 -0
- package/esm2022/lib/_components/field/text-content/text-content.component.mjs +69 -0
- package/esm2022/lib/_components/field/text-input/text-input.component.mjs +152 -0
- package/esm2022/lib/_components/field/time/time.component.mjs +151 -0
- package/esm2022/lib/_components/field/url/url.component.mjs +150 -0
- package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +175 -0
- package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +491 -0
- package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +68 -0
- package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +24 -0
- package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +314 -0
- package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +32 -0
- package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +219 -0
- package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +31 -0
- package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +387 -0
- package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +47 -0
- package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +88 -0
- package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +144 -0
- package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +18 -0
- package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +80 -0
- package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +132 -0
- package/esm2022/lib/_components/infra/reference/reference.component.mjs +133 -0
- package/esm2022/lib/_components/infra/region/region.component.mjs +33 -0
- package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +228 -0
- package/esm2022/lib/_components/infra/stages/stages.component.mjs +62 -0
- package/esm2022/lib/_components/infra/view/view.component.mjs +173 -0
- package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +140 -0
- package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +43 -0
- package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +72 -0
- package/esm2022/lib/_components/template/case-view/case-view.component.mjs +196 -0
- package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +68 -0
- package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +239 -0
- package/esm2022/lib/_components/template/default-form/default-form.component.mjs +61 -0
- package/esm2022/lib/_components/template/details/details.component.mjs +102 -0
- package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +72 -0
- package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +71 -0
- package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +66 -0
- package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +80 -0
- package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +77 -0
- package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +77 -0
- package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +65 -0
- package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +23 -0
- package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +134 -0
- package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +19 -0
- package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +22 -0
- package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +40 -0
- package/esm2022/lib/_components/template/list-page/list-page.component.mjs +14 -0
- package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +208 -0
- package/esm2022/lib/_components/template/list-view/list-view.component.mjs +1198 -0
- package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +61 -0
- package/esm2022/lib/_components/template/list-view/utils.mjs +660 -0
- package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +44 -0
- package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +30 -0
- package/esm2022/lib/_components/template/one-column/one-column.component.mjs +30 -0
- package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +16 -0
- package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +30 -0
- package/esm2022/lib/_components/template/page/page.component.mjs +52 -0
- package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +149 -0
- package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +139 -0
- package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +106 -0
- package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +270 -0
- package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +760 -0
- package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +131 -0
- package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +16 -0
- package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +67 -0
- package/esm2022/lib/_components/template/three-column/three-column.component.mjs +30 -0
- package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +16 -0
- package/esm2022/lib/_components/template/two-column/two-column.component.mjs +30 -0
- package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +40 -0
- package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +30 -0
- package/esm2022/lib/_components/template/utils.mjs +22 -0
- package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +30 -0
- package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +53 -0
- package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +135 -0
- package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +24 -0
- package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +588 -0
- package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +81 -0
- package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +525 -0
- package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +631 -0
- package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +57 -0
- package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +75 -0
- package/esm2022/lib/_components/widget/todo/todo.component.mjs +213 -0
- package/esm2022/lib/_components/widget/utility/utility.component.mjs +34 -0
- package/esm2022/lib/_directives/thousand-seperator.directive.mjs +28 -0
- package/esm2022/lib/_helpers/case-utils.mjs +71 -0
- package/esm2022/lib/_helpers/common.mjs +20 -0
- package/esm2022/lib/_helpers/currency-utils.mjs +57 -0
- package/esm2022/lib/_helpers/date-format-utils.mjs +68 -0
- package/esm2022/lib/_helpers/event-util.mjs +19 -0
- package/esm2022/lib/_helpers/field-group-utils.mjs +47 -0
- package/esm2022/lib/_helpers/filter-utils.mjs +106 -0
- package/esm2022/lib/_helpers/formatters/currency-map.mjs +903 -0
- package/esm2022/lib/_helpers/formatters/format-utils.mjs +68 -0
- package/esm2022/lib/_helpers/tab-utils.mjs +59 -0
- package/esm2022/lib/_helpers/template-utils.mjs +56 -0
- package/esm2022/lib/_helpers/utils.mjs +386 -0
- package/esm2022/lib/_helpers/versionHelpers.mjs +12 -0
- package/esm2022/lib/_messages/error-messages.service.mjs +31 -0
- package/esm2022/lib/_messages/get-login-status.service.mjs +26 -0
- package/esm2022/lib/_messages/oauth-response.service.mjs +30 -0
- package/esm2022/lib/_messages/progress-spinner.service.mjs +30 -0
- package/esm2022/lib/_messages/reset-pconnect.service.mjs +31 -0
- package/esm2022/lib/_messages/update-worklist.service.mjs +30 -0
- package/esm2022/lib/_services/case.service.mjs +32 -0
- package/esm2022/lib/_services/datapage.service.mjs +52 -0
- package/esm2022/lib/_services/endpoints.mjs +61 -0
- package/esm2022/lib/_services/server-config.service.mjs +52 -0
- package/esm2022/lib/_types/PConnProps.interface.mjs +2 -0
- package/esm2022/pega-angular-sdk-components.mjs +5 -0
- package/esm2022/public-api.mjs +138 -0
- package/esm2022/sdk-local-component-map.mjs +9 -0
- package/fesm2022/pega-angular-sdk-components.mjs +17380 -0
- package/fesm2022/pega-angular-sdk-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/_bridge/angular-pconnect.d.ts +140 -0
- package/lib/_bridge/component-mapper/component-mapper.component.d.ts +20 -0
- package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +213 -0
- package/lib/_bridge/helpers/sdk_component_map.d.ts +3 -0
- package/lib/_components/designSystemExtension/alert/alert.component.d.ts +12 -0
- package/lib/_components/designSystemExtension/alert-banner/alert-banner.component.d.ts +13 -0
- package/lib/_components/designSystemExtension/banner/banner.component.d.ts +15 -0
- package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +20 -0
- package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +18 -0
- package/lib/_components/designSystemExtension/material-details/material-details.component.d.ts +15 -0
- package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +12 -0
- package/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.d.ts +15 -0
- package/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.d.ts +9 -0
- package/lib/_components/designSystemExtension/material-utility/material-utility.component.d.ts +16 -0
- package/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.d.ts +11 -0
- package/lib/_components/designSystemExtension/operator/operator.component.d.ts +25 -0
- package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +16 -0
- package/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.d.ts +23 -0
- package/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.d.ts +7 -0
- package/lib/_components/field/auto-complete/auto-complete.component.d.ts +74 -0
- package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +24 -0
- package/lib/_components/field/check-box/check-box.component.d.ts +48 -0
- package/lib/_components/field/currency/currency.component.d.ts +50 -0
- package/lib/_components/field/date/date.component.d.ts +65 -0
- package/lib/_components/field/date-time/date-time.component.d.ts +55 -0
- package/lib/_components/field/decimal/decimal.component.d.ts +46 -0
- package/lib/_components/field/dropdown/dropdown.component.d.ts +60 -0
- package/lib/_components/field/email/email.component.d.ts +44 -0
- package/lib/_components/field/integer/integer.component.d.ts +44 -0
- package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +15 -0
- package/lib/_components/field/percentage/percentage.component.d.ts +44 -0
- package/lib/_components/field/phone/phone.component.d.ts +48 -0
- package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +60 -0
- package/lib/_components/field/rich-text/rich-text.component.d.ts +42 -0
- package/lib/_components/field/scalar-list/scalar-list.component.d.ts +37 -0
- package/lib/_components/field/semantic-link/semantic-link.component.d.ts +30 -0
- package/lib/_components/field/text/text.component.d.ts +40 -0
- package/lib/_components/field/text-area/text-area.component.d.ts +45 -0
- package/lib/_components/field/text-content/text-content.component.d.ts +30 -0
- package/lib/_components/field/text-input/text-input.component.d.ts +45 -0
- package/lib/_components/field/time/time.component.d.ts +43 -0
- package/lib/_components/field/url/url.component.d.ts +43 -0
- package/lib/_components/field/user-reference/user-reference.component.d.ts +39 -0
- package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +85 -0
- package/lib/_components/infra/Containers/flow-container/helpers.d.ts +2 -0
- package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +15 -0
- package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +71 -0
- package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +15 -0
- package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +51 -0
- package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +12 -0
- package/lib/_components/infra/assignment/assignment.component.d.ts +72 -0
- package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +18 -0
- package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +20 -0
- package/lib/_components/infra/defer-load/defer-load.component.d.ts +46 -0
- package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +8 -0
- package/lib/_components/infra/multi-step/multi-step.component.d.ts +31 -0
- package/lib/_components/infra/navbar/navbar.component.d.ts +51 -0
- package/lib/_components/infra/reference/reference.component.d.ts +16 -0
- package/lib/_components/infra/region/region.component.d.ts +14 -0
- package/lib/_components/infra/root-container/root-container.component.d.ts +35 -0
- package/lib/_components/infra/stages/stages.component.d.ts +29 -0
- package/lib/_components/infra/view/view.component.d.ts +40 -0
- package/lib/_components/template/app-shell/app-shell.component.d.ts +55 -0
- package/lib/_components/template/banner-page/banner-page.component.d.ts +27 -0
- package/lib/_components/template/case-summary/case-summary.component.d.ts +34 -0
- package/lib/_components/template/case-view/case-view.component.d.ts +56 -0
- package/lib/_components/template/confirmation/confirmation.component.d.ts +38 -0
- package/lib/_components/template/data-reference/data-reference.component.d.ts +41 -0
- package/lib/_components/template/default-form/default-form.component.d.ts +21 -0
- package/lib/_components/template/details/details.component.d.ts +20 -0
- package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +21 -0
- package/lib/_components/template/details-one-column/details-one-column.component.d.ts +22 -0
- package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +24 -0
- package/lib/_components/template/details-three-column/details-three-column.component.d.ts +25 -0
- package/lib/_components/template/details-two-column/details-two-column.component.d.ts +25 -0
- package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +24 -0
- package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +20 -0
- package/lib/_components/template/field-group-list/field-group-list.component.d.ts +9 -0
- package/lib/_components/template/field-group-template/field-group-template.component.d.ts +52 -0
- package/lib/_components/template/field-value-list/field-value-list.component.d.ts +8 -0
- package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +16 -0
- package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +25 -0
- package/lib/_components/template/list-page/list-page.component.d.ts +7 -0
- package/lib/_components/template/list-view/DefaultViewMeta.d.ts +1 -0
- package/lib/_components/template/list-view/list-view.component.d.ts +157 -0
- package/lib/_components/template/list-view/listViewHelpers.d.ts +1 -0
- package/lib/_components/template/list-view/utils.d.ts +118 -0
- package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +25 -0
- package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +14 -0
- package/lib/_components/template/one-column/one-column.component.d.ts +14 -0
- package/lib/_components/template/one-column-page/one-column-page.component.d.ts +9 -0
- package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +14 -0
- package/lib/_components/template/page/page.component.d.ts +25 -0
- package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +35 -0
- package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +37 -0
- package/lib/_components/template/simple-table/simple-table.component.d.ts +43 -0
- package/lib/_components/template/simple-table-manual/helpers.d.ts +81 -0
- package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +159 -0
- package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +32 -0
- package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +9 -0
- package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +26 -0
- package/lib/_components/template/three-column/three-column.component.d.ts +14 -0
- package/lib/_components/template/three-column-page/three-column-page.component.d.ts +9 -0
- package/lib/_components/template/two-column/two-column.component.d.ts +14 -0
- package/lib/_components/template/two-column-page/two-column-page.component.d.ts +17 -0
- package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +14 -0
- package/lib/_components/template/utils.d.ts +2 -0
- package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +14 -0
- package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +20 -0
- package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +50 -0
- package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +19 -0
- package/lib/_components/widget/attachment/attachment.component.d.ts +99 -0
- package/lib/_components/widget/case-history/case-history.component.d.ts +24 -0
- package/lib/_components/widget/feed-container/feed-container.component.d.ts +49 -0
- package/lib/_components/widget/file-utility/file-utility.component.d.ts +150 -0
- package/lib/_components/widget/list-utility/list-utility.component.d.ts +23 -0
- package/lib/_components/widget/quick-create/quick-create.component.d.ts +29 -0
- package/lib/_components/widget/todo/todo.component.d.ts +64 -0
- package/lib/_components/widget/utility/utility.component.d.ts +25 -0
- package/lib/_directives/thousand-seperator.directive.d.ts +9 -0
- package/lib/_helpers/case-utils.d.ts +19 -0
- package/lib/_helpers/common.d.ts +3 -0
- package/lib/_helpers/currency-utils.d.ts +10 -0
- package/lib/_helpers/date-format-utils.d.ts +12 -0
- package/lib/_helpers/event-util.d.ts +2 -0
- package/lib/_helpers/field-group-utils.d.ts +16 -0
- package/lib/_helpers/filter-utils.d.ts +46 -0
- package/lib/_helpers/formatters/currency-map.d.ts +1132 -0
- package/lib/_helpers/formatters/format-utils.d.ts +8 -0
- package/lib/_helpers/tab-utils.d.ts +4 -0
- package/lib/_helpers/template-utils.d.ts +16 -0
- package/lib/_helpers/utils.d.ts +32 -0
- package/lib/_helpers/versionHelpers.d.ts +8 -0
- package/lib/_messages/error-messages.service.d.ts +15 -0
- package/lib/_messages/get-login-status.service.d.ts +10 -0
- package/lib/_messages/oauth-response.service.d.ts +14 -0
- package/lib/_messages/progress-spinner.service.d.ts +14 -0
- package/lib/_messages/reset-pconnect.service.d.ts +15 -0
- package/lib/_messages/update-worklist.service.d.ts +14 -0
- package/lib/_services/case.service.d.ts +12 -0
- package/lib/_services/datapage.service.d.ts +14 -0
- package/lib/_services/endpoints.d.ts +39 -0
- package/lib/_services/server-config.service.d.ts +31 -0
- package/lib/_types/PConnProps.interface.d.ts +17 -0
- package/package.json +28 -0
- package/public-api.d.ts +133 -0
- package/sdk-local-component-map.d.ts +2 -0
- package/sdk-local-component-map.ts +12 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
import { Component, Input, forwardRef } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
5
|
+
import download from 'downloadjs';
|
|
6
|
+
import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../../_bridge/angular-pconnect";
|
|
9
|
+
import * as i2 from "../../../_helpers/utils";
|
|
10
|
+
import * as i3 from "@angular/common";
|
|
11
|
+
import * as i4 from "@angular/material/progress-spinner";
|
|
12
|
+
import * as i5 from "@angular/material/button";
|
|
13
|
+
export class AttachmentComponent {
|
|
14
|
+
constructor(angularPConnect, utils, ngZone) {
|
|
15
|
+
this.angularPConnect = angularPConnect;
|
|
16
|
+
this.utils = utils;
|
|
17
|
+
this.ngZone = ngZone;
|
|
18
|
+
// For interaction with AngularPConnect
|
|
19
|
+
this.angularPConnectData = {};
|
|
20
|
+
this.label$ = '';
|
|
21
|
+
this.bRequired$ = false;
|
|
22
|
+
this.bReadonly$ = false;
|
|
23
|
+
this.bDisabled$ = false;
|
|
24
|
+
this.bVisible$ = true;
|
|
25
|
+
this.bLoading$ = false;
|
|
26
|
+
this.arFiles$ = [];
|
|
27
|
+
this.arFileList$ = [];
|
|
28
|
+
this.arMenuList$ = [];
|
|
29
|
+
this.bShowSelector$ = true;
|
|
30
|
+
this.bShowJustDelete$ = false;
|
|
31
|
+
this.fileTemp = {};
|
|
32
|
+
this.allowMultiple$ = false;
|
|
33
|
+
this.extensions$ = '';
|
|
34
|
+
this.status = '';
|
|
35
|
+
this.validateMessage = '';
|
|
36
|
+
this.fileDownload = (data, fileName, ext) => {
|
|
37
|
+
const file = ext ? `${fileName}.${ext}` : fileName;
|
|
38
|
+
download(atob(data), file);
|
|
39
|
+
};
|
|
40
|
+
this.getAttachmentKey = (name = '') => (name ? `attachmentsList.${name}` : 'attachmentsList');
|
|
41
|
+
this.getNewListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
|
|
42
|
+
let actions;
|
|
43
|
+
let isDownloadable = false;
|
|
44
|
+
if (att.progress && att.progress !== 100) {
|
|
45
|
+
actions = [
|
|
46
|
+
{
|
|
47
|
+
id: `Cancel-${att.ID}`,
|
|
48
|
+
text: this.pConn$.getLocalizedValue('Cancel', '', ''),
|
|
49
|
+
icon: 'times',
|
|
50
|
+
onClick: cancelFile
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
else if (att.links) {
|
|
55
|
+
const isFile = att.type === 'FILE';
|
|
56
|
+
const ID = att.ID.replace(/\s/gi, '');
|
|
57
|
+
const actionsMap = new Map([
|
|
58
|
+
[
|
|
59
|
+
'download',
|
|
60
|
+
{
|
|
61
|
+
id: `download-${ID}`,
|
|
62
|
+
text: isFile ? this.pConn$.getLocalizedValue('Download', '', '') : this.pConn$.getLocalizedValue('Open', '', ''),
|
|
63
|
+
icon: isFile ? 'download' : 'open',
|
|
64
|
+
onClick: downloadFile
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
[
|
|
68
|
+
'delete',
|
|
69
|
+
{
|
|
70
|
+
id: `Delete-${ID}`,
|
|
71
|
+
text: this.pConn$.getLocalizedValue('Delete', '', ''),
|
|
72
|
+
icon: 'trash',
|
|
73
|
+
onClick: deleteFile
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
]);
|
|
77
|
+
actions = [];
|
|
78
|
+
actionsMap.forEach((action, actionKey) => {
|
|
79
|
+
if (att.links[actionKey]) {
|
|
80
|
+
actions.push(action);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
84
|
+
isDownloadable = att.links.download;
|
|
85
|
+
}
|
|
86
|
+
else if (att.error) {
|
|
87
|
+
actions = [
|
|
88
|
+
{
|
|
89
|
+
id: `Remove-${att.ID}`,
|
|
90
|
+
text: this.pConn$.getLocalizedValue('Remove', '', ''),
|
|
91
|
+
icon: 'trash',
|
|
92
|
+
onClick: removeFile
|
|
93
|
+
}
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
id: att.ID,
|
|
98
|
+
visual: {
|
|
99
|
+
icon: this.utils.getIconForAttachment(att),
|
|
100
|
+
progress: att.progress == 100 ? undefined : att.progress
|
|
101
|
+
},
|
|
102
|
+
primary: {
|
|
103
|
+
type: att.type,
|
|
104
|
+
name: att.error ? att.fileName : att.name,
|
|
105
|
+
icon: 'trash',
|
|
106
|
+
click: removeFile
|
|
107
|
+
},
|
|
108
|
+
secondary: {
|
|
109
|
+
text: att.meta,
|
|
110
|
+
error: att.error
|
|
111
|
+
},
|
|
112
|
+
actions
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
this.validateFileExtension = (fileObj, allowedExtensions) => {
|
|
116
|
+
if (!allowedExtensions) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
const allowedExtensionList = allowedExtensions
|
|
120
|
+
.toLowerCase()
|
|
121
|
+
.split(',')
|
|
122
|
+
.map(item => item.replaceAll('.', '').trim());
|
|
123
|
+
const extension = fileObj.name.split('.').pop().toLowerCase();
|
|
124
|
+
return allowedExtensionList.includes(extension);
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
ngOnInit() {
|
|
128
|
+
// // First thing in initialization is registering and subscribing to the AngularPConnect service
|
|
129
|
+
this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
|
|
130
|
+
this.removeFileFromList$ = { onClick: this._removeFileFromList.bind(this) };
|
|
131
|
+
this.caseID = PCore.getStoreValue('.pyID', 'caseInfo.content', this.pConn$.getContextName());
|
|
132
|
+
// let configProps: any = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
|
|
133
|
+
this.checkAndUpdate();
|
|
134
|
+
}
|
|
135
|
+
checkAndUpdate() {
|
|
136
|
+
// Should always check the bridge to see if the component should
|
|
137
|
+
// update itself (re-render)
|
|
138
|
+
const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
|
|
139
|
+
// ONLY call updateSelf when the component should update
|
|
140
|
+
if (bUpdateSelf) {
|
|
141
|
+
this.updateSelf();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
ngOnDestroy() {
|
|
145
|
+
if (this.angularPConnectData.unsubscribeFn) {
|
|
146
|
+
this.angularPConnectData.unsubscribeFn();
|
|
147
|
+
}
|
|
148
|
+
PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
|
|
149
|
+
}
|
|
150
|
+
// Callback passed when subscribing to store change
|
|
151
|
+
onStateChange() {
|
|
152
|
+
this.checkAndUpdate();
|
|
153
|
+
}
|
|
154
|
+
updateAttachmentsInfo() {
|
|
155
|
+
// @ts-ignore - Property 'attachmentsInfo' does not exist on type 'C11nEnv'
|
|
156
|
+
if (!this.pConn$.attachmentsInfo) {
|
|
157
|
+
// @ts-ignore - Property 'attachmentsInfo' does not exist on type 'C11nEnv'
|
|
158
|
+
this.pConn$.attachmentsInfo = {
|
|
159
|
+
type: 'File',
|
|
160
|
+
attachmentFieldName: this.att_valueRef,
|
|
161
|
+
category: this.att_categoryName
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
processFile(file, i) {
|
|
166
|
+
file.props.type = file.responseProps.pyMimeFileExtension;
|
|
167
|
+
file.props.mimeType = file.responseProps.pyMimeFileExtension;
|
|
168
|
+
file.props.ID = file.responseProps.pzInsKey;
|
|
169
|
+
const arMenuList = [
|
|
170
|
+
{
|
|
171
|
+
icon: 'download',
|
|
172
|
+
text: this.pConn$.getLocalizedValue('Download', '', ''),
|
|
173
|
+
onClick: () => this._downloadFileFromList(this.value$.pxResults[i])
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
icon: 'trash',
|
|
177
|
+
text: this.pConn$.getLocalizedValue('Delete', '', ''),
|
|
178
|
+
onClick: () => this._removeFileFromList(this.arFileList$[i])
|
|
179
|
+
}
|
|
180
|
+
];
|
|
181
|
+
const arFilesAttachmentIDs = [];
|
|
182
|
+
this.arFileList$.forEach(arFile => {
|
|
183
|
+
arFilesAttachmentIDs.push(arFile.id);
|
|
184
|
+
});
|
|
185
|
+
if (!arFilesAttachmentIDs.includes(file.props.ID)) {
|
|
186
|
+
this.arFileList$.push(this.getNewListUtilityItemProps({
|
|
187
|
+
att: file.props,
|
|
188
|
+
downloadFile: null,
|
|
189
|
+
cancelFile: null,
|
|
190
|
+
deleteFile: null,
|
|
191
|
+
removeFile: null
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
this.arFileList$[i].actions = arMenuList;
|
|
195
|
+
this.arFileList$[i].noDeleteIcon = true;
|
|
196
|
+
this.bShowSelector$ = false;
|
|
197
|
+
}
|
|
198
|
+
updateSelf() {
|
|
199
|
+
const configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
|
|
200
|
+
const stateProps = this.pConn$.getStateProps();
|
|
201
|
+
const { value, label, extensions } = configProps;
|
|
202
|
+
if (configProps.required != null) {
|
|
203
|
+
this.bRequired$ = this.utils.getBooleanValue(configProps.required);
|
|
204
|
+
}
|
|
205
|
+
if (configProps.visibility != null) {
|
|
206
|
+
this.bVisible$ = this.utils.getBooleanValue(configProps.visibility);
|
|
207
|
+
}
|
|
208
|
+
// disabled
|
|
209
|
+
if (configProps.disabled != undefined) {
|
|
210
|
+
this.bDisabled$ = this.utils.getBooleanValue(configProps.disabled);
|
|
211
|
+
}
|
|
212
|
+
if (configProps.readOnly != null) {
|
|
213
|
+
this.bReadonly$ = this.utils.getBooleanValue(configProps.readOnly);
|
|
214
|
+
}
|
|
215
|
+
if (configProps.allowMultiple != null) {
|
|
216
|
+
this.allowMultiple$ = this.utils.getBooleanValue(configProps.allowMultiple);
|
|
217
|
+
}
|
|
218
|
+
this.bShowJustDelete$ = true;
|
|
219
|
+
this.label$ = label;
|
|
220
|
+
this.value$ = value;
|
|
221
|
+
this.status = stateProps.status;
|
|
222
|
+
this.validateMessage = this.angularPConnectData.validateMessage;
|
|
223
|
+
this.extensions$ = extensions;
|
|
224
|
+
this.valueRef = this.pConn$.getStateProps().value;
|
|
225
|
+
this.valueRef = this.valueRef.startsWith('.') ? this.valueRef.substring(1) : this.valueRef;
|
|
226
|
+
/* this is a temporary fix because required is supposed to be passed as a boolean and NOT as a string */
|
|
227
|
+
let { required, disabled } = configProps;
|
|
228
|
+
[required, disabled] = [required, disabled].map(prop => prop === true || (typeof prop === 'string' && prop === 'true'));
|
|
229
|
+
this.att_categoryName = '';
|
|
230
|
+
if (value && value.pyCategoryName) {
|
|
231
|
+
this.att_categoryName = value.pyCategoryName;
|
|
232
|
+
}
|
|
233
|
+
this.att_valueRef = this.pConn$.getStateProps().value;
|
|
234
|
+
this.att_valueRef = this.att_valueRef.indexOf('.') === 0 ? this.att_valueRef.substring(1) : this.att_valueRef;
|
|
235
|
+
this.updateAttachments();
|
|
236
|
+
}
|
|
237
|
+
updateAttachments() {
|
|
238
|
+
const attachmentsFromServer = this.value$ && this.value$.pxResults && +this.value$.pyCount > 0;
|
|
239
|
+
if (attachmentsFromServer) {
|
|
240
|
+
this.updateAttachmentsFromServer();
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
// Get the attachments from the Redux
|
|
244
|
+
this.myFiles = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
|
|
245
|
+
if (this.myFiles?.length && this.arFiles$.length === 0) {
|
|
246
|
+
this.arFileList$ = this.myFiles.map(att => {
|
|
247
|
+
return this.getNewListUtilityItemProps({
|
|
248
|
+
att,
|
|
249
|
+
downloadFile: null,
|
|
250
|
+
cancelFile: null,
|
|
251
|
+
deleteFile: null,
|
|
252
|
+
removeFile: null
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
const myFilesAttachmentIDs = [];
|
|
257
|
+
this.myFiles.forEach(myFile => {
|
|
258
|
+
myFilesAttachmentIDs.push(myFile.ID);
|
|
259
|
+
});
|
|
260
|
+
this.arFiles$.forEach(arFile => {
|
|
261
|
+
if (!myFilesAttachmentIDs.includes(arFile.ID)) {
|
|
262
|
+
this.myFiles = [...this.myFiles, arFile];
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
this.bShowJustDelete$ = true;
|
|
267
|
+
this.bShowSelector$ = !(this.arFileList$?.length > 0) || this.allowMultiple$;
|
|
268
|
+
if (this.arFileList$.length > 0) {
|
|
269
|
+
this.CheckForInvalidAttachment();
|
|
270
|
+
}
|
|
271
|
+
PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.resetAttachmentStoredState.bind(this), this.caseID);
|
|
272
|
+
}
|
|
273
|
+
updateAttachmentsFromServer() {
|
|
274
|
+
this.value$.pxResults.forEach((attachment, i) => {
|
|
275
|
+
const file = this.buildFilePropsFromResponse(attachment);
|
|
276
|
+
if (file.responseProps) {
|
|
277
|
+
this.updateAttachmentsInfo();
|
|
278
|
+
if (file.responseProps.pzInsKey && !file.responseProps.pzInsKey.includes('temp')) {
|
|
279
|
+
this.processFile(file, i);
|
|
280
|
+
}
|
|
281
|
+
if (file) {
|
|
282
|
+
const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
|
|
283
|
+
const index = currentAttachmentList.findIndex(element => element.props.ID === file.props.ID);
|
|
284
|
+
let tempFiles = [];
|
|
285
|
+
if (index < 0) {
|
|
286
|
+
tempFiles = [file];
|
|
287
|
+
}
|
|
288
|
+
PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...tempFiles], {
|
|
289
|
+
pageReference: 'context_data',
|
|
290
|
+
isArrayDeepMerge: false
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
resetAttachmentStoredState() {
|
|
297
|
+
PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), undefined, {
|
|
298
|
+
pageReference: 'context_data',
|
|
299
|
+
isArrayDeepMerge: false
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
_downloadFileFromList(fileObj) {
|
|
303
|
+
PCore.getAttachmentUtils()
|
|
304
|
+
// @ts-ignore - 3rd parameter "responseEncoding" should be optional
|
|
305
|
+
.downloadAttachment(fileObj.pzInsKey, this.pConn$.getContextName())
|
|
306
|
+
.then((content) => {
|
|
307
|
+
const extension = fileObj.pyAttachName.split('.').pop();
|
|
308
|
+
this.fileDownload(content.data, fileObj.pyFileName, extension);
|
|
309
|
+
})
|
|
310
|
+
.catch(e => {
|
|
311
|
+
console.log(e);
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
CheckForInvalidAttachment() {
|
|
315
|
+
let isValid = true;
|
|
316
|
+
this.arFileList$.forEach(file => {
|
|
317
|
+
if (file.secondary.error) {
|
|
318
|
+
isValid = false;
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
if (isValid) {
|
|
322
|
+
// @ts-ignore
|
|
323
|
+
PCore.getMessageManager().clearMessages({
|
|
324
|
+
type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
|
|
325
|
+
property: this.pConn$.getStateProps().value,
|
|
326
|
+
pageReference: this.pConn$.getPageReference(),
|
|
327
|
+
context: this.pConn$.getContextName()
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
_removeFileFromList(item) {
|
|
332
|
+
const fileListIndex = this.arFileList$.findIndex(element => element?.id === item?.id);
|
|
333
|
+
const fileIndex = this.arFiles$.findIndex(element => element?.ID === item?.id);
|
|
334
|
+
const attachmentsList = [];
|
|
335
|
+
let currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
|
|
336
|
+
if (this.value$ && this.value$.pxResults && +this.value$.pyCount > 0 && item.actions) {
|
|
337
|
+
const updatedAttachments = currentAttachmentList.map(attachment => {
|
|
338
|
+
if (attachment?.ID === this.arFileList$[fileListIndex].id || attachment?.props?.ID === this.arFileList$[fileListIndex].id) {
|
|
339
|
+
return { ...attachment, delete: true, label: this.valueRef };
|
|
340
|
+
}
|
|
341
|
+
return attachment;
|
|
342
|
+
});
|
|
343
|
+
// updating the redux store to help form-handler in passing the data to delete the file from server
|
|
344
|
+
PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), updatedAttachments, {
|
|
345
|
+
pageReference: 'context_data',
|
|
346
|
+
isArrayDeepMerge: false
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
currentAttachmentList = currentAttachmentList.filter(f => f.ID !== item.id);
|
|
351
|
+
PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...attachmentsList], {
|
|
352
|
+
pageReference: 'context_data',
|
|
353
|
+
isArrayDeepMerge: false
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
if (fileListIndex > -1) {
|
|
357
|
+
this.arFileList$.splice(fileListIndex, 1);
|
|
358
|
+
}
|
|
359
|
+
if (fileIndex > -1) {
|
|
360
|
+
this.arFiles$.splice(fileIndex, 1);
|
|
361
|
+
}
|
|
362
|
+
this.CheckForInvalidAttachment();
|
|
363
|
+
this.bShowSelector$ = !(this.arFileList$?.length > 0) || this.allowMultiple$;
|
|
364
|
+
}
|
|
365
|
+
getCurrentAttachmentsList(key, context) {
|
|
366
|
+
return PCore.getStoreValue(`.${key}`, 'context_data', context) || [];
|
|
367
|
+
}
|
|
368
|
+
errorHandler(isFetchCanceled, file) {
|
|
369
|
+
return error => {
|
|
370
|
+
if (!isFetchCanceled(error)) {
|
|
371
|
+
let uploadFailMsg = this.pConn$.getLocalizedValue('Something went wrong', '', '');
|
|
372
|
+
if (error.response && error.response.data && error.response.data.errorDetails) {
|
|
373
|
+
uploadFailMsg = this.pConn$.getLocalizedValue(error.response.data.errorDetails[0].localizedValue, '', '');
|
|
374
|
+
}
|
|
375
|
+
for (const myFile of this.myFiles) {
|
|
376
|
+
if (myFile.ID === file.ID) {
|
|
377
|
+
myFile.meta = uploadFailMsg;
|
|
378
|
+
myFile.error = true;
|
|
379
|
+
myFile.fileName = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
this.bShowSelector$ = false;
|
|
383
|
+
this.arFileList$ = this.myFiles.map(att => {
|
|
384
|
+
if (att.id) {
|
|
385
|
+
return att;
|
|
386
|
+
}
|
|
387
|
+
return this.getNewListUtilityItemProps({
|
|
388
|
+
att,
|
|
389
|
+
downloadFile: null,
|
|
390
|
+
cancelFile: null,
|
|
391
|
+
deleteFile: null,
|
|
392
|
+
removeFile: null
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
PCore.getMessageManager().addMessages({
|
|
396
|
+
// @ts-ignore
|
|
397
|
+
messages: [
|
|
398
|
+
{
|
|
399
|
+
type: 'error',
|
|
400
|
+
message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
|
|
401
|
+
}
|
|
402
|
+
],
|
|
403
|
+
property: this.pConn$.getStateProps().value,
|
|
404
|
+
pageReference: this.pConn$.getPageReference(),
|
|
405
|
+
context: this.pConn$.getContextName()
|
|
406
|
+
});
|
|
407
|
+
this.bShowJustDelete$ = true;
|
|
408
|
+
this.bLoading$ = false;
|
|
409
|
+
}
|
|
410
|
+
throw error;
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
uploadMyFiles(event) {
|
|
414
|
+
let arrAttachmentFiles = [];
|
|
415
|
+
if (this.arFiles$.length) {
|
|
416
|
+
arrAttachmentFiles = this.arFiles$;
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
arrAttachmentFiles = this.arFileList$;
|
|
420
|
+
}
|
|
421
|
+
this.arFiles$ = [...arrAttachmentFiles, ...this.getFiles(event.target.files)];
|
|
422
|
+
// convert FileList to an array
|
|
423
|
+
this.myFiles = Array.from(this.arFiles$);
|
|
424
|
+
this.bLoading$ = true;
|
|
425
|
+
const filesToBeUploaded = this.myFiles
|
|
426
|
+
.filter(e => {
|
|
427
|
+
if (e.id) {
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
const isFileUploaded = e && e.progress === 100;
|
|
431
|
+
const fileHasError = e && e.error;
|
|
432
|
+
const isFileUploadedinLastStep = e.responseProps && e.responseProps.pzInsKey;
|
|
433
|
+
return !isFileUploaded && !fileHasError && !isFileUploadedinLastStep;
|
|
434
|
+
})
|
|
435
|
+
.map(f => PCore.getAttachmentUtils().uploadAttachment(f, () => {
|
|
436
|
+
this.onUploadProgress();
|
|
437
|
+
}, isFetchCanceled => {
|
|
438
|
+
return this.errorHandler(isFetchCanceled, f);
|
|
439
|
+
}, this.pConn$.getContextName()));
|
|
440
|
+
Promise.allSettled(filesToBeUploaded)
|
|
441
|
+
.then((fileResponses) => {
|
|
442
|
+
this.handleFileUploadSuccess(fileResponses);
|
|
443
|
+
})
|
|
444
|
+
.catch(error => {
|
|
445
|
+
console.log(error);
|
|
446
|
+
this.handleFileUploadFailure();
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
handleFileUploadSuccess(fileResponses) {
|
|
450
|
+
const successFileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
|
|
451
|
+
let reqObj;
|
|
452
|
+
if (successFileResponses.length > 0) {
|
|
453
|
+
const tempFilesUploaded = [...this.arFiles$.filter(file => !file.id)];
|
|
454
|
+
let newAttachments = [];
|
|
455
|
+
tempFilesUploaded.forEach(fileRes => {
|
|
456
|
+
const index = successFileResponses.findIndex((fr) => fr.value.clientFileID === fileRes.ID);
|
|
457
|
+
if (index >= 0) {
|
|
458
|
+
reqObj = {
|
|
459
|
+
type: 'File',
|
|
460
|
+
label: this.att_valueRef,
|
|
461
|
+
category: this.att_categoryName,
|
|
462
|
+
handle: successFileResponses[index].value.ID,
|
|
463
|
+
ID: fileRes.ID,
|
|
464
|
+
name: fileRes.name
|
|
465
|
+
};
|
|
466
|
+
newAttachments = [...newAttachments, reqObj];
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName()).filter(f => f.label !== this.att_valueRef);
|
|
470
|
+
PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...newAttachments], {
|
|
471
|
+
pageReference: 'context_data',
|
|
472
|
+
isArrayDeepMerge: false
|
|
473
|
+
});
|
|
474
|
+
this.arFiles$ = tempFilesUploaded;
|
|
475
|
+
this.ngZone.run(() => {
|
|
476
|
+
this.bShowSelector$ = this.allowMultiple$;
|
|
477
|
+
this.arFiles$.forEach(file => {
|
|
478
|
+
if (!file.error) {
|
|
479
|
+
file.meta = this.pConn$.getLocalizedValue('File uploaded successfully', '', '');
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
this.arFileList$ = this.myFiles.map(att => {
|
|
483
|
+
if (att.id) {
|
|
484
|
+
return att;
|
|
485
|
+
}
|
|
486
|
+
return this.getNewListUtilityItemProps({
|
|
487
|
+
att,
|
|
488
|
+
downloadFile: null,
|
|
489
|
+
cancelFile: null,
|
|
490
|
+
deleteFile: null,
|
|
491
|
+
removeFile: null
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
this.CheckForInvalidAttachment();
|
|
495
|
+
this.bShowJustDelete$ = true;
|
|
496
|
+
this.bLoading$ = false;
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
handleFileUploadFailure() {
|
|
501
|
+
this.bShowJustDelete$ = true;
|
|
502
|
+
this.bLoading$ = false;
|
|
503
|
+
this.bShowSelector$ = this.allowMultiple$;
|
|
504
|
+
this.myFiles.forEach(file => {
|
|
505
|
+
if (file?.secondary?.error) {
|
|
506
|
+
file.meta = 'File uploaded failed';
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
this.arFileList$ = this.myFiles.map(att => {
|
|
510
|
+
return this.getNewListUtilityItemProps({
|
|
511
|
+
att,
|
|
512
|
+
downloadFile: null,
|
|
513
|
+
cancelFile: null,
|
|
514
|
+
deleteFile: null,
|
|
515
|
+
removeFile: null
|
|
516
|
+
});
|
|
517
|
+
});
|
|
518
|
+
this.bShowJustDelete$ = true;
|
|
519
|
+
this.bLoading$ = false;
|
|
520
|
+
}
|
|
521
|
+
onUploadProgress() { }
|
|
522
|
+
getFiles(arFiles) {
|
|
523
|
+
const files = this.allowMultiple$ ? arFiles : [arFiles[0]];
|
|
524
|
+
return this.setNewFiles(files);
|
|
525
|
+
}
|
|
526
|
+
setNewFiles(arFiles) {
|
|
527
|
+
let index = 0;
|
|
528
|
+
const maxAttachmentSize = PCore.getEnvironmentInfo().getMaxAttachmentSize() || 5;
|
|
529
|
+
for (const file of arFiles) {
|
|
530
|
+
file.mimeType = file.type;
|
|
531
|
+
file.icon = this.utils.getIconFromFileType(file.type);
|
|
532
|
+
file.ID = `${new Date().getTime()}I${index}`;
|
|
533
|
+
if (!this.validateMaxSize(file, maxAttachmentSize)) {
|
|
534
|
+
file.error = true;
|
|
535
|
+
file.meta = this.pConn$.getLocalizedValue('File is too big. Max allowed size is 5MB.', '', '');
|
|
536
|
+
}
|
|
537
|
+
else if (!this.validateFileExtension(file, this.extensions$)) {
|
|
538
|
+
file.error = true;
|
|
539
|
+
file.meta = `${this.pConn$.getLocalizedValue('File has invalid extension. Allowed extensions are:', '', '')} ${this.extensions$.replaceAll('.', '')}`;
|
|
540
|
+
}
|
|
541
|
+
if (file.error) {
|
|
542
|
+
const fieldName = this.pConn$.getStateProps().value;
|
|
543
|
+
const context = this.pConn$.getContextName();
|
|
544
|
+
PCore.getMessageManager().addMessages({
|
|
545
|
+
// @ts-ignore
|
|
546
|
+
messages: [
|
|
547
|
+
{
|
|
548
|
+
type: 'error',
|
|
549
|
+
message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
|
|
550
|
+
}
|
|
551
|
+
],
|
|
552
|
+
property: fieldName,
|
|
553
|
+
pageReference: this.pConn$.getPageReference(),
|
|
554
|
+
context
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
index++;
|
|
558
|
+
}
|
|
559
|
+
return [...arFiles];
|
|
560
|
+
}
|
|
561
|
+
validateMaxSize(fileObj, maxSizeInMB) {
|
|
562
|
+
const fileSize = (fileObj.size / 1048576).toFixed(2);
|
|
563
|
+
return parseFloat(fileSize) < parseFloat(maxSizeInMB);
|
|
564
|
+
}
|
|
565
|
+
buildFilePropsFromResponse(respObj) {
|
|
566
|
+
return {
|
|
567
|
+
props: {
|
|
568
|
+
meta: `${respObj.pyCategoryName}, ${respObj.pxCreateOperator}`,
|
|
569
|
+
name: respObj.pyAttachName,
|
|
570
|
+
icon: this.utils.getIconFromFileType(respObj.pyMimeFileExtension)
|
|
571
|
+
},
|
|
572
|
+
responseProps: {
|
|
573
|
+
...respObj
|
|
574
|
+
}
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttachmentComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
578
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AttachmentComponent, isStandalone: true, selector: "app-attachment", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, ngImport: i0, template: "<div class=\"psdk-label-infix-readonly\" *ngIf=\"bVisible$\">\n <span class=\"psdk-label-wrapper-readonly\">\n <label [ngClass]=\"{ 'psdk-label-readonly': true, 'label-required': bRequired$ === true }\" [htmlFor]=\"att_valueRef\">{{ label$ }}</label>\n </span>\n <div\n [ngClass]=\"{ 'psdk-modal-file-selector': status !== 'error', 'psdk-modal-file-selector-error': status === 'error' }\"\n id=\"attachment-container\"\n *ngIf=\"bShowSelector$\"\n >\n <mat-spinner *ngIf=\"bLoading$\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"att_valueRef\" [multiple]=\"allowMultiple$\" (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{ allowMultiple$ ? 'Upload files' : 'Upload file' }}\n </button>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n\n <div class=\"psdk-attachment-list\" *ngIf=\"arFileList$ != null && arFileList$.length > 0\">\n <div *ngFor=\"let attachment of arFileList$\">\n <component-mapper\n *ngIf=\"attachment.noDeleteIcon !== true; else showfull\"\n name=\"SummaryItem\"\n [props]=\"{ item$: attachment, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n <ng-template #showfull>\n <component-mapper name=\"SummaryItem\" [props]=\"{ item$: attachment, menuIconOverrideAction$: removeFileFromList$ }\"></component-mapper>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed #262626;width:100%;padding:.3rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:#262626}.file-error{color:#e57373}.psdk-modal-file-selector-error{border:1px dashed #e57373;width:100%;padding:.3rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid grey}::ng-deep .mat-mdc-form-field-infix{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatProgressSpinnerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i4.MatProgressSpinner; }), selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatButtonModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i5.MatButton; }), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return ComponentMapperComponent; }), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
|
|
579
|
+
}
|
|
580
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttachmentComponent, decorators: [{
|
|
581
|
+
type: Component,
|
|
582
|
+
args: [{ selector: 'app-attachment', standalone: true, imports: [CommonModule, MatProgressSpinnerModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)], template: "<div class=\"psdk-label-infix-readonly\" *ngIf=\"bVisible$\">\n <span class=\"psdk-label-wrapper-readonly\">\n <label [ngClass]=\"{ 'psdk-label-readonly': true, 'label-required': bRequired$ === true }\" [htmlFor]=\"att_valueRef\">{{ label$ }}</label>\n </span>\n <div\n [ngClass]=\"{ 'psdk-modal-file-selector': status !== 'error', 'psdk-modal-file-selector-error': status === 'error' }\"\n id=\"attachment-container\"\n *ngIf=\"bShowSelector$\"\n >\n <mat-spinner *ngIf=\"bLoading$\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"att_valueRef\" [multiple]=\"allowMultiple$\" (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{ allowMultiple$ ? 'Upload files' : 'Upload file' }}\n </button>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n\n <div class=\"psdk-attachment-list\" *ngIf=\"arFileList$ != null && arFileList$.length > 0\">\n <div *ngFor=\"let attachment of arFileList$\">\n <component-mapper\n *ngIf=\"attachment.noDeleteIcon !== true; else showfull\"\n name=\"SummaryItem\"\n [props]=\"{ item$: attachment, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n <ng-template #showfull>\n <component-mapper name=\"SummaryItem\" [props]=\"{ item$: attachment, menuIconOverrideAction$: removeFileFromList$ }\"></component-mapper>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed #262626;width:100%;padding:.3rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:#262626}.file-error{color:#e57373}.psdk-modal-file-selector-error{border:1px dashed #e57373;width:100%;padding:.3rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid grey}::ng-deep .mat-mdc-form-field-infix{width:auto}\n"] }]
|
|
583
|
+
}], ctorParameters: function () { return [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }]; }, propDecorators: { pConn$: [{
|
|
584
|
+
type: Input
|
|
585
|
+
}], formGroup$: [{
|
|
586
|
+
type: Input
|
|
587
|
+
}] } });
|
|
588
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFHbEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7QUFpQnhHLE1BQU0sT0FBTyxtQkFBbUI7SUFpQzlCLFlBQ1UsZUFBdUMsRUFDdkMsS0FBWSxFQUNaLE1BQWM7UUFGZCxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDdkMsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLFdBQU0sR0FBTixNQUFNLENBQVE7UUFoQ3hCLHVDQUF1QztRQUN2Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBRTlDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFFWixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixj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QUFDLFlBQVk7Z0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQzthQUNsRTtZQUNELGFBQWEsRUFBRTtnQkFDYixHQUFHLE9BQU87YUFDWDtTQUNGLENBQUM7SUFDSixDQUFDOytHQXRxQlUsbUJBQW1CO21HQUFuQixtQkFBbUIsa0lDekJoQyxtbkRBK0JBLCt0QkRSWSxZQUFZLHlmQUFFLHdCQUF3QixnVEFBRSxlQUFlLDBWQUFtQix3QkFBd0I7OzRGQUVqRyxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBR2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztzSkFHckcsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE5nWm9uZSwgZm9yd2FyZFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IGRvd25sb2FkIGZyb20gJ2Rvd25sb2FkanMnO1xuaW1wb3J0IHsgQW5ndWxhclBDb25uZWN0RGF0YSwgQW5ndWxhclBDb25uZWN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvYW5ndWxhci1wY29ubmVjdCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQQ29ubkZpZWxkUHJvcHMgfSBmcm9tICcuLi8uLi8uLi9fdHlwZXMvUENvbm5Qcm9wcy5pbnRlcmZhY2UnO1xuXG5pbnRlcmZhY2UgQXR0YWNobWVudFByb3BzIGV4dGVuZHMgT21pdDxQQ29ubkZpZWxkUHJvcHMsICd2YWx1ZSc+IHtcbiAgLy8gSWYgYW55LCBlbnRlciBhZGRpdGlvbmFsIHByb3BzIHRoYXQgb25seSBleGlzdCBvbiB0aGlzIGNvbXBvbmVudFxuICB2YWx1ZTogYW55O1xuICBleHRlbnNpb25zOiBhbnk7XG4gIGFsbG93TXVsdGlwbGU6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hdHRhY2htZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdHRhY2htZW50LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBmb3J3YXJkUmVmKCgpID0+IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCldXG59KVxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBDb25uJDogdHlwZW9mIFBDb25uZWN0O1xuICBASW5wdXQoKSBmb3JtR3JvdXAkOiBGb3JtR3JvdXA7XG5cbiAgLy8gRm9yIGludGVyYWN0aW9uIHdpdGggQW5ndWxhclBDb25uZWN0XG4gIGFuZ3VsYXJQQ29ubmVjdERhdGE6IEFuZ3VsYXJQQ29ubmVjdERhdGEgPSB7fTtcblxuICBsYWJlbCQgPSAnJztcbiAgdmFsdWUkOiBhbnk7XG4gIGJSZXF1aXJlZCQgPSBmYWxzZTtcbiAgYlJlYWRvbmx5JCA9IGZhbHNlO1xuICBiRGlzYWJsZWQkID0gZmFsc2U7XG4gIGJWaXNpYmxlJCA9IHRydWU7XG4gIGJMb2FkaW5nJCA9IGZhbHNlO1xuICBhckZpbGVzJDogYW55W10gPSBbXTtcbiAgYXJGaWxlTGlzdCQ6IGFueVtdID0gW107XG4gIHJlbW92ZUZpbGVGcm9tTGlzdCQ6IGFueTtcbiAgYXJNZW51TGlzdCQ6IGFueVtdID0gW107XG4gIGJTaG93U2VsZWN0b3IkID0gdHJ1ZTtcbiAgYlNob3dKdXN0RGVsZXRlJCA9IGZhbHNlO1xuICBhdHRfdmFsdWVSZWY6IGFueTtcbiAgYXR0X2NhdGVnb3J5TmFtZTogc3RyaW5nO1xuICBhdHRfaWQ6IHN0cmluZztcbiAgbXlGaWxlczogYW55O1xuICBmaWxlVGVtcDogYW55ID0ge307XG4gIGNhc2VJRDogYW55O1xuICBhbGxvd011bHRpcGxlJCA9IGZhbHNlO1xuICBleHRlbnNpb25zJCA9ICcnO1xuICBzdGF0dXMgPSAnJztcbiAgdmFsaWRhdGVNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnJztcbiAgdmFsdWVSZWY6IHN0cmluZztcbiAgaW1hZ2VQYXRoJDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYW5ndWxhclBDb25uZWN0OiBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIC8vIEZpcnN0IHRoaW5nIGluIGluaXRpYWxpemF0aW9uIGlzIHJlZ2lzdGVyaW5nIGFuZCBzdWJzY3JpYmluZyB0byB0aGUgQW5ndWxhclBDb25uZWN0IHNlcnZpY2VcbiAgICB0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEgPSB0aGlzLmFuZ3VsYXJQQ29ubmVjdC5yZWdpc3RlckFuZFN1YnNjcmliZUNvbXBvbmVudCh0aGlzLCB0aGlzLm9uU3RhdGVDaGFuZ2UpO1xuXG4gICAgdGhpcy5yZW1vdmVGaWxlRnJvbUxpc3QkID0geyBvbkNsaWNrOiB0aGlzLl9yZW1vdmVGaWxlRnJvbUxpc3QuYmluZCh0aGlzKSB9O1xuXG4gICAgdGhpcy5jYXNlSUQgPSBQQ29yZS5nZXRTdG9yZVZhbHVlKCcucHlJRCcsICdjYXNlSW5mby5jb250ZW50JywgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG5cbiAgICAvLyBsZXQgY29uZmlnUHJvcHM6IGFueSA9IHRoaXMucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyh0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpKTtcbiAgICB0aGlzLmNoZWNrQW5kVXBkYXRlKCk7XG4gIH1cblxuICBjaGVja0FuZFVwZGF0ZSgpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkXG4gICAgLy8gdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAgIGNvbnN0IGJVcGRhdGVTZWxmID0gdGhpcy5hbmd1bGFyUENvbm5lY3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKHRoaXMpO1xuXG4gICAgLy8gT05MWSBjYWxsIHVwZGF0ZVNlbGYgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGVcbiAgICBpZiAoYlVwZGF0ZVNlbGYpIHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG5cbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkNBU0VfRVZFTlRTLkFTU0lHTk1FTlRfU1VCTUlTU0lPTiwgdGhpcy5jYXNlSUQpO1xuICB9XG5cbiAgLy8gQ2FsbGJhY2sgcGFzc2VkIHdoZW4gc3Vic2NyaWJpbmcgdG8gc3RvcmUgY2hhbmdlXG4gIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICB9XG5cbiAgdXBkYXRlQXR0YWNobWVudHNJbmZvKCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSBQcm9wZXJ0eSAnYXR0YWNobWVudHNJbmZvJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdDMTFuRW52J1xuICAgIGlmICghdGhpcy5wQ29ubiQuYXR0YWNobWVudHNJbmZvKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIC0gUHJvcGVydHkgJ2F0dGFjaG1lbnRzSW5mbycgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSAnQzExbkVudidcbiAgICAgIHRoaXMucENvbm4kLmF0dGFjaG1lbnRzSW5mbyA9IHtcbiAgICAgICAgdHlwZTogJ0ZpbGUnLFxuICAgICAgICBhdHRhY2htZW50RmllbGROYW1lOiB0aGlzLmF0dF92YWx1ZVJlZixcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuYXR0X2NhdGVnb3J5TmFtZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzRmlsZShmaWxlLCBpKSB7XG4gICAgZmlsZS5wcm9wcy50eXBlID0gZmlsZS5yZXNwb25zZVByb3BzLnB5TWltZUZpbGVFeHRlbnNpb247XG4gICAgZmlsZS5wcm9wcy5taW1lVHlwZSA9IGZpbGUucmVzcG9uc2VQcm9wcy5weU1pbWVGaWxlRXh0ZW5zaW9uO1xuICAgIGZpbGUucHJvcHMuSUQgPSBmaWxlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG5cbiAgICBjb25zdCBhck1lbnVMaXN0ID0gW1xuICAgICAge1xuICAgICAgICBpY29uOiAnZG93bmxvYWQnLFxuICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRG93bmxvYWQnLCAnJywgJycpLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLl9kb3dubG9hZEZpbGVGcm9tTGlzdCh0aGlzLnZhbHVlJC5weFJlc3VsdHNbaV0pXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRGVsZXRlJywgJycsICcnKSxcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5fcmVtb3ZlRmlsZUZyb21MaXN0KHRoaXMuYXJGaWxlTGlzdCRbaV0pXG4gICAgICB9XG4gICAgXTtcblxuICAgIGNvbnN0IGFyRmlsZXNBdHRhY2htZW50SURzOiBhbnkgPSBbXTtcbiAgICB0aGlzLmFyRmlsZUxpc3QkLmZvckVhY2goYXJGaWxlID0+IHtcbiAgICAgIGFyRmlsZXNBdHRhY2htZW50SURzLnB1c2goYXJGaWxlLmlkKTtcbiAgICB9KTtcblxuICAgIGlmICghYXJGaWxlc0F0dGFjaG1lbnRJRHMuaW5jbHVkZXMoZmlsZS5wcm9wcy5JRCkpIHtcbiAgICAgIHRoaXMuYXJGaWxlTGlzdCQucHVzaChcbiAgICAgICAgdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgICAgYXR0OiBmaWxlLnByb3BzLFxuICAgICAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgICAgICBjYW5jZWxGaWxlOiBudWxsLFxuICAgICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFyRmlsZUxpc3QkW2ldLmFjdGlvbnMgPSBhck1lbnVMaXN0O1xuICAgIHRoaXMuYXJGaWxlTGlzdCRbaV0ubm9EZWxldGVJY29uID0gdHJ1ZTtcblxuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSBmYWxzZTtcbiAgfVxuXG4gIHVwZGF0ZVNlbGYoKSB7XG4gICAgY29uc3QgY29uZmlnUHJvcHM6IEF0dGFjaG1lbnRQcm9wcyA9IHRoaXMucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyh0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpKSBhcyBBdHRhY2htZW50UHJvcHM7XG4gICAgY29uc3Qgc3RhdGVQcm9wczogYW55ID0gdGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpO1xuXG4gICAgY29uc3QgeyB2YWx1ZSwgbGFiZWwsIGV4dGVuc2lvbnMgfSA9IGNvbmZpZ1Byb3BzO1xuXG4gICAgaWYgKGNvbmZpZ1Byb3BzLnJlcXVpcmVkICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlJlcXVpcmVkJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLnJlcXVpcmVkKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ1Byb3BzLnZpc2liaWxpdHkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5iVmlzaWJsZSQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy52aXNpYmlsaXR5KTtcbiAgICB9XG5cbiAgICAvLyBkaXNhYmxlZFxuICAgIGlmIChjb25maWdQcm9wcy5kaXNhYmxlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYkRpc2FibGVkJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnUHJvcHMucmVhZE9ubHkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5iUmVhZG9ubHkkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMucmVhZE9ubHkpO1xuICAgIH1cblxuICAgIGlmIChjb25maWdQcm9wcy5hbGxvd011bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWxsb3dNdWx0aXBsZSQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5hbGxvd011bHRpcGxlKTtcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMubGFiZWwkID0gbGFiZWw7XG4gICAgdGhpcy52YWx1ZSQgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXRlUHJvcHMuc3RhdHVzO1xuICAgIHRoaXMudmFsaWRhdGVNZXNzYWdlID0gdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnZhbGlkYXRlTWVzc2FnZTtcbiAgICB0aGlzLmV4dGVuc2lvbnMkID0gZXh0ZW5zaW9ucztcbiAgICB0aGlzLnZhbHVlUmVmID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgIHRoaXMudmFsdWVSZWYgPSB0aGlzLnZhbHVlUmVmLnN0YXJ0c1dpdGgoJy4nKSA/IHRoaXMudmFsdWVSZWYuc3Vic3RyaW5nKDEpIDogdGhpcy52YWx1ZVJlZjtcblxuICAgIC8qIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IGJlY2F1c2UgcmVxdWlyZWQgaXMgc3VwcG9zZWQgdG8gYmUgcGFzc2VkIGFzIGEgYm9vbGVhbiBhbmQgTk9UIGFzIGEgc3RyaW5nICovXG4gICAgbGV0IHsgcmVxdWlyZWQsIGRpc2FibGVkIH0gPSBjb25maWdQcm9wcztcbiAgICBbcmVxdWlyZWQsIGRpc2FibGVkXSA9IFtyZXF1aXJlZCwgZGlzYWJsZWRdLm1hcChwcm9wID0+IHByb3AgPT09IHRydWUgfHwgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBwcm9wID09PSAndHJ1ZScpKTtcblxuICAgIHRoaXMuYXR0X2NhdGVnb3J5TmFtZSA9ICcnO1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5weUNhdGVnb3J5TmFtZSkge1xuICAgICAgdGhpcy5hdHRfY2F0ZWdvcnlOYW1lID0gdmFsdWUucHlDYXRlZ29yeU5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5hdHRfdmFsdWVSZWYgPSAodGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpIGFzIGFueSkudmFsdWU7XG4gICAgdGhpcy5hdHRfdmFsdWVSZWYgPSB0aGlzLmF0dF92YWx1ZVJlZi5pbmRleE9mKCcuJykgPT09IDAgPyB0aGlzLmF0dF92YWx1ZVJlZi5zdWJzdHJpbmcoMSkgOiB0aGlzLmF0dF92YWx1ZVJlZjtcblxuICAgIHRoaXMudXBkYXRlQXR0YWNobWVudHMoKTtcbiAgfVxuXG4gIHVwZGF0ZUF0dGFjaG1lbnRzKCkge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzRnJvbVNlcnZlciA9IHRoaXMudmFsdWUkICYmIHRoaXMudmFsdWUkLnB4UmVzdWx0cyAmJiArdGhpcy52YWx1ZSQucHlDb3VudCA+IDA7XG5cbiAgICBpZiAoYXR0YWNobWVudHNGcm9tU2VydmVyKSB7XG4gICAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRzRnJvbVNlcnZlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgdGhlIGF0dGFjaG1lbnRzIGZyb20gdGhlIFJlZHV4XG4gICAgICB0aGlzLm15RmlsZXMgPSB0aGlzLmdldEN1cnJlbnRBdHRhY2htZW50c0xpc3QodGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG5cbiAgICAgIGlmICh0aGlzLm15RmlsZXM/Lmxlbmd0aCAmJiB0aGlzLmFyRmlsZXMkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmFyRmlsZUxpc3QkID0gdGhpcy5teUZpbGVzLm1hcChhdHQgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzKHtcbiAgICAgICAgICAgIGF0dCxcbiAgICAgICAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgICAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICAgICAgICBkZWxldGVGaWxlOiBudWxsLFxuICAgICAgICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbXlGaWxlc0F0dGFjaG1lbnRJRHM6IGFueSA9IFtdO1xuICAgICAgdGhpcy5teUZpbGVzLmZvckVhY2gobXlGaWxlID0+IHtcbiAgICAgICAgbXlGaWxlc0F0dGFjaG1lbnRJRHMucHVzaChteUZpbGUuSUQpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXJGaWxlcyQuZm9yRWFjaChhckZpbGUgPT4ge1xuICAgICAgICBpZiAoIW15RmlsZXNBdHRhY2htZW50SURzLmluY2x1ZGVzKGFyRmlsZS5JRCkpIHtcbiAgICAgICAgICB0aGlzLm15RmlsZXMgPSBbLi4udGhpcy5teUZpbGVzLCBhckZpbGVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSAhKHRoaXMuYXJGaWxlTGlzdCQ/Lmxlbmd0aCA+IDApIHx8IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG5cbiAgICBpZiAodGhpcy5hckZpbGVMaXN0JC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLkNoZWNrRm9ySW52YWxpZEF0dGFjaG1lbnQoKTtcbiAgICB9XG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5DQVNFX0VWRU5UUy5BU1NJR05NRU5UX1NVQk1JU1NJT04sXG4gICAgICB0aGlzLnJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNhc2VJRFxuICAgICk7XG4gIH1cblxuICB1cGRhdGVBdHRhY2htZW50c0Zyb21TZXJ2ZXIoKSB7XG4gICAgdGhpcy52YWx1ZSQucHhSZXN1bHRzLmZvckVhY2goKGF0dGFjaG1lbnQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGU6IGFueSA9IHRoaXMuYnVpbGRGaWxlUHJvcHNGcm9tUmVzcG9uc2UoYXR0YWNobWVudCk7XG4gICAgICBpZiAoZmlsZS5yZXNwb25zZVByb3BzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0YWNobWVudHNJbmZvKCk7XG4gICAgICAgIGlmIChmaWxlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXkgJiYgIWZpbGUucmVzcG9uc2VQcm9wcy5wekluc0tleS5pbmNsdWRlcygndGVtcCcpKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlLCBpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50LnByb3BzLklEID09PSBmaWxlLnByb3BzLklEKTtcbiAgICAgICAgICBsZXQgdGVtcEZpbGVzOiBhbnkgPSBbXTtcbiAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0ZW1wRmlsZXMgPSBbZmlsZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgUENvcmUuZ2V0U3RhdGVVdGlscygpLnVwZGF0ZVN0YXRlKFxuICAgICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksXG4gICAgICAgICAgICBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi50ZW1wRmlsZXNdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgICAgICAgICAgaXNBcnJheURlZXBNZXJnZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXNldEF0dGFjaG1lbnRTdG9yZWRTdGF0ZSgpIHtcbiAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUodGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdW5kZWZpbmVkLCB7XG4gICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBfZG93bmxvYWRGaWxlRnJvbUxpc3QoZmlsZU9iajogYW55KSB7XG4gICAgUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKClcbiAgICAgIC8vIEB0cy1pZ25vcmUgLSAzcmQgcGFyYW1ldGVyIFwicmVzcG9uc2VFbmNvZGluZ1wiIHNob3VsZCBiZSBvcHRpb25hbFxuICAgICAgLmRvd25sb2FkQXR0YWNobWVudChmaWxlT2JqLnB6SW5zS2V5LCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKVxuICAgICAgLnRoZW4oKGNvbnRlbnQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlT2JqLnB5QXR0YWNoTmFtZS5zcGxpdCgnLicpLnBvcCgpO1xuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZChjb250ZW50LmRhdGEsIGZpbGVPYmoucHlGaWxlTmFtZSwgZXh0ZW5zaW9uKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfSk7XG4gIH1cblxuICBmaWxlRG93bmxvYWQgPSAoZGF0YSwgZmlsZU5hbWUsIGV4dCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBleHQgPyBgJHtmaWxlTmFtZX0uJHtleHR9YCA6IGZpbGVOYW1lO1xuICAgIGRvd25sb2FkKGF0b2IoZGF0YSksIGZpbGUpO1xuICB9O1xuXG4gIGdldEF0dGFjaG1lbnRLZXkgPSAobmFtZSA9ICcnKSA9PiAobmFtZSA/IGBhdHRhY2htZW50c0xpc3QuJHtuYW1lfWAgOiAnYXR0YWNobWVudHNMaXN0Jyk7XG5cbiAgQ2hlY2tGb3JJbnZhbGlkQXR0YWNobWVudCgpIHtcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgdGhpcy5hckZpbGVMaXN0JC5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgaWYgKGZpbGUuc2Vjb25kYXJ5LmVycm9yKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5jbGVhck1lc3NhZ2VzKHtcbiAgICAgICAgdHlwZTogUENvcmUuZ2V0Q29uc3RhbnRzKCkuTUVTU0FHRVMuTUVTU0FHRVNfVFlQRV9FUlJPUixcbiAgICAgICAgcHJvcGVydHk6ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZSxcbiAgICAgICAgcGFnZVJlZmVyZW5jZTogdGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpLFxuICAgICAgICBjb250ZXh0OiB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfcmVtb3ZlRmlsZUZyb21MaXN0KGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGZpbGVMaXN0SW5kZXggPSB0aGlzLmFyRmlsZUxpc3QkLmZpbmRJbmRleChlbGVtZW50ID0+IGVsZW1lbnQ/LmlkID09PSBpdGVtPy5pZCk7XG4gICAgY29uc3QgZmlsZUluZGV4ID0gdGhpcy5hckZpbGVzJC5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50Py5JRCA9PT0gaXRlbT8uaWQpO1xuXG4gICAgY29uc3QgYXR0YWNobWVudHNMaXN0ID0gW107XG4gICAgbGV0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKTtcbiAgICBpZiAodGhpcy52YWx1ZSQgJiYgdGhpcy52YWx1ZSQucHhSZXN1bHRzICYmICt0aGlzLnZhbHVlJC5weUNvdW50ID4gMCAmJiBpdGVtLmFjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRBdHRhY2htZW50cyA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5tYXAoYXR0YWNobWVudCA9PiB7XG4gICAgICAgIGlmIChhdHRhY2htZW50Py5JRCA9PT0gdGhpcy5hckZpbGVMaXN0JFtmaWxlTGlzdEluZGV4XS5pZCB8fCBhdHRhY2htZW50Py5wcm9wcz8uSUQgPT09IHRoaXMuYXJGaWxlTGlzdCRbZmlsZUxpc3RJbmRleF0uaWQpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5hdHRhY2htZW50LCBkZWxldGU6IHRydWUsIGxhYmVsOiB0aGlzLnZhbHVlUmVmIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gdXBkYXRpbmcgdGhlIHJlZHV4IHN0b3JlIHRvIGhlbHAgZm9ybS1oYW5kbGVyIGluIHBhc3NpbmcgdGhlIGRhdGEgdG8gZGVsZXRlIHRoZSBmaWxlIGZyb20gc2VydmVyXG4gICAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUodGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdXBkYXRlZEF0dGFjaG1lbnRzLCB7XG4gICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICBpc0FycmF5RGVlcE1lcmdlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maWx0ZXIoZiA9PiBmLklEICE9PSBpdGVtLmlkKTtcbiAgICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZShcbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSxcbiAgICAgICAgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSxcbiAgICAgICAgWy4uLmN1cnJlbnRBdHRhY2htZW50TGlzdCwgLi4uYXR0YWNobWVudHNMaXN0XSxcbiAgICAgICAge1xuICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVMaXN0SW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5hckZpbGVMaXN0JC5zcGxpY2UoZmlsZUxpc3RJbmRleCwgMSk7XG4gICAgfVxuICAgIGlmIChmaWxlSW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5hckZpbGVzJC5zcGxpY2UoZmlsZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB0aGlzLkNoZWNrRm9ySW52YWxpZEF0dGFjaG1lbnQoKTtcblxuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSAhKHRoaXMuYXJGaWxlTGlzdCQ/Lmxlbmd0aCA+IDApIHx8IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG4gIH1cblxuICBnZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KGtleSwgY29udGV4dCkge1xuICAgIHJldHVybiBQQ29yZS5nZXRTdG9yZVZhbHVlKGAuJHtrZXl9YCwgJ2NvbnRleHRfZGF0YScsIGNvbnRleHQpIHx8IFtdO1xuICB9XG5cbiAgZXJyb3JIYW5kbGVyKGlzRmV0Y2hDYW5jZWxlZCwgZmlsZSkge1xuICAgIHJldHVybiBlcnJvciA9PiB7XG4gICAgICBpZiAoIWlzRmV0Y2hDYW5jZWxlZChlcnJvcikpIHtcbiAgICAgICAgbGV0IHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnU29tZXRoaW5nIHdlbnQgd3JvbmcnLCAnJywgJycpO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2UuZGF0YSAmJiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlscykge1xuICAgICAgICAgIHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZShlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlsc1swXS5sb2NhbGl6ZWRWYWx1ZSwgJycsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG15RmlsZSBvZiB0aGlzLm15RmlsZXMpIHtcbiAgICAgICAgICBpZiAobXlGaWxlLklEID09PSBmaWxlLklEKSB7XG4gICAgICAgICAgICBteUZpbGUubWV0YSA9IHVwbG9hZEZhaWxNc2c7XG4gICAgICAgICAgICBteUZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgbXlGaWxlLmZpbGVOYW1lID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ1VuYWJsZSB0byB1cGxvYWQgZmlsZScsICcnLCAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hckZpbGVMaXN0JCA9IHRoaXMubXlGaWxlcy5tYXAoYXR0ID0+IHtcbiAgICAgICAgICBpZiAoYXR0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXR0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgICAgICBhdHQsXG4gICAgICAgICAgICBkb3dubG9hZEZpbGU6IG51bGwsXG4gICAgICAgICAgICBjYW5jZWxGaWxlOiBudWxsLFxuICAgICAgICAgICAgZGVsZXRlRmlsZTogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZUZpbGU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlcyh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcHJvcGVydHk6ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZSxcbiAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgY29udGV4dDogdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJMb2FkaW5nJCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfTtcbiAgfVxuXG4gIHVwbG9hZE15RmlsZXMoZXZlbnQ6IGFueSkge1xuICAgIGxldCBhcnJBdHRhY2htZW50RmlsZXM6IGFueSA9IFtdO1xuICAgIGlmICh0aGlzLmFyRmlsZXMkLmxlbmd0aCkge1xuICAgICAgYXJyQXR0YWNobWVudEZpbGVzID0gdGhpcy5hckZpbGVzJDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJyQXR0YWNobWVudEZpbGVzID0gdGhpcy5hckZpbGVMaXN0JDtcbiAgICB9XG4gICAgdGhpcy5hckZpbGVzJCA9IFsuLi5hcnJBdHRhY2htZW50RmlsZXMsIC4uLnRoaXMuZ2V0RmlsZXMoZXZlbnQudGFyZ2V0LmZpbGVzKV07XG5cbiAgICAvLyBjb252ZXJ0IEZpbGVMaXN0IHRvIGFuIGFycmF5XG4gICAgdGhpcy5teUZpbGVzID0gQXJyYXkuZnJvbSh0aGlzLmFyRmlsZXMkKTtcblxuICAgIHRoaXMuYkxvYWRpbmckID0gdHJ1ZTtcblxuICAgIGNvbnN0IGZpbGVzVG9CZVVwbG9hZGVkID0gdGhpcy5teUZpbGVzXG4gICAgICAuZmlsdGVyKGUgPT4ge1xuICAgICAgICBpZiAoZS5pZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0ZpbGVVcGxvYWRlZCA9IGUgJiYgZS5wcm9ncmVzcyA9PT0gMTAwO1xuICAgICAgICBjb25zdCBmaWxlSGFzRXJyb3IgPSBlICYmIGUuZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzRmlsZVVwbG9hZGVkaW5MYXN0U3RlcCA9IGUucmVzcG9uc2VQcm9wcyAmJiBlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG4gICAgICAgIHJldHVybiAhaXNGaWxlVXBsb2FkZWQgJiYgIWZpbGVIYXNFcnJvciAmJiAhaXNGaWxlVXBsb2FkZWRpbkxhc3RTdGVwO1xuICAgICAgfSlcbiAgICAgIC5tYXAoZiA9PlxuICAgICAgICBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKS51cGxvYWRBdHRhY2htZW50KFxuICAgICAgICAgIGYsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblVwbG9hZFByb2dyZXNzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpc0ZldGNoQ2FuY2VsZWQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyKGlzRmV0Y2hDYW5jZWxlZCwgZik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICBQcm9taXNlLmFsbFNldHRsZWQoZmlsZXNUb0JlVXBsb2FkZWQpXG4gICAgICAudGhlbigoZmlsZVJlc3BvbnNlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRmlsZVVwbG9hZFN1Y2Nlc3MoZmlsZVJlc3BvbnNlcyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVVcGxvYWRGYWlsdXJlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVVcGxvYWRTdWNjZXNzKGZpbGVSZXNwb25zZXMpIHtcbiAgICBjb25zdCBzdWNjZXNzRmlsZVJlc3BvbnNlcyA9IGZpbGVSZXNwb25zZXMuZmlsdGVyKGZyID0+IGZyLnN0YXR1cyAhPT0gJ3JlamVjdGVkJyk7IC8vIGluIGNhc2Ugb2YgZGVsZXRpbmcgYW4gaW4gcHJvZ3Jlc3MgZmlsZSwgcHJvbWlzZSBnZXRzIGNhbmNlbGxlZCBidXQgc3RpbGwgZW50ZXJzIHRoZW4gYmxvY2tcbiAgICBsZXQgcmVxT2JqO1xuICAgIGlmIChzdWNjZXNzRmlsZVJlc3BvbnNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0ZW1wRmlsZXNVcGxvYWRlZCA9IFsuLi50aGlzLmFyRmlsZXMkLmZpbHRlcihmaWxlID0+ICFmaWxlLmlkKV07XG4gICAgICBsZXQgbmV3QXR0YWNobWVudHM6IGFueSA9IFtdO1xuICAgICAgdGVtcEZpbGVzVXBsb2FkZWQuZm9yRWFjaChmaWxlUmVzID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBzdWNjZXNzRmlsZVJlc3BvbnNlcy5maW5kSW5kZXgoKGZyOiBhbnkpID0+IGZyLnZhbHVlLmNsaWVudEZpbGVJRCA9PT0gZmlsZVJlcy5JRCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmVxT2JqID0ge1xuICAgICAgICAgICAgdHlwZTogJ0ZpbGUnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuYXR0X3ZhbHVlUmVmLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuYXR0X2NhdGVnb3J5TmFtZSxcbiAgICAgICAgICAgIGhhbmRsZTogc3VjY2Vzc0ZpbGVSZXNwb25zZXNbaW5kZXhdLnZhbHVlLklELFxuICAgICAgICAgICAgSUQ6IGZpbGVSZXMuSUQsXG4gICAgICAgICAgICBuYW1lOiBmaWxlUmVzLm5hbWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzID0gWy4uLm5ld0F0dGFjaG1lbnRzLCByZXFPYmpdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKS5maWx0ZXIoXG4gICAgICAgIGYgPT4gZi5sYWJlbCAhPT0gdGhpcy5hdHRfdmFsdWVSZWZcbiAgICAgICk7XG4gICAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUoXG4gICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksXG4gICAgICAgIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksXG4gICAgICAgIFsuLi5jdXJyZW50QXR0YWNobWVudExpc3QsIC4uLm5ld0F0dGFjaG1lbnRzXSxcbiAgICAgICAge1xuICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmFyRmlsZXMkID0gdGVtcEZpbGVzVXBsb2FkZWQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSB0aGlzLmFsbG93TXVsdGlwbGUkO1xuICAgICAgICB0aGlzLmFyRmlsZXMkLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgaWYgKCFmaWxlLmVycm9yKSB7XG4gICAgICAgICAgICBmaWxlLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRmlsZSB1cGxvYWRlZCBzdWNjZXNzZnVsbHknLCAnJywgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYXJGaWxlTGlzdCQgPSB0aGlzLm15RmlsZXMubWFwKGF0dCA9PiB7XG4gICAgICAgICAgaWYgKGF0dC5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgICAgICAgYXR0LFxuICAgICAgICAgICAgZG93bmxvYWRGaWxlOiBudWxsLFxuICAgICAgICAgICAgY2FuY2VsRmlsZTogbnVsbCxcbiAgICAgICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgICAgICByZW1vdmVGaWxlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuQ2hlY2tGb3JJbnZhbGlkQXR0YWNobWVudCgpO1xuXG4gICAgICAgIHRoaXMuYlNob3dKdXN0RGVsZXRlJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYkxvYWRpbmckID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGaWxlVXBsb2FkRmFpbHVyZSgpIHtcbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMuYkxvYWRpbmckID0gZmFsc2U7XG4gICAgdGhpcy5iU2hvd1NlbGVjdG9yJCA9IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG4gICAgdGhpcy5teUZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBpZiAoZmlsZT8uc2Vjb25kYXJ5Py5lcnJvcikge1xuICAgICAgICBmaWxlLm1ldGEgPSAnRmlsZSB1cGxvYWRlZCBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hckZpbGVMaXN0JCA9IHRoaXMubXlGaWxlcy5tYXAoYXR0ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzKHtcbiAgICAgICAgYXR0LFxuICAgICAgICBkb3dubG9hZEZpbGU6IG51bGwsXG4gICAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgIHJlbW92ZUZpbGU6IG51bGxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5iU2hvd0p1c3REZWxldGUkID0gdHJ1ZTtcbiAgICB0aGlzLmJMb2FkaW5nJCA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMgPSAoeyBhdHQsIGNhbmNlbEZpbGUsIGRvd25sb2FkRmlsZSwgZGVsZXRlRmlsZSwgcmVtb3ZlRmlsZSB9KSA9PiB7XG4gICAgbGV0IGFjdGlvbnM7XG4gICAgbGV0IGlzRG93bmxvYWRhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAoYXR0LnByb2dyZXNzICYmIGF0dC5wcm9ncmVzcyAhPT0gMTAwKSB7XG4gICAgICBhY3Rpb25zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGBDYW5jZWwtJHthdHQuSUR9YCxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQ2FuY2VsJywgJycsICcnKSxcbiAgICAgICAgICBpY29uOiAndGltZXMnLFxuICAgICAgICAgIG9uQ2xpY2s6IGNhbmNlbEZpbGVcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKGF0dC5saW5rcykge1xuICAgICAgY29uc3QgaXNGaWxlID0gYXR0LnR5cGUgPT09ICdGSUxFJztcbiAgICAgIGNvbnN0IElEID0gYXR0LklELnJlcGxhY2UoL1xccy9naSwgJycpO1xuICAgICAgY29uc3QgYWN0aW9uc01hcCA9IG5ldyBNYXAoW1xuICAgICAgICBbXG4gICAgICAgICAgJ2Rvd25sb2FkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogYGRvd25sb2FkLSR7SUR9YCxcbiAgICAgICAgICAgIHRleHQ6IGlzRmlsZSA/IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdEb3dubG9hZCcsICcnLCAnJykgOiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnT3BlbicsICcnLCAnJyksXG4gICAgICAgICAgICBpY29uOiBpc0ZpbGUgPyAnZG93bmxvYWQnIDogJ29wZW4nLFxuICAgICAgICAgICAgb25DbGljazogZG93bmxvYWRGaWxlXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGBEZWxldGUtJHtJRH1gLFxuICAgICAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0RlbGV0ZScsICcnLCAnJyksXG4gICAgICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICAgICAgb25DbGljazogZGVsZXRlRmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgXSk7XG4gICAgICBhY3Rpb25zID0gW107XG4gICAgICBhY3Rpb25zTWFwLmZvckVhY2goKGFjdGlvbiwgYWN0aW9uS2V5KSA9PiB7XG4gICAgICAgIGlmIChhdHQubGlua3NbYWN0aW9uS2V5XSkge1xuICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGlzRG93bmxvYWRhYmxlID0gYXR0LmxpbmtzLmRvd25sb2FkO1xuICAgIH0gZWxzZSBpZiAoYXR0LmVycm9yKSB7XG4gICAgICBhY3Rpb25zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGBSZW1vdmUtJHthdHQuSUR9YCxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnUmVtb3ZlJywgJycsICcnKSxcbiAgICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICAgIG9uQ2xpY2s6IHJlbW92ZUZpbGVcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGF0dC5JRCxcbiAgICAgIHZpc3VhbDoge1xuICAgICAgICBpY29uOiB0aGlzLnV0aWxzLmdldEljb25Gb3JBdHRhY2htZW50KGF0dCksXG4gICAgICAgIHByb2dyZXNzOiBhdHQucHJvZ3Jlc3MgPT0gMTAwID8gdW5kZWZpbmVkIDogYXR0LnByb2dyZXNzXG4gICAgICB9LFxuICAgICAgcHJpbWFyeToge1xuICAgICAgICB0eXBlOiBhdHQudHlwZSxcbiAgICAgICAgbmFtZTogYXR0LmVycm9yID8gYXR0LmZpbGVOYW1lIDogYXR0Lm5hbWUsXG4gICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgIGNsaWNrOiByZW1vdmVGaWxlXG4gICAgICB9LFxuICAgICAgc2Vjb25kYXJ5OiB7XG4gICAgICAgIHRleHQ6IGF0dC5tZXRhLFxuICAgICAgICBlcnJvcjogYXR0LmVycm9yXG4gICAgICB9LFxuICAgICAgYWN0aW9uc1xuICAgIH07XG4gIH07XG5cbiAgb25VcGxvYWRQcm9ncmVzcygpIHt9XG5cbiAgZ2V0RmlsZXMoYXJGaWxlczogYW55W10pOiBhbnlbXSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFsbG93TXVsdGlwbGUkID8gYXJGaWxlcyA6IFthckZpbGVzWzBdXTtcbiAgICByZXR1cm4gdGhpcy5zZXROZXdGaWxlcyhmaWxlcyk7XG4gIH1cblxuICBzZXROZXdGaWxlcyhhckZpbGVzKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBtYXhBdHRhY2htZW50U2l6ZSA9IFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldE1heEF0dGFjaG1lbnRTaXplKCkgfHwgNTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXJGaWxlcykge1xuICAgICAgZmlsZS5taW1lVHlwZSA9IGZpbGUudHlwZTtcbiAgICAgIGZpbGUuaWNvbiA9IHRoaXMudXRpbHMuZ2V0SWNvbkZyb21GaWxlVHlwZShmaWxlLnR5cGUpO1xuICAgICAgZmlsZS5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfUkke2luZGV4fWA7XG5cbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZU1heFNpemUoZmlsZSwgbWF4QXR0YWNobWVudFNpemUpKSB7XG4gICAgICAgIGZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmaWxlLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRmlsZSBpcyB0b28gYmlnLiBNYXggYWxsb3dlZCBzaXplIGlzIDVNQi4nLCAnJywgJycpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy52YWxpZGF0ZUZpbGVFeHRlbnNpb24oZmlsZSwgdGhpcy5leHRlbnNpb25zJCkpIHtcbiAgICAgICAgZmlsZS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZpbGUubWV0YSA9IGAke3RoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdGaWxlIGhhcyBpbnZhbGlkIGV4dGVuc2lvbi4gQWxsb3dlZCBleHRlbnNpb25zIGFyZTonLCAnJywgJycpfSAke3RoaXMuZXh0ZW5zaW9ucyQucmVwbGFjZUFsbChcbiAgICAgICAgICAnLicsXG4gICAgICAgICAgJydcbiAgICAgICAgKX1gO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGUuZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlcyh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5hckZpbGVzXTtcbiAgfVxuXG4gIHZhbGlkYXRlTWF4U2l6ZShmaWxlT2JqLCBtYXhTaXplSW5NQik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZpbGVTaXplID0gKGZpbGVPYmouc2l6ZSAvIDEwNDg1NzYpLnRvRml4ZWQoMik7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZmlsZVNpemUpIDwgcGFyc2VGbG9hdChtYXhTaXplSW5NQik7XG4gIH1cblxuICB2YWxpZGF0ZUZpbGVFeHRlbnNpb24gPSAoZmlsZU9iaiwgYWxsb3dlZEV4dGVuc2lvbnMpID0+IHtcbiAgICBpZiAoIWFsbG93ZWRFeHRlbnNpb25zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbkxpc3QgPSBhbGxvd2VkRXh0ZW5zaW9uc1xuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKGl0ZW0gPT4gaXRlbS5yZXBsYWNlQWxsKCcuJywgJycpLnRyaW0oKSk7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZU9iai5uYW1lLnNwbGl0KCcuJykucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gYWxsb3dlZEV4dGVuc2lvbkxpc3QuaW5jbHVkZXMoZXh0ZW5zaW9uKTtcbiAgfTtcblxuICBidWlsZEZpbGVQcm9wc0Zyb21SZXNwb25zZShyZXNwT2JqKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIG1ldGE6IGAke3Jlc3BPYmoucHlDYXRlZ29yeU5hbWV9LCAke3Jlc3BPYmoucHhDcmVhdGVPcGVyYXRvcn1gLFxuICAgICAgICBuYW1lOiByZXNwT2JqLnB5QXR0YWNoTmFtZSxcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRnJvbUZpbGVUeXBlKHJlc3BPYmoucHlNaW1lRmlsZUV4dGVuc2lvbilcbiAgICAgIH0sXG4gICAgICByZXNwb25zZVByb3BzOiB7XG4gICAgICAgIC4uLnJlc3BPYmpcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHNkay1sYWJlbC1pbmZpeC1yZWFkb25seVwiICpuZ0lmPVwiYlZpc2libGUkXCI+XG4gIDxzcGFuIGNsYXNzPVwicHNkay1sYWJlbC13cmFwcGVyLXJlYWRvbmx5XCI+XG4gICAgPGxhYmVsIFtuZ0NsYXNzXT1cInsgJ3BzZGstbGFiZWwtcmVhZG9ubHknOiB0cnVlLCAnbGFiZWwtcmVxdWlyZWQnOiBiUmVxdWlyZWQkID09PSB0cnVlIH1cIiBbaHRtbEZvcl09XCJhdHRfdmFsdWVSZWZcIj57eyBsYWJlbCQgfX08L2xhYmVsPlxuICA8L3NwYW4+XG4gIDxkaXZcbiAgICBbbmdDbGFzc109XCJ7ICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3InOiBzdGF0dXMgIT09ICdlcnJvcicsICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3ItZXJyb3InOiBzdGF0dXMgPT09ICdlcnJvcicgfVwiXG4gICAgaWQ9XCJhdHRhY2htZW50LWNvbnRhaW5lclwiXG4gICAgKm5nSWY9XCJiU2hvd1NlbGVjdG9yJFwiXG4gID5cbiAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJiTG9hZGluZyRcIiBjbGFzcz1cInByb2dyZXNzLXNwaW5uZXJcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8aW5wdXQgaGlkZGVuIHR5cGU9XCJmaWxlXCIgW3JlcXVpcmVkXT1cImJSZXF1aXJlZCRcIiAjdXBsb2FkZXIgW2lkXT1cImF0dF92YWx1ZVJlZlwiIFttdWx0aXBsZV09XCJhbGxvd011bHRpcGxlJFwiIChjaGFuZ2UpPVwidXBsb2FkTXlGaWxlcygkZXZlbnQpXCIgLz5cblxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJiRGlzYWJsZWQkXCIgKGNsaWNrKT1cInVwbG9hZGVyLmNsaWNrKClcIj5cbiAgICAgIHt7IGFsbG93TXVsdGlwbGUkID8gJ1VwbG9hZCBmaWxlcycgOiAnVXBsb2FkIGZpbGUnIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8c3BhbiAqbmdJZj1cInZhbGlkYXRlTWVzc2FnZVwiIGNsYXNzPVwiZmlsZS1lcnJvclwiPnt7IHZhbGlkYXRlTWVzc2FnZSB9fTwvc3Bhbj5cblxuICA8ZGl2IGNsYXNzPVwicHNkay1hdHRhY2htZW50LWxpc3RcIiAqbmdJZj1cImFyRmlsZUxpc3QkICE9IG51bGwgJiYgYXJGaWxlTGlzdCQubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGF0dGFjaG1lbnQgb2YgYXJGaWxlTGlzdCRcIj5cbiAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgICpuZ0lmPVwiYXR0YWNobWVudC5ub0RlbGV0ZUljb24gIT09IHRydWU7IGVsc2Ugc2hvd2Z1bGxcIlxuICAgICAgICBuYW1lPVwiU3VtbWFyeUl0ZW1cIlxuICAgICAgICBbcHJvcHNdPVwieyBpdGVtJDogYXR0YWNobWVudCwgbWVudUljb25PdmVycmlkZSQ6ICd0cmFzaCcsIG1lbnVJY29uT3ZlcnJpZGVBY3Rpb24kOiByZW1vdmVGaWxlRnJvbUxpc3QkIH1cIlxuICAgICAgPjwvY29tcG9uZW50LW1hcHBlcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd2Z1bGw+XG4gICAgICAgIDxjb21wb25lbnQtbWFwcGVyIG5hbWU9XCJTdW1tYXJ5SXRlbVwiIFtwcm9wc109XCJ7IGl0ZW0kOiBhdHRhY2htZW50LCBtZW51SWNvbk92ZXJyaWRlQWN0aW9uJDogcmVtb3ZlRmlsZUZyb21MaXN0JCB9XCI+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|