@scion/workbench 17.0.0-beta.9 → 18.0.0-beta.10
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/_index.scss +7 -5
- package/design/_workbench-global-styles.scss +18 -0
- package/design/_workbench-icon-font.scss +1 -1
- package/design/_workbench-popup-global-styles.scss +1 -1
- package/design/{_workbench-view-drag-image-global-styles.scss → _workbench-view-global-styles.scss} +1 -2
- package/esm2022/lib/activation-instant.provider.mjs +3 -3
- package/esm2022/lib/common/asserts.util.mjs +1 -1
- package/esm2022/lib/common/class-list.mjs +67 -29
- package/esm2022/lib/common/coerce-observable.pipe.mjs +3 -3
- package/esm2022/lib/common/dom.util.mjs +1 -1
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +4 -4
- package/esm2022/lib/common/instanceof.pipe.mjs +3 -3
- package/esm2022/lib/common/map-coerce.pipe.mjs +3 -3
- package/esm2022/lib/common/math.util.mjs +16 -0
- package/esm2022/lib/common/null-if-empty.pipe.mjs +4 -4
- package/esm2022/lib/common/objects.util.mjs +7 -1
- package/esm2022/lib/common/observables.mjs +1 -1
- package/esm2022/lib/common/operators.mjs +1 -12
- package/esm2022/lib/common/stringify-error.util.mjs +1 -1
- package/esm2022/lib/common/typeof.pipe.mjs +3 -3
- package/esm2022/lib/common/uid.util.mjs +22 -0
- package/esm2022/lib/common//311/265destroy-ref.mjs +1 -1
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +87 -30
- package/esm2022/lib/content-projection/workbench-element-references.mjs +32 -0
- package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +3 -3
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +5 -10
- package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +3 -3
- package/esm2022/lib/dialog/movable.directive.mjs +6 -6
- package/esm2022/lib/dialog/resizable.directive.mjs +6 -6
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +27 -25
- package/esm2022/lib/dialog/workbench-dialog.mjs +61 -1
- package/esm2022/lib/dialog/workbench-dialog.registry.mjs +4 -4
- package/esm2022/lib/dialog/workbench-dialog.service.mjs +3 -3
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +99 -61
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +28 -25
- package/esm2022/lib/executor/latest-task-executor.mjs +55 -0
- package/esm2022/lib/executor/single-task-executor.mjs +9 -19
- package/esm2022/lib/filter-field/filter-field.component.mjs +8 -8
- package/esm2022/lib/glass-pane/glass-pane.directive.mjs +4 -4
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +10 -20
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +19 -22
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +11 -0
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v6.model.mjs +11 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +7 -7
- package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +4 -4
- package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +67 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v6.service.mjs +59 -0
- package/esm2022/lib/layout/stringifier.mjs +70 -0
- package/esm2022/lib/layout/workbench-layout.component.mjs +19 -23
- package/esm2022/lib/layout/workbench-layout.factory.mjs +3 -3
- package/esm2022/lib/layout/workbench-layout.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.model.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.service.mjs +28 -26
- package/esm2022/lib/layout/workbench-layouts.util.mjs +1 -9
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +22 -32
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +6 -5
- package/esm2022/lib/layout//311/265workbench-layout.mjs +77 -66
- package/esm2022/lib/logging/console-appender.service.mjs +4 -4
- package/esm2022/lib/logging/logger.mjs +3 -3
- package/esm2022/lib/logging/logging-support.mjs +7 -13
- package/esm2022/lib/logging/logging.model.mjs +3 -3
- package/esm2022/lib/logging//311/265logger.mjs +12 -12
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +9 -8
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +5 -5
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +5 -5
- package/esm2022/lib/message-box/workbench-message-box.service.mjs +3 -3
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +6 -5
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +22 -6
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +29 -22
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +6 -6
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +14 -4
- package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +63 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +8 -7
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +8 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +21 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +10 -9
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +6 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +17 -15
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +6 -5
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +10 -15
- package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +39 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +120 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +55 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +19 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +7 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +13 -14
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +14 -30
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +5 -5
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +13 -29
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +92 -72
- package/esm2022/lib/microfrontend-platform/public_api.mjs +2 -1
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +8 -7
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +20 -18
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +30 -8
- package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +32 -0
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +29 -11
- package/esm2022/lib/migration/workbench-migrator.mjs +1 -1
- package/esm2022/lib/notification/notification-css-classes.pipe.mjs +3 -3
- package/esm2022/lib/notification/notification-list.component.mjs +6 -10
- package/esm2022/lib/notification/notification.component.mjs +6 -7
- package/esm2022/lib/notification/notification.service.mjs +8 -7
- package/esm2022/lib/notification/text-notification.component.mjs +3 -3
- package/esm2022/lib/notification//311/265notification.mjs +1 -1
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +7 -9
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +12 -20
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +7 -7
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +334 -265
- package/esm2022/lib/part/part-portal.pipe.mjs +10 -10
- package/esm2022/lib/part/part.component.mjs +34 -43
- package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +4 -4
- package/esm2022/lib/part/view-context-menu/text.component.mjs +17 -13
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +6 -8
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +5 -5
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +50 -51
- package/esm2022/lib/part/view-list/view-list.component.mjs +42 -49
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +23 -27
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +16 -18
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +100 -111
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +5 -6
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +17 -18
- package/esm2022/lib/part/workbench-part-action.registry.mjs +18 -42
- package/esm2022/lib/part/workbench-part.model.mjs +10 -1
- package/esm2022/lib/part/workbench-part.registry.mjs +11 -45
- package/esm2022/lib/part//311/265workbench-part.model.mjs +71 -55
- package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +6 -6
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +11 -43
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +73 -64
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +5 -5
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +62 -47
- package/esm2022/lib/popup/popup.component.mjs +6 -6
- package/esm2022/lib/popup/popup.config.mjs +27 -25
- package/esm2022/lib/popup/popup.service.mjs +171 -176
- package/esm2022/lib/portal/wb-component-portal.mjs +18 -17
- package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +4 -4
- package/esm2022/lib/public_api.mjs +1 -1
- package/esm2022/lib/registry/workbench-object-registry.mjs +38 -17
- package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +3 -3
- package/esm2022/lib/routing/public_api.mjs +2 -2
- package/esm2022/lib/routing/routing.model.mjs +1 -1
- package/esm2022/lib/routing/routing.util.mjs +215 -0
- package/esm2022/lib/routing/url-segment-matcher.mjs +1 -1
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +110 -0
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-layout-differ.mjs +6 -13
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-navigational-states.mjs +2 -2
- package/esm2022/lib/routing/workbench-popup-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-route-guards.mjs +57 -0
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +5 -5
- package/esm2022/lib/routing/workbench-router.service.mjs +3 -3
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +143 -151
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +58 -0
- package/esm2022/lib/routing//311/265location.mjs +3 -3
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +121 -76
- package/esm2022/lib/startup/splash/splash.component.mjs +5 -5
- package/esm2022/lib/startup/workbench-initializer.mjs +1 -1
- package/esm2022/lib/startup/workbench-launcher.service.mjs +28 -16
- package/esm2022/lib/storage/workbench-storage.mjs +3 -3
- package/esm2022/lib/testing/workbench-testing.module.mjs +4 -4
- package/esm2022/lib/testing/workbench.provider.mjs +5 -5
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +18 -22
- package/esm2022/lib/view/public_api.mjs +1 -2
- package/esm2022/lib/view/view-move-handler.service.mjs +73 -58
- package/esm2022/lib/view/view-portal.pipe.mjs +9 -9
- package/esm2022/lib/view/view.component.mjs +55 -43
- package/esm2022/lib/view/workbench-view.model.mjs +1 -1
- package/esm2022/lib/view/workbench-view.registry.mjs +11 -45
- package/esm2022/lib/view//311/265workbench-view.model.mjs +183 -153
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +2 -2
- package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +4 -4
- package/esm2022/lib/view-dnd/view-drag.service.mjs +89 -73
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +9 -9
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +9 -9
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +45 -58
- package/esm2022/lib/workbench-config.mjs +2 -2
- package/esm2022/lib/workbench-id.mjs +3 -3
- package/esm2022/lib/workbench.component.mjs +67 -55
- package/esm2022/lib/workbench.constants.mjs +1 -5
- package/esm2022/lib/workbench.model.mjs +1 -1
- package/esm2022/lib/workbench.module.mjs +4 -4
- package/esm2022/lib/workbench.provider.mjs +3 -9
- package/esm2022/lib/workbench.service.mjs +4 -4
- package/esm2022/lib//311/265workbench.service.mjs +40 -44
- package/fesm2022/scion-workbench.mjs +4348 -3628
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/class-list.d.ts +35 -22
- package/lib/common/math.util.d.ts +7 -0
- package/lib/common/objects.util.d.ts +6 -2
- package/lib/common/operators.d.ts +1 -6
- package/lib/common/uid.util.d.ts +9 -0
- package/lib/content-projection/content-as-overlay.component.d.ts +39 -22
- package/lib/content-projection/workbench-element-references.d.ts +13 -0
- package/lib/dialog/workbench-dialog.component.d.ts +3 -2
- package/lib/dialog/workbench-dialog.d.ts +57 -13
- package/lib/dialog//311/265workbench-dialog.d.ts +38 -24
- package/lib/dialog//311/265workbench-dialog.service.d.ts +10 -11
- package/lib/executor/latest-task-executor.d.ts +26 -0
- package/lib/executor/single-task-executor.d.ts +5 -8
- package/lib/filter-field/filter-field.component.d.ts +1 -1
- package/lib/layout/grid-element/grid-element.component.d.ts +1 -8
- package/lib/layout/main-area-layout/main-area-layout.component.d.ts +0 -4
- package/lib/layout/migration/model/workbench-layout-migration-v5.model.d.ts +36 -0
- package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
- package/lib/layout/migration/{workbench-layout-migration-v2.service.d.ts → workbench-layout-migration-v5.service.d.ts} +4 -5
- package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
- package/lib/layout/stringifier.d.ts +26 -0
- package/lib/layout/workbench-layout.component.d.ts +4 -5
- package/lib/layout/workbench-layout.d.ts +9 -6
- package/lib/layout/workbench-layout.model.d.ts +4 -3
- package/lib/layout/workbench-layout.service.d.ts +14 -16
- package/lib/layout/workbench-layouts.util.d.ts +0 -6
- package/lib/layout/workench-layout-serializer.service.d.ts +13 -16
- package/lib/layout//311/265workbench-layout.d.ts +18 -19
- package/lib/layout//311/265workbench-layout.factory.d.ts +3 -2
- package/lib/logging//311/265logger.d.ts +2 -3
- package/lib/microfrontend-platform/common/microfrontend.util.d.ts +5 -1
- package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +7 -3
- package/lib/microfrontend-platform/manifest-object-cache.service.d.ts +33 -0
- package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +3 -6
- package/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.d.ts +2 -1
- package/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.d.ts +1 -1
- package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +2 -1
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.d.ts +10 -0
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.d.ts +24 -0
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.d.ts +20 -0
- package/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.d.ts +9 -0
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.d.ts +4 -8
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +0 -4
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +5 -12
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +23 -33
- package/lib/microfrontend-platform/public_api.d.ts +1 -0
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.d.ts +1 -1
- package/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.d.ts +3 -7
- package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +9 -2
- package/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.d.ts +11 -0
- package/lib/notification/notification-list.component.d.ts +0 -2
- package/lib/page-not-found/page-not-found.component.d.ts +1 -0
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +3 -4
- package/lib/part/part-action-bar/part-action.directive.d.ts +2 -2
- package/lib/part/part-bar/part-bar.component.d.ts +73 -63
- package/lib/part/part-portal.pipe.d.ts +3 -5
- package/lib/part/part.component.d.ts +9 -12
- package/lib/part/view-context-menu/text.component.d.ts +3 -4
- package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
- package/lib/part/view-context-menu/view-menu.service.d.ts +13 -17
- package/lib/part/view-list/view-list.component.d.ts +8 -21
- package/lib/part/view-list-button/view-list-button.component.d.ts +8 -11
- package/lib/part/view-list-item/view-list-item.component.d.ts +3 -7
- package/lib/part/view-tab/view-tab.component.d.ts +19 -29
- package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +4 -4
- package/lib/part/workbench-part-action.registry.d.ts +3 -23
- package/lib/part/workbench-part.model.d.ts +8 -27
- package/lib/part/workbench-part.registry.d.ts +3 -26
- package/lib/part//311/265workbench-part.model.d.ts +23 -17
- package/lib/perspective/workbench-perspective.model.d.ts +18 -25
- package/lib/perspective/workbench-perspective.registry.d.ts +3 -26
- package/lib/perspective/workbench-perspective.service.d.ts +16 -14
- package/lib/perspective/workench-perspective-serializer.service.d.ts +1 -1
- package/lib/perspective//311/265workbench-perspective.model.d.ts +30 -21
- package/lib/popup/popup.config.d.ts +11 -10
- package/lib/popup/popup.service.d.ts +15 -28
- package/lib/portal/wb-component-portal.d.ts +21 -5
- package/lib/public_api.d.ts +1 -1
- package/lib/registry/workbench-object-registry.d.ts +10 -6
- package/lib/routing/public_api.d.ts +2 -2
- package/lib/routing/routing.model.d.ts +25 -13
- package/lib/routing/{router.util.d.ts → routing.util.d.ts} +28 -1
- package/lib/routing/{workbench-auxiliary-routes-registrator.service.d.ts → workbench-auxiliary-route-installer.service.d.ts} +10 -3
- package/lib/routing/workbench-layout-differ.d.ts +1 -2
- package/lib/routing/workbench-navigational-states.d.ts +8 -4
- package/lib/{view/workbench-view-route-guards.d.ts → routing/workbench-route-guards.d.ts} +8 -2
- package/lib/routing/workbench-url-observer.service.d.ts +31 -55
- package/lib/routing/workbench-view-outlet-differ.d.ts +32 -0
- package/lib/routing//311/265workbench-router.service.d.ts +22 -18
- package/lib/startup/workbench-launcher.service.d.ts +4 -5
- package/lib/testing/workbench.provider.d.ts +3 -1
- package/lib/theme/workbench-theme-switcher.service.d.ts +4 -6
- package/lib/view/public_api.d.ts +0 -1
- package/lib/view/view-move-handler.service.d.ts +16 -14
- package/lib/view/view-portal.pipe.d.ts +1 -3
- package/lib/view/view.component.d.ts +21 -12
- package/lib/view/workbench-view.model.d.ts +88 -36
- package/lib/view/workbench-view.registry.d.ts +3 -27
- package/lib/view//311/265workbench-view.model.d.ts +62 -71
- package/lib/view-dnd/view-drag.service.d.ts +79 -49
- package/lib/view-dnd/view-drop-placeholder-renderer.service.d.ts +1 -1
- package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +12 -36
- package/lib/workbench-config.d.ts +19 -7
- package/lib/workbench.component.d.ts +16 -30
- package/lib/workbench.constants.d.ts +0 -5
- package/lib/workbench.model.d.ts +31 -3
- package/lib/workbench.service.d.ts +58 -56
- package/lib//311/265workbench.service.d.ts +18 -31
- package/package.json +12 -12
- package/esm2022/lib/common/filter-by-predicate.pipe.mjs +0 -27
- package/esm2022/lib/common/filter-by-text.pipe.mjs +0 -39
- package/esm2022/lib/common/uuid.util.mjs +0 -17
- package/esm2022/lib/content-projection/content-projection.directive.mjs +0 -101
- package/esm2022/lib/content-projection/view-container.reference.mjs +0 -68
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v1.model.mjs +0 -11
- package/esm2022/lib/layout/migration/workbench-layout-migration-v2.service.mjs +0 -59
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +0 -41
- package/esm2022/lib/page-not-found/format-url.pipe.mjs +0 -26
- package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/routing/router.util.mjs +0 -126
- package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +0 -94
- package/esm2022/lib/view/workbench-view-route-guards.mjs +0 -47
- package/lib/common/filter-by-predicate.pipe.d.ts +0 -10
- package/lib/common/filter-by-text.pipe.d.ts +0 -12
- package/lib/common/uuid.util.d.ts +0 -8
- package/lib/content-projection/content-projection.directive.d.ts +0 -30
- package/lib/content-projection/view-container.reference.d.ts +0 -42
- package/lib/layout/migration/model/workbench-layout-migration-v1.model.d.ts +0 -16
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +0 -10
- package/lib/page-not-found/format-url.pipe.d.ts +0 -11
- package/lib/part/part-action-bar/part-action-filter.pipe.d.ts +0 -11
|
@@ -7,34 +7,33 @@
|
|
|
7
7
|
*
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
10
|
+
import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router, RouterEvent } from '@angular/router';
|
|
11
|
+
import { createEnvironmentInjector, EnvironmentInjector, inject, Injectable, runInInjectionContext } from '@angular/core';
|
|
12
|
+
import { WorkbenchAuxiliaryRouteInstaller } from './workbench-auxiliary-route-installer.service';
|
|
13
13
|
import { MAIN_AREA_LAYOUT_QUERY_PARAM } from '../workbench.constants';
|
|
14
|
+
import { WORKBENCH_VIEW_REGISTRY } from '../view/workbench-view.registry';
|
|
15
|
+
import { WORKBENCH_PART_REGISTRY } from '../part/workbench-part.registry';
|
|
16
|
+
import { WorkbenchLayoutService } from '../layout/workbench-layout.service';
|
|
14
17
|
import { ɵWorkbenchPart } from '../part/ɵworkbench-part.model';
|
|
15
18
|
import { ɵWorkbenchView } from '../view/ɵworkbench-view.model';
|
|
16
19
|
import { ViewComponent } from '../view/view.component';
|
|
17
|
-
import {
|
|
20
|
+
import { WorkbenchLayoutDiffer } from './workbench-layout-differ';
|
|
21
|
+
import { WorkbenchPopupDiffer } from './workbench-popup-differ';
|
|
22
|
+
import { Logger, LoggerNames } from '../logging';
|
|
18
23
|
import { WorkbenchNavigationalStates } from './workbench-navigational-states';
|
|
19
24
|
import { MainAreaLayoutComponent } from '../layout/main-area-layout/main-area-layout.component';
|
|
20
25
|
import { PartComponent } from '../part/part.component';
|
|
21
26
|
import { MAIN_AREA } from '../layout/workbench-layout';
|
|
22
27
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
28
|
+
import { ɵWorkbenchLayoutFactory } from '../layout/ɵworkbench-layout.factory';
|
|
29
|
+
import { WorkbenchDialogDiffer } from './workbench-dialog-differ';
|
|
30
|
+
import { Routing } from './routing.util';
|
|
31
|
+
import { ɵWorkbenchRouter } from './ɵworkbench-router.service';
|
|
32
|
+
import { canMatchNotFoundPage } from './workbench-route-guards';
|
|
33
|
+
import { WorkbenchMessageBoxDiffer } from './workbench-message-box-differ';
|
|
34
|
+
import { WorkbenchViewOutletDiffer } from './workbench-view-outlet-differ';
|
|
35
|
+
import { filter } from 'rxjs/operators';
|
|
25
36
|
import * as i0 from "@angular/core";
|
|
26
|
-
import * as i1 from "@angular/router";
|
|
27
|
-
import * as i2 from "./workbench-auxiliary-routes-registrator.service";
|
|
28
|
-
import * as i3 from "../view/workbench-view.registry";
|
|
29
|
-
import * as i4 from "../part/workbench-part.registry";
|
|
30
|
-
import * as i5 from "../layout/workbench-layout.service";
|
|
31
|
-
import * as i6 from "./\u0275workbench-router.service";
|
|
32
|
-
import * as i7 from "../layout/\u0275workbench-layout.factory";
|
|
33
|
-
import * as i8 from "./workbench-layout-differ";
|
|
34
|
-
import * as i9 from "./workbench-popup-differ";
|
|
35
|
-
import * as i10 from "./workbench-dialog-differ";
|
|
36
|
-
import * as i11 from "./workbench-message-box-differ";
|
|
37
|
-
import * as i12 from "../logging";
|
|
38
37
|
/**
|
|
39
38
|
* Tracks the browser URL for workbench layout changes.
|
|
40
39
|
*
|
|
@@ -45,20 +44,21 @@ import * as i12 from "../logging";
|
|
|
45
44
|
* - Parses the serialized layout and injects it into {@link WorkbenchLayoutService}.
|
|
46
45
|
*/
|
|
47
46
|
export class WorkbenchUrlObserver {
|
|
48
|
-
constructor(
|
|
49
|
-
this._router =
|
|
50
|
-
this.
|
|
51
|
-
this._viewRegistry =
|
|
52
|
-
this._partRegistry =
|
|
53
|
-
this._workbenchLayoutService =
|
|
54
|
-
this._environmentInjector =
|
|
55
|
-
this._workbenchRouter =
|
|
56
|
-
this._workbenchLayoutFactory =
|
|
57
|
-
this._workbenchLayoutDiffer =
|
|
58
|
-
this.
|
|
59
|
-
this.
|
|
60
|
-
this.
|
|
61
|
-
this.
|
|
47
|
+
constructor() {
|
|
48
|
+
this._router = inject(Router);
|
|
49
|
+
this._auxiliaryRouteInstaller = inject(WorkbenchAuxiliaryRouteInstaller);
|
|
50
|
+
this._viewRegistry = inject(WORKBENCH_VIEW_REGISTRY);
|
|
51
|
+
this._partRegistry = inject(WORKBENCH_PART_REGISTRY);
|
|
52
|
+
this._workbenchLayoutService = inject(WorkbenchLayoutService);
|
|
53
|
+
this._environmentInjector = inject(EnvironmentInjector);
|
|
54
|
+
this._workbenchRouter = inject(ɵWorkbenchRouter);
|
|
55
|
+
this._workbenchLayoutFactory = inject(ɵWorkbenchLayoutFactory);
|
|
56
|
+
this._workbenchLayoutDiffer = inject(WorkbenchLayoutDiffer);
|
|
57
|
+
this._workbenchViewOutletDiffer = inject(WorkbenchViewOutletDiffer);
|
|
58
|
+
this._workbenchPopupDiffer = inject(WorkbenchPopupDiffer);
|
|
59
|
+
this._workbenchDialogDiffer = inject(WorkbenchDialogDiffer);
|
|
60
|
+
this._workbenchMessageBoxDiffer = inject(WorkbenchMessageBoxDiffer);
|
|
61
|
+
this._logger = inject(Logger);
|
|
62
62
|
this.installRouterEventListeners();
|
|
63
63
|
}
|
|
64
64
|
/** Invoked at the beginning of each navigation */
|
|
@@ -67,44 +67,44 @@ export class WorkbenchUrlObserver {
|
|
|
67
67
|
this._logger.debug(() => 'onNavigationStart', LoggerNames.ROUTING, event, `NavigationContext [parts=${context.layout.parts().map(part => part.id)}, layoutDiff=${context.layoutDiff.toString()}, popupDiff=${context.popupDiff.toString()}, dialogDiff=${context.dialogDiff.toString()}, messageBoxDiff=${context.messageBoxDiff.toString()}]`);
|
|
68
68
|
this._workbenchRouter.setCurrentNavigationContext(context);
|
|
69
69
|
this.registerAddedOutletAuxiliaryRoutes();
|
|
70
|
+
this.registerAddedWorkbenchParts();
|
|
71
|
+
this.registerAddedWorkbenchViews();
|
|
70
72
|
}
|
|
71
73
|
/** Invoked upon successful navigation */
|
|
72
74
|
onNavigationEnd(event) {
|
|
73
75
|
this._logger.debug(() => 'onNavigationEnd', LoggerNames.ROUTING, event);
|
|
74
76
|
this.unregisterRemovedOutletAuxiliaryRoutes();
|
|
75
|
-
this.
|
|
76
|
-
this.
|
|
77
|
+
this.unregisterRemovedWorkbenchParts();
|
|
78
|
+
this.unregisterRemovedWorkbenchViews();
|
|
79
|
+
this.applyWorkbenchLayout();
|
|
77
80
|
this.migrateURL();
|
|
81
|
+
this._workbenchRouter.getCurrentNavigationContext().runPostNavigationActions();
|
|
78
82
|
this._workbenchRouter.setCurrentNavigationContext(null);
|
|
79
83
|
}
|
|
80
84
|
/** Invoked when cancelled the navigation, e.g., in a guard */
|
|
81
85
|
onNavigationCancel(event) {
|
|
82
86
|
this._logger.debug(() => 'onNavigationCancel', LoggerNames.ROUTING, event);
|
|
83
|
-
this.
|
|
84
|
-
this.undoWorkbenchDiffers();
|
|
87
|
+
this._workbenchRouter.getCurrentNavigationContext().undoChanges();
|
|
85
88
|
this._workbenchRouter.setCurrentNavigationContext(null);
|
|
86
89
|
}
|
|
87
90
|
/** Invoked when the navigation failed */
|
|
88
91
|
onNavigationError(event) {
|
|
89
92
|
this._logger.debug(() => 'onNavigationError', LoggerNames.ROUTING, event);
|
|
90
|
-
this.
|
|
91
|
-
this.undoWorkbenchDiffers();
|
|
93
|
+
this._workbenchRouter.getCurrentNavigationContext().undoChanges();
|
|
92
94
|
this._workbenchRouter.setCurrentNavigationContext(null);
|
|
93
95
|
}
|
|
94
|
-
/** Invoked after checked guards for activation */
|
|
95
|
-
onGuardsCheckEnd(event) {
|
|
96
|
-
this._logger.debug(() => `onGuardsCheckEnd [shouldActivate=${event.shouldActivate}]`, LoggerNames.ROUTING, event);
|
|
97
|
-
}
|
|
98
96
|
/**
|
|
99
97
|
* Creates the context of the current navigation. The context provides access to the new layout and how it differs from the current layout.
|
|
100
98
|
*/
|
|
101
99
|
createWorkbenchNavigationContext(url) {
|
|
102
100
|
const urlTree = this._router.parseUrl(url);
|
|
103
101
|
const workbenchNavigationalState = WorkbenchNavigationalStates.fromNavigation(this._router.getCurrentNavigation());
|
|
104
|
-
const
|
|
102
|
+
const previousLayout = this._workbenchLayoutService.layout();
|
|
103
|
+
const previousUrl = this._router.parseUrl(this._router.url); // Browser URL is only updated after successful navigation
|
|
104
|
+
const newLayout = this._workbenchLayoutFactory.create({
|
|
105
105
|
mainAreaGrid: (() => {
|
|
106
106
|
// Read the main area grid from the query parameter.
|
|
107
|
-
const mainAreaGrid = urlTree.queryParamMap.get(MAIN_AREA_LAYOUT_QUERY_PARAM)
|
|
107
|
+
const mainAreaGrid = urlTree.queryParamMap.get(MAIN_AREA_LAYOUT_QUERY_PARAM);
|
|
108
108
|
if (mainAreaGrid) {
|
|
109
109
|
return mainAreaGrid;
|
|
110
110
|
}
|
|
@@ -119,19 +119,37 @@ export class WorkbenchUrlObserver {
|
|
|
119
119
|
return null;
|
|
120
120
|
}
|
|
121
121
|
// Fall back to the current layout if the navigation was performed via the Angular router, i.e., the navigator did not preserve the query params.
|
|
122
|
-
return
|
|
122
|
+
return previousLayout?.mainAreaGrid;
|
|
123
123
|
})(),
|
|
124
|
-
workbenchGrid: workbenchNavigationalState?.workbenchGrid ??
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
workbenchGrid: workbenchNavigationalState?.workbenchGrid ?? previousLayout?.workbenchGrid,
|
|
125
|
+
perspectiveId: workbenchNavigationalState?.perspectiveId ?? previousLayout?.perspectiveId,
|
|
126
|
+
maximized: workbenchNavigationalState?.maximized ?? previousLayout?.maximized,
|
|
127
|
+
navigationStates: workbenchNavigationalState?.navigationStates ?? previousLayout?.navigationStates(),
|
|
128
|
+
viewOutlets: Object.fromEntries(Routing.parseViewOutlets(urlTree)),
|
|
128
129
|
});
|
|
130
|
+
const undoActions = new Array();
|
|
131
|
+
const postNavigationActions = new Array();
|
|
129
132
|
return {
|
|
130
|
-
layout,
|
|
131
|
-
|
|
133
|
+
layout: newLayout,
|
|
134
|
+
previousLayout,
|
|
135
|
+
layoutDiff: this._workbenchLayoutDiffer.diff(newLayout),
|
|
136
|
+
viewOutletDiff: this._workbenchViewOutletDiffer.diff(newLayout, urlTree),
|
|
132
137
|
popupDiff: this._workbenchPopupDiffer.diff(urlTree),
|
|
133
138
|
dialogDiff: this._workbenchDialogDiffer.diff(urlTree),
|
|
134
139
|
messageBoxDiff: this._workbenchMessageBoxDiffer.diff(urlTree),
|
|
140
|
+
undoChanges: () => {
|
|
141
|
+
// Revert differs to the state before the navigation.
|
|
142
|
+
this._workbenchLayoutDiffer.diff(previousLayout);
|
|
143
|
+
this._workbenchViewOutletDiffer.diff(previousLayout, previousUrl);
|
|
144
|
+
this._workbenchPopupDiffer.diff(previousUrl);
|
|
145
|
+
this._workbenchDialogDiffer.diff(previousUrl);
|
|
146
|
+
this._workbenchMessageBoxDiffer.diff(previousUrl);
|
|
147
|
+
// Run registered undo actions.
|
|
148
|
+
undoActions.forEach(action => action());
|
|
149
|
+
},
|
|
150
|
+
runPostNavigationActions: () => postNavigationActions.forEach(action => action()),
|
|
151
|
+
registerUndoAction: action => undoActions.push(action),
|
|
152
|
+
registerPostNavigationAction: action => postNavigationActions.push(action),
|
|
135
153
|
};
|
|
136
154
|
}
|
|
137
155
|
/**
|
|
@@ -140,93 +158,34 @@ export class WorkbenchUrlObserver {
|
|
|
140
158
|
registerAddedOutletAuxiliaryRoutes() {
|
|
141
159
|
const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
|
|
142
160
|
// Register view auxiliary routes.
|
|
143
|
-
const
|
|
144
|
-
if (
|
|
145
|
-
const auxiliaryRoutes = this.
|
|
146
|
-
this._logger.debug(() => `Registered auxiliary routes for views: ${
|
|
161
|
+
const addedViewOutlets = navigationContext.viewOutletDiff.addedViewOutlets;
|
|
162
|
+
if (addedViewOutlets.length) {
|
|
163
|
+
const auxiliaryRoutes = this._auxiliaryRouteInstaller.registerAuxiliaryRoutes(addedViewOutlets, { canMatchNotFoundPage: [canMatchNotFoundPage] });
|
|
164
|
+
this._logger.debug(() => `Registered auxiliary routes for views: ${addedViewOutlets}`, LoggerNames.ROUTING, auxiliaryRoutes);
|
|
147
165
|
}
|
|
148
166
|
// Register popup auxiliary routes.
|
|
149
167
|
const addedPopupOutlets = navigationContext.popupDiff.addedPopupOutlets;
|
|
150
168
|
if (addedPopupOutlets.length) {
|
|
151
|
-
const auxiliaryRoutes = this.
|
|
169
|
+
const auxiliaryRoutes = this._auxiliaryRouteInstaller.registerAuxiliaryRoutes(addedPopupOutlets);
|
|
152
170
|
this._logger.debug(() => `Registered auxiliary routes for popups: ${addedPopupOutlets}`, LoggerNames.ROUTING, auxiliaryRoutes);
|
|
153
171
|
}
|
|
154
172
|
// Register dialog auxiliary routes.
|
|
155
173
|
const addedDialogOutlets = navigationContext.dialogDiff.addedDialogOutlets;
|
|
156
174
|
if (addedDialogOutlets.length) {
|
|
157
|
-
const auxiliaryRoutes = this.
|
|
175
|
+
const auxiliaryRoutes = this._auxiliaryRouteInstaller.registerAuxiliaryRoutes(addedDialogOutlets);
|
|
158
176
|
this._logger.debug(() => `Registered auxiliary routes for dialogs: ${addedDialogOutlets}`, LoggerNames.ROUTING, auxiliaryRoutes);
|
|
159
177
|
}
|
|
160
178
|
// Register message box auxiliary routes.
|
|
161
179
|
const addedMessageBoxOutlets = navigationContext.messageBoxDiff.addedMessageBoxOutlets;
|
|
162
180
|
if (addedMessageBoxOutlets.length) {
|
|
163
|
-
const auxiliaryRoutes = this.
|
|
181
|
+
const auxiliaryRoutes = this._auxiliaryRouteInstaller.registerAuxiliaryRoutes(addedMessageBoxOutlets);
|
|
164
182
|
this._logger.debug(() => `Registered auxiliary routes for message boxes: ${addedMessageBoxOutlets}`, LoggerNames.ROUTING, auxiliaryRoutes);
|
|
165
183
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
*/
|
|
172
|
-
undoWorkbenchDiffers() {
|
|
173
|
-
const prevNavigateLayout = this._workbenchLayoutService.layout; // Layout in `WorkbenchLayoutService` is only updated after successful navigation
|
|
174
|
-
const prevNavigateUrl = this._router.parseUrl(this._router.url); // Browser URL is only updated after successful navigation
|
|
175
|
-
this._workbenchLayoutDiffer.diff(prevNavigateLayout, prevNavigateUrl);
|
|
176
|
-
this._workbenchPopupDiffer.diff(prevNavigateUrl);
|
|
177
|
-
this._workbenchDialogDiffer.diff(prevNavigateUrl);
|
|
178
|
-
this._workbenchMessageBoxDiffer.diff(prevNavigateUrl);
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Undoes the registration of auxiliary routes.
|
|
182
|
-
*
|
|
183
|
-
* Invoke this method after navigation failure or cancellation. The navigation is cancelled when guards perform a redirect or reject navigation.
|
|
184
|
-
*/
|
|
185
|
-
undoAuxiliaryRoutesRegistration() {
|
|
186
|
-
const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
|
|
187
|
-
const addedOutlets = [
|
|
188
|
-
...navigationContext.layoutDiff.addedViews,
|
|
189
|
-
...navigationContext.popupDiff.addedPopupOutlets,
|
|
190
|
-
...navigationContext.dialogDiff.addedDialogOutlets,
|
|
191
|
-
...navigationContext.messageBoxDiff.addedMessageBoxOutlets,
|
|
192
|
-
];
|
|
193
|
-
if (addedOutlets.length) {
|
|
194
|
-
this._auxiliaryRoutesRegistrator.unregisterAuxiliaryRoutes(addedOutlets);
|
|
195
|
-
this._logger.debug(() => `Undo auxiliary routes registration for outlet(s): ${addedOutlets}`, LoggerNames.ROUTING);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Updates registries and workbench handles to reflect the new layout.
|
|
200
|
-
*/
|
|
201
|
-
applyWorkbenchLayoutChanges() {
|
|
202
|
-
const { layout } = this._workbenchRouter.getCurrentNavigationContext();
|
|
203
|
-
if (layout !== this._workbenchLayoutService.layout) { // Layout instance does not change if navigating through the Angular router.
|
|
204
|
-
this.updateViewRegistry();
|
|
205
|
-
this.updatePartRegistry();
|
|
206
|
-
layout.views().forEach(view => this._viewRegistry.get(view.id).onLayoutChange(layout));
|
|
207
|
-
layout.parts().forEach(part => this._partRegistry.get(part.id).onLayoutChange(layout));
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Publishes the workbench layout via {@link WorkbenchLayoutService}, similar to a transactional commit.
|
|
212
|
-
*/
|
|
213
|
-
publishWorkbenchLayout() {
|
|
214
|
-
const { layout } = this._workbenchRouter.getCurrentNavigationContext();
|
|
215
|
-
if (layout !== this._workbenchLayoutService.layout) {
|
|
216
|
-
// Layout instance only changes when navigating via the workbench router, but not via the Angular router, e.g., when not navigating views.
|
|
217
|
-
this._logger.debug(() => 'Publishing workbench layout', LoggerNames.ROUTING, layout);
|
|
218
|
-
this._workbenchLayoutService.setLayout(layout);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Updates the URL if the layout has been migrated from an outdated version.
|
|
223
|
-
*/
|
|
224
|
-
migrateURL() {
|
|
225
|
-
const layout = this._workbenchRouter.getCurrentNavigationContext().layout;
|
|
226
|
-
if (layout.mainAreaGrid?.migrated) {
|
|
227
|
-
// Update the URL with the migrated URL and clear existing query params, for example, if the layout query parameter has been renamed.
|
|
228
|
-
this._workbenchRouter.navigate(layout => layout, { queryParamsHandling: null, replaceUrl: true }).then();
|
|
229
|
-
}
|
|
184
|
+
// Revert registration if the navigation fails.
|
|
185
|
+
navigationContext.registerUndoAction(() => {
|
|
186
|
+
const addedOutlets = [...addedViewOutlets, ...addedPopupOutlets, ...addedDialogOutlets, ...addedMessageBoxOutlets];
|
|
187
|
+
this._auxiliaryRouteInstaller.unregisterAuxiliaryRoutes(addedOutlets);
|
|
188
|
+
});
|
|
230
189
|
}
|
|
231
190
|
/**
|
|
232
191
|
* Unregisters auxiliary routes of removed workbench outlets.
|
|
@@ -234,53 +193,89 @@ export class WorkbenchUrlObserver {
|
|
|
234
193
|
unregisterRemovedOutletAuxiliaryRoutes() {
|
|
235
194
|
const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
|
|
236
195
|
const removedOutlets = [
|
|
237
|
-
...navigationContext.
|
|
196
|
+
...navigationContext.viewOutletDiff.removedViewOutlets,
|
|
238
197
|
...navigationContext.popupDiff.removedPopupOutlets,
|
|
239
198
|
...navigationContext.dialogDiff.removedDialogOutlets,
|
|
240
199
|
...navigationContext.messageBoxDiff.removedMessageBoxOutlets,
|
|
241
200
|
];
|
|
242
201
|
if (removedOutlets.length) {
|
|
243
202
|
this._logger.debug(() => 'Unregistering outlet auxiliary routes: ', LoggerNames.ROUTING, removedOutlets);
|
|
244
|
-
this.
|
|
203
|
+
this._auxiliaryRouteInstaller.unregisterAuxiliaryRoutes(removedOutlets);
|
|
245
204
|
}
|
|
246
205
|
}
|
|
247
206
|
/**
|
|
248
|
-
*
|
|
249
|
-
|
|
207
|
+
* For each added part, constructs a {@link WorkbenchPart} and registers it in {@link WORKBENCH_PART_REGISTRY}.
|
|
208
|
+
*/
|
|
209
|
+
registerAddedWorkbenchParts() {
|
|
210
|
+
const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
|
|
211
|
+
const { layoutDiff } = navigationContext;
|
|
212
|
+
layoutDiff.addedParts.forEach(partId => {
|
|
213
|
+
this._logger.debug(() => `Constructing ɵWorkbenchPart [partId=${partId}]`, LoggerNames.LIFECYCLE);
|
|
214
|
+
this._partRegistry.register(this.createWorkbenchPart(partId));
|
|
215
|
+
navigationContext.registerUndoAction(() => this._partRegistry.unregister(partId));
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* For each removed part, destroys the {@link WorkbenchPart} and unregisters it in {@link WORKBENCH_PART_REGISTRY}.
|
|
250
220
|
*/
|
|
251
|
-
|
|
221
|
+
unregisterRemovedWorkbenchParts() {
|
|
252
222
|
const { layoutDiff } = this._workbenchRouter.getCurrentNavigationContext();
|
|
223
|
+
layoutDiff.removedParts.forEach(partId => {
|
|
224
|
+
this._logger.debug(() => `Destroying ɵWorkbenchPart [partId=${partId}]`, LoggerNames.LIFECYCLE);
|
|
225
|
+
this._partRegistry.unregister(partId);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* For each added view, constructs a {@link WorkbenchView} and registers it in {@link WORKBENCH_VIEW_REGISTRY}.
|
|
230
|
+
*/
|
|
231
|
+
registerAddedWorkbenchViews() {
|
|
232
|
+
const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
|
|
233
|
+
const { layoutDiff } = navigationContext;
|
|
253
234
|
layoutDiff.addedViews.forEach(viewId => {
|
|
254
235
|
this._logger.debug(() => `Constructing ɵWorkbenchView [viewId=${viewId}]`, LoggerNames.LIFECYCLE);
|
|
255
236
|
this._viewRegistry.register(this.createWorkbenchView(viewId));
|
|
256
|
-
|
|
257
|
-
layoutDiff.removedViews.forEach(viewId => {
|
|
258
|
-
this._logger.debug(() => `Destroying ɵWorkbenchView [viewId=${viewId}]`, LoggerNames.LIFECYCLE);
|
|
259
|
-
this._viewRegistry.unregister(viewId);
|
|
237
|
+
navigationContext.registerUndoAction(() => this._viewRegistry.unregister(viewId));
|
|
260
238
|
});
|
|
261
239
|
}
|
|
262
240
|
/**
|
|
263
|
-
*
|
|
264
|
-
* - For each removed part, destroys the {@link WorkbenchPart} and unregisters it in {@link WorkbenchPartRegistry}
|
|
241
|
+
* For each removed view, destroys the {@link WorkbenchView} and unregisters it from {@link WORKBENCH_VIEW_REGISTRY}.
|
|
265
242
|
*/
|
|
266
|
-
|
|
243
|
+
unregisterRemovedWorkbenchViews() {
|
|
267
244
|
const { layoutDiff } = this._workbenchRouter.getCurrentNavigationContext();
|
|
268
|
-
layoutDiff.
|
|
269
|
-
this._logger.debug(() => `
|
|
270
|
-
this.
|
|
271
|
-
});
|
|
272
|
-
layoutDiff.removedParts.forEach(partId => {
|
|
273
|
-
this._logger.debug(() => `Destroying ɵWorkbenchPart [partId=${partId}]`, LoggerNames.LIFECYCLE);
|
|
274
|
-
this._partRegistry.unregister(partId);
|
|
245
|
+
layoutDiff.removedViews.forEach(viewId => {
|
|
246
|
+
this._logger.debug(() => `Destroying ɵWorkbenchView [viewId=${viewId}]`, LoggerNames.LIFECYCLE);
|
|
247
|
+
this._viewRegistry.unregister(viewId);
|
|
275
248
|
});
|
|
276
249
|
}
|
|
277
250
|
createWorkbenchPart(partId) {
|
|
278
|
-
|
|
251
|
+
// Construct the handle in an injection context that shares the part's lifecycle, allowing for automatic cleanup of effects and RxJS interop functions.
|
|
252
|
+
const partEnvironmentInjector = createEnvironmentInjector([], this._environmentInjector, `Workbench Part ${partId}`);
|
|
253
|
+
return runInInjectionContext(partEnvironmentInjector, () => new ɵWorkbenchPart(partId, {
|
|
279
254
|
component: partId === MAIN_AREA ? MainAreaLayoutComponent : PartComponent,
|
|
280
255
|
}));
|
|
281
256
|
}
|
|
282
257
|
createWorkbenchView(viewId) {
|
|
283
|
-
|
|
258
|
+
// Construct the handle in an injection context that shares the view's lifecycle, allowing for automatic cleanup of effects and RxJS interop functions.
|
|
259
|
+
const viewEnvironmentInjector = createEnvironmentInjector([], this._environmentInjector, `Workbench View ${viewId}`);
|
|
260
|
+
return runInInjectionContext(viewEnvironmentInjector, () => new ɵWorkbenchView(viewId, { component: ViewComponent }));
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Applies the current layout to the workbench.
|
|
264
|
+
*/
|
|
265
|
+
applyWorkbenchLayout() {
|
|
266
|
+
const { layout } = this._workbenchRouter.getCurrentNavigationContext();
|
|
267
|
+
this._workbenchLayoutService.setLayout(layout);
|
|
268
|
+
this._logger.debug(() => 'Applied workbench layout', LoggerNames.ROUTING, layout);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Updates the URL if the layout has been migrated from an outdated version.
|
|
272
|
+
*/
|
|
273
|
+
migrateURL() {
|
|
274
|
+
const layout = this._workbenchRouter.getCurrentNavigationContext().layout;
|
|
275
|
+
if (layout.mainAreaGrid?.migrated) {
|
|
276
|
+
// Update the URL with the migrated URL and clear existing query params, for example, if the layout query parameter has been renamed.
|
|
277
|
+
this._workbenchRouter.navigate(layout => layout, { queryParamsHandling: null, replaceUrl: true }).then();
|
|
278
|
+
}
|
|
284
279
|
}
|
|
285
280
|
installRouterEventListeners() {
|
|
286
281
|
this._router.events
|
|
@@ -298,16 +293,13 @@ export class WorkbenchUrlObserver {
|
|
|
298
293
|
else if (event instanceof NavigationError) {
|
|
299
294
|
this.onNavigationError(event);
|
|
300
295
|
}
|
|
301
|
-
else if (event instanceof GuardsCheckEnd) {
|
|
302
|
-
this.onGuardsCheckEnd(event);
|
|
303
|
-
}
|
|
304
296
|
});
|
|
305
297
|
}
|
|
306
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
307
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
298
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchUrlObserver, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
299
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchUrlObserver, providedIn: 'root' }); }
|
|
308
300
|
}
|
|
309
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
301
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchUrlObserver, decorators: [{
|
|
310
302
|
type: Injectable,
|
|
311
303
|
args: [{ providedIn: 'root' }]
|
|
312
|
-
}], ctorParameters: () => [
|
|
313
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXVybC1vYnNlcnZlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy93b3JrYmVuY2gtdXJsLW9ic2VydmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0VBUUU7QUFFRixPQUFPLEVBQVEsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFVLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlJLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQXNCLFVBQVUsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyRixPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUlwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUdyRCxPQUFPLEVBQVMsV0FBVyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBQzlGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFHOUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUkxQyxPQUFPLEVB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eEgsQ0FBQztJQUVPLDJCQUEyQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07YUFDaEIsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLEtBQTBCLEVBQXdCLEVBQUUsQ0FBQyxLQUFLLFlBQVksV0FBVyxDQUFDLEVBQzFGLGtCQUFrQixFQUFFLENBQ3JCO2FBQ0EsU0FBUyxDQUFDLENBQUMsS0FBa0IsRUFBRSxFQUFFO1lBQ2hDLElBQUksS0FBSyxZQUFZLGVBQWUsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQy9CO2lCQUNJLElBQUksS0FBSyxZQUFZLGFBQWEsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM3QjtpQkFDSSxJQUFJLEtBQUssWUFBWSxnQkFBZ0IsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hDO2lCQUNJLElBQUksS0FBSyxZQUFZLGVBQWUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQy9CO2lCQUNJLElBQUksS0FBSyxZQUFZLGNBQWMsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzhHQW5TVSxvQkFBb0I7a0hBQXBCLG9CQUFvQixjQURSLE1BQU07OzJGQUNsQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuKlxuKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4qIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4qIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuKlxuKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuKi9cblxuaW1wb3J0IHtFdmVudCwgR3VhcmRzQ2hlY2tFbmQsIE5hdmlnYXRpb25DYW5jZWwsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXIsIFJvdXRlckV2ZW50fSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RW52aXJvbm1lbnRJbmplY3RvciwgSW5qZWN0YWJsZSwgcnVuSW5JbmplY3Rpb25Db250ZXh0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V29ya2JlbmNoQXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0b3J9IGZyb20gJy4vd29ya2JlbmNoLWF1eGlsaWFyeS1yb3V0ZXMtcmVnaXN0cmF0b3Iuc2VydmljZSc7XG5pbXBvcnQge01BSU5fQVJFQV9MQVlPVVRfUVVFUllfUEFSQU19IGZyb20gJy4uL3dvcmtiZW5jaC5jb25zdGFudHMnO1xuaW1wb3J0IHtXb3JrYmVuY2hWaWV3UmVnaXN0cnl9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcucmVnaXN0cnknO1xuaW1wb3J0IHtXb3JrYmVuY2hQYXJ0UmVnaXN0cnl9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQucmVnaXN0cnknO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7ybVXb3JrYmVuY2hQYXJ0fSBmcm9tICcuLi9wYXJ0L8m1d29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFZpZXd9IGZyb20gJy4uL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1ZpZXdDb21wb25lbnR9IGZyb20gJy4uL3ZpZXcvdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXREaWZmZXJ9IGZyb20gJy4vd29ya2JlbmNoLWxheW91dC1kaWZmZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hQb3B1cERpZmZlcn0gZnJvbSAnLi93b3JrYmVuY2gtcG9wdXAtZGlmZmVyJztcbmltcG9ydCB7TG9nZ2VyLCBMb2dnZXJOYW1lc30gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlc30gZnJvbSAnLi93b3JrYmVuY2gtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5pbXBvcnQge01haW5BcmVhTGF5b3V0Q29tcG9uZW50fSBmcm9tICcuLi9sYXlvdXQvbWFpbi1hcmVhLWxheW91dC9tYWluLWFyZWEtbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQge1BhcnRDb21wb25lbnR9IGZyb20gJy4uL3BhcnQvcGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHtNQUlOX0FSRUF9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0RmFjdG9yeX0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dC5mYWN0b3J5JztcbmltcG9ydCB7V29ya2JlbmNoRGlhbG9nRGlmZmVyfSBmcm9tICcuL3dvcmtiZW5jaC1kaWFsb2ctZGlmZmVyJztcbmltcG9ydCB7Um91dGVyVXRpbHN9IGZyb20gJy4vcm91dGVyLnV0aWwnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFJvdXRlcn0gZnJvbSAnLi/JtXdvcmtiZW5jaC1yb3V0ZXIuc2VydmljZSc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0fSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtjYW5NYXRjaE5vdEZvdW5kUGFnZX0gZnJvbSAnLi4vdmlldy93b3JrYmVuY2gtdmlldy1yb3V0ZS1ndWFyZHMnO1xuaW1wb3J0IHtXb3JrYmVuY2hNZXNzYWdlQm94RGlmZmVyfSBmcm9tICcuL3dvcmtiZW5jaC1tZXNzYWdlLWJveC1kaWZmZXInO1xuXG4vKipcbiAqIFRyYWNrcyB0aGUgYnJvd3NlciBVUkwgZm9yIHdvcmtiZW5jaCBsYXlvdXQgY2hhbmdlcy5cbiAqXG4gKiAtIEZvciBlYWNoIGFkZGVkIHZpZXcsIGNvbnN0cnVjdHMgYSB7QGxpbmsgV29ya2JlbmNoVmlld30gYW5kIHJlZ2lzdGVycyB2aWV3IHNwZWNpZmljIGF1eGlsaWFyeSByb3V0ZXMgb2YgYWxsIHRvcC1sZXZlbCByb3V0ZXNcbiAqIC0gRm9yIGVhY2ggcmVtb3ZlZCB2aWV3LCBkZXN0cm95cyB7QGxpbmsgV29ya2JlbmNoVmlld30gYW5kIHVucmVnaXN0ZXJzIGl0cyBhdXhpbGlhcnkgcm91dGVzXG4gKiAtIEZvciBlYWNoIGFkZGVkIHBhcnQsIGNvbnN0cnVjdHMgYSB7QGxpbmsgV29ya2JlbmNoUGFydH1cbiAqIC0gRm9yIGVhY2ggcmVtb3ZlZCBwYXJ0LCBkZXN0cm95cyB7QGxpbmsgV29ya2JlbmNoUGFydH1cbiAqIC0gUGFyc2VzIHRoZSBzZXJpYWxpemVkIGxheW91dCBhbmQgaW5qZWN0cyBpdCBpbnRvIHtAbGluayBXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfS5cbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgV29ya2JlbmNoVXJsT2JzZXJ2ZXIge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9hdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvcjogV29ya2JlbmNoQXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdSZWdpc3RyeTogV29ya2JlbmNoVmlld1JlZ2lzdHJ5LFxuICAgICAgICAgICAgICBwcml2YXRlIF9wYXJ0UmVnaXN0cnk6IFdvcmtiZW5jaFBhcnRSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoTGF5b3V0U2VydmljZTogV29ya2JlbmNoTGF5b3V0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZW52aXJvbm1lbnRJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoUm91dGVyOiDJtVdvcmtiZW5jaFJvdXRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoTGF5b3V0RmFjdG9yeTogybVXb3JrYmVuY2hMYXlvdXRGYWN0b3J5LFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hMYXlvdXREaWZmZXI6IFdvcmtiZW5jaExheW91dERpZmZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoUG9wdXBEaWZmZXI6IFdvcmtiZW5jaFBvcHVwRGlmZmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hEaWFsb2dEaWZmZXI6IFdvcmtiZW5jaERpYWxvZ0RpZmZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoTWVzc2FnZUJveERpZmZlcjogV29ya2JlbmNoTWVzc2FnZUJveERpZmZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9nZ2VyOiBMb2dnZXIpIHtcbiAgICB0aGlzLmluc3RhbGxSb3V0ZXJFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqIEludm9rZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlV29ya2JlbmNoTmF2aWdhdGlvbkNvbnRleHQoZXZlbnQudXJsKTtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ29uTmF2aWdhdGlvblN0YXJ0JywgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQsIGBOYXZpZ2F0aW9uQ29udGV4dCBbcGFydHM9JHtjb250ZXh0LmxheW91dC5wYXJ0cygpLm1hcChwYXJ0ID0+IHBhcnQuaWQpfSwgbGF5b3V0RGlmZj0ke2NvbnRleHQubGF5b3V0RGlmZi50b1N0cmluZygpfSwgcG9wdXBEaWZmPSR7Y29udGV4dC5wb3B1cERpZmYudG9TdHJpbmcoKX0sIGRpYWxvZ0RpZmY9JHtjb250ZXh0LmRpYWxvZ0RpZmYudG9TdHJpbmcoKX0sIG1lc3NhZ2VCb3hEaWZmPSR7Y29udGV4dC5tZXNzYWdlQm94RGlmZi50b1N0cmluZygpfV1gKTtcbiAgICB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuc2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KGNvbnRleHQpO1xuICAgIHRoaXMucmVnaXN0ZXJBZGRlZE91dGxldEF1eGlsaWFyeVJvdXRlcygpO1xuICB9XG5cbiAgLyoqIEludm9rZWQgdXBvbiBzdWNjZXNzZnVsIG5hdmlnYXRpb24gKi9cbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ29uTmF2aWdhdGlvbkVuZCcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGV2ZW50KTtcbiAgICB0aGlzLnVucmVnaXN0ZXJSZW1vdmVkT3V0bGV0QXV4aWxpYXJ5Um91dGVzKCk7XG4gICAgdGhpcy5hcHBseVdvcmtiZW5jaExheW91dENoYW5nZXMoKTtcbiAgICB0aGlzLnB1Ymxpc2hXb3JrYmVuY2hMYXlvdXQoKTtcbiAgICB0aGlzLm1pZ3JhdGVVUkwoKTtcbiAgICB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuc2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KG51bGwpO1xuICB9XG5cbiAgLyoqIEludm9rZWQgd2hlbiBjYW5jZWxsZWQgdGhlIG5hdmlnYXRpb24sIGUuZy4sIGluIGEgZ3VhcmQgKi9cbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25DYW5jZWwoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ29uTmF2aWdhdGlvbkNhbmNlbCcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGV2ZW50KTtcbiAgICB0aGlzLnVuZG9BdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRpb24oKTtcbiAgICB0aGlzLnVuZG9Xb3JrYmVuY2hEaWZmZXJzKCk7XG4gICAgdGhpcy5fd29ya2JlbmNoUm91dGVyLnNldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dChudWxsKTtcbiAgfVxuXG4gIC8qKiBJbnZva2VkIHdoZW4gdGhlIG5hdmlnYXRpb24gZmFpbGVkICovXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uRXJyb3IoZXZlbnQ6IE5hdmlnYXRpb25FcnJvcik6IHZvaWQge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnb25OYXZpZ2F0aW9uRXJyb3InLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCBldmVudCk7XG4gICAgdGhpcy51bmRvQXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0aW9uKCk7XG4gICAgdGhpcy51bmRvV29ya2JlbmNoRGlmZmVycygpO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5zZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQobnVsbCk7XG4gIH1cblxuICAvKiogSW52b2tlZCBhZnRlciBjaGVja2VkIGd1YXJkcyBmb3IgYWN0aXZhdGlvbiAqL1xuICBwcml2YXRlIG9uR3VhcmRzQ2hlY2tFbmQoZXZlbnQ6IEd1YXJkc0NoZWNrRW5kKTogdm9pZCB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBvbkd1YXJkc0NoZWNrRW5kIFtzaG91bGRBY3RpdmF0ZT0ke2V2ZW50LnNob3VsZEFjdGl2YXRlfV1gLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCBldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLiBUaGUgY29udGV4dCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG5ldyBsYXlvdXQgYW5kIGhvdyBpdCBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgbGF5b3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCh1cmw6IHN0cmluZyk6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHtcbiAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5fcm91dGVyLnBhcnNlVXJsKHVybCk7XG4gICAgY29uc3Qgd29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGUgPSBXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXMuZnJvbU5hdmlnYXRpb24odGhpcy5fcm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uKCkhKTtcblxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgIG1haW5BcmVhR3JpZDogKCgpID0+IHtcbiAgICAgICAgLy8gUmVhZCB0aGUgbWFpbiBhcmVhIGdyaWQgZnJvbSB0aGUgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgICBjb25zdCBtYWluQXJlYUdyaWQgPSB1cmxUcmVlLnF1ZXJ5UGFyYW1NYXAuZ2V0KE1BSU5fQVJFQV9MQVlPVVRfUVVFUllfUEFSQU0pID8/IHVybFRyZWUucXVlcnlQYXJhbU1hcC5nZXQoJ3BhcnRzJyk7IC8vIFRPRE8gW0FuZ3VsYXIgMThdIFJlbW92ZSBmYWxsYmFjayB0byAncGFydHMnIHF1ZXJ5IHBhcmFtZXRlclxuICAgICAgICBpZiAobWFpbkFyZWFHcmlkKSB7XG4gICAgICAgICAgcmV0dXJuIG1haW5BcmVhR3JpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvIG5vdCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgbGF5b3V0IGlmIHRoZSBuYXZpZ2F0aW9uIHdhcyBwZXJmb3JtZWQgdmlhIHRoZSBXb3JrYmVuY2ggUm91dGVyLlxuICAgICAgICBjb25zdCBpc1dvcmtiZW5jaFJvdXRlck5hdmlnYXRpb24gPSB3b3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgaWYgKGlzV29ya2JlbmNoUm91dGVyTmF2aWdhdGlvbikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gbm90IGZhbGwgYmFjayB0byB0aGUgY3VycmVudCBsYXlvdXQgaWYgdGhlIG5hdmlnYXRpb24gd2FzIHRyaWdnZXJlZCBmcm9tIG91dHNpZGUgdGhlIEFuZ3VsYXIgUm91dGVyLCBpLmUuLCB0aGUgYnJvd3NlciBiYWNrL2ZvcndhcmQgYnV0dG9ucy5cbiAgICAgICAgY29uc3QgaXNFeHRlcm5hbE5hdmlnYXRpb24gPSB0aGlzLl9yb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb24oKSEudHJpZ2dlciA9PT0gJ3BvcHN0YXRlJztcbiAgICAgICAgaWYgKGlzRXh0ZXJuYWxOYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgbGF5b3V0IGlmIHRoZSBuYXZpZ2F0aW9uIHdhcyBwZXJmb3JtZWQgdmlhIHRoZSBBbmd1bGFyIHJvdXRlciwgaS5lLiwgdGhlIG5hdmlnYXRvciBkaWQgbm90IHByZXNlcnZlIHRoZSBxdWVyeSBwYXJhbXMuXG4gICAgICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dD8ubWFpbkFyZWFHcmlkO1xuICAgICAgfSkoKSxcbiAgICAgIHdvcmtiZW5jaEdyaWQ6IHdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlPy53b3JrYmVuY2hHcmlkID8/IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0Py53b3JrYmVuY2hHcmlkLFxuICAgICAgbWF4aW1pemVkOiB3b3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZT8ubWF4aW1pemVkID8/IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0Py5tYXhpbWl6ZWQsXG4gICAgICB2aWV3U3RhdGVzOiB3b3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZT8udmlld1N0YXRlcyA/PyB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dD8udmlld1N0YXRlcygpLFxuICAgICAgdmlld091dGxldHM6IE9iamVjdC5mcm9tRW50cmllcyhSb3V0ZXJVdGlscy5wYXJzZVZpZXdPdXRsZXRzKHVybFRyZWUpKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYXlvdXQsXG4gICAgICBsYXlvdXREaWZmOiB0aGlzLl93b3JrYmVuY2hMYXlvdXREaWZmZXIuZGlmZihsYXlvdXQsIHVybFRyZWUpLFxuICAgICAgcG9wdXBEaWZmOiB0aGlzLl93b3JrYmVuY2hQb3B1cERpZmZlci5kaWZmKHVybFRyZWUpLFxuICAgICAgZGlhbG9nRGlmZjogdGhpcy5fd29ya2JlbmNoRGlhbG9nRGlmZmVyLmRpZmYodXJsVHJlZSksXG4gICAgICBtZXNzYWdlQm94RGlmZjogdGhpcy5fd29ya2JlbmNoTWVzc2FnZUJveERpZmZlci5kaWZmKHVybFRyZWUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRm9yIGVhY2ggYWRkZWQgd29ya2JlbmNoIG91dGxldCwgcmVnaXN0ZXJzIGF1eGlsaWFyeSByb3V0ZXMgb2YgYWxsIHRvcC1sZXZlbCByb3V0ZXMuXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyQWRkZWRPdXRsZXRBdXhpbGlhcnlSb3V0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgbmF2aWdhdGlvbkNvbnRleHQgPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG5cbiAgICAvLyBSZWdpc3RlciB2aWV3IGF1eGlsaWFyeSByb3V0ZXMuXG4gICAgY29uc3QgYWRkZWRWaWV3cyA9IG5hdmlnYXRpb25Db250ZXh0LmxheW91dERpZmYuYWRkZWRWaWV3cztcbiAgICBpZiAoYWRkZWRWaWV3cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGF1eGlsaWFyeVJvdXRlcyA9IHRoaXMuX2F1eGlsaWFyeVJvdXRlc1JlZ2lzdHJhdG9yLnJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKGFkZGVkVmlld3MsIHtjYW5NYXRjaE5vdEZvdW5kUGFnZTogW2Nhbk1hdGNoTm90Rm91bmRQYWdlXX0pO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBSZWdpc3RlcmVkIGF1eGlsaWFyeSByb3V0ZXMgZm9yIHZpZXdzOiAke2FkZGVkVmlld3N9YCwgTG9nZ2VyTmFtZXMuUk9VVElORywgYXV4aWxpYXJ5Um91dGVzKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBwb3B1cCBhdXhpbGlhcnkgcm91dGVzLlxuICAgIGNvbnN0IGFkZGVkUG9wdXBPdXRsZXRzID0gbmF2aWdhdGlvbkNvbnRleHQucG9wdXBEaWZmLmFkZGVkUG9wdXBPdXRsZXRzO1xuICAgIGlmIChhZGRlZFBvcHVwT3V0bGV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGF1eGlsaWFyeVJvdXRlcyA9IHRoaXMuX2F1eGlsaWFyeVJvdXRlc1JlZ2lzdHJhdG9yLnJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKGFkZGVkUG9wdXBPdXRsZXRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgUmVnaXN0ZXJlZCBhdXhpbGlhcnkgcm91dGVzIGZvciBwb3B1cHM6ICR7YWRkZWRQb3B1cE91dGxldHN9YCwgTG9nZ2VyTmFtZXMuUk9VVElORywgYXV4aWxpYXJ5Um91dGVzKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBkaWFsb2cgYXV4aWxpYXJ5IHJvdXRlcy5cbiAgICBjb25zdCBhZGRlZERpYWxvZ091dGxldHMgPSBuYXZpZ2F0aW9uQ29udGV4dC5kaWFsb2dEaWZmLmFkZGVkRGlhbG9nT3V0bGV0cztcbiAgICBpZiAoYWRkZWREaWFsb2dPdXRsZXRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgYXV4aWxpYXJ5Um91dGVzID0gdGhpcy5fYXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0b3IucmVnaXN0ZXJBdXhpbGlhcnlSb3V0ZXMoYWRkZWREaWFsb2dPdXRsZXRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgUmVnaXN0ZXJlZCBhdXhpbGlhcnkgcm91dGVzIGZvciBkaWFsb2dzOiAke2FkZGVkRGlhbG9nT3V0bGV0c31gLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCBhdXhpbGlhcnlSb3V0ZXMpO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIG1lc3NhZ2UgYm94IGF1eGlsaWFyeSByb3V0ZXMuXG4gICAgY29uc3QgYWRkZWRNZXNzYWdlQm94T3V0bGV0cyA9IG5hdmlnYXRpb25Db250ZXh0Lm1lc3NhZ2VCb3hEaWZmLmFkZGVkTWVzc2FnZUJveE91dGxldHM7XG4gICAgaWYgKGFkZGVkTWVzc2FnZUJveE91dGxldHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhdXhpbGlhcnlSb3V0ZXMgPSB0aGlzLl9hdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvci5yZWdpc3RlckF1eGlsaWFyeVJvdXRlcyhhZGRlZE1lc3NhZ2VCb3hPdXRsZXRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgUmVnaXN0ZXJlZCBhdXhpbGlhcnkgcm91dGVzIGZvciBtZXNzYWdlIGJveGVzOiAke2FkZGVkTWVzc2FnZUJveE91dGxldHN9YCwgTG9nZ2VyTmFtZXMuUk9VVElORywgYXV4aWxpYXJ5Um91dGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJ0cyB0aGUgd29ya2JlbmNoIGRpZmZlcnMgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogSW52b2tlIHRoaXMgbWV0aG9kIGFmdGVyIG5hdmlnYXRpb24gZmFpbHVyZSBvciBjYW5jZWxsYXRpb24uIFRoZSBuYXZpZ2F0aW9uIGlzIGNhbmNlbGxlZCB3aGVuIGd1YXJkcyBwZXJmb3JtIGEgcmVkaXJlY3Qgb3IgcmVqZWN0IG5hdmlnYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHVuZG9Xb3JrYmVuY2hEaWZmZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZOYXZpZ2F0ZUxheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0OyAvLyBMYXlvdXQgaW4gYFdvcmtiZW5jaExheW91dFNlcnZpY2VgIGlzIG9ubHkgdXBkYXRlZCBhZnRlciBzdWNjZXNzZnVsIG5hdmlnYXRpb25cbiAgICBjb25zdCBwcmV2TmF2aWdhdGVVcmwgPSB0aGlzLl9yb3V0ZXIucGFyc2VVcmwodGhpcy5fcm91dGVyLnVybCk7IC8vIEJyb3dzZXIgVVJMIGlzIG9ubHkgdXBkYXRlZCBhZnRlciBzdWNjZXNzZnVsIG5hdmlnYXRpb25cbiAgICB0aGlzLl93b3JrYmVuY2hMYXlvdXREaWZmZXIuZGlmZihwcmV2TmF2aWdhdGVMYXlvdXQsIHByZXZOYXZpZ2F0ZVVybCk7XG4gICAgdGhpcy5fd29ya2JlbmNoUG9wdXBEaWZmZXIuZGlmZihwcmV2TmF2aWdhdGVVcmwpO1xuICAgIHRoaXMuX3dvcmtiZW5jaERpYWxvZ0RpZmZlci5kaWZmKHByZXZOYXZpZ2F0ZVVybCk7XG4gICAgdGhpcy5fd29ya2JlbmNoTWVzc2FnZUJveERpZmZlci5kaWZmKHByZXZOYXZpZ2F0ZVVybCk7XG4gIH1cblxuICAvKipcbiAgICogVW5kb2VzIHRoZSByZWdpc3RyYXRpb24gb2YgYXV4aWxpYXJ5IHJvdXRlcy5cbiAgICpcbiAgICogSW52b2tlIHRoaXMgbWV0aG9kIGFmdGVyIG5hdmlnYXRpb24gZmFpbHVyZSBvciBjYW5jZWxsYXRpb24uIFRoZSBuYXZpZ2F0aW9uIGlzIGNhbmNlbGxlZCB3aGVuIGd1YXJkcyBwZXJmb3JtIGEgcmVkaXJlY3Qgb3IgcmVqZWN0IG5hdmlnYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHVuZG9BdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgbmF2aWdhdGlvbkNvbnRleHQgPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG4gICAgY29uc3QgYWRkZWRPdXRsZXRzOiBzdHJpbmdbXSA9IFtcbiAgICAgIC4uLm5hdmlnYXRpb25Db250ZXh0LmxheW91dERpZmYuYWRkZWRWaWV3cyxcbiAgICAgIC4uLm5hdmlnYXRpb25Db250ZXh0LnBvcHVwRGlmZi5hZGRlZFBvcHVwT3V0bGV0cyxcbiAgICAgIC4uLm5hdmlnYXRpb25Db250ZXh0LmRpYWxvZ0RpZmYuYWRkZWREaWFsb2dPdXRsZXRzLFxuICAgICAgLi4ubmF2aWdhdGlvbkNvbnRleHQubWVzc2FnZUJveERpZmYuYWRkZWRNZXNzYWdlQm94T3V0bGV0cyxcbiAgICBdO1xuICAgIGlmIChhZGRlZE91dGxldHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9hdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvci51bnJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKGFkZGVkT3V0bGV0cyk7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYFVuZG8gYXV4aWxpYXJ5IHJvdXRlcyByZWdpc3RyYXRpb24gZm9yIG91dGxldChzKTogJHthZGRlZE91dGxldHN9YCwgTG9nZ2VyTmFtZXMuUk9VVElORyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcmVnaXN0cmllcyBhbmQgd29ya2JlbmNoIGhhbmRsZXMgdG8gcmVmbGVjdCB0aGUgbmV3IGxheW91dC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlXb3JrYmVuY2hMYXlvdXRDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IHtsYXlvdXR9ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuICAgIGlmIChsYXlvdXQgIT09IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KSB7IC8vIExheW91dCBpbnN0YW5jZSBkb2VzIG5vdCBjaGFuZ2UgaWYgbmF2aWdhdGluZyB0aHJvdWdoIHRoZSBBbmd1bGFyIHJvdXRlci5cbiAgICAgIHRoaXMudXBkYXRlVmlld1JlZ2lzdHJ5KCk7XG4gICAgICB0aGlzLnVwZGF0ZVBhcnRSZWdpc3RyeSgpO1xuXG4gICAgICBsYXlvdXQudmlld3MoKS5mb3JFYWNoKHZpZXcgPT4gdGhpcy5fdmlld1JlZ2lzdHJ5LmdldCh2aWV3LmlkKS5vbkxheW91dENoYW5nZShsYXlvdXQpKTtcbiAgICAgIGxheW91dC5wYXJ0cygpLmZvckVhY2gocGFydCA9PiB0aGlzLl9wYXJ0UmVnaXN0cnkuZ2V0KHBhcnQuaWQpLm9uTGF5b3V0Q2hhbmdlKGxheW91dCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgdGhlIHdvcmtiZW5jaCBsYXlvdXQgdmlhIHtAbGluayBXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfSwgc2ltaWxhciB0byBhIHRyYW5zYWN0aW9uYWwgY29tbWl0LlxuICAgKi9cbiAgcHJpdmF0ZSBwdWJsaXNoV29ya2JlbmNoTGF5b3V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHtsYXlvdXR9ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuICAgIGlmIChsYXlvdXQgIT09IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KSB7XG4gICAgICAvLyBMYXlvdXQgaW5zdGFuY2Ugb25seSBjaGFuZ2VzIHdoZW4gbmF2aWdhdGluZyB2aWEgdGhlIHdvcmtiZW5jaCByb3V0ZXIsIGJ1dCBub3QgdmlhIHRoZSBBbmd1bGFyIHJvdXRlciwgZS5nLiwgd2hlbiBub3QgbmF2aWdhdGluZyB2aWV3cy5cbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnUHVibGlzaGluZyB3b3JrYmVuY2ggbGF5b3V0JywgTG9nZ2VyTmFtZXMuUk9VVElORywgbGF5b3V0KTtcbiAgICAgIHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2Uuc2V0TGF5b3V0KGxheW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIFVSTCBpZiB0aGUgbGF5b3V0IGhhcyBiZWVuIG1pZ3JhdGVkIGZyb20gYW4gb3V0ZGF0ZWQgdmVyc2lvbi5cbiAgICovXG4gIHByaXZhdGUgbWlncmF0ZVVSTCgpOiB2b2lkIHtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCkubGF5b3V0O1xuICAgIGlmIChsYXlvdXQubWFpbkFyZWFHcmlkPy5taWdyYXRlZCkge1xuICAgICAgLy8gVXBkYXRlIHRoZSBVUkwgd2l0aCB0aGUgbWlncmF0ZWQgVVJMIGFuZCBjbGVhciBleGlzdGluZyBxdWVyeSBwYXJhbXMsIGZvciBleGFtcGxlLCBpZiB0aGUgbGF5b3V0IHF1ZXJ5IHBhcmFtZXRlciBoYXMgYmVlbiByZW5hbWVkLlxuICAgICAgdGhpcy5fd29ya2JlbmNoUm91dGVyLm5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXQsIHtxdWVyeVBhcmFtc0hhbmRsaW5nOiBudWxsLCByZXBsYWNlVXJsOiB0cnVlfSkudGhlbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhdXhpbGlhcnkgcm91dGVzIG9mIHJlbW92ZWQgd29ya2JlbmNoIG91dGxldHMuXG4gICAqL1xuICBwcml2YXRlIHVucmVnaXN0ZXJSZW1vdmVkT3V0bGV0QXV4aWxpYXJ5Um91dGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hdmlnYXRpb25Db250ZXh0ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IHJlbW92ZWRPdXRsZXRzOiBzdHJpbmdbXSA9IFtcbiAgICAgIC4uLm5hdmlnYXRpb25Db250ZXh0LmxheW91dERpZmYucmVtb3ZlZFZpZXdzLFxuICAgICAgLi4ubmF2aWdhdGlvbkNvbnRleHQucG9wdXBEaWZmLnJlbW92ZWRQb3B1cE91dGxldHMsXG4gICAgICAuLi5uYXZpZ2F0aW9uQ29udGV4dC5kaWFsb2dEaWZmLnJlbW92ZWREaWFsb2dPdXRsZXRzLFxuICAgICAgLi4ubmF2aWdhdGlvbkNvbnRleHQubWVzc2FnZUJveERpZmYucmVtb3ZlZE1lc3NhZ2VCb3hPdXRsZXRzLFxuICAgIF07XG4gICAgaWYgKHJlbW92ZWRPdXRsZXRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+ICdVbnJlZ2lzdGVyaW5nIG91dGxldCBhdXhpbGlhcnkgcm91dGVzOiAnLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCByZW1vdmVkT3V0bGV0cyk7XG4gICAgICB0aGlzLl9hdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvci51bnJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKHJlbW92ZWRPdXRsZXRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogLSBGb3IgZWFjaCBhZGRlZCB2aWV3LCBjb25zdHJ1Y3RzIGEge0BsaW5rIFdvcmtiZW5jaFZpZXd9IGFuZCByZWdpc3RlcnMgaXQgaW4ge0BsaW5rIFdvcmtiZW5jaFZpZXdSZWdpc3RyeX1cbiAgICogLSBGb3IgZWFjaCByZW1vdmVkIHZpZXcsIGRlc3Ryb3lzIHRoZSB7QGxpbmsgV29ya2JlbmNoVmlld30gYW5kIHVucmVnaXN0ZXJzIGl0IGluIHtAbGluayBXb3JrYmVuY2hWaWV3UmVnaXN0cnl9XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVZpZXdSZWdpc3RyeSgpOiB2b2lkIHtcbiAgICBjb25zdCB7bGF5b3V0RGlmZn0gPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG5cbiAgICBsYXlvdXREaWZmLmFkZGVkVmlld3MuZm9yRWFjaCh2aWV3SWQgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBDb25zdHJ1Y3RpbmcgybVXb3JrYmVuY2hWaWV3IFt2aWV3SWQ9JHt2aWV3SWR9XWAsIExvZ2dlck5hbWVzLkxJRkVDWUNMRSk7XG4gICAgICB0aGlzLl92aWV3UmVnaXN0cnkucmVnaXN0ZXIodGhpcy5jcmVhdGVXb3JrYmVuY2hWaWV3KHZpZXdJZCkpO1xuICAgIH0pO1xuICAgIGxheW91dERpZmYucmVtb3ZlZFZpZXdzLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgRGVzdHJveWluZyDJtVdvcmtiZW5jaFZpZXcgW3ZpZXdJZD0ke3ZpZXdJZH1dYCwgTG9nZ2VyTmFtZXMuTElGRUNZQ0xFKTtcbiAgICAgIHRoaXMuX3ZpZXdSZWdpc3RyeS51bnJlZ2lzdGVyKHZpZXdJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogLSBGb3IgZWFjaCBhZGRlZCBwYXJ0LCBjb25zdHJ1Y3RzIGEge0BsaW5rIFdvcmtiZW5jaFBhcnR9IGFuZCByZWdpc3RlcnMgaXQgaW4ge0BsaW5rIFdvcmtiZW5jaFBhcnRSZWdpc3RyeX1cbiAgICogLSBGb3IgZWFjaCByZW1vdmVkIHBhcnQsIGRlc3Ryb3lzIHRoZSB7QGxpbmsgV29ya2JlbmNoUGFydH0gYW5kIHVucmVnaXN0ZXJzIGl0IGluIHtAbGluayBXb3JrYmVuY2hQYXJ0UmVnaXN0cnl9XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVBhcnRSZWdpc3RyeSgpOiB2b2lkIHtcbiAgICBjb25zdCB7bGF5b3V0RGlmZn0gPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG5cbiAgICBsYXlvdXREaWZmLmFkZGVkUGFydHMuZm9yRWFjaChwYXJ0SWQgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBDb25zdHJ1Y3RpbmcgybVXb3JrYmVuY2hQYXJ0IFtwYXJ0SWQ9JHtwYXJ0SWR9XWAsIExvZ2dlck5hbWVzLkxJRkVDWUNMRSk7XG4gICAgICB0aGlzLl9wYXJ0UmVnaXN0cnkucmVnaXN0ZXIodGhpcy5jcmVhdGVXb3JrYmVuY2hQYXJ0KHBhcnRJZCkpO1xuICAgIH0pO1xuICAgIGxheW91dERpZmYucmVtb3ZlZFBhcnRzLmZvckVhY2gocGFydElkID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgRGVzdHJveWluZyDJtVdvcmtiZW5jaFBhcnQgW3BhcnRJZD0ke3BhcnRJZH1dYCwgTG9nZ2VyTmFtZXMuTElGRUNZQ0xFKTtcbiAgICAgIHRoaXMuX3BhcnRSZWdpc3RyeS51bnJlZ2lzdGVyKHBhcnRJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdvcmtiZW5jaFBhcnQocGFydElkOiBzdHJpbmcpOiDJtVdvcmtiZW5jaFBhcnQge1xuICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5fZW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4gbmV3IMm1V29ya2JlbmNoUGFydChwYXJ0SWQsIHtcbiAgICAgIGNvbXBvbmVudDogcGFydElkID09PSBNQUlOX0FSRUEgPyBNYWluQXJlYUxheW91dENvbXBvbmVudCA6IFBhcnRDb21wb25lbnQsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrYmVuY2hWaWV3KHZpZXdJZDogVmlld0lkKTogybVXb3JrYmVuY2hWaWV3IHtcbiAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuX2Vudmlyb25tZW50SW5qZWN0b3IsICgpID0+IG5ldyDJtVdvcmtiZW5jaFZpZXcodmlld0lkLCB7Y29tcG9uZW50OiBWaWV3Q29tcG9uZW50fSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnN0YWxsUm91dGVyRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fcm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZXZlbnQ6IEV2ZW50IHwgUm91dGVyRXZlbnQpOiBldmVudCBpcyBSb3V0ZXJFdmVudCA9PiBldmVudCBpbnN0YW5jZW9mIFJvdXRlckV2ZW50KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25TdGFydChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25FbmQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbCkge1xuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uQ2FuY2VsKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uRXJyb3IoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgR3VhcmRzQ2hlY2tFbmQpIHtcbiAgICAgICAgICB0aGlzLm9uR3VhcmRzQ2hlY2tFbmQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIl19
|
|
304
|
+
}], ctorParameters: () => [] });
|
|
305
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXVybC1vYnNlcnZlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy93b3JrYmVuY2gtdXJsLW9ic2VydmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0VBUUU7QUFFRixPQUFPLEVBQVEsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlILE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQy9GLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyxNQUFNLEVBQUUsV0FBVyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9D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LENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekcsQ0FBQztJQUNILENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2FBQ2hCLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxLQUEwQixFQUF3QixFQUFFLENBQUMsS0FBSyxZQUFZLFdBQVcsQ0FBQyxFQUMxRixrQkFBa0IsRUFBRSxDQUNyQjthQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQWtCLEVBQUUsRUFBRTtZQUNoQyxJQUFJLEtBQUssWUFBWSxlQUFlLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQ0ksSUFBSSxLQUFLLFlBQVksYUFBYSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsQ0FBQztpQkFDSSxJQUFJLEtBQUssWUFBWSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsQ0FBQztpQkFDSSxJQUFJLEtBQUssWUFBWSxlQUFlLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBL1JVLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGNBRFIsTUFBTTs7MkZBQ2xCLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyNCBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4qXG4qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4qXG4qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4qL1xuXG5pbXBvcnQge0V2ZW50LCBOYXZpZ2F0aW9uQ2FuY2VsLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIE5hdmlnYXRpb25TdGFydCwgUm91dGVyLCBSb3V0ZXJFdmVudH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Y3JlYXRlRW52aXJvbm1lbnRJbmplY3RvciwgRW52aXJvbm1lbnRJbmplY3RvciwgaW5qZWN0LCBJbmplY3RhYmxlLCBydW5JbkluamVjdGlvbkNvbnRleHR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXb3JrYmVuY2hBdXhpbGlhcnlSb3V0ZUluc3RhbGxlcn0gZnJvbSAnLi93b3JrYmVuY2gtYXV4aWxpYXJ5LXJvdXRlLWluc3RhbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7TUFJTl9BUkVBX0xBWU9VVF9RVUVSWV9QQVJBTX0gZnJvbSAnLi4vd29ya2JlbmNoLmNvbnN0YW50cyc7XG5pbXBvcnQge1dPUktCRU5DSF9WSUVXX1JFR0lTVFJZfSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3LnJlZ2lzdHJ5JztcbmltcG9ydCB7V09SS0JFTkNIX1BBUlRfUkVHSVNUUll9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQucmVnaXN0cnknO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7ybVXb3JrYmVuY2hQYXJ0fSBmcm9tICcuLi9wYXJ0L8m1d29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFZpZXd9IGZyb20gJy4uL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1ZpZXdDb21wb25lbnR9IGZyb20gJy4uL3ZpZXcvdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXREaWZmZXJ9IGZyb20gJy4vd29ya2JlbmNoLWxheW91dC1kaWZmZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hQb3B1cERpZmZlcn0gZnJvbSAnLi93b3JrYmVuY2gtcG9wdXAtZGlmZmVyJztcbmltcG9ydCB7TG9nZ2VyLCBMb2dnZXJOYW1lc30gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlc30gZnJvbSAnLi93b3JrYmVuY2gtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5pbXBvcnQge01haW5BcmVhTGF5b3V0Q29tcG9uZW50fSBmcm9tICcuLi9sYXlvdXQvbWFpbi1hcmVhLWxheW91dC9tYWluLWFyZWEtbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQge1BhcnRDb21wb25lbnR9IGZyb20gJy4uL3BhcnQvcGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHtNQUlOX0FSRUF9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0RmFjdG9yeX0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dC5mYWN0b3J5JztcbmltcG9ydCB7V29ya2JlbmNoRGlhbG9nRGlmZmVyfSBmcm9tICcuL3dvcmtiZW5jaC1kaWFsb2ctZGlmZmVyJztcbmltcG9ydCB7Um91dGluZ30gZnJvbSAnLi9yb3V0aW5nLnV0aWwnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFJvdXRlcn0gZnJvbSAnLi/JtXdvcmtiZW5jaC1yb3V0ZXIuc2VydmljZSc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0fSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtjYW5NYXRjaE5vdEZvdW5kUGFnZX0gZnJvbSAnLi93b3JrYmVuY2gtcm91dGUtZ3VhcmRzJztcbmltcG9ydCB7V29ya2JlbmNoTWVzc2FnZUJveERpZmZlcn0gZnJvbSAnLi93b3JrYmVuY2gtbWVzc2FnZS1ib3gtZGlmZmVyJztcbmltcG9ydCB7V29ya2JlbmNoVmlld091dGxldERpZmZlcn0gZnJvbSAnLi93b3JrYmVuY2gtdmlldy1vdXRsZXQtZGlmZmVyJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogVHJhY2tzIHRoZSBicm93c2VyIFVSTCBmb3Igd29ya2JlbmNoIGxheW91dCBjaGFuZ2VzLlxuICpcbiAqIC0gRm9yIGVhY2ggYWRkZWQgdmlldywgY29uc3RydWN0cyBhIHtAbGluayBXb3JrYmVuY2hWaWV3fSBhbmQgcmVnaXN0ZXJzIHZpZXcgc3BlY2lmaWMgYXV4aWxpYXJ5IHJvdXRlcyBvZiBhbGwgdG9wLWxldmVsIHJvdXRlc1xuICogLSBGb3IgZWFjaCByZW1vdmVkIHZpZXcsIGRlc3Ryb3lzIHtAbGluayBXb3JrYmVuY2hWaWV3fSBhbmQgdW5yZWdpc3RlcnMgaXRzIGF1eGlsaWFyeSByb3V0ZXNcbiAqIC0gRm9yIGVhY2ggYWRkZWQgcGFydCwgY29uc3RydWN0cyBhIHtAbGluayBXb3JrYmVuY2hQYXJ0fVxuICogLSBGb3IgZWFjaCByZW1vdmVkIHBhcnQsIGRlc3Ryb3lzIHtAbGluayBXb3JrYmVuY2hQYXJ0fVxuICogLSBQYXJzZXMgdGhlIHNlcmlhbGl6ZWQgbGF5b3V0IGFuZCBpbmplY3RzIGl0IGludG8ge0BsaW5rIFdvcmtiZW5jaExheW91dFNlcnZpY2V9LlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBXb3JrYmVuY2hVcmxPYnNlcnZlciB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2F1eGlsaWFyeVJvdXRlSW5zdGFsbGVyID0gaW5qZWN0KFdvcmtiZW5jaEF1eGlsaWFyeVJvdXRlSW5zdGFsbGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmlld1JlZ2lzdHJ5ID0gaW5qZWN0KFdPUktCRU5DSF9WSUVXX1JFR0lTVFJZKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGFydFJlZ2lzdHJ5ID0gaW5qZWN0KFdPUktCRU5DSF9QQVJUX1JFR0lTVFJZKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoTGF5b3V0U2VydmljZSA9IGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoUm91dGVyID0gaW5qZWN0KMm1V29ya2JlbmNoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoTGF5b3V0RmFjdG9yeSA9IGluamVjdCjJtVdvcmtiZW5jaExheW91dEZhY3RvcnkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hMYXlvdXREaWZmZXIgPSBpbmplY3QoV29ya2JlbmNoTGF5b3V0RGlmZmVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoVmlld091dGxldERpZmZlciA9IGluamVjdChXb3JrYmVuY2hWaWV3T3V0bGV0RGlmZmVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoUG9wdXBEaWZmZXIgPSBpbmplY3QoV29ya2JlbmNoUG9wdXBEaWZmZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hEaWFsb2dEaWZmZXIgPSBpbmplY3QoV29ya2JlbmNoRGlhbG9nRGlmZmVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoTWVzc2FnZUJveERpZmZlciA9IGluamVjdChXb3JrYmVuY2hNZXNzYWdlQm94RGlmZmVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyID0gaW5qZWN0KExvZ2dlcik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pbnN0YWxsUm91dGVyRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKiBJbnZva2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBuYXZpZ2F0aW9uICovXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uU3RhcnQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZVdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0KGV2ZW50LnVybCk7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+ICdvbk5hdmlnYXRpb25TdGFydCcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGV2ZW50LCBgTmF2aWdhdGlvbkNvbnRleHQgW3BhcnRzPSR7Y29udGV4dC5sYXlvdXQucGFydHMoKS5tYXAocGFydCA9PiBwYXJ0LmlkKX0sIGxheW91dERpZmY9JHtjb250ZXh0LmxheW91dERpZmYudG9TdHJpbmcoKX0sIHBvcHVwRGlmZj0ke2NvbnRleHQucG9wdXBEaWZmLnRvU3RyaW5nKCl9LCBkaWFsb2dEaWZmPSR7Y29udGV4dC5kaWFsb2dEaWZmLnRvU3RyaW5nKCl9LCBtZXNzYWdlQm94RGlmZj0ke2NvbnRleHQubWVzc2FnZUJveERpZmYudG9TdHJpbmcoKX1dYCk7XG4gICAgdGhpcy5fd29ya2JlbmNoUm91dGVyLnNldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dChjb250ZXh0KTtcbiAgICB0aGlzLnJlZ2lzdGVyQWRkZWRPdXRsZXRBdXhpbGlhcnlSb3V0ZXMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyQWRkZWRXb3JrYmVuY2hQYXJ0cygpO1xuICAgIHRoaXMucmVnaXN0ZXJBZGRlZFdvcmtiZW5jaFZpZXdzKCk7XG4gIH1cblxuICAvKiogSW52b2tlZCB1cG9uIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvbiAqL1xuICBwcml2YXRlIG9uTmF2aWdhdGlvbkVuZChldmVudDogTmF2aWdhdGlvbkVuZCk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnb25OYXZpZ2F0aW9uRW5kJywgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQpO1xuICAgIHRoaXMudW5yZWdpc3RlclJlbW92ZWRPdXRsZXRBdXhpbGlhcnlSb3V0ZXMoKTtcbiAgICB0aGlzLnVucmVnaXN0ZXJSZW1vdmVkV29ya2JlbmNoUGFydHMoKTtcbiAgICB0aGlzLnVucmVnaXN0ZXJSZW1vdmVkV29ya2JlbmNoVmlld3MoKTtcbiAgICB0aGlzLmFwcGx5V29ya2JlbmNoTGF5b3V0KCk7XG4gICAgdGhpcy5taWdyYXRlVVJMKCk7XG4gICAgdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLnJ1blBvc3ROYXZpZ2F0aW9uQWN0aW9ucygpO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5zZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQobnVsbCk7XG4gIH1cblxuICAvKiogSW52b2tlZCB3aGVuIGNhbmNlbGxlZCB0aGUgbmF2aWdhdGlvbiwgZS5nLiwgaW4gYSBndWFyZCAqL1xuICBwcml2YXRlIG9uTmF2aWdhdGlvbkNhbmNlbChldmVudDogTmF2aWdhdGlvbkNhbmNlbCk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnb25OYXZpZ2F0aW9uQ2FuY2VsJywgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQpO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKS51bmRvQ2hhbmdlcygpO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5zZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQobnVsbCk7XG4gIH1cblxuICAvKiogSW52b2tlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGZhaWxlZCAqL1xuICBwcml2YXRlIG9uTmF2aWdhdGlvbkVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ29uTmF2aWdhdGlvbkVycm9yJywgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQpO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKS51bmRvQ2hhbmdlcygpO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5zZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLiBUaGUgY29udGV4dCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG5ldyBsYXlvdXQgYW5kIGhvdyBpdCBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgbGF5b3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCh1cmw6IHN0cmluZyk6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHtcbiAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5fcm91dGVyLnBhcnNlVXJsKHVybCk7XG4gICAgY29uc3Qgd29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGUgPSBXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXMuZnJvbU5hdmlnYXRpb24odGhpcy5fcm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uKCkhKTtcbiAgICBjb25zdCBwcmV2aW91c0xheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KCk7XG4gICAgY29uc3QgcHJldmlvdXNVcmwgPSB0aGlzLl9yb3V0ZXIucGFyc2VVcmwodGhpcy5fcm91dGVyLnVybCk7IC8vIEJyb3dzZXIgVVJMIGlzIG9ubHkgdXBkYXRlZCBhZnRlciBzdWNjZXNzZnVsIG5hdmlnYXRpb25cblxuICAgIGNvbnN0IG5ld0xheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgIG1haW5BcmVhR3JpZDogKCgpID0+IHtcbiAgICAgICAgLy8gUmVhZCB0aGUgbWFpbiBhcmVhIGdyaWQgZnJvbSB0aGUgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgICBjb25zdCBtYWluQXJlYUdyaWQgPSB1cmxUcmVlLnF1ZXJ5UGFyYW1NYXAuZ2V0KE1BSU5fQVJFQV9MQVlPVVRfUVVFUllfUEFSQU0pO1xuICAgICAgICBpZiAobWFpbkFyZWFHcmlkKSB7XG4gICAgICAgICAgcmV0dXJuIG1haW5BcmVhR3JpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvIG5vdCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgbGF5b3V0IGlmIHRoZSBuYXZpZ2F0aW9uIHdhcyBwZXJmb3JtZWQgdmlhIHRoZSBXb3JrYmVuY2ggUm91dGVyLlxuICAgICAgICBjb25zdCBpc1dvcmtiZW5jaFJvdXRlck5hdmlnYXRpb24gPSB3b3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgaWYgKGlzV29ya2JlbmNoUm91dGVyTmF2aWdhdGlvbikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gbm90IGZhbGwgYmFjayB0byB0aGUgY3VycmVudCBsYXlvdXQgaWYgdGhlIG5hdmlnYXRpb24gd2FzIHRyaWdnZXJlZCBmcm9tIG91dHNpZGUgdGhlIEFuZ3VsYXIgUm91dGVyLCBpLmUuLCB0aGUgYnJvd3NlciBiYWNrL2ZvcndhcmQgYnV0dG9ucy5cbiAgICAgICAgY29uc3QgaXNFeHRlcm5hbE5hdmlnYXRpb24gPSB0aGlzLl9yb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb24oKSEudHJpZ2dlciA9PT0gJ3BvcHN0YXRlJztcbiAgICAgICAgaWYgKGlzRXh0ZXJuYWxOYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgbGF5b3V0IGlmIHRoZSBuYXZpZ2F0aW9uIHdhcyBwZXJmb3JtZWQgdmlhIHRoZSBBbmd1bGFyIHJvdXRlciwgaS5lLiwgdGhlIG5hdmlnYXRvciBkaWQgbm90IHByZXNlcnZlIHRoZSBxdWVyeSBwYXJhbXMuXG4gICAgICAgIHJldHVybiBwcmV2aW91c0xheW91dD8ubWFpbkFyZWFHcmlkO1xuICAgICAgfSkoKSxcbiAgICAgIHdvcmtiZW5jaEdyaWQ6IHdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlPy53b3JrYmVuY2hHcmlkID8/IHByZXZpb3VzTGF5b3V0Py53b3JrYmVuY2hHcmlkLFxuICAgICAgcGVyc3BlY3RpdmVJZDogd29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGU/LnBlcnNwZWN0aXZlSWQgPz8gcHJldmlvdXNMYXlvdXQ/LnBlcnNwZWN0aXZlSWQsXG4gICAgICBtYXhpbWl6ZWQ6IHdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlPy5tYXhpbWl6ZWQgPz8gcHJldmlvdXNMYXlvdXQ/Lm1heGltaXplZCxcbiAgICAgIG5hdmlnYXRpb25TdGF0ZXM6IHdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlPy5uYXZpZ2F0aW9uU3RhdGVzID8/IHByZXZpb3VzTGF5b3V0Py5uYXZpZ2F0aW9uU3RhdGVzKCksXG4gICAgICB2aWV3T3V0bGV0czogT2JqZWN0LmZyb21FbnRyaWVzKFJvdXRpbmcucGFyc2VWaWV3T3V0bGV0cyh1cmxUcmVlKSksXG4gICAgfSk7XG5cbiAgICBjb25zdCB1bmRvQWN0aW9ucyA9IG5ldyBBcnJheTwoKSA9PiB2b2lkPigpO1xuICAgIGNvbnN0IHBvc3ROYXZpZ2F0aW9uQWN0aW9ucyA9IG5ldyBBcnJheTwoKSA9PiB2b2lkPigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxheW91dDogbmV3TGF5b3V0LFxuICAgICAgcHJldmlvdXNMYXlvdXQsXG4gICAgICBsYXlvdXREaWZmOiB0aGlzLl93b3JrYmVuY2hMYXlvdXREaWZmZXIuZGlmZihuZXdMYXlvdXQpLFxuICAgICAgdmlld091dGxldERpZmY6IHRoaXMuX3dvcmtiZW5jaFZpZXdPdXRsZXREaWZmZXIuZGlmZihuZXdMYXlvdXQsIHVybFRyZWUpLFxuICAgICAgcG9wdXBEaWZmOiB0aGlzLl93b3JrYmVuY2hQb3B1cERpZmZlci5kaWZmKHVybFRyZWUpLFxuICAgICAgZGlhbG9nRGlmZjogdGhpcy5fd29ya2JlbmNoRGlhbG9nRGlmZmVyLmRpZmYodXJsVHJlZSksXG4gICAgICBtZXNzYWdlQm94RGlmZjogdGhpcy5fd29ya2JlbmNoTWVzc2FnZUJveERpZmZlci5kaWZmKHVybFRyZWUpLFxuICAgICAgdW5kb0NoYW5nZXM6ICgpID0+IHtcbiAgICAgICAgLy8gUmV2ZXJ0IGRpZmZlcnMgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbmF2aWdhdGlvbi5cbiAgICAgICAgdGhpcy5fd29ya2JlbmNoTGF5b3V0RGlmZmVyLmRpZmYocHJldmlvdXNMYXlvdXQpO1xuICAgICAgICB0aGlzLl93b3JrYmVuY2hWaWV3T3V0bGV0RGlmZmVyLmRpZmYocHJldmlvdXNMYXlvdXQsIHByZXZpb3VzVXJsKTtcbiAgICAgICAgdGhpcy5fd29ya2JlbmNoUG9wdXBEaWZmZXIuZGlmZihwcmV2aW91c1VybCk7XG4gICAgICAgIHRoaXMuX3dvcmtiZW5jaERpYWxvZ0RpZmZlci5kaWZmKHByZXZpb3VzVXJsKTtcbiAgICAgICAgdGhpcy5fd29ya2JlbmNoTWVzc2FnZUJveERpZmZlci5kaWZmKHByZXZpb3VzVXJsKTtcbiAgICAgICAgLy8gUnVuIHJlZ2lzdGVyZWQgdW5kbyBhY3Rpb25zLlxuICAgICAgICB1bmRvQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiBhY3Rpb24oKSk7XG4gICAgICB9LFxuICAgICAgcnVuUG9zdE5hdmlnYXRpb25BY3Rpb25zOiAoKSA9PiBwb3N0TmF2aWdhdGlvbkFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4gYWN0aW9uKCkpLFxuICAgICAgcmVnaXN0ZXJVbmRvQWN0aW9uOiBhY3Rpb24gPT4gdW5kb0FjdGlvbnMucHVzaChhY3Rpb24pLFxuICAgICAgcmVnaXN0ZXJQb3N0TmF2aWdhdGlvbkFjdGlvbjogYWN0aW9uID0+IHBvc3ROYXZpZ2F0aW9uQWN0aW9ucy5wdXNoKGFjdGlvbiksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBhZGRlZCB3b3JrYmVuY2ggb3V0bGV0LCByZWdpc3RlcnMgYXV4aWxpYXJ5IHJvdXRlcyBvZiBhbGwgdG9wLWxldmVsIHJvdXRlcy5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZGRlZE91dGxldEF1eGlsaWFyeVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXZpZ2F0aW9uQ29udGV4dCA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTtcblxuICAgIC8vIFJlZ2lzdGVyIHZpZXcgYXV4aWxpYXJ5IHJvdXRlcy5cbiAgICBjb25zdCBhZGRlZFZpZXdPdXRsZXRzID0gbmF2aWdhdGlvbkNvbnRleHQudmlld091dGxldERpZmYuYWRkZWRWaWV3T3V0bGV0cztcbiAgICBpZiAoYWRkZWRWaWV3T3V0bGV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGF1eGlsaWFyeVJvdXRlcyA9IHRoaXMuX2F1eGlsaWFyeVJvdXRlSW5zdGFsbGVyLnJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKGFkZGVkVmlld091dGxldHMsIHtjYW5NYXRjaE5vdEZvdW5kUGFnZTogW2Nhbk1hdGNoTm90Rm91bmRQYWdlXX0pO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBSZWdpc3RlcmVkIGF1eGlsaWFyeSByb3V0ZXMgZm9yIHZpZXdzOiAke2FkZGVkVmlld091dGxldHN9YCwgTG9nZ2VyTmFtZXMuUk9VVElORywgYXV4aWxpYXJ5Um91dGVzKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBwb3B1cCBhdXhpbGlhcnkgcm91dGVzLlxuICAgIGNvbnN0IGFkZGVkUG9wdXBPdXRsZXRzID0gbmF2aWdhdGlvbkNvbnRleHQucG9wdXBEaWZmLmFkZGVkUG9wdXBPdXRsZXRzO1xuICAgIGlmIChhZGRlZFBvcHVwT3V0bGV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGF1eGlsaWFyeVJvdXRlcyA9IHRoaXMuX2F1eGlsaWFyeVJvdXRlSW5zdGFsbGVyLnJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKGFkZGVkUG9wdXBPdXRsZXRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgUmVnaXN0ZXJlZCBhdXhpbGlhcnkgcm91dGVzIGZvciBwb3B1cHM6ICR7YWRkZWRQb3B1cE91dGxldHN9YCwgTG9nZ2VyTmFtZXMuUk9VVElORywgYXV4aWxpYXJ5Um91dGVzKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBkaWFsb2cgYXV4aWxpYXJ5IHJvdXRlcy5cbiAgICBjb25zdCBhZGRlZERpYWxvZ091dGxldHMgPSBuYXZpZ2F0aW9uQ29udGV4dC5kaWFsb2dEaWZmLmFkZGVkRGlhbG9nT3V0bGV0cztcbiAgICBpZiAoYWRkZWREaWFsb2dPdXRsZXRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgYXV4aWxpYXJ5Um91dGVzID0gdGhpcy5fYXV4aWxpYXJ5Um91dGVJbnN0YWxsZXIucmVnaXN0ZXJBdXhpbGlhcnlSb3V0ZXMoYWRkZWREaWFsb2dPdXRsZXRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgUmVnaXN0ZXJlZCBhdXhpbGlhcnkgcm91dGVzIGZvciBkaWFsb2dzOiAke2FkZGVkRGlhbG9nT3V0bGV0c31gLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCBhdXhpbGlhcnlSb3V0ZXMpO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIG1lc3NhZ2UgYm94IGF1eGlsaWFyeSByb3V0ZXMuXG4gICAgY29uc3QgYWRkZWRNZXNzYWdlQm94T3V0bGV0cyA9IG5hdmlnYXRpb25Db250ZXh0Lm1lc3NhZ2VCb3hEaWZmLmFkZGVkTWVzc2FnZUJveE91dGxldHM7XG4gICAgaWYgKGFkZGVkTWVzc2FnZUJveE91dGxldHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhdXhpbGlhcnlSb3V0ZXMgPSB0aGlzLl9hdXhpbGlhcnlSb3V0ZUluc3RhbGxlci5yZWdpc3RlckF1eGlsaWFyeVJvdXRlcyhhZGRlZE1lc3NhZ2VCb3hPdXRsZXRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgUmVnaXN0ZXJlZCBhdXhpbGlhcnkgcm91dGVzIGZvciBtZXNzYWdlIGJveGVzOiAke2FkZGVkTWVzc2FnZUJveE91dGxldHN9YCwgTG9nZ2VyTmFtZXMuUk9VVElORywgYXV4aWxpYXJ5Um91dGVzKTtcbiAgICB9XG5cbiAgICAvLyBSZXZlcnQgcmVnaXN0cmF0aW9uIGlmIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuICAgIG5hdmlnYXRpb25Db250ZXh0LnJlZ2lzdGVyVW5kb0FjdGlvbigoKSA9PiB7XG4gICAgICBjb25zdCBhZGRlZE91dGxldHMgPSBbLi4uYWRkZWRWaWV3T3V0bGV0cywgLi4uYWRkZWRQb3B1cE91dGxldHMsIC4uLmFkZGVkRGlhbG9nT3V0bGV0cywgLi4uYWRkZWRNZXNzYWdlQm94T3V0bGV0c107XG4gICAgICB0aGlzLl9hdXhpbGlhcnlSb3V0ZUluc3RhbGxlci51bnJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKGFkZGVkT3V0bGV0cyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYXV4aWxpYXJ5IHJvdXRlcyBvZiByZW1vdmVkIHdvcmtiZW5jaCBvdXRsZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyUmVtb3ZlZE91dGxldEF1eGlsaWFyeVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXZpZ2F0aW9uQ29udGV4dCA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTtcbiAgICBjb25zdCByZW1vdmVkT3V0bGV0czogc3RyaW5nW10gPSBbXG4gICAgICAuLi5uYXZpZ2F0aW9uQ29udGV4dC52aWV3T3V0bGV0RGlmZi5yZW1vdmVkVmlld091dGxldHMsXG4gICAgICAuLi5uYXZpZ2F0aW9uQ29udGV4dC5wb3B1cERpZmYucmVtb3ZlZFBvcHVwT3V0bGV0cyxcbiAgICAgIC4uLm5hdmlnYXRpb25Db250ZXh0LmRpYWxvZ0RpZmYucmVtb3ZlZERpYWxvZ091dGxldHMsXG4gICAgICAuLi5uYXZpZ2F0aW9uQ29udGV4dC5tZXNzYWdlQm94RGlmZi5yZW1vdmVkTWVzc2FnZUJveE91dGxldHMsXG4gICAgXTtcbiAgICBpZiAocmVtb3ZlZE91dGxldHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ1VucmVnaXN0ZXJpbmcgb3V0bGV0IGF1eGlsaWFyeSByb3V0ZXM6ICcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIHJlbW92ZWRPdXRsZXRzKTtcbiAgICAgIHRoaXMuX2F1eGlsaWFyeVJvdXRlSW5zdGFsbGVyLnVucmVnaXN0ZXJBdXhpbGlhcnlSb3V0ZXMocmVtb3ZlZE91dGxldHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBhZGRlZCBwYXJ0LCBjb25zdHJ1Y3RzIGEge0BsaW5rIFdvcmtiZW5jaFBhcnR9IGFuZCByZWdpc3RlcnMgaXQgaW4ge0BsaW5rIFdPUktCRU5DSF9QQVJUX1JFR0lTVFJZfS5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZGRlZFdvcmtiZW5jaFBhcnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hdmlnYXRpb25Db250ZXh0ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IHtsYXlvdXREaWZmfSA9IG5hdmlnYXRpb25Db250ZXh0O1xuXG4gICAgbGF5b3V0RGlmZi5hZGRlZFBhcnRzLmZvckVhY2gocGFydElkID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgQ29uc3RydWN0aW5nIMm1V29ya2JlbmNoUGFydCBbcGFydElkPSR7cGFydElkfV1gLCBMb2dnZXJOYW1lcy5MSUZFQ1lDTEUpO1xuICAgICAgdGhpcy5fcGFydFJlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMuY3JlYXRlV29ya2JlbmNoUGFydChwYXJ0SWQpKTtcbiAgICAgIG5hdmlnYXRpb25Db250ZXh0LnJlZ2lzdGVyVW5kb0FjdGlvbigoKSA9PiB0aGlzLl9wYXJ0UmVnaXN0cnkudW5yZWdpc3RlcihwYXJ0SWQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCByZW1vdmVkIHBhcnQsIGRlc3Ryb3lzIHRoZSB7QGxpbmsgV29ya2JlbmNoUGFydH0gYW5kIHVucmVnaXN0ZXJzIGl0IGluIHtAbGluayBXT1JLQkVOQ0hfUEFSVF9SRUdJU1RSWX0uXG4gICAqL1xuICBwcml2YXRlIHVucmVnaXN0ZXJSZW1vdmVkV29ya2JlbmNoUGFydHMoKTogdm9pZCB7XG4gICAgY29uc3Qge2xheW91dERpZmZ9ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuXG4gICAgbGF5b3V0RGlmZi5yZW1vdmVkUGFydHMuZm9yRWFjaChwYXJ0SWQgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBEZXN0cm95aW5nIMm1V29ya2JlbmNoUGFydCBbcGFydElkPSR7cGFydElkfV1gLCBMb2dnZXJOYW1lcy5MSUZFQ1lDTEUpO1xuICAgICAgdGhpcy5fcGFydFJlZ2lzdHJ5LnVucmVnaXN0ZXIocGFydElkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBhZGRlZCB2aWV3LCBjb25zdHJ1Y3RzIGEge0BsaW5rIFdvcmtiZW5jaFZpZXd9IGFuZCByZWdpc3RlcnMgaXQgaW4ge0BsaW5rIFdPUktCRU5DSF9WSUVXX1JFR0lTVFJZfS5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZGRlZFdvcmtiZW5jaFZpZXdzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hdmlnYXRpb25Db250ZXh0ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IHtsYXlvdXREaWZmfSA9IG5hdmlnYXRpb25Db250ZXh0O1xuXG4gICAgbGF5b3V0RGlmZi5hZGRlZFZpZXdzLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgQ29uc3RydWN0aW5nIMm1V29ya2JlbmNoVmlldyBbdmlld0lkPSR7dmlld0lkfV1gLCBMb2dnZXJOYW1lcy5MSUZFQ1lDTEUpO1xuICAgICAgdGhpcy5fdmlld1JlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMuY3JlYXRlV29ya2JlbmNoVmlldyh2aWV3SWQpKTtcbiAgICAgIG5hdmlnYXRpb25Db250ZXh0LnJlZ2lzdGVyVW5kb0FjdGlvbigoKSA9PiB0aGlzLl92aWV3UmVnaXN0cnkudW5yZWdpc3Rlcih2aWV3SWQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCByZW1vdmVkIHZpZXcsIGRlc3Ryb3lzIHRoZSB7QGxpbmsgV29ya2JlbmNoVmlld30gYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20ge0BsaW5rIFdPUktCRU5DSF9WSUVXX1JFR0lTVFJZfS5cbiAgICovXG4gIHByaXZhdGUgdW5yZWdpc3RlclJlbW92ZWRXb3JrYmVuY2hWaWV3cygpOiB2b2lkIHtcbiAgICBjb25zdCB7bGF5b3V0RGlmZn0gPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG5cbiAgICBsYXlvdXREaWZmLnJlbW92ZWRWaWV3cy5mb3JFYWNoKHZpZXdJZCA9PiB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYERlc3Ryb3lpbmcgybVXb3JrYmVuY2hWaWV3IFt2aWV3SWQ9JHt2aWV3SWR9XWAsIExvZ2dlck5hbWVzLkxJRkVDWUNMRSk7XG4gICAgICB0aGlzLl92aWV3UmVnaXN0cnkudW5yZWdpc3Rlcih2aWV3SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrYmVuY2hQYXJ0KHBhcnRJZDogc3RyaW5nKTogybVXb3JrYmVuY2hQYXJ0IHtcbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGhhbmRsZSBpbiBhbiBpbmplY3Rpb24gY29udGV4dCB0aGF0IHNoYXJlcyB0aGUgcGFydCdzIGxpZmVjeWNsZSwgYWxsb3dpbmcgZm9yIGF1dG9tYXRpYyBjbGVhbnVwIG9mIGVmZmVjdHMgYW5kIFJ4SlMgaW50ZXJvcCBmdW5jdGlvbnMuXG4gICAgY29uc3QgcGFydEVudmlyb25tZW50SW5qZWN0b3IgPSBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yKFtdLCB0aGlzLl9lbnZpcm9ubWVudEluamVjdG9yLCBgV29ya2JlbmNoIFBhcnQgJHtwYXJ0SWR9YCk7XG4gICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dChwYXJ0RW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4gbmV3IMm1V29ya2JlbmNoUGFydChwYXJ0SWQsIHtcbiAgICAgIGNvbXBvbmVudDogcGFydElkID09PSBNQUlOX0FSRUEgPyBNYWluQXJlYUxheW91dENvbXBvbmVudCA6IFBhcnRDb21wb25lbnQsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrYmVuY2hWaWV3KHZpZXdJZDogVmlld0lkKTogybVXb3JrYmVuY2hWaWV3IHtcbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGhhbmRsZSBpbiBhbiBpbmplY3Rpb24gY29udGV4dCB0aGF0IHNoYXJlcyB0aGUgdmlldydzIGxpZmVjeWNsZSwgYWxsb3dpbmcgZm9yIGF1dG9tYXRpYyBjbGVhbnVwIG9mIGVmZmVjdHMgYW5kIFJ4SlMgaW50ZXJvcCBmdW5jdGlvbnMuXG4gICAgY29uc3Qgdmlld0Vudmlyb25tZW50SW5qZWN0b3IgPSBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yKFtdLCB0aGlzLl9lbnZpcm9ubWVudEluamVjdG9yLCBgV29ya2JlbmNoIFZpZXcgJHt2aWV3SWR9YCk7XG4gICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh2aWV3RW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4gbmV3IMm1V29ya2JlbmNoVmlldyh2aWV3SWQsIHtjb21wb25lbnQ6IFZpZXdDb21wb25lbnR9KSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgY3VycmVudCBsYXlvdXQgdG8gdGhlIHdvcmtiZW5jaC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlXb3JrYmVuY2hMYXlvdXQoKTogdm9pZCB7XG4gICAgY29uc3Qge2xheW91dH0gPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG4gICAgdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5zZXRMYXlvdXQobGF5b3V0KTtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ0FwcGxpZWQgd29ya2JlbmNoIGxheW91dCcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGxheW91dCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgVVJMIGlmIHRoZSBsYXlvdXQgaGFzIGJlZW4gbWlncmF0ZWQgZnJvbSBhbiBvdXRkYXRlZCB2ZXJzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBtaWdyYXRlVVJMKCk6IHZvaWQge1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKS5sYXlvdXQ7XG4gICAgaWYgKGxheW91dC5tYWluQXJlYUdyaWQ/Lm1pZ3JhdGVkKSB7XG4gICAgICAvLyBVcGRhdGUgdGhlIFVSTCB3aXRoIHRoZSBtaWdyYXRlZCBVUkwgYW5kIGNsZWFyIGV4aXN0aW5nIHF1ZXJ5IHBhcmFtcywgZm9yIGV4YW1wbGUsIGlmIHRoZSBsYXlvdXQgcXVlcnkgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbmFtZWQuXG4gICAgICB0aGlzLl93b3JrYmVuY2hSb3V0ZXIubmF2aWdhdGUobGF5b3V0ID0+IGxheW91dCwge3F1ZXJ5UGFyYW1zSGFuZGxpbmc6IG51bGwsIHJlcGxhY2VVcmw6IHRydWV9KS50aGVuKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnN0YWxsUm91dGVyRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fcm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZXZlbnQ6IEV2ZW50IHwgUm91dGVyRXZlbnQpOiBldmVudCBpcyBSb3V0ZXJFdmVudCA9PiBldmVudCBpbnN0YW5jZW9mIFJvdXRlckV2ZW50KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25TdGFydChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25FbmQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbCkge1xuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uQ2FuY2VsKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uRXJyb3IoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIl19
|