@scion/workbench 18.0.0-beta.1 → 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/common/class-list.mjs +67 -29
- package/esm2022/lib/common/math.util.mjs +16 -0
- package/esm2022/lib/common/objects.util.mjs +7 -1
- package/esm2022/lib/common/operators.mjs +1 -12
- package/esm2022/lib/common/uid.util.mjs +22 -0
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +85 -28
- package/esm2022/lib/content-projection/workbench-element-references.mjs +32 -0
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +3 -8
- package/esm2022/lib/dialog/movable.directive.mjs +3 -3
- package/esm2022/lib/dialog/resizable.directive.mjs +3 -3
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +25 -23
- package/esm2022/lib/dialog/workbench-dialog.mjs +61 -1
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +98 -60
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +26 -23
- 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 +5 -5
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +8 -18
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +18 -21
- 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 +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 +18 -22
- 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 +26 -24
- package/esm2022/lib/layout/workbench-layouts.util.mjs +1 -9
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +19 -27
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +3 -2
- package/esm2022/lib/layout//311/265workbench-layout.mjs +73 -62
- package/esm2022/lib/logging/logging-support.mjs +7 -13
- package/esm2022/lib/logging//311/265logger.mjs +10 -10
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +7 -6
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +3 -3
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +2 -2
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +3 -2
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +22 -6
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +28 -21
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +11 -1
- 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 +5 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +6 -10
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +18 -9
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +7 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +15 -13
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +3 -2
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +6 -11
- 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-popup/microfrontend-popup-capability-validator.interceptor.mjs +4 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +11 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +12 -28
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +11 -27
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +91 -71
- package/esm2022/lib/microfrontend-platform/public_api.mjs +2 -1
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +5 -4
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +18 -16
- 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 +26 -8
- package/esm2022/lib/notification/notification-list.component.mjs +4 -8
- package/esm2022/lib/notification/notification.component.mjs +4 -5
- package/esm2022/lib/notification/notification.service.mjs +5 -4
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +5 -7
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +11 -19
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +4 -4
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +333 -264
- package/esm2022/lib/part/part-portal.pipe.mjs +8 -8
- package/esm2022/lib/part/part.component.mjs +33 -42
- package/esm2022/lib/part/view-context-menu/text.component.mjs +16 -12
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +4 -6
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +2 -2
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +48 -49
- package/esm2022/lib/part/view-list/view-list.component.mjs +41 -48
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +22 -26
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +15 -17
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +99 -110
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +3 -4
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +16 -17
- 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/workbench-grid-merger.service.mjs +3 -3
- 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 +71 -62
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +2 -2
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +62 -47
- package/esm2022/lib/popup/popup.component.mjs +3 -3
- package/esm2022/lib/popup/popup.config.mjs +27 -25
- package/esm2022/lib/popup/popup.service.mjs +169 -174
- package/esm2022/lib/portal/wb-component-portal.mjs +18 -17
- package/esm2022/lib/public_api.mjs +1 -1
- package/esm2022/lib/registry/workbench-object-registry.mjs +38 -17
- 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/workbench-auxiliary-route-installer.service.mjs +110 -0
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +3 -3
- package/esm2022/lib/routing/workbench-layout-differ.mjs +3 -10
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +3 -3
- package/esm2022/lib/routing/workbench-navigational-states.mjs +2 -2
- package/esm2022/lib/routing/workbench-popup-differ.mjs +3 -3
- package/esm2022/lib/routing/workbench-route-guards.mjs +57 -0
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +140 -148
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +58 -0
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +119 -74
- package/esm2022/lib/startup/splash/splash.component.mjs +3 -3
- package/esm2022/lib/startup/workbench-launcher.service.mjs +22 -10
- package/esm2022/lib/testing/workbench.provider.mjs +2 -2
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +15 -19
- package/esm2022/lib/view/public_api.mjs +1 -2
- package/esm2022/lib/view/view-move-handler.service.mjs +71 -56
- package/esm2022/lib/view/view-portal.pipe.mjs +7 -7
- package/esm2022/lib/view/view.component.mjs +54 -42
- 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/view-drag.service.mjs +87 -71
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +6 -6
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +6 -6
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +43 -56
- package/esm2022/lib/workbench-config.mjs +2 -2
- package/esm2022/lib/workbench-id.mjs +3 -3
- package/esm2022/lib/workbench.component.mjs +66 -54
- package/esm2022/lib/workbench.constants.mjs +1 -5
- package/esm2022/lib/workbench.model.mjs +1 -1
- package/esm2022/lib/workbench.provider.mjs +3 -9
- package/esm2022/lib/workbench.service.mjs +1 -1
- package/esm2022/lib//311/265workbench.service.mjs +38 -42
- package/fesm2022/scion-workbench.mjs +4054 -3276
- 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 +4 -0
- 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-v5.service.d.ts +12 -0
- 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 +5 -5
- 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/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/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,29 +7,31 @@
|
|
|
7
7
|
*
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
*/
|
|
10
|
-
import { ElementRef,
|
|
11
|
-
import { OverlayConfig } from '@angular/cdk/overlay';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
10
|
+
import { assertNotInReactiveContext, computed, createEnvironmentInjector, DestroyRef, effect, ElementRef, EnvironmentInjector, inject, Injectable, Injector, NgZone, runInInjectionContext, untracked } from '@angular/core';
|
|
11
|
+
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
|
|
12
|
+
import { firstValueFrom, fromEvent } from 'rxjs';
|
|
13
|
+
import { filter } from 'rxjs/operators';
|
|
14
14
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
15
|
-
import { Popup, ɵPopup
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
15
|
+
import { Popup, ɵPopup } from './popup.config';
|
|
16
|
+
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
17
|
+
import { Observables } from '@scion/toolkit/util';
|
|
18
|
+
import { WORKBENCH_VIEW_REGISTRY } from '../view/workbench-view.registry';
|
|
19
|
+
import { fromResize$ } from '@scion/toolkit/observable';
|
|
18
20
|
import { PopupComponent } from './popup.component';
|
|
19
21
|
import { DOCUMENT } from '@angular/common';
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
22
|
+
import { observeIn, subscribeIn } from '@scion/toolkit/operators';
|
|
23
|
+
import { ɵWorkbenchView } from '../view/ɵworkbench-view.model';
|
|
24
|
+
import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
23
25
|
import { provideViewContext } from '../view/view-context-provider';
|
|
26
|
+
import { UUID } from '@scion/toolkit/uuid';
|
|
27
|
+
import { boundingClientRect } from '@scion/components/dimension';
|
|
28
|
+
import { coerceElement } from '@angular/cdk/coercion';
|
|
29
|
+
import { clamp } from '../common/math.util';
|
|
24
30
|
import * as i0 from "@angular/core";
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const NORTH = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' };
|
|
30
|
-
const SOUTH = { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' };
|
|
31
|
-
const WEST = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' };
|
|
32
|
-
const EAST = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' };
|
|
31
|
+
const NORTH = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', panelClass: 'wb-north' };
|
|
32
|
+
const SOUTH = { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', panelClass: 'wb-south' };
|
|
33
|
+
const WEST = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', panelClass: 'wb-west' };
|
|
34
|
+
const EAST = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', panelClass: 'wb-east' };
|
|
33
35
|
/**
|
|
34
36
|
* Allows displaying a component in a workbench popup.
|
|
35
37
|
*
|
|
@@ -39,14 +41,14 @@ const EAST = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: '
|
|
|
39
41
|
* Unlike views, popups are not part of the persistent Workbench navigation, meaning that popups do not survive a page reload.
|
|
40
42
|
*/
|
|
41
43
|
export class PopupService {
|
|
42
|
-
constructor(
|
|
43
|
-
this.
|
|
44
|
-
this._overlay =
|
|
45
|
-
this._focusManager =
|
|
46
|
-
this._viewRegistry =
|
|
47
|
-
this._zone =
|
|
48
|
-
this._document =
|
|
49
|
-
this._view =
|
|
44
|
+
constructor() {
|
|
45
|
+
this._environmentInjector = inject(EnvironmentInjector);
|
|
46
|
+
this._overlay = inject(Overlay);
|
|
47
|
+
this._focusManager = inject(FocusMonitor);
|
|
48
|
+
this._viewRegistry = inject(WORKBENCH_VIEW_REGISTRY);
|
|
49
|
+
this._zone = inject(NgZone);
|
|
50
|
+
this._document = inject(DOCUMENT);
|
|
51
|
+
this._view = inject(ɵWorkbenchView, { optional: true });
|
|
50
52
|
}
|
|
51
53
|
/**
|
|
52
54
|
* Displays the specified component in a popup.
|
|
@@ -74,19 +76,20 @@ export class PopupService {
|
|
|
74
76
|
* - resolves to `undefined` if closed without a result
|
|
75
77
|
*/
|
|
76
78
|
async open(config) {
|
|
79
|
+
assertNotInReactiveContext(this.open, 'Call WorkbenchPopupService.open() in a non-reactive (non-tracking) context, such as within the untracked() function.');
|
|
77
80
|
// Ensure to run in Angular zone to display the popup even when called from outside of the Angular zone.
|
|
78
81
|
if (!NgZone.isInAngularZone()) {
|
|
79
82
|
return this._zone.run(() => this.open(config));
|
|
80
83
|
}
|
|
81
84
|
const align = config.align || 'north';
|
|
82
85
|
const contextualView = this.resolveContextualView(config);
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
//
|
|
87
|
-
const
|
|
86
|
+
const popup = this.createPopup(config, { view: contextualView });
|
|
87
|
+
const popupDestroyRef = popup.injector.get(DestroyRef);
|
|
88
|
+
const popupOrigin = this.trackPopupOrigin(config, contextualView, popup.injector);
|
|
89
|
+
// Wait for the initial position.
|
|
90
|
+
const initialPosition = await firstValueFrom(toObservable(popupOrigin, { injector: popup.injector }).pipe(filter(Boolean)));
|
|
88
91
|
const overlayPositionStrategy = this._overlay.position()
|
|
89
|
-
.flexibleConnectedTo(
|
|
92
|
+
.flexibleConnectedTo(initialPosition)
|
|
90
93
|
.withFlexibleDimensions(false)
|
|
91
94
|
.withLockedPosition(false) // If locked, the popup won't attempt to reposition itself if not enough space available.
|
|
92
95
|
.withPositions((() => {
|
|
@@ -105,10 +108,7 @@ export class PopupService {
|
|
|
105
108
|
})());
|
|
106
109
|
// Configure the popup overlay.
|
|
107
110
|
const overlayConfig = new OverlayConfig({
|
|
108
|
-
panelClass:
|
|
109
|
-
'wb-popup',
|
|
110
|
-
`wb-${align}`,
|
|
111
|
-
],
|
|
111
|
+
panelClass: 'wb-popup',
|
|
112
112
|
hasBackdrop: false,
|
|
113
113
|
positionStrategy: overlayPositionStrategy,
|
|
114
114
|
scrollStrategy: this._overlay.scrollStrategies.noop(),
|
|
@@ -116,9 +116,8 @@ export class PopupService {
|
|
|
116
116
|
});
|
|
117
117
|
// Construct the popup component and attach it to the DOM.
|
|
118
118
|
const overlayRef = this._overlay.create(overlayConfig);
|
|
119
|
-
const popup = runInInjectionContext(this._injector, () => new ɵPopup(config, referrer));
|
|
120
119
|
const popupPortal = new ComponentPortal(PopupComponent, null, Injector.create({
|
|
121
|
-
parent: config.componentConstructOptions?.injector || this.
|
|
120
|
+
parent: config.componentConstructOptions?.injector || this._environmentInjector,
|
|
122
121
|
providers: [
|
|
123
122
|
{ provide: ɵPopup, useValue: popup },
|
|
124
123
|
{ provide: Popup, useExisting: ɵPopup },
|
|
@@ -131,21 +130,22 @@ export class PopupService {
|
|
|
131
130
|
// Make the popup focusable and request the focus.
|
|
132
131
|
popupElement.setAttribute('tabindex', '-1');
|
|
133
132
|
this._focusManager.focusVia(popupElement, 'program'); // To not close the popup immediately when it opens, if using the 'onFocusLost' strategy.
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
133
|
+
// Reposition popup when the anchor is moved.
|
|
134
|
+
effect(() => {
|
|
135
|
+
const origin = popupOrigin();
|
|
136
|
+
untracked(() => {
|
|
137
|
+
if (origin) {
|
|
138
|
+
overlayPositionStrategy.setOrigin(origin);
|
|
139
|
+
overlayRef.updatePosition();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}, { injector: popup.injector });
|
|
143
|
+
// Reposition popup when resized.
|
|
144
|
+
fromResize$(overlayRef.overlayElement)
|
|
145
|
+
.pipe(observeIn(fn => this._zone.run(fn)), takeUntilDestroyed(popupDestroyRef))
|
|
146
|
+
.subscribe(() => {
|
|
143
147
|
overlayRef.updatePosition();
|
|
144
148
|
});
|
|
145
|
-
// Reposition the popup when its size changes (if necessary).
|
|
146
|
-
fromDimension$(overlayRef.overlayElement)
|
|
147
|
-
.pipe(takeUntilDestroyed(popup.destroyRef))
|
|
148
|
-
.subscribe(() => overlayRef.updatePosition());
|
|
149
149
|
// Close the popup depending on the passed config.
|
|
150
150
|
this.installPopupCloser(config, popupElement, popup, contextualView);
|
|
151
151
|
// Hide the popup when detaching the contextual view, if any.
|
|
@@ -153,62 +153,48 @@ export class PopupService {
|
|
|
153
153
|
this.hidePopupOnViewDetach(overlayRef, contextualView, popup);
|
|
154
154
|
}
|
|
155
155
|
// Dispose the popup when closing it.
|
|
156
|
-
|
|
156
|
+
popupDestroyRef.onDestroy(() => {
|
|
157
157
|
overlayRef.dispose();
|
|
158
158
|
});
|
|
159
159
|
return new Promise((resolve, reject) => {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
reject(popup.result.error);
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
resolve(popup.result);
|
|
166
|
-
}
|
|
160
|
+
popupDestroyRef.onDestroy(() => {
|
|
161
|
+
popup.result instanceof Error ? reject(popup.result) : resolve(popup.result);
|
|
167
162
|
});
|
|
168
163
|
});
|
|
169
164
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
break;
|
|
179
|
-
case EAST:
|
|
180
|
-
overlayRef.overlayElement.classList.add('wb-east');
|
|
181
|
-
break;
|
|
182
|
-
case WEST:
|
|
183
|
-
overlayRef.overlayElement.classList.add('wb-west');
|
|
184
|
-
break;
|
|
185
|
-
}
|
|
165
|
+
/**
|
|
166
|
+
* Creates the popup handle.
|
|
167
|
+
*/
|
|
168
|
+
createPopup(config, context) {
|
|
169
|
+
// Construct the handle in an injection context that shares the popup's lifecycle, allowing for automatic cleanup of effects and RxJS interop functions.
|
|
170
|
+
const popupId = config.id ?? UUID.randomUUID();
|
|
171
|
+
const popupEnvironmentInjector = createEnvironmentInjector([provideViewContext(context.view)], this._environmentInjector, `Workbench Popup ${popupId}`);
|
|
172
|
+
return runInInjectionContext(popupEnvironmentInjector, () => new ɵPopup(popupId, config));
|
|
186
173
|
}
|
|
187
174
|
/**
|
|
188
175
|
* Closes the popup depending on the configured popup closing strategy.
|
|
189
176
|
*/
|
|
190
177
|
installPopupCloser(config, popupElement, popup, contextualView) {
|
|
178
|
+
const popupDestroyRef = popup.injector.get(DestroyRef);
|
|
191
179
|
// Close the popup on escape keystroke.
|
|
192
180
|
if (config.closeStrategy?.onEscape ?? true) {
|
|
193
181
|
fromEvent(popupElement, 'keydown')
|
|
194
|
-
.pipe(filter((event) => event.key === 'Escape'),
|
|
182
|
+
.pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), filter((event) => event.key === 'Escape'), observeIn(fn => this._zone.run(fn)), takeUntilDestroyed(popupDestroyRef))
|
|
195
183
|
.subscribe(() => popup.close());
|
|
196
184
|
}
|
|
197
185
|
// Close the popup on focus loss.
|
|
198
186
|
if (config.closeStrategy?.onFocusLost ?? true) {
|
|
199
187
|
this._focusManager.monitor(popupElement, true)
|
|
200
|
-
.pipe(filter((focusOrigin) => !focusOrigin), takeUntilDestroyed(
|
|
201
|
-
.subscribe(() => popup.close());
|
|
188
|
+
.pipe(filter((focusOrigin) => !focusOrigin), takeUntilDestroyed(popupDestroyRef))
|
|
189
|
+
.subscribe(() => popup.close(popup.result));
|
|
202
190
|
}
|
|
203
191
|
// Close the popup when closing the view.
|
|
204
192
|
if (contextualView) {
|
|
205
|
-
|
|
206
|
-
.
|
|
207
|
-
|
|
208
|
-
if (!views.some(view => view.id === contextualView.id)) {
|
|
209
|
-
popup.close();
|
|
193
|
+
effect(() => {
|
|
194
|
+
if (!this._viewRegistry.objects().some(view => view.id === contextualView.id)) {
|
|
195
|
+
untracked(() => popup.close());
|
|
210
196
|
}
|
|
211
|
-
});
|
|
197
|
+
}, { injector: popup.injector });
|
|
212
198
|
}
|
|
213
199
|
}
|
|
214
200
|
/**
|
|
@@ -217,55 +203,63 @@ export class PopupService {
|
|
|
217
203
|
*/
|
|
218
204
|
hidePopupOnViewDetach(overlayRef, contextualView, popup) {
|
|
219
205
|
overlayRef.overlayElement.classList.add('wb-view-context');
|
|
206
|
+
const popupDestroyRef = popup.injector.get(DestroyRef);
|
|
220
207
|
let activeElement;
|
|
221
|
-
|
|
222
|
-
.
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
208
|
+
effect(() => {
|
|
209
|
+
const attached = contextualView.portal.attached();
|
|
210
|
+
untracked(() => {
|
|
211
|
+
if (attached) {
|
|
212
|
+
overlayRef.overlayElement.classList.add('wb-view-attached');
|
|
213
|
+
activeElement?.focus();
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
overlayRef.overlayElement.classList.remove('wb-view-attached');
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}, { injector: popup.injector });
|
|
232
220
|
// Track the focus in the popup to restore it when attaching the popup.
|
|
233
221
|
fromEvent(overlayRef.overlayElement, 'focusin')
|
|
234
|
-
.pipe(
|
|
222
|
+
.pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntilDestroyed(popupDestroyRef))
|
|
235
223
|
.subscribe(() => {
|
|
236
224
|
activeElement = this._document.activeElement instanceof HTMLElement ? this._document.activeElement : undefined;
|
|
237
225
|
});
|
|
238
226
|
}
|
|
239
227
|
/**
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
* The Observable emits the anchor's initial position, and each time when its position changes.
|
|
228
|
+
* Creates a signal that tracks the position of the popup anchor.
|
|
243
229
|
*/
|
|
244
|
-
|
|
230
|
+
trackPopupOrigin(config, contextualView, injector) {
|
|
231
|
+
const hostBounds = boundingClientRect(contextualView?.portal.componentRef.location.nativeElement ?? document.documentElement, { injector });
|
|
245
232
|
if (config.anchor instanceof Element || config.anchor instanceof ElementRef) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
viewportBounds$(view) {
|
|
261
|
-
if (view) {
|
|
262
|
-
return fromDimension$(view.portal.componentRef.location.nativeElement)
|
|
263
|
-
.pipe(map(dimension => dimension.element.getBoundingClientRect()), filter(clientRect => !isNullClientRect(clientRect)), // Omit viewport change if not having a size, for example, if the view is deactivated.
|
|
264
|
-
map(clientRect => ({ x: clientRect.left, y: clientRect.top, width: clientRect.width, height: clientRect.height })), startWithNullBoundsIf(() => !view.active));
|
|
233
|
+
const anchor = coerceElement(config.anchor);
|
|
234
|
+
const anchorBounds = boundingClientRect(anchor, { injector });
|
|
235
|
+
return computed(() => {
|
|
236
|
+
// Maintain position and size when detached to prevent flickering when attached again and to support for virtual scrolling in popup content.
|
|
237
|
+
if (contextualView && !contextualView.portal.attached()) {
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
// IMPORTANT: Track anchor and host bounds only if attached to prevent flickering.
|
|
241
|
+
// The `boundingClientRect` signal does not detect position changes when the element is scrolled out of view.
|
|
242
|
+
// Consequently, if the popup anchor is scrolled out of view and the view is enlarged, the popup may not align
|
|
243
|
+
// with the view boundaries. Therefore, we read the anchor's bounding box directly from the DOM.
|
|
244
|
+
anchorBounds();
|
|
245
|
+
return constrainClientRect(anchor.getBoundingClientRect(), hostBounds());
|
|
246
|
+
}, { equal: isEqualDomRect });
|
|
265
247
|
}
|
|
266
248
|
else {
|
|
267
|
-
|
|
268
|
-
|
|
249
|
+
const anchorBounds = toSignal(Observables.coerce(config.anchor), { injector });
|
|
250
|
+
return computed(() => {
|
|
251
|
+
// Maintain position and size when detached to prevent flickering when attached again and to support for virtual scrolling in popup content.
|
|
252
|
+
if (contextualView && !contextualView.portal.attached()) {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
// IMPORTANT: Track anchor and host bounds only if attached to prevent flickering.
|
|
256
|
+
if (!anchorBounds()) {
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
const { x, y } = mapToPageCoordinates(anchorBounds(), hostBounds());
|
|
260
|
+
const { width, height } = anchorBounds();
|
|
261
|
+
return constrainClientRect(new DOMRect(x, y, width, height), hostBounds());
|
|
262
|
+
}, { equal: isEqualDomRect });
|
|
269
263
|
}
|
|
270
264
|
}
|
|
271
265
|
/**
|
|
@@ -280,63 +274,64 @@ export class PopupService {
|
|
|
280
274
|
}
|
|
281
275
|
return null;
|
|
282
276
|
}
|
|
283
|
-
|
|
284
|
-
* Maps the passed popup origin, which is relative to the given viewport, to a page coordinate.
|
|
285
|
-
*/
|
|
286
|
-
mapPopupOriginToPageCoordinate(origin, viewportBounds) {
|
|
287
|
-
const xy = origin;
|
|
288
|
-
if (xy.x !== undefined && xy.y !== undefined) {
|
|
289
|
-
return {
|
|
290
|
-
x: viewportBounds.x + xy.x,
|
|
291
|
-
y: viewportBounds.y + xy.y,
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
const topLeft = origin;
|
|
295
|
-
if (topLeft.top !== undefined && topLeft.left !== undefined) {
|
|
296
|
-
return {
|
|
297
|
-
x: viewportBounds.x + topLeft.left,
|
|
298
|
-
y: viewportBounds.y + topLeft.top,
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
const topRight = origin;
|
|
302
|
-
if (topRight.top !== undefined && topRight.right !== undefined) {
|
|
303
|
-
return {
|
|
304
|
-
x: viewportBounds.x + (viewportBounds.width - topRight.right),
|
|
305
|
-
y: viewportBounds.y + topRight.top,
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
const bottomLeft = origin;
|
|
309
|
-
if (bottomLeft.bottom !== undefined && bottomLeft.left !== undefined) {
|
|
310
|
-
return {
|
|
311
|
-
x: viewportBounds.x + bottomLeft.left,
|
|
312
|
-
y: viewportBounds.y + (viewportBounds.height - bottomLeft.bottom),
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
const bottomRight = origin;
|
|
316
|
-
if (bottomRight.bottom !== undefined && bottomRight.right !== undefined) {
|
|
317
|
-
return {
|
|
318
|
-
x: viewportBounds.x + (viewportBounds.width - bottomRight.right),
|
|
319
|
-
y: viewportBounds.y + (viewportBounds.height - bottomRight.bottom),
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
throw Error('[PopupOriginError] Illegal popup origin; must be "Point", "TopLeftPoint", "TopRightPoint", "BottomLeftPoint" or "BottomRightPoint".');
|
|
323
|
-
}
|
|
324
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PopupService, deps: [{ token: i0.Injector }, { token: i1.Overlay }, { token: i2.FocusMonitor }, { token: i3.WorkbenchViewRegistry }, { token: i0.NgZone }, { token: DOCUMENT }, { token: i4.ɵWorkbenchView, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
277
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PopupService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
325
278
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PopupService, providedIn: 'root' }); }
|
|
326
279
|
}
|
|
327
280
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PopupService, decorators: [{
|
|
328
281
|
type: Injectable,
|
|
329
282
|
args: [{ providedIn: 'root' }]
|
|
330
|
-
}]
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
283
|
+
}] });
|
|
284
|
+
/**
|
|
285
|
+
* Maps given view coordinates to absolute page coordinates.
|
|
286
|
+
*/
|
|
287
|
+
function mapToPageCoordinates(origin, relativeTo) {
|
|
288
|
+
const xy = origin;
|
|
289
|
+
if (xy.x !== undefined && xy.y !== undefined) {
|
|
290
|
+
return {
|
|
291
|
+
x: relativeTo.x + xy.x,
|
|
292
|
+
y: relativeTo.y + xy.y,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
const topLeft = origin;
|
|
296
|
+
if (topLeft.top !== undefined && topLeft.left !== undefined) {
|
|
297
|
+
return {
|
|
298
|
+
x: relativeTo.x + topLeft.left,
|
|
299
|
+
y: relativeTo.y + topLeft.top,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
const topRight = origin;
|
|
303
|
+
if (topRight.top !== undefined && topRight.right !== undefined) {
|
|
304
|
+
return {
|
|
305
|
+
x: relativeTo.x + (relativeTo.width - topRight.right),
|
|
306
|
+
y: relativeTo.y + topRight.top,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
const bottomLeft = origin;
|
|
310
|
+
if (bottomLeft.bottom !== undefined && bottomLeft.left !== undefined) {
|
|
311
|
+
return {
|
|
312
|
+
x: relativeTo.x + bottomLeft.left,
|
|
313
|
+
y: relativeTo.y + (relativeTo.height - bottomLeft.bottom),
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
const bottomRight = origin;
|
|
317
|
+
if (bottomRight.bottom !== undefined && bottomRight.right !== undefined) {
|
|
318
|
+
return {
|
|
319
|
+
x: relativeTo.x + (relativeTo.width - bottomRight.right),
|
|
320
|
+
y: relativeTo.y + (relativeTo.height - bottomRight.bottom),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
throw Error('[PopupOriginError] Illegal popup origin; must be "Point", "TopLeftPoint", "TopRightPoint", "BottomLeftPoint" or "BottomRightPoint".');
|
|
324
|
+
}
|
|
325
|
+
function constrainClientRect(clientRect, constraints) {
|
|
326
|
+
const top = clamp(clientRect.top, { min: constraints.top, max: constraints.bottom });
|
|
327
|
+
const right = clamp(clientRect.right, { min: constraints.left, max: constraints.right });
|
|
328
|
+
const bottom = clamp(clientRect.bottom, { min: constraints.top, max: constraints.bottom });
|
|
329
|
+
const left = clamp(clientRect.left, { min: constraints.left, max: constraints.right });
|
|
330
|
+
const width = right - left;
|
|
331
|
+
const height = bottom - top;
|
|
332
|
+
return new DOMRect(left, top, width, height);
|
|
338
333
|
}
|
|
339
|
-
function
|
|
340
|
-
return
|
|
334
|
+
function isEqualDomRect(a, b) {
|
|
335
|
+
return a?.top === b?.top && a?.right === b?.right && a?.bottom === b?.bottom && a?.left === b?.left;
|
|
341
336
|
}
|
|
342
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3BvcHVwL3BvcHVwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFzRyxhQUFhLEVBQWEsTUFBTSxzQkFBc0IsQ0FBQztBQUNwSyxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQXVDLE1BQU0sTUFBTSxDQUFDO0FBQ2xILE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLEtBQUssRUFBOEIsTUFBTSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFdkUsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ2xGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUd4RSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFD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QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtFbGVtZW50UmVmLCBJbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBOZ1pvbmUsIE9wdGlvbmFsLCBydW5JbkluamVjdGlvbkNvbnRleHR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsIENvbm5lY3RlZFBvc2l0aW9uLCBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3lPcmlnaW4sIE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWZ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7Y29tYmluZUxhdGVzdFdpdGgsIGZpcnN0VmFsdWVGcm9tLCBmcm9tRXZlbnQsIGlkZW50aXR5LCBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGh9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Q29tcG9uZW50UG9ydGFsfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7UG9wdXAsIFBvcHVwQ29uZmlnLCBQb3B1cFJlZmVycmVyLCDJtVBvcHVwLCDJtVBvcHVwRXJyb3JSZXN1bHR9IGZyb20gJy4vcG9wdXAuY29uZmlnJztcbmltcG9ydCB7Rm9jdXNNb25pdG9yLCBGb2N1c09yaWdpbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHtEaWN0aW9uYXJpZXMsIE9iamVjdHMsIE9ic2VydmFibGVzfSBmcm9tICdAc2Npb24vdG9vbGtpdC91dGlsJztcbmltcG9ydCB7V29ya2JlbmNoVmlld1JlZ2lzdHJ5fSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3LnJlZ2lzdHJ5JztcbmltcG9ydCB7ZnJvbUJvdW5kaW5nQ2xpZW50UmVjdCQsIGZyb21EaW1lbnNpb24kfSBmcm9tICdAc2Npb24vdG9vbGtpdC9vYnNlcnZhYmxlJztcbmltcG9ydCB7UG9wdXBDb21wb25lbnR9IGZyb20gJy4vcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge29ic2VydmVJbnNpZGUsIHN1YnNjcmliZUluc2lkZX0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7ybVXb3JrYmVuY2hWaWV3fSBmcm9tICcuLi92aWV3L8m1d29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtCb3R0b21MZWZ0UG9pbnQsIEJvdHRvbVJpZ2h0UG9pbnQsIFBvaW50LCBQb3B1cE9yaWdpbiwgVG9wTGVmdFBvaW50LCBUb3BSaWdodFBvaW50fSBmcm9tICcuL3BvcHVwLm9yaWdpbic7XG5pbXBvcnQge2NvZXJjZUVsZW1lbnR9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtwcm92aWRlVmlld0NvbnRleHR9IGZyb20gJy4uL3ZpZXcvdmlldy1jb250ZXh0LXByb3ZpZGVyJztcblxuY29uc3QgTk9SVEg6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbSd9O1xuY29uc3QgU09VVEg6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ3RvcCd9O1xuY29uc3QgV0VTVDogQ29ubmVjdGVkUG9zaXRpb24gPSB7b3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInfTtcbmNvbnN0IEVBU1Q6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiAnY2VudGVyJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnY2VudGVyJ307XG5cbi8qKlxuICogQWxsb3dzIGRpc3BsYXlpbmcgYSBjb21wb25lbnQgaW4gYSB3b3JrYmVuY2ggcG9wdXAuXG4gKlxuICogQSBwb3B1cCBpcyBhIHZpc3VhbCB3b3JrYmVuY2ggY29tcG9uZW50IGZvciBkaXNwbGF5aW5nIGNvbnRlbnQgYWJvdmUgb3RoZXIgY29udGVudC4gSXQgaXMgcG9zaXRpb25lZCByZWxhdGl2ZSB0byBhbiBhbmNob3IsXG4gKiB3aGljaCBjYW4gYmUgZWl0aGVyIGEgY29vcmRpbmF0ZSBvciBhbiBIVE1MIGVsZW1lbnQuIFRoZSBwb3B1cCBtb3ZlcyB3aGVuIHRoZSBhbmNob3IgbW92ZXMuXG4gKlxuICogVW5saWtlIHZpZXdzLCBwb3B1cHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwZXJzaXN0ZW50IFdvcmtiZW5jaCBuYXZpZ2F0aW9uLCBtZWFuaW5nIHRoYXQgcG9wdXBzIGRvIG5vdCBzdXJ2aXZlIGEgcGFnZSByZWxvYWQuXG4gKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIFBvcHVwU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIF9vdmVybGF5OiBPdmVybGF5LFxuICAgICAgICAgICAgICBwcml2YXRlIF9mb2N1c01hbmFnZXI6IEZvY3VzTW9uaXRvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdmlld1JlZ2lzdHJ5OiBXb3JrYmVuY2hWaWV3UmVnaXN0cnksXG4gICAgICAgICAgICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF92aWV3PzogybVXb3JrYmVuY2hWaWV3KSB7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgaW4gYSBwb3B1cC5cbiAgICpcbiAgICogVG8gcG9zaXRpb24gdGhlIHBvcHVwLCBwcm92aWRlIGVpdGhlciBhIGNvb3JkaW5hdGUgb3IgYW4gZWxlbWVudCB0byBzZXJ2ZSBhcyB0aGUgcG9wdXAgYW5jaG9yLlxuICAgKlxuICAgKiBJZiB5b3UgdXNlIGFuIGVsZW1lbnQgYXMgdGhlIHBvcHVwIGFuY2hvciwgdGhlIHBvcHVwIGFsc28gbW92ZXMgd2hlbiB0aGUgYW5jaG9yIGVsZW1lbnQgbW92ZXMuIElmIHlvdSB1c2UgYSBjb29yZGluYXRlXG4gICAqIGFuZCBvcGVuIHRoZSBwb3B1cCBpbiB0aGUgY29udGV4dCBvZiBhIHZpZXcsIHRoZSBwb3B1cCBvcGVucyByZWxhdGl2ZSB0byB0aGUgYm91bmRzIG9mIHRoYXQgdmlldy4gT3RoZXJ3aXNlLCBpdFxuICAgKiBpcyBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIHRoZSBwYWdlIHZpZXdwb3J0LiBJZiB5b3UgbW92ZSBvciByZXNpemUgdGhlIHZpZXcgb3IgdGhlIHBhZ2UsIHRoZSBwb3B1cCB3aWxsIGFsc28gYmUgbW92ZWRcbiAgICogZGVwZW5kaW5nIG9uIHRoZSBwYWlyIG9mIGNvb3JkaW5hdGVzIHVzZWQuXG4gICAqXG4gICAqIEJ5IHNldHRpbmcgdGhlIGFsaWdubWVudCBvZiB0aGUgcG9wdXAsIHlvdSBjYW4gY29udHJvbCB0aGUgcmVnaW9uIHdoZXJlIHRvIG9wZW4gdGhlIHBvcHVwIHJlbGF0aXZlIHRvIGl0cyBhbmNob3IuXG4gICAqXG4gICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gcGFzcyBkYXRhIHRvIHRoZSBwb3B1cCBjb21wb25lbnQuIFRoZSBjb21wb25lbnQgY2FuIGluamVjdCB0aGUgcG9wdXAgaGFuZGxlIHtAbGluayBQb3B1cH0gdG9cbiAgICogcmVhZCBpbnB1dCBkYXRhIG9yIHRvIGNsb3NlIHRoZSBwb3B1cC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIHBvcHVwIHdpbGwgY2xvc2Ugb24gZm9jdXMgbG9zcywgb3Igd2hlbiB0aGUgdXNlciBoaXRzIHRoZSBlc2NhcGUga2V5LlxuICAgKlxuICAgKiBJZiBvcGVuaW5nIHRoZSBwb3B1cCBpbiB0aGUgY29udGV4dCBvZiBhIHZpZXcsIHRoZSBwb3B1cCBpcyBib3VuZCB0byB0aGUgbGlmZWN5Y2xlIG9mIHRoZSB2aWV3LCB0aGF0IGlzLCB0aGUgcG9wdXBcbiAgICogaXMgZGlzcGxheWVkIG9ubHkgaWYgdGhlIHZpZXcgaXMgYWN0aXZlIGFuZCBpcyBjbG9zZWQgd2hlbiB0aGUgdmlldyBpcyBjbG9zZWQuXG4gICAqXG4gICAqIEBwYXJhbSAgIGNvbmZpZyAtIENvbnRyb2xzIHBvcHVwIGJlaGF2aW9yXG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0OlxuICAgKiAgICAgICAgICAtIHJlc29sdmVzIHRvIHRoZSByZXN1bHQgaWYgY2xvc2VkIHdpdGggYSByZXN1bHRcbiAgICogICAgICAgICAgLSByZXNvbHZlcyB0byBgdW5kZWZpbmVkYCBpZiBjbG9zZWQgd2l0aG91dCBhIHJlc3VsdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIG9wZW48Uj4oY29uZmlnOiBQb3B1cENvbmZpZyk6IFByb21pc2U8Uj4ge1xuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lIHRvIGRpc3BsYXkgdGhlIHBvcHVwIGV2ZW4gd2hlbiBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLm9wZW4oY29uZmlnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxpZ24gPSBjb25maWcuYWxpZ24gfHwgJ25vcnRoJztcbiAgICBjb25zdCBjb250ZXh0dWFsVmlldyA9IHRoaXMucmVzb2x2ZUNvbnRleHR1YWxWaWV3KGNvbmZpZyk7XG4gICAgY29uc3QgcmVmZXJyZXI6IFBvcHVwUmVmZXJyZXIgPSBEaWN0aW9uYXJpZXMud2l0aG91dFVuZGVmaW5lZEVudHJpZXMoe1xuICAgICAgdmlld0lkOiBjb250ZXh0dWFsVmlldz8uaWQsXG4gICAgfSk7XG5cbiAgICAvLyBTZXQgdXAgdGhlIHBvcHVwIHBvc2l0aW9uaW5nIHN0cmF0ZWd5LlxuICAgIGNvbnN0IHBvcHVwT3JpZ2luJCA9IHRoaXMub2JzZXJ2ZVBvcHVwT3JpZ2luJChjb25maWcsIGNvbnRleHR1YWxWaWV3KS5waXBlKHNoYXJlUmVwbGF5KHtidWZmZXJTaXplOiAxLCByZWZDb3VudDogZmFsc2V9KSk7XG4gICAgY29uc3Qgb3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKGF3YWl0IGZpcnN0VmFsdWVGcm9tKHBvcHVwT3JpZ2luJCkpXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgIC53aXRoTG9ja2VkUG9zaXRpb24oZmFsc2UpIC8vIElmIGxvY2tlZCwgdGhlIHBvcHVwIHdvbid0IGF0dGVtcHQgdG8gcmVwb3NpdGlvbiBpdHNlbGYgaWYgbm90IGVub3VnaCBzcGFjZSBhdmFpbGFibGUuXG4gICAgICAud2l0aFBvc2l0aW9ucygoKCk6IENvbm5lY3RlZFBvc2l0aW9uW10gPT4ge1xuICAgICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgICAgY2FzZSAnbm9ydGgnOlxuICAgICAgICAgICAgcmV0dXJuIFtOT1JUSCwgU09VVEgsIFdFU1QsIEVBU1RdO1xuICAgICAgICAgIGNhc2UgJ3NvdXRoJzpcbiAgICAgICAgICAgIHJldHVybiBbU09VVEgsIE5PUlRILCBXRVNULCBFQVNUXTtcbiAgICAgICAgICBjYXNlICd3ZXN0JzpcbiAgICAgICAgICAgIHJldHVybiBbV0VTVCwgRUFTVCwgTk9SVEgsIFNPVVRIXTtcbiAgICAgICAgICBjYXNlICdlYXN0JzpcbiAgICAgICAgICAgIHJldHVybiBbRUFTVCwgV0VTVCwgTk9SVEgsIFNPVVRIXTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tQb3B1cFBvc2l0aW9uRXJyb3JdIElsbGVnYWwgcG9zaXRpb247IG11c3QgYmUgbm9ydGgsIHNvdXRoLCB3ZXN0IG9yIGVhc3QnKTtcbiAgICAgICAgfVxuICAgICAgfSkoKSk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIHBvcHVwIG92ZXJsYXkuXG4gICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgIHBhbmVsQ2xhc3M6IFtcbiAgICAgICAgJ3diLXBvcHVwJyxcbiAgICAgICAgYHdiLSR7YWxpZ259YCxcbiAgICAgIF0sXG4gICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBvdmVybGF5UG9zaXRpb25TdHJhdGVneSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpLFxuICAgICAgZGlzcG9zZU9uTmF2aWdhdGlvbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIENvbnN0cnVjdCB0aGUgcG9wdXAgY29tcG9uZW50IGFuZCBhdHRhY2ggaXQgdG8gdGhlIERPTS5cbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XG4gICAgY29uc3QgcG9wdXAgPSBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IG5ldyDJtVBvcHVwKGNvbmZpZywgcmVmZXJyZXIpKTtcbiAgICBjb25zdCBwb3B1cFBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoUG9wdXBDb21wb25lbnQsIG51bGwsIEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IGNvbmZpZy5jb21wb25lbnRDb25zdHJ1Y3RPcHRpb25zPy5pbmplY3RvciB8fCB0aGlzLl9pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7cHJvdmlkZTogybVQb3B1cCwgdXNlVmFsdWU6IHBvcHVwfSxcbiAgICAgICAge3Byb3ZpZGU6IFBvcHVwLCB1c2VFeGlzdGluZzogybVQb3B1cH0sXG4gICAgICAgIHByb3ZpZGVWaWV3Q29udGV4dChjb250ZXh0dWFsVmlldyksXG4gICAgICAgIC4uLltjb25maWcuY29tcG9uZW50Q29uc3RydWN0T3B0aW9ucz8ucHJvdmlkZXJzIHx8IFtdXSxcbiAgICAgIF0sXG4gICAgfSkpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IG92ZXJsYXlSZWYuYXR0YWNoKHBvcHVwUG9ydGFsKTtcbiAgICBjb25zdCBwb3B1cEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAvLyBNYWtlIHRoZSBwb3B1cCBmb2N1c2FibGUgYW5kIHJlcXVlc3QgdGhlIGZvY3VzLlxuICAgIHBvcHVwRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgdGhpcy5fZm9jdXNNYW5hZ2VyLmZvY3VzVmlhKHBvcHVwRWxlbWVudCwgJ3Byb2dyYW0nKTsgLy8gVG8gbm90IGNsb3NlIHRoZSBwb3B1cCBpbW1lZGlhdGVseSB3aGVuIGl0IG9wZW5zLCBpZiB1c2luZyB0aGUgJ29uRm9jdXNMb3N0JyBzdHJhdGVneS5cblxuICAgIC8vIFN5bmNocm9uaXplIHRoZSBDU1MgY2xhc3MgdGhhdCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHBvcHVwIGRvY2tzIHRvIHRoZSBhbmNob3I7IGlzIG9uZSBvZiAnd2Itbm9ydGgnLCAnd2Itc291dGgnLCAnd2ItZWFzdCcsIG9yICd3Yi13ZXN0Jy5cbiAgICBvdmVybGF5UG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbkNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZChwb3B1cC5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoY2hhbmdlID0+IHRoaXMuc2V0UG9wdXBBbGlnbkNzc0NsYXNzKG92ZXJsYXlSZWYsIGNoYW5nZSkpO1xuXG4gICAgLy8gUmUtcG9zaXRpb24gdGhlIHBvcHVwIHdoZW4gdGhlIG9yaWdpbiBtb3Zlcy5cbiAgICBwb3B1cE9yaWdpbiRcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZChwb3B1cC5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKG9yaWdpbjogRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5T3JpZ2luKSA9PiB7XG4gICAgICAgIG92ZXJsYXlQb3NpdGlvblN0cmF0ZWd5LnNldE9yaWdpbihvcmlnaW4pO1xuICAgICAgICBvdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICB9KTtcblxuICAgIC8vIFJlcG9zaXRpb24gdGhlIHBvcHVwIHdoZW4gaXRzIHNpemUgY2hhbmdlcyAoaWYgbmVjZXNzYXJ5KS5cbiAgICBmcm9tRGltZW5zaW9uJChvdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHBvcHVwLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiBvdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCkpO1xuXG4gICAgLy8gQ2xvc2UgdGhlIHBvcHVwIGRlcGVuZGluZyBvbiB0aGUgcGFzc2VkIGNvbmZpZy5cbiAgICB0aGlzLmluc3RhbGxQb3B1cENsb3Nlcihjb25maWcsIHBvcHVwRWxlbWVudCwgcG9wdXAsIGNvbnRleHR1YWxWaWV3KTtcblxuICAgIC8vIEhpZGUgdGhlIHBvcHVwIHdoZW4gZGV0YWNoaW5nIHRoZSBjb250ZXh0dWFsIHZpZXcsIGlmIGFueS5cbiAgICBpZiAoY29udGV4dHVhbFZpZXcpIHtcbiAgICAgIHRoaXMuaGlkZVBvcHVwT25WaWV3RGV0YWNoKG92ZXJsYXlSZWYsIGNvbnRleHR1YWxWaWV3LCBwb3B1cCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcG9zZSB0aGUgcG9wdXAgd2hlbiBjbG9zaW5nIGl0LlxuICAgIHBvcHVwLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHBvcHVwLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgICAgaWYgKHBvcHVwLnJlc3VsdCBpbnN0YW5jZW9mIMm1UG9wdXBFcnJvclJlc3VsdCkge1xuICAgICAgICAgIHJlamVjdChwb3B1cC5yZXN1bHQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUocG9wdXAucmVzdWx0IGFzIFIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UG9wdXBBbGlnbkNzc0NsYXNzKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsIHBvc2l0aW9uQ2hhbmdlOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpOiB2b2lkIHtcbiAgICBvdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3diLW5vcnRoJywgJ3diLXNvdXRoJywgJ3diLWVhc3QnLCAnd2Itd2VzdCcpO1xuICAgIHN3aXRjaCAocG9zaXRpb25DaGFuZ2UuY29ubmVjdGlvblBhaXIpIHtcbiAgICAgIGNhc2UgTk9SVEg6XG4gICAgICAgIG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnd2Itbm9ydGgnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNPVVRIOlxuICAgICAgICBvdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3diLXNvdXRoJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQVNUOlxuICAgICAgICBvdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3diLWVhc3QnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFdFU1Q6XG4gICAgICAgIG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnd2Itd2VzdCcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBwb3B1cCBkZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyZWQgcG9wdXAgY2xvc2luZyBzdHJhdGVneS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFBvcHVwQ2xvc2VyKGNvbmZpZzogUG9wdXBDb25maWcsIHBvcHVwRWxlbWVudDogSFRNTEVsZW1lbnQsIHBvcHVwOiDJtVBvcHVwLCBjb250ZXh0dWFsVmlldzogybVXb3JrYmVuY2hWaWV3IHwgbnVsbCk6IHZvaWQge1xuICAgIC8vIENsb3NlIHRoZSBwb3B1cCBvbiBlc2NhcGUga2V5c3Ryb2tlLlxuICAgIGlmIChjb25maWcuY2xvc2VTdHJhdGVneT8ub25Fc2NhcGUgPz8gdHJ1ZSkge1xuICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KHBvcHVwRWxlbWVudCwgJ2tleWRvd24nKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5rZXkgPT09ICdFc2NhcGUnKSxcbiAgICAgICAgICBzdWJzY3JpYmVJbnNpZGUoY29udGludWVGbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGNvbnRpbnVlRm4pKSxcbiAgICAgICAgICBvYnNlcnZlSW5zaWRlKGNvbnRpbnVlRm4gPT4gdGhpcy5fem9uZS5ydW4oY29udGludWVGbikpLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZChwb3B1cC5kZXN0cm95UmVmKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHBvcHVwLmNsb3NlKCkpO1xuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBwb3B1cCBvbiBmb2N1cyBsb3NzLlxuICAgIGlmIChjb25maWcuY2xvc2VTdHJhdGVneT8ub25Gb2N1c0xvc3QgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5fZm9jdXNNYW5hZ2VyLm1vbml0b3IocG9wdXBFbGVtZW50LCB0cnVlKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKGZvY3VzT3JpZ2luOiBGb2N1c09yaWdpbikgPT4gIWZvY3VzT3JpZ2luKSxcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQocG9wdXAuZGVzdHJveVJlZiksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiBwb3B1cC5jbG9zZSgpKTtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSB0aGUgcG9wdXAgd2hlbiBjbG9zaW5nIHRoZSB2aWV3LlxuICAgIGlmIChjb250ZXh0dWFsVmlldykge1xuICAgICAgdGhpcy5fdmlld1JlZ2lzdHJ5LnZpZXdzJFxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQocG9wdXAuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUodmlld3MgPT4ge1xuICAgICAgICAgIGlmICghdmlld3Muc29tZSh2aWV3ID0+IHZpZXcuaWQgPT09IGNvbnRleHR1YWxWaWV3LmlkKSkge1xuICAgICAgICAgICAgcG9wdXAuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgcG9wdXAgd2hlbiBpdHMgY29udGV4dHVhbCB2aWV3IGlzIGRldGFjaGVkLCBhbmQgZGlzcGxheXMgaXQgd2hlbiBpdCBpcyByZWF0dGFjaGVkLiBBbHNvIHJlc3RvcmVzIHRoZSBmb2N1cyBvbiByZS1hY3RpdmF0aW9uLlxuICAgKiBUaGUgY29udGV4dHVhbCB2aWV3IGlzIGRldGFjaGVkIGlmIG5vdCBhY3RpdmUsIG9yIGxvY2F0ZWQgaW4gdGhlIHBlcmlwaGVyYWwgYXJlYSBhbmQgdGhlIG1haW4gYXJlYSBpcyBtYXhpbWl6ZWQuXG4gICAqL1xuICBwcml2YXRlIGhpZGVQb3B1cE9uVmlld0RldGFjaChvdmVybGF5UmVmOiBPdmVybGF5UmVmLCBjb250ZXh0dWFsVmlldzogybVXb3JrYmVuY2hWaWV3LCBwb3B1cDogybVQb3B1cCk6IHZvaWQge1xuICAgIG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnd2Itdmlldy1jb250ZXh0Jyk7XG5cbiAgICBsZXQgYWN0aXZlRWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBjb250ZXh0dWFsVmlldy5wb3J0YWwuYXR0YWNoZWQkXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQocG9wdXAuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKGF0dGFjaGVkID0+IHtcbiAgICAgICAgaWYgKGF0dGFjaGVkKSB7XG4gICAgICAgICAgb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd3Yi12aWV3LWF0dGFjaGVkJyk7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBvdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3diLXZpZXctYXR0YWNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBUcmFjayB0aGUgZm9jdXMgaW4gdGhlIHBvcHVwIHRvIHJlc3RvcmUgaXQgd2hlbiBhdHRhY2hpbmcgdGhlIHBvcHVwLlxuICAgIGZyb21FdmVudChvdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LCAnZm9jdXNpbicpXG4gICAgICAucGlwZShcbiAgICAgICAgc3Vic2NyaWJlSW5zaWRlKGNvbnRpbnVlRm4gPT4gdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcihjb250aW51ZUZuKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZChwb3B1cC5kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gdGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA6IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9wdXAgYW5jaG9yLlxuICAgKlxuICAgKiBUaGUgT2JzZXJ2YWJsZSBlbWl0cyB0aGUgYW5jaG9yJ3MgaW5pdGlhbCBwb3NpdGlvbiwgYW5kIGVhY2ggdGltZSB3aGVuIGl0cyBwb3NpdGlvbiBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBvYnNlcnZlUG9wdXBPcmlnaW4kKGNvbmZpZzogUG9wdXBDb25maWcsIGNvbnRleHR1YWxWaWV3OiDJtVdvcmtiZW5jaFZpZXcgfCBudWxsKTogT2JzZXJ2YWJsZTxGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3lPcmlnaW4+IHtcbiAgICBpZiAoY29uZmlnLmFuY2hvciBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgY29uZmlnLmFuY2hvciBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgIHJldHVybiBmcm9tQm91bmRpbmdDbGllbnRSZWN0JChjb2VyY2VFbGVtZW50PEhUTUxFbGVtZW50Pihjb25maWcuYW5jaG9yIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgLnBpcGUobWFwKGNsaWVudFJlY3QgPT4gKHt4OiBjbGllbnRSZWN0LngsIHk6IGNsaWVudFJlY3QueSwgd2lkdGg6IGNsaWVudFJlY3Qud2lkdGgsIGhlaWdodDogY2xpZW50UmVjdC5oZWlnaHR9KSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlcy5jb2VyY2UoY29uZmlnLmFuY2hvcilcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy52aWV3cG9ydEJvdW5kcyQoY29udGV4dHVhbFZpZXcpKSxcbiAgICAgICAgICBtYXAoKFtwb3B1cE9yaWdpbiwgdmlld3BvcnRCb3VuZHNdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7eCwgeX0gPSB0aGlzLm1hcFBvcHVwT3JpZ2luVG9QYWdlQ29vcmRpbmF0ZShwb3B1cE9yaWdpbiwgdmlld3BvcnRCb3VuZHMpO1xuICAgICAgICAgICAgcmV0dXJuIHt4LCB5LCB3aWR0aDogcG9wdXBPcmlnaW4ud2lkdGgsIGhlaWdodDogcG9wdXBPcmlnaW4uaGVpZ2h0fTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChPYmplY3RzLmlzRXF1YWwpLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlcyB0aGUgYm91bmRzIG9mIHRoZSB2aWV3cG9ydCAodmlldyBvciBwYWdlKSBpbiB3aGljaCB0aGUgcG9wdXAgaGFzIGJlZW4gb3BlbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydEJvdW5kcyQodmlldzogybVXb3JrYmVuY2hWaWV3IHwgbnVsbCk6IE9ic2VydmFibGU8Vmlld3BvcnRCb3VuZHM+IHtcbiAgICBpZiAodmlldykge1xuICAgICAgcmV0dXJuIGZyb21EaW1lbnNpb24kKHZpZXcucG9ydGFsLmNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoZGltZW5zaW9uID0+IGRpbWVuc2lvbi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxcbiAgICAgICAgICBmaWx0ZXIoY2xpZW50UmVjdCA9PiAhaXNOdWxsQ2xpZW50UmVjdChjbGllbnRSZWN0KSksIC8vIE9taXQgdmlld3BvcnQgY2hhbmdlIGlmIG5vdCBoYXZpbmcgYSBzaXplLCBmb3IgZXhhbXBsZSwgaWYgdGhlIHZpZXcgaXMgZGVhY3RpdmF0ZWQuXG4gICAgICAgICAgbWFwKGNsaWVudFJlY3QgPT4gKHt4OiBjbGllbnRSZWN0LmxlZnQsIHk6IGNsaWVudFJlY3QudG9wLCB3aWR0aDogY2xpZW50UmVjdC53aWR0aCwgaGVpZ2h0OiBjbGllbnRSZWN0LmhlaWdodH0pKSxcbiAgICAgICAgICBzdGFydFdpdGhOdWxsQm91bmRzSWYoKCkgPT4gIXZpZXcuYWN0aXZlKSwgLy8gRW5zdXJlIGluaXRpYWwgYm91bmRzIHRvIGJlIGVtaXR0ZWQgZXZlbiBpZiB0aGUgdmlldyBpcyBpbmFjdGl2ZS4gT3RoZXJ3aXNlLCB0aGUgcG9wdXAgd291bGQgbm90IGJlIGF0dGFjaGVkIHRvIHRoZSBET00gdW50aWwgdGhlIHZpZXcgaXMgYWN0aXZhdGVkLlxuICAgICAgICApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZCBhcyB2b2lkKSxcbiAgICAgICAgICBtYXAoKCkgPT4gKHt4OiAwLCB5OiAwLCB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0fSkpLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY29udGV4dHVhbCB2aWV3IHRvIHdoaWNoIHRoZSBwb3B1cCBpcyBib3VuZC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUNvbnRleHR1YWxWaWV3KGNvbmZpZzogUG9wdXBDb25maWcpOiDJtVdvcmtiZW5jaFZpZXcgfCBudWxsIHtcbiAgICBpZiAoY29uZmlnLmNvbnRleHQ/LnZpZXdJZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdSZWdpc3RyeS5nZXQoY29uZmlnLmNvbnRleHQudmlld0lkKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5jb250ZXh0Py52aWV3SWQgPT09IHVuZGVmaW5lZCkgeyAvLyBgbnVsbGAgbWVhbnMgdG8gb3BlbiB0aGUgcG9wdXAgb3V0c2lkZSB0aGUgY29udGV4dHVhbCB2aWV3XG4gICAgICByZXR1cm4gdGhpcy5fdmlldyA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIHRoZSBwYXNzZWQgcG9wdXAgb3JpZ2luLCB3aGljaCBpcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gdmlld3BvcnQsIHRvIGEgcGFnZSBjb29yZGluYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXBQb3B1cE9yaWdpblRvUGFnZUNvb3JkaW5hdGUob3JpZ2luOiBQb3B1cE9yaWdpbiwgdmlld3BvcnRCb3VuZHM6IFZpZXdwb3J0Qm91bmRzKTogUG9pbnQge1xuICAgIGNvbnN0IHh5ID0gb3JpZ2luIGFzIFBvaW50O1xuICAgIGlmICh4eS54ICE9PSB1bmRlZmluZWQgJiYgeHkueSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB2aWV3cG9ydEJvdW5kcy54ICsgeHkueCxcbiAgICAgICAgeTogdmlld3BvcnRCb3VuZHMueSArIHh5LnksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB0b3BMZWZ0ID0gb3JpZ2luIGFzIFRvcExlZnRQb2ludDtcbiAgICBpZiAodG9wTGVmdC50b3AgIT09IHVuZGVmaW5lZCAmJiB0b3BMZWZ0LmxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogdmlld3BvcnRCb3VuZHMueCArIHRvcExlZnQubGVmdCxcbiAgICAgICAgeTogdmlld3BvcnRCb3VuZHMueSArIHRvcExlZnQudG9wLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdG9wUmlnaHQgPSBvcmlnaW4gYXMgVG9wUmlnaHRQb2ludDtcbiAgICBpZiAodG9wUmlnaHQudG9wICE9PSB1bmRlZmluZWQgJiYgdG9wUmlnaHQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogdmlld3BvcnRCb3VuZHMueCArICh2aWV3cG9ydEJvdW5kcy53aWR0aCAtIHRvcFJpZ2h0LnJpZ2h0KSxcbiAgICAgICAgeTogdmlld3BvcnRCb3VuZHMueSArIHRvcFJpZ2h0LnRvcCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGJvdHRvbUxlZnQgPSBvcmlnaW4gYXMgQm90dG9tTGVmdFBvaW50O1xuICAgIGlmIChib3R0b21MZWZ0LmJvdHRvbSAhPT0gdW5kZWZpbmVkICYmIGJvdHRvbUxlZnQubGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB2aWV3cG9ydEJvdW5kcy54ICsgYm90dG9tTGVmdC5sZWZ0LFxuICAgICAgICB5OiB2aWV3cG9ydEJvdW5kcy55ICsgKHZpZXdwb3J0Qm91bmRzLmhlaWdodCAtIGJvdHRvbUxlZnQuYm90dG9tKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gb3JpZ2luIGFzIEJvdHRvbVJpZ2h0UG9pbnQ7XG4gICAgaWYgKGJvdHRvbVJpZ2h0LmJvdHRvbSAhPT0gdW5kZWZpbmVkICYmIGJvdHRvbVJpZ2h0LnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHZpZXdwb3J0Qm91bmRzLnggKyAodmlld3BvcnRCb3VuZHMud2lkdGggLSBib3R0b21SaWdodC5yaWdodCksXG4gICAgICAgIHk6IHZpZXdwb3J0Qm91bmRzLnkgKyAodmlld3BvcnRCb3VuZHMuaGVpZ2h0IC0gYm90dG9tUmlnaHQuYm90dG9tKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IEVycm9yKCdbUG9wdXBPcmlnaW5FcnJvcl0gSWxsZWdhbCBwb3B1cCBvcmlnaW47IG11c3QgYmUgXCJQb2ludFwiLCBcIlRvcExlZnRQb2ludFwiLCBcIlRvcFJpZ2h0UG9pbnRcIiwgXCJCb3R0b21MZWZ0UG9pbnRcIiBvciBcIkJvdHRvbVJpZ2h0UG9pbnRcIi4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc051bGxDbGllbnRSZWN0KGNsaWVudFJlY3Q6IERPTVJlY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNsaWVudFJlY3QudG9wID09PSAwICYmIGNsaWVudFJlY3QucmlnaHQgPT09IDAgJiYgY2xpZW50UmVjdC5ib3R0b20gPT09IDAgJiYgY2xpZW50UmVjdC5sZWZ0ID09PSAwO1xufVxuXG5mdW5jdGlvbiBzdGFydFdpdGhOdWxsQm91bmRzSWYoY29uZGl0aW9uOiAoKSA9PiBib29sZWFuKTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFZpZXdwb3J0Qm91bmRzPiB7XG4gIHJldHVybiBjb25kaXRpb24oKSA/IHN0YXJ0V2l0aCh7eDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMH0pIDogaWRlbnRpdHk7XG59XG5cbmludGVyZmFjZSBWaWV3cG9ydEJvdW5kcyB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cbiJdfQ==
|
|
337
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3BvcHVwL3BvcHVwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsMEJBQTBCLEVBQUUsUUFBUSxFQUFFLHlCQUF5QixFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBVSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbk8sT0FBTyxFQUFvQixPQUFPLEVBQUUsYUFBYSxFQUFhLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsS0FBSyxFQUFlLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBQyxZQUFZLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUMsTUFBTSwwQkFB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QUMsTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDO0lBQ3pGLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUM1QixPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxDQUFzQixFQUFFLENBQXNCO0lBQ3BFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ3RHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7YXNzZXJ0Tm90SW5SZWFjdGl2ZUNvbnRleHQsIGNvbXB1dGVkLCBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIEVudmlyb25tZW50SW5qZWN0b3IsIGluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSwgcnVuSW5JbmplY3Rpb25Db250ZXh0LCBTaWduYWwsIHVudHJhY2tlZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Nvbm5lY3RlZFBvc2l0aW9uLCBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge2ZpcnN0VmFsdWVGcm9tLCBmcm9tRXZlbnR9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Q29tcG9uZW50UG9ydGFsfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7UG9wdXAsIFBvcHVwQ29uZmlnLCDJtVBvcHVwfSBmcm9tICcuL3BvcHVwLmNvbmZpZyc7XG5pbXBvcnQge0ZvY3VzTW9uaXRvciwgRm9jdXNPcmlnaW59IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7T2JzZXJ2YWJsZXN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfVklFV19SRUdJU1RSWX0gZnJvbSAnLi4vdmlldy93b3JrYmVuY2gtdmlldy5yZWdpc3RyeSc7XG5pbXBvcnQge2Zyb21SZXNpemUkfSBmcm9tICdAc2Npb24vdG9vbGtpdC9vYnNlcnZhYmxlJztcbmltcG9ydCB7UG9wdXBDb21wb25lbnR9IGZyb20gJy4vcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge29ic2VydmVJbiwgc3Vic2NyaWJlSW59IGZyb20gJ0BzY2lvbi90b29sa2l0L29wZXJhdG9ycyc7XG5pbXBvcnQge8m1V29ya2JlbmNoVmlld30gZnJvbSAnLi4vdmlldy/JtXdvcmtiZW5jaC12aWV3Lm1vZGVsJztcbmltcG9ydCB7Qm90dG9tTGVmdFBvaW50LCBCb3R0b21SaWdodFBvaW50LCBQb2ludCwgUG9wdXBPcmlnaW4sIFRvcExlZnRQb2ludCwgVG9wUmlnaHRQb2ludH0gZnJvbSAnLi9wb3B1cC5vcmlnaW4nO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSwgdG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7cHJvdmlkZVZpZXdDb250ZXh0fSBmcm9tICcuLi92aWV3L3ZpZXctY29udGV4dC1wcm92aWRlcic7XG5pbXBvcnQge1VVSUR9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V1aWQnO1xuaW1wb3J0IHtib3VuZGluZ0NsaWVudFJlY3R9IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL2RpbWVuc2lvbic7XG5pbXBvcnQge2NvZXJjZUVsZW1lbnR9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge2NsYW1wfSBmcm9tICcuLi9jb21tb24vbWF0aC51dGlsJztcblxuY29uc3QgTk9SVEg6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScsIHBhbmVsQ2xhc3M6ICd3Yi1ub3J0aCd9O1xuY29uc3QgU09VVEg6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ3RvcCcsIHBhbmVsQ2xhc3M6ICd3Yi1zb3V0aCd9O1xuY29uc3QgV0VTVDogQ29ubmVjdGVkUG9zaXRpb24gPSB7b3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInLCBwYW5lbENsYXNzOiAnd2Itd2VzdCd9O1xuY29uc3QgRUFTVDogQ29ubmVjdGVkUG9zaXRpb24gPSB7b3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInLCBwYW5lbENsYXNzOiAnd2ItZWFzdCd9O1xuXG4vKipcbiAqIEFsbG93cyBkaXNwbGF5aW5nIGEgY29tcG9uZW50IGluIGEgd29ya2JlbmNoIHBvcHVwLlxuICpcbiAqIEEgcG9wdXAgaXMgYSB2aXN1YWwgd29ya2JlbmNoIGNvbXBvbmVudCBmb3IgZGlzcGxheWluZyBjb250ZW50IGFib3ZlIG90aGVyIGNvbnRlbnQuIEl0IGlzIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8gYW4gYW5jaG9yLFxuICogd2hpY2ggY2FuIGJlIGVpdGhlciBhIGNvb3JkaW5hdGUgb3IgYW4gSFRNTCBlbGVtZW50LiBUaGUgcG9wdXAgbW92ZXMgd2hlbiB0aGUgYW5jaG9yIG1vdmVzLlxuICpcbiAqIFVubGlrZSB2aWV3cywgcG9wdXBzIGFyZSBub3QgcGFydCBvZiB0aGUgcGVyc2lzdGVudCBXb3JrYmVuY2ggbmF2aWdhdGlvbiwgbWVhbmluZyB0aGF0IHBvcHVwcyBkbyBub3Qgc3Vydml2ZSBhIHBhZ2UgcmVsb2FkLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBQb3B1cFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Vudmlyb25tZW50SW5qZWN0b3IgPSBpbmplY3QoRW52aXJvbm1lbnRJbmplY3Rvcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX292ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZvY3VzTWFuYWdlciA9IGluamVjdChGb2N1c01vbml0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3UmVnaXN0cnkgPSBpbmplY3QoV09SS0JFTkNIX1ZJRVdfUkVHSVNUUlkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmlldyA9IGluamVjdCjJtVdvcmtiZW5jaFZpZXcsIHtvcHRpb25hbDogdHJ1ZX0pO1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBpbiBhIHBvcHVwLlxuICAgKlxuICAgKiBUbyBwb3NpdGlvbiB0aGUgcG9wdXAsIHByb3ZpZGUgZWl0aGVyIGEgY29vcmRpbmF0ZSBvciBhbiBlbGVtZW50IHRvIHNlcnZlIGFzIHRoZSBwb3B1cCBhbmNob3IuXG4gICAqXG4gICAqIElmIHlvdSB1c2UgYW4gZWxlbWVudCBhcyB0aGUgcG9wdXAgYW5jaG9yLCB0aGUgcG9wdXAgYWxzbyBtb3ZlcyB3aGVuIHRoZSBhbmNob3IgZWxlbWVudCBtb3Zlcy4gSWYgeW91IHVzZSBhIGNvb3JkaW5hdGVcbiAgICogYW5kIG9wZW4gdGhlIHBvcHVwIGluIHRoZSBjb250ZXh0IG9mIGEgdmlldywgdGhlIHBvcHVwIG9wZW5zIHJlbGF0aXZlIHRvIHRoZSBib3VuZHMgb2YgdGhhdCB2aWV3LiBPdGhlcndpc2UsIGl0XG4gICAqIGlzIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8gdGhlIHBhZ2Ugdmlld3BvcnQuIElmIHlvdSBtb3ZlIG9yIHJlc2l6ZSB0aGUgdmlldyBvciB0aGUgcGFnZSwgdGhlIHBvcHVwIHdpbGwgYWxzbyBiZSBtb3ZlZFxuICAgKiBkZXBlbmRpbmcgb24gdGhlIHBhaXIgb2YgY29vcmRpbmF0ZXMgdXNlZC5cbiAgICpcbiAgICogQnkgc2V0dGluZyB0aGUgYWxpZ25tZW50IG9mIHRoZSBwb3B1cCwgeW91IGNhbiBjb250cm9sIHRoZSByZWdpb24gd2hlcmUgdG8gb3BlbiB0aGUgcG9wdXAgcmVsYXRpdmUgdG8gaXRzIGFuY2hvci5cbiAgICpcbiAgICogT3B0aW9uYWxseSwgeW91IGNhbiBwYXNzIGRhdGEgdG8gdGhlIHBvcHVwIGNvbXBvbmVudC4gVGhlIGNvbXBvbmVudCBjYW4gaW5qZWN0IHRoZSBwb3B1cCBoYW5kbGUge0BsaW5rIFBvcHVwfSB0b1xuICAgKiByZWFkIGlucHV0IGRhdGEgb3IgdG8gY2xvc2UgdGhlIHBvcHVwLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgcG9wdXAgd2lsbCBjbG9zZSBvbiBmb2N1cyBsb3NzLCBvciB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlIGVzY2FwZSBrZXkuXG4gICAqXG4gICAqIElmIG9wZW5pbmcgdGhlIHBvcHVwIGluIHRoZSBjb250ZXh0IG9mIGEgdmlldywgdGhlIHBvcHVwIGlzIGJvdW5kIHRvIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZpZXcsIHRoYXQgaXMsIHRoZSBwb3B1cFxuICAgKiBpcyBkaXNwbGF5ZWQgb25seSBpZiB0aGUgdmlldyBpcyBhY3RpdmUgYW5kIGlzIGNsb3NlZCB3aGVuIHRoZSB2aWV3IGlzIGNsb3NlZC5cbiAgICpcbiAgICogQHBhcmFtICAgY29uZmlnIC0gQ29udHJvbHMgcG9wdXAgYmVoYXZpb3JcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQ6XG4gICAqICAgICAgICAgIC0gcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBpZiBjbG9zZWQgd2l0aCBhIHJlc3VsdFxuICAgKiAgICAgICAgICAtIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGlmIGNsb3NlZCB3aXRob3V0IGEgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb3BlbjxSPihjb25maWc6IFBvcHVwQ29uZmlnKTogUHJvbWlzZTxSIHwgdW5kZWZpbmVkPiB7XG4gICAgYXNzZXJ0Tm90SW5SZWFjdGl2ZUNvbnRleHQodGhpcy5vcGVuLCAnQ2FsbCBXb3JrYmVuY2hQb3B1cFNlcnZpY2Uub3BlbigpIGluIGEgbm9uLXJlYWN0aXZlIChub24tdHJhY2tpbmcpIGNvbnRleHQsIHN1Y2ggYXMgd2l0aGluIHRoZSB1bnRyYWNrZWQoKSBmdW5jdGlvbi4nKTtcblxuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lIHRvIGRpc3BsYXkgdGhlIHBvcHVwIGV2ZW4gd2hlbiBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLm9wZW4oY29uZmlnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxpZ24gPSBjb25maWcuYWxpZ24gfHwgJ25vcnRoJztcbiAgICBjb25zdCBjb250ZXh0dWFsVmlldyA9IHRoaXMucmVzb2x2ZUNvbnRleHR1YWxWaWV3KGNvbmZpZyk7XG4gICAgY29uc3QgcG9wdXAgPSB0aGlzLmNyZWF0ZVBvcHVwKGNvbmZpZywge3ZpZXc6IGNvbnRleHR1YWxWaWV3fSk7XG4gICAgY29uc3QgcG9wdXBEZXN0cm95UmVmID0gcG9wdXAuaW5qZWN0b3IuZ2V0KERlc3Ryb3lSZWYpO1xuICAgIGNvbnN0IHBvcHVwT3JpZ2luID0gdGhpcy50cmFja1BvcHVwT3JpZ2luKGNvbmZpZywgY29udGV4dHVhbFZpZXcsIHBvcHVwLmluamVjdG9yKTtcblxuICAgIC8vIFdhaXQgZm9yIHRoZSBpbml0aWFsIHBvc2l0aW9uLlxuICAgIGNvbnN0IGluaXRpYWxQb3NpdGlvbiA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRvT2JzZXJ2YWJsZShwb3B1cE9yaWdpbiwge2luamVjdG9yOiBwb3B1cC5pbmplY3Rvcn0pLnBpcGUoZmlsdGVyKEJvb2xlYW4pKSk7XG5cbiAgICBjb25zdCBvdmVybGF5UG9zaXRpb25TdHJhdGVneSA9IHRoaXMuX292ZXJsYXkucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8oaW5pdGlhbFBvc2l0aW9uKVxuICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoZmFsc2UpXG4gICAgICAud2l0aExvY2tlZFBvc2l0aW9uKGZhbHNlKSAvLyBJZiBsb2NrZWQsIHRoZSBwb3B1cCB3b24ndCBhdHRlbXB0IHRvIHJlcG9zaXRpb24gaXRzZWxmIGlmIG5vdCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlLlxuICAgICAgLndpdGhQb3NpdGlvbnMoKCgpOiBDb25uZWN0ZWRQb3NpdGlvbltdID0+IHtcbiAgICAgICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgICAgIGNhc2UgJ25vcnRoJzpcbiAgICAgICAgICAgIHJldHVybiBbTk9SVEgsIFNPVVRILCBXRVNULCBFQVNUXTtcbiAgICAgICAgICBjYXNlICdzb3V0aCc6XG4gICAgICAgICAgICByZXR1cm4gW1NPVVRILCBOT1JUSCwgV0VTVCwgRUFTVF07XG4gICAgICAgICAgY2FzZSAnd2VzdCc6XG4gICAgICAgICAgICByZXR1cm4gW1dFU1QsIEVBU1QsIE5PUlRILCBTT1VUSF07XG4gICAgICAgICAgY2FzZSAnZWFzdCc6XG4gICAgICAgICAgICByZXR1cm4gW0VBU1QsIFdFU1QsIE5PUlRILCBTT1VUSF07XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbUG9wdXBQb3NpdGlvbkVycm9yXSBJbGxlZ2FsIHBvc2l0aW9uOyBtdXN0IGJlIG5vcnRoLCBzb3V0aCwgd2VzdCBvciBlYXN0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pKCkpO1xuXG4gICAgLy8gQ29uZmlndXJlIHRoZSBwb3B1cCBvdmVybGF5LlxuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwYW5lbENsYXNzOiAnd2ItcG9wdXAnLFxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgcG9zaXRpb25TdHJhdGVneTogb3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIHBvcHVwIGNvbXBvbmVudCBhbmQgYXR0YWNoIGl0IHRvIHRoZSBET00uXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuICAgIGNvbnN0IHBvcHVwUG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChQb3B1cENvbXBvbmVudCwgbnVsbCwgSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogY29uZmlnLmNvbXBvbmVudENvbnN0cnVjdE9wdGlvbnM/LmluamVjdG9yIHx8IHRoaXMuX2Vudmlyb25tZW50SW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge3Byb3ZpZGU6IMm1UG9wdXAsIHVzZVZhbHVlOiBwb3B1cH0sXG4gICAgICAgIHtwcm92aWRlOiBQb3B1cCwgdXNlRXhpc3Rpbmc6IMm1UG9wdXB9LFxuICAgICAgICBwcm92aWRlVmlld0NvbnRleHQoY29udGV4dHVhbFZpZXcpLFxuICAgICAgICAuLi5bY29uZmlnLmNvbXBvbmVudENvbnN0cnVjdE9wdGlvbnM/LnByb3ZpZGVycyB8fCBbXV0sXG4gICAgICBdLFxuICAgIH0pKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBvdmVybGF5UmVmLmF0dGFjaChwb3B1cFBvcnRhbCk7XG4gICAgY29uc3QgcG9wdXBFbGVtZW50OiBIVE1MRWxlbWVudCA9IGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gTWFrZSB0aGUgcG9wdXAgZm9jdXNhYmxlIGFuZCByZXF1ZXN0IHRoZSBmb2N1cy5cbiAgICBwb3B1cEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgIHRoaXMuX2ZvY3VzTWFuYWdlci5mb2N1c1ZpYShwb3B1cEVsZW1lbnQsICdwcm9ncmFtJyk7IC8vIFRvIG5vdCBjbG9zZSB0aGUgcG9wdXAgaW1tZWRpYXRlbHkgd2hlbiBpdCBvcGVucywgaWYgdXNpbmcgdGhlICdvbkZvY3VzTG9zdCcgc3RyYXRlZ3kuXG5cbiAgICAvLyBSZXBvc2l0aW9uIHBvcHVwIHdoZW4gdGhlIGFuY2hvciBpcyBtb3ZlZC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luID0gcG9wdXBPcmlnaW4oKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmIChvcmlnaW4pIHtcbiAgICAgICAgICBvdmVybGF5UG9zaXRpb25TdHJhdGVneS5zZXRPcmlnaW4ob3JpZ2luKTtcbiAgICAgICAgICBvdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIHtpbmplY3RvcjogcG9wdXAuaW5qZWN0b3J9KTtcblxuICAgIC8vIFJlcG9zaXRpb24gcG9wdXAgd2hlbiByZXNpemVkLlxuICAgIGZyb21SZXNpemUkKG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQpXG4gICAgICAucGlwZShcbiAgICAgICAgb2JzZXJ2ZUluKGZuID0+IHRoaXMuX3pvbmUucnVuKGZuKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZChwb3B1cERlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIG92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gQ2xvc2UgdGhlIHBvcHVwIGRlcGVuZGluZyBvbiB0aGUgcGFzc2VkIGNvbmZpZy5cbiAgICB0aGlzLmluc3RhbGxQb3B1cENsb3Nlcihjb25maWcsIHBvcHVwRWxlbWVudCwgcG9wdXAsIGNvbnRleHR1YWxWaWV3KTtcblxuICAgIC8vIEhpZGUgdGhlIHBvcHVwIHdoZW4gZGV0YWNoaW5nIHRoZSBjb250ZXh0dWFsIHZpZXcsIGlmIGFueS5cbiAgICBpZiAoY29udGV4dHVhbFZpZXcpIHtcbiAgICAgIHRoaXMuaGlkZVBvcHVwT25WaWV3RGV0YWNoKG92ZXJsYXlSZWYsIGNvbnRleHR1YWxWaWV3LCBwb3B1cCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcG9zZSB0aGUgcG9wdXAgd2hlbiBjbG9zaW5nIGl0LlxuICAgIHBvcHVwRGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgb3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8UiB8IHVuZGVmaW5lZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcG9wdXBEZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICAgIHBvcHVwLnJlc3VsdCBpbnN0YW5jZW9mIEVycm9yID8gcmVqZWN0KHBvcHVwLnJlc3VsdCkgOiByZXNvbHZlKHBvcHVwLnJlc3VsdCBhcyBSKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHBvcHVwIGhhbmRsZS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUG9wdXA8Uj4oY29uZmlnOiBQb3B1cENvbmZpZywgY29udGV4dDoge3ZpZXc6IMm1V29ya2JlbmNoVmlldyB8IG51bGx9KTogybVQb3B1cDxSPiB7XG4gICAgLy8gQ29uc3RydWN0IHRoZSBoYW5kbGUgaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQgdGhhdCBzaGFyZXMgdGhlIHBvcHVwJ3MgbGlmZWN5Y2xlLCBhbGxvd2luZyBmb3IgYXV0b21hdGljIGNsZWFudXAgb2YgZWZmZWN0cyBhbmQgUnhKUyBpbnRlcm9wIGZ1bmN0aW9ucy5cbiAgICBjb25zdCBwb3B1cElkID0gY29uZmlnLmlkID8/IFVVSUQucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHBvcHVwRW52aXJvbm1lbnRJbmplY3RvciA9IGNyZWF0ZUVudmlyb25tZW50SW5qZWN0b3IoW3Byb3ZpZGVWaWV3Q29udGV4dChjb250ZXh0LnZpZXcpXSwgdGhpcy5fZW52aXJvbm1lbnRJbmplY3RvciwgYFdvcmtiZW5jaCBQb3B1cCAke3BvcHVwSWR9YCk7XG4gICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dChwb3B1cEVudmlyb25tZW50SW5qZWN0b3IsICgpID0+IG5ldyDJtVBvcHVwPFI+KHBvcHVwSWQsIGNvbmZpZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgcG9wdXAgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmVkIHBvcHVwIGNsb3Npbmcgc3RyYXRlZ3kuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxQb3B1cENsb3Nlcihjb25maWc6IFBvcHVwQ29uZmlnLCBwb3B1cEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3B1cDogybVQb3B1cCwgY29udGV4dHVhbFZpZXc6IMm1V29ya2JlbmNoVmlldyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwb3B1cERlc3Ryb3lSZWYgPSBwb3B1cC5pbmplY3Rvci5nZXQoRGVzdHJveVJlZik7XG5cbiAgICAvLyBDbG9zZSB0aGUgcG9wdXAgb24gZXNjYXBlIGtleXN0cm9rZS5cbiAgICBpZiAoY29uZmlnLmNsb3NlU3RyYXRlZ3k/Lm9uRXNjYXBlID8/IHRydWUpIHtcbiAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihwb3B1cEVsZW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3Vic2NyaWJlSW4oZm4gPT4gdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmbikpLFxuICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpLFxuICAgICAgICAgIG9ic2VydmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bihmbikpLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZChwb3B1cERlc3Ryb3lSZWYpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gcG9wdXAuY2xvc2UoKSk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIHBvcHVwIG9uIGZvY3VzIGxvc3MuXG4gICAgaWYgKGNvbmZpZy5jbG9zZVN0cmF0ZWd5Py5vbkZvY3VzTG9zdCA/PyB0cnVlKSB7XG4gICAgICB0aGlzLl9mb2N1c01hbmFnZXIubW9uaXRvcihwb3B1cEVsZW1lbnQsIHRydWUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoZm9jdXNPcmlnaW46IEZvY3VzT3JpZ2luKSA9PiAhZm9jdXNPcmlnaW4pLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZChwb3B1cERlc3Ryb3lSZWYpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gcG9wdXAuY2xvc2UocG9wdXAucmVzdWx0KSk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIHBvcHVwIHdoZW4gY2xvc2luZyB0aGUgdmlldy5cbiAgICBpZiAoY29udGV4dHVhbFZpZXcpIHtcbiAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fdmlld1JlZ2lzdHJ5Lm9iamVjdHMoKS5zb21lKHZpZXcgPT4gdmlldy5pZCA9PT0gY29udGV4dHVhbFZpZXcuaWQpKSB7XG4gICAgICAgICAgdW50cmFja2VkKCgpID0+IHBvcHVwLmNsb3NlKCkpO1xuICAgICAgICB9XG4gICAgICB9LCB7aW5qZWN0b3I6IHBvcHVwLmluamVjdG9yfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBwb3B1cCB3aGVuIGl0cyBjb250ZXh0dWFsIHZpZXcgaXMgZGV0YWNoZWQsIGFuZCBkaXNwbGF5cyBpdCB3aGVuIGl0IGlzIHJlYXR0YWNoZWQuIEFsc28gcmVzdG9yZXMgdGhlIGZvY3VzIG9uIHJlLWFjdGl2YXRpb24uXG4gICAqIFRoZSBjb250ZXh0dWFsIHZpZXcgaXMgZGV0YWNoZWQgaWYgbm90IGFjdGl2ZSwgb3IgbG9jYXRlZCBpbiB0aGUgcGVyaXBoZXJhbCBhcmVhIGFuZCB0aGUgbWFpbiBhcmVhIGlzIG1heGltaXplZC5cbiAgICovXG4gIHByaXZhdGUgaGlkZVBvcHVwT25WaWV3RGV0YWNoKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsIGNvbnRleHR1YWxWaWV3OiDJtVdvcmtiZW5jaFZpZXcsIHBvcHVwOiDJtVBvcHVwKTogdm9pZCB7XG4gICAgb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd3Yi12aWV3LWNvbnRleHQnKTtcblxuICAgIGNvbnN0IHBvcHVwRGVzdHJveVJlZiA9IHBvcHVwLmluamVjdG9yLmdldChEZXN0cm95UmVmKTtcbiAgICBsZXQgYWN0aXZlRWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgYXR0YWNoZWQgPSBjb250ZXh0dWFsVmlldy5wb3J0YWwuYXR0YWNoZWQoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmIChhdHRhY2hlZCkge1xuICAgICAgICAgIG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnd2Itdmlldy1hdHRhY2hlZCcpO1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd3Yi12aWV3LWF0dGFjaGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIHtpbmplY3RvcjogcG9wdXAuaW5qZWN0b3J9KTtcblxuICAgIC8vIFRyYWNrIHRoZSBmb2N1cyBpbiB0aGUgcG9wdXAgdG8gcmVzdG9yZSBpdCB3aGVuIGF0dGFjaGluZyB0aGUgcG9wdXAuXG4gICAgZnJvbUV2ZW50KG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQsICdmb2N1c2luJylcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZChwb3B1cERlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyB0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50IDogdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNpZ25hbCB0aGF0IHRyYWNrcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBvcHVwIGFuY2hvci5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tQb3B1cE9yaWdpbihjb25maWc6IFBvcHVwQ29uZmlnLCBjb250ZXh0dWFsVmlldzogybVXb3JrYmVuY2hWaWV3IHwgbnVsbCwgaW5qZWN0b3I6IEluamVjdG9yKTogU2lnbmFsPERPTVJlY3QgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBob3N0Qm91bmRzID0gYm91bmRpbmdDbGllbnRSZWN0KGNvbnRleHR1YWxWaWV3Py5wb3J0YWwuY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQgPz8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7aW5qZWN0b3J9KTtcblxuICAgIGlmIChjb25maWcuYW5jaG9yIGluc3RhbmNlb2YgRWxlbWVudCB8fCBjb25maWcuYW5jaG9yIGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuICAgICAgY29uc3QgYW5jaG9yID0gY29lcmNlRWxlbWVudChjb25maWcuYW5jaG9yKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGFuY2hvckJvdW5kcyA9IGJvdW5kaW5nQ2xpZW50UmVjdChhbmNob3IsIHtpbmplY3Rvcn0pO1xuICAgICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgLy8gTWFpbnRhaW4gcG9zaXRpb24gYW5kIHNpemUgd2hlbiBkZXRhY2hlZCB0byBwcmV2ZW50IGZsaWNrZXJpbmcgd2hlbiBhdHRhY2hlZCBhZ2FpbiBhbmQgdG8gc3VwcG9ydCBmb3IgdmlydHVhbCBzY3JvbGxpbmcgaW4gcG9wdXAgY29udGVudC5cbiAgICAgICAgaWYgKGNvbnRleHR1YWxWaWV3ICYmICFjb250ZXh0dWFsVmlldy5wb3J0YWwuYXR0YWNoZWQoKSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJTVBPUlRBTlQ6IFRyYWNrIGFuY2hvciBhbmQgaG9zdCBib3VuZHMgb25seSBpZiBhdHRhY2hlZCB0byBwcmV2ZW50IGZsaWNrZXJpbmcuXG5cbiAgICAgICAgLy8gVGhlIGBib3VuZGluZ0NsaWVudFJlY3RgIHNpZ25hbCBkb2VzIG5vdCBkZXRlY3QgcG9zaXRpb24gY2hhbmdlcyB3aGVuIHRoZSBlbGVtZW50IGlzIHNjcm9sbGVkIG91dCBvZiB2aWV3LlxuICAgICAgICAvLyBDb25zZXF1ZW50bHksIGlmIHRoZSBwb3B1cCBhbmNob3IgaXMgc2Nyb2xsZWQgb3V0IG9mIHZpZXcgYW5kIHRoZSB2aWV3IGlzIGVubGFyZ2VkLCB0aGUgcG9wdXAgbWF5IG5vdCBhbGlnblxuICAgICAgICAvLyB3aXRoIHRoZSB2aWV3IGJvdW5kYXJpZXMuIFRoZXJlZm9yZSwgd2UgcmVhZCB0aGUgYW5jaG9yJ3MgYm91bmRpbmcgYm94IGRpcmVjdGx5IGZyb20gdGhlIERPTS5cbiAgICAgICAgYW5jaG9yQm91bmRzKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnN0cmFpbkNsaWVudFJlY3QoYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBob3N0Qm91bmRzKCkpO1xuICAgICAgfSwge2VxdWFsOiBpc0VxdWFsRG9tUmVjdH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IGFuY2hvckJvdW5kcyA9IHRvU2lnbmFsKE9ic2VydmFibGVzLmNvZXJjZShjb25maWcuYW5jaG9yKSwge2luamVjdG9yfSk7XG4gICAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAvLyBNYWludGFpbiBwb3NpdGlvbiBhbmQgc2l6ZSB3aGVuIGRldGFjaGVkIHRvIHByZXZlbnQgZmxpY2tlcmluZyB3aGVuIGF0dGFjaGVkIGFnYWluIGFuZCB0byBzdXBwb3J0IGZvciB2aXJ0dWFsIHNjcm9sbGluZyBpbiBwb3B1cCBjb250ZW50LlxuICAgICAgICBpZiAoY29udGV4dHVhbFZpZXcgJiYgIWNvbnRleHR1YWxWaWV3LnBvcnRhbC5hdHRhY2hlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElNUE9SVEFOVDogVHJhY2sgYW5jaG9yIGFuZCBob3N0IGJvdW5kcyBvbmx5IGlmIGF0dGFjaGVkIHRvIHByZXZlbnQgZmxpY2tlcmluZy5cbiAgICAgICAgaWYgKCFhbmNob3JCb3VuZHMoKSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7eCwgeX0gPSBtYXBUb1BhZ2VDb29yZGluYXRlcyhhbmNob3JCb3VuZHMoKSEsIGhvc3RCb3VuZHMoKSk7XG4gICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGFuY2hvckJvdW5kcygpITtcbiAgICAgICAgcmV0dXJuIGNvbnN0cmFpbkNsaWVudFJlY3QobmV3IERPTVJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCksIGhvc3RCb3VuZHMoKSk7XG4gICAgICB9LCB7ZXF1YWw6IGlzRXF1YWxEb21SZWN0fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBjb250ZXh0dWFsIHZpZXcgdG8gd2hpY2ggdGhlIHBvcHVwIGlzIGJvdW5kLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlQ29udGV4dHVhbFZpZXcoY29uZmlnOiBQb3B1cENvbmZpZyk6IMm1V29ya2JlbmNoVmlldyB8IG51bGwge1xuICAgIGlmIChjb25maWcuY29udGV4dD8udmlld0lkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdmlld1JlZ2lzdHJ5LmdldChjb25maWcuY29udGV4dC52aWV3SWQpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmNvbnRleHQ/LnZpZXdJZCA9PT0gdW5kZWZpbmVkKSB7IC8vIGBudWxsYCBtZWFucyB0byBvcGVuIHRoZSBwb3B1cCBvdXRzaWRlIHRoZSBjb250ZXh0dWFsIHZpZXdcbiAgICAgIHJldHVybiB0aGlzLl92aWV3ID8/IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogTWFwcyBnaXZlbiB2aWV3IGNvb3JkaW5hdGVzIHRvIGFic29sdXRlIHBhZ2UgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvUGFnZUNvb3JkaW5hdGVzKG9yaWdpbjogUG9wdXBPcmlnaW4sIHJlbGF0aXZlVG86IERPTVJlY3QpOiBQb2ludCB7XG4gIGNvbnN0IHh5ID0gb3JpZ2luIGFzIFBvaW50O1xuICBpZiAoeHkueCAhPT0gdW5kZWZpbmVkICYmIHh5LnkgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiByZWxhdGl2ZVRvLnggKyB4eS54LFxuICAgICAgeTogcmVsYXRpdmVUby55ICsgeHkueSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHRvcExlZnQgPSBvcmlnaW4gYXMgVG9wTGVmdFBvaW50O1xuICBpZiAodG9wTGVmdC50b3AgIT09IHVuZGVmaW5lZCAmJiB0b3BMZWZ0LmxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiByZWxhdGl2ZVRvLnggKyB0b3BMZWZ0LmxlZnQsXG4gICAgICB5OiByZWxhdGl2ZVRvLnkgKyB0b3BMZWZ0LnRvcCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHRvcFJpZ2h0ID0gb3JpZ2luIGFzIFRvcFJpZ2h0UG9pbnQ7XG4gIGlmICh0b3BSaWdodC50b3AgIT09IHVuZGVmaW5lZCAmJiB0b3BSaWdodC5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHJlbGF0aXZlVG8ueCArIChyZWxhdGl2ZVRvLndpZHRoIC0gdG9wUmlnaHQucmlnaHQpLFxuICAgICAgeTogcmVsYXRpdmVUby55ICsgdG9wUmlnaHQudG9wLFxuICAgIH07XG4gIH1cbiAgY29uc3QgYm90dG9tTGVmdCA9IG9yaWdpbiBhcyBCb3R0b21MZWZ0UG9pbnQ7XG4gIGlmIChib3R0b21MZWZ0LmJvdHRvbSAhPT0gdW5kZWZpbmVkICYmIGJvdHRvbUxlZnQubGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHJlbGF0aXZlVG8ueCArIGJvdHRvbUxlZnQubGVmdCxcbiAgICAgIHk6IHJlbGF0aXZlVG8ueSArIChyZWxhdGl2ZVRvLmhlaWdodCAtIGJvdHRvbUxlZnQuYm90dG9tKSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IGJvdHRvbVJpZ2h0ID0gb3JpZ2luIGFzIEJvdHRvbVJpZ2h0UG9pbnQ7XG4gIGlmIChib3R0b21SaWdodC5ib3R0b20gIT09IHVuZGVmaW5lZCAmJiBib3R0b21SaWdodC5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHJlbGF0aXZlVG8ueCArIChyZWxhdGl2ZVRvLndpZHRoIC0gYm90dG9tUmlnaHQucmlnaHQpLFxuICAgICAgeTogcmVsYXRpdmVUby55ICsgKHJlbGF0aXZlVG8uaGVpZ2h0IC0gYm90dG9tUmlnaHQuYm90dG9tKSxcbiAgICB9O1xuICB9XG4gIHRocm93IEVycm9yKCdbUG9wdXBPcmlnaW5FcnJvcl0gSWxsZWdhbCBwb3B1cCBvcmlnaW47IG11c3QgYmUgXCJQb2ludFwiLCBcIlRvcExlZnRQb2ludFwiLCBcIlRvcFJpZ2h0UG9pbnRcIiwgXCJCb3R0b21MZWZ0UG9pbnRcIiBvciBcIkJvdHRvbVJpZ2h0UG9pbnRcIi4nKTtcbn1cblxuZnVuY3Rpb24gY29uc3RyYWluQ2xpZW50UmVjdChjbGllbnRSZWN0OiBET01SZWN0LCBjb25zdHJhaW50czogRE9NUmVjdCk6IERPTVJlY3Qge1xuICBjb25zdCB0b3AgPSBjbGFtcChjbGllbnRSZWN0LnRvcCwge21pbjogY29uc3RyYWludHMudG9wLCBtYXg6IGNvbnN0cmFpbnRzLmJvdHRvbX0pO1xuICBjb25zdCByaWdodCA9IGNsYW1wKGNsaWVudFJlY3QucmlnaHQsIHttaW46IGNvbnN0cmFpbnRzLmxlZnQsIG1heDogY29uc3RyYWludHMucmlnaHR9KTtcbiAgY29uc3QgYm90dG9tID0gY2xhbXAoY2xpZW50UmVjdC5ib3R0b20sIHttaW46IGNvbnN0cmFpbnRzLnRvcCwgbWF4OiBjb25zdHJhaW50cy5ib3R0b219KTtcbiAgY29uc3QgbGVmdCA9IGNsYW1wKGNsaWVudFJlY3QubGVmdCwge21pbjogY29uc3RyYWludHMubGVmdCwgbWF4OiBjb25zdHJhaW50cy5yaWdodH0pO1xuICBjb25zdCB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICByZXR1cm4gbmV3IERPTVJlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gaXNFcXVhbERvbVJlY3QoYTogRE9NUmVjdCB8IHVuZGVmaW5lZCwgYjogRE9NUmVjdCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gYT8udG9wID09PSBiPy50b3AgJiYgYT8ucmlnaHQgPT09IGI/LnJpZ2h0ICYmIGE/LmJvdHRvbSA9PT0gYj8uYm90dG9tICYmIGE/LmxlZnQgPT09IGI/LmxlZnQ7XG59XG4iXX0=
|