@alfresco/aca-content 5.1.1 → 5.2.0
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/assets/app.extensions.json +9 -0
- package/assets/i18n/ar.json +600 -599
- package/assets/i18n/cs.json +600 -599
- package/assets/i18n/da.json +600 -599
- package/assets/i18n/de.json +600 -599
- package/assets/i18n/en.json +40 -1
- package/assets/i18n/es.json +600 -599
- package/assets/i18n/fi.json +600 -599
- package/assets/i18n/fr.json +600 -599
- package/assets/i18n/it.json +600 -599
- package/assets/i18n/ja.json +600 -599
- package/assets/i18n/nb.json +600 -599
- package/assets/i18n/nl.json +600 -599
- package/assets/i18n/pl.json +600 -599
- package/assets/i18n/pt-BR.json +600 -599
- package/assets/i18n/ru.json +600 -599
- package/assets/i18n/sv.json +600 -599
- package/assets/i18n/zh-CN.json +600 -599
- package/esm2022/about/about.component.mjs +70 -0
- package/esm2022/about/aca-about.module.mjs +47 -0
- package/esm2022/folder-rules/folder-rules.module.mjs +116 -0
- package/esm2022/folder-rules/manage-rules/manage-rules.smart-component.mjs +280 -0
- package/esm2022/folder-rules/rule-details/actions/rule-action-list.ui-component.mjs +117 -0
- package/esm2022/folder-rules/rule-details/actions/rule-action.ui-component.mjs +359 -0
- package/esm2022/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.mjs +171 -0
- package/esm2022/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.mjs +237 -0
- package/esm2022/folder-rules/rule-details/edit-rule-dialog.ui-component.mjs +80 -0
- package/esm2022/folder-rules/rule-details/options/rule-options.ui-component.mjs +129 -0
- package/esm2022/folder-rules/rule-details/rule-details.ui-component.mjs +192 -0
- package/esm2022/folder-rules/rule-details/triggers/rule-triggers.ui-component.mjs +87 -0
- package/esm2022/folder-rules/rule-details/validators/rule-actions.validator.mjs +36 -0
- package/esm2022/folder-rules/rule-list/rule-list/rule-list.ui-component.mjs +166 -0
- package/esm2022/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.mjs +80 -0
- package/esm2022/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.mjs +59 -0
- package/esm2022/folder-rules/rule-set-picker/rule-set-picker.smart-component.mjs +125 -0
- package/esm2022/folder-rules/services/actions.service.mjs +117 -0
- package/esm2022/folder-rules/services/folder-rule-sets.service.mjs +230 -0
- package/esm2022/folder-rules/services/folder-rules.service.mjs +195 -0
- package/esm2022/lib/aca-content.module.mjs +303 -0
- package/esm2022/lib/aca-content.routes.mjs +369 -0
- package/esm2022/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.mjs +82 -0
- package/{esm2020 → esm2022}/lib/components/common/language-picker/language-picker.component.mjs +9 -8
- package/esm2022/lib/components/common/location-link/location-link.component.mjs +182 -0
- package/{esm2020 → esm2022}/lib/components/common/logout/logout.component.mjs +8 -6
- package/esm2022/lib/components/common/toggle-shared/toggle-shared.component.mjs +81 -0
- package/esm2022/lib/components/common/user-info/user-info.component.mjs +46 -0
- package/esm2022/lib/components/context-menu/base-context-menu.directive.mjs +77 -0
- package/esm2022/lib/components/context-menu/context-menu-item.component.mjs +65 -0
- package/esm2022/lib/components/context-menu/context-menu-outside-event.directive.mjs +62 -0
- package/esm2022/lib/components/context-menu/context-menu-overlay.mjs +33 -0
- package/esm2022/lib/components/context-menu/context-menu.component.mjs +84 -0
- package/esm2022/lib/components/context-menu/context-menu.service.mjs +127 -0
- package/esm2022/lib/components/context-menu/custom-context-menu-actions.token.mjs +26 -0
- package/esm2022/lib/components/context-menu/custom-context-menu.component.mjs +79 -0
- package/esm2022/lib/components/details/details.component.mjs +154 -0
- package/esm2022/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.mjs +75 -0
- package/esm2022/lib/components/dl-custom-components/name-column/name-column.component.mjs +106 -0
- package/esm2022/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +52 -0
- package/esm2022/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +77 -0
- package/esm2022/lib/components/favorite-libraries/favorite-libraries.component.mjs +126 -0
- package/esm2022/lib/components/favorites/favorites.component.mjs +105 -0
- package/esm2022/lib/components/files/files.component.mjs +336 -0
- package/esm2022/lib/components/home/home.component.mjs +46 -0
- package/esm2022/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +62 -0
- package/esm2022/lib/components/info-drawer/info.drawer.module.mjs +74 -0
- package/esm2022/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +213 -0
- package/esm2022/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +47 -0
- package/esm2022/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +145 -0
- package/esm2022/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +107 -0
- package/esm2022/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.mjs +135 -0
- package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.mjs +181 -0
- package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.mjs +77 -0
- package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.mjs +210 -0
- package/esm2022/lib/components/libraries/libraries.component.mjs +81 -0
- package/esm2022/lib/components/recent-files/recent-files.component.mjs +80 -0
- package/esm2022/lib/components/search/search-action-menu/search-action-menu.component.mjs +66 -0
- package/esm2022/lib/components/search/search-input/search-input.component.mjs +297 -0
- package/esm2022/lib/components/search/search-input-control/search-input-control.component.mjs +94 -0
- package/esm2022/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +93 -0
- package/esm2022/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +155 -0
- package/esm2022/lib/components/search/search-navigation.service.mjs +62 -0
- package/esm2022/lib/components/search/search-results/search-results.component.mjs +279 -0
- package/esm2022/lib/components/search/search-results-row/search-results-row.component.mjs +149 -0
- package/esm2022/lib/components/search/search-save/dialog/delete/saved-search-delete-dialog.component.mjs +82 -0
- package/esm2022/lib/components/search/search-save/dialog/edit/saved-search-edit-dialog.component.mjs +116 -0
- package/esm2022/lib/components/search/search-save/dialog/save-search-dialog.component.mjs +125 -0
- package/esm2022/lib/components/search/search-save/dialog/saved-search-form.interface.mjs +25 -0
- package/esm2022/lib/components/search/search-save/dialog/unique-search-name-validator.mjs +45 -0
- package/esm2022/lib/components/search/search-save/directive/save-search.directive.mjs +64 -0
- package/esm2022/lib/components/search/search-save/list/saved-searches-list-ui.service.mjs +51 -0
- package/esm2022/lib/components/search/search-save/list/smart-list/saved-searches-list-schema.mjs +44 -0
- package/esm2022/lib/components/search/search-save/list/smart-list/saved-searches-smart-list.component.mjs +50 -0
- package/esm2022/lib/components/search/search-save/list/ui-list/saved-searches-list.ui-component.mjs +153 -0
- package/esm2022/lib/components/search/search-save/sidenav/save-search-sidenav.component.mjs +94 -0
- package/esm2022/lib/components/shared-files/shared-files.component.mjs +85 -0
- package/esm2022/lib/components/shared-link-view/shared-link-view.component.mjs +89 -0
- package/esm2022/lib/components/sidenav/components/button-menu.component.mjs +66 -0
- package/esm2022/lib/components/sidenav/components/expand-menu.component.mjs +73 -0
- package/esm2022/lib/components/sidenav/components/sidenav-header.component.mjs +65 -0
- package/esm2022/lib/components/sidenav/directives/action.directive.mjs +86 -0
- package/esm2022/lib/components/sidenav/directives/active-link.directive.mjs +100 -0
- package/esm2022/lib/components/sidenav/directives/expansion-panel.directive.mjs +107 -0
- package/esm2022/lib/components/sidenav/directives/menu-panel.directive.mjs +103 -0
- package/esm2022/lib/components/sidenav/sidenav.component.mjs +101 -0
- package/esm2022/lib/components/sidenav/user-menu/user-menu.component.mjs +57 -0
- package/esm2022/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +143 -0
- package/esm2022/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +91 -0
- package/esm2022/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +112 -0
- package/esm2022/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +77 -0
- package/esm2022/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +107 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/toggle-join-library/toggle-join-library-menu.component.mjs +7 -6
- package/esm2022/lib/components/toolbar/view-node/view-node.component.mjs +128 -0
- package/esm2022/lib/components/trashcan/trashcan.component.mjs +66 -0
- package/esm2022/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +55 -0
- package/esm2022/lib/components/view-profile/view-profile.component.mjs +200 -0
- package/esm2022/lib/dialogs/node-template/create-from-template.dialog.mjs +127 -0
- package/esm2022/lib/directives/document-list.directive.mjs +207 -0
- package/esm2022/lib/extensions/core.extensions.module.mjs +56 -0
- package/esm2022/lib/services/content-management.service.mjs +892 -0
- package/esm2022/lib/services/content-url.service.mjs +74 -0
- package/esm2022/lib/services/modal-ai.service.mjs +65 -0
- package/esm2022/lib/services/node-actions.service.mjs +609 -0
- package/esm2022/lib/services/node-template.service.mjs +145 -0
- package/esm2022/lib/services/search-ai-navigation.service.mjs +63 -0
- package/esm2022/lib/store/app-store.module.mjs +101 -0
- package/esm2022/lib/store/effects/app.effects.mjs +46 -0
- package/esm2022/lib/store/effects/contextmenu.effects.mjs +65 -0
- package/esm2022/lib/store/effects/download.effects.mjs +153 -0
- package/esm2022/lib/store/effects/favorite.effects.mjs +72 -0
- package/esm2022/lib/store/effects/library.effects.mjs +108 -0
- package/esm2022/lib/store/effects/node.effects.mjs +318 -0
- package/esm2022/lib/store/effects/search-ai.effects.mjs +54 -0
- package/esm2022/lib/store/effects/search.effects.mjs +52 -0
- package/esm2022/lib/store/effects/template.effects.mjs +116 -0
- package/esm2022/lib/store/effects/upload.effects.mjs +166 -0
- package/esm2022/lib/store/effects/viewer.effects.mjs +169 -0
- package/esm2022/lib/utils/aca-search-utils.mjs +129 -0
- package/esm2022/ms-office/actions/aos.actions.mjs +32 -0
- package/esm2022/ms-office/aos-extension.module.mjs +53 -0
- package/esm2022/ms-office/aos-extension.service.mjs +136 -0
- package/esm2022/ms-office/effects/aos.effects.mjs +45 -0
- package/esm2022/public-api.mjs +33 -0
- package/esm2022/viewer/lib/components/preview/preview.component.mjs +246 -0
- package/esm2022/viewer/lib/components/viewer/viewer.component.mjs +261 -0
- package/esm2022/viewer/lib/services/viewer.service.mjs +229 -0
- package/esm2022/viewer/lib/viewer.module.mjs +53 -0
- package/{fesm2015 → fesm2022}/alfresco-aca-content-about.mjs +17 -19
- package/fesm2022/alfresco-aca-content-about.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/alfresco-aca-content-folder-rules.mjs +357 -316
- package/fesm2022/alfresco-aca-content-folder-rules.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/alfresco-aca-content-ms-office.mjs +28 -26
- package/fesm2022/alfresco-aca-content-ms-office.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/alfresco-aca-content-viewer.mjs +95 -64
- package/fesm2022/alfresco-aca-content-viewer.mjs.map +1 -0
- package/fesm2022/alfresco-aca-content.mjs +11091 -0
- package/fesm2022/alfresco-aca-content.mjs.map +1 -0
- package/folder-rules/rule-details/actions/rule-action-list.ui-component.d.ts +1 -1
- package/folder-rules/rule-details/actions/rule-action.ui-component.d.ts +1 -1
- package/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.d.ts +1 -1
- package/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.d.ts +1 -1
- package/folder-rules/rule-details/options/rule-options.ui-component.d.ts +1 -1
- package/folder-rules/rule-details/rule-details.ui-component.d.ts +1 -1
- package/folder-rules/rule-list/rule-list/rule-list.ui-component.d.ts +1 -1
- package/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.d.ts +1 -1
- package/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.d.ts +1 -1
- package/folder-rules/services/folder-rule-sets.service.d.ts +4 -4
- package/folder-rules/services/folder-rules.service.d.ts +1 -1
- package/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.d.ts +5 -10
- package/lib/components/common/location-link/location-link.component.d.ts +1 -1
- package/lib/components/common/toggle-shared/toggle-shared.component.d.ts +1 -1
- package/lib/components/context-menu/base-context-menu.directive.d.ts +20 -0
- package/lib/components/context-menu/context-menu-item.component.d.ts +1 -1
- package/lib/components/context-menu/context-menu-outside-event.directive.d.ts +1 -1
- package/lib/components/context-menu/context-menu.component.d.ts +4 -15
- package/lib/components/context-menu/context-menu.service.d.ts +4 -1
- package/lib/components/{knowledge-retrieval/search-ai/search-ai-utils.d.ts → context-menu/custom-context-menu-actions.token.d.ts} +2 -2
- package/lib/components/context-menu/custom-context-menu.component.d.ts +36 -0
- package/lib/components/details/details.component.d.ts +1 -1
- package/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.d.ts +1 -1
- package/lib/components/dl-custom-components/tags-column/tags-column.component.d.ts +1 -1
- package/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.d.ts +1 -1
- package/lib/components/info-drawer/comments-tab/comments-tab.component.d.ts +1 -1
- package/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.d.ts +1 -1
- package/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.d.ts +1 -1
- package/lib/components/info-drawer/metadata-tab/metadata-tab.component.d.ts +1 -1
- package/lib/components/info-drawer/versions-tab/versions-tab.component.d.ts +1 -1
- package/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.d.ts +1 -2
- package/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.d.ts +4 -5
- package/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.d.ts +8 -8
- package/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.d.ts +2 -3
- package/lib/components/search/search-input/search-input.component.d.ts +12 -14
- package/lib/components/search/search-input-control/search-input-control.component.d.ts +1 -1
- package/lib/components/search/search-libraries-results/search-libraries-results.component.d.ts +0 -1
- package/lib/components/search/search-results/search-results.component.d.ts +15 -9
- package/lib/components/search/search-results-row/search-results-row.component.d.ts +1 -1
- package/lib/components/search/search-save/dialog/delete/saved-search-delete-dialog.component.d.ts +16 -0
- package/lib/components/search/search-save/dialog/edit/saved-search-edit-dialog.component.d.ts +22 -0
- package/lib/components/search/search-save/dialog/save-search-dialog.component.d.ts +23 -0
- package/lib/components/search/search-save/dialog/saved-search-form.interface.d.ts +28 -0
- package/lib/components/search/search-save/dialog/unique-search-name-validator.d.ts +34 -0
- package/lib/components/search/search-save/directive/save-search.directive.d.ts +13 -0
- package/lib/components/search/search-save/list/saved-searches-list-ui.service.d.ts +9 -0
- package/lib/components/search/search-save/list/smart-list/saved-searches-list-schema.d.ts +33 -0
- package/lib/components/search/search-save/list/smart-list/saved-searches-smart-list.component.d.ts +13 -0
- package/lib/components/search/search-save/list/ui-list/saved-searches-list.ui-component.d.ts +66 -0
- package/lib/components/search/search-save/sidenav/save-search-sidenav.component.d.ts +44 -0
- package/lib/components/sidenav/components/button-menu.component.d.ts +1 -1
- package/lib/components/sidenav/components/expand-menu.component.d.ts +3 -2
- package/lib/components/sidenav/directives/action.directive.d.ts +28 -1
- package/lib/components/sidenav/directives/active-link.directive.d.ts +2 -2
- package/lib/components/sidenav/directives/expansion-panel.directive.d.ts +1 -1
- package/lib/components/sidenav/directives/menu-panel.directive.d.ts +1 -1
- package/lib/components/sidenav/sidenav.component.d.ts +4 -3
- package/lib/components/sidenav/user-menu/user-menu.component.d.ts +1 -1
- package/lib/components/toolbar/toggle-favorite/toggle-favorite.component.d.ts +1 -1
- package/lib/components/toolbar/view-node/view-node.component.d.ts +1 -1
- package/lib/services/search-ai-navigation.service.d.ts +4 -2
- package/lib/store/effects/app.effects.d.ts +2 -3
- package/lib/store/effects/contextmenu.effects.d.ts +3 -3
- package/lib/store/effects/download.effects.d.ts +0 -30
- package/lib/store/effects/favorite.effects.d.ts +0 -28
- package/lib/store/effects/library.effects.d.ts +2 -7
- package/lib/store/effects/node.effects.d.ts +7 -38
- package/lib/store/effects/search-ai.effects.d.ts +0 -4
- package/lib/store/effects/search.effects.d.ts +3 -30
- package/lib/store/effects/template.effects.d.ts +5 -7
- package/lib/store/effects/upload.effects.d.ts +8 -32
- package/lib/store/effects/viewer.effects.d.ts +0 -29
- package/lib/utils/aca-search-utils.d.ts +67 -0
- package/ms-office/effects/aos.effects.d.ts +0 -3
- package/package.json +21 -35
- package/public-api.d.ts +1 -0
- package/ui/overrides/adf-pagination.theme.scss +0 -4
- package/ui/theme.scss +9 -4
- package/assets/images/agent-avatar-blue.png +0 -0
- package/assets/images/agent-avatar-gold.png +0 -0
- package/assets/images/agent-avatar-pink.png +0 -0
- package/esm2020/about/about.component.mjs +0 -71
- package/esm2020/about/aca-about.module.mjs +0 -46
- package/esm2020/folder-rules/folder-rules.module.mjs +0 -115
- package/esm2020/folder-rules/manage-rules/manage-rules.smart-component.mjs +0 -261
- package/esm2020/folder-rules/rule-details/actions/rule-action-list.ui-component.mjs +0 -117
- package/esm2020/folder-rules/rule-details/actions/rule-action.ui-component.mjs +0 -351
- package/esm2020/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.mjs +0 -172
- package/esm2020/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.mjs +0 -234
- package/esm2020/folder-rules/rule-details/edit-rule-dialog.ui-component.mjs +0 -74
- package/esm2020/folder-rules/rule-details/options/rule-options.ui-component.mjs +0 -129
- package/esm2020/folder-rules/rule-details/rule-details.ui-component.mjs +0 -185
- package/esm2020/folder-rules/rule-details/triggers/rule-triggers.ui-component.mjs +0 -88
- package/esm2020/folder-rules/rule-details/validators/rule-actions.validator.mjs +0 -37
- package/esm2020/folder-rules/rule-list/rule-list/rule-list.ui-component.mjs +0 -164
- package/esm2020/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.mjs +0 -81
- package/esm2020/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.mjs +0 -58
- package/esm2020/folder-rules/rule-set-picker/rule-set-picker.smart-component.mjs +0 -120
- package/esm2020/folder-rules/services/actions.service.mjs +0 -114
- package/esm2020/folder-rules/services/folder-rule-sets.service.mjs +0 -225
- package/esm2020/folder-rules/services/folder-rules.service.mjs +0 -193
- package/esm2020/lib/aca-content.module.mjs +0 -299
- package/esm2020/lib/aca-content.routes.mjs +0 -359
- package/esm2020/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.mjs +0 -83
- package/esm2020/lib/components/common/location-link/location-link.component.mjs +0 -180
- package/esm2020/lib/components/common/toggle-shared/toggle-shared.component.mjs +0 -76
- package/esm2020/lib/components/common/user-info/user-info.component.mjs +0 -47
- package/esm2020/lib/components/context-menu/context-menu-item.component.mjs +0 -62
- package/esm2020/lib/components/context-menu/context-menu-outside-event.directive.mjs +0 -63
- package/esm2020/lib/components/context-menu/context-menu-overlay.mjs +0 -32
- package/esm2020/lib/components/context-menu/context-menu.component.mjs +0 -114
- package/esm2020/lib/components/context-menu/context-menu.service.mjs +0 -99
- package/esm2020/lib/components/details/details.component.mjs +0 -147
- package/esm2020/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.mjs +0 -71
- package/esm2020/lib/components/dl-custom-components/name-column/name-column.component.mjs +0 -101
- package/esm2020/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +0 -48
- package/esm2020/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +0 -75
- package/esm2020/lib/components/favorite-libraries/favorite-libraries.component.mjs +0 -120
- package/esm2020/lib/components/favorites/favorites.component.mjs +0 -103
- package/esm2020/lib/components/files/files.component.mjs +0 -330
- package/esm2020/lib/components/home/home.component.mjs +0 -47
- package/esm2020/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +0 -59
- package/esm2020/lib/components/info-drawer/info.drawer.module.mjs +0 -73
- package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +0 -206
- package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +0 -45
- package/esm2020/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +0 -134
- package/esm2020/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +0 -95
- package/esm2020/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.mjs +0 -129
- package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.mjs +0 -171
- package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.mjs +0 -82
- package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.mjs +0 -199
- package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-utils.mjs +0 -33
- package/esm2020/lib/components/libraries/libraries.component.mjs +0 -79
- package/esm2020/lib/components/recent-files/recent-files.component.mjs +0 -82
- package/esm2020/lib/components/search/search-action-menu/search-action-menu.component.mjs +0 -64
- package/esm2020/lib/components/search/search-input/search-input.component.mjs +0 -301
- package/esm2020/lib/components/search/search-input-control/search-input-control.component.mjs +0 -94
- package/esm2020/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +0 -90
- package/esm2020/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +0 -153
- package/esm2020/lib/components/search/search-navigation.service.mjs +0 -60
- package/esm2020/lib/components/search/search-results/search-results.component.mjs +0 -255
- package/esm2020/lib/components/search/search-results-row/search-results-row.component.mjs +0 -142
- package/esm2020/lib/components/shared-files/shared-files.component.mjs +0 -83
- package/esm2020/lib/components/shared-link-view/shared-link-view.component.mjs +0 -82
- package/esm2020/lib/components/sidenav/components/button-menu.component.mjs +0 -62
- package/esm2020/lib/components/sidenav/components/expand-menu.component.mjs +0 -67
- package/esm2020/lib/components/sidenav/components/sidenav-header.component.mjs +0 -66
- package/esm2020/lib/components/sidenav/directives/action.directive.mjs +0 -75
- package/esm2020/lib/components/sidenav/directives/active-link.directive.mjs +0 -93
- package/esm2020/lib/components/sidenav/directives/expansion-panel.directive.mjs +0 -102
- package/esm2020/lib/components/sidenav/directives/menu-panel.directive.mjs +0 -99
- package/esm2020/lib/components/sidenav/sidenav.component.mjs +0 -89
- package/esm2020/lib/components/sidenav/user-menu/user-menu.component.mjs +0 -56
- package/esm2020/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +0 -137
- package/esm2020/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +0 -86
- package/esm2020/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +0 -107
- package/esm2020/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +0 -74
- package/esm2020/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +0 -105
- package/esm2020/lib/components/toolbar/view-node/view-node.component.mjs +0 -122
- package/esm2020/lib/components/trashcan/trashcan.component.mjs +0 -68
- package/esm2020/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +0 -52
- package/esm2020/lib/components/view-profile/view-profile.component.mjs +0 -193
- package/esm2020/lib/dialogs/node-template/create-from-template.dialog.mjs +0 -120
- package/esm2020/lib/directives/document-list.directive.mjs +0 -199
- package/esm2020/lib/extensions/core.extensions.module.mjs +0 -55
- package/esm2020/lib/services/content-management.service.mjs +0 -873
- package/esm2020/lib/services/content-url.service.mjs +0 -71
- package/esm2020/lib/services/modal-ai.service.mjs +0 -66
- package/esm2020/lib/services/node-actions.service.mjs +0 -600
- package/esm2020/lib/services/node-template.service.mjs +0 -144
- package/esm2020/lib/services/search-ai-navigation.service.mjs +0 -52
- package/esm2020/lib/store/app-store.module.mjs +0 -102
- package/esm2020/lib/store/effects/app.effects.mjs +0 -49
- package/esm2020/lib/store/effects/contextmenu.effects.mjs +0 -55
- package/esm2020/lib/store/effects/download.effects.mjs +0 -159
- package/esm2020/lib/store/effects/favorite.effects.mjs +0 -76
- package/esm2020/lib/store/effects/library.effects.mjs +0 -113
- package/esm2020/lib/store/effects/node.effects.mjs +0 -325
- package/esm2020/lib/store/effects/search-ai.effects.mjs +0 -57
- package/esm2020/lib/store/effects/search.effects.mjs +0 -60
- package/esm2020/lib/store/effects/template.effects.mjs +0 -121
- package/esm2020/lib/store/effects/upload.effects.mjs +0 -166
- package/esm2020/lib/store/effects/viewer.effects.mjs +0 -175
- package/esm2020/ms-office/actions/aos.actions.mjs +0 -31
- package/esm2020/ms-office/aos-extension.module.mjs +0 -52
- package/esm2020/ms-office/aos-extension.service.mjs +0 -132
- package/esm2020/ms-office/effects/aos.effects.mjs +0 -48
- package/esm2020/public-api.mjs +0 -32
- package/esm2020/viewer/lib/components/preview/preview.component.mjs +0 -236
- package/esm2020/viewer/lib/components/viewer/viewer.component.mjs +0 -240
- package/esm2020/viewer/lib/services/viewer.service.mjs +0 -226
- package/esm2020/viewer/lib/viewer.module.mjs +0 -52
- package/fesm2015/alfresco-aca-content-about.mjs.map +0 -1
- package/fesm2015/alfresco-aca-content-folder-rules.mjs +0 -2662
- package/fesm2015/alfresco-aca-content-folder-rules.mjs.map +0 -1
- package/fesm2015/alfresco-aca-content-ms-office.mjs +0 -256
- package/fesm2015/alfresco-aca-content-ms-office.mjs.map +0 -1
- package/fesm2015/alfresco-aca-content-viewer.mjs +0 -700
- package/fesm2015/alfresco-aca-content-viewer.mjs.map +0 -1
- package/fesm2015/alfresco-aca-content.mjs +0 -9835
- package/fesm2015/alfresco-aca-content.mjs.map +0 -1
- package/fesm2020/alfresco-aca-content-about.mjs +0 -193
- package/fesm2020/alfresco-aca-content-about.mjs.map +0 -1
- package/fesm2020/alfresco-aca-content-folder-rules.mjs.map +0 -1
- package/fesm2020/alfresco-aca-content-ms-office.mjs.map +0 -1
- package/fesm2020/alfresco-aca-content-viewer.mjs.map +0 -1
- package/fesm2020/alfresco-aca-content.mjs +0 -9934
- package/fesm2020/alfresco-aca-content.mjs.map +0 -1
- /package/{esm2020 → esm2022}/about/alfresco-aca-content-about.mjs +0 -0
- /package/{esm2020 → esm2022}/about/dev-mode.tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/about/package-json.token.mjs +0 -0
- /package/{esm2020 → esm2022}/about/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/alfresco-aca-content.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/alfresco-aca-content-folder-rules.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/folder-rules.rules.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/model/action-parameter-constraint.model.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/model/rule-action.model.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/model/rule-composite-condition.model.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/model/rule-grouping-item.model.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/model/rule-set.model.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/model/rule-simple-condition.model.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/model/rule.model.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/rule-details/conditions/rule-condition-comparators.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/rule-details/conditions/rule-condition-fields.mjs +0 -0
- /package/{esm2020 → esm2022}/folder-rules/rule-details/validators/rule-composite-condition.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/common/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/context-menu/direction.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/context-menu/interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/search/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/sidenav/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/toolbar/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/view-profile/view-profile.guard.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/store/effects.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/store/initial-state.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/store/reducers/app.reducer.mjs +0 -0
- /package/{esm2020 → esm2022}/ms-office/alfresco-aca-content-ms-office.mjs +0 -0
- /package/{esm2020 → esm2022}/ms-office/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/viewer/alfresco-aca-content-viewer.mjs +0 -0
- /package/{esm2020 → esm2022}/viewer/public-api.mjs +0 -0
|
@@ -1,873 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
3
|
-
*
|
|
4
|
-
* Alfresco Example Content Application
|
|
5
|
-
*
|
|
6
|
-
* This file is part of the Alfresco Example Content Application.
|
|
7
|
-
* If the software was purchased under a paid Alfresco license, the terms of
|
|
8
|
-
* the paid license agreement will prevail. Otherwise, the software is
|
|
9
|
-
* provided under the following open source license terms:
|
|
10
|
-
*
|
|
11
|
-
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
|
|
12
|
-
* it under the terms of the GNU Lesser General Public License as published by
|
|
13
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
14
|
-
* (at your option) any later version.
|
|
15
|
-
*
|
|
16
|
-
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
|
|
17
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19
|
-
* GNU Lesser General Public License for more details.
|
|
20
|
-
*
|
|
21
|
-
* You should have received a copy of the GNU Lesser General Public License
|
|
22
|
-
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
|
|
23
|
-
*/
|
|
24
|
-
import { AppHookService, AppSettingsService, ContentApiService, NodePermissionService } from '@alfresco/aca-shared';
|
|
25
|
-
import { getAppSelection, NavigateRouteAction, NavigateToParentFolder, RefreshPreviewAction, SetSelectedNodesAction, ShowLoaderAction, SnackbarErrorAction, SnackbarInfoAction, SnackbarUserAction, SnackbarWarningAction, UndoDeleteNodesAction, UnlockWriteAction, ViewNodeVersionAction } from '@alfresco/aca-shared/store';
|
|
26
|
-
import { DocumentListService, FolderDialogComponent, LibraryDialogComponent, NewVersionUploaderDataAction, NewVersionUploaderService, NodeAspectService, NodesApiService, ShareDialogComponent } from '@alfresco/adf-content-services';
|
|
27
|
-
import { NotificationService, TranslationService, ConfirmDialogComponent } from '@alfresco/adf-core';
|
|
28
|
-
import { inject, Injectable } from '@angular/core';
|
|
29
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
30
|
-
import { Store } from '@ngrx/store';
|
|
31
|
-
import { forkJoin, of, zip } from 'rxjs';
|
|
32
|
-
import { catchError, map, mergeMap, take, tap } from 'rxjs/operators';
|
|
33
|
-
import { NodeActionsService } from './node-actions.service';
|
|
34
|
-
import { Router } from '@angular/router';
|
|
35
|
-
import * as i0 from "@angular/core";
|
|
36
|
-
import * as i1 from "@alfresco/adf-content-services";
|
|
37
|
-
import * as i2 from "@ngrx/store";
|
|
38
|
-
import * as i3 from "@alfresco/aca-shared";
|
|
39
|
-
import * as i4 from "@angular/material/dialog";
|
|
40
|
-
import * as i5 from "./node-actions.service";
|
|
41
|
-
import * as i6 from "@alfresco/adf-core";
|
|
42
|
-
import * as i7 from "@angular/router";
|
|
43
|
-
export class ContentManagementService {
|
|
44
|
-
constructor(nodesApiService, store, contentApi, permission, dialogRef, nodeActionsService, translation, nodeAspectService, appHookService, newVersionUploaderService, router, appSettingsService, documentListService) {
|
|
45
|
-
this.nodesApiService = nodesApiService;
|
|
46
|
-
this.store = store;
|
|
47
|
-
this.contentApi = contentApi;
|
|
48
|
-
this.permission = permission;
|
|
49
|
-
this.dialogRef = dialogRef;
|
|
50
|
-
this.nodeActionsService = nodeActionsService;
|
|
51
|
-
this.translation = translation;
|
|
52
|
-
this.nodeAspectService = nodeAspectService;
|
|
53
|
-
this.appHookService = appHookService;
|
|
54
|
-
this.newVersionUploaderService = newVersionUploaderService;
|
|
55
|
-
this.router = router;
|
|
56
|
-
this.appSettingsService = appSettingsService;
|
|
57
|
-
this.documentListService = documentListService;
|
|
58
|
-
this.notificationService = inject(NotificationService);
|
|
59
|
-
this.createMenuButtonSelector = 'app-toolbar-menu button[id="app.toolbar.create"]';
|
|
60
|
-
}
|
|
61
|
-
addFavorite(nodes) {
|
|
62
|
-
if (nodes && nodes.length > 0) {
|
|
63
|
-
this.contentApi.addFavorite(nodes).subscribe(() => {
|
|
64
|
-
const favoriteNodes = nodes.map((node) => {
|
|
65
|
-
const newNode = JSON.parse(JSON.stringify(node));
|
|
66
|
-
newNode.entry.isFavorite = true;
|
|
67
|
-
return newNode;
|
|
68
|
-
});
|
|
69
|
-
this.store.dispatch(new SetSelectedNodesAction(favoriteNodes));
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
removeFavorite(nodes) {
|
|
74
|
-
if (nodes && nodes.length > 0) {
|
|
75
|
-
this.contentApi.removeFavorite(nodes).subscribe(() => {
|
|
76
|
-
const favoriteNodes = nodes.map((node) => {
|
|
77
|
-
const newNode = JSON.parse(JSON.stringify(node));
|
|
78
|
-
newNode.entry.isFavorite = false;
|
|
79
|
-
return newNode;
|
|
80
|
-
});
|
|
81
|
-
this.store.dispatch(new SetSelectedNodesAction(favoriteNodes));
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
manageVersions(node, focusedElementOnCloseSelector) {
|
|
86
|
-
if (node?.entry) {
|
|
87
|
-
// shared and favorite
|
|
88
|
-
const id = node.entry.nodeId || node.entry.guid;
|
|
89
|
-
if (id) {
|
|
90
|
-
this.contentApi.getNodeInfo(id).subscribe((entry) => {
|
|
91
|
-
this.openVersionManagerDialog(entry, focusedElementOnCloseSelector);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
this.openVersionManagerDialog(node.entry, focusedElementOnCloseSelector);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
manageAspects(node, focusedElementOnCloseSelector) {
|
|
100
|
-
if (node?.entry) {
|
|
101
|
-
// shared and favorite
|
|
102
|
-
const id = node.entry.nodeId || node.entry.guid;
|
|
103
|
-
if (id) {
|
|
104
|
-
this.contentApi.getNodeInfo(id).subscribe((entry) => {
|
|
105
|
-
this.openAspectListDialog(entry, focusedElementOnCloseSelector);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
this.openAspectListDialog(node.entry, focusedElementOnCloseSelector);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
versionUpdateDialog(node, file) {
|
|
114
|
-
this.contentApi.getNodeVersions(node.id).subscribe(({ list }) => {
|
|
115
|
-
const newVersionUploaderDialogData = {
|
|
116
|
-
node,
|
|
117
|
-
file,
|
|
118
|
-
currentVersion: list.entries[0].entry,
|
|
119
|
-
title: 'VERSION.DIALOG.TITLE',
|
|
120
|
-
showComments: this.appSettingsService.uploadAllowComments,
|
|
121
|
-
allowDownload: this.appSettingsService.uploadAllowDownload
|
|
122
|
-
};
|
|
123
|
-
const dialogConfig = { width: '600px' };
|
|
124
|
-
this.newVersionUploaderService.openUploadNewVersionDialog(newVersionUploaderDialogData, dialogConfig).subscribe((data) => {
|
|
125
|
-
if (data.action === NewVersionUploaderDataAction.upload) {
|
|
126
|
-
if (data.newVersion.value.entry.properties['cm:lockType'] === 'WRITE_LOCK') {
|
|
127
|
-
this.store.dispatch(new UnlockWriteAction(data.newVersion.value));
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}, (error) => this.notificationService.showError(error));
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
shareNode(node, focusedElementOnCloseSelector) {
|
|
134
|
-
if (node?.entry) {
|
|
135
|
-
// shared and favorite
|
|
136
|
-
const id = node.entry.nodeId || node.entry.guid;
|
|
137
|
-
if (id) {
|
|
138
|
-
this.contentApi.getNodeInfo(id).subscribe((entry) => {
|
|
139
|
-
this.openShareLinkDialog({ entry }, focusedElementOnCloseSelector);
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
this.openShareLinkDialog(node, focusedElementOnCloseSelector);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
openShareLinkDialog(node, focusedElementOnCloseSelector) {
|
|
148
|
-
const baseShareUrl = this.appSettingsService.baseShareUrl;
|
|
149
|
-
this.dialogRef
|
|
150
|
-
.open(ShareDialogComponent, {
|
|
151
|
-
restoreFocus: true,
|
|
152
|
-
width: '600px',
|
|
153
|
-
panelClass: 'adf-share-link-dialog',
|
|
154
|
-
data: {
|
|
155
|
-
node,
|
|
156
|
-
baseShareUrl
|
|
157
|
-
}
|
|
158
|
-
})
|
|
159
|
-
.afterClosed()
|
|
160
|
-
.subscribe(() => {
|
|
161
|
-
this.store.dispatch(new SetSelectedNodesAction([node]));
|
|
162
|
-
this.appHookService.linksUnshared.next();
|
|
163
|
-
this.focusAfterClose(focusedElementOnCloseSelector);
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
createFolder(parentNodeId) {
|
|
167
|
-
const dialogInstance = this.dialogRef.open(FolderDialogComponent, {
|
|
168
|
-
data: {
|
|
169
|
-
parentNodeId,
|
|
170
|
-
createTitle: undefined,
|
|
171
|
-
nodeType: 'cm:folder'
|
|
172
|
-
},
|
|
173
|
-
width: '400px',
|
|
174
|
-
role: 'dialog'
|
|
175
|
-
});
|
|
176
|
-
dialogInstance.componentInstance.error.subscribe((message) => {
|
|
177
|
-
this.notificationService.showError(message);
|
|
178
|
-
});
|
|
179
|
-
dialogInstance.afterClosed().subscribe((node) => {
|
|
180
|
-
if (node) {
|
|
181
|
-
this.documentListService.reload();
|
|
182
|
-
}
|
|
183
|
-
this.focusAfterClose(this.createMenuButtonSelector);
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
editFolder(folder, focusedElementOnCloseSelector) {
|
|
187
|
-
if (!folder) {
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
const dialog = this.dialogRef.open(FolderDialogComponent, {
|
|
191
|
-
data: {
|
|
192
|
-
folder: folder.entry
|
|
193
|
-
},
|
|
194
|
-
width: '400px'
|
|
195
|
-
});
|
|
196
|
-
dialog.componentInstance.error.subscribe((message) => {
|
|
197
|
-
this.notificationService.showError(message);
|
|
198
|
-
});
|
|
199
|
-
dialog.afterClosed().subscribe((node) => {
|
|
200
|
-
if (node) {
|
|
201
|
-
this.store.dispatch(new SetSelectedNodesAction([{ entry: node }]));
|
|
202
|
-
this.nodesApiService.nodeUpdated.next(node);
|
|
203
|
-
}
|
|
204
|
-
this.focusAfterClose(focusedElementOnCloseSelector);
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
createLibrary() {
|
|
208
|
-
const dialogInstance = this.dialogRef.open(LibraryDialogComponent, {
|
|
209
|
-
width: '400px'
|
|
210
|
-
});
|
|
211
|
-
dialogInstance.componentInstance.error.subscribe((message) => {
|
|
212
|
-
this.notificationService.showError(message);
|
|
213
|
-
});
|
|
214
|
-
return dialogInstance.afterClosed().pipe(tap((node) => {
|
|
215
|
-
if (node) {
|
|
216
|
-
this.appHookService.libraryCreated.next(node);
|
|
217
|
-
}
|
|
218
|
-
this.focusAfterClose(this.createMenuButtonSelector);
|
|
219
|
-
}), map((node) => {
|
|
220
|
-
if (node?.entry?.guid) {
|
|
221
|
-
return node.entry.guid;
|
|
222
|
-
}
|
|
223
|
-
return null;
|
|
224
|
-
}));
|
|
225
|
-
}
|
|
226
|
-
deleteLibrary(id) {
|
|
227
|
-
this.contentApi.deleteSite(id).subscribe(() => {
|
|
228
|
-
this.appHookService.libraryDeleted.next(id);
|
|
229
|
-
this.notificationService.showInfo('APP.MESSAGES.INFO.LIBRARY_DELETED');
|
|
230
|
-
this.store.dispatch(new NavigateRouteAction(['/libraries']));
|
|
231
|
-
}, () => {
|
|
232
|
-
this.notificationService.showError('APP.MESSAGES.ERRORS.DELETE_LIBRARY_FAILED');
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
leaveLibrary(siteId, focusedElementOnCloseSelector) {
|
|
236
|
-
const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {
|
|
237
|
-
data: {
|
|
238
|
-
title: 'APP.DIALOGS.CONFIRM_LEAVE.TITLE',
|
|
239
|
-
message: 'APP.DIALOGS.CONFIRM_LEAVE.MESSAGE',
|
|
240
|
-
yesLabel: 'APP.DIALOGS.CONFIRM_LEAVE.YES_LABEL',
|
|
241
|
-
noLabel: 'APP.DIALOGS.CONFIRM_LEAVE.NO_LABEL'
|
|
242
|
-
},
|
|
243
|
-
minWidth: '250px'
|
|
244
|
-
});
|
|
245
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
246
|
-
if (result === true) {
|
|
247
|
-
this.contentApi.leaveSite(siteId).subscribe(() => {
|
|
248
|
-
this.appHookService.libraryLeft.next(siteId);
|
|
249
|
-
this.notificationService.showInfo('APP.MESSAGES.INFO.LEFT_LIBRARY');
|
|
250
|
-
}, () => {
|
|
251
|
-
this.notificationService.showError('APP.MESSAGES.ERRORS.LEAVE_LIBRARY_FAILED');
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
this.focusAfterClose(focusedElementOnCloseSelector);
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
updateLibrary(siteId, siteBody) {
|
|
258
|
-
this.contentApi.updateLibrary(siteId, siteBody).subscribe((siteEntry) => {
|
|
259
|
-
this.appHookService.libraryUpdated.next(siteEntry);
|
|
260
|
-
this.notificationService.showInfo('LIBRARY.SUCCESS.LIBRARY_UPDATED');
|
|
261
|
-
}, () => {
|
|
262
|
-
this.notificationService.showError('LIBRARY.ERRORS.LIBRARY_UPDATE_ERROR');
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
async unshareNodes(links) {
|
|
266
|
-
const promises = links.map((link) => this.contentApi.deleteSharedLink(link.entry.id).toPromise());
|
|
267
|
-
await Promise.all(promises);
|
|
268
|
-
this.appHookService.linksUnshared.next();
|
|
269
|
-
}
|
|
270
|
-
canUpdateNode(node) {
|
|
271
|
-
return this.permission.check(node, ['update']);
|
|
272
|
-
}
|
|
273
|
-
canUploadContent(folderNode) {
|
|
274
|
-
return this.permission.check(folderNode, ['create']);
|
|
275
|
-
}
|
|
276
|
-
purgeDeletedNodes(nodes) {
|
|
277
|
-
if (!nodes || nodes.length === 0) {
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {
|
|
281
|
-
data: {
|
|
282
|
-
title: 'APP.DIALOGS.CONFIRM_PURGE.TITLE',
|
|
283
|
-
message: 'APP.DIALOGS.CONFIRM_PURGE.MESSAGE',
|
|
284
|
-
yesLabel: 'APP.DIALOGS.CONFIRM_PURGE.YES_LABEL',
|
|
285
|
-
noLabel: 'APP.DIALOGS.CONFIRM_PURGE.NO_LABEL'
|
|
286
|
-
},
|
|
287
|
-
minWidth: '250px'
|
|
288
|
-
});
|
|
289
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
290
|
-
if (result === true) {
|
|
291
|
-
const nodesToDelete = nodes.map((node) => {
|
|
292
|
-
const { name } = node.entry;
|
|
293
|
-
const id = node.entry.nodeId || node.entry.id;
|
|
294
|
-
return {
|
|
295
|
-
id,
|
|
296
|
-
name
|
|
297
|
-
};
|
|
298
|
-
});
|
|
299
|
-
this.purgeNodes(nodesToDelete);
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
restoreDeletedNodes(selection = []) {
|
|
304
|
-
if (!selection.length) {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
const nodesWithPath = selection.filter((node) => node.entry.path);
|
|
308
|
-
if (selection.length && !nodesWithPath.length) {
|
|
309
|
-
const failedStatus = this.processStatus([]);
|
|
310
|
-
failedStatus.fail.push(...selection);
|
|
311
|
-
this.showRestoreNotification(failedStatus);
|
|
312
|
-
this.documentListService.reload();
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
let status;
|
|
316
|
-
forkJoin(nodesWithPath.map((node) => this.restoreNode(node)))
|
|
317
|
-
.pipe(tap((restoredNodes) => {
|
|
318
|
-
status = this.processStatus(restoredNodes);
|
|
319
|
-
}), mergeMap(() => this.contentApi.getDeletedNodes()))
|
|
320
|
-
.subscribe((nodes) => {
|
|
321
|
-
const selectedNodes = this.diff(status.fail, selection, false);
|
|
322
|
-
const remainingNodes = this.diff(selectedNodes, nodes.list.entries);
|
|
323
|
-
if (!remainingNodes.length) {
|
|
324
|
-
this.showRestoreNotification(status);
|
|
325
|
-
this.documentListService.reload();
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
this.restoreDeletedNodes(remainingNodes);
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
copyNodes(nodes, focusedElementOnCloseSelector) {
|
|
333
|
-
zip(this.nodeActionsService.copyNodes(nodes, undefined, focusedElementOnCloseSelector), this.nodeActionsService.contentCopied).subscribe((result) => {
|
|
334
|
-
const [operationResult, newItems] = result;
|
|
335
|
-
this.showCopyMessage(operationResult, nodes, newItems);
|
|
336
|
-
}, (error) => {
|
|
337
|
-
this.showCopyMessage(error, nodes);
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
moveNodes(nodes, focusedElementOnCloseSelector) {
|
|
341
|
-
const permissionForMove = '!';
|
|
342
|
-
zip(this.nodeActionsService.moveNodes(nodes, permissionForMove, focusedElementOnCloseSelector), this.nodeActionsService.contentMoved).subscribe((result) => {
|
|
343
|
-
const [operationResult, moveResponse] = result;
|
|
344
|
-
this.showMoveMessage(nodes, operationResult, moveResponse);
|
|
345
|
-
this.documentListService.reload();
|
|
346
|
-
}, (error) => {
|
|
347
|
-
this.showMoveMessage(nodes, error);
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
getErrorMessage(errorObject) {
|
|
351
|
-
let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
|
|
352
|
-
try {
|
|
353
|
-
const { error: { statusCode } } = JSON.parse(errorObject.message);
|
|
354
|
-
if (statusCode === 409) {
|
|
355
|
-
i18nMessageString = 'APP.MESSAGES.ERRORS.NODE_MOVE';
|
|
356
|
-
}
|
|
357
|
-
else if (statusCode === 403) {
|
|
358
|
-
i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
catch (err) {
|
|
362
|
-
/* Do nothing, keep the original message */
|
|
363
|
-
}
|
|
364
|
-
return i18nMessageString;
|
|
365
|
-
}
|
|
366
|
-
getNodeInfo() {
|
|
367
|
-
return this.store.select(getAppSelection).pipe(take(1), mergeMap(({ file }) => {
|
|
368
|
-
const id = file.entry.nodeId || file.entry.guid;
|
|
369
|
-
if (!id) {
|
|
370
|
-
return of(file.entry);
|
|
371
|
-
}
|
|
372
|
-
else {
|
|
373
|
-
return this.contentApi.getNodeInfo(id);
|
|
374
|
-
}
|
|
375
|
-
}));
|
|
376
|
-
}
|
|
377
|
-
unlockNode(node) {
|
|
378
|
-
return this.contentApi.unlockNode(node.entry.id).catch(() => {
|
|
379
|
-
this.notificationService.showError('APP.MESSAGES.ERRORS.UNLOCK_NODE', null, { fileName: node.entry.name });
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
showCopyMessage(info, nodes, newItems) {
|
|
383
|
-
const numberOfCopiedItems = newItems ? newItems.length : 0;
|
|
384
|
-
const failedItems = nodes.length - numberOfCopiedItems;
|
|
385
|
-
let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
|
|
386
|
-
if (typeof info === 'string') {
|
|
387
|
-
if (info.toLowerCase().indexOf('succes') !== -1) {
|
|
388
|
-
let i18MessageSuffix;
|
|
389
|
-
if (failedItems) {
|
|
390
|
-
if (numberOfCopiedItems) {
|
|
391
|
-
i18MessageSuffix = numberOfCopiedItems === 1 ? 'PARTIAL_SINGULAR' : 'PARTIAL_PLURAL';
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
i18MessageSuffix = failedItems === 1 ? 'FAIL_SINGULAR' : 'FAIL_PLURAL';
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
else {
|
|
398
|
-
i18MessageSuffix = numberOfCopiedItems === 1 ? 'SINGULAR' : 'PLURAL';
|
|
399
|
-
}
|
|
400
|
-
i18nMessageString = `APP.MESSAGES.INFO.NODE_COPY.${i18MessageSuffix}`;
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
try {
|
|
405
|
-
const { error: { statusCode } } = JSON.parse(info.message);
|
|
406
|
-
if (statusCode === 403) {
|
|
407
|
-
i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
catch { }
|
|
411
|
-
}
|
|
412
|
-
const undo = numberOfCopiedItems > 0 ? this.translation.instant('APP.ACTIONS.UNDO') : '';
|
|
413
|
-
const message = this.translation.instant(i18nMessageString, {
|
|
414
|
-
success: numberOfCopiedItems,
|
|
415
|
-
failed: failedItems
|
|
416
|
-
});
|
|
417
|
-
this.notificationService
|
|
418
|
-
.openSnackMessageAction(message, undo, {
|
|
419
|
-
panelClass: 'info-snackbar'
|
|
420
|
-
})
|
|
421
|
-
.onAction()
|
|
422
|
-
.subscribe(() => this.undoCopyNodes(newItems));
|
|
423
|
-
}
|
|
424
|
-
undoCopyNodes(nodes) {
|
|
425
|
-
const batch = this.nodeActionsService
|
|
426
|
-
.flatten(nodes)
|
|
427
|
-
.filter((item) => item.entry)
|
|
428
|
-
.map((item) => this.contentApi.deleteNode(item.entry.id, { permanent: true }));
|
|
429
|
-
forkJoin(...batch).subscribe(() => {
|
|
430
|
-
this.appHookService.nodesDeleted.next(null);
|
|
431
|
-
this.documentListService.reload();
|
|
432
|
-
}, (error) => {
|
|
433
|
-
let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
|
|
434
|
-
let errorJson = null;
|
|
435
|
-
try {
|
|
436
|
-
errorJson = JSON.parse(error.message);
|
|
437
|
-
}
|
|
438
|
-
catch { }
|
|
439
|
-
if (errorJson?.error?.statusCode === 403) {
|
|
440
|
-
i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
|
|
441
|
-
}
|
|
442
|
-
this.notificationService.showError(i18nMessageString);
|
|
443
|
-
});
|
|
444
|
-
}
|
|
445
|
-
openVersionManagerDialog(node, focusedElementOnCloseSelector) {
|
|
446
|
-
// workaround Shared
|
|
447
|
-
if (node.isFile || node.nodeId) {
|
|
448
|
-
const newVersionUploaderDialogData = {
|
|
449
|
-
node,
|
|
450
|
-
showVersionsOnly: true,
|
|
451
|
-
title: 'VERSION.DIALOG.TITLE'
|
|
452
|
-
};
|
|
453
|
-
this.newVersionUploaderService
|
|
454
|
-
.openUploadNewVersionDialog(newVersionUploaderDialogData, { width: '630px', role: 'dialog' }, focusedElementOnCloseSelector)
|
|
455
|
-
.subscribe({
|
|
456
|
-
next: (newVersionUploaderData) => {
|
|
457
|
-
switch (newVersionUploaderData.action) {
|
|
458
|
-
case NewVersionUploaderDataAction.refresh:
|
|
459
|
-
this.documentListService.reload();
|
|
460
|
-
this.store.dispatch(new RefreshPreviewAction(newVersionUploaderData.node));
|
|
461
|
-
break;
|
|
462
|
-
case NewVersionUploaderDataAction.view:
|
|
463
|
-
this.store.dispatch(new ViewNodeVersionAction(node.id, newVersionUploaderData.versionId, {
|
|
464
|
-
location: this.router.url
|
|
465
|
-
}));
|
|
466
|
-
break;
|
|
467
|
-
default:
|
|
468
|
-
break;
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
});
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
this.notificationService.showError('APP.MESSAGES.ERRORS.PERMISSION');
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
openAspectListDialog(node, focusedElementOnCloseSelector) {
|
|
478
|
-
// workaround Shared
|
|
479
|
-
if (node.isFile || node.id) {
|
|
480
|
-
this.nodeAspectService.updateNodeAspects(node.id, focusedElementOnCloseSelector);
|
|
481
|
-
}
|
|
482
|
-
else {
|
|
483
|
-
this.notificationService.showError('APP.MESSAGES.ERRORS.PERMISSION');
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
undoMoveNodes(moveResponse, selectionParentId) {
|
|
487
|
-
const movedNodes = moveResponse?.['succeeded'] ?? [];
|
|
488
|
-
const partiallyMovedNodes = moveResponse?.['partiallySucceeded'] ?? [];
|
|
489
|
-
const restoreDeletedNodesBatch = this.nodeActionsService.moveDeletedEntries.map((folderEntry) => this.contentApi.restoreNode(folderEntry.nodeId || folderEntry.id).pipe(map((node) => node.entry)));
|
|
490
|
-
zip(...restoreDeletedNodesBatch, of(null))
|
|
491
|
-
.pipe(mergeMap(() => {
|
|
492
|
-
const nodesToBeMovedBack = [...partiallyMovedNodes, ...movedNodes];
|
|
493
|
-
const revertMoveBatch = this.nodeActionsService
|
|
494
|
-
.flatten(nodesToBeMovedBack)
|
|
495
|
-
.filter((node) => node.entry || node.itemMoved?.entry)
|
|
496
|
-
.map((node) => {
|
|
497
|
-
if (node.itemMoved) {
|
|
498
|
-
return this.nodeActionsService.moveNodeAction(node.itemMoved.entry, node.initialParentId);
|
|
499
|
-
}
|
|
500
|
-
else {
|
|
501
|
-
return this.nodeActionsService.moveNodeAction(node.entry, selectionParentId);
|
|
502
|
-
}
|
|
503
|
-
});
|
|
504
|
-
return zip(...revertMoveBatch, of(null));
|
|
505
|
-
}))
|
|
506
|
-
.subscribe(() => {
|
|
507
|
-
this.documentListService.reload();
|
|
508
|
-
}, (error) => {
|
|
509
|
-
let message = 'APP.MESSAGES.ERRORS.GENERIC';
|
|
510
|
-
let errorJson = null;
|
|
511
|
-
try {
|
|
512
|
-
errorJson = JSON.parse(error.message);
|
|
513
|
-
}
|
|
514
|
-
catch { }
|
|
515
|
-
if (errorJson?.error?.statusCode === 403) {
|
|
516
|
-
message = 'APP.MESSAGES.ERRORS.PERMISSION';
|
|
517
|
-
}
|
|
518
|
-
this.notificationService.showError(message);
|
|
519
|
-
});
|
|
520
|
-
}
|
|
521
|
-
deleteNodes(items) {
|
|
522
|
-
const batch = [];
|
|
523
|
-
items.forEach((node) => {
|
|
524
|
-
batch.push(this.deleteNode(node));
|
|
525
|
-
});
|
|
526
|
-
forkJoin(...batch).subscribe((data) => {
|
|
527
|
-
const status = this.processStatus(data);
|
|
528
|
-
const message = this.getDeleteMessage(status);
|
|
529
|
-
if (message && status.someSucceeded) {
|
|
530
|
-
message.userAction = new SnackbarUserAction('APP.ACTIONS.UNDO', new UndoDeleteNodesAction([...status.success]));
|
|
531
|
-
}
|
|
532
|
-
this.store.dispatch(message);
|
|
533
|
-
if (status.someSucceeded) {
|
|
534
|
-
this.appHookService.nodesDeleted.next();
|
|
535
|
-
this.documentListService.reload();
|
|
536
|
-
}
|
|
537
|
-
this.store.dispatch(new ShowLoaderAction(false));
|
|
538
|
-
});
|
|
539
|
-
}
|
|
540
|
-
undoDeleteNodes(items) {
|
|
541
|
-
const batch = [];
|
|
542
|
-
items.forEach((item) => {
|
|
543
|
-
batch.push(this.undoDeleteNode(item));
|
|
544
|
-
});
|
|
545
|
-
forkJoin(...batch).subscribe((data) => {
|
|
546
|
-
const processedData = this.processStatus(data);
|
|
547
|
-
if (processedData.fail.length) {
|
|
548
|
-
const message = this.getUndoDeleteMessage(processedData);
|
|
549
|
-
this.store.dispatch(message);
|
|
550
|
-
}
|
|
551
|
-
if (processedData.someSucceeded) {
|
|
552
|
-
this.documentListService.reload();
|
|
553
|
-
}
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
undoDeleteNode(item) {
|
|
557
|
-
const { id, name } = item;
|
|
558
|
-
return this.contentApi.restoreNode(id).pipe(map(() => ({
|
|
559
|
-
id,
|
|
560
|
-
name,
|
|
561
|
-
status: 1
|
|
562
|
-
})), catchError(() => of({
|
|
563
|
-
id,
|
|
564
|
-
name,
|
|
565
|
-
status: 0
|
|
566
|
-
})));
|
|
567
|
-
}
|
|
568
|
-
getUndoDeleteMessage(status) {
|
|
569
|
-
if (status.someFailed && !status.oneFailed) {
|
|
570
|
-
return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_RESTORE_PLURAL', { number: status.fail.length });
|
|
571
|
-
}
|
|
572
|
-
if (status.oneFailed) {
|
|
573
|
-
return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_RESTORE', {
|
|
574
|
-
name: status.fail[0].name
|
|
575
|
-
});
|
|
576
|
-
}
|
|
577
|
-
return null;
|
|
578
|
-
}
|
|
579
|
-
restoreNode(node) {
|
|
580
|
-
const { entry } = node;
|
|
581
|
-
return this.contentApi.restoreNode(entry.id).pipe(map(() => ({
|
|
582
|
-
status: 1,
|
|
583
|
-
entry
|
|
584
|
-
})), catchError((error) => {
|
|
585
|
-
const { statusCode } = JSON.parse(error.message).error;
|
|
586
|
-
return of({
|
|
587
|
-
status: 0,
|
|
588
|
-
statusCode,
|
|
589
|
-
entry
|
|
590
|
-
});
|
|
591
|
-
}));
|
|
592
|
-
}
|
|
593
|
-
purgeNodes(selection = []) {
|
|
594
|
-
if (!selection.length) {
|
|
595
|
-
return;
|
|
596
|
-
}
|
|
597
|
-
const batch = selection.map((node) => this.purgeDeletedNode(node));
|
|
598
|
-
forkJoin(batch).subscribe((purgedNodes) => {
|
|
599
|
-
const status = this.processStatus(purgedNodes);
|
|
600
|
-
if (status.success.length) {
|
|
601
|
-
this.documentListService.reload();
|
|
602
|
-
}
|
|
603
|
-
this.sendPurgeMessage(status);
|
|
604
|
-
});
|
|
605
|
-
}
|
|
606
|
-
purgeDeletedNode(node) {
|
|
607
|
-
const { id, name } = node;
|
|
608
|
-
return this.contentApi.purgeDeletedNode(id).pipe(map(() => ({
|
|
609
|
-
status: 1,
|
|
610
|
-
id,
|
|
611
|
-
name
|
|
612
|
-
})), catchError(() => of({
|
|
613
|
-
status: 0,
|
|
614
|
-
id,
|
|
615
|
-
name
|
|
616
|
-
})));
|
|
617
|
-
}
|
|
618
|
-
processStatus(data = []) {
|
|
619
|
-
const status = {
|
|
620
|
-
fail: [],
|
|
621
|
-
success: [],
|
|
622
|
-
get someFailed() {
|
|
623
|
-
return !!this.fail.length;
|
|
624
|
-
},
|
|
625
|
-
get someSucceeded() {
|
|
626
|
-
return !!this.success.length;
|
|
627
|
-
},
|
|
628
|
-
get oneFailed() {
|
|
629
|
-
return this.fail.length === 1;
|
|
630
|
-
},
|
|
631
|
-
get oneSucceeded() {
|
|
632
|
-
return this.success.length === 1;
|
|
633
|
-
},
|
|
634
|
-
get allSucceeded() {
|
|
635
|
-
return this.someSucceeded && !this.someFailed;
|
|
636
|
-
},
|
|
637
|
-
get allFailed() {
|
|
638
|
-
return this.someFailed && !this.someSucceeded;
|
|
639
|
-
},
|
|
640
|
-
reset() {
|
|
641
|
-
this.fail = [];
|
|
642
|
-
this.success = [];
|
|
643
|
-
}
|
|
644
|
-
};
|
|
645
|
-
return data.reduce((acc, node) => {
|
|
646
|
-
if (node.status) {
|
|
647
|
-
acc.success.push(node);
|
|
648
|
-
}
|
|
649
|
-
else {
|
|
650
|
-
acc.fail.push(node);
|
|
651
|
-
}
|
|
652
|
-
return acc;
|
|
653
|
-
}, status);
|
|
654
|
-
}
|
|
655
|
-
sendPurgeMessage(status) {
|
|
656
|
-
if (status.oneSucceeded && status.someFailed && !status.oneFailed) {
|
|
657
|
-
this.notificationService.showWarning('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PARTIAL_SINGULAR', null, {
|
|
658
|
-
name: status.success[0].name,
|
|
659
|
-
failed: status.fail.length
|
|
660
|
-
});
|
|
661
|
-
return;
|
|
662
|
-
}
|
|
663
|
-
if (status.someSucceeded && !status.oneSucceeded && status.someFailed) {
|
|
664
|
-
this.notificationService.showWarning('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PARTIAL_PLURAL', null, {
|
|
665
|
-
number: status.success.length,
|
|
666
|
-
failed: status.fail.length
|
|
667
|
-
});
|
|
668
|
-
return;
|
|
669
|
-
}
|
|
670
|
-
if (status.oneSucceeded) {
|
|
671
|
-
this.notificationService.showInfo('APP.MESSAGES.INFO.TRASH.NODES_PURGE.SINGULAR', null, { name: status.success[0].name });
|
|
672
|
-
return;
|
|
673
|
-
}
|
|
674
|
-
if (status.oneFailed) {
|
|
675
|
-
this.notificationService.showError('APP.MESSAGES.ERRORS.TRASH.NODES_PURGE.SINGULAR', null, { name: status.fail[0].name });
|
|
676
|
-
return;
|
|
677
|
-
}
|
|
678
|
-
if (status.allSucceeded) {
|
|
679
|
-
this.notificationService.showInfo('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PLURAL', null, { number: status.success.length });
|
|
680
|
-
return;
|
|
681
|
-
}
|
|
682
|
-
if (status.allFailed) {
|
|
683
|
-
this.notificationService.showError('APP.MESSAGES.ERRORS.TRASH.NODES_PURGE.PLURAL', null, { number: status.fail.length });
|
|
684
|
-
return;
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
showRestoreNotification(status) {
|
|
688
|
-
const message = this.getRestoreMessage(status);
|
|
689
|
-
if (message) {
|
|
690
|
-
if (status.oneSucceeded && !status.someFailed) {
|
|
691
|
-
const isSite = this.isSite(status.success[0].entry);
|
|
692
|
-
const path = status.success[0].entry.path;
|
|
693
|
-
const parent = path.elements[path.elements.length - 1];
|
|
694
|
-
const route = isSite ? ['/libraries', parent.id] : ['/personal-files', parent.id];
|
|
695
|
-
let navigate;
|
|
696
|
-
if (this.isLibraryContent(path)) {
|
|
697
|
-
navigate = new NavigateToParentFolder(status.success[0]);
|
|
698
|
-
}
|
|
699
|
-
else {
|
|
700
|
-
navigate = new NavigateRouteAction(route);
|
|
701
|
-
}
|
|
702
|
-
message.userAction = new SnackbarUserAction('APP.ACTIONS.VIEW', navigate);
|
|
703
|
-
}
|
|
704
|
-
this.store.dispatch(message);
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
isSite(entry) {
|
|
708
|
-
return entry.nodeType === 'st:site';
|
|
709
|
-
}
|
|
710
|
-
isLibraryContent(path) {
|
|
711
|
-
return path && path.elements.length >= 2 && path.elements[1].name === 'Sites';
|
|
712
|
-
}
|
|
713
|
-
getRestoreMessage(status) {
|
|
714
|
-
if (status.someFailed && !status.oneFailed) {
|
|
715
|
-
return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.PARTIAL_PLURAL', {
|
|
716
|
-
number: status.fail.length
|
|
717
|
-
});
|
|
718
|
-
}
|
|
719
|
-
if (status.oneFailed && status.fail[0].statusCode) {
|
|
720
|
-
if (status.fail[0].statusCode === 409) {
|
|
721
|
-
return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.NODE_EXISTS', {
|
|
722
|
-
name: status.fail[0].entry.name
|
|
723
|
-
});
|
|
724
|
-
}
|
|
725
|
-
else {
|
|
726
|
-
return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.GENERIC', {
|
|
727
|
-
name: status.fail[0].entry.name
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
if (status.oneFailed && !status.fail[0].statusCode) {
|
|
732
|
-
return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.LOCATION_MISSING', {
|
|
733
|
-
name: status.fail[0].entry.name
|
|
734
|
-
});
|
|
735
|
-
}
|
|
736
|
-
if (status.allSucceeded && !status.oneSucceeded) {
|
|
737
|
-
return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_RESTORE.PLURAL');
|
|
738
|
-
}
|
|
739
|
-
if (status.allSucceeded && status.oneSucceeded) {
|
|
740
|
-
return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_RESTORE.SINGULAR', {
|
|
741
|
-
name: status.success[0].entry.name
|
|
742
|
-
});
|
|
743
|
-
}
|
|
744
|
-
return null;
|
|
745
|
-
}
|
|
746
|
-
diff(selection, list, fromList = true) {
|
|
747
|
-
const ids = selection.map((item) => item.entry.id);
|
|
748
|
-
return list.filter((item) => {
|
|
749
|
-
if (fromList) {
|
|
750
|
-
return ids.includes(item.entry.id) ? item : null;
|
|
751
|
-
}
|
|
752
|
-
else {
|
|
753
|
-
return !ids.includes(item.entry.id) ? item : null;
|
|
754
|
-
}
|
|
755
|
-
});
|
|
756
|
-
}
|
|
757
|
-
deleteNode(node) {
|
|
758
|
-
const { name } = node.entry;
|
|
759
|
-
const id = node.entry.nodeId || node.entry.id;
|
|
760
|
-
return this.contentApi.deleteNode(id).pipe(map(() => ({
|
|
761
|
-
id,
|
|
762
|
-
name,
|
|
763
|
-
status: 1
|
|
764
|
-
})), catchError(() => of({
|
|
765
|
-
id,
|
|
766
|
-
name,
|
|
767
|
-
status: 0
|
|
768
|
-
})));
|
|
769
|
-
}
|
|
770
|
-
getDeleteMessage(status) {
|
|
771
|
-
if (status.allFailed && !status.oneFailed) {
|
|
772
|
-
return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_DELETION_PLURAL', { number: status.fail.length });
|
|
773
|
-
}
|
|
774
|
-
if (status.allSucceeded && !status.oneSucceeded) {
|
|
775
|
-
return new SnackbarInfoAction('APP.MESSAGES.INFO.NODE_DELETION.PLURAL', {
|
|
776
|
-
number: status.success.length
|
|
777
|
-
});
|
|
778
|
-
}
|
|
779
|
-
if (status.someFailed && status.someSucceeded && !status.oneSucceeded) {
|
|
780
|
-
return new SnackbarWarningAction('APP.MESSAGES.INFO.NODE_DELETION.PARTIAL_PLURAL', {
|
|
781
|
-
success: status.success.length,
|
|
782
|
-
failed: status.fail.length
|
|
783
|
-
});
|
|
784
|
-
}
|
|
785
|
-
if (status.someFailed && status.oneSucceeded) {
|
|
786
|
-
return new SnackbarWarningAction('APP.MESSAGES.INFO.NODE_DELETION.PARTIAL_SINGULAR', {
|
|
787
|
-
success: status.success.length,
|
|
788
|
-
failed: status.fail.length
|
|
789
|
-
});
|
|
790
|
-
}
|
|
791
|
-
if (status.oneFailed && !status.someSucceeded) {
|
|
792
|
-
return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_DELETION', {
|
|
793
|
-
name: status.fail[0].name
|
|
794
|
-
});
|
|
795
|
-
}
|
|
796
|
-
if (status.oneSucceeded && !status.someFailed) {
|
|
797
|
-
return new SnackbarInfoAction('APP.MESSAGES.INFO.NODE_DELETION.SINGULAR', { name: status.success[0].name });
|
|
798
|
-
}
|
|
799
|
-
return null;
|
|
800
|
-
}
|
|
801
|
-
showMoveMessage(nodes, info, moveResponse) {
|
|
802
|
-
const succeeded = moveResponse?.['succeeded'].length ?? 0;
|
|
803
|
-
const partiallySucceeded = moveResponse?.['partiallySucceeded'].length ?? 0;
|
|
804
|
-
const failures = moveResponse?.['failed'].length ?? 0;
|
|
805
|
-
let successMessage = '';
|
|
806
|
-
let partialSuccessMessage = '';
|
|
807
|
-
let failedMessage = '';
|
|
808
|
-
let errorMessage = '';
|
|
809
|
-
if (typeof info === 'string') {
|
|
810
|
-
// in case of success
|
|
811
|
-
if (info.toLowerCase().indexOf('succes') !== -1) {
|
|
812
|
-
const i18nMessageString = 'APP.MESSAGES.INFO.NODE_MOVE.';
|
|
813
|
-
let i18MessageSuffix = '';
|
|
814
|
-
if (succeeded) {
|
|
815
|
-
i18MessageSuffix = succeeded === 1 ? 'SINGULAR' : 'PLURAL';
|
|
816
|
-
successMessage = `${i18nMessageString}${i18MessageSuffix}`;
|
|
817
|
-
}
|
|
818
|
-
if (partiallySucceeded) {
|
|
819
|
-
i18MessageSuffix = partiallySucceeded === 1 ? 'PARTIAL.SINGULAR' : 'PARTIAL.PLURAL';
|
|
820
|
-
partialSuccessMessage = `${i18nMessageString}${i18MessageSuffix}`;
|
|
821
|
-
}
|
|
822
|
-
if (failures) {
|
|
823
|
-
// if moving failed for ALL nodes, emit error
|
|
824
|
-
if (failures === nodes.length) {
|
|
825
|
-
const errors = this.nodeActionsService.flatten(moveResponse['failed']);
|
|
826
|
-
errorMessage = this.getErrorMessage(errors[0]);
|
|
827
|
-
}
|
|
828
|
-
else {
|
|
829
|
-
i18MessageSuffix = 'PARTIAL.FAIL';
|
|
830
|
-
failedMessage = `${i18nMessageString}${i18MessageSuffix}`;
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
else {
|
|
835
|
-
errorMessage = 'APP.MESSAGES.ERRORS.GENERIC';
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
else {
|
|
839
|
-
errorMessage = this.getErrorMessage(info);
|
|
840
|
-
}
|
|
841
|
-
const undo = succeeded + partiallySucceeded > 0 ? this.translation.instant('APP.ACTIONS.UNDO') : '';
|
|
842
|
-
failedMessage = errorMessage ? errorMessage : failedMessage;
|
|
843
|
-
const beforePartialSuccessMessage = successMessage && partialSuccessMessage ? ' ' : '';
|
|
844
|
-
const beforeFailedMessage = (successMessage || partialSuccessMessage) && failedMessage ? ' ' : '';
|
|
845
|
-
const initialParentId = this.nodeActionsService.getEntryParentId(nodes[0].entry);
|
|
846
|
-
const messages = this.translation.instant([successMessage, partialSuccessMessage, failedMessage], {
|
|
847
|
-
success: succeeded,
|
|
848
|
-
failed: failures,
|
|
849
|
-
partially: partiallySucceeded
|
|
850
|
-
});
|
|
851
|
-
// TODO: review in terms of i18n
|
|
852
|
-
this.notificationService
|
|
853
|
-
.openSnackMessageAction(messages[successMessage] + beforePartialSuccessMessage + messages[partialSuccessMessage] + beforeFailedMessage + messages[failedMessage], undo, {
|
|
854
|
-
panelClass: 'info-snackbar'
|
|
855
|
-
})
|
|
856
|
-
.onAction()
|
|
857
|
-
.subscribe(() => this.undoMoveNodes(moveResponse, initialParentId));
|
|
858
|
-
}
|
|
859
|
-
focusAfterClose(focusedElementSelector) {
|
|
860
|
-
if (focusedElementSelector) {
|
|
861
|
-
document.querySelector(focusedElementSelector)?.focus();
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
ContentManagementService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContentManagementService, deps: [{ token: i1.NodesApiService }, { token: i2.Store }, { token: i3.ContentApiService }, { token: i3.NodePermissionService }, { token: i4.MatDialog }, { token: i5.NodeActionsService }, { token: i6.TranslationService }, { token: i1.NodeAspectService }, { token: i3.AppHookService }, { token: i1.NewVersionUploaderService }, { token: i7.Router }, { token: i3.AppSettingsService }, { token: i1.DocumentListService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
866
|
-
ContentManagementService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContentManagementService, providedIn: 'root' });
|
|
867
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContentManagementService, decorators: [{
|
|
868
|
-
type: Injectable,
|
|
869
|
-
args: [{
|
|
870
|
-
providedIn: 'root'
|
|
871
|
-
}]
|
|
872
|
-
}], ctorParameters: function () { return [{ type: i1.NodesApiService }, { type: i2.Store }, { type: i3.ContentApiService }, { type: i3.NodePermissionService }, { type: i4.MatDialog }, { type: i5.NodeActionsService }, { type: i6.TranslationService }, { type: i1.NodeAspectService }, { type: i3.AppHookService }, { type: i1.NewVersionUploaderService }, { type: i7.Router }, { type: i3.AppSettingsService }, { type: i1.DocumentListService }]; } });
|
|
873
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1tYW5hZ2VtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2EtY29udGVudC9zcmMvbGliL3NlcnZpY2VzL2NvbnRlbnQtbWFuYWdlbWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BILE9BQU8sRUFJTCxlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUV0QixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUVoQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsNEJBQTRCLEVBRTVCLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQW1CLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7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QUFFLFNBQVM7WUFDbEIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLGtCQUFrQjtTQUM5QixDQUFDLENBQUM7UUFFSCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQjthQUNyQixzQkFBc0IsQ0FDckIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLDJCQUEyQixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFDeEksSUFBSSxFQUNKO1lBQ0UsVUFBVSxFQUFFLGVBQWU7U0FDNUIsQ0FDRjthQUNBLFFBQVEsRUFBRTthQUNWLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyxlQUFlLENBQUMsc0JBQThCO1FBQ3BELElBQUksc0JBQXNCLEVBQUU7WUFDMUIsUUFBUSxDQUFDLGFBQWEsQ0FBYyxzQkFBc0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ3RFO0lBQ0gsQ0FBQzs7c0hBbC9CVSx3QkFBd0I7MEhBQXhCLHdCQUF3QixjQUZ2QixNQUFNOzRGQUVQLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjQgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb25cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uLlxuICogSWYgdGhlIHNvZnR3YXJlIHdhcyBwdXJjaGFzZWQgdW5kZXIgYSBwYWlkIEFsZnJlc2NvIGxpY2Vuc2UsIHRoZSB0ZXJtcyBvZlxuICogdGhlIHBhaWQgbGljZW5zZSBhZ3JlZW1lbnQgd2lsbCBwcmV2YWlsLiBPdGhlcndpc2UsIHRoZSBzb2Z0d2FyZSBpc1xuICogcHJvdmlkZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBvcGVuIHNvdXJjZSBsaWNlbnNlIHRlcm1zOlxuICpcbiAqIFRoZSBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb24gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGZyb20gSHlsYW5kIFNvZnR3YXJlLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuaW1wb3J0IHsgQXBwSG9va1NlcnZpY2UsIEFwcFNldHRpbmdzU2VydmljZSwgQ29udGVudEFwaVNlcnZpY2UsIE5vZGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hY2Etc2hhcmVkJztcbmltcG9ydCB7XG4gIEFwcFN0b3JlLFxuICBEZWxldGVkTm9kZUluZm8sXG4gIERlbGV0ZVN0YXR1cyxcbiAgZ2V0QXBwU2VsZWN0aW9uLFxuICBOYXZpZ2F0ZVJvdXRlQWN0aW9uLFxuICBOYXZpZ2F0ZVRvUGFyZW50Rm9sZGVyLFxuICBOb2RlSW5mbyxcbiAgUmVmcmVzaFByZXZpZXdBY3Rpb24sXG4gIFNldFNlbGVjdGVkTm9kZXNBY3Rpb24sXG4gIFNob3dMb2FkZXJBY3Rpb24sXG4gIFNuYWNrYmFyQWN0aW9uLFxuICBTbmFja2JhckVycm9yQWN0aW9uLFxuICBTbmFja2JhckluZm9BY3Rpb24sXG4gIFNuYWNrYmFyVXNlckFjdGlvbixcbiAgU25hY2tiYXJXYXJuaW5nQWN0aW9uLFxuICBVbmRvRGVsZXRlTm9kZXNBY3Rpb24sXG4gIFVubG9ja1dyaXRlQWN0aW9uLFxuICBWaWV3Tm9kZVZlcnNpb25BY3Rpb25cbn0gZnJvbSAnQGFsZnJlc2NvL2FjYS1zaGFyZWQvc3RvcmUnO1xuaW1wb3J0IHtcbiAgRG9jdW1lbnRMaXN0U2VydmljZSxcbiAgRm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICBMaWJyYXJ5RGlhbG9nQ29tcG9uZW50LFxuICBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLFxuICBOZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhLFxuICBOZXdWZXJzaW9uVXBsb2FkZXJTZXJ2aWNlLFxuICBOb2RlQXNwZWN0U2VydmljZSxcbiAgTm9kZXNBcGlTZXJ2aWNlLFxuICBTaGFyZURpYWxvZ0NvbXBvbmVudFxufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvbnRlbnQtc2VydmljZXMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSwgVHJhbnNsYXRpb25TZXJ2aWNlLCBDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IERlbGV0ZWROb2Rlc1BhZ2luZywgTm9kZSwgTm9kZUVudHJ5LCBQYXRoSW5mbywgU2l0ZUJvZHlDcmVhdGUsIFNpdGVFbnRyeSB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIG1lcmdlTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOb2RlQWN0aW9uc1NlcnZpY2UgfSBmcm9tICcuL25vZGUtYWN0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmludGVyZmFjZSBSZXN0b3JlZE5vZGUge1xuICBzdGF0dXM6IG51bWJlcjtcbiAgZW50cnk6IE5vZGU7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvbnRlbnRNYW5hZ2VtZW50U2VydmljZSB7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVNZW51QnV0dG9uU2VsZWN0b3IgPSAnYXBwLXRvb2xiYXItbWVudSBidXR0b25baWQ9XCJhcHAudG9vbGJhci5jcmVhdGVcIl0nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbm9kZXNBcGlTZXJ2aWNlOiBOb2Rlc0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmU8QXBwU3RvcmU+LFxuICAgIHByaXZhdGUgY29udGVudEFwaTogQ29udGVudEFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uOiBOb2RlUGVybWlzc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIG5vZGVBY3Rpb25zU2VydmljZTogTm9kZUFjdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG5vZGVBc3BlY3RTZXJ2aWNlOiBOb2RlQXNwZWN0U2VydmljZSxcbiAgICBwcml2YXRlIGFwcEhvb2tTZXJ2aWNlOiBBcHBIb29rU2VydmljZSxcbiAgICBwcml2YXRlIG5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2U6IE5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFwcFNldHRpbmdzU2VydmljZTogQXBwU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG9jdW1lbnRMaXN0U2VydmljZTogRG9jdW1lbnRMaXN0U2VydmljZVxuICApIHt9XG5cbiAgYWRkRmF2b3JpdGUobm9kZXM6IEFycmF5PE5vZGVFbnRyeT4pIHtcbiAgICBpZiAobm9kZXMgJiYgbm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZW50QXBpLmFkZEZhdm9yaXRlKG5vZGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBmYXZvcml0ZU5vZGVzID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZSkpO1xuICAgICAgICAgIG5ld05vZGUuZW50cnkuaXNGYXZvcml0ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNldFNlbGVjdGVkTm9kZXNBY3Rpb24oZmF2b3JpdGVOb2RlcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmF2b3JpdGUobm9kZXM6IEFycmF5PE5vZGVFbnRyeT4pIHtcbiAgICBpZiAobm9kZXMgJiYgbm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZW50QXBpLnJlbW92ZUZhdm9yaXRlKG5vZGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBmYXZvcml0ZU5vZGVzID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZSkpO1xuICAgICAgICAgIG5ld05vZGUuZW50cnkuaXNGYXZvcml0ZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTZXRTZWxlY3RlZE5vZGVzQWN0aW9uKGZhdm9yaXRlTm9kZXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG1hbmFnZVZlcnNpb25zKG5vZGU6IGFueSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICBpZiAobm9kZT8uZW50cnkpIHtcbiAgICAgIC8vIHNoYXJlZCBhbmQgZmF2b3JpdGVcbiAgICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgKG5vZGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVJbmZvKGlkKS5zdWJzY3JpYmUoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuVmVyc2lvbk1hbmFnZXJEaWFsb2coZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5WZXJzaW9uTWFuYWdlckRpYWxvZyhub2RlLmVudHJ5LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbWFuYWdlQXNwZWN0cyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKG5vZGU/LmVudHJ5KSB7XG4gICAgICAvLyBzaGFyZWQgYW5kIGZhdm9yaXRlXG4gICAgICBjb25zdCBpZCA9IG5vZGUuZW50cnkubm9kZUlkIHx8IChub2RlIGFzIGFueSkuZW50cnkuZ3VpZDtcblxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHRoaXMuY29udGVudEFwaS5nZXROb2RlSW5mbyhpZCkuc3Vic2NyaWJlKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHRoaXMub3BlbkFzcGVjdExpc3REaWFsb2coZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5Bc3BlY3RMaXN0RGlhbG9nKG5vZGUuZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2ZXJzaW9uVXBkYXRlRGlhbG9nKG5vZGU6IE5vZGUsIGZpbGU6IEZpbGUpIHtcbiAgICB0aGlzLmNvbnRlbnRBcGkuZ2V0Tm9kZVZlcnNpb25zKG5vZGUuaWQpLnN1YnNjcmliZSgoeyBsaXN0IH0pID0+IHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGEgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBsaXN0LmVudHJpZXNbMF0uZW50cnksXG4gICAgICAgIHRpdGxlOiAnVkVSU0lPTi5ESUFMT0cuVElUTEUnLFxuICAgICAgICBzaG93Q29tbWVudHM6IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLnVwbG9hZEFsbG93Q29tbWVudHMsXG4gICAgICAgIGFsbG93RG93bmxvYWQ6IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLnVwbG9hZEFsbG93RG93bmxvYWRcbiAgICAgIH0gYXMgTmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YTtcbiAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnID0geyB3aWR0aDogJzYwMHB4JyB9O1xuXG4gICAgICB0aGlzLm5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2Uub3BlblVwbG9hZE5ld1ZlcnNpb25EaWFsb2cobmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YSwgZGlhbG9nQ29uZmlnKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEuYWN0aW9uID09PSBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLnVwbG9hZCkge1xuICAgICAgICAgICAgaWYgKGRhdGEubmV3VmVyc2lvbi52YWx1ZS5lbnRyeS5wcm9wZXJ0aWVzWydjbTpsb2NrVHlwZSddID09PSAnV1JJVEVfTE9DSycpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgVW5sb2NrV3JpdGVBY3Rpb24oZGF0YS5uZXdWZXJzaW9uLnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZXJyb3IpID0+IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoZXJyb3IpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgc2hhcmVOb2RlKG5vZGU6IGFueSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobm9kZT8uZW50cnkpIHtcbiAgICAgIC8vIHNoYXJlZCBhbmQgZmF2b3JpdGVcbiAgICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgKG5vZGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVJbmZvKGlkKS5zdWJzY3JpYmUoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuU2hhcmVMaW5rRGlhbG9nKHsgZW50cnkgfSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3BlblNoYXJlTGlua0RpYWxvZyhub2RlLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3BlblNoYXJlTGlua0RpYWxvZyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVNoYXJlVXJsID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYmFzZVNoYXJlVXJsO1xuXG4gICAgdGhpcy5kaWFsb2dSZWZcbiAgICAgIC5vcGVuKFNoYXJlRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcbiAgICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICAgIHBhbmVsQ2xhc3M6ICdhZGYtc2hhcmUtbGluay1kaWFsb2cnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBiYXNlU2hhcmVVcmxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU2V0U2VsZWN0ZWROb2Rlc0FjdGlvbihbbm9kZV0pKTtcbiAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5saW5rc1Vuc2hhcmVkLm5leHQoKTtcbiAgICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgfSk7XG4gIH1cblxuICBjcmVhdGVGb2xkZXIocGFyZW50Tm9kZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaWFsb2dJbnN0YW5jZSA9IHRoaXMuZGlhbG9nUmVmLm9wZW4oRm9sZGVyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHBhcmVudE5vZGVJZCxcbiAgICAgICAgY3JlYXRlVGl0bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgbm9kZVR5cGU6ICdjbTpmb2xkZXInXG4gICAgICB9LFxuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICByb2xlOiAnZGlhbG9nJ1xuICAgIH0pO1xuXG4gICAgZGlhbG9nSW5zdGFuY2UuY29tcG9uZW50SW5zdGFuY2UuZXJyb3Iuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgfSk7XG5cbiAgICBkaWFsb2dJbnN0YW5jZS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UodGhpcy5jcmVhdGVNZW51QnV0dG9uU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgZWRpdEZvbGRlcihmb2xkZXI6IE5vZGVFbnRyeSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuZGlhbG9nUmVmLm9wZW4oRm9sZGVyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZvbGRlcjogZm9sZGVyLmVudHJ5XG4gICAgICB9LFxuICAgICAgd2lkdGg6ICc0MDBweCdcbiAgICB9KTtcblxuICAgIGRpYWxvZy5jb21wb25lbnRJbnN0YW5jZS5lcnJvci5zdWJzY3JpYmUoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICB9KTtcblxuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU2V0U2VsZWN0ZWROb2Rlc0FjdGlvbihbeyBlbnRyeTogbm9kZSB9XSkpO1xuICAgICAgICB0aGlzLm5vZGVzQXBpU2VydmljZS5ub2RlVXBkYXRlZC5uZXh0KG5vZGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTGlicmFyeSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRpYWxvZ0luc3RhbmNlID0gdGhpcy5kaWFsb2dSZWYub3BlbihMaWJyYXJ5RGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzQwMHB4J1xuICAgIH0pO1xuXG4gICAgZGlhbG9nSW5zdGFuY2UuY29tcG9uZW50SW5zdGFuY2UuZXJyb3Iuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGlhbG9nSW5zdGFuY2UuYWZ0ZXJDbG9zZWQoKS5waXBlKFxuICAgICAgdGFwKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5saWJyYXJ5Q3JlYXRlZC5uZXh0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlKHRoaXMuY3JlYXRlTWVudUJ1dHRvblNlbGVjdG9yKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChub2RlOiBTaXRlRW50cnkpID0+IHtcbiAgICAgICAgaWYgKG5vZGU/LmVudHJ5Py5ndWlkKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZW50cnkuZ3VpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUxpYnJhcnkoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudEFwaS5kZWxldGVTaXRlKGlkKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlicmFyeURlbGV0ZWQubmV4dChpZCk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uTElCUkFSWV9ERUxFVEVEJyk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5hdmlnYXRlUm91dGVBY3Rpb24oWycvbGlicmFyaWVzJ10pKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuREVMRVRFX0xJQlJBUllfRkFJTEVEJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGxlYXZlTGlicmFyeShzaXRlSWQ6IHN0cmluZywgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZi5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICdBUFAuRElBTE9HUy5DT05GSVJNX0xFQVZFLlRJVExFJyxcbiAgICAgICAgbWVzc2FnZTogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fTEVBVkUuTUVTU0FHRScsXG4gICAgICAgIHllc0xhYmVsOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9MRUFWRS5ZRVNfTEFCRUwnLFxuICAgICAgICBub0xhYmVsOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9MRUFWRS5OT19MQUJFTCdcbiAgICAgIH0sXG4gICAgICBtaW5XaWR0aDogJzI1MHB4J1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmxlYXZlU2l0ZShzaXRlSWQpLnN1YnNjcmliZShcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLmxpYnJhcnlMZWZ0Lm5leHQoc2l0ZUlkKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uTEVGVF9MSUJSQVJZJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdBUFAuTUVTU0FHRVMuRVJST1JTLkxFQVZFX0xJQlJBUllfRkFJTEVEJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlTGlicmFyeShzaXRlSWQ6IHN0cmluZywgc2l0ZUJvZHk6IFNpdGVCb2R5Q3JlYXRlKSB7XG4gICAgdGhpcy5jb250ZW50QXBpLnVwZGF0ZUxpYnJhcnkoc2l0ZUlkLCBzaXRlQm9keSkuc3Vic2NyaWJlKFxuICAgICAgKHNpdGVFbnRyeTogU2l0ZUVudHJ5KSA9PiB7XG4gICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlicmFyeVVwZGF0ZWQubmV4dChzaXRlRW50cnkpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0luZm8oJ0xJQlJBUlkuU1VDQ0VTUy5MSUJSQVJZX1VQREFURUQnKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0xJQlJBUlkuRVJST1JTLkxJQlJBUllfVVBEQVRFX0VSUk9SJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVuc2hhcmVOb2RlcyhsaW5rczogQXJyYXk8Tm9kZUVudHJ5Pikge1xuICAgIGNvbnN0IHByb21pc2VzID0gbGlua3MubWFwKChsaW5rKSA9PiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlU2hhcmVkTGluayhsaW5rLmVudHJ5LmlkKS50b1Byb21pc2UoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlua3NVbnNoYXJlZC5uZXh0KCk7XG4gIH1cblxuICBjYW5VcGRhdGVOb2RlKG5vZGU6IE5vZGVFbnRyeSB8IE5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uLmNoZWNrKG5vZGUsIFsndXBkYXRlJ10pO1xuICB9XG5cbiAgY2FuVXBsb2FkQ29udGVudChmb2xkZXJOb2RlOiBOb2RlRW50cnkgfCBOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbi5jaGVjayhmb2xkZXJOb2RlLCBbJ2NyZWF0ZSddKTtcbiAgfVxuXG4gIHB1cmdlRGVsZXRlZE5vZGVzKG5vZGVzOiBOb2RlRW50cnlbXSkge1xuICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dSZWYub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9QVVJHRS5USVRMRScsXG4gICAgICAgIG1lc3NhZ2U6ICdBUFAuRElBTE9HUy5DT05GSVJNX1BVUkdFLk1FU1NBR0UnLFxuICAgICAgICB5ZXNMYWJlbDogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fUFVSR0UuWUVTX0xBQkVMJyxcbiAgICAgICAgbm9MYWJlbDogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fUFVSR0UuTk9fTEFCRUwnXG4gICAgICB9LFxuICAgICAgbWluV2lkdGg6ICcyNTBweCdcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzVG9EZWxldGU6IE5vZGVJbmZvW10gPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuZW50cnk7XG4gICAgICAgICAgY29uc3QgaWQgPSAobm9kZSBhcyBhbnkpLmVudHJ5Lm5vZGVJZCB8fCBub2RlLmVudHJ5LmlkO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnB1cmdlTm9kZXMobm9kZXNUb0RlbGV0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXN0b3JlRGVsZXRlZE5vZGVzKHNlbGVjdGlvbjogTm9kZUVudHJ5W10gPSBbXSkge1xuICAgIGlmICghc2VsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzV2l0aFBhdGggPSBzZWxlY3Rpb24uZmlsdGVyKChub2RlKSA9PiBub2RlLmVudHJ5LnBhdGgpO1xuXG4gICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggJiYgIW5vZGVzV2l0aFBhdGgubGVuZ3RoKSB7XG4gICAgICBjb25zdCBmYWlsZWRTdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMoW10pO1xuICAgICAgZmFpbGVkU3RhdHVzLmZhaWwucHVzaCguLi5zZWxlY3Rpb24pO1xuICAgICAgdGhpcy5zaG93UmVzdG9yZU5vdGlmaWNhdGlvbihmYWlsZWRTdGF0dXMpO1xuICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdGF0dXM6IERlbGV0ZVN0YXR1cztcblxuICAgIGZvcmtKb2luKG5vZGVzV2l0aFBhdGgubWFwKChub2RlKSA9PiB0aGlzLnJlc3RvcmVOb2RlKG5vZGUpKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3RvcmVkTm9kZXMpID0+IHtcbiAgICAgICAgICBzdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMocmVzdG9yZWROb2Rlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmNvbnRlbnRBcGkuZ2V0RGVsZXRlZE5vZGVzKCkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChub2RlczogRGVsZXRlZE5vZGVzUGFnaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZXMgPSB0aGlzLmRpZmYoc3RhdHVzLmZhaWwsIHNlbGVjdGlvbiwgZmFsc2UpO1xuICAgICAgICBjb25zdCByZW1haW5pbmdOb2RlcyA9IHRoaXMuZGlmZihzZWxlY3RlZE5vZGVzLCBub2Rlcy5saXN0LmVudHJpZXMpO1xuXG4gICAgICAgIGlmICghcmVtYWluaW5nTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zaG93UmVzdG9yZU5vdGlmaWNhdGlvbihzdGF0dXMpO1xuICAgICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlc3RvcmVEZWxldGVkTm9kZXMocmVtYWluaW5nTm9kZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGNvcHlOb2Rlcyhub2RlczogQXJyYXk8Tm9kZUVudHJ5PiwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICB6aXAodGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29weU5vZGVzKG5vZGVzLCB1bmRlZmluZWQsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKSwgdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29udGVudENvcGllZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zdCBbb3BlcmF0aW9uUmVzdWx0LCBuZXdJdGVtc10gPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2hvd0NvcHlNZXNzYWdlKG9wZXJhdGlvblJlc3VsdCwgbm9kZXMsIG5ld0l0ZW1zKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zaG93Q29weU1lc3NhZ2UoZXJyb3IsIG5vZGVzKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbW92ZU5vZGVzKG5vZGVzOiBBcnJheTxOb2RlRW50cnk+LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZykge1xuICAgIGNvbnN0IHBlcm1pc3Npb25Gb3JNb3ZlID0gJyEnO1xuXG4gICAgemlwKHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLm1vdmVOb2Rlcyhub2RlcywgcGVybWlzc2lvbkZvck1vdmUsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKSwgdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29udGVudE1vdmVkKS5zdWJzY3JpYmUoXG4gICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnN0IFtvcGVyYXRpb25SZXN1bHQsIG1vdmVSZXNwb25zZV0gPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2hvd01vdmVNZXNzYWdlKG5vZGVzLCBvcGVyYXRpb25SZXN1bHQsIG1vdmVSZXNwb25zZSk7XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNob3dNb3ZlTWVzc2FnZShub2RlcywgZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZXJyb3JPYmplY3Q6IHsgbWVzc2FnZTogYW55IH0pOiBzdHJpbmcge1xuICAgIGxldCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICB9ID0gSlNPTi5wYXJzZShlcnJvck9iamVjdC5tZXNzYWdlKTtcblxuICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwOSkge1xuICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfTU9WRSc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLlBFUk1JU1NJT04nO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogRG8gbm90aGluZywga2VlcCB0aGUgb3JpZ2luYWwgbWVzc2FnZSAqL1xuICAgIH1cblxuICAgIHJldHVybiBpMThuTWVzc2FnZVN0cmluZztcbiAgfVxuXG4gIGdldE5vZGVJbmZvKCk6IE9ic2VydmFibGU8Tm9kZT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChnZXRBcHBTZWxlY3Rpb24pLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWVyZ2VNYXAoKHsgZmlsZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gKGZpbGUgYXMgYW55KS5lbnRyeS5ub2RlSWQgfHwgKGZpbGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGZpbGUuZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZ2V0Tm9kZUluZm8oaWQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB1bmxvY2tOb2RlKG5vZGU6IE5vZGVFbnRyeSk6IFByb21pc2U8dm9pZCB8IE5vZGVFbnRyeT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkudW5sb2NrTm9kZShub2RlLmVudHJ5LmlkKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdBUFAuTUVTU0FHRVMuRVJST1JTLlVOTE9DS19OT0RFJywgbnVsbCwgeyBmaWxlTmFtZTogbm9kZS5lbnRyeS5uYW1lIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Q29weU1lc3NhZ2UoaW5mbzogYW55LCBub2RlczogQXJyYXk8Tm9kZUVudHJ5PiwgbmV3SXRlbXM/OiBBcnJheTxOb2RlRW50cnk+KSB7XG4gICAgY29uc3QgbnVtYmVyT2ZDb3BpZWRJdGVtcyA9IG5ld0l0ZW1zID8gbmV3SXRlbXMubGVuZ3RoIDogMDtcbiAgICBjb25zdCBmYWlsZWRJdGVtcyA9IG5vZGVzLmxlbmd0aCAtIG51bWJlck9mQ29waWVkSXRlbXM7XG5cbiAgICBsZXQgaTE4bk1lc3NhZ2VTdHJpbmcgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5HRU5FUklDJztcblxuICAgIGlmICh0eXBlb2YgaW5mbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChpbmZvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc3VjY2VzJykgIT09IC0xKSB7XG4gICAgICAgIGxldCBpMThNZXNzYWdlU3VmZml4O1xuXG4gICAgICAgIGlmIChmYWlsZWRJdGVtcykge1xuICAgICAgICAgIGlmIChudW1iZXJPZkNvcGllZEl0ZW1zKSB7XG4gICAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gbnVtYmVyT2ZDb3BpZWRJdGVtcyA9PT0gMSA/ICdQQVJUSUFMX1NJTkdVTEFSJyA6ICdQQVJUSUFMX1BMVVJBTCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSBmYWlsZWRJdGVtcyA9PT0gMSA/ICdGQUlMX1NJTkdVTEFSJyA6ICdGQUlMX1BMVVJBTCc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSBudW1iZXJPZkNvcGllZEl0ZW1zID09PSAxID8gJ1NJTkdVTEFSJyA6ICdQTFVSQUwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaTE4bk1lc3NhZ2VTdHJpbmcgPSBgQVBQLk1FU1NBR0VTLklORk8uTk9ERV9DT1BZLiR7aTE4TWVzc2FnZVN1ZmZpeH1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGluZm8ubWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgIGkxOG5NZXNzYWdlU3RyaW5nID0gJ0FQUC5NRVNTQUdFUy5FUlJPUlMuUEVSTUlTU0lPTic7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG5cbiAgICBjb25zdCB1bmRvID0gbnVtYmVyT2ZDb3BpZWRJdGVtcyA+IDAgPyB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5BQ1RJT05TLlVORE8nKSA6ICcnO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudChpMThuTWVzc2FnZVN0cmluZywge1xuICAgICAgc3VjY2VzczogbnVtYmVyT2ZDb3BpZWRJdGVtcyxcbiAgICAgIGZhaWxlZDogZmFpbGVkSXRlbXNcbiAgICB9KTtcblxuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZVxuICAgICAgLm9wZW5TbmFja01lc3NhZ2VBY3Rpb24obWVzc2FnZSwgdW5kbywge1xuICAgICAgICBwYW5lbENsYXNzOiAnaW5mby1zbmFja2JhcidcbiAgICAgIH0pXG4gICAgICAub25BY3Rpb24oKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVuZG9Db3B5Tm9kZXMobmV3SXRlbXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5kb0NvcHlOb2Rlcyhub2RlczogTm9kZUVudHJ5W10pIHtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAuZmxhdHRlbihub2RlcylcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZW50cnkpXG4gICAgICAubWFwKChpdGVtKSA9PiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlTm9kZShpdGVtLmVudHJ5LmlkLCB7IHBlcm1hbmVudDogdHJ1ZSB9KSk7XG5cbiAgICBmb3JrSm9pbiguLi5iYXRjaCkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLm5vZGVzRGVsZXRlZC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGxldCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgICAgIGxldCBlcnJvckpzb24gPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGVycm9ySnNvbiA9IEpTT04ucGFyc2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICBpZiAoZXJyb3JKc29uPy5lcnJvcj8uc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgaTE4bk1lc3NhZ2VTdHJpbmcgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoaTE4bk1lc3NhZ2VTdHJpbmcpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5WZXJzaW9uTWFuYWdlckRpYWxvZyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgLy8gd29ya2Fyb3VuZCBTaGFyZWRcbiAgICBpZiAobm9kZS5pc0ZpbGUgfHwgbm9kZS5ub2RlSWQpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGE6IE5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGEgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIHNob3dWZXJzaW9uc09ubHk6IHRydWUsXG4gICAgICAgIHRpdGxlOiAnVkVSU0lPTi5ESUFMT0cuVElUTEUnXG4gICAgICB9O1xuICAgICAgdGhpcy5uZXdWZXJzaW9uVXBsb2FkZXJTZXJ2aWNlXG4gICAgICAgIC5vcGVuVXBsb2FkTmV3VmVyc2lvbkRpYWxvZyhuZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhLCB7IHdpZHRoOiAnNjMwcHgnLCByb2xlOiAnZGlhbG9nJyB9LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3RvcilcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKG5ld1ZlcnNpb25VcGxvYWRlckRhdGEpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobmV3VmVyc2lvblVwbG9hZGVyRGF0YS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgY2FzZSBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLnJlZnJlc2g6XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJlZnJlc2hQcmV2aWV3QWN0aW9uKG5ld1ZlcnNpb25VcGxvYWRlckRhdGEubm9kZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIE5ld1ZlcnNpb25VcGxvYWRlckRhdGFBY3Rpb24udmlldzpcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgbmV3IFZpZXdOb2RlVmVyc2lvbkFjdGlvbihub2RlLmlkLCBuZXdWZXJzaW9uVXBsb2FkZXJEYXRhLnZlcnNpb25JZCwge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogdGhpcy5yb3V0ZXIudXJsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQXNwZWN0TGlzdERpYWxvZyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgLy8gd29ya2Fyb3VuZCBTaGFyZWRcbiAgICBpZiAobm9kZS5pc0ZpbGUgfHwgbm9kZS5pZCkge1xuICAgICAgdGhpcy5ub2RlQXNwZWN0U2VydmljZS51cGRhdGVOb2RlQXNwZWN0cyhub2RlLmlkLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuUEVSTUlTU0lPTicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5kb01vdmVOb2Rlcyhtb3ZlUmVzcG9uc2UsIHNlbGVjdGlvblBhcmVudElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtb3ZlZE5vZGVzID0gbW92ZVJlc3BvbnNlPy5bJ3N1Y2NlZWRlZCddID8/IFtdO1xuICAgIGNvbnN0IHBhcnRpYWxseU1vdmVkTm9kZXMgPSBtb3ZlUmVzcG9uc2U/LlsncGFydGlhbGx5U3VjY2VlZGVkJ10gPz8gW107XG5cbiAgICBjb25zdCByZXN0b3JlRGVsZXRlZE5vZGVzQmF0Y2ggPSB0aGlzLm5vZGVBY3Rpb25zU2VydmljZS5tb3ZlRGVsZXRlZEVudHJpZXMubWFwKChmb2xkZXJFbnRyeSkgPT5cbiAgICAgIHRoaXMuY29udGVudEFwaS5yZXN0b3JlTm9kZShmb2xkZXJFbnRyeS5ub2RlSWQgfHwgZm9sZGVyRW50cnkuaWQpLnBpcGUobWFwKChub2RlKSA9PiBub2RlLmVudHJ5KSlcbiAgICApO1xuXG4gICAgemlwKC4uLnJlc3RvcmVEZWxldGVkTm9kZXNCYXRjaCwgb2YobnVsbCkpXG4gICAgICAucGlwZShcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vZGVzVG9CZU1vdmVkQmFjayA9IFsuLi5wYXJ0aWFsbHlNb3ZlZE5vZGVzLCAuLi5tb3ZlZE5vZGVzXTtcblxuICAgICAgICAgIGNvbnN0IHJldmVydE1vdmVCYXRjaCA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAgICAgICAuZmxhdHRlbihub2Rlc1RvQmVNb3ZlZEJhY2spXG4gICAgICAgICAgICAuZmlsdGVyKChub2RlKSA9PiBub2RlLmVudHJ5IHx8IG5vZGUuaXRlbU1vdmVkPy5lbnRyeSlcbiAgICAgICAgICAgIC5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUuaXRlbU1vdmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLm1vdmVOb2RlQWN0aW9uKG5vZGUuaXRlbU1vdmVkLmVudHJ5LCBub2RlLmluaXRpYWxQYXJlbnRJZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLm1vdmVOb2RlQWN0aW9uKG5vZGUuZW50cnksIHNlbGVjdGlvblBhcmVudElkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gemlwKC4uLnJldmVydE1vdmVCYXRjaCwgb2YobnVsbCkpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgbGV0IG1lc3NhZ2UgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5HRU5FUklDJztcblxuICAgICAgICAgIGxldCBlcnJvckpzb24gPSBudWxsO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlcnJvckpzb24gPSBKU09OLnBhcnNlKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgIGlmIChlcnJvckpzb24/LmVycm9yPy5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgZGVsZXRlTm9kZXMoaXRlbXM6IE5vZGVFbnRyeVtdKTogdm9pZCB7XG4gICAgY29uc3QgYmF0Y2g6IE9ic2VydmFibGU8RGVsZXRlZE5vZGVJbmZvPltdID0gW107XG5cbiAgICBpdGVtcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBiYXRjaC5wdXNoKHRoaXMuZGVsZXRlTm9kZShub2RlKSk7XG4gICAgfSk7XG5cbiAgICBmb3JrSm9pbiguLi5iYXRjaCkuc3Vic2NyaWJlKChkYXRhOiBEZWxldGVkTm9kZUluZm9bXSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5wcm9jZXNzU3RhdHVzKGRhdGEpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0RGVsZXRlTWVzc2FnZShzdGF0dXMpO1xuXG4gICAgICBpZiAobWVzc2FnZSAmJiBzdGF0dXMuc29tZVN1Y2NlZWRlZCkge1xuICAgICAgICBtZXNzYWdlLnVzZXJBY3Rpb24gPSBuZXcgU25hY2tiYXJVc2VyQWN0aW9uKCdBUFAuQUNUSU9OUy5VTkRPJywgbmV3IFVuZG9EZWxldGVOb2Rlc0FjdGlvbihbLi4uc3RhdHVzLnN1Y2Nlc3NdKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWVzc2FnZSk7XG5cbiAgICAgIGlmIChzdGF0dXMuc29tZVN1Y2NlZWRlZCkge1xuICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLm5vZGVzRGVsZXRlZC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNob3dMb2FkZXJBY3Rpb24oZmFsc2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuZG9EZWxldGVOb2RlcyhpdGVtczogRGVsZXRlZE5vZGVJbmZvW10pOiB2b2lkIHtcbiAgICBjb25zdCBiYXRjaDogT2JzZXJ2YWJsZTxEZWxldGVkTm9kZUluZm8+W10gPSBbXTtcblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGJhdGNoLnB1c2godGhpcy51bmRvRGVsZXRlTm9kZShpdGVtKSk7XG4gICAgfSk7XG5cbiAgICBmb3JrSm9pbiguLi5iYXRjaCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBwcm9jZXNzZWREYXRhID0gdGhpcy5wcm9jZXNzU3RhdHVzKGRhdGEpO1xuXG4gICAgICBpZiAocHJvY2Vzc2VkRGF0YS5mYWlsLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5nZXRVbmRvRGVsZXRlTWVzc2FnZShwcm9jZXNzZWREYXRhKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3NlZERhdGEuc29tZVN1Y2NlZWRlZCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVuZG9EZWxldGVOb2RlKGl0ZW06IERlbGV0ZWROb2RlSW5mbyk6IE9ic2VydmFibGU8RGVsZXRlZE5vZGVJbmZvPiB7XG4gICAgY29uc3QgeyBpZCwgbmFtZSB9ID0gaXRlbTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkucmVzdG9yZU5vZGUoaWQpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHN0YXR1czogMVxuICAgICAgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PlxuICAgICAgICBvZih7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBzdGF0dXM6IDBcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVbmRvRGVsZXRlTWVzc2FnZShzdGF0dXM6IERlbGV0ZVN0YXR1cyk6IFNuYWNrYmFyQWN0aW9uIHtcbiAgICBpZiAoc3RhdHVzLnNvbWVGYWlsZWQgJiYgIXN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5OT0RFX1JFU1RPUkVfUExVUkFMJywgeyBudW1iZXI6IHN0YXR1cy5mYWlsLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLm9uZUZhaWxlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfUkVTVE9SRScsIHtcbiAgICAgICAgbmFtZTogc3RhdHVzLmZhaWxbMF0ubmFtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVOb2RlKG5vZGU6IE5vZGVFbnRyeSk6IE9ic2VydmFibGU8UmVzdG9yZWROb2RlPiB7XG4gICAgY29uc3QgeyBlbnRyeSB9ID0gbm9kZTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkucmVzdG9yZU5vZGUoZW50cnkuaWQpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gKHtcbiAgICAgICAgc3RhdHVzOiAxLFxuICAgICAgICBlbnRyeVxuICAgICAgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXNDb2RlIH0gPSBKU09OLnBhcnNlKGVycm9yLm1lc3NhZ2UpLmVycm9yO1xuXG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgZW50cnlcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHB1cmdlTm9kZXMoc2VsZWN0aW9uOiBOb2RlSW5mb1tdID0gW10pIHtcbiAgICBpZiAoIXNlbGVjdGlvbi5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXRjaCA9IHNlbGVjdGlvbi5tYXAoKG5vZGUpID0+IHRoaXMucHVyZ2VEZWxldGVkTm9kZShub2RlKSk7XG5cbiAgICBmb3JrSm9pbihiYXRjaCkuc3Vic2NyaWJlKChwdXJnZWROb2RlcykgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5wcm9jZXNzU3RhdHVzKHB1cmdlZE5vZGVzKTtcblxuICAgICAgaWYgKHN0YXR1cy5zdWNjZXNzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VuZFB1cmdlTWVzc2FnZShzdGF0dXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXJnZURlbGV0ZWROb2RlKG5vZGU6IE5vZGVJbmZvKTogT2JzZXJ2YWJsZTxEZWxldGVkTm9kZUluZm8+IHtcbiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSBub2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudEFwaS5wdXJnZURlbGV0ZWROb2RlKGlkKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7XG4gICAgICAgIHN0YXR1czogMSxcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWVcbiAgICAgIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgb2Yoe1xuICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1N0YXR1cyhkYXRhOiBBcnJheTx7IHN0YXR1czogbnVtYmVyIH0+ID0gW10pOiBEZWxldGVTdGF0dXMge1xuICAgIGNvbnN0IHN0YXR1cyA9IHtcbiAgICAgIGZhaWw6IFtdLFxuICAgICAgc3VjY2VzczogW10sXG4gICAgICBnZXQgc29tZUZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5mYWlsLmxlbmd0aDtcbiAgICAgIH0sXG4gICAgICBnZXQgc29tZVN1Y2NlZWRlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdWNjZXNzLmxlbmd0aDtcbiAgICAgIH0sXG4gICAgICBnZXQgb25lRmFpbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsLmxlbmd0aCA9PT0gMTtcbiAgICAgIH0sXG4gICAgICBnZXQgb25lU3VjY2VlZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzLmxlbmd0aCA9PT0gMTtcbiAgICAgIH0sXG4gICAgICBnZXQgYWxsU3VjY2VlZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb21lU3VjY2VlZGVkICYmICF0aGlzLnNvbWVGYWlsZWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IGFsbEZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29tZUZhaWxlZCAmJiAhdGhpcy5zb21lU3VjY2VlZGVkO1xuICAgICAgfSxcbiAgICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmZhaWwgPSBbXTtcbiAgICAgICAgdGhpcy5zdWNjZXNzID0gW107XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBkYXRhLnJlZHVjZSgoYWNjLCBub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS5zdGF0dXMpIHtcbiAgICAgICAgYWNjLnN1Y2Nlc3MucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjYy5mYWlsLnB1c2gobm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgc3RhdHVzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZFB1cmdlTWVzc2FnZShzdGF0dXM6IERlbGV0ZVN0YXR1cyk6IHZvaWQge1xuICAgIGlmIChzdGF0dXMub25lU3VjY2VlZGVkICYmIHN0YXR1cy5zb21lRmFpbGVkICYmICFzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1BVUkdFLlBBUlRJQUxfU0lOR1VMQVInLCBudWxsLCB7XG4gICAgICAgIG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLm5hbWUsXG4gICAgICAgIGZhaWxlZDogc3RhdHVzLmZhaWwubGVuZ3RoXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLnNvbWVTdWNjZWVkZWQgJiYgIXN0YXR1cy5vbmVTdWNjZWVkZWQgJiYgc3RhdHVzLnNvbWVGYWlsZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93V2FybmluZygnQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUFVSR0UuUEFSVElBTF9QTFVSQUwnLCBudWxsLCB7XG4gICAgICAgIG51bWJlcjogc3RhdHVzLnN1Y2Nlc3MubGVuZ3RoLFxuICAgICAgICBmYWlsZWQ6IHN0YXR1cy5mYWlsLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUFVSR0UuU0lOR1VMQVInLCBudWxsLCB7IG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLm5hbWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUFVSR0UuU0lOR1VMQVInLCBudWxsLCB7IG5hbWU6IHN0YXR1cy5mYWlsWzBdLm5hbWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5hbGxTdWNjZWVkZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUFVSR0UuUExVUkFMJywgbnVsbCwgeyBudW1iZXI6IHN0YXR1cy5zdWNjZXNzLmxlbmd0aCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmFsbEZhaWxlZCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19QVVJHRS5QTFVSQUwnLCBudWxsLCB7IG51bWJlcjogc3RhdHVzLmZhaWwubGVuZ3RoIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvd1Jlc3RvcmVOb3RpZmljYXRpb24oc3RhdHVzOiBEZWxldGVTdGF0dXMpOiB2b2lkIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5nZXRSZXN0b3JlTWVzc2FnZShzdGF0dXMpO1xuXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIGlmIChzdGF0dXMub25lU3VjY2VlZGVkICYmICFzdGF0dXMuc29tZUZhaWxlZCkge1xuICAgICAgICBjb25zdCBpc1NpdGUgPSB0aGlzLmlzU2l0ZShzdGF0dXMuc3VjY2Vzc1swXS5lbnRyeSk7XG4gICAgICAgIGNvbnN0IHBhdGg6IFBhdGhJbmZvID0gc3RhdHVzLnN1Y2Nlc3NbMF0uZW50cnkucGF0aDtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5lbGVtZW50c1twYXRoLmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCByb3V0ZSA9IGlzU2l0ZSA/IFsnL2xpYnJhcmllcycsIHBhcmVudC5pZF0gOiBbJy9wZXJzb25hbC1maWxlcycsIHBhcmVudC5pZF07XG5cbiAgICAgICAgbGV0IG5hdmlnYXRlO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTGlicmFyeUNvbnRlbnQocGF0aCkpIHtcbiAgICAgICAgICBuYXZpZ2F0ZSA9IG5ldyBOYXZpZ2F0ZVRvUGFyZW50Rm9sZGVyKHN0YXR1cy5zdWNjZXNzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuYXZpZ2F0ZSA9IG5ldyBOYXZpZ2F0ZVJvdXRlQWN0aW9uKHJvdXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2UudXNlckFjdGlvbiA9IG5ldyBTbmFja2JhclVzZXJBY3Rpb24oJ0FQUC5BQ1RJT05TLlZJRVcnLCBuYXZpZ2F0ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1NpdGUoZW50cnk6IE5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZW50cnkubm9kZVR5cGUgPT09ICdzdDpzaXRlJztcbiAgfVxuXG4gIHByaXZhdGUgaXNMaWJyYXJ5Q29udGVudChwYXRoOiBQYXRoSW5mbyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXRoICYmIHBhdGguZWxlbWVudHMubGVuZ3RoID49IDIgJiYgcGF0aC5lbGVtZW50c1sxXS5uYW1lID09PSAnU2l0ZXMnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXN0b3JlTWVzc2FnZShzdGF0dXM6IERlbGV0ZVN0YXR1cyk6IFNuYWNrYmFyQWN0aW9uIHtcbiAgICBpZiAoc3RhdHVzLnNvbWVGYWlsZWQgJiYgIXN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19SRVNUT1JFLlBBUlRJQUxfUExVUkFMJywge1xuICAgICAgICBudW1iZXI6IHN0YXR1cy5mYWlsLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQgJiYgc3RhdHVzLmZhaWxbMF0uc3RhdHVzQ29kZSkge1xuICAgICAgaWYgKHN0YXR1cy5mYWlsWzBdLnN0YXR1c0NvZGUgPT09IDQwOSkge1xuICAgICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUkVTVE9SRS5OT0RFX0VYSVNUUycsIHtcbiAgICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5lbnRyeS5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLlRSQVNILk5PREVTX1JFU1RPUkUuR0VORVJJQycsIHtcbiAgICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5lbnRyeS5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lRmFpbGVkICYmICFzdGF0dXMuZmFpbFswXS5zdGF0dXNDb2RlKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUkVTVE9SRS5MT0NBVElPTl9NSVNTSU5HJywge1xuICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5lbnRyeS5uYW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmFsbFN1Y2NlZWRlZCAmJiAhc3RhdHVzLm9uZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckluZm9BY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1JFU1RPUkUuUExVUkFMJyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5hbGxTdWNjZWVkZWQgJiYgc3RhdHVzLm9uZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckluZm9BY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1JFU1RPUkUuU0lOR1VMQVInLCB7XG4gICAgICAgIG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLmVudHJ5Lm5hbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBkaWZmKHNlbGVjdGlvbjogYW55W10sIGxpc3Q6IGFueVtdLCBmcm9tTGlzdCA9IHRydWUpOiBhbnkge1xuICAgIGNvbnN0IGlkcyA9IHNlbGVjdGlvbi5tYXAoKGl0ZW0pID0+IGl0ZW0uZW50cnkuaWQpO1xuXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICBpZiAoZnJvbUxpc3QpIHtcbiAgICAgICAgcmV0dXJuIGlkcy5pbmNsdWRlcyhpdGVtLmVudHJ5LmlkKSA/IGl0ZW0gOiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFpZHMuaW5jbHVkZXMoaXRlbS5lbnRyeS5pZCkgPyBpdGVtIDogbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlTm9kZShub2RlOiBhbnkpOiBPYnNlcnZhYmxlPERlbGV0ZWROb2RlSW5mbz4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gbm9kZS5lbnRyeTtcbiAgICBjb25zdCBpZCA9IG5vZGUuZW50cnkubm9kZUlkIHx8IG5vZGUuZW50cnkuaWQ7XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50QXBpLmRlbGV0ZU5vZGUoaWQpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHN0YXR1czogMVxuICAgICAgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PlxuICAgICAgICBvZih7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBzdGF0dXM6IDBcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWxldGVNZXNzYWdlKHN0YXR1czogRGVsZXRlU3RhdHVzKTogU25hY2tiYXJBY3Rpb24ge1xuICAgIGlmIChzdGF0dXMuYWxsRmFpbGVkICYmICFzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuTk9ERV9ERUxFVElPTl9QTFVSQUwnLCB7IG51bWJlcjogc3RhdHVzLmZhaWwubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuYWxsU3VjY2VlZGVkICYmICFzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uTk9ERV9ERUxFVElPTi5QTFVSQUwnLCB7XG4gICAgICAgIG51bWJlcjogc3RhdHVzLnN1Y2Nlc3MubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLnNvbWVGYWlsZWQgJiYgc3RhdHVzLnNvbWVTdWNjZWVkZWQgJiYgIXN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJXYXJuaW5nQWN0aW9uKCdBUFAuTUVTU0FHRVMuSU5GTy5OT0RFX0RFTEVUSU9OLlBBUlRJQUxfUExVUkFMJywge1xuICAgICAgICBzdWNjZXNzOiBzdGF0dXMuc3VjY2Vzcy5sZW5ndGgsXG4gICAgICAgIGZhaWxlZDogc3RhdHVzLmZhaWwubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLnNvbWVGYWlsZWQgJiYgc3RhdHVzLm9uZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2Jhcldhcm5pbmdBY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLk5PREVfREVMRVRJT04uUEFSVElBTF9TSU5HVUxBUicsIHtcbiAgICAgICAgc3VjY2Vzczogc3RhdHVzLnN1Y2Nlc3MubGVuZ3RoLFxuICAgICAgICBmYWlsZWQ6IHN0YXR1cy5mYWlsLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQgJiYgIXN0YXR1cy5zb21lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuTk9ERV9ERUxFVElPTicsIHtcbiAgICAgICAgbmFtZTogc3RhdHVzLmZhaWxbMF0ubmFtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVTdWNjZWVkZWQgJiYgIXN0YXR1cy5zb21lRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uTk9ERV9ERUxFVElPTi5TSU5HVUxBUicsIHsgbmFtZTogc3RhdHVzLnN1Y2Nlc3NbMF0ubmFtZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd01vdmVNZXNzYWdlKG5vZGVzOiBBcnJheTxOb2RlRW50cnk+LCBpbmZvOiBhbnksIG1vdmVSZXNwb25zZT86IGFueSkge1xuICAgIGNvbnN0IHN1Y2NlZWRlZCA9IG1vdmVSZXNwb25zZT8uWydzdWNjZWVkZWQnXS5sZW5ndGggPz8gMDtcbiAgICBjb25zdCBwYXJ0aWFsbHlTdWNjZWVkZWQgPSBtb3ZlUmVzcG9uc2U/LlsncGFydGlhbGx5U3VjY2VlZGVkJ10ubGVuZ3RoID8/IDA7XG4gICAgY29uc3QgZmFpbHVyZXMgPSBtb3ZlUmVzcG9uc2U/LlsnZmFpbGVkJ10ubGVuZ3RoID8/IDA7XG5cbiAgICBsZXQgc3VjY2Vzc01lc3NhZ2UgPSAnJztcbiAgICBsZXQgcGFydGlhbFN1Y2Nlc3NNZXNzYWdlID0gJyc7XG4gICAgbGV0IGZhaWxlZE1lc3NhZ2UgPSAnJztcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIGluZm8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpbiBjYXNlIG9mIHN1Y2Nlc3NcbiAgICAgIGlmIChpbmZvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc3VjY2VzJykgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGkxOG5NZXNzYWdlU3RyaW5nID0gJ0FQUC5NRVNTQUdFUy5JTkZPLk5PREVfTU9WRS4nO1xuICAgICAgICBsZXQgaTE4TWVzc2FnZVN1ZmZpeCA9ICcnO1xuXG4gICAgICAgIGlmIChzdWNjZWVkZWQpIHtcbiAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gc3VjY2VlZGVkID09PSAxID8gJ1NJTkdVTEFSJyA6ICdQTFVSQUwnO1xuICAgICAgICAgIHN1Y2Nlc3NNZXNzYWdlID0gYCR7aTE4bk1lc3NhZ2VTdHJpbmd9JHtpMThNZXNzYWdlU3VmZml4fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydGlhbGx5U3VjY2VlZGVkKSB7XG4gICAgICAgICAgaTE4TWVzc2FnZVN1ZmZpeCA9IHBhcnRpYWxseVN1Y2NlZWRlZCA9PT0gMSA/ICdQQVJUSUFMLlNJTkdVTEFSJyA6ICdQQVJUSUFMLlBMVVJBTCc7XG4gICAgICAgICAgcGFydGlhbFN1Y2Nlc3NNZXNzYWdlID0gYCR7aTE4bk1lc3NhZ2VTdHJpbmd9JHtpMThNZXNzYWdlU3VmZml4fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmFpbHVyZXMpIHtcbiAgICAgICAgICAvLyBpZiBtb3ZpbmcgZmFpbGVkIGZvciBBTEwgbm9kZXMsIGVtaXQgZXJyb3JcbiAgICAgICAgICBpZiAoZmFpbHVyZXMgPT09IG5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuZmxhdHRlbihtb3ZlUmVzcG9uc2VbJ2ZhaWxlZCddKTtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yc1swXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSAnUEFSVElBTC5GQUlMJztcbiAgICAgICAgICAgIGZhaWxlZE1lc3NhZ2UgPSBgJHtpMThuTWVzc2FnZVN0cmluZ30ke2kxOE1lc3NhZ2VTdWZmaXh9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShpbmZvKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bmRvID0gc3VjY2VlZGVkICsgcGFydGlhbGx5U3VjY2VlZGVkID4gMCA/IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkFDVElPTlMuVU5ETycpIDogJyc7XG4gICAgZmFpbGVkTWVzc2FnZSA9IGVycm9yTWVzc2FnZSA/IGVycm9yTWVzc2FnZSA6IGZhaWxlZE1lc3NhZ2U7XG5cbiAgICBjb25zdCBiZWZvcmVQYXJ0aWFsU3VjY2Vzc01lc3NhZ2UgPSBzdWNjZXNzTWVzc2FnZSAmJiBwYXJ0aWFsU3VjY2Vzc01lc3NhZ2UgPyAnICcgOiAnJztcbiAgICBjb25zdCBiZWZvcmVGYWlsZWRNZXNzYWdlID0gKHN1Y2Nlc3NNZXNzYWdlIHx8IHBhcnRpYWxTdWNjZXNzTWVzc2FnZSkgJiYgZmFpbGVkTWVzc2FnZSA/ICcgJyA6ICcnO1xuXG4gICAgY29uc3QgaW5pdGlhbFBhcmVudElkID0gdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuZ2V0RW50cnlQYXJlbnRJZChub2Rlc1swXS5lbnRyeSk7XG5cbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudChbc3VjY2Vzc01lc3NhZ2UsIHBhcnRpYWxTdWNjZXNzTWVzc2FnZSwgZmFpbGVkTWVzc2FnZV0sIHtcbiAgICAgIHN1Y2Nlc3M6IHN1Y2NlZWRlZCxcbiAgICAgIGZhaWxlZDogZmFpbHVyZXMsXG4gICAgICBwYXJ0aWFsbHk6IHBhcnRpYWxseVN1Y2NlZWRlZFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogcmV2aWV3IGluIHRlcm1zIG9mIGkxOG5cbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2VcbiAgICAgIC5vcGVuU25hY2tNZXNzYWdlQWN0aW9uKFxuICAgICAgICBtZXNzYWdlc1tzdWNjZXNzTWVzc2FnZV0gKyBiZWZvcmVQYXJ0aWFsU3VjY2Vzc01lc3NhZ2UgKyBtZXNzYWdlc1twYXJ0aWFsU3VjY2Vzc01lc3NhZ2VdICsgYmVmb3JlRmFpbGVkTWVzc2FnZSArIG1lc3NhZ2VzW2ZhaWxlZE1lc3NhZ2VdLFxuICAgICAgICB1bmRvLFxuICAgICAgICB7XG4gICAgICAgICAgcGFuZWxDbGFzczogJ2luZm8tc25hY2tiYXInXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIC5vbkFjdGlvbigpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMudW5kb01vdmVOb2Rlcyhtb3ZlUmVzcG9uc2UsIGluaXRpYWxQYXJlbnRJZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGZvY3VzZWRFbGVtZW50U2VsZWN0b3IpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGZvY3VzZWRFbGVtZW50U2VsZWN0b3IpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuIl19
|