@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,631 @@
|
|
|
1
|
+
import { Component, Input, forwardRef } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { MatInputModule } from '@angular/material/input';
|
|
5
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
6
|
+
import download from 'downloadjs';
|
|
7
|
+
import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../../../_bridge/angular-pconnect";
|
|
10
|
+
import * as i2 from "../../../_helpers/utils";
|
|
11
|
+
import * as i3 from "@angular/common";
|
|
12
|
+
import * as i4 from "@angular/material/button";
|
|
13
|
+
import * as i5 from "@angular/material/form-field";
|
|
14
|
+
import * as i6 from "@angular/material/input";
|
|
15
|
+
export class FileUtilityComponent {
|
|
16
|
+
constructor(angularPConnect, utils, ngZone) {
|
|
17
|
+
this.angularPConnect = angularPConnect;
|
|
18
|
+
this.utils = utils;
|
|
19
|
+
this.ngZone = ngZone;
|
|
20
|
+
// For interaction with AngularPConnect
|
|
21
|
+
this.angularPConnectData = {};
|
|
22
|
+
this.arFullListAttachments = [];
|
|
23
|
+
this.lu_name$ = '';
|
|
24
|
+
this.lu_icon$ = '';
|
|
25
|
+
this.lu_bLoading$ = false;
|
|
26
|
+
this.lu_count$ = 0;
|
|
27
|
+
this.lu_arActions$ = [];
|
|
28
|
+
this.lu_arItems$ = [];
|
|
29
|
+
this.va_arItems$ = [];
|
|
30
|
+
this.bShowFileModal$ = false;
|
|
31
|
+
this.bShowLinkModal$ = false;
|
|
32
|
+
this.bShowViewAllModal$ = false;
|
|
33
|
+
this.arFileMainButtons$ = [];
|
|
34
|
+
this.arFileSecondaryButtons$ = [];
|
|
35
|
+
this.arLinkMainButtons$ = [];
|
|
36
|
+
this.arLinkSecondaryButtons$ = [];
|
|
37
|
+
this.arFiles$ = [];
|
|
38
|
+
this.arFileList$ = [];
|
|
39
|
+
this.arLinks$ = [];
|
|
40
|
+
this.arLinksList$ = [];
|
|
41
|
+
this.link_title$ = '';
|
|
42
|
+
this.link_url$ = '';
|
|
43
|
+
this.closeSvgIcon$ = '';
|
|
44
|
+
this.currentCaseID = '';
|
|
45
|
+
this.addAttachmentsActions = [
|
|
46
|
+
{
|
|
47
|
+
text: 'Add files',
|
|
48
|
+
id: 'addNewFiles',
|
|
49
|
+
onClick: () => this.createModal('addLocalFile')
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
text: 'Add links',
|
|
53
|
+
id: 'addNewLinks',
|
|
54
|
+
onClick: () => this.createModal('addLocalLink')
|
|
55
|
+
}
|
|
56
|
+
];
|
|
57
|
+
this.getNewListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
|
|
58
|
+
let actions;
|
|
59
|
+
let isDownloadable = false;
|
|
60
|
+
if (att.progress && att.progress !== 100) {
|
|
61
|
+
actions = [
|
|
62
|
+
{
|
|
63
|
+
id: `Cancel-${att.ID}`,
|
|
64
|
+
text: 'Cancel',
|
|
65
|
+
icon: 'times',
|
|
66
|
+
onClick: cancelFile
|
|
67
|
+
}
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
else if (att.links) {
|
|
71
|
+
const isFile = att.type === 'FILE';
|
|
72
|
+
const ID = att.ID.replace(/\s/gi, '');
|
|
73
|
+
const actionsMap = new Map([
|
|
74
|
+
[
|
|
75
|
+
'download',
|
|
76
|
+
{
|
|
77
|
+
id: `download-${ID}`,
|
|
78
|
+
text: isFile ? 'Download' : 'Open',
|
|
79
|
+
icon: isFile ? 'download' : 'open',
|
|
80
|
+
onClick: downloadFile
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
[
|
|
84
|
+
'delete',
|
|
85
|
+
{
|
|
86
|
+
id: `Delete-${ID}`,
|
|
87
|
+
text: 'Delete',
|
|
88
|
+
icon: 'trash',
|
|
89
|
+
onClick: deleteFile
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
]);
|
|
93
|
+
actions = [];
|
|
94
|
+
actionsMap.forEach((action, actionKey) => {
|
|
95
|
+
if (att.links[actionKey]) {
|
|
96
|
+
actions.push(action);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
100
|
+
isDownloadable = att.links.download;
|
|
101
|
+
}
|
|
102
|
+
else if (att.error) {
|
|
103
|
+
actions = [
|
|
104
|
+
{
|
|
105
|
+
id: `Remove-${att.ID}`,
|
|
106
|
+
text: 'Remove',
|
|
107
|
+
icon: 'trash',
|
|
108
|
+
onClick: removeFile
|
|
109
|
+
}
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
id: att.ID,
|
|
114
|
+
visual: {
|
|
115
|
+
icon: this.utils.getIconForAttachment(att),
|
|
116
|
+
progress: att.progress == 100 ? undefined : att.progress
|
|
117
|
+
},
|
|
118
|
+
primary: {
|
|
119
|
+
type: att.type,
|
|
120
|
+
name: att.name,
|
|
121
|
+
icon: 'trash',
|
|
122
|
+
click: removeFile
|
|
123
|
+
},
|
|
124
|
+
secondary: {
|
|
125
|
+
text: att.meta
|
|
126
|
+
},
|
|
127
|
+
actions
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
this.getListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
|
|
131
|
+
let actions;
|
|
132
|
+
let isDownloadable = false;
|
|
133
|
+
if (att.progress && att.progress !== 100) {
|
|
134
|
+
actions = [
|
|
135
|
+
{
|
|
136
|
+
id: `Cancel-${att.ID}`,
|
|
137
|
+
text: this.pConn$.getLocalizedValue('Cancel', '', ''),
|
|
138
|
+
icon: 'times',
|
|
139
|
+
onClick: cancelFile
|
|
140
|
+
}
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
else if (att.links) {
|
|
144
|
+
const isFile = att.type === 'FILE';
|
|
145
|
+
const ID = att.ID.replace(/\s/gi, '');
|
|
146
|
+
const actionsMap = new Map([
|
|
147
|
+
[
|
|
148
|
+
'download',
|
|
149
|
+
{
|
|
150
|
+
id: `download-${ID}`,
|
|
151
|
+
text: isFile ? this.pConn$.getLocalizedValue('Download', '', '') : this.pConn$.getLocalizedValue('Open', '', ''),
|
|
152
|
+
icon: isFile ? 'download' : 'open',
|
|
153
|
+
onClick: downloadFile
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
[
|
|
157
|
+
'delete',
|
|
158
|
+
{
|
|
159
|
+
id: `Delete-${ID}`,
|
|
160
|
+
text: this.pConn$.getLocalizedValue('Delete', '', ''),
|
|
161
|
+
icon: 'trash',
|
|
162
|
+
onClick: deleteFile
|
|
163
|
+
}
|
|
164
|
+
]
|
|
165
|
+
]);
|
|
166
|
+
actions = [];
|
|
167
|
+
actionsMap.forEach((action, actionKey) => {
|
|
168
|
+
if (att.links[actionKey]) {
|
|
169
|
+
actions.push(action);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
173
|
+
isDownloadable = att.links.download;
|
|
174
|
+
}
|
|
175
|
+
else if (att.error) {
|
|
176
|
+
actions = [
|
|
177
|
+
{
|
|
178
|
+
id: `Remove-${att.ID}`,
|
|
179
|
+
text: this.pConn$.getLocalizedValue('Remove', '', ''),
|
|
180
|
+
icon: 'trash',
|
|
181
|
+
onClick: removeFile
|
|
182
|
+
}
|
|
183
|
+
];
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
id: att.ID,
|
|
187
|
+
visual: {
|
|
188
|
+
icon: this.utils.getIconForAttachment(att),
|
|
189
|
+
progress: att.progress == 100 ? undefined : att.progress
|
|
190
|
+
},
|
|
191
|
+
primary: {
|
|
192
|
+
type: att.type,
|
|
193
|
+
name: att.name,
|
|
194
|
+
icon: 'open',
|
|
195
|
+
click: downloadFile
|
|
196
|
+
},
|
|
197
|
+
secondary: {
|
|
198
|
+
text: att.meta
|
|
199
|
+
},
|
|
200
|
+
actions
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
this.fileDownload = (data, fileName, ext) => {
|
|
204
|
+
const file = ext ? `${fileName}.${ext}` : fileName;
|
|
205
|
+
download(atob(data), file);
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
ngOnInit() {
|
|
209
|
+
// // First thing in initialization is registering and subscribing to the AngularPConnect service
|
|
210
|
+
this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
|
|
211
|
+
const configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
|
|
212
|
+
this.lu_name$ = configProps.label ?? '';
|
|
213
|
+
this.lu_icon$ = 'paper-clip';
|
|
214
|
+
this.closeSvgIcon$ = this.utils.getImageSrc('times', this.utils.getSDKStaticContentUrl());
|
|
215
|
+
// const onViewAllCallback = () => this.onViewAll(this.arFullListAttachments);
|
|
216
|
+
this.lu_onViewAllFunction = { onClick: this.onViewAll.bind(this) };
|
|
217
|
+
this.removeFileFromList$ = { onClick: this.removeFileFromList.bind(this) };
|
|
218
|
+
this.removeLinksFromList$ = { onClick: this.removeLinksFromList.bind(this) };
|
|
219
|
+
this.updateSelf();
|
|
220
|
+
this.createModalButtons();
|
|
221
|
+
PCore.getPubSubUtils().subscribe(PCore.getEvents().getCaseEvent().CASE_ATTACHMENTS_UPDATED_FROM_CASEVIEW, this.updateSelf.bind(this), 'caseAttachmentsUpdateFromCaseview');
|
|
222
|
+
}
|
|
223
|
+
ngOnDestroy() {
|
|
224
|
+
if (this.angularPConnectData.unsubscribeFn) {
|
|
225
|
+
this.angularPConnectData.unsubscribeFn();
|
|
226
|
+
}
|
|
227
|
+
PCore.getPubSubUtils().unsubscribe(PCore.getEvents().getCaseEvent().CASE_ATTACHMENTS_UPDATED_FROM_CASEVIEW, 'caseAttachmentsUpdateFromCaseview');
|
|
228
|
+
}
|
|
229
|
+
// Callback passed when subscribing to store change
|
|
230
|
+
onStateChange() {
|
|
231
|
+
// adding a property to track in configProps, when ever the attachment file changes
|
|
232
|
+
// need to trigger a redraw
|
|
233
|
+
this.pConn$.registerAdditionalProps({
|
|
234
|
+
lastRefreshTime: `@P ${PCore.getConstants().SUMMARY_OF_ATTACHMENTS_LAST_REFRESH_TIME}`
|
|
235
|
+
});
|
|
236
|
+
// Should always check the bridge to see if the component should update itself (re-render)
|
|
237
|
+
const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
|
|
238
|
+
// ONLY call updateSelf when the component should update
|
|
239
|
+
if (bUpdateSelf || this.caseHasChanged()) {
|
|
240
|
+
this.updateSelf();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
onAttachFiles(files) {
|
|
244
|
+
const attachmentUtils = PCore.getAttachmentUtils();
|
|
245
|
+
// @ts-ignore - second parameter pageReference for getValue method should be optional
|
|
246
|
+
const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
|
|
247
|
+
if (files.length > 0) {
|
|
248
|
+
this.lu_bLoading$ = true;
|
|
249
|
+
}
|
|
250
|
+
// const uploadedFiles = [];
|
|
251
|
+
for (const file of files) {
|
|
252
|
+
attachmentUtils
|
|
253
|
+
.uploadAttachment(file, this.onUploadProgress, this.errorHandler, this.pConn$.getContextName())
|
|
254
|
+
.then((fileResponse) => {
|
|
255
|
+
if (fileResponse.type === 'File') {
|
|
256
|
+
attachmentUtils.linkAttachmentsToCase(caseID, [fileResponse], 'File', this.pConn$.getContextName())
|
|
257
|
+
.then(() => {
|
|
258
|
+
this.refreshAttachments();
|
|
259
|
+
})
|
|
260
|
+
.catch(console.error);
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
.catch(console.error);
|
|
264
|
+
}
|
|
265
|
+
this.arFileList$ = [];
|
|
266
|
+
}
|
|
267
|
+
refreshAttachments() {
|
|
268
|
+
this.updateSelf();
|
|
269
|
+
}
|
|
270
|
+
onUploadProgress() { }
|
|
271
|
+
errorHandler() { }
|
|
272
|
+
onAttachLinks(links) {
|
|
273
|
+
const attachmentUtils = PCore.getAttachmentUtils();
|
|
274
|
+
// @ts-ignore - second parameter pageReference for getValue method should be optional
|
|
275
|
+
const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
|
|
276
|
+
if (links.length > 0) {
|
|
277
|
+
this.lu_bLoading$ = true;
|
|
278
|
+
}
|
|
279
|
+
const linksToAttach = links.map(link => ({
|
|
280
|
+
type: 'URL',
|
|
281
|
+
category: 'URL',
|
|
282
|
+
url: link.url,
|
|
283
|
+
name: link.linkTitle
|
|
284
|
+
}));
|
|
285
|
+
attachmentUtils.linkAttachmentsToCase(caseID, linksToAttach, 'URL', this.pConn$.getContextName())
|
|
286
|
+
.then(() => {
|
|
287
|
+
this.refreshAttachments();
|
|
288
|
+
})
|
|
289
|
+
.catch(console.log);
|
|
290
|
+
}
|
|
291
|
+
addAttachments(attsFromResp = []) {
|
|
292
|
+
this.lu_bLoading$ = false;
|
|
293
|
+
attsFromResp = attsFromResp.map(respAtt => {
|
|
294
|
+
const updatedAtt = {
|
|
295
|
+
...respAtt,
|
|
296
|
+
meta: `${respAtt.category} . ${this.utils.generateDateTime(respAtt.createTime, 'DateTime-Since')}, ${respAtt.createdBy}`
|
|
297
|
+
};
|
|
298
|
+
if (updatedAtt.type === 'FILE') {
|
|
299
|
+
updatedAtt.nameWithExt = updatedAtt.fileName;
|
|
300
|
+
}
|
|
301
|
+
return updatedAtt;
|
|
302
|
+
});
|
|
303
|
+
return attsFromResp;
|
|
304
|
+
}
|
|
305
|
+
onViewAll() {
|
|
306
|
+
this.bShowViewAllModal$ = true;
|
|
307
|
+
// add clickAway listener
|
|
308
|
+
// window.addEventListener('mouseup', this._clickAway.bind(this));
|
|
309
|
+
}
|
|
310
|
+
// Below method is not needed, still having it commented in case we want in future
|
|
311
|
+
// _clickAway(event: any) {
|
|
312
|
+
// let bInPopUp = false;
|
|
313
|
+
// // run through list of elements in path, if menu not in th path, then want to
|
|
314
|
+
// // hide (toggle) the menu
|
|
315
|
+
// for (const i in event.path) {
|
|
316
|
+
// if (event.path[i].className == 'psdk-modal-file-top' || event.path[i].tagName == 'BUTTON') {
|
|
317
|
+
// bInPopUp = true;
|
|
318
|
+
// break;
|
|
319
|
+
// }
|
|
320
|
+
// }
|
|
321
|
+
// if (!bInPopUp) {
|
|
322
|
+
// this.bShowViewAllModal$ = false;
|
|
323
|
+
// window.removeEventListener('mouseup', this._clickAway.bind(this));
|
|
324
|
+
// }
|
|
325
|
+
// }
|
|
326
|
+
_closeViewAll() {
|
|
327
|
+
this.bShowViewAllModal$ = false;
|
|
328
|
+
// window.removeEventListener('mouseup', this._clickAway.bind(this));
|
|
329
|
+
}
|
|
330
|
+
removeFileFromList(item) {
|
|
331
|
+
if (item != null) {
|
|
332
|
+
const arFileList = this.arFileList$;
|
|
333
|
+
const itemId = item.id;
|
|
334
|
+
for (let fileIndex = 0; fileIndex < arFileList.length; fileIndex++) {
|
|
335
|
+
if (arFileList[fileIndex].id == itemId) {
|
|
336
|
+
// remove the file from the list and redraw
|
|
337
|
+
this.ngZone.run(() => {
|
|
338
|
+
arFileList.splice(fileIndex, 1);
|
|
339
|
+
});
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
removeLinksFromList(item) {
|
|
346
|
+
const localLinksList = this.arLinksList$.slice();
|
|
347
|
+
if (item != null) {
|
|
348
|
+
const itemId = item.id;
|
|
349
|
+
for (let linkIndex = 0; linkIndex < localLinksList.length; linkIndex++) {
|
|
350
|
+
if (localLinksList[linkIndex].id == itemId) {
|
|
351
|
+
// remove the file from the list and redraw
|
|
352
|
+
localLinksList.splice(linkIndex, 1);
|
|
353
|
+
this.ngZone.run(() => {
|
|
354
|
+
this.arLinksList$ = localLinksList.slice();
|
|
355
|
+
});
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
_addLink() {
|
|
362
|
+
// copy list locally
|
|
363
|
+
const localList = this.arLinksList$.slice();
|
|
364
|
+
const url = this.link_url$;
|
|
365
|
+
if (!/^(http|https):\/\//.test(this.link_url$)) {
|
|
366
|
+
this.link_url$ = `http://${this.link_url$}`;
|
|
367
|
+
}
|
|
368
|
+
// list for display
|
|
369
|
+
let oLink = {};
|
|
370
|
+
oLink.icon = 'chain';
|
|
371
|
+
oLink.ID = `${new Date().getTime()}`;
|
|
372
|
+
oLink = this.getNewListUtilityItemProps({
|
|
373
|
+
att: oLink,
|
|
374
|
+
downloadFile: null,
|
|
375
|
+
cancelFile: null,
|
|
376
|
+
deleteFile: null,
|
|
377
|
+
removeFile: null
|
|
378
|
+
});
|
|
379
|
+
oLink.type = 'URL';
|
|
380
|
+
oLink.primary.type = oLink.type;
|
|
381
|
+
oLink.visual.icon = 'chain';
|
|
382
|
+
oLink.primary.name = this.link_title$;
|
|
383
|
+
oLink.primary.icon = 'open';
|
|
384
|
+
oLink.secondary.text = url;
|
|
385
|
+
this.ngZone.run(() => {
|
|
386
|
+
// need to create a new array or summary list won't detect changes
|
|
387
|
+
this.arLinksList$ = localList.slice();
|
|
388
|
+
this.arLinksList$.push(oLink);
|
|
389
|
+
// list for actually attachments
|
|
390
|
+
const link = {};
|
|
391
|
+
link.id = oLink.id;
|
|
392
|
+
link.linkTitle = this.link_title$;
|
|
393
|
+
link.type = oLink.type;
|
|
394
|
+
link.url = url;
|
|
395
|
+
this.arLinks$.push(link);
|
|
396
|
+
// clear values
|
|
397
|
+
this.link_title$ = '';
|
|
398
|
+
this.link_url$ = '';
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
_changeTitle(event) {
|
|
402
|
+
this.link_title$ = event.srcElement.value;
|
|
403
|
+
}
|
|
404
|
+
_changeUrl(event) {
|
|
405
|
+
this.link_url$ = event.srcElement.value;
|
|
406
|
+
}
|
|
407
|
+
downloadFile(att) {
|
|
408
|
+
const attachUtils = PCore.getAttachmentUtils();
|
|
409
|
+
const { ID, name, extension, type } = att;
|
|
410
|
+
const context = this.pConn$.getContextName();
|
|
411
|
+
attachUtils
|
|
412
|
+
// @ts-ignore - 3rd parameter "responseEncoding" is optional
|
|
413
|
+
.downloadAttachment(ID, context)
|
|
414
|
+
.then((content) => {
|
|
415
|
+
if (type === 'FILE') {
|
|
416
|
+
this.fileDownload(content.data, name, extension);
|
|
417
|
+
}
|
|
418
|
+
else if (type === 'URL') {
|
|
419
|
+
let { data } = content;
|
|
420
|
+
if (!/^(http|https):\/\//.test(data)) {
|
|
421
|
+
data = `//${data}`;
|
|
422
|
+
}
|
|
423
|
+
window.open(content.data, '_blank');
|
|
424
|
+
}
|
|
425
|
+
})
|
|
426
|
+
.catch(console.error);
|
|
427
|
+
}
|
|
428
|
+
cancelFile() {
|
|
429
|
+
alert('cancel');
|
|
430
|
+
}
|
|
431
|
+
deleteFile(att) {
|
|
432
|
+
setTimeout(() => {
|
|
433
|
+
const attachUtils = PCore.getAttachmentUtils();
|
|
434
|
+
const { ID } = att;
|
|
435
|
+
const context = this.pConn$.getContextName();
|
|
436
|
+
attachUtils
|
|
437
|
+
.deleteAttachment(ID, context)
|
|
438
|
+
.then(() => {
|
|
439
|
+
this.updateSelf();
|
|
440
|
+
// let newAttachments;
|
|
441
|
+
// setAttachments((current) => {
|
|
442
|
+
// newAttachments = current.filter((file) => file.ID !== ID);
|
|
443
|
+
// return newAttachments;
|
|
444
|
+
// });
|
|
445
|
+
// if (callbackFn) {
|
|
446
|
+
// callbackFn(newAttachments);
|
|
447
|
+
// }
|
|
448
|
+
})
|
|
449
|
+
.catch(console.error);
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
removeFile() {
|
|
453
|
+
alert('remove');
|
|
454
|
+
}
|
|
455
|
+
removeNewFile() {
|
|
456
|
+
alert('remove');
|
|
457
|
+
}
|
|
458
|
+
createModal(modalType) {
|
|
459
|
+
switch (modalType) {
|
|
460
|
+
case 'addLocalFile':
|
|
461
|
+
this.ngZone.run(() => {
|
|
462
|
+
this.bShowFileModal$ = true;
|
|
463
|
+
});
|
|
464
|
+
break;
|
|
465
|
+
case 'addLocalLink':
|
|
466
|
+
this.ngZone.run(() => {
|
|
467
|
+
this.bShowLinkModal$ = true;
|
|
468
|
+
});
|
|
469
|
+
break;
|
|
470
|
+
default:
|
|
471
|
+
break;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
createModalButtons() {
|
|
475
|
+
this.arFileMainButtons$.push({ actionID: 'attach', jsAction: 'attachFiles', name: this.pConn$.getLocalizedValue('Attach files', '', '') });
|
|
476
|
+
this.arFileSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: this.pConn$.getLocalizedValue('Cancel', '', '') });
|
|
477
|
+
this.arLinkMainButtons$.push({ actionID: 'attach', jsAction: 'attachLinks', name: this.pConn$.getLocalizedValue('Attach links', '', '') });
|
|
478
|
+
this.arLinkSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: this.pConn$.getLocalizedValue('Cancel', '', '') });
|
|
479
|
+
}
|
|
480
|
+
uploadMyFiles($event) {
|
|
481
|
+
// alert($event.target.files[0]); // outputs the first file
|
|
482
|
+
this.arFiles$ = this.getFiles($event.target.files);
|
|
483
|
+
// convert FileList to an array
|
|
484
|
+
const myFiles = Array.from(this.arFiles$);
|
|
485
|
+
this.arFileList$ = myFiles.map(att => {
|
|
486
|
+
return this.getNewListUtilityItemProps({
|
|
487
|
+
att,
|
|
488
|
+
downloadFile: !att.progress ? () => this.downloadFile(att) : null,
|
|
489
|
+
cancelFile: att.progress ? () => this.cancelFile() : null,
|
|
490
|
+
deleteFile: !att.progress ? () => this.deleteFile(att) : null,
|
|
491
|
+
removeFile: att.error ? () => this.removeNewFile() : null
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
getFiles(arFiles) {
|
|
496
|
+
return this.setNewFiles(arFiles);
|
|
497
|
+
}
|
|
498
|
+
setNewFiles(arFiles) {
|
|
499
|
+
let index = 0;
|
|
500
|
+
for (const file of arFiles) {
|
|
501
|
+
if (!this.validateMaxSize(file, 5)) {
|
|
502
|
+
file.error = true;
|
|
503
|
+
file.meta = 'File is too big. Max allowed size is 5MB.';
|
|
504
|
+
}
|
|
505
|
+
file.mimeType = file.type;
|
|
506
|
+
file.icon = this.utils.getIconFromFileType(file.type);
|
|
507
|
+
file.ID = `${new Date().getTime()}I${index}`;
|
|
508
|
+
index++;
|
|
509
|
+
}
|
|
510
|
+
return arFiles;
|
|
511
|
+
}
|
|
512
|
+
validateMaxSize(fileObj, maxSizeInMB) {
|
|
513
|
+
const fileSize = (fileObj.size / 1048576).toFixed(2);
|
|
514
|
+
return fileSize < maxSizeInMB;
|
|
515
|
+
}
|
|
516
|
+
onFileActionButtonClick(event) {
|
|
517
|
+
// modal buttons
|
|
518
|
+
switch (event.action) {
|
|
519
|
+
case 'cancel':
|
|
520
|
+
this.bShowFileModal$ = false;
|
|
521
|
+
this.clearOutFiles();
|
|
522
|
+
break;
|
|
523
|
+
case 'attachFiles':
|
|
524
|
+
this.bShowFileModal$ = false;
|
|
525
|
+
this.onAttachFiles(this.arFiles$);
|
|
526
|
+
this.clearOutFiles();
|
|
527
|
+
break;
|
|
528
|
+
default:
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
onLinkActionButtonClick(event) {
|
|
533
|
+
// modal buttons
|
|
534
|
+
switch (event.action) {
|
|
535
|
+
case 'cancel':
|
|
536
|
+
this.bShowLinkModal$ = false;
|
|
537
|
+
this.clearOutLinks();
|
|
538
|
+
break;
|
|
539
|
+
case 'attachLinks':
|
|
540
|
+
this.bShowLinkModal$ = false;
|
|
541
|
+
this.onAttachLinks(this.arLinks$);
|
|
542
|
+
this.clearOutLinks();
|
|
543
|
+
break;
|
|
544
|
+
default:
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
clearOutFiles() {
|
|
549
|
+
this.arFileList$ = [];
|
|
550
|
+
this.arFiles$ = [];
|
|
551
|
+
}
|
|
552
|
+
clearOutLinks() {
|
|
553
|
+
this.arLinksList$ = [];
|
|
554
|
+
this.arLinks$ = [];
|
|
555
|
+
this.link_title$ = '';
|
|
556
|
+
this.link_url$ = '';
|
|
557
|
+
}
|
|
558
|
+
addALink() { }
|
|
559
|
+
_fieldOnChangeLink(event) {
|
|
560
|
+
this.link_title$ = event.target.value;
|
|
561
|
+
}
|
|
562
|
+
_fieldOnChangeURL(event) {
|
|
563
|
+
this.link_url$ = event.target.value;
|
|
564
|
+
}
|
|
565
|
+
updateSelf() {
|
|
566
|
+
const caseID = this.getCaseID();
|
|
567
|
+
if (caseID) {
|
|
568
|
+
this.lu_bLoading$ = true;
|
|
569
|
+
this.fetchCaseAttachments(caseID).then(resp => {
|
|
570
|
+
this.handleAttachmentsResponse(resp);
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
getCaseID() {
|
|
575
|
+
// @ts-ignore - second parameter pageReference for getValue method should be optional
|
|
576
|
+
return this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID) || '';
|
|
577
|
+
}
|
|
578
|
+
fetchCaseAttachments(caseID) {
|
|
579
|
+
const attachmentUtils = PCore.getAttachmentUtils();
|
|
580
|
+
return attachmentUtils.getCaseAttachments(caseID, this.pConn$.getContextName());
|
|
581
|
+
}
|
|
582
|
+
handleAttachmentsResponse(resp) {
|
|
583
|
+
this.arFullListAttachments = this.addAttachments(resp);
|
|
584
|
+
this.lu_count$ = this.arFullListAttachments.length;
|
|
585
|
+
this.lu_arActions$ = this.addAttachmentsActions;
|
|
586
|
+
this.lu_arItems$ = this.getUtilityItems(this.arFullListAttachments.slice(0, 3));
|
|
587
|
+
this.va_arItems$ = this.getUtilityItems(this.arFullListAttachments);
|
|
588
|
+
}
|
|
589
|
+
getUtilityItems(attachments) {
|
|
590
|
+
return attachments.map(this.mapAttachmentToUtilityItem.bind(this));
|
|
591
|
+
}
|
|
592
|
+
mapAttachmentToUtilityItem(att) {
|
|
593
|
+
return this.getListUtilityItemProps({
|
|
594
|
+
att,
|
|
595
|
+
downloadFile: this.getDownloadFunction(att),
|
|
596
|
+
cancelFile: this.getCancelFunction(att),
|
|
597
|
+
deleteFile: this.getDeleteFunction(att),
|
|
598
|
+
removeFile: this.getRemoveFunction(att)
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
getDownloadFunction(att) {
|
|
602
|
+
return !att.progress ? () => this.downloadFile(att) : null;
|
|
603
|
+
}
|
|
604
|
+
getCancelFunction(att) {
|
|
605
|
+
return att.progress ? () => this.cancelFile() : null;
|
|
606
|
+
}
|
|
607
|
+
getDeleteFunction(att) {
|
|
608
|
+
return !att.progress ? () => this.deleteFile(att) : null;
|
|
609
|
+
}
|
|
610
|
+
getRemoveFunction(att) {
|
|
611
|
+
return att.error ? () => this.removeFile() : null;
|
|
612
|
+
}
|
|
613
|
+
caseHasChanged() {
|
|
614
|
+
// @ts-ignore - second parameter pageReference for getValue method should be optional
|
|
615
|
+
const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
|
|
616
|
+
if (this.currentCaseID !== caseID) {
|
|
617
|
+
this.currentCaseID = caseID;
|
|
618
|
+
return true;
|
|
619
|
+
}
|
|
620
|
+
return false;
|
|
621
|
+
}
|
|
622
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileUtilityComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
623
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FileUtilityComponent, isStandalone: true, selector: "app-file-utility", inputs: { pConn$: "pConn$" }, ngImport: i0, template: "<div>\n <component-mapper\n name=\"ListUtility\"\n [props]=\"{\n name$: lu_name$,\n icon$: lu_icon$,\n bLoading$: lu_bLoading$,\n count$: lu_count$,\n arActions$: lu_arActions$,\n arItems$: lu_arItems$,\n onViewAll$: lu_onViewAllFunction,\n menuIconOverrideAction$: removeFileFromList$\n }\"\n ></component-mapper>\n</div>\n\n<div *ngIf=\"bShowFileModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h3>{{ pConn$.getLocalizedValue('Add local files', '', '') }}</h3>\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-file-selector\">\n <input hidden type=\"file\" multiple #uploader (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" (click)=\"uploader.click()\">{{ pConn$.getLocalizedValue('Upload file(s)', '', '') }}</button>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arFileList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFileMainButtons$, arSecondaryButtons$: arFileSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onFileActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowLinkModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-link-top\">\n <h3>{{ pConn$.getLocalizedValue('Add local link', '', '') }}</h3>\n <div class=\"psdk-modal-link-entry\">\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-links-row\">\n <div class=\"psdk-links-two-column\">\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>Link title</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeLink($event)\" [value]=\"link_title$\" />\n </mat-form-field>\n </div>\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>URL</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeURL($event)\" [value]=\"link_url$\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"psdk-modal-link-add\">\n <button mat-raised-button color=\"primary\" (click)=\"_addLink()\">{{ pConn$.getLocalizedValue('Add Link', '', '') }}</button>\n </div>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arLinksList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeLinksFromList$ }\"\n ></component-mapper>\n </div>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arLinkMainButtons$, arSecondaryButtons$: arLinkSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onLinkActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowViewAllModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <div class=\"psdk-view-all-header\">\n <div>\n <h3>{{ pConn$.getLocalizedValue('Attachments', '', '') }}</h3>\n </div>\n <div>\n <button mat-icon-button (click)=\"_closeViewAll()\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ closeSvgIcon$ }}\" />\n </button>\n </div>\n </div>\n <div class=\"psdk-view-all-body\">\n <component-mapper name=\"SummaryList\" [props]=\"{ arItems$: va_arItems$, menuIconOverrideAction$: removeLinksFromList$ }\"></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:#64646466;position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top,.psdk-modal-link-top{display:table;margin:auto;min-width:650px;background-color:#fff;border:1px solid black;border-radius:10px;padding:20px;box-shadow:0 0 10px 3px #777}.psdk-modal-file-selector{border:1px dashed #262626;width:100%;padding:.3rem;text-align:center}.psdk-modal-link-entry{display:flex;flex-direction:row}.psdk-modal-link-data{flex-grow:3;margin:0 .3rem}.psdk-modal-link-add{flex-grow:1}.psdk-full-width{width:100%}.psdk-modal-body{max-height:500px;overflow-y:auto;overflow-x:hidden;width:100%}.psdk-view-all-header{display:flex;justify-content:space-between}.psdk-view-all-close-icon{width:1.5rem}.psdk-view-all-body{max-height:500px;overflow-y:auto;overflow-x:hidden}.psdk-links-two-column{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;width:100%}.psdk-modal-links-row{display:flex;flex-direction:row;justify-content:space-between}.psdk-links-add-link{padding:15px}ul{columns:2;-webkit-columns:2;-moz-columns:2}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatButtonModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i4.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 i4.MatIconButton; }), selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatFormFieldModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i5.MatFormField; }), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatLabel; }), selector: "mat-label" }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatInputModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatInput; }), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i0.forwardRef(function () { return ComponentMapperComponent; }), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
|
|
624
|
+
}
|
|
625
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileUtilityComponent, decorators: [{
|
|
626
|
+
type: Component,
|
|
627
|
+
args: [{ selector: 'app-file-utility', standalone: true, imports: [CommonModule, MatButtonModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)], template: "<div>\n <component-mapper\n name=\"ListUtility\"\n [props]=\"{\n name$: lu_name$,\n icon$: lu_icon$,\n bLoading$: lu_bLoading$,\n count$: lu_count$,\n arActions$: lu_arActions$,\n arItems$: lu_arItems$,\n onViewAll$: lu_onViewAllFunction,\n menuIconOverrideAction$: removeFileFromList$\n }\"\n ></component-mapper>\n</div>\n\n<div *ngIf=\"bShowFileModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h3>{{ pConn$.getLocalizedValue('Add local files', '', '') }}</h3>\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-file-selector\">\n <input hidden type=\"file\" multiple #uploader (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" (click)=\"uploader.click()\">{{ pConn$.getLocalizedValue('Upload file(s)', '', '') }}</button>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arFileList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFileMainButtons$, arSecondaryButtons$: arFileSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onFileActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowLinkModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-link-top\">\n <h3>{{ pConn$.getLocalizedValue('Add local link', '', '') }}</h3>\n <div class=\"psdk-modal-link-entry\">\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-links-row\">\n <div class=\"psdk-links-two-column\">\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>Link title</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeLink($event)\" [value]=\"link_title$\" />\n </mat-form-field>\n </div>\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>URL</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeURL($event)\" [value]=\"link_url$\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"psdk-modal-link-add\">\n <button mat-raised-button color=\"primary\" (click)=\"_addLink()\">{{ pConn$.getLocalizedValue('Add Link', '', '') }}</button>\n </div>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arLinksList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeLinksFromList$ }\"\n ></component-mapper>\n </div>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arLinkMainButtons$, arSecondaryButtons$: arLinkSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onLinkActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowViewAllModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <div class=\"psdk-view-all-header\">\n <div>\n <h3>{{ pConn$.getLocalizedValue('Attachments', '', '') }}</h3>\n </div>\n <div>\n <button mat-icon-button (click)=\"_closeViewAll()\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ closeSvgIcon$ }}\" />\n </button>\n </div>\n </div>\n <div class=\"psdk-view-all-body\">\n <component-mapper name=\"SummaryList\" [props]=\"{ arItems$: va_arItems$, menuIconOverrideAction$: removeLinksFromList$ }\"></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:#64646466;position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top,.psdk-modal-link-top{display:table;margin:auto;min-width:650px;background-color:#fff;border:1px solid black;border-radius:10px;padding:20px;box-shadow:0 0 10px 3px #777}.psdk-modal-file-selector{border:1px dashed #262626;width:100%;padding:.3rem;text-align:center}.psdk-modal-link-entry{display:flex;flex-direction:row}.psdk-modal-link-data{flex-grow:3;margin:0 .3rem}.psdk-modal-link-add{flex-grow:1}.psdk-full-width{width:100%}.psdk-modal-body{max-height:500px;overflow-y:auto;overflow-x:hidden;width:100%}.psdk-view-all-header{display:flex;justify-content:space-between}.psdk-view-all-close-icon{width:1.5rem}.psdk-view-all-body{max-height:500px;overflow-y:auto;overflow-x:hidden}.psdk-links-two-column{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;width:100%}.psdk-modal-links-row{display:flex;flex-direction:row;justify-content:space-between}.psdk-links-add-link{padding:15px}ul{columns:2;-webkit-columns:2;-moz-columns:2}\n"] }]
|
|
628
|
+
}], ctorParameters: function () { return [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }]; }, propDecorators: { pConn$: [{
|
|
629
|
+
type: Input
|
|
630
|
+
}] } });
|
|
631
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11dGlsaXR5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy93aWRnZXQvZmlsZS11dGlsaXR5L2ZpbGUtdXRpbGl0eS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2ZpbGUtdXRpbGl0eS9maWxlLXV0aWxpdHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQVUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sUUFBUSxNQUFNLFlBQVksQ0FBQztBQUdsQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQzs7Ozs7Ozs7QUFjeEcsTUFBTSxPQUFPLG9CQUFvQjtJQXlEL0IsWUFDVSxlQUF1QyxFQUN2QyxLQUFZLEVBQ1osTUFBYztRQUZkLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXpEeEIsdUNBQXVDO1FBQ3ZDLHdCQUFtQixHQUF3QixFQUFFLENBQUM7UUFFOUMsMEJBQXFCLEdBQVUsRUFBRSxDQUFDO1FBRWxDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFD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Q3ZELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFHO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0QsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQUc7UUFDbkIsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNwRCxDQUFDO0lBRUQsY0FBYztRQUNaLHFGQUFxRjtRQUNyRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pGLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxNQUFNLEVBQUU7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzsrR0EvdEJVLG9CQUFvQjttR0FBcEIsb0JBQW9CLDBHQ3RCakMsZzFIQW9HQSw2dENEaEZZLFlBQVksZ05BQUUsZUFBZSw2aEJBQUUsa0JBQWtCLCtaQUFFLGNBQWMseWJBQW1CLHdCQUF3Qjs7NEZBRTNHLG9CQUFvQjtrQkFQaEMsU0FBUzsrQkFDRSxrQkFBa0IsY0FHaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7c0pBRy9HLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgTmdab25lLCBmb3J3YXJkUmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCBkb3dubG9hZCBmcm9tICdkb3dubG9hZGpzJztcbmltcG9ydCB7IEFuZ3VsYXJQQ29ubmVjdERhdGEsIEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2FuZ3VsYXItcGNvbm5lY3QnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBDb21wb25lbnRNYXBwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2NvbXBvbmVudC1tYXBwZXIvY29tcG9uZW50LW1hcHBlci5jb21wb25lbnQnO1xuXG5pbnRlcmZhY2UgRmlsZVV0aWxpdHlQcm9wcyB7XG4gIC8vIElmIGFueSwgZW50ZXIgYWRkaXRpb25hbCBwcm9wcyB0aGF0IG9ubHkgZXhpc3Qgb24gdGhpcyBjb21wb25lbnRcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1maWxlLXV0aWxpdHknLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11dGlsaXR5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS11dGlsaXR5LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgZm9yd2FyZFJlZigoKSA9PiBDb21wb25lbnRNYXBwZXJDb21wb25lbnQpXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlVXRpbGl0eUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcENvbm4kOiB0eXBlb2YgUENvbm5lY3Q7XG5cbiAgLy8gRm9yIGludGVyYWN0aW9uIHdpdGggQW5ndWxhclBDb25uZWN0XG4gIGFuZ3VsYXJQQ29ubmVjdERhdGE6IEFuZ3VsYXJQQ29ubmVjdERhdGEgPSB7fTtcblxuICBhckZ1bGxMaXN0QXR0YWNobWVudHM6IGFueVtdID0gW107XG5cbiAgbHVfbmFtZSQgPSAnJztcbiAgbHVfaWNvbiQgPSAnJztcbiAgbHVfYkxvYWRpbmckID0gZmFsc2U7XG4gIGx1X2NvdW50JCA9IDA7XG4gIGx1X2FyQWN0aW9ucyQ6IGFueVtdID0gW107XG4gIGx1X2FySXRlbXMkOiBhbnkgPSBbXTtcblxuICB2YV9hckl0ZW1zJDogYW55W10gPSBbXTtcblxuICBsdV9vblZpZXdBbGxGdW5jdGlvbjogYW55O1xuXG4gIGJTaG93RmlsZU1vZGFsJCA9IGZhbHNlO1xuICBiU2hvd0xpbmtNb2RhbCQgPSBmYWxzZTtcbiAgYlNob3dWaWV3QWxsTW9kYWwkID0gZmFsc2U7XG5cbiAgYXJGaWxlTWFpbkJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBhckZpbGVTZWNvbmRhcnlCdXR0b25zJDogYW55W10gPSBbXTtcblxuICBhckxpbmtNYWluQnV0dG9ucyQ6IGFueVtdID0gW107XG4gIGFyTGlua1NlY29uZGFyeUJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuXG4gIGFyRmlsZXMkOiBhbnlbXSA9IFtdO1xuICBhckZpbGVMaXN0JDogYW55W10gPSBbXTtcbiAgcmVtb3ZlRmlsZUZyb21MaXN0JDogYW55O1xuXG4gIGFyTGlua3MkOiBhbnlbXSA9IFtdO1xuICBhckxpbmtzTGlzdCQ6IGFueVtdID0gW107XG4gIHJlbW92ZUxpbmtzRnJvbUxpc3QkOiBhbnk7XG5cbiAgbGlua190aXRsZSQgPSAnJztcbiAgbGlua191cmwkID0gJyc7XG5cbiAgY2xvc2VTdmdJY29uJCA9ICcnO1xuXG4gIGN1cnJlbnRDYXNlSUQgPSAnJztcblxuICBhZGRBdHRhY2htZW50c0FjdGlvbnM6IGFueVtdID0gW1xuICAgIHtcbiAgICAgIHRleHQ6ICdBZGQgZmlsZXMnLFxuICAgICAgaWQ6ICdhZGROZXdGaWxlcycsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLmNyZWF0ZU1vZGFsKCdhZGRMb2NhbEZpbGUnKVxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogJ0FkZCBsaW5rcycsXG4gICAgICBpZDogJ2FkZE5ld0xpbmtzJyxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuY3JlYXRlTW9kYWwoJ2FkZExvY2FsTGluaycpXG4gICAgfVxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYW5ndWxhclBDb25uZWN0OiBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIC8vIEZpcnN0IHRoaW5nIGluIGluaXRpYWxpemF0aW9uIGlzIHJlZ2lzdGVyaW5nIGFuZCBzdWJzY3JpYmluZyB0byB0aGUgQW5ndWxhclBDb25uZWN0IHNlcnZpY2VcbiAgICB0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEgPSB0aGlzLmFuZ3VsYXJQQ29ubmVjdC5yZWdpc3RlckFuZFN1YnNjcmliZUNvbXBvbmVudCh0aGlzLCB0aGlzLm9uU3RhdGVDaGFuZ2UpO1xuXG4gICAgY29uc3QgY29uZmlnUHJvcHM6IEZpbGVVdGlsaXR5UHJvcHMgPSB0aGlzLnBDb25uJC5yZXNvbHZlQ29uZmlnUHJvcHModGhpcy5wQ29ubiQuZ2V0Q29uZmlnUHJvcHMoKSk7XG5cbiAgICB0aGlzLmx1X25hbWUkID0gY29uZmlnUHJvcHMubGFiZWwgPz8gJyc7XG4gICAgdGhpcy5sdV9pY29uJCA9ICdwYXBlci1jbGlwJztcblxuICAgIHRoaXMuY2xvc2VTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ3RpbWVzJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgLy8gY29uc3Qgb25WaWV3QWxsQ2FsbGJhY2sgPSAoKSA9PiB0aGlzLm9uVmlld0FsbCh0aGlzLmFyRnVsbExpc3RBdHRhY2htZW50cyk7XG5cbiAgICB0aGlzLmx1X29uVmlld0FsbEZ1bmN0aW9uID0geyBvbkNsaWNrOiB0aGlzLm9uVmlld0FsbC5iaW5kKHRoaXMpIH07XG5cbiAgICB0aGlzLnJlbW92ZUZpbGVGcm9tTGlzdCQgPSB7IG9uQ2xpY2s6IHRoaXMucmVtb3ZlRmlsZUZyb21MaXN0LmJpbmQodGhpcykgfTtcbiAgICB0aGlzLnJlbW92ZUxpbmtzRnJvbUxpc3QkID0geyBvbkNsaWNrOiB0aGlzLnJlbW92ZUxpbmtzRnJvbUxpc3QuYmluZCh0aGlzKSB9O1xuXG4gICAgdGhpcy51cGRhdGVTZWxmKCk7XG5cbiAgICB0aGlzLmNyZWF0ZU1vZGFsQnV0dG9ucygpO1xuXG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICAoUENvcmUuZ2V0RXZlbnRzKCkuZ2V0Q2FzZUV2ZW50KCkgYXMgYW55KS5DQVNFX0FUVEFDSE1FTlRTX1VQREFURURfRlJPTV9DQVNFVklFVyxcbiAgICAgIHRoaXMudXBkYXRlU2VsZi5iaW5kKHRoaXMpLFxuICAgICAgJ2Nhc2VBdHRhY2htZW50c1VwZGF0ZUZyb21DYXNldmlldydcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YS51bnN1YnNjcmliZUZuKSB7XG4gICAgICB0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbigpO1xuICAgIH1cblxuICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkudW5zdWJzY3JpYmUoXG4gICAgICAoUENvcmUuZ2V0RXZlbnRzKCkuZ2V0Q2FzZUV2ZW50KCkgYXMgYW55KS5DQVNFX0FUVEFDSE1FTlRTX1VQREFURURfRlJPTV9DQVNFVklFVyxcbiAgICAgICdjYXNlQXR0YWNobWVudHNVcGRhdGVGcm9tQ2FzZXZpZXcnXG4gICAgKTtcbiAgfVxuXG4gIC8vIENhbGxiYWNrIHBhc3NlZCB3aGVuIHN1YnNjcmliaW5nIHRvIHN0b3JlIGNoYW5nZVxuICBvblN0YXRlQ2hhbmdlKCkge1xuICAgIC8vIGFkZGluZyBhIHByb3BlcnR5IHRvIHRyYWNrIGluIGNvbmZpZ1Byb3BzLCB3aGVuIGV2ZXIgdGhlIGF0dGFjaG1lbnQgZmlsZSBjaGFuZ2VzXG4gICAgLy8gbmVlZCB0byB0cmlnZ2VyIGEgcmVkcmF3XG4gICAgdGhpcy5wQ29ubiQucmVnaXN0ZXJBZGRpdGlvbmFsUHJvcHMoe1xuICAgICAgbGFzdFJlZnJlc2hUaW1lOiBgQFAgJHtQQ29yZS5nZXRDb25zdGFudHMoKS5TVU1NQVJZX09GX0FUVEFDSE1FTlRTX0xBU1RfUkVGUkVTSF9USU1FfWBcbiAgICB9KTtcblxuICAgIC8vIFNob3VsZCBhbHdheXMgY2hlY2sgdGhlIGJyaWRnZSB0byBzZWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAgIGNvbnN0IGJVcGRhdGVTZWxmID0gdGhpcy5hbmd1bGFyUENvbm5lY3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKHRoaXMpO1xuXG4gICAgLy8gT05MWSBjYWxsIHVwZGF0ZVNlbGYgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGVcbiAgICBpZiAoYlVwZGF0ZVNlbGYgfHwgdGhpcy5jYXNlSGFzQ2hhbmdlZCgpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlbGYoKTtcbiAgICB9XG4gIH1cblxuICBvbkF0dGFjaEZpbGVzKGZpbGVzKSB7XG4gICAgY29uc3QgYXR0YWNobWVudFV0aWxzID0gUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCk7XG4gICAgLy8gQHRzLWlnbm9yZSAtIHNlY29uZCBwYXJhbWV0ZXIgcGFnZVJlZmVyZW5jZSBmb3IgZ2V0VmFsdWUgbWV0aG9kIHNob3VsZCBiZSBvcHRpb25hbFxuICAgIGNvbnN0IGNhc2VJRCA9IHRoaXMucENvbm4kLmdldFZhbHVlKFBDb3JlLmdldENvbnN0YW50cygpLkNBU0VfSU5GTy5DQVNFX0lORk9fSUQpO1xuXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubHVfYkxvYWRpbmckID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBjb25zdCB1cGxvYWRlZEZpbGVzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGF0dGFjaG1lbnRVdGlsc1xuICAgICAgICAudXBsb2FkQXR0YWNobWVudChmaWxlLCB0aGlzLm9uVXBsb2FkUHJvZ3Jlc3MsIHRoaXMuZXJyb3JIYW5kbGVyLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKVxuICAgICAgICAudGhlbigoZmlsZVJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZmlsZVJlc3BvbnNlLnR5cGUgPT09ICdGaWxlJykge1xuICAgICAgICAgICAgKGF0dGFjaG1lbnRVdGlscy5saW5rQXR0YWNobWVudHNUb0Nhc2UoY2FzZUlELCBbZmlsZVJlc3BvbnNlXSwgJ0ZpbGUnLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKSBhcyBQcm9taXNlPGFueT4pXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hBdHRhY2htZW50cygpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5hckZpbGVMaXN0JCA9IFtdO1xuICB9XG5cbiAgcmVmcmVzaEF0dGFjaG1lbnRzKCkge1xuICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICB9XG5cbiAgb25VcGxvYWRQcm9ncmVzcygpIHt9XG5cbiAgZXJyb3JIYW5kbGVyKCkge31cblxuICBvbkF0dGFjaExpbmtzKGxpbmtzKSB7XG4gICAgY29uc3QgYXR0YWNobWVudFV0aWxzID0gUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCk7XG4gICAgLy8gQHRzLWlnbm9yZSAtIHNlY29uZCBwYXJhbWV0ZXIgcGFnZVJlZmVyZW5jZSBmb3IgZ2V0VmFsdWUgbWV0aG9kIHNob3VsZCBiZSBvcHRpb25hbFxuICAgIGNvbnN0IGNhc2VJRCA9IHRoaXMucENvbm4kLmdldFZhbHVlKFBDb3JlLmdldENvbnN0YW50cygpLkNBU0VfSU5GTy5DQVNFX0lORk9fSUQpO1xuXG4gICAgaWYgKGxpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubHVfYkxvYWRpbmckID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5rc1RvQXR0YWNoID0gbGlua3MubWFwKGxpbmsgPT4gKHtcbiAgICAgIHR5cGU6ICdVUkwnLFxuICAgICAgY2F0ZWdvcnk6ICdVUkwnLFxuICAgICAgdXJsOiBsaW5rLnVybCxcbiAgICAgIG5hbWU6IGxpbmsubGlua1RpdGxlXG4gICAgfSkpO1xuXG4gICAgKGF0dGFjaG1lbnRVdGlscy5saW5rQXR0YWNobWVudHNUb0Nhc2UoY2FzZUlELCBsaW5rc1RvQXR0YWNoLCAnVVJMJywgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSkgYXMgUHJvbWlzZTxhbnk+KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2hBdHRhY2htZW50cygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChjb25zb2xlLmxvZyk7XG4gIH1cblxuICBhZGRBdHRhY2htZW50cyhhdHRzRnJvbVJlc3A6IGFueVtdID0gW10pIHtcbiAgICB0aGlzLmx1X2JMb2FkaW5nJCA9IGZhbHNlO1xuXG4gICAgYXR0c0Zyb21SZXNwID0gYXR0c0Zyb21SZXNwLm1hcChyZXNwQXR0ID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRBdHQgPSB7XG4gICAgICAgIC4uLnJlc3BBdHQsXG4gICAgICAgIG1ldGE6IGAke3Jlc3BBdHQuY2F0ZWdvcnl9IC4gJHt0aGlzLnV0aWxzLmdlbmVyYXRlRGF0ZVRpbWUocmVzcEF0dC5jcmVhdGVUaW1lLCAnRGF0ZVRpbWUtU2luY2UnKX0sICR7cmVzcEF0dC5jcmVhdGVkQnl9YFxuICAgICAgfTtcbiAgICAgIGlmICh1cGRhdGVkQXR0LnR5cGUgPT09ICdGSUxFJykge1xuICAgICAgICB1cGRhdGVkQXR0Lm5hbWVXaXRoRXh0ID0gdXBkYXRlZEF0dC5maWxlTmFtZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVkQXR0O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF0dHNGcm9tUmVzcDtcbiAgfVxuXG4gIG9uVmlld0FsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmJTaG93Vmlld0FsbE1vZGFsJCA9IHRydWU7XG5cbiAgICAvLyBhZGQgY2xpY2tBd2F5IGxpc3RlbmVyXG4gICAgLy8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvLyBCZWxvdyBtZXRob2QgaXMgbm90IG5lZWRlZCwgc3RpbGwgaGF2aW5nIGl0IGNvbW1lbnRlZCBpbiBjYXNlIHdlIHdhbnQgaW4gZnV0dXJlXG4gIC8vIF9jbGlja0F3YXkoZXZlbnQ6IGFueSkge1xuICAvLyAgIGxldCBiSW5Qb3BVcCA9IGZhbHNlO1xuXG4gIC8vICAgLy8gcnVuIHRocm91Z2ggbGlzdCBvZiBlbGVtZW50cyBpbiBwYXRoLCBpZiBtZW51IG5vdCBpbiB0aCBwYXRoLCB0aGVuIHdhbnQgdG9cbiAgLy8gICAvLyBoaWRlICh0b2dnbGUpIHRoZSBtZW51XG4gIC8vICAgZm9yIChjb25zdCBpIGluIGV2ZW50LnBhdGgpIHtcbiAgLy8gICAgIGlmIChldmVudC5wYXRoW2ldLmNsYXNzTmFtZSA9PSAncHNkay1tb2RhbC1maWxlLXRvcCcgfHwgZXZlbnQucGF0aFtpXS50YWdOYW1lID09ICdCVVRUT04nKSB7XG4gIC8vICAgICAgIGJJblBvcFVwID0gdHJ1ZTtcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyAgIGlmICghYkluUG9wVXApIHtcbiAgLy8gICAgIHRoaXMuYlNob3dWaWV3QWxsTW9kYWwkID0gZmFsc2U7XG5cbiAgLy8gICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIF9jbG9zZVZpZXdBbGwoKSB7XG4gICAgdGhpcy5iU2hvd1ZpZXdBbGxNb2RhbCQgPSBmYWxzZTtcblxuICAgIC8vIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICB9XG5cbiAgcmVtb3ZlRmlsZUZyb21MaXN0KGl0ZW06IGFueSkge1xuICAgIGlmIChpdGVtICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGFyRmlsZUxpc3QgPSB0aGlzLmFyRmlsZUxpc3QkO1xuICAgICAgY29uc3QgaXRlbUlkID0gaXRlbS5pZDtcblxuICAgICAgZm9yIChsZXQgZmlsZUluZGV4ID0gMDsgZmlsZUluZGV4IDwgYXJGaWxlTGlzdC5sZW5ndGg7IGZpbGVJbmRleCsrKSB7XG4gICAgICAgIGlmIChhckZpbGVMaXN0W2ZpbGVJbmRleF0uaWQgPT0gaXRlbUlkKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIGxpc3QgYW5kIHJlZHJhd1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBhckZpbGVMaXN0LnNwbGljZShmaWxlSW5kZXgsIDEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlTGlua3NGcm9tTGlzdChpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBsb2NhbExpbmtzTGlzdCA9IHRoaXMuYXJMaW5rc0xpc3QkLnNsaWNlKCk7XG5cbiAgICBpZiAoaXRlbSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBpdGVtSWQgPSBpdGVtLmlkO1xuXG4gICAgICBmb3IgKGxldCBsaW5rSW5kZXggPSAwOyBsaW5rSW5kZXggPCBsb2NhbExpbmtzTGlzdC5sZW5ndGg7IGxpbmtJbmRleCsrKSB7XG4gICAgICAgIGlmIChsb2NhbExpbmtzTGlzdFtsaW5rSW5kZXhdLmlkID09IGl0ZW1JZCkge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBsaXN0IGFuZCByZWRyYXdcbiAgICAgICAgICBsb2NhbExpbmtzTGlzdC5zcGxpY2UobGlua0luZGV4LCAxKTtcblxuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFyTGlua3NMaXN0JCA9IGxvY2FsTGlua3NMaXN0LnNsaWNlKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzID0gKHsgYXR0LCBjYW5jZWxGaWxlLCBkb3dubG9hZEZpbGUsIGRlbGV0ZUZpbGUsIHJlbW92ZUZpbGUgfSkgPT4ge1xuICAgIGxldCBhY3Rpb25zO1xuICAgIGxldCBpc0Rvd25sb2FkYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKGF0dC5wcm9ncmVzcyAmJiBhdHQucHJvZ3Jlc3MgIT09IDEwMCkge1xuICAgICAgYWN0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBgQ2FuY2VsLSR7YXR0LklEfWAsXG4gICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXG4gICAgICAgICAgaWNvbjogJ3RpbWVzJyxcbiAgICAgICAgICBvbkNsaWNrOiBjYW5jZWxGaWxlXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIGlmIChhdHQubGlua3MpIHtcbiAgICAgIGNvbnN0IGlzRmlsZSA9IGF0dC50eXBlID09PSAnRklMRSc7XG4gICAgICBjb25zdCBJRCA9IGF0dC5JRC5yZXBsYWNlKC9cXHMvZ2ksICcnKTtcbiAgICAgIGNvbnN0IGFjdGlvbnNNYXAgPSBuZXcgTWFwKFtcbiAgICAgICAgW1xuICAgICAgICAgICdkb3dubG9hZCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGBkb3dubG9hZC0ke0lEfWAsXG4gICAgICAgICAgICB0ZXh0OiBpc0ZpbGUgPyAnRG93bmxvYWQnIDogJ09wZW4nLFxuICAgICAgICAgICAgaWNvbjogaXNGaWxlID8gJ2Rvd25sb2FkJyA6ICdvcGVuJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGRvd25sb2FkRmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgRGVsZXRlLSR7SUR9YCxcbiAgICAgICAgICAgIHRleHQ6ICdEZWxldGUnLFxuICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGRlbGV0ZUZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIF0pO1xuICAgICAgYWN0aW9ucyA9IFtdO1xuICAgICAgYWN0aW9uc01hcC5mb3JFYWNoKChhY3Rpb24sIGFjdGlvbktleSkgPT4ge1xuICAgICAgICBpZiAoYXR0LmxpbmtzW2FjdGlvbktleV0pIHtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBpc0Rvd25sb2FkYWJsZSA9IGF0dC5saW5rcy5kb3dubG9hZDtcbiAgICB9IGVsc2UgaWYgKGF0dC5lcnJvcikge1xuICAgICAgYWN0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBgUmVtb3ZlLSR7YXR0LklEfWAsXG4gICAgICAgICAgdGV4dDogJ1JlbW92ZScsXG4gICAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgICBvbkNsaWNrOiByZW1vdmVGaWxlXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBhdHQuSUQsXG4gICAgICB2aXN1YWw6IHtcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRm9yQXR0YWNobWVudChhdHQpLFxuICAgICAgICBwcm9ncmVzczogYXR0LnByb2dyZXNzID09IDEwMCA/IHVuZGVmaW5lZCA6IGF0dC5wcm9ncmVzc1xuICAgICAgfSxcbiAgICAgIHByaW1hcnk6IHtcbiAgICAgICAgdHlwZTogYXR0LnR5cGUsXG4gICAgICAgIG5hbWU6IGF0dC5uYW1lLFxuICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICBjbGljazogcmVtb3ZlRmlsZVxuICAgICAgfSxcbiAgICAgIHNlY29uZGFyeToge1xuICAgICAgICB0ZXh0OiBhdHQubWV0YVxuICAgICAgfSxcbiAgICAgIGFjdGlvbnNcbiAgICB9O1xuICB9O1xuXG4gIGdldExpc3RVdGlsaXR5SXRlbVByb3BzID0gKHsgYXR0LCBjYW5jZWxGaWxlLCBkb3dubG9hZEZpbGUsIGRlbGV0ZUZpbGUsIHJlbW92ZUZpbGUgfSkgPT4ge1xuICAgIGxldCBhY3Rpb25zO1xuICAgIGxldCBpc0Rvd25sb2FkYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKGF0dC5wcm9ncmVzcyAmJiBhdHQucHJvZ3Jlc3MgIT09IDEwMCkge1xuICAgICAgYWN0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBgQ2FuY2VsLSR7YXR0LklEfWAsXG4gICAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0NhbmNlbCcsICcnLCAnJyksXG4gICAgICAgICAgaWNvbjogJ3RpbWVzJyxcbiAgICAgICAgICBvbkNsaWNrOiBjYW5jZWxGaWxlXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIGlmIChhdHQubGlua3MpIHtcbiAgICAgIGNvbnN0IGlzRmlsZSA9IGF0dC50eXBlID09PSAnRklMRSc7XG4gICAgICBjb25zdCBJRCA9IGF0dC5JRC5yZXBsYWNlKC9cXHMvZ2ksICcnKTtcbiAgICAgIGNvbnN0IGFjdGlvbnNNYXAgPSBuZXcgTWFwKFtcbiAgICAgICAgW1xuICAgICAgICAgICdkb3dubG9hZCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGBkb3dubG9hZC0ke0lEfWAsXG4gICAgICAgICAgICB0ZXh0OiBpc0ZpbGUgPyB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRG93bmxvYWQnLCAnJywgJycpIDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ09wZW4nLCAnJywgJycpLFxuICAgICAgICAgICAgaWNvbjogaXNGaWxlID8gJ2Rvd25sb2FkJyA6ICdvcGVuJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGRvd25sb2FkRmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgRGVsZXRlLSR7SUR9YCxcbiAgICAgICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdEZWxldGUnLCAnJywgJycpLFxuICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGRlbGV0ZUZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIF0pO1xuICAgICAgYWN0aW9ucyA9IFtdO1xuICAgICAgYWN0aW9uc01hcC5mb3JFYWNoKChhY3Rpb24sIGFjdGlvbktleSkgPT4ge1xuICAgICAgICBpZiAoYXR0LmxpbmtzW2FjdGlvbktleV0pIHtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBpc0Rvd25sb2FkYWJsZSA9IGF0dC5saW5rcy5kb3dubG9hZDtcbiAgICB9IGVsc2UgaWYgKGF0dC5lcnJvcikge1xuICAgICAgYWN0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBgUmVtb3ZlLSR7YXR0LklEfWAsXG4gICAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ1JlbW92ZScsICcnLCAnJyksXG4gICAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgICBvbkNsaWNrOiByZW1vdmVGaWxlXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBhdHQuSUQsXG4gICAgICB2aXN1YWw6IHtcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRm9yQXR0YWNobWVudChhdHQpLFxuICAgICAgICBwcm9ncmVzczogYXR0LnByb2dyZXNzID09IDEwMCA/IHVuZGVmaW5lZCA6IGF0dC5wcm9ncmVzc1xuICAgICAgfSxcbiAgICAgIHByaW1hcnk6IHtcbiAgICAgICAgdHlwZTogYXR0LnR5cGUsXG4gICAgICAgIG5hbWU6IGF0dC5uYW1lLFxuICAgICAgICBpY29uOiAnb3BlbicsXG4gICAgICAgIGNsaWNrOiBkb3dubG9hZEZpbGVcbiAgICAgIH0sXG4gICAgICBzZWNvbmRhcnk6IHtcbiAgICAgICAgdGV4dDogYXR0Lm1ldGFcbiAgICAgIH0sXG4gICAgICBhY3Rpb25zXG4gICAgfTtcbiAgfTtcblxuICBfYWRkTGluaygpIHtcbiAgICAvLyBjb3B5IGxpc3QgbG9jYWxseVxuICAgIGNvbnN0IGxvY2FsTGlzdCA9IHRoaXMuYXJMaW5rc0xpc3QkLnNsaWNlKCk7XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLmxpbmtfdXJsJDtcblxuICAgIGlmICghL14oaHR0cHxodHRwcyk6XFwvXFwvLy50ZXN0KHRoaXMubGlua191cmwkKSkge1xuICAgICAgdGhpcy5saW5rX3VybCQgPSBgaHR0cDovLyR7dGhpcy5saW5rX3VybCR9YDtcbiAgICB9XG5cbiAgICAvLyBsaXN0IGZvciBkaXNwbGF5XG4gICAgbGV0IG9MaW5rOiBhbnkgPSB7fTtcbiAgICBvTGluay5pY29uID0gJ2NoYWluJztcblxuICAgIG9MaW5rLklEID0gYCR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YDtcblxuICAgIG9MaW5rID0gdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICBhdHQ6IG9MaW5rLFxuICAgICAgZG93bmxvYWRGaWxlOiBudWxsLFxuICAgICAgY2FuY2VsRmlsZTogbnVsbCxcbiAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICByZW1vdmVGaWxlOiBudWxsXG4gICAgfSk7XG5cbiAgICBvTGluay50eXBlID0gJ1VSTCc7XG4gICAgb0xpbmsucHJpbWFyeS50eXBlID0gb0xpbmsudHlwZTtcbiAgICBvTGluay52aXN1YWwuaWNvbiA9ICdjaGFpbic7XG4gICAgb0xpbmsucHJpbWFyeS5uYW1lID0gdGhpcy5saW5rX3RpdGxlJDtcbiAgICBvTGluay5wcmltYXJ5Lmljb24gPSAnb3Blbic7XG4gICAgb0xpbmsuc2Vjb25kYXJ5LnRleHQgPSB1cmw7XG5cbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgLy8gbmVlZCB0byBjcmVhdGUgYSBuZXcgYXJyYXkgb3Igc3VtbWFyeSBsaXN0IHdvbid0IGRldGVjdCBjaGFuZ2VzXG4gICAgICB0aGlzLmFyTGlua3NMaXN0JCA9IGxvY2FsTGlzdC5zbGljZSgpO1xuICAgICAgdGhpcy5hckxpbmtzTGlzdCQucHVzaChvTGluayk7XG5cbiAgICAgIC8vIGxpc3QgZm9yIGFjdHVhbGx5IGF0dGFjaG1lbnRzXG4gICAgICBjb25zdCBsaW5rOiBhbnkgPSB7fTtcbiAgICAgIGxpbmsuaWQgPSBvTGluay5pZDtcbiAgICAgIGxpbmsubGlua1RpdGxlID0gdGhpcy5saW5rX3RpdGxlJDtcbiAgICAgIGxpbmsudHlwZSA9IG9MaW5rLnR5cGU7XG4gICAgICBsaW5rLnVybCA9IHVybDtcblxuICAgICAgdGhpcy5hckxpbmtzJC5wdXNoKGxpbmspO1xuXG4gICAgICAvLyBjbGVhciB2YWx1ZXNcbiAgICAgIHRoaXMubGlua190aXRsZSQgPSAnJztcbiAgICAgIHRoaXMubGlua191cmwkID0gJyc7XG4gICAgfSk7XG4gIH1cblxuICBfY2hhbmdlVGl0bGUoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubGlua190aXRsZSQgPSBldmVudC5zcmNFbGVtZW50LnZhbHVlO1xuICB9XG5cbiAgX2NoYW5nZVVybChldmVudDogYW55KSB7XG4gICAgdGhpcy5saW5rX3VybCQgPSBldmVudC5zcmNFbGVtZW50LnZhbHVlO1xuICB9XG5cbiAgZG93bmxvYWRGaWxlKGF0dDogYW55KSB7XG4gICAgY29uc3QgYXR0YWNoVXRpbHMgPSBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKTtcbiAgICBjb25zdCB7IElELCBuYW1lLCBleHRlbnNpb24sIHR5cGUgfSA9IGF0dDtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcblxuICAgIGF0dGFjaFV0aWxzXG4gICAgICAvLyBAdHMtaWdub3JlIC0gM3JkIHBhcmFtZXRlciBcInJlc3BvbnNlRW5jb2RpbmdcIiBpcyBvcHRpb25hbFxuICAgICAgLmRvd25sb2FkQXR0YWNobWVudChJRCwgY29udGV4dClcbiAgICAgIC50aGVuKChjb250ZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdGSUxFJykge1xuICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkKGNvbnRlbnQuZGF0YSwgbmFtZSwgZXh0ZW5zaW9uKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnVVJMJykge1xuICAgICAgICAgIGxldCB7IGRhdGEgfSA9IGNvbnRlbnQ7XG4gICAgICAgICAgaWYgKCEvXihodHRwfGh0dHBzKTpcXC9cXC8vLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICAgIGRhdGEgPSBgLy8ke2RhdGF9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2luZG93Lm9wZW4oY29udGVudC5kYXRhLCAnX2JsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gIH1cblxuICBmaWxlRG93bmxvYWQgPSAoZGF0YSwgZmlsZU5hbWUsIGV4dCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBleHQgPyBgJHtmaWxlTmFtZX0uJHtleHR9YCA6IGZpbGVOYW1lO1xuICAgIGRvd25sb2FkKGF0b2IoZGF0YSksIGZpbGUpO1xuICB9O1xuXG4gIGNhbmNlbEZpbGUoKSB7XG4gICAgYWxlcnQoJ2NhbmNlbCcpO1xuICB9XG5cbiAgZGVsZXRlRmlsZShhdHQ6IGFueSkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgYXR0YWNoVXRpbHMgPSBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKTtcbiAgICAgIGNvbnN0IHsgSUQgfSA9IGF0dDtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuXG4gICAgICBhdHRhY2hVdGlsc1xuICAgICAgICAuZGVsZXRlQXR0YWNobWVudChJRCwgY29udGV4dClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICAgICAgICAgIC8vIGxldCBuZXdBdHRhY2htZW50cztcbiAgICAgICAgICAvLyBzZXRBdHRhY2htZW50cygoY3VycmVudCkgPT4ge1xuICAgICAgICAgIC8vICAgbmV3QXR0YWNobWVudHMgPSBjdXJyZW50LmZpbHRlcigoZmlsZSkgPT4gZmlsZS5JRCAhPT0gSUQpO1xuICAgICAgICAgIC8vICAgcmV0dXJuIG5ld0F0dGFjaG1lbnRzO1xuICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgIC8vIGlmIChjYWxsYmFja0ZuKSB7XG4gICAgICAgICAgLy8gICBjYWxsYmFja0ZuKG5ld0F0dGFjaG1lbnRzKTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChjb25zb2xlLmVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUZpbGUoKSB7XG4gICAgYWxlcnQoJ3JlbW92ZScpO1xuICB9XG5cbiAgcmVtb3ZlTmV3RmlsZSgpIHtcbiAgICBhbGVydCgncmVtb3ZlJyk7XG4gIH1cblxuICBjcmVhdGVNb2RhbChtb2RhbFR5cGU6IHN0cmluZykge1xuICAgIHN3aXRjaCAobW9kYWxUeXBlKSB7XG4gICAgICBjYXNlICdhZGRMb2NhbEZpbGUnOlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYlNob3dGaWxlTW9kYWwkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhZGRMb2NhbExpbmsnOlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYlNob3dMaW5rTW9kYWwkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlTW9kYWxCdXR0b25zKCkge1xuICAgIHRoaXMuYXJGaWxlTWFpbkJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ2F0dGFjaCcsIGpzQWN0aW9uOiAnYXR0YWNoRmlsZXMnLCBuYW1lOiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQXR0YWNoIGZpbGVzJywgJycsICcnKSB9KTtcbiAgICB0aGlzLmFyRmlsZVNlY29uZGFyeUJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ2NhbmNlbCcsIGpzQWN0aW9uOiAnY2FuY2VsJywgbmFtZTogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0NhbmNlbCcsICcnLCAnJykgfSk7XG5cbiAgICB0aGlzLmFyTGlua01haW5CdXR0b25zJC5wdXNoKHsgYWN0aW9uSUQ6ICdhdHRhY2gnLCBqc0FjdGlvbjogJ2F0dGFjaExpbmtzJywgbmFtZTogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0F0dGFjaCBsaW5rcycsICcnLCAnJykgfSk7XG4gICAgdGhpcy5hckxpbmtTZWNvbmRhcnlCdXR0b25zJC5wdXNoKHsgYWN0aW9uSUQ6ICdjYW5jZWwnLCBqc0FjdGlvbjogJ2NhbmNlbCcsIG5hbWU6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdDYW5jZWwnLCAnJywgJycpIH0pO1xuICB9XG5cbiAgdXBsb2FkTXlGaWxlcygkZXZlbnQpIHtcbiAgICAvLyBhbGVydCgkZXZlbnQudGFyZ2V0LmZpbGVzWzBdKTsgLy8gb3V0cHV0cyB0aGUgZmlyc3QgZmlsZVxuICAgIHRoaXMuYXJGaWxlcyQgPSB0aGlzLmdldEZpbGVzKCRldmVudC50YXJnZXQuZmlsZXMpO1xuXG4gICAgLy8gY29udmVydCBGaWxlTGlzdCB0byBhbiBhcnJheVxuICAgIGNvbnN0IG15RmlsZXMgPSBBcnJheS5mcm9tKHRoaXMuYXJGaWxlcyQpO1xuXG4gICAgdGhpcy5hckZpbGVMaXN0JCA9IG15RmlsZXMubWFwKGF0dCA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgIGF0dCxcbiAgICAgICAgZG93bmxvYWRGaWxlOiAhYXR0LnByb2dyZXNzID8gKCkgPT4gdGhpcy5kb3dubG9hZEZpbGUoYXR0KSA6IG51bGwsXG4gICAgICAgIGNhbmNlbEZpbGU6IGF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuY2FuY2VsRmlsZSgpIDogbnVsbCxcbiAgICAgICAgZGVsZXRlRmlsZTogIWF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuZGVsZXRlRmlsZShhdHQpIDogbnVsbCxcbiAgICAgICAgcmVtb3ZlRmlsZTogYXR0LmVycm9yID8gKCkgPT4gdGhpcy5yZW1vdmVOZXdGaWxlKCkgOiBudWxsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZpbGVzKGFyRmlsZXM6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnNldE5ld0ZpbGVzKGFyRmlsZXMpO1xuICB9XG5cbiAgc2V0TmV3RmlsZXMoYXJGaWxlcykge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGFyRmlsZXMpIHtcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZU1heFNpemUoZmlsZSwgNSkpIHtcbiAgICAgICAgZmlsZS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZpbGUubWV0YSA9ICdGaWxlIGlzIHRvbyBiaWcuIE1heCBhbGxvd2VkIHNpemUgaXMgNU1CLic7XG4gICAgICB9XG4gICAgICBmaWxlLm1pbWVUeXBlID0gZmlsZS50eXBlO1xuICAgICAgZmlsZS5pY29uID0gdGhpcy51dGlscy5nZXRJY29uRnJvbUZpbGVUeXBlKGZpbGUudHlwZSk7XG4gICAgICBmaWxlLklEID0gYCR7bmV3IERhdGUoKS5nZXRUaW1lKCl9SSR7aW5kZXh9YDtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyRmlsZXM7XG4gIH1cblxuICB2YWxpZGF0ZU1heFNpemUoZmlsZU9iaiwgbWF4U2l6ZUluTUIpOiBib29sZWFuIHtcbiAgICBjb25zdCBmaWxlU2l6ZSA9IChmaWxlT2JqLnNpemUgLyAxMDQ4NTc2KS50b0ZpeGVkKDIpO1xuICAgIHJldHVybiBmaWxlU2l6ZSA8IG1heFNpemVJbk1CO1xuICB9XG5cbiAgb25GaWxlQWN0aW9uQnV0dG9uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIC8vIG1vZGFsIGJ1dHRvbnNcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgICAgdGhpcy5iU2hvd0ZpbGVNb2RhbCQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNsZWFyT3V0RmlsZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhdHRhY2hGaWxlcyc6XG4gICAgICAgIHRoaXMuYlNob3dGaWxlTW9kYWwkID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25BdHRhY2hGaWxlcyh0aGlzLmFyRmlsZXMkKTtcblxuICAgICAgICB0aGlzLmNsZWFyT3V0RmlsZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvbkxpbmtBY3Rpb25CdXR0b25DbGljayhldmVudDogYW55KSB7XG4gICAgLy8gbW9kYWwgYnV0dG9uc1xuICAgIHN3aXRjaCAoZXZlbnQuYWN0aW9uKSB7XG4gICAgICBjYXNlICdjYW5jZWwnOlxuICAgICAgICB0aGlzLmJTaG93TGlua01vZGFsJCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY2xlYXJPdXRMaW5rcygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2F0dGFjaExpbmtzJzpcbiAgICAgICAgdGhpcy5iU2hvd0xpbmtNb2RhbCQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbkF0dGFjaExpbmtzKHRoaXMuYXJMaW5rcyQpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJPdXRMaW5rcygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyT3V0RmlsZXMoKSB7XG4gICAgdGhpcy5hckZpbGVMaXN0JCA9IFtdO1xuICAgIHRoaXMuYXJGaWxlcyQgPSBbXTtcbiAgfVxuXG4gIGNsZWFyT3V0TGlua3MoKSB7XG4gICAgdGhpcy5hckxpbmtzTGlzdCQgPSBbXTtcbiAgICB0aGlzLmFyTGlua3MkID0gW107XG4gICAgdGhpcy5saW5rX3RpdGxlJCA9ICcnO1xuICAgIHRoaXMubGlua191cmwkID0gJyc7XG4gIH1cblxuICBhZGRBTGluaygpIHt9XG5cbiAgX2ZpZWxkT25DaGFuZ2VMaW5rKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmxpbmtfdGl0bGUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX2ZpZWxkT25DaGFuZ2VVUkwoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubGlua191cmwkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgdXBkYXRlU2VsZigpIHtcbiAgICBjb25zdCBjYXNlSUQgPSB0aGlzLmdldENhc2VJRCgpO1xuXG4gICAgaWYgKGNhc2VJRCkge1xuICAgICAgdGhpcy5sdV9iTG9hZGluZyQgPSB0cnVlO1xuXG4gICAgICB0aGlzLmZldGNoQ2FzZUF0dGFjaG1lbnRzKGNhc2VJRCkudGhlbihyZXNwID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVBdHRhY2htZW50c1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FzZUlEKCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSBzZWNvbmQgcGFyYW1ldGVyIHBhZ2VSZWZlcmVuY2UgZm9yIGdldFZhbHVlIG1ldGhvZCBzaG91bGQgYmUgb3B0aW9uYWxcbiAgICByZXR1cm4gdGhpcy5wQ29ubiQuZ2V0VmFsdWUoUENvcmUuZ2V0Q29uc3RhbnRzKCkuQ0FTRV9JTkZPLkNBU0VfSU5GT19JRCkgfHwgJyc7XG4gIH1cblxuICBmZXRjaENhc2VBdHRhY2htZW50cyhjYXNlSUQpIHtcbiAgICBjb25zdCBhdHRhY2htZW50VXRpbHMgPSBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKTtcbiAgICByZXR1cm4gYXR0YWNobWVudFV0aWxzLmdldENhc2VBdHRhY2htZW50cyhjYXNlSUQsIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuICB9XG5cbiAgaGFuZGxlQXR0YWNobWVudHNSZXNwb25zZShyZXNwKSB7XG4gICAgdGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMgPSB0aGlzLmFkZEF0dGFjaG1lbnRzKHJlc3ApO1xuICAgIHRoaXMubHVfY291bnQkID0gdGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMubGVuZ3RoO1xuICAgIHRoaXMubHVfYXJBY3Rpb25zJCA9IHRoaXMuYWRkQXR0YWNobWVudHNBY3Rpb25zO1xuXG4gICAgdGhpcy5sdV9hckl0ZW1zJCA9IHRoaXMuZ2V0VXRpbGl0eUl0ZW1zKHRoaXMuYXJGdWxsTGlzdEF0dGFjaG1lbnRzLnNsaWNlKDAsIDMpKTtcbiAgICB0aGlzLnZhX2FySXRlbXMkID0gdGhpcy5nZXRVdGlsaXR5SXRlbXModGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMpO1xuICB9XG5cbiAgZ2V0VXRpbGl0eUl0ZW1zKGF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuIGF0dGFjaG1lbnRzLm1hcCh0aGlzLm1hcEF0dGFjaG1lbnRUb1V0aWxpdHlJdGVtLmJpbmQodGhpcykpO1xuICB9XG5cbiAgbWFwQXR0YWNobWVudFRvVXRpbGl0eUl0ZW0oYXR0KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgYXR0LFxuICAgICAgZG93bmxvYWRGaWxlOiB0aGlzLmdldERvd25sb2FkRnVuY3Rpb24oYXR0KSxcbiAgICAgIGNhbmNlbEZpbGU6IHRoaXMuZ2V0Q2FuY2VsRnVuY3Rpb24oYXR0KSxcbiAgICAgIGRlbGV0ZUZpbGU6IHRoaXMuZ2V0RGVsZXRlRnVuY3Rpb24oYXR0KSxcbiAgICAgIHJlbW92ZUZpbGU6IHRoaXMuZ2V0UmVtb3ZlRnVuY3Rpb24oYXR0KVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0RG93bmxvYWRGdW5jdGlvbihhdHQpIHtcbiAgICByZXR1cm4gIWF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuZG93bmxvYWRGaWxlKGF0dCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0Q2FuY2VsRnVuY3Rpb24oYXR0KSB7XG4gICAgcmV0dXJuIGF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuY2FuY2VsRmlsZSgpIDogbnVsbDtcbiAgfVxuXG4gIGdldERlbGV0ZUZ1bmN0aW9uKGF0dCkge1xuICAgIHJldHVybiAhYXR0LnByb2dyZXNzID8gKCkgPT4gdGhpcy5kZWxldGVGaWxlKGF0dCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0UmVtb3ZlRnVuY3Rpb24oYXR0KSB7XG4gICAgcmV0dXJuIGF0dC5lcnJvciA/ICgpID0+IHRoaXMucmVtb3ZlRmlsZSgpIDogbnVsbDtcbiAgfVxuXG4gIGNhc2VIYXNDaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIC8vIEB0cy1pZ25vcmUgLSBzZWNvbmQgcGFyYW1ldGVyIHBhZ2VSZWZlcmVuY2UgZm9yIGdldFZhbHVlIG1ldGhvZCBzaG91bGQgYmUgb3B0aW9uYWxcbiAgICBjb25zdCBjYXNlSUQgPSB0aGlzLnBDb25uJC5nZXRWYWx1ZShQQ29yZS5nZXRDb25zdGFudHMoKS5DQVNFX0lORk8uQ0FTRV9JTkZPX0lEKTtcbiAgICBpZiAodGhpcy5jdXJyZW50Q2FzZUlEICE9PSBjYXNlSUQpIHtcbiAgICAgIHRoaXMuY3VycmVudENhc2VJRCA9IGNhc2VJRDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICBuYW1lPVwiTGlzdFV0aWxpdHlcIlxuICAgIFtwcm9wc109XCJ7XG4gICAgICBuYW1lJDogbHVfbmFtZSQsXG4gICAgICBpY29uJDogbHVfaWNvbiQsXG4gICAgICBiTG9hZGluZyQ6IGx1X2JMb2FkaW5nJCxcbiAgICAgIGNvdW50JDogbHVfY291bnQkLFxuICAgICAgYXJBY3Rpb25zJDogbHVfYXJBY3Rpb25zJCxcbiAgICAgIGFySXRlbXMkOiBsdV9hckl0ZW1zJCxcbiAgICAgIG9uVmlld0FsbCQ6IGx1X29uVmlld0FsbEZ1bmN0aW9uLFxuICAgICAgbWVudUljb25PdmVycmlkZUFjdGlvbiQ6IHJlbW92ZUZpbGVGcm9tTGlzdCRcbiAgICB9XCJcbiAgPjwvY29tcG9uZW50LW1hcHBlcj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiYlNob3dGaWxlTW9kYWwkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWZpbGUtdG9wXCI+XG4gICAgPGgzPnt7IHBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQWRkIGxvY2FsIGZpbGVzJywgJycsICcnKSB9fTwvaDM+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtYm9keVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtZmlsZS1zZWxlY3RvclwiPlxuICAgICAgICA8aW5wdXQgaGlkZGVuIHR5cGU9XCJmaWxlXCIgbXVsdGlwbGUgI3VwbG9hZGVyIChjaGFuZ2UpPVwidXBsb2FkTXlGaWxlcygkZXZlbnQpXCIgLz5cblxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwidXBsb2FkZXIuY2xpY2soKVwiPnt7IHBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnVXBsb2FkIGZpbGUocyknLCAnJywgJycpIH19PC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICAgICAgbmFtZT1cIlN1bW1hcnlMaXN0XCJcbiAgICAgICAgW3Byb3BzXT1cInsgYXJJdGVtcyQ6IGFyRmlsZUxpc3QkLCBtZW51SWNvbk92ZXJyaWRlJDogJ3RyYXNoJywgbWVudUljb25PdmVycmlkZUFjdGlvbiQ6IHJlbW92ZUZpbGVGcm9tTGlzdCQgfVwiXG4gICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICAgIG5hbWU9XCJBY3Rpb25CdXR0b25zXCJcbiAgICAgIFtwcm9wc109XCJ7IGFyTWFpbkJ1dHRvbnMkOiBhckZpbGVNYWluQnV0dG9ucyQsIGFyU2Vjb25kYXJ5QnV0dG9ucyQ6IGFyRmlsZVNlY29uZGFyeUJ1dHRvbnMkIH1cIlxuICAgICAgW3BhcmVudF09XCJ0aGlzXCJcbiAgICAgIFtvdXRwdXRFdmVudHNdPVwieyBhY3Rpb25CdXR0b25DbGljazogb25GaWxlQWN0aW9uQnV0dG9uQ2xpY2sgfVwiXG4gICAgPjwvY29tcG9uZW50LW1hcHBlcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImJTaG93TGlua01vZGFsJFwiIGNsYXNzPVwicHNkay1kaWFsb2ctYmFja2dyb3VuZFwiPlxuICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rLXRvcFwiPlxuICAgIDxoMz57eyBwQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0FkZCBsb2NhbCBsaW5rJywgJycsICcnKSB9fTwvaDM+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtbGluay1lbnRyeVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rcy1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1saW5rcy10d28tY29sdW1uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rLWRhdGFcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5MaW5rIHRpdGxlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgKGNoYW5nZSk9XCJfZmllbGRPbkNoYW5nZUxpbmsoJGV2ZW50KVwiIFt2YWx1ZV09XCJsaW5rX3RpdGxlJFwiIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWxpbmstZGF0YVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlVSTDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHJlcXVpcmVkPVwidHJ1ZVwiIChjaGFuZ2UpPVwiX2ZpZWxkT25DaGFuZ2VVUkwoJGV2ZW50KVwiIFt2YWx1ZV09XCJsaW5rX3VybCRcIiAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rLWFkZFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiX2FkZExpbmsoKVwiPnt7IHBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQWRkIExpbmsnLCAnJywgJycpIH19PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgICAgbmFtZT1cIlN1bW1hcnlMaXN0XCJcbiAgICAgICAgICBbcHJvcHNdPVwieyBhckl0ZW1zJDogYXJMaW5rc0xpc3QkLCBtZW51SWNvbk92ZXJyaWRlJDogJ3RyYXNoJywgbWVudUljb25PdmVycmlkZUFjdGlvbiQ6IHJlbW92ZUxpbmtzRnJvbUxpc3QkIH1cIlxuICAgICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgW3Byb3BzXT1cInsgYXJNYWluQnV0dG9ucyQ6IGFyTGlua01haW5CdXR0b25zJCwgYXJTZWNvbmRhcnlCdXR0b25zJDogYXJMaW5rU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgW291dHB1dEV2ZW50c109XCJ7IGFjdGlvbkJ1dHRvbkNsaWNrOiBvbkxpbmtBY3Rpb25CdXR0b25DbGljayB9XCJcbiAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiYlNob3dWaWV3QWxsTW9kYWwkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWZpbGUtdG9wXCI+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstdmlldy1hbGwtaGVhZGVyXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8aDM+e3sgcENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBdHRhY2htZW50cycsICcnLCAnJykgfX08L2gzPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiX2Nsb3NlVmlld0FsbCgpXCI+XG4gICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstdXRpbGl0eS1jYXJkLWFjdGlvbnMtc3ZnLWljb25cIiBzcmM9XCJ7eyBjbG9zZVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay12aWV3LWFsbC1ib2R5XCI+XG4gICAgICA8Y29tcG9uZW50LW1hcHBlciBuYW1lPVwiU3VtbWFyeUxpc3RcIiBbcHJvcHNdPVwieyBhckl0ZW1zJDogdmFfYXJJdGVtcyQsIG1lbnVJY29uT3ZlcnJpZGVBY3Rpb24kOiByZW1vdmVMaW5rc0Zyb21MaXN0JCB9XCI+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|