@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
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# AngularSdkComponents
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project angular-sdk-components` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project angular-sdk-components`.
|
|
8
|
+
> Note: Don't forget to add `--project angular-sdk-components` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build angular-sdk-components` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build angular-sdk-components`, go to the dist folder `cd dist/angular-sdk-components` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test angular-sdk-components` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
$app-primary-color: #673ab7;
|
|
2
|
+
$app-primary-dark-color: #4527a0;
|
|
3
|
+
$app-primary-light-color: #b499fc;
|
|
4
|
+
$app-secondary-color: #ffc400;
|
|
5
|
+
$app-neutral-color: grey;
|
|
6
|
+
$app-neutral-light-color: lightgrey;
|
|
7
|
+
$app-neutral-dark-color: #262626;
|
|
8
|
+
$app-error-light-color: #e57373;
|
|
9
|
+
$app-warning-color: #ff9800;
|
|
10
|
+
$app-warning-color-dark: #f57c00;
|
|
11
|
+
|
|
12
|
+
$app-background-color: whitesmoke;
|
|
13
|
+
$app-form-color: white;
|
|
14
|
+
|
|
15
|
+
// svg filter colors that match above, go here to generate https://codepen.io/sosuke/pen/Pjoqqp
|
|
16
|
+
$app-primary-color-filter: invert(23%) sepia(23%) saturate(6785%) hue-rotate(250deg) brightness(93%) contrast(88%);
|
|
17
|
+
$app-primary-dark-color-filter: invert(19%) sepia(20%) saturate(6809%) hue-rotate(242deg) brightness(100%) contrast(106%);
|
|
18
|
+
$app-secondary-color-filter: invert(83%) sepia(31%) saturate(4626%) hue-rotate(360deg) brightness(103%) contrast(104%);
|
|
19
|
+
$app-neutral-color-filter: invert(55%) sepia(25%) saturate(0%) hue-rotate(269deg) brightness(87%) contrast(91%);
|
|
20
|
+
$app-neutral-light-color-filter: invert(69%) sepia(74%) saturate(0%) hue-rotate(205deg) brightness(102%) contrast(103%);
|
|
21
|
+
$app-white-color-filter: invert(100%) sepia(99%) saturate(0%) hue-rotate(144deg) brightness(109%) contrast(101%);
|
|
22
|
+
|
|
23
|
+
// App Navigation
|
|
24
|
+
$app-nav-bg: #262626 !default;
|
|
25
|
+
$app-nav-color: invert($app-nav-bg) !default;
|
|
26
|
+
$app-nav-width: 5rem !default;
|
|
27
|
+
// $app-nav-width: 15.625rem !default;
|
|
28
|
+
$app-nav-width-expanded: 15.625rem !default;
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { interval } from 'rxjs';
|
|
3
|
+
import isEqual from 'fast-deep-equal';
|
|
4
|
+
import { Utils } from '../_helpers/utils';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../_messages/progress-spinner.service";
|
|
7
|
+
import * as i2 from "../_messages/error-messages.service";
|
|
8
|
+
import * as i3 from "../_helpers/utils";
|
|
9
|
+
export class AngularPConnectService {
|
|
10
|
+
/* Used to toggle some class-wide logging */
|
|
11
|
+
static { this.bLogging = false; }
|
|
12
|
+
constructor(psService, erService, utils) {
|
|
13
|
+
this.psService = psService;
|
|
14
|
+
this.erService = erService;
|
|
15
|
+
this.utils = utils;
|
|
16
|
+
/**
|
|
17
|
+
* Local variable for access to the store once the service is connected to it.
|
|
18
|
+
*/
|
|
19
|
+
this.theStore = null;
|
|
20
|
+
/**
|
|
21
|
+
* Local variable used to compute the next componentID
|
|
22
|
+
*/
|
|
23
|
+
this.counterComponentID = 0;
|
|
24
|
+
/**
|
|
25
|
+
* Local array used to store the association of an component to its most recent "props"
|
|
26
|
+
* where "props" is the object containing the component's getConfigProps along with
|
|
27
|
+
* anything added by populateAdditionalProps.
|
|
28
|
+
* Each entry is: { __componentID__: _the component's most recent props_ }
|
|
29
|
+
*/
|
|
30
|
+
this.componentPropsArr = [];
|
|
31
|
+
// Establish necessary override flags for our use of Core
|
|
32
|
+
// const coreOverrides = { "dynamicLoadComponents": false };
|
|
33
|
+
// let coreOverrides = PCore.getBehaviorOverrides();
|
|
34
|
+
// coreOverrides["dynamicLoadComponents"] = false;
|
|
35
|
+
// PCore.setBehaviorOverrides( coreOverrides );
|
|
36
|
+
PCore.setBehaviorOverride('dynamicLoadComponents', false);
|
|
37
|
+
// Always best to use deep object compare when it's available
|
|
38
|
+
// if (isEqual !== undefined) {
|
|
39
|
+
// console.log(`AngularPConnect is using deep object compare`);
|
|
40
|
+
// } else {
|
|
41
|
+
// console.log(`AngularPConnect is using JSON.stringify compare`);
|
|
42
|
+
// }
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns a unique (for this session) ComponentID that should
|
|
46
|
+
* be used for that component to update its most recent props
|
|
47
|
+
* (which can also be compared against its previous value
|
|
48
|
+
* before updating). Note that this returns a string so we can use
|
|
49
|
+
* it as a key in an associative array
|
|
50
|
+
* @returns the next componentID
|
|
51
|
+
*/
|
|
52
|
+
getNextComponentId() {
|
|
53
|
+
this.counterComponentID += 1;
|
|
54
|
+
// Note that we use the string version of the number so we have an
|
|
55
|
+
// associative array that we can clean up later, if needed.
|
|
56
|
+
return this.counterComponentID.toString();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The Calling object (inComp) subscribes to store changes.
|
|
60
|
+
* @param inComp The component that's subscribing to the store
|
|
61
|
+
* @param inCallback The component's callback function (typically called onStateChange) that will
|
|
62
|
+
* be called when the store changes.
|
|
63
|
+
* @returns The **unsubscribe** function that should be called when the component needs
|
|
64
|
+
* to unsubscribe from the store. (Typically during ngOnDestroy)
|
|
65
|
+
*/
|
|
66
|
+
subscribeToStore(inComp = null, inCallback = null) {
|
|
67
|
+
// const theCompName: string = inComp ? `${inComp.constructor.name}` : 'no component provided';
|
|
68
|
+
let fnUnsubscribe;
|
|
69
|
+
// console.log( `Bridge subscribing: ${theCompName} `);
|
|
70
|
+
if (inComp) {
|
|
71
|
+
fnUnsubscribe = this.getStore().subscribe(inCallback);
|
|
72
|
+
}
|
|
73
|
+
return fnUnsubscribe;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Gets the Component's properties that are used (a) to populate componentPropsArr
|
|
77
|
+
// and (b) to determine whether the component should update itself (re-render)
|
|
78
|
+
* @param inComp The component whose properties are being obtained
|
|
79
|
+
*/
|
|
80
|
+
getComponentProps(inComp = null) {
|
|
81
|
+
let compProps = {};
|
|
82
|
+
let addProps = {};
|
|
83
|
+
if (inComp === null) {
|
|
84
|
+
console.error(`AngularPConnect: getComponentProps called with bad component: ${inComp}`);
|
|
85
|
+
}
|
|
86
|
+
// if ((inComp.constructor.name === "FlowContainerComponent") || (inComp.constructor.name === "ViewContainerComponent")
|
|
87
|
+
// || (inComp.constructor.name === "ViewComponent") || (inComp.constructor.name === "DeferLoadComponent")) {
|
|
88
|
+
// console.log(`--> AngularPConnect getComponentProps: ${inComp.constructor.name}`);
|
|
89
|
+
// }
|
|
90
|
+
if (inComp.additionalProps !== undefined) {
|
|
91
|
+
if (typeof inComp.additionalProps === 'object') {
|
|
92
|
+
addProps = inComp.pConn$.resolveConfigProps(inComp.additionalProps);
|
|
93
|
+
}
|
|
94
|
+
else if (typeof inComp.additionalProps === 'function') {
|
|
95
|
+
const propsToAdd = inComp.additionalProps(PCore.getStore().getState(), inComp.pConn$);
|
|
96
|
+
addProps = inComp.pConn$.resolveConfigProps(propsToAdd);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
compProps = inComp.pConn$.getConfigProps();
|
|
100
|
+
// const componentName = inComp.constructor.name;
|
|
101
|
+
// The following comment is from the Nebula/Constellation version of this code. Meant as a reminder to check this occasionally
|
|
102
|
+
// populate additional props which are component specific and not present in configurations
|
|
103
|
+
// This block can be removed once all these props will be added as part of configs
|
|
104
|
+
inComp.pConn$.populateAdditionalProps(compProps);
|
|
105
|
+
compProps = inComp.pConn$.resolveConfigProps(compProps);
|
|
106
|
+
if (compProps && undefined !== compProps.validatemessage && compProps.validatemessage != '') {
|
|
107
|
+
// console.log( ` validatemessage for ${inComp.constructor.name} ${inComp.angularPConnectData.compID}: ${compProps.validatemessage}`);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
...compProps,
|
|
111
|
+
...addProps
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Returns the unique id for given component created when registering
|
|
116
|
+
* Otherwise, return undefined.
|
|
117
|
+
* @param inComp The component whose property is being requested.
|
|
118
|
+
*/
|
|
119
|
+
getComponentID(inComp) {
|
|
120
|
+
return inComp.bridgeComponentID || inComp.angularPConnectData.compID;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Returns the value of requested property for the component if it exists.
|
|
124
|
+
* Otherwise, return undefined.
|
|
125
|
+
* @param inComp The component whose property is being requested.
|
|
126
|
+
* @param inProp The property being requested.
|
|
127
|
+
*/
|
|
128
|
+
getComponentProp(inComp = null, inProp = '') {
|
|
129
|
+
if (inComp === null) {
|
|
130
|
+
console.error(`AngularPConnect: getComponentProp called with bad component: ${inComp}`);
|
|
131
|
+
}
|
|
132
|
+
const compID = inComp.angularPConnectData.compID;
|
|
133
|
+
// Look up property in the component's entry in componentPropArray (which should have the most recent value)
|
|
134
|
+
return this.componentPropsArr[compID][inProp];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
*
|
|
138
|
+
* @returns The current complete set of resolved properties that are associated with
|
|
139
|
+
* this component.
|
|
140
|
+
* This is the full set of properties that are tracked in Redux for this component.
|
|
141
|
+
*/
|
|
142
|
+
getCurrentCompleteProps(inComp = null) {
|
|
143
|
+
if (inComp === null) {
|
|
144
|
+
console.error(`AngularPConnect: getCurrentCompleteProps called with bad component: ${inComp}`);
|
|
145
|
+
}
|
|
146
|
+
return this.componentPropsArr[inComp.angularPConnectData.compID];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Registers the component and its callback function. When a component calls this method
|
|
150
|
+
* (typically from its ngOnInit), the component is given a unique componentID (for this session)
|
|
151
|
+
* and subscribes the component to the store. As a side effect, it also assigns the component's
|
|
152
|
+
* actions (from its metadata) to the component's ___actions___ and binds the component's callback
|
|
153
|
+
* (passed in as ___inCallback___) to the component. If a problem is encountered, an empty object,
|
|
154
|
+
* {}, is returned.
|
|
155
|
+
* @param inComp The component being registered and subscribed
|
|
156
|
+
* @param inCallback The component's callback function (typically called onStateChange) that
|
|
157
|
+
* will be called whenever the state changes.
|
|
158
|
+
* @returns A JSON object with the following keys:
|
|
159
|
+
* compID: the unique ID associated with this component,
|
|
160
|
+
* unsubscribeFn: the function to be called when the component needs to unsubscribe from the store,
|
|
161
|
+
* validateMessage: any validation/error message that gets generated for this object,
|
|
162
|
+
* actions: any actions that are defined for this object
|
|
163
|
+
*/
|
|
164
|
+
registerAndSubscribeComponent(inComp, inCallback = null) {
|
|
165
|
+
// Create an initial object to be returned.
|
|
166
|
+
const returnObject = {
|
|
167
|
+
compID: '',
|
|
168
|
+
unsubscribeFn: undefined,
|
|
169
|
+
validateMessage: '',
|
|
170
|
+
actions: undefined
|
|
171
|
+
};
|
|
172
|
+
if (inComp === null || inCallback === null) {
|
|
173
|
+
console.error(`AngularPConnect: bad call to registerAndSubscribe: inComp: ${inComp} inCallback: ${inCallback}`);
|
|
174
|
+
return returnObject;
|
|
175
|
+
}
|
|
176
|
+
const compType = inComp.constructor.name;
|
|
177
|
+
if (AngularPConnectService.bLogging) {
|
|
178
|
+
console.log(`registerAndSubscribeComponent: ${compType}`);
|
|
179
|
+
}
|
|
180
|
+
if (undefined !== inComp.bridgeComponentID) {
|
|
181
|
+
console.error(`OLD SCHOOL: ${compType}`);
|
|
182
|
+
}
|
|
183
|
+
if (undefined === inComp.actions && undefined === inComp.angularPConnectData) {
|
|
184
|
+
console.error(`AngularPConnect: bad call to registerAndSubscribe from ${compType}: actions not defined as a class variable for inComp`);
|
|
185
|
+
return returnObject;
|
|
186
|
+
}
|
|
187
|
+
if (undefined === inComp.bridgeComponentID && undefined === inComp.angularPConnectData) {
|
|
188
|
+
console.error(`AngularPConnect: bad call to registerAndSubscribe from ${compType}: bridgeComponentID not defined as a class variable for inComp`);
|
|
189
|
+
return returnObject;
|
|
190
|
+
}
|
|
191
|
+
if (undefined === inComp.unsubscribeStore && undefined === inComp.angularPConnectData) {
|
|
192
|
+
console.error(`AngularPConnect: bad call to registerAndSubscribe from ${compType}: unsubscribeStore not defined as a class variable for inComp`);
|
|
193
|
+
return returnObject;
|
|
194
|
+
}
|
|
195
|
+
if (undefined === inComp.validateMessage && undefined === inComp.angularPConnectData) {
|
|
196
|
+
console.error(`AngularPConnect: bad call to registerAndSubscribe from ${compType}: validateMessage not defined as a class variable for inComp`);
|
|
197
|
+
return returnObject;
|
|
198
|
+
}
|
|
199
|
+
// call processActions to populate metadata with actions as in PConnectHOR initialize
|
|
200
|
+
this.processActions(inComp);
|
|
201
|
+
if (undefined === inComp.actions) {
|
|
202
|
+
returnObject.actions = inComp.pConn$.getActions();
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
inComp.actions = inComp.pConn$.getActions();
|
|
206
|
+
}
|
|
207
|
+
// bind the provided callback to the component it's associated with
|
|
208
|
+
inCallback = inCallback.bind(inComp);
|
|
209
|
+
// Now proceed to register and subscribe...
|
|
210
|
+
const theCompID = this.getNextComponentId();
|
|
211
|
+
const theUnsub = this.subscribeToStore(inComp, inCallback);
|
|
212
|
+
if (undefined === inComp.angularPConnectData) {
|
|
213
|
+
inComp.bridgeComponentID = theCompID;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
returnObject.compID = theCompID;
|
|
217
|
+
returnObject.unsubscribeFn = theUnsub;
|
|
218
|
+
}
|
|
219
|
+
// initialize this components entry in the componentPropsArr
|
|
220
|
+
this.componentPropsArr[theCompID] = {};
|
|
221
|
+
// return object with compID and unsubscribe...
|
|
222
|
+
return returnObject;
|
|
223
|
+
}
|
|
224
|
+
// Returns true if the component's entry in ___componentPropsArr___ is
|
|
225
|
+
// the same as the inCompProps passed in.
|
|
226
|
+
// As a side effect, update the component's entry in componentPropsArr
|
|
227
|
+
// NOTE: It is assumed that the incoming component has the following:
|
|
228
|
+
// * a bridgeComponentID <string> property - used as lookup key in componentPropsArr
|
|
229
|
+
// * a pConn$ <?> property - used to access functions accessed in getComponentProps
|
|
230
|
+
// Return true: means the component props are different and the component should update itself (re-render)
|
|
231
|
+
// Return false: means the component props are the same and the component doesn't need to update (re-render)
|
|
232
|
+
// On bad input, return false;
|
|
233
|
+
/**
|
|
234
|
+
* Returns **true** if the component's entry in ___componentPropsArr___ is
|
|
235
|
+
* the same as the properties that are current associated with the component (___inComp___) passed in.
|
|
236
|
+
* As a side effect, the component's entry in ___componentPropsArr___ is updated.
|
|
237
|
+
* **Note**: It is assumed that the incoming component has the following:
|
|
238
|
+
* (a) a bridgeComponentID _string_ property used as lookup key in ___componentPropsArr___
|
|
239
|
+
* and (b) a ___pConn$___ property used to access functions called in ___getComponentProps___
|
|
240
|
+
*
|
|
241
|
+
* @param inComp The component asking if it should update itself
|
|
242
|
+
* @returns Return **true**: means the component props are different and the component should update itself (re-render).
|
|
243
|
+
* Return **false**: means the component props are the same and the component doesn't need to update (re-render).
|
|
244
|
+
* If the ***inComp*** input is bad, false is also returned.
|
|
245
|
+
*/
|
|
246
|
+
shouldComponentUpdate(inComp) {
|
|
247
|
+
// const bShowLogging = false;
|
|
248
|
+
let bRet = false;
|
|
249
|
+
// check for reasonable input
|
|
250
|
+
if (Utils.isEmptyObject(inComp)) {
|
|
251
|
+
console.error(`AngularPConnect: bad call to shouldComponentUpdate: inComp: ${JSON.stringify(inComp)}`);
|
|
252
|
+
return bRet;
|
|
253
|
+
}
|
|
254
|
+
if (undefined === inComp.validateMessage && undefined === inComp.angularPConnectData) {
|
|
255
|
+
console.error(`AngularPConnect: bad call to shouldComponentUpdate: ${inComp.constructor.name} does not have a validateMessage property.`);
|
|
256
|
+
}
|
|
257
|
+
const compID = this.getComponentID(inComp);
|
|
258
|
+
const currentProps = this.componentPropsArr[compID];
|
|
259
|
+
const currentPropsAsStr = JSON.stringify(currentProps);
|
|
260
|
+
const incomingProps = this.getComponentProps(inComp);
|
|
261
|
+
// if have pageMessages, and it is blank, remove it. This causes issues of making it appear
|
|
262
|
+
// that a will cause an update, when there is no change
|
|
263
|
+
if (this.isPageMessagesEmpty(incomingProps)) {
|
|
264
|
+
inComp.angularPConnectData.pageMessages = incomingProps.pageMessages;
|
|
265
|
+
delete incomingProps.pageMessages;
|
|
266
|
+
}
|
|
267
|
+
if (incomingProps.httpMessages) {
|
|
268
|
+
inComp.angularPConnectData.httpMessages = incomingProps.httpMessages;
|
|
269
|
+
incomingProps.httpMessages = undefined;
|
|
270
|
+
}
|
|
271
|
+
const incomingPropsAsStr = JSON.stringify(incomingProps);
|
|
272
|
+
bRet = isEqual ? !isEqual(currentProps, incomingProps) : currentPropsAsStr != incomingPropsAsStr;
|
|
273
|
+
// Below piece of code is needed to re-render the component since we wanna evaluate the Visibility expression within View component in such cases
|
|
274
|
+
if (inComp.pConn$.meta.config.context?.length > 0 && inComp.pConn$.getPageReference().length > 'caseInfo.content'.length) {
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
// Now update the entry in componentPropsArr with the incoming value so
|
|
278
|
+
// we can compare against that next time...
|
|
279
|
+
this.componentPropsArr[compID] = incomingProps;
|
|
280
|
+
const validatemessage = incomingProps.validatemessage === undefined ? '' : this.utils.htmlDecode(incomingProps.validatemessage);
|
|
281
|
+
// and update the component's validation message (if undefined, it should be set to "")
|
|
282
|
+
if (undefined !== inComp.angularPConnectData) {
|
|
283
|
+
inComp.angularPConnectData.validateMessage = validatemessage;
|
|
284
|
+
if (inComp.angularPConnectData.validateMessage != '') {
|
|
285
|
+
// if have a validate message, turn off spinner
|
|
286
|
+
const timer = interval(100).subscribe(() => {
|
|
287
|
+
this.psService.sendMessage(false);
|
|
288
|
+
timer.unsubscribe();
|
|
289
|
+
});
|
|
290
|
+
let sErrorMessage = currentProps && currentProps.label ? currentProps.label.concat(' - ') : '';
|
|
291
|
+
sErrorMessage = sErrorMessage.concat(inComp.angularPConnectData.validateMessage);
|
|
292
|
+
this.erService.sendMessage('update', sErrorMessage);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
inComp.validateMessage = validatemessage;
|
|
297
|
+
}
|
|
298
|
+
if (bRet && compID === undefined) {
|
|
299
|
+
bRet = false;
|
|
300
|
+
}
|
|
301
|
+
// console.log( `AngularPConnect component ${compID} - ${inComp.constructor.name} - shouldComponentUpdate: ${bRet}`);
|
|
302
|
+
// console.log("current props: " + currentPropsAsStr);
|
|
303
|
+
if (bRet) {
|
|
304
|
+
// console.log(`**** change for: ${inComp.constructor.name}`);
|
|
305
|
+
// console.log("current props: " + currentPropsAsStr);
|
|
306
|
+
// console.log("incoming props: " + incomingPropsAsStr);
|
|
307
|
+
// console.log(` ${inComp.constructor.name}: shouldComponentUpdate returning: ${bRet}, compId: ${compID}` );
|
|
308
|
+
// console.log( ` Updating with componentProps for ${inComp.constructor.name}: ${JSON.stringify(this.componentPropsArr[compID])}`);
|
|
309
|
+
// console.log( ` and validateMessage: ${inComp.validateMessage}`);
|
|
310
|
+
}
|
|
311
|
+
// else if (inComp.constructor.name.indexOf("View") >= 0 || inComp.constructor.name.indexOf("Root") >= 0) {
|
|
312
|
+
// console.log("no change");
|
|
313
|
+
// console.log("current props: " + currentPropsAsStr);
|
|
314
|
+
// console.log("incoming props: " + incomingPropsAsStr);
|
|
315
|
+
// console.log(` ${inComp.constructor.name}: shouldComponentUpdate returning: ${bRet}, compId: ${compID}` );
|
|
316
|
+
// }
|
|
317
|
+
// console.log(` ${inComp.constructor.name}: shouldComponentUpdate returning: ${bRet}`);
|
|
318
|
+
return bRet;
|
|
319
|
+
}
|
|
320
|
+
isPageMessagesEmpty(incomingProps) {
|
|
321
|
+
return incomingProps.pageMessages && incomingProps.pageMessages.length === 0;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Can be called when the component has encountered a change event
|
|
325
|
+
* @param inComp The component calling the change event
|
|
326
|
+
* @param event The event
|
|
327
|
+
*/
|
|
328
|
+
changeHandler(inComp, event) {
|
|
329
|
+
const bLogging = false;
|
|
330
|
+
if (bLogging) {
|
|
331
|
+
// console.log(`AngularPConnect.changeHandler`);
|
|
332
|
+
}
|
|
333
|
+
// check for reasonable input
|
|
334
|
+
if (undefined === inComp || Utils.isEmptyObject(inComp)) {
|
|
335
|
+
console.error(`AngularPConnect: bad call to changeHandler: inComp: ${JSON.stringify(inComp)}`);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const pConnect = inComp.pConn$;
|
|
339
|
+
if (undefined === pConnect) {
|
|
340
|
+
console.error(`AngularPConnect: bad call to changeHandler: inComp.pConn$: ${pConnect}`);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
// clear out errors
|
|
344
|
+
this.erService.sendMessage('dismiss', '');
|
|
345
|
+
pConnect.getActionsApi().changeHandler(pConnect, event);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Can be called when the component has encountered an event (such as blur)
|
|
349
|
+
* @param inComp The component calling the event
|
|
350
|
+
* @param event The event
|
|
351
|
+
*/
|
|
352
|
+
eventHandler(inComp, event) {
|
|
353
|
+
const bLogging = false;
|
|
354
|
+
if (bLogging) {
|
|
355
|
+
// console.log(`AngularPConnect.eventHandler`);
|
|
356
|
+
}
|
|
357
|
+
// check for reasonable input
|
|
358
|
+
if (undefined === inComp || Utils.isEmptyObject(inComp)) {
|
|
359
|
+
console.error(`AngularPConnect: bad call to eventHandler: inComp: ${JSON.stringify(inComp)}`);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const pConnect = inComp.pConn$;
|
|
363
|
+
if (undefined === pConnect) {
|
|
364
|
+
console.error(`AngularPConnect: bad call to eventHandler: inComp.pConn$: ${pConnect}`);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
pConnect.getActionsApi().eventHandler(pConnect, event);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* @returns A handle to the application's store
|
|
371
|
+
*/
|
|
372
|
+
getStore() {
|
|
373
|
+
if (this.theStore === null) {
|
|
374
|
+
this.theStore = PCore.getStore();
|
|
375
|
+
}
|
|
376
|
+
return this.theStore;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* @param bLogMsg If true, will write the stringified state to the store for debugging/inspection
|
|
380
|
+
* @param inComp If supplied, the component that is requesting the store's state
|
|
381
|
+
* @returns A handle to the __state__ of application's store
|
|
382
|
+
*/
|
|
383
|
+
getState(bLogMsg = false, inComp = null) {
|
|
384
|
+
const theState = this.getStore().getState();
|
|
385
|
+
if (bLogMsg) {
|
|
386
|
+
const theCompName = inComp ? `${inComp.constructor.name}: ` : '';
|
|
387
|
+
console.log(`${theCompName} Store state: ${JSON.stringify(theState)}`);
|
|
388
|
+
}
|
|
389
|
+
return theState;
|
|
390
|
+
}
|
|
391
|
+
// processActions - carried over from PConnectHOC initialize
|
|
392
|
+
/**
|
|
393
|
+
* processActions exposes all actions in the metadata.
|
|
394
|
+
* Attaches common handler (eventHandler) for all actions.
|
|
395
|
+
*/
|
|
396
|
+
processActions(inComp) {
|
|
397
|
+
const pConnect = inComp.pConn$;
|
|
398
|
+
if (undefined === pConnect) {
|
|
399
|
+
console.error(`AngularPConnect: bad call to processActions: pConn$: ${pConnect} from component: ${inComp.constructor.name}`);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (inComp.pConn$.isEditable()) {
|
|
403
|
+
inComp.pConn$.setAction('onChange', this.changeHandler.bind(this));
|
|
404
|
+
inComp.pConn$.setAction('onBlur', this.eventHandler.bind(this));
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AngularPConnectService, deps: [{ token: i1.ProgressSpinnerService }, { token: i2.ErrorMessagesService }, { token: i3.Utils }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
408
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AngularPConnectService, providedIn: 'root' }); }
|
|
409
|
+
}
|
|
410
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AngularPConnectService, decorators: [{
|
|
411
|
+
type: Injectable,
|
|
412
|
+
args: [{
|
|
413
|
+
providedIn: 'root'
|
|
414
|
+
}]
|
|
415
|
+
}], ctorParameters: function () { return [{ type: i1.ProgressSpinnerService }, { type: i2.ErrorMessagesService }, { type: i3.Utils }]; } });
|
|
416
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1wY29ubmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fYnJpZGdlL2FuZ3VsYXItcGNvbm5lY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sT0FBTyxNQUFNLGlCQUFpQixDQUFDO0FBR3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUFlMUMsTUFBTSxPQUFPLHNCQUFzQjtJQW1CakMsNENBQTRDO2FBQzdCLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFFaEMsWUFDVSxTQUFpQyxFQUNqQyxTQUErQixFQUMvQixLQUFZO1FBRlosY0FBUyxHQUFULFNBQVMsQ0FBd0I7UUFDakMsY0FBUyxHQUFULFNBQVMsQ0FBc0I7UUFDL0IsVUFBSyxHQUFMLEtBQUssQ0FBTztRQXhCdEI7O1dBRUc7UUFDSyxhQUFRLEdBQVEsSUFBSSxDQUFDO1FBRTdCOztXQUVHO1FBQ0ssdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBRS9COzs7OztXQUtHO1FBQ0ssc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBVXZDLHlEQUF5RDtRQUN6RCw0REFBNEQ7UUFDNUQsb0RBQW9EO1FBQ3BELGtEQUFrRDtRQUNsRCwrQ0FBK0M7UUFDL0MsS0FBSyxDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTFELDZEQUE2RDtRQUM3RCwrQkFBK0I7UUFDL0IsK0RBQStEO1FBQy9ELFdBQVc7UUFDWCxrRUFBa0U7UUFDbEUsSUFBSTtJQUNOLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxD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LENBQUM7U0FDeEU7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsNERBQTREO0lBQzVEOzs7T0FHRztJQUNLLGNBQWMsQ0FBQyxNQUFNO1FBQzNCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0RBQXdELFFBQVEsb0JBQW9CLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3SCxPQUFPO1NBQ1I7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDOUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDOytHQS9jVSxzQkFBc0I7bUhBQXRCLHNCQUFzQixjQUZyQixNQUFNOzs0RkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbCc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vX21lc3NhZ2VzL3Byb2dyZXNzLXNwaW5uZXIuc2VydmljZSc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2VzU2VydmljZSB9IGZyb20gJy4uL19tZXNzYWdlcy9lcnJvci1tZXNzYWdlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vX2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFuZ3VsYXJQQ29ubmVjdERhdGEge1xuICBjb21wSUQ/OiBzdHJpbmc7XG4gIHVuc3Vic2NyaWJlRm4/OiBGdW5jdGlvbjtcbiAgdmFsaWRhdGVNZXNzYWdlPzogc3RyaW5nO1xuICBhY3Rpb25zPzoge1xuICAgIG9uQ2hhbmdlOiBGdW5jdGlvbjtcbiAgICBvbkJsdXI6IEZ1bmN0aW9uO1xuICB9O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIExvY2FsIHZhcmlhYmxlIGZvciBhY2Nlc3MgdG8gdGhlIHN0b3JlIG9uY2UgdGhlIHNlcnZpY2UgaXMgY29ubmVjdGVkIHRvIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSB0aGVTdG9yZTogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogTG9jYWwgdmFyaWFibGUgdXNlZCB0byBjb21wdXRlIHRoZSBuZXh0IGNvbXBvbmVudElEXG4gICAqL1xuICBwcml2YXRlIGNvdW50ZXJDb21wb25lbnRJRCA9IDA7XG5cbiAgLyoqXG4gICAqIExvY2FsIGFycmF5IHVzZWQgdG8gc3RvcmUgdGhlIGFzc29jaWF0aW9uIG9mIGFuIGNvbXBvbmVudCB0byBpdHMgbW9zdCByZWNlbnQgXCJwcm9wc1wiXG4gICAqICB3aGVyZSBcInByb3BzXCIgaXMgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBjb21wb25lbnQncyBnZXRDb25maWdQcm9wcyBhbG9uZyB3aXRoXG4gICAqIGFueXRoaW5nIGFkZGVkIGJ5IHBvcHVsYXRlQWRkaXRpb25hbFByb3BzLlxuICAgKiBFYWNoIGVudHJ5IGlzOiB7IF9fY29tcG9uZW50SURfXzogX3RoZSBjb21wb25lbnQncyBtb3N0IHJlY2VudCBwcm9wc18gfVxuICAgKi9cbiAgcHJpdmF0ZSBjb21wb25lbnRQcm9wc0FycjogT2JqZWN0W10gPSBbXTtcblxuICAvKiBVc2VkIHRvIHRvZ2dsZSBzb21lIGNsYXNzLXdpZGUgbG9nZ2luZyAqL1xuICBwcml2YXRlIHN0YXRpYyBiTG9nZ2luZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcHNTZXJ2aWNlOiBQcm9ncmVzc1NwaW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXJTZXJ2aWNlOiBFcnJvck1lc3NhZ2VzU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxzOiBVdGlsc1xuICApIHtcbiAgICAvLyBFc3RhYmxpc2ggbmVjZXNzYXJ5IG92ZXJyaWRlIGZsYWdzIGZvciBvdXIgdXNlIG9mIENvcmVcbiAgICAvLyBjb25zdCBjb3JlT3ZlcnJpZGVzID0geyBcImR5bmFtaWNMb2FkQ29tcG9uZW50c1wiOiBmYWxzZSB9O1xuICAgIC8vIGxldCBjb3JlT3ZlcnJpZGVzID0gUENvcmUuZ2V0QmVoYXZpb3JPdmVycmlkZXMoKTtcbiAgICAvLyBjb3JlT3ZlcnJpZGVzW1wiZHluYW1pY0xvYWRDb21wb25lbnRzXCJdID0gZmFsc2U7XG4gICAgLy8gUENvcmUuc2V0QmVoYXZpb3JPdmVycmlkZXMoIGNvcmVPdmVycmlkZXMgKTtcbiAgICBQQ29yZS5zZXRCZWhhdmlvck92ZXJyaWRlKCdkeW5hbWljTG9hZENvbXBvbmVudHMnLCBmYWxzZSk7XG5cbiAgICAvLyBBbHdheXMgYmVzdCB0byB1c2UgZGVlcCBvYmplY3QgY29tcGFyZSB3aGVuIGl0J3MgYXZhaWxhYmxlXG4gICAgLy8gaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKGBBbmd1bGFyUENvbm5lY3QgaXMgdXNpbmcgZGVlcCBvYmplY3QgY29tcGFyZWApO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gY29uc29sZS5sb2coYEFuZ3VsYXJQQ29ubmVjdCBpcyB1c2luZyBKU09OLnN0cmluZ2lmeSBjb21wYXJlYCk7XG4gICAgLy8gfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB1bmlxdWUgKGZvciB0aGlzIHNlc3Npb24pIENvbXBvbmVudElEIHRoYXQgc2hvdWxkXG4gICAqIGJlIHVzZWQgZm9yIHRoYXQgY29tcG9uZW50IHRvIHVwZGF0ZSBpdHMgbW9zdCByZWNlbnQgcHJvcHNcbiAgICogKHdoaWNoIGNhbiBhbHNvIGJlIGNvbXBhcmVkIGFnYWluc3QgaXRzIHByZXZpb3VzIHZhbHVlXG4gICAqIGJlZm9yZSB1cGRhdGluZykuIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgYSBzdHJpbmcgc28gd2UgY2FuIHVzZVxuICAgKiBpdCBhcyBhIGtleSBpbiBhbiBhc3NvY2lhdGl2ZSBhcnJheVxuICAgKiBAcmV0dXJucyB0aGUgbmV4dCBjb21wb25lbnRJRFxuICAgKi9cbiAgcHJpdmF0ZSBnZXROZXh0Q29tcG9uZW50SWQoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNvdW50ZXJDb21wb25lbnRJRCArPSAxO1xuICAgIC8vIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBudW1iZXIgc28gd2UgaGF2ZSBhblxuICAgIC8vICBhc3NvY2lhdGl2ZSBhcnJheSB0aGF0IHdlIGNhbiBjbGVhbiB1cCBsYXRlciwgaWYgbmVlZGVkLlxuICAgIHJldHVybiB0aGlzLmNvdW50ZXJDb21wb25lbnRJRC50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBDYWxsaW5nIG9iamVjdCAoaW5Db21wKSBzdWJzY3JpYmVzIHRvIHN0b3JlIGNoYW5nZXMuXG4gICAqIEBwYXJhbSBpbkNvbXAgVGhlIGNvbXBvbmVudCB0aGF0J3Mgc3Vic2NyaWJpbmcgdG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBpbkNhbGxiYWNrIFRoZSBjb21wb25lbnQncyBjYWxsYmFjayBmdW5jdGlvbiAodHlwaWNhbGx5IGNhbGxlZCBvblN0YXRlQ2hhbmdlKSB0aGF0IHdpbGxcbiAgICogYmUgY2FsbGVkIHdoZW4gdGhlIHN0b3JlIGNoYW5nZXMuXG4gICAqIEByZXR1cm5zIFRoZSAqKnVuc3Vic2NyaWJlKiogZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBuZWVkc1xuICAgKiB0byB1bnN1YnNjcmliZSBmcm9tIHRoZSBzdG9yZS4gKFR5cGljYWxseSBkdXJpbmcgbmdPbkRlc3Ryb3kpXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvU3RvcmUoaW5Db21wOiBhbnkgPSBudWxsLCBpbkNhbGxiYWNrOiBGdW5jdGlvbiB8IG51bGwgPSBudWxsKTogRnVuY3Rpb24ge1xuICAgIC8vIGNvbnN0IHRoZUNvbXBOYW1lOiBzdHJpbmcgPSBpbkNvbXAgPyBgJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX1gIDogJ25vIGNvbXBvbmVudCBwcm92aWRlZCc7XG4gICAgbGV0IGZuVW5zdWJzY3JpYmU7XG4gICAgLy8gY29uc29sZS5sb2coIGBCcmlkZ2Ugc3Vic2NyaWJpbmc6ICR7dGhlQ29tcE5hbWV9IGApO1xuICAgIGlmIChpbkNvbXApIHtcbiAgICAgIGZuVW5zdWJzY3JpYmUgPSB0aGlzLmdldFN0b3JlKCkuc3Vic2NyaWJlKGluQ2FsbGJhY2spO1xuICAgIH1cbiAgICByZXR1cm4gZm5VbnN1YnNjcmliZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBDb21wb25lbnQncyBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWQgKGEpIHRvIHBvcHVsYXRlIGNvbXBvbmVudFByb3BzQXJyXG4gIC8vICBhbmQgKGIpIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgKHJlLXJlbmRlcilcbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IHdob3NlIHByb3BlcnRpZXMgYXJlIGJlaW5nIG9idGFpbmVkXG4gICAqL1xuICBwcml2YXRlIGdldENvbXBvbmVudFByb3BzKGluQ29tcDogYW55ID0gbnVsbCk6IE9iamVjdCB7XG4gICAgbGV0IGNvbXBQcm9wczogYW55ID0ge307XG4gICAgbGV0IGFkZFByb3BzID0ge307XG5cbiAgICBpZiAoaW5Db21wID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGdldENvbXBvbmVudFByb3BzIGNhbGxlZCB3aXRoIGJhZCBjb21wb25lbnQ6ICR7aW5Db21wfWApO1xuICAgIH1cblxuICAgIC8vIGlmICgoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiRmxvd0NvbnRhaW5lckNvbXBvbmVudFwiKSB8fCAoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVmlld0NvbnRhaW5lckNvbXBvbmVudFwiKVxuICAgIC8vICAgICB8fCAoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVmlld0NvbXBvbmVudFwiKSB8fCAoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiRGVmZXJMb2FkQ29tcG9uZW50XCIpKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhgLS0+IEFuZ3VsYXJQQ29ubmVjdCBnZXRDb21wb25lbnRQcm9wczogJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICAvLyB9XG5cbiAgICBpZiAoaW5Db21wLmFkZGl0aW9uYWxQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGluQ29tcC5hZGRpdGlvbmFsUHJvcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFkZFByb3BzID0gaW5Db21wLnBDb25uJC5yZXNvbHZlQ29uZmlnUHJvcHMoaW5Db21wLmFkZGl0aW9uYWxQcm9wcyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbkNvbXAuYWRkaXRpb25hbFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHByb3BzVG9BZGQgPSBpbkNvbXAuYWRkaXRpb25hbFByb3BzKFBDb3JlLmdldFN0b3JlKCkuZ2V0U3RhdGUoKSwgaW5Db21wLnBDb25uJCk7XG4gICAgICAgIGFkZFByb3BzID0gaW5Db21wLnBDb25uJC5yZXNvbHZlQ29uZmlnUHJvcHMocHJvcHNUb0FkZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcFByb3BzID0gaW5Db21wLnBDb25uJC5nZXRDb25maWdQcm9wcygpO1xuXG4gICAgLy8gY29uc3QgY29tcG9uZW50TmFtZSA9IGluQ29tcC5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21tZW50IGlzIGZyb20gdGhlIE5lYnVsYS9Db25zdGVsbGF0aW9uIHZlcnNpb24gb2YgdGhpcyBjb2RlLiBNZWFudCBhcyBhIHJlbWluZGVyIHRvIGNoZWNrIHRoaXMgb2NjYXNpb25hbGx5XG4gICAgLy8gcG9wdWxhdGUgYWRkaXRpb25hbCBwcm9wcyB3aGljaCBhcmUgY29tcG9uZW50IHNwZWNpZmljIGFuZCBub3QgcHJlc2VudCBpbiBjb25maWd1cmF0aW9uc1xuICAgIC8vIFRoaXMgYmxvY2sgY2FuIGJlIHJlbW92ZWQgb25jZSBhbGwgdGhlc2UgcHJvcHMgd2lsbCBiZSBhZGRlZCBhcyBwYXJ0IG9mIGNvbmZpZ3NcbiAgICBpbkNvbXAucENvbm4kLnBvcHVsYXRlQWRkaXRpb25hbFByb3BzKGNvbXBQcm9wcyk7XG5cbiAgICBjb21wUHJvcHMgPSBpbkNvbXAucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyhjb21wUHJvcHMpO1xuXG4gICAgaWYgKGNvbXBQcm9wcyAmJiB1bmRlZmluZWQgIT09IGNvbXBQcm9wcy52YWxpZGF0ZW1lc3NhZ2UgJiYgY29tcFByb3BzLnZhbGlkYXRlbWVzc2FnZSAhPSAnJykge1xuICAgICAgLy8gY29uc29sZS5sb2coIGAgICB2YWxpZGF0ZW1lc3NhZ2UgZm9yICR7aW5Db21wLmNvbnN0cnVjdG9yLm5hbWV9ICR7aW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEuY29tcElEfTogJHtjb21wUHJvcHMudmFsaWRhdGVtZXNzYWdlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wUHJvcHMsXG4gICAgICAuLi5hZGRQcm9wc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdW5pcXVlIGlkIGZvciBnaXZlbiBjb21wb25lbnQgY3JlYXRlZCB3aGVuIHJlZ2lzdGVyaW5nXG4gICAqIE90aGVyd2lzZSwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IHdob3NlIHByb3BlcnR5IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb21wb25lbnRJRChpbkNvbXApOiBzdHJpbmcge1xuICAgIHJldHVybiBpbkNvbXAuYnJpZGdlQ29tcG9uZW50SUQgfHwgaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEuY29tcElEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHJlcXVlc3RlZCBwcm9wZXJ0eSBmb3IgdGhlIGNvbXBvbmVudCBpZiBpdCBleGlzdHMuXG4gICAqIE90aGVyd2lzZSwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IHdob3NlIHByb3BlcnR5IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICogQHBhcmFtIGluUHJvcCBUaGUgcHJvcGVydHkgYmVpbmcgcmVxdWVzdGVkLlxuICAgKi9cbiAgcHVibGljIGdldENvbXBvbmVudFByb3AoaW5Db21wOiBhbnkgPSBudWxsLCBpblByb3AgPSAnJykge1xuICAgIGlmIChpbkNvbXAgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogZ2V0Q29tcG9uZW50UHJvcCBjYWxsZWQgd2l0aCBiYWQgY29tcG9uZW50OiAke2luQ29tcH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wSUQgPSBpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YS5jb21wSUQ7XG5cbiAgICAvLyBMb29rIHVwIHByb3BlcnR5IGluIHRoZSBjb21wb25lbnQncyBlbnRyeSBpbiBjb21wb25lbnRQcm9wQXJyYXkgKHdoaWNoIHNob3VsZCBoYXZlIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSlcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRQcm9wc0Fycltjb21wSURdW2luUHJvcF07XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgY29tcGxldGUgc2V0IG9mIHJlc29sdmVkIHByb3BlcnRpZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoXG4gICAqIHRoaXMgY29tcG9uZW50LlxuICAgKiBUaGlzIGlzIHRoZSBmdWxsIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIHRyYWNrZWQgaW4gUmVkdXggZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGdldEN1cnJlbnRDb21wbGV0ZVByb3BzKGluQ29tcDogYW55ID0gbnVsbCkge1xuICAgIGlmIChpbkNvbXAgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogZ2V0Q3VycmVudENvbXBsZXRlUHJvcHMgY2FsbGVkIHdpdGggYmFkIGNvbXBvbmVudDogJHtpbkNvbXB9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFByb3BzQXJyW2luQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhLmNvbXBJRF07XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBjb21wb25lbnQgYW5kIGl0cyBjYWxsYmFjayBmdW5jdGlvbi4gV2hlbiBhIGNvbXBvbmVudCBjYWxscyB0aGlzIG1ldGhvZFxuICAgKiAodHlwaWNhbGx5IGZyb20gaXRzIG5nT25Jbml0KSwgdGhlIGNvbXBvbmVudCBpcyBnaXZlbiBhIHVuaXF1ZSBjb21wb25lbnRJRCAoZm9yIHRoaXMgc2Vzc2lvbilcbiAgICogYW5kIHN1YnNjcmliZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgc3RvcmUuIEFzIGEgc2lkZSBlZmZlY3QsIGl0IGFsc28gYXNzaWducyB0aGUgY29tcG9uZW50J3NcbiAgICogYWN0aW9ucyAoZnJvbSBpdHMgbWV0YWRhdGEpIHRvIHRoZSBjb21wb25lbnQncyBfX19hY3Rpb25zX19fIGFuZCBiaW5kcyB0aGUgY29tcG9uZW50J3MgY2FsbGJhY2tcbiAgICogKHBhc3NlZCBpbiBhcyBfX19pbkNhbGxiYWNrX19fKSB0byB0aGUgY29tcG9uZW50LiBJZiBhIHByb2JsZW0gaXMgZW5jb3VudGVyZWQsIGFuIGVtcHR5IG9iamVjdCxcbiAgICoge30sIGlzIHJldHVybmVkLlxuICAgKiBAcGFyYW0gaW5Db21wIFRoZSBjb21wb25lbnQgYmVpbmcgcmVnaXN0ZXJlZCBhbmQgc3Vic2NyaWJlZFxuICAgKiBAcGFyYW0gaW5DYWxsYmFjayBUaGUgY29tcG9uZW50J3MgY2FsbGJhY2sgZnVuY3Rpb24gKHR5cGljYWxseSBjYWxsZWQgb25TdGF0ZUNoYW5nZSkgdGhhdFxuICAgKiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgc3RhdGUgY2hhbmdlcy5cbiAgICogQHJldHVybnMgQSBKU09OIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czpcbiAgICogY29tcElEOiB0aGUgdW5pcXVlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudCxcbiAgICogdW5zdWJzY3JpYmVGbjogdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgbmVlZHMgdG8gdW5zdWJzY3JpYmUgZnJvbSB0aGUgc3RvcmUsXG4gICAqIHZhbGlkYXRlTWVzc2FnZTogYW55IHZhbGlkYXRpb24vZXJyb3IgbWVzc2FnZSB0aGF0IGdldHMgZ2VuZXJhdGVkIGZvciB0aGlzIG9iamVjdCxcbiAgICogYWN0aW9uczogYW55IGFjdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCBmb3IgdGhpcyBvYmplY3RcbiAgICovXG4gIHJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KGluQ29tcCwgaW5DYWxsYmFjazogRnVuY3Rpb24gfCBudWxsID0gbnVsbCk6IEFuZ3VsYXJQQ29ubmVjdERhdGEge1xuICAgIC8vIENyZWF0ZSBhbiBpbml0aWFsIG9iamVjdCB0byBiZSByZXR1cm5lZC5cbiAgICBjb25zdCByZXR1cm5PYmplY3Q6IEFuZ3VsYXJQQ29ubmVjdERhdGEgPSB7XG4gICAgICBjb21wSUQ6ICcnLFxuICAgICAgdW5zdWJzY3JpYmVGbjogdW5kZWZpbmVkLFxuICAgICAgdmFsaWRhdGVNZXNzYWdlOiAnJyxcbiAgICAgIGFjdGlvbnM6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICBpZiAoaW5Db21wID09PSBudWxsIHx8IGluQ2FsbGJhY2sgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gcmVnaXN0ZXJBbmRTdWJzY3JpYmU6IGluQ29tcDogJHtpbkNvbXB9IGluQ2FsbGJhY2s6ICR7aW5DYWxsYmFja31gKTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcFR5cGUgPSBpbkNvbXAuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGlmIChBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLmJMb2dnaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhgcmVnaXN0ZXJBbmRTdWJzY3JpYmVDb21wb25lbnQ6ICR7Y29tcFR5cGV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHVuZGVmaW5lZCAhPT0gaW5Db21wLmJyaWRnZUNvbXBvbmVudElEKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBPTEQgU0NIT09MOiAke2NvbXBUeXBlfWApO1xuICAgIH1cblxuICAgIGlmICh1bmRlZmluZWQgPT09IGluQ29tcC5hY3Rpb25zICYmIHVuZGVmaW5lZCA9PT0gaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gcmVnaXN0ZXJBbmRTdWJzY3JpYmUgZnJvbSAke2NvbXBUeXBlfTogYWN0aW9ucyBub3QgZGVmaW5lZCBhcyBhIGNsYXNzIHZhcmlhYmxlIGZvciBpbkNvbXBgKTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7XG4gICAgfVxuICAgIGlmICh1bmRlZmluZWQgPT09IGluQ29tcC5icmlkZ2VDb21wb25lbnRJRCAmJiB1bmRlZmluZWQgPT09IGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgQW5ndWxhclBDb25uZWN0OiBiYWQgY2FsbCB0byByZWdpc3RlckFuZFN1YnNjcmliZSBmcm9tICR7Y29tcFR5cGV9OiBicmlkZ2VDb21wb25lbnRJRCBub3QgZGVmaW5lZCBhcyBhIGNsYXNzIHZhcmlhYmxlIGZvciBpbkNvbXBgXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdDtcbiAgICB9XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gaW5Db21wLnVuc3Vic2NyaWJlU3RvcmUgJiYgdW5kZWZpbmVkID09PSBpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gcmVnaXN0ZXJBbmRTdWJzY3JpYmUgZnJvbSAke2NvbXBUeXBlfTogdW5zdWJzY3JpYmVTdG9yZSBub3QgZGVmaW5lZCBhcyBhIGNsYXNzIHZhcmlhYmxlIGZvciBpbkNvbXBgXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdDtcbiAgICB9XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gaW5Db21wLnZhbGlkYXRlTWVzc2FnZSAmJiB1bmRlZmluZWQgPT09IGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGJhZCBjYWxsIHRvIHJlZ2lzdGVyQW5kU3Vic2NyaWJlIGZyb20gJHtjb21wVHlwZX06IHZhbGlkYXRlTWVzc2FnZSBub3QgZGVmaW5lZCBhcyBhIGNsYXNzIHZhcmlhYmxlIGZvciBpbkNvbXBgKTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gY2FsbCBwcm9jZXNzQWN0aW9ucyB0byBwb3B1bGF0ZSBtZXRhZGF0YSB3aXRoIGFjdGlvbnMgYXMgaW4gUENvbm5lY3RIT1IgaW5pdGlhbGl6ZVxuICAgIHRoaXMucHJvY2Vzc0FjdGlvbnMoaW5Db21wKTtcbiAgICBpZiAodW5kZWZpbmVkID09PSBpbkNvbXAuYWN0aW9ucykge1xuICAgICAgcmV0dXJuT2JqZWN0LmFjdGlvbnMgPSBpbkNvbXAucENvbm4kLmdldEFjdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5Db21wLmFjdGlvbnMgPSBpbkNvbXAucENvbm4kLmdldEFjdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvLyBiaW5kIHRoZSBwcm92aWRlZCBjYWxsYmFjayB0byB0aGUgY29tcG9uZW50IGl0J3MgYXNzb2NpYXRlZCB3aXRoXG4gICAgaW5DYWxsYmFjayA9IGluQ2FsbGJhY2suYmluZChpbkNvbXApO1xuXG4gICAgLy8gTm93IHByb2NlZWQgdG8gcmVnaXN0ZXIgYW5kIHN1YnNjcmliZS4uLlxuICAgIGNvbnN0IHRoZUNvbXBJRDogc3RyaW5nID0gdGhpcy5nZXROZXh0Q29tcG9uZW50SWQoKTtcbiAgICBjb25zdCB0aGVVbnN1YjogRnVuY3Rpb24gfCBudWxsID0gdGhpcy5zdWJzY3JpYmVUb1N0b3JlKGluQ29tcCwgaW5DYWxsYmFjayk7XG5cbiAgICBpZiAodW5kZWZpbmVkID09PSBpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YSkge1xuICAgICAgaW5Db21wLmJyaWRnZUNvbXBvbmVudElEID0gdGhlQ29tcElEO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5PYmplY3QuY29tcElEID0gdGhlQ29tcElEO1xuICAgICAgcmV0dXJuT2JqZWN0LnVuc3Vic2NyaWJlRm4gPSB0aGVVbnN1YjtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIHRoaXMgY29tcG9uZW50cyBlbnRyeSBpbiB0aGUgY29tcG9uZW50UHJvcHNBcnJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BzQXJyW3RoZUNvbXBJRF0gPSB7fTtcblxuICAgIC8vIHJldHVybiBvYmplY3Qgd2l0aCBjb21wSUQgYW5kIHVuc3Vic2NyaWJlLi4uXG4gICAgcmV0dXJuIHJldHVybk9iamVjdDtcbiAgfVxuXG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50J3MgZW50cnkgaW4gX19fY29tcG9uZW50UHJvcHNBcnJfX18gaXNcbiAgLy8gIHRoZSBzYW1lIGFzIHRoZSBpbkNvbXBQcm9wcyBwYXNzZWQgaW4uXG4gIC8vICBBcyBhIHNpZGUgZWZmZWN0LCB1cGRhdGUgdGhlIGNvbXBvbmVudCdzIGVudHJ5IGluIGNvbXBvbmVudFByb3BzQXJyXG4gIC8vICBOT1RFOiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGluY29taW5nIGNvbXBvbmVudCBoYXMgdGhlIGZvbGxvd2luZzpcbiAgLy8gICogYSBicmlkZ2VDb21wb25lbnRJRCA8c3RyaW5nPiBwcm9wZXJ0eSAtIHVzZWQgYXMgbG9va3VwIGtleSBpbiBjb21wb25lbnRQcm9wc0FyclxuICAvLyAgKiBhIHBDb25uJCA8Pz4gcHJvcGVydHkgLSB1c2VkIHRvIGFjY2VzcyBmdW5jdGlvbnMgYWNjZXNzZWQgaW4gZ2V0Q29tcG9uZW50UHJvcHNcbiAgLy8gUmV0dXJuIHRydWU6IG1lYW5zIHRoZSBjb21wb25lbnQgcHJvcHMgYXJlIGRpZmZlcmVudCBhbmQgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAvLyBSZXR1cm4gZmFsc2U6IG1lYW5zIHRoZSBjb21wb25lbnQgcHJvcHMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgY29tcG9uZW50IGRvZXNuJ3QgbmVlZCB0byB1cGRhdGUgKHJlLXJlbmRlcilcbiAgLy8gIE9uIGJhZCBpbnB1dCwgcmV0dXJuIGZhbHNlO1xuICAvKipcbiAgICogUmV0dXJucyAqKnRydWUqKiBpZiB0aGUgY29tcG9uZW50J3MgZW50cnkgaW4gX19fY29tcG9uZW50UHJvcHNBcnJfX18gaXNcbiAgICogdGhlIHNhbWUgYXMgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgY3VycmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBvbmVudCAoX19faW5Db21wX19fKSBwYXNzZWQgaW4uXG4gICAqIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBjb21wb25lbnQncyBlbnRyeSBpbiBfX19jb21wb25lbnRQcm9wc0Fycl9fXyBpcyB1cGRhdGVkLlxuICAgKiAqKk5vdGUqKjogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBpbmNvbWluZyBjb21wb25lbnQgaGFzIHRoZSBmb2xsb3dpbmc6XG4gICAqIChhKSBhIGJyaWRnZUNvbXBvbmVudElEIF9zdHJpbmdfIHByb3BlcnR5IHVzZWQgYXMgbG9va3VwIGtleSBpbiBfX19jb21wb25lbnRQcm9wc0Fycl9fX1xuICAgKiBhbmQgKGIpIGEgX19fcENvbm4kX19fIHByb3BlcnR5IHVzZWQgdG8gYWNjZXNzIGZ1bmN0aW9ucyBjYWxsZWQgaW4gX19fZ2V0Q29tcG9uZW50UHJvcHNfX19cbiAgICpcbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IGFza2luZyBpZiBpdCBzaG91bGQgdXBkYXRlIGl0c2VsZlxuICAgKiBAcmV0dXJucyBSZXR1cm4gKip0cnVlKio6IG1lYW5zIHRoZSBjb21wb25lbnQgcHJvcHMgYXJlIGRpZmZlcmVudCBhbmQgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKS5cbiAgICogUmV0dXJuICoqZmFsc2UqKjogbWVhbnMgdGhlIGNvbXBvbmVudCBwcm9wcyBhcmUgdGhlIHNhbWUgYW5kIHRoZSBjb21wb25lbnQgZG9lc24ndCBuZWVkIHRvIHVwZGF0ZSAocmUtcmVuZGVyKS5cbiAgICogSWYgdGhlICoqKmluQ29tcCoqKiBpbnB1dCBpcyBiYWQsIGZhbHNlIGlzIGFsc28gcmV0dXJuZWQuXG4gICAqL1xuICBzaG91bGRDb21wb25lbnRVcGRhdGUoaW5Db21wKTogYm9vbGVhbiB7XG4gICAgLy8gY29uc3QgYlNob3dMb2dnaW5nID0gZmFsc2U7XG4gICAgbGV0IGJSZXQgPSBmYWxzZTtcbiAgICAvLyBjaGVjayBmb3IgcmVhc29uYWJsZSBpbnB1dFxuICAgIGlmIChVdGlscy5pc0VtcHR5T2JqZWN0KGluQ29tcCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gc2hvdWxkQ29tcG9uZW50VXBkYXRlOiBpbkNvbXA6ICR7SlNPTi5zdHJpbmdpZnkoaW5Db21wKX1gKTtcbiAgICAgIHJldHVybiBiUmV0O1xuICAgIH1cbiAgICBpZiAodW5kZWZpbmVkID09PSBpbkNvbXAudmFsaWRhdGVNZXNzYWdlICYmIHVuZGVmaW5lZCA9PT0gaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gc2hvdWxkQ29tcG9uZW50VXBkYXRlOiAke2luQ29tcC5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgdmFsaWRhdGVNZXNzYWdlIHByb3BlcnR5LmApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBJRCA9IHRoaXMuZ2V0Q29tcG9uZW50SUQoaW5Db21wKTtcblxuICAgIGNvbnN0IGN1cnJlbnRQcm9wczogYW55ID0gdGhpcy5jb21wb25lbnRQcm9wc0Fycltjb21wSURdO1xuICAgIGNvbnN0IGN1cnJlbnRQcm9wc0FzU3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShjdXJyZW50UHJvcHMpO1xuXG4gICAgY29uc3QgaW5jb21pbmdQcm9wczogYW55ID0gdGhpcy5nZXRDb21wb25lbnRQcm9wcyhpbkNvbXApO1xuXG4gICAgLy8gaWYgaGF2ZSBwYWdlTWVzc2FnZXMsIGFuZCBpdCBpcyBibGFuaywgcmVtb3ZlIGl0LiAgVGhpcyBjYXVzZXMgaXNzdWVzIG9mIG1ha2luZyBpdCBhcHBlYXJcbiAgICAvLyB0aGF0IGEgd2lsbCBjYXVzZSBhbiB1cGRhdGUsIHdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlXG4gICAgaWYgKHRoaXMuaXNQYWdlTWVzc2FnZXNFbXB0eShpbmNvbWluZ1Byb3BzKSkge1xuICAgICAgaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEucGFnZU1lc3NhZ2VzID0gaW5jb21pbmdQcm9wcy5wYWdlTWVzc2FnZXM7XG4gICAgICBkZWxldGUgaW5jb21pbmdQcm9wcy5wYWdlTWVzc2FnZXM7XG4gICAgfVxuXG4gICAgaWYgKGluY29taW5nUHJvcHMuaHR0cE1lc3NhZ2VzKSB7XG4gICAgICBpbkNvbXAuYW5ndWxhclBDb25uZWN0RGF0YS5odHRwTWVzc2FnZXMgPSBpbmNvbWluZ1Byb3BzLmh0dHBNZXNzYWdlcztcbiAgICAgIGluY29taW5nUHJvcHMuaHR0cE1lc3NhZ2VzID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGluY29taW5nUHJvcHNBc1N0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoaW5jb21pbmdQcm9wcyk7XG5cbiAgICBiUmV0ID0gaXNFcXVhbCA/ICFpc0VxdWFsKGN1cnJlbnRQcm9wcywgaW5jb21pbmdQcm9wcykgOiBjdXJyZW50UHJvcHNBc1N0ciAhPSBpbmNvbWluZ1Byb3BzQXNTdHI7XG5cbiAgICAvLyBCZWxvdyBwaWVjZSBvZiBjb2RlIGlzIG5lZWRlZCB0byByZS1yZW5kZXIgdGhlIGNvbXBvbmVudCBzaW5jZSB3ZSB3YW5uYSBldmFsdWF0ZSB0aGUgVmlzaWJpbGl0eSBleHByZXNzaW9uIHdpdGhpbiBWaWV3IGNvbXBvbmVudCBpbiBzdWNoIGNhc2VzXG4gICAgaWYgKGluQ29tcC5wQ29ubiQubWV0YS5jb25maWcuY29udGV4dD8ubGVuZ3RoID4gMCAmJiBpbkNvbXAucENvbm4kLmdldFBhZ2VSZWZlcmVuY2UoKS5sZW5ndGggPiAnY2FzZUluZm8uY29udGVudCcubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBOb3cgdXBkYXRlIHRoZSBlbnRyeSBpbiBjb21wb25lbnRQcm9wc0FyciB3aXRoIHRoZSBpbmNvbWluZyB2YWx1ZSBzb1xuICAgIC8vICB3ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IHRoYXQgbmV4dCB0aW1lLi4uXG4gICAgdGhpcy5jb21wb25lbnRQcm9wc0Fycltjb21wSURdID0gaW5jb21pbmdQcm9wcztcbiAgICBjb25zdCB2YWxpZGF0ZW1lc3NhZ2UgPSBpbmNvbWluZ1Byb3BzLnZhbGlkYXRlbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzLnV0aWxzLmh0bWxEZWNvZGUoaW5jb21pbmdQcm9wcy52YWxpZGF0ZW1lc3NhZ2UpO1xuICAgIC8vIGFuZCB1cGRhdGUgdGhlIGNvbXBvbmVudCdzIHZhbGlkYXRpb24gbWVzc2FnZSAoaWYgdW5kZWZpbmVkLCBpdCBzaG91bGQgYmUgc2V0IHRvIFwiXCIpXG4gICAgaWYgKHVuZGVmaW5lZCAhPT0gaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEpIHtcbiAgICAgIGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhLnZhbGlkYXRlTWVzc2FnZSA9IHZhbGlkYXRlbWVzc2FnZTtcblxuICAgICAgaWYgKGluQ29tcC5hbmd1bGFyUENvbm5lY3REYXRhLnZhbGlkYXRlTWVzc2FnZSAhPSAnJykge1xuICAgICAgICAvLyBpZiBoYXZlIGEgdmFsaWRhdGUgbWVzc2FnZSwgdHVybiBvZmYgc3Bpbm5lclxuICAgICAgICBjb25zdCB0aW1lciA9IGludGVydmFsKDEwMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnBzU2VydmljZS5zZW5kTWVzc2FnZShmYWxzZSk7XG5cbiAgICAgICAgICB0aW1lci51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgc0Vycm9yTWVzc2FnZSA9IGN1cnJlbnRQcm9wcyAmJiBjdXJyZW50UHJvcHMubGFiZWwgPyBjdXJyZW50UHJvcHMubGFiZWwuY29uY2F0KCcgLSAnKSA6ICcnO1xuICAgICAgICBzRXJyb3JNZXNzYWdlID0gc0Vycm9yTWVzc2FnZS5jb25jYXQoaW5Db21wLmFuZ3VsYXJQQ29ubmVjdERhdGEudmFsaWRhdGVNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5lclNlcnZpY2Uuc2VuZE1lc3NhZ2UoJ3VwZGF0ZScsIHNFcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbkNvbXAudmFsaWRhdGVNZXNzYWdlID0gdmFsaWRhdGVtZXNzYWdlO1xuICAgIH1cblxuICAgIGlmIChiUmV0ICYmIGNvbXBJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBiUmV0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coIGBBbmd1bGFyUENvbm5lY3QgY29tcG9uZW50ICR7Y29tcElEfSAtICR7aW5Db21wLmNvbnN0cnVjdG9yLm5hbWV9IC0gc2hvdWxkQ29tcG9uZW50VXBkYXRlOiAke2JSZXR9YCk7XG4gICAgLy8gY29uc29sZS5sb2coXCJjdXJyZW50IHByb3BzOiBcIiArIGN1cnJlbnRQcm9wc0FzU3RyKTtcblxuICAgIGlmIChiUmV0KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgKioqKiBjaGFuZ2UgZm9yOiAke2luQ29tcC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgLy8gY29uc29sZS5sb2coXCJjdXJyZW50IHByb3BzOiBcIiArIGN1cnJlbnRQcm9wc0FzU3RyKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiaW5jb21pbmcgcHJvcHM6IFwiICsgaW5jb21pbmdQcm9wc0FzU3RyKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGAgICAgJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX06IHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5pbmc6ICR7YlJldH0sIGNvbXBJZDogJHtjb21wSUR9YCApO1xuICAgICAgLy8gY29uc29sZS5sb2coIGAgICAgVXBkYXRpbmcgd2l0aCBjb21wb25lbnRQcm9wcyBmb3IgJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX06ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5jb21wb25lbnRQcm9wc0Fycltjb21wSURdKX1gKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCBgICAgICAgICAgIGFuZCB2YWxpZGF0ZU1lc3NhZ2U6ICR7aW5Db21wLnZhbGlkYXRlTWVzc2FnZX1gKTtcbiAgICB9XG4gICAgLy8gZWxzZSBpZiAoaW5Db21wLmNvbnN0cnVjdG9yLm5hbWUuaW5kZXhPZihcIlZpZXdcIikgPj0gMCB8fCBpbkNvbXAuY29uc3RydWN0b3IubmFtZS5pbmRleE9mKFwiUm9vdFwiKSA+PSAwKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhcIm5vIGNoYW5nZVwiKTtcbiAgICAvLyAgIGNvbnNvbGUubG9nKFwiY3VycmVudCBwcm9wczogXCIgKyBjdXJyZW50UHJvcHNBc1N0cik7XG4gICAgLy8gICBjb25zb2xlLmxvZyhcImluY29taW5nIHByb3BzOiBcIiArIGluY29taW5nUHJvcHNBc1N0cik7XG4gICAgLy8gICBjb25zb2xlLmxvZyhgICAgICR7aW5Db21wLmNvbnN0cnVjdG9yLm5hbWV9OiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuaW5nOiAke2JSZXR9LCBjb21wSWQ6ICR7Y29tcElEfWAgKTtcblxuICAgIC8vIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKGAgICAgJHtpbkNvbXAuY29uc3RydWN0b3IubmFtZX06IHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5pbmc6ICR7YlJldH1gKTtcblxuICAgIHJldHVybiBiUmV0O1xuICB9XG5cbiAgaXNQYWdlTWVzc2FnZXNFbXB0eShpbmNvbWluZ1Byb3BzKSB7XG4gICAgcmV0dXJuIGluY29taW5nUHJvcHMucGFnZU1lc3NhZ2VzICYmIGluY29taW5nUHJvcHMucGFnZU1lc3NhZ2VzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW4gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgZW5jb3VudGVyZWQgYSBjaGFuZ2UgZXZlbnRcbiAgICogQHBhcmFtIGluQ29tcCBUaGUgY29tcG9uZW50IGNhbGxpbmcgdGhlIGNoYW5nZSBldmVudFxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50XG4gICAqL1xuICBjaGFuZ2VIYW5kbGVyKGluQ29tcCwgZXZlbnQpIHtcbiAgICBjb25zdCBiTG9nZ2luZyA9IGZhbHNlO1xuICAgIGlmIChiTG9nZ2luZykge1xuICAgICAgLy8gY29uc29sZS5sb2coYEFuZ3VsYXJQQ29ubmVjdC5jaGFuZ2VIYW5kbGVyYCk7XG4gICAgfVxuICAgIC8vIGNoZWNrIGZvciByZWFzb25hYmxlIGlucHV0XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gaW5Db21wIHx8IFV0aWxzLmlzRW1wdHlPYmplY3QoaW5Db21wKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgQW5ndWxhclBDb25uZWN0OiBiYWQgY2FsbCB0byBjaGFuZ2VIYW5kbGVyOiBpbkNvbXA6ICR7SlNPTi5zdHJpbmdpZnkoaW5Db21wKX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwQ29ubmVjdCA9IGluQ29tcC5wQ29ubiQ7XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gcENvbm5lY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFuZ3VsYXJQQ29ubmVjdDogYmFkIGNhbGwgdG8gY2hhbmdlSGFuZGxlcjogaW5Db21wLnBDb25uJDogJHtwQ29ubmVjdH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjbGVhciBvdXQgZXJyb3JzXG4gICAgdGhpcy5lclNlcnZpY2Uuc2VuZE1lc3NhZ2UoJ2Rpc21pc3MnLCAnJyk7XG5cbiAgICBwQ29ubmVjdC5nZXRBY3Rpb25zQXBpKCkuY2hhbmdlSGFuZGxlcihwQ29ubmVjdCwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBlbmNvdW50ZXJlZCBhbiBldmVudCAoc3VjaCBhcyBibHVyKVxuICAgKiBAcGFyYW0gaW5Db21wIFRoZSBjb21wb25lbnQgY2FsbGluZyB0aGUgZXZlbnRcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudFxuICAgKi9cbiAgZXZlbnRIYW5kbGVyKGluQ29tcCwgZXZlbnQpIHtcbiAgICBjb25zdCBiTG9nZ2luZyA9IGZhbHNlO1xuICAgIGlmIChiTG9nZ2luZykge1xuICAgICAgLy8gY29uc29sZS5sb2coYEFuZ3VsYXJQQ29ubmVjdC5ldmVudEhhbmRsZXJgKTtcbiAgICB9XG4gICAgLy8gY2hlY2sgZm9yIHJlYXNvbmFibGUgaW5wdXRcbiAgICBpZiAodW5kZWZpbmVkID09PSBpbkNvbXAgfHwgVXRpbHMuaXNFbXB0eU9iamVjdChpbkNvbXApKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGJhZCBjYWxsIHRvIGV2ZW50SGFuZGxlcjogaW5Db21wOiAke0pTT04uc3RyaW5naWZ5KGluQ29tcCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcENvbm5lY3QgPSBpbkNvbXAucENvbm4kO1xuICAgIGlmICh1bmRlZmluZWQgPT09IHBDb25uZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGJhZCBjYWxsIHRvIGV2ZW50SGFuZGxlcjogaW5Db21wLnBDb25uJDogJHtwQ29ubmVjdH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwQ29ubmVjdC5nZXRBY3Rpb25zQXBpKCkuZXZlbnRIYW5kbGVyKHBDb25uZWN0LCBldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgQSBoYW5kbGUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgc3RvcmVcbiAgICovXG4gIGdldFN0b3JlKCkge1xuICAgIGlmICh0aGlzLnRoZVN0b3JlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnRoZVN0b3JlID0gUENvcmUuZ2V0U3RvcmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGhlU3RvcmU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGJMb2dNc2cgSWYgdHJ1ZSwgd2lsbCB3cml0ZSB0aGUgc3RyaW5naWZpZWQgc3RhdGUgdG8gdGhlIHN0b3JlIGZvciBkZWJ1Z2dpbmcvaW5zcGVjdGlvblxuICAgKiBAcGFyYW0gaW5Db21wIElmIHN1cHBsaWVkLCB0aGUgY29tcG9uZW50IHRoYXQgaXMgcmVxdWVzdGluZyB0aGUgc3RvcmUncyBzdGF0ZVxuICAgKiBAcmV0dXJucyBBIGhhbmRsZSB0byB0aGUgX19zdGF0ZV9fIG9mIGFwcGxpY2F0aW9uJ3Mgc3RvcmVcbiAgICovXG4gIGdldFN0YXRlKGJMb2dNc2c6IGJvb2xlYW4gPSBmYWxzZSwgaW5Db21wOiBhbnkgPSBudWxsKSB7XG4gICAgY29uc3QgdGhlU3RhdGU6IG9iamVjdCA9IHRoaXMuZ2V0U3RvcmUoKS5nZXRTdGF0ZSgpO1xuICAgIGlmIChiTG9nTXNnKSB7XG4gICAgICBjb25zdCB0aGVDb21wTmFtZTogc3RyaW5nID0gaW5Db21wID8gYCR7aW5Db21wLmNvbnN0cnVjdG9yLm5hbWV9OiBgIDogJyc7XG4gICAgICBjb25zb2xlLmxvZyhgJHt0aGVDb21wTmFtZX0gU3RvcmUgc3RhdGU6ICR7SlNPTi5zdHJpbmdpZnkodGhlU3RhdGUpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhlU3RhdGU7XG4gIH1cblxuICAvLyBwcm9jZXNzQWN0aW9ucyAtIGNhcnJpZWQgb3ZlciBmcm9tIFBDb25uZWN0SE9DIGluaXRpYWxpemVcbiAgLyoqXG4gICAqICBwcm9jZXNzQWN0aW9ucyBleHBvc2VzIGFsbCBhY3Rpb25zIGluIHRoZSBtZXRhZGF0YS5cbiAgICogIEF0dGFjaGVzIGNvbW1vbiBoYW5kbGVyIChldmVudEhhbmRsZXIpIGZvciBhbGwgYWN0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc0FjdGlvbnMoaW5Db21wKSB7XG4gICAgY29uc3QgcENvbm5lY3QgPSBpbkNvbXAucENvbm4kO1xuICAgIGlmICh1bmRlZmluZWQgPT09IHBDb25uZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBbmd1bGFyUENvbm5lY3Q6IGJhZCBjYWxsIHRvIHByb2Nlc3NBY3Rpb25zOiBwQ29ubiQ6ICR7cENvbm5lY3R9IGZyb20gY29tcG9uZW50OiAke2luQ29tcC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbkNvbXAucENvbm4kLmlzRWRpdGFibGUoKSkge1xuICAgICAgaW5Db21wLnBDb25uJC5zZXRBY3Rpb24oJ29uQ2hhbmdlJywgdGhpcy5jaGFuZ2VIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgaW5Db21wLnBDb25uJC5zZXRBY3Rpb24oJ29uQmx1cicsIHRoaXMuZXZlbnRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxufVxuIl19
|