@scion/workbench 18.0.0-beta.3 → 18.0.0-beta.5
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/esm2022/lib/common/class-list.mjs +67 -29
- package/esm2022/lib/common/operators.mjs +1 -12
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +3 -8
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +22 -20
- package/esm2022/lib/dialog/workbench-dialog.mjs +61 -1
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +71 -26
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +25 -23
- package/esm2022/lib/executor/latest-task-executor.mjs +55 -0
- package/esm2022/lib/executor/single-task-executor.mjs +7 -17
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +5 -6
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +1 -1
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +3 -3
- package/esm2022/lib/layout/stringifier.mjs +2 -2
- package/esm2022/lib/layout/workbench-layout.component.mjs +4 -5
- 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 +6 -7
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +3 -2
- package/esm2022/lib/layout//311/265workbench-layout.mjs +34 -31
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +3 -3
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +5 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +14 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +5 -5
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +3 -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 +3 -3
- 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 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +18 -16
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +13 -14
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +4 -4
- package/esm2022/lib/notification/notification-list.component.mjs +4 -8
- package/esm2022/lib/notification/notification.component.mjs +4 -5
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +3 -3
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +7 -13
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +4 -4
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +56 -75
- package/esm2022/lib/part/part-portal.pipe.mjs +8 -8
- package/esm2022/lib/part/part.component.mjs +32 -40
- 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 +27 -28
- package/esm2022/lib/part/view-list/view-list.component.mjs +41 -48
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +20 -24
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +15 -17
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +77 -88
- 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 +14 -15
- 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-perspective.model.mjs +1 -1
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +11 -43
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +27 -28
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +53 -47
- package/esm2022/lib/popup/popup.component.mjs +3 -3
- package/esm2022/lib/popup/popup.config.mjs +23 -13
- package/esm2022/lib/popup/popup.service.mjs +48 -45
- package/esm2022/lib/portal/wb-component-portal.mjs +2 -2
- package/esm2022/lib/registry/workbench-object-registry.mjs +38 -17
- package/esm2022/lib/routing/public_api.mjs +2 -1
- package/esm2022/lib/routing/routing.model.mjs +1 -1
- package/esm2022/lib/routing/routing.util.mjs +210 -0
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +19 -3
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +3 -3
- 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 +132 -144
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +3 -3
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +52 -40
- package/esm2022/lib/startup/splash/splash.component.mjs +3 -3
- package/esm2022/lib/startup/workbench-launcher.service.mjs +7 -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 +7 -7
- package/esm2022/lib/view/view-portal.pipe.mjs +7 -7
- package/esm2022/lib/view/view.component.mjs +22 -34
- 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 +136 -150
- package/esm2022/lib/view-dnd/view-drag.service.mjs +1 -1
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +18 -20
- package/esm2022/lib/workbench.component.mjs +3 -3
- package/esm2022/lib/workbench.model.mjs +1 -1
- package/esm2022/lib/workbench.service.mjs +1 -1
- package/esm2022/lib//311/265workbench.service.mjs +31 -42
- package/fesm2022/scion-workbench.mjs +2028 -1953
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/class-list.d.ts +35 -22
- package/lib/common/operators.d.ts +1 -6
- 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 +36 -17
- 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 +3 -6
- package/lib/layout/migration/model/workbench-layout-migration-v5.model.d.ts +4 -0
- package/lib/layout/workbench-layout.d.ts +9 -6
- package/lib/layout/workbench-layout.model.d.ts +2 -0
- package/lib/layout/workbench-layout.service.d.ts +4 -4
- package/lib/layout//311/265workbench-layout.d.ts +12 -13
- package/lib/layout//311/265workbench-layout.factory.d.ts +3 -2
- package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +1 -5
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.d.ts +4 -8
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +5 -8
- package/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.d.ts +3 -7
- package/lib/notification/notification-list.component.d.ts +0 -2
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +4 -1
- package/lib/part/part-action-bar/part-action.directive.d.ts +2 -2
- package/lib/part/part-bar/part-bar.component.d.ts +8 -12
- 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/view-menu.directive.d.ts +1 -1
- package/lib/part/view-context-menu/view-menu.service.d.ts +8 -12
- 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 +17 -28
- 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 +24 -17
- package/lib/perspective/workbench-perspective.model.d.ts +2 -8
- package/lib/perspective/workbench-perspective.registry.d.ts +3 -26
- package/lib/perspective/workbench-perspective.service.d.ts +8 -14
- package/lib/perspective//311/265workbench-perspective.model.d.ts +26 -21
- package/lib/popup/popup.config.d.ts +2 -0
- package/lib/popup/popup.service.d.ts +12 -14
- package/lib/registry/workbench-object-registry.d.ts +10 -6
- package/lib/routing/public_api.d.ts +2 -1
- package/lib/routing/routing.model.d.ts +25 -13
- package/lib/routing/{router.util.d.ts → routing.util.d.ts} +24 -1
- package/lib/routing/workbench-auxiliary-route-installer.service.d.ts +7 -0
- 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 -57
- package/lib/routing//311/265workbench-router.service.d.ts +10 -16
- 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-portal.pipe.d.ts +1 -3
- package/lib/view/view.component.d.ts +2 -4
- package/lib/view/workbench-view.model.d.ts +49 -35
- package/lib/view/workbench-view.registry.d.ts +3 -27
- package/lib/view//311/265workbench-view.model.d.ts +51 -61
- package/lib/view-dnd/view-drag.service.d.ts +5 -2
- package/lib/workbench.model.d.ts +6 -2
- package/lib/workbench.service.d.ts +58 -56
- package/lib//311/265workbench.service.d.ts +18 -31
- package/package.json +1 -1
- 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/part/part-action-bar/part-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/routing/router.util.mjs +0 -126
- 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/part/part-action-bar/part-action-filter.pipe.d.ts +0 -11
|
@@ -7,68 +7,69 @@
|
|
|
7
7
|
*
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
*/
|
|
10
|
-
import { BehaviorSubject, combineLatest
|
|
11
|
-
import {
|
|
10
|
+
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
11
|
+
import { ChildrenOutletContexts } from '@angular/router';
|
|
12
12
|
import { ViewDragService } from '../view-dnd/view-drag.service';
|
|
13
|
-
import {
|
|
13
|
+
import { map } from 'rxjs/operators';
|
|
14
14
|
import { filterArray, mapArray } from '@scion/toolkit/operators';
|
|
15
15
|
import { throwError } from '../common/throw-error.util';
|
|
16
16
|
import { WorkbenchPart } from '../part/workbench-part.model';
|
|
17
17
|
import { ɵWorkbenchService } from '../ɵworkbench.service';
|
|
18
18
|
import { WbComponentPortal } from '../portal/wb-component-portal';
|
|
19
|
-
import { inject } from '@angular/core';
|
|
19
|
+
import { computed, effect, EnvironmentInjector, inject, signal } from '@angular/core';
|
|
20
20
|
import { ɵWorkbenchPart } from '../part/ɵworkbench-part.model';
|
|
21
21
|
import { ActivationInstantProvider } from '../activation-instant.provider';
|
|
22
|
-
import {
|
|
23
|
-
import { WorkbenchPartRegistry } from '../part/workbench-part.registry';
|
|
22
|
+
import { WORKBENCH_PART_REGISTRY } from '../part/workbench-part.registry';
|
|
24
23
|
import { WorkbenchLayoutService } from '../layout/workbench-layout.service';
|
|
25
24
|
import { WorkbenchDialogRegistry } from '../dialog/workbench-dialog.registry';
|
|
26
|
-
import {
|
|
27
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
25
|
+
import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
28
26
|
import { provideViewContext } from './view-context-provider';
|
|
29
27
|
import { WORKBENCH_ID } from '../workbench-id';
|
|
30
28
|
import { ClassList } from '../common/class-list';
|
|
31
|
-
import {
|
|
29
|
+
import { Routing } from '../routing/routing.util';
|
|
32
30
|
import { WorkbenchRouteData } from '../routing/workbench-route-data';
|
|
31
|
+
import { ɵWorkbenchRouter } from '../routing/ɵworkbench-router.service';
|
|
33
32
|
export class ɵWorkbenchView {
|
|
34
33
|
constructor(id, options) {
|
|
35
34
|
this.id = id;
|
|
35
|
+
this._viewEnvironmentInjector = inject(EnvironmentInjector);
|
|
36
36
|
this._workbenchId = inject(WORKBENCH_ID);
|
|
37
37
|
this._workbenchService = inject(ɵWorkbenchService);
|
|
38
38
|
this._workbenchLayoutService = inject(WorkbenchLayoutService);
|
|
39
|
-
this.
|
|
40
|
-
this._workbenchRouter = inject(WorkbenchRouter);
|
|
39
|
+
this._workbenchRouter = inject(ɵWorkbenchRouter);
|
|
41
40
|
this._childrenOutletContexts = inject(ChildrenOutletContexts);
|
|
42
|
-
this._partRegistry = inject(
|
|
41
|
+
this._partRegistry = inject(WORKBENCH_PART_REGISTRY);
|
|
43
42
|
this._viewDragService = inject(ViewDragService);
|
|
44
43
|
this._activationInstantProvider = inject(ActivationInstantProvider);
|
|
45
44
|
this._workbenchDialogRegistry = inject(WorkbenchDialogRegistry);
|
|
46
45
|
this._menuItemProviders$ = new BehaviorSubject([]);
|
|
47
|
-
this._scrolledIntoView$ = new BehaviorSubject(true);
|
|
48
46
|
this._adapters = new Map();
|
|
49
|
-
this.
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
52
|
-
this.
|
|
53
|
-
this.
|
|
54
|
-
this.
|
|
55
|
-
this.
|
|
47
|
+
this._title = signal(null);
|
|
48
|
+
this._heading = signal(null);
|
|
49
|
+
this._dirty = signal(false);
|
|
50
|
+
this._closable = signal(true);
|
|
51
|
+
this._closableComputed = computed(() => this._closable() && !this._blockedBy());
|
|
52
|
+
this._blockedBy = toSignal(inject(WorkbenchDialogRegistry).top$({ viewId: this.id }), { requireSync: true });
|
|
53
|
+
this._scrolledIntoView = signal(true);
|
|
54
|
+
this.navigationHint = signal(undefined);
|
|
55
|
+
this.navigationData = signal({});
|
|
56
|
+
this.navigationState = signal({});
|
|
57
|
+
this.urlSegments = signal([], { equal: (a, b) => a.join('/') === b.join('/') });
|
|
58
|
+
this.position = computed(() => this.part().viewIds().indexOf(this.id));
|
|
59
|
+
this.first = computed(() => this.position() === 0);
|
|
60
|
+
this.last = computed(() => this.position() === this.part().viewIds().length - 1);
|
|
56
61
|
this.scrollTop = 0;
|
|
57
62
|
this.scrollLeft = 0;
|
|
58
|
-
this.
|
|
63
|
+
this.part = signal(null);
|
|
64
|
+
this.active = signal(false);
|
|
65
|
+
this.blockedBy$ = toObservable(this._blockedBy);
|
|
59
66
|
this.classList = new ClassList();
|
|
60
67
|
this.menuItems$ = combineLatest([this._menuItemProviders$, this._workbenchService.viewMenuItemProviders$])
|
|
61
68
|
.pipe(map(([localMenuItemProviders, globalMenuItemProviders]) => localMenuItemProviders.concat(globalMenuItemProviders)), mapArray(menuItemFactoryFn => menuItemFactoryFn(this)), filterArray((menuItem) => menuItem !== null));
|
|
62
|
-
const mView = options.layout.view({ viewId: this.id });
|
|
63
|
-
const mPart = options.layout.part({ viewId: this.id });
|
|
64
|
-
this.uid = mView.uid;
|
|
65
|
-
this.alternativeId = mView.alternativeId;
|
|
66
|
-
this.partId$ = new BehaviorSubject(mPart.id);
|
|
67
|
-
this.active$ = new BehaviorSubject(mPart.activeViewId === this.id);
|
|
68
69
|
this.portal = this.createPortal(options.component);
|
|
69
70
|
this.touchOnActivate();
|
|
70
|
-
this.
|
|
71
|
-
this.
|
|
71
|
+
this.installModelUpdater();
|
|
72
|
+
this.onLayoutChange({ layout: this._workbenchRouter.getCurrentNavigationContext().layout });
|
|
72
73
|
}
|
|
73
74
|
createPortal(viewComponent) {
|
|
74
75
|
return new WbComponentPortal(viewComponent, {
|
|
@@ -84,148 +85,139 @@ export class ɵWorkbenchView {
|
|
|
84
85
|
],
|
|
85
86
|
});
|
|
86
87
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Method invoked when a route is about to be activated for this view.
|
|
89
|
-
*/
|
|
90
|
-
onRouteActivate(route) {
|
|
91
|
-
this.title = RouterUtils.lookupRouteData(route, WorkbenchRouteData.title) ?? null;
|
|
92
|
-
this.heading = RouterUtils.lookupRouteData(route, WorkbenchRouteData.heading) ?? null;
|
|
93
|
-
this.dirty = false;
|
|
94
|
-
this.classList.set(RouterUtils.lookupRouteData(route, WorkbenchRouteData.cssClass), { scope: 'route' });
|
|
95
|
-
this.classList.remove({ scope: 'application' });
|
|
96
|
-
this.classList.remove({ scope: 'navigation' });
|
|
97
|
-
}
|
|
98
88
|
/**
|
|
99
89
|
* Method invoked when the workbench layout has changed.
|
|
100
90
|
*
|
|
101
91
|
* This method:
|
|
102
|
-
* - is called on every layout change, including changes not relevant for this view.
|
|
103
|
-
* - is called after
|
|
92
|
+
* - is called on every layout change, including changes not relevant for this view, e.g., to update the view's part.
|
|
93
|
+
* - is called after destroyed the previous component (if any), but before constructing the new component.
|
|
104
94
|
*/
|
|
105
|
-
onLayoutChange(
|
|
95
|
+
onLayoutChange(change) {
|
|
96
|
+
const { layout, route, previousRoute } = change;
|
|
106
97
|
const mPart = layout.part({ viewId: this.id });
|
|
107
98
|
const mView = layout.view({ viewId: this.id });
|
|
108
|
-
|
|
99
|
+
this.part.set(this._partRegistry.get(mPart.id));
|
|
100
|
+
this.active.set(mPart.activeViewId === this.id);
|
|
101
|
+
this.urlSegments.set(layout.urlSegments({ viewId: this.id }));
|
|
109
102
|
this.uid = mView.uid;
|
|
110
103
|
this.alternativeId = mView.alternativeId;
|
|
111
|
-
this.
|
|
112
|
-
this
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
this.
|
|
104
|
+
this.classList.layout = mView.cssClass;
|
|
105
|
+
// Test if a new route has been activated for this view.
|
|
106
|
+
const routeChanged = route?.routeConfig !== previousRoute?.routeConfig;
|
|
107
|
+
if (routeChanged) {
|
|
108
|
+
this.title = Routing.lookupRouteData(route, WorkbenchRouteData.title) ?? null;
|
|
109
|
+
this.heading = Routing.lookupRouteData(route, WorkbenchRouteData.heading) ?? null;
|
|
110
|
+
this.dirty = false;
|
|
111
|
+
this.classList.route = Routing.lookupRouteData(route, WorkbenchRouteData.cssClass);
|
|
112
|
+
this.classList.application = [];
|
|
119
113
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
114
|
+
// Test if this view was navigated. Navigation does not necessarily cause the route to change.
|
|
115
|
+
const navigationChanged = mView.navigation?.id !== this.navigationId;
|
|
116
|
+
if (navigationChanged) {
|
|
117
|
+
this.navigationId = mView.navigation?.id;
|
|
118
|
+
this.classList.navigation = mView.navigation?.cssClass;
|
|
119
|
+
this.navigationHint.set(mView.navigation?.hint);
|
|
120
|
+
this.navigationData.set(mView.navigation?.data ?? {});
|
|
121
|
+
this.navigationState.set(layout.navigationState({ viewId: this.id }));
|
|
123
122
|
}
|
|
124
|
-
//
|
|
125
|
-
// To complete the initialization of the routed
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
123
|
+
// If this view is inactive, Angular does not check it for changes as it is detached from the Angular component tree.
|
|
124
|
+
// To complete the initialization of the routed component (to ensure that `ngOnInit` is called), we manually trigger change
|
|
125
|
+
// detection. We cannot perform change detection right now because the routed component has not been activated/constructed yet.
|
|
126
|
+
// Use case: Navigating an (existing) inactive view to another route.
|
|
127
|
+
if (!this.active() && this.portal.isConstructed && routeChanged) {
|
|
128
|
+
this._workbenchRouter.getCurrentNavigationContext().registerPostNavigationAction(() => this.portal.componentRef.changeDetectorRef.detectChanges());
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
132
132
|
* Returns the component of this view. Returns `null` if not navigated the view, or before it was activated for the first time.
|
|
133
133
|
*/
|
|
134
134
|
getComponent() {
|
|
135
|
-
const
|
|
136
|
-
const outlet = outletContext?.outlet;
|
|
135
|
+
const outlet = this.getOutletContext()?.outlet;
|
|
137
136
|
return outlet?.isActivated ? outlet.component : null;
|
|
138
137
|
}
|
|
139
138
|
/**
|
|
140
139
|
* Returns the injector of the component. Returns `null` if not navigated the view, or before it was activated for the first time.
|
|
141
140
|
*/
|
|
142
141
|
getComponentInjector() {
|
|
143
|
-
|
|
144
|
-
return outletContext?.injector ?? null;
|
|
142
|
+
return this.getOutletContext()?.injector ?? null;
|
|
145
143
|
}
|
|
146
144
|
/** @inheritDoc */
|
|
147
|
-
get
|
|
148
|
-
return this.
|
|
145
|
+
get title() {
|
|
146
|
+
return this._title;
|
|
149
147
|
}
|
|
150
148
|
/** @inheritDoc */
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
set title(title) {
|
|
150
|
+
this._title.set(title);
|
|
153
151
|
}
|
|
154
152
|
/** @inheritDoc */
|
|
155
|
-
get
|
|
156
|
-
return this.
|
|
153
|
+
get heading() {
|
|
154
|
+
return this._heading;
|
|
157
155
|
}
|
|
158
156
|
/** @inheritDoc */
|
|
159
|
-
set
|
|
160
|
-
this.
|
|
157
|
+
set heading(heading) {
|
|
158
|
+
this._heading.set(heading);
|
|
161
159
|
}
|
|
162
160
|
/** @inheritDoc */
|
|
163
|
-
get
|
|
164
|
-
return this.
|
|
161
|
+
get dirty() {
|
|
162
|
+
return this._dirty;
|
|
163
|
+
}
|
|
164
|
+
/** @inheritDoc */
|
|
165
|
+
set dirty(dirty) {
|
|
166
|
+
this._dirty.set(dirty);
|
|
165
167
|
}
|
|
166
168
|
/** @inheritDoc */
|
|
167
|
-
get
|
|
168
|
-
return this.
|
|
169
|
+
get scrolledIntoView() {
|
|
170
|
+
return this._scrolledIntoView;
|
|
171
|
+
}
|
|
172
|
+
set scrolledIntoView(scrolledIntoView) {
|
|
173
|
+
this._scrolledIntoView.set(scrolledIntoView);
|
|
174
|
+
}
|
|
175
|
+
/** @inheritDoc */
|
|
176
|
+
set cssClass(cssClass) {
|
|
177
|
+
this.classList.application = cssClass;
|
|
178
|
+
}
|
|
179
|
+
/** @inheritDoc */
|
|
180
|
+
get cssClass() {
|
|
181
|
+
return this.classList.application;
|
|
169
182
|
}
|
|
170
183
|
/** @inheritDoc */
|
|
171
184
|
set closable(closable) {
|
|
172
|
-
this._closable
|
|
185
|
+
this._closable.set(closable);
|
|
173
186
|
}
|
|
174
187
|
/** @inheritDoc */
|
|
175
188
|
get closable() {
|
|
176
|
-
return this.
|
|
189
|
+
return this._closableComputed;
|
|
177
190
|
}
|
|
178
191
|
/** @inheritDoc */
|
|
179
192
|
async activate(options) {
|
|
180
|
-
if (this.active && this.part.active) {
|
|
193
|
+
if (this.active() && this.part().active()) {
|
|
181
194
|
return true;
|
|
182
195
|
}
|
|
183
|
-
const currentLayout = this._workbenchLayoutService.layout;
|
|
196
|
+
const currentLayout = this._workbenchLayoutService.layout();
|
|
184
197
|
return this._workbenchRouter.navigate(layout => currentLayout === layout ? layout.activateView(this.id, { activatePart: true }) : null, // cancel navigation if the layout has become stale
|
|
185
198
|
{ skipLocationChange: options?.skipLocationChange });
|
|
186
199
|
}
|
|
187
|
-
/** @inheritDoc */
|
|
188
|
-
set scrolledIntoView(scrolledIntoView) {
|
|
189
|
-
if (scrolledIntoView !== this._scrolledIntoView$.value) {
|
|
190
|
-
this._scrolledIntoView$.next(scrolledIntoView);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
/** @inheritDoc */
|
|
194
|
-
get scrolledIntoView() {
|
|
195
|
-
return this._scrolledIntoView$.value;
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Informs whether the tab of this view is scrolled into view in the tabbar.
|
|
199
|
-
* Emits the current state upon subscription, and then continuously when the state changes.
|
|
200
|
-
*/
|
|
201
|
-
get scrolledIntoView$() {
|
|
202
|
-
return this._scrolledIntoView$;
|
|
203
|
-
}
|
|
204
200
|
get activationInstant() {
|
|
205
201
|
return this._activationInstant;
|
|
206
202
|
}
|
|
207
203
|
/** @inheritDoc */
|
|
208
|
-
get part() {
|
|
209
|
-
return this._partRegistry.get(this.partId$.value);
|
|
210
|
-
}
|
|
211
|
-
/** @inheritDoc */
|
|
212
204
|
close(target) {
|
|
213
205
|
switch (target || 'self') {
|
|
214
206
|
case 'self': {
|
|
215
207
|
return this._workbenchService.closeViews(this.id);
|
|
216
208
|
}
|
|
217
209
|
case 'all-views': {
|
|
218
|
-
return this._workbenchService.closeViews(...this.part.viewIds);
|
|
210
|
+
return this._workbenchService.closeViews(...this.part().viewIds());
|
|
219
211
|
}
|
|
220
212
|
case 'other-views': {
|
|
221
|
-
return this._workbenchService.closeViews(...this.part.viewIds.filter(viewId => viewId !== this.id));
|
|
213
|
+
return this._workbenchService.closeViews(...this.part().viewIds().filter(viewId => viewId !== this.id));
|
|
222
214
|
}
|
|
223
215
|
case 'views-to-the-right': {
|
|
224
|
-
const viewIds = this.part.viewIds;
|
|
216
|
+
const viewIds = this.part().viewIds();
|
|
225
217
|
return this._workbenchService.closeViews(...viewIds.slice(viewIds.indexOf(this.id) + 1));
|
|
226
218
|
}
|
|
227
219
|
case 'views-to-the-left': {
|
|
228
|
-
const viewIds = this.part.viewIds;
|
|
220
|
+
const viewIds = this.part().viewIds();
|
|
229
221
|
return this._workbenchService.closeViews(...viewIds.slice(0, viewIds.indexOf(this.id)));
|
|
230
222
|
}
|
|
231
223
|
default: {
|
|
@@ -236,12 +228,13 @@ export class ɵWorkbenchView {
|
|
|
236
228
|
move(target, options) {
|
|
237
229
|
const source = {
|
|
238
230
|
workbenchId: this._workbenchId,
|
|
239
|
-
partId: this.part.id,
|
|
231
|
+
partId: this.part().id,
|
|
240
232
|
viewId: this.id,
|
|
241
233
|
alternativeViewId: this.alternativeId,
|
|
242
|
-
viewUrlSegments: this.urlSegments,
|
|
243
|
-
navigationHint: this.navigationHint,
|
|
244
|
-
|
|
234
|
+
viewUrlSegments: this.urlSegments(),
|
|
235
|
+
navigationHint: this.navigationHint(),
|
|
236
|
+
navigationData: this.navigationData(),
|
|
237
|
+
classList: this.classList.asMap(),
|
|
245
238
|
};
|
|
246
239
|
if (target === 'new-window') {
|
|
247
240
|
this._viewDragService.dispatchViewMoveEvent({ source, target: { workbenchId: 'new-window' } });
|
|
@@ -267,6 +260,12 @@ export class ɵWorkbenchView {
|
|
|
267
260
|
},
|
|
268
261
|
};
|
|
269
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* Reference to the handle's injector. The injector will be destroyed when closing the view.
|
|
265
|
+
*/
|
|
266
|
+
get injector() {
|
|
267
|
+
return this._viewEnvironmentInjector;
|
|
268
|
+
}
|
|
270
269
|
/**
|
|
271
270
|
* Registers an adapter for this view, replacing any previously registered adapter of the same type.
|
|
272
271
|
*
|
|
@@ -288,64 +287,51 @@ export class ɵWorkbenchView {
|
|
|
288
287
|
const adapter = this._adapters.get(adapterType);
|
|
289
288
|
return adapter ? adapter : null;
|
|
290
289
|
}
|
|
290
|
+
/** @inheritDoc */
|
|
291
291
|
get destroyed() {
|
|
292
292
|
return this.portal.isDestroyed;
|
|
293
293
|
}
|
|
294
294
|
/**
|
|
295
|
-
*
|
|
295
|
+
* Returns the outlet context of the currently activated route.
|
|
296
296
|
*/
|
|
297
|
-
|
|
298
|
-
this.
|
|
299
|
-
.pipe(filter(Boolean), takeUntilDestroyed(this._destroyRef))
|
|
300
|
-
.subscribe(() => {
|
|
301
|
-
this._activationInstant = this._activationInstantProvider.now();
|
|
302
|
-
});
|
|
297
|
+
getOutletContext() {
|
|
298
|
+
return Routing.resolveEffectiveOutletContext(this._childrenOutletContexts.getContext(this.id));
|
|
303
299
|
}
|
|
304
300
|
/**
|
|
305
|
-
*
|
|
301
|
+
* Updates the activation instant when this view is activated.
|
|
306
302
|
*/
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
303
|
+
touchOnActivate() {
|
|
304
|
+
effect(() => {
|
|
305
|
+
if (this.active()) {
|
|
306
|
+
this._activationInstant = this._activationInstantProvider.now();
|
|
307
|
+
}
|
|
308
|
+
});
|
|
311
309
|
}
|
|
312
310
|
/**
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
* Listening for route activations on the view's router outlet is not sufficient,
|
|
316
|
-
* as the outlet does not report subsequent activations of nested child routes.
|
|
317
|
-
*
|
|
318
|
-
* Example:
|
|
319
|
-
* ```html
|
|
320
|
-
* <router-outlet #router_outlet="outlet"
|
|
321
|
-
* (activate)="onActivateRoute(router_outlet.activatedRoute)">
|
|
322
|
-
* </router-outlet>
|
|
323
|
-
* ```
|
|
311
|
+
* Sets up automatic synchronization of {@link WorkbenchView} on every layout change.
|
|
324
312
|
*
|
|
325
|
-
*
|
|
313
|
+
* If the operation is cancelled (e.g., due to a navigation failure), it reverts the changes.
|
|
326
314
|
*/
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
this.
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
if (previous?.routeConfig !== current.routeConfig) {
|
|
341
|
-
this.onRouteActivate(current);
|
|
315
|
+
installModelUpdater() {
|
|
316
|
+
Routing.activatedRoute$(this.id, { emitOn: 'always' })
|
|
317
|
+
.pipe(takeUntilDestroyed())
|
|
318
|
+
.subscribe(([previousRoute, route]) => {
|
|
319
|
+
const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
|
|
320
|
+
const { layout, previousLayout, layoutDiff } = navigationContext;
|
|
321
|
+
if (layoutDiff.removedViews.includes(this.id)) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
this.onLayoutChange({ layout, route, previousRoute });
|
|
325
|
+
// Revert change in case the navigation fails.
|
|
326
|
+
if (previousLayout?.hasView(this.id)) {
|
|
327
|
+
navigationContext.registerUndoAction(() => this.onLayoutChange({ layout: previousLayout }));
|
|
342
328
|
}
|
|
343
329
|
});
|
|
344
330
|
}
|
|
345
331
|
destroy() {
|
|
346
|
-
this.
|
|
332
|
+
this._viewEnvironmentInjector.destroy();
|
|
347
333
|
this._workbenchDialogRegistry.dialogs({ viewId: this.id }).forEach(dialog => dialog.destroy());
|
|
348
334
|
this.portal.destroy();
|
|
349
335
|
}
|
|
350
336
|
}
|
|
351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtdmlldy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFjLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQXlCLGVBQWUsRUFBRSxzQkFBc0IsRUFBUyxNQUFNLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFDeEksT0FBTyxFQUFDLGVBQWUsRUFBc0IsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRixPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRS9ELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUd0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFlLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUV0RSxPQUFPLEVBQUMsc0JB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Q0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBwYWlyd2lzZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIEFjdGl2YXRpb25TdGFydCwgQ2hpbGRyZW5PdXRsZXRDb250ZXh0cywgRXZlbnQsIFJvdXRlciwgUm91dGVyRXZlbnQsIFVybFNlZ21lbnR9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1ZpZXdEcmFnU2VydmljZSwgVmlld01vdmVFdmVudFNvdXJjZX0gZnJvbSAnLi4vdmlldy1kbmQvdmlldy1kcmFnLnNlcnZpY2UnO1xuaW1wb3J0IHtmaWx0ZXIsIG1hcCwgc3RhcnRXaXRofSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2ZpbHRlckFycmF5LCBtYXBBcnJheX0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7RGlzcG9zYWJsZX0gZnJvbSAnLi4vY29tbW9uL2Rpc3Bvc2FibGUnO1xuaW1wb3J0IHt0aHJvd0Vycm9yfSBmcm9tICcuLi9jb21tb24vdGhyb3ctZXJyb3IudXRpbCc7XG5pbXBvcnQge1dvcmtiZW5jaE1lbnVJdGVtLCBXb3JrYmVuY2hNZW51SXRlbUZhY3RvcnlGbn0gZnJvbSAnLi4vd29ya2JlbmNoLm1vZGVsJztcbmltcG9ydCB7Vmlld0lkLCBXb3JrYmVuY2hWaWV3fSBmcm9tICcuL3dvcmtiZW5jaC12aWV3Lm1vZGVsJztcbmltcG9ydCB7V29ya2JlbmNoUGFydH0gZnJvbSAnLi4vcGFydC93b3JrYmVuY2gtcGFydC5tb2RlbCc7XG5pbXBvcnQge8m1V29ya2JlbmNoU2VydmljZX0gZnJvbSAnLi4vybV3b3JrYmVuY2guc2VydmljZSc7XG5pbXBvcnQge0NvbXBvbmVudFR5cGV9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtXYkNvbXBvbmVudFBvcnRhbH0gZnJvbSAnLi4vcG9ydGFsL3diLWNvbXBvbmVudC1wb3J0YWwnO1xuaW1wb3J0IHtBYnN0cmFjdFR5cGUsIGluamVjdCwgSW5qZWN0b3IsIFR5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFBhcnR9IGZyb20gJy4uL3BhcnQvybV3b3JrYmVuY2gtcGFydC5tb2RlbCc7XG5pbXBvcnQge0FjdGl2YXRpb25JbnN0YW50UHJvdmlkZXJ9IGZyb20gJy4uL2FjdGl2YXRpb24taW5zdGFudC5wcm92aWRlcic7XG5pbXBvcnQge1dvcmtiZW5jaFJvdXRlcn0gZnJvbSAnLi4vcm91dGluZy93b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtXb3JrYmVuY2hQYXJ0UmVnaXN0cnl9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQucmVnaXN0cnknO1xuaW1wb3J0IHvJtVdvcmtiZW5jaExheW91dH0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dCc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtXb3JrYmVuY2hEaWFsb2dSZWdpc3RyeX0gZnJvbSAnLi4vZGlhbG9nL3dvcmtiZW5jaC1kaWFsb2cucmVnaXN0cnknO1xuaW1wb3J0IHvJtURlc3Ryb3lSZWZ9IGZyb20gJy4uL2NvbW1vbi/JtWRlc3Ryb3ktcmVmJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge3Byb3ZpZGVWaWV3Q29udGV4dH0gZnJvbSAnLi92aWV3LWNvbnRleHQtcHJvdmlkZXInO1xuaW1wb3J0IHvJtVdvcmtiZW5jaERpYWxvZ30gZnJvbSAnLi4vZGlhbG9nL8m1d29ya2JlbmNoLWRpYWxvZyc7XG5pbXBvcnQge0Jsb2NrYWJsZX0gZnJvbSAnLi4vZ2xhc3MtcGFuZS9ibG9ja2FibGUnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfSUR9IGZyb20gJy4uL3dvcmtiZW5jaC1pZCc7XG5pbXBvcnQge0NsYXNzTGlzdH0gZnJvbSAnLi4vY29tbW9uL2NsYXNzLWxpc3QnO1xuaW1wb3J0IHtWaWV3U3RhdGV9IGZyb20gJy4uL3JvdXRpbmcvcm91dGluZy5tb2RlbCc7XG5pbXBvcnQge1JvdXRlclV0aWxzfSBmcm9tICcuLi9yb3V0aW5nL3JvdXRlci51dGlsJztcbmltcG9ydCB7V29ya2JlbmNoUm91dGVEYXRhfSBmcm9tICcuLi9yb3V0aW5nL3dvcmtiZW5jaC1yb3V0ZS1kYXRhJztcblxuZXhwb3J0IGNsYXNzIMm1V29ya2JlbmNoVmlldyBpbXBsZW1lbnRzIFdvcmtiZW5jaFZpZXcsIEJsb2NrYWJsZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoSWQgPSBpbmplY3QoV09SS0JFTkNIX0lEKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoU2VydmljZSA9IGluamVjdCjJtVdvcmtiZW5jaFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlID0gaW5qZWN0KFdvcmtiZW5jaExheW91dFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoUm91dGVyID0gaW5qZWN0KFdvcmtiZW5jaFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkcmVuT3V0bGV0Q29udGV4dHMgPSBpbmplY3QoQ2hpbGRyZW5PdXRsZXRDb250ZXh0cyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcnRSZWdpc3RyeSA9IGluamVjdChXb3JrYmVuY2hQYXJ0UmVnaXN0cnkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3RHJhZ1NlcnZpY2UgPSBpbmplY3QoVmlld0RyYWdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZhdGlvbkluc3RhbnRQcm92aWRlciA9IGluamVjdChBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoRGlhbG9nUmVnaXN0cnkgPSBpbmplY3QoV29ya2JlbmNoRGlhbG9nUmVnaXN0cnkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX21lbnVJdGVtUHJvdmlkZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8V29ya2JlbmNoTWVudUl0ZW1GYWN0b3J5Rm5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zY3JvbGxlZEludG9WaWV3JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXJzID0gbmV3IE1hcDxUeXBlPHVua25vd24+IHwgQWJzdHJhY3RUeXBlPHVua25vd24+LCB1bmtub3duPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gbmV3IMm1RGVzdHJveVJlZigpO1xuXG4gIHByaXZhdGUgX2FjdGl2YXRpb25JbnN0YW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2Nsb3NhYmxlID0gdHJ1ZTtcblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUge0BsaW5rIE1WaWV3fS5cbiAgICpcbiAgICogQSB2aWV3IGhhbmRsZSByZXByZXNlbnRzIGEgdmlldyB3aXRoIGEgcGFydGljdWxhciB2aWV3IGlkLiBEaWZmZXJlbnQge0BsaW5rIE1WaWV3fXMgb2YgdGhlIHNhbWUgdmlldyBpZCBtYXkgc2hhcmUgdGhlIGhhbmRsZS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gY2hhbmdpbmcgdGhlIGxheW91dCwgdmlldyBoYW5kbGVzIGZvciB2aWV3cyB3aXRoIHRoZSBzYW1lIHZpZXcgaWQgd2lsbCBiZSByZXVzZWQsIHJlZ2FyZGxlc3Mgb2ZcbiAgICogd2hldGhlciB0aGV5IGhhdmUgdGhlIHNhbWUge0BsaW5rIE1WaWV3fS5cbiAgICovXG4gIHB1YmxpYyB1aWQ6IHN0cmluZztcbiAgcHVibGljIGFsdGVybmF0aXZlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIG5hdmlnYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgbmF2aWdhdGlvbkhpbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10gPSBbXTtcbiAgcHVibGljIHN0YXRlOiBWaWV3U3RhdGUgPSB7fTtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGhlYWRpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgZGlydHkgPSBmYWxzZTtcbiAgcHVibGljIHNjcm9sbFRvcCA9IDA7XG4gIHB1YmxpYyBzY3JvbGxMZWZ0ID0gMDtcblxuICBwdWJsaWMgcmVhZG9ubHkgcGFydElkJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47XG4gIHB1YmxpYyByZWFkb25seSBhY3RpdmUkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gIHB1YmxpYyByZWFkb25seSBtZW51SXRlbXMkOiBPYnNlcnZhYmxlPFdvcmtiZW5jaE1lbnVJdGVtW10+O1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tlZEJ5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8ybVXb3JrYmVuY2hEaWFsb2cgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHBvcnRhbDogV2JDb21wb25lbnRQb3J0YWw7XG4gIHB1YmxpYyByZWFkb25seSBjbGFzc0xpc3QgPSBuZXcgQ2xhc3NMaXN0KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBWaWV3SWQsIG9wdGlvbnM6IHtjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8Vmlld0NvbXBvbmVudD47IGxheW91dDogybVXb3JrYmVuY2hMYXlvdXR9KSB7XG4gICAgdGhpcy5tZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLCB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnZpZXdNZW51SXRlbVByb3ZpZGVycyRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoW2xvY2FsTWVudUl0ZW1Qcm92aWRlcnMsIGdsb2JhbE1lbnVJdGVtUHJvdmlkZXJzXSkgPT4gbG9jYWxNZW51SXRlbVByb3ZpZGVycy5jb25jYXQoZ2xvYmFsTWVudUl0ZW1Qcm92aWRlcnMpKSxcbiAgICAgICAgbWFwQXJyYXkobWVudUl0ZW1GYWN0b3J5Rm4gPT4gbWVudUl0ZW1GYWN0b3J5Rm4odGhpcykpLFxuICAgICAgICBmaWx0ZXJBcnJheSgobWVudUl0ZW06IFdvcmtiZW5jaE1lbnVJdGVtIHwgbnVsbCk6IG1lbnVJdGVtIGlzIFdvcmtiZW5jaE1lbnVJdGVtID0+IG1lbnVJdGVtICE9PSBudWxsKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBtVmlldyA9IG9wdGlvbnMubGF5b3V0LnZpZXcoe3ZpZXdJZDogdGhpcy5pZH0pO1xuICAgIGNvbnN0IG1QYXJ0ID0gb3B0aW9ucy5sYXlvdXQucGFydCh7dmlld0lkOiB0aGlzLmlkfSk7XG5cbiAgICB0aGlzLnVpZCA9IG1WaWV3LnVpZDtcbiAgICB0aGlzLmFsdGVybmF0aXZlSWQgPSBtVmlldy5hbHRlcm5hdGl2ZUlkO1xuICAgIHRoaXMucGFydElkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobVBhcnQuaWQpO1xuICAgIHRoaXMuYWN0aXZlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobVBhcnQuYWN0aXZlVmlld0lkID09PSB0aGlzLmlkKTtcbiAgICB0aGlzLnBvcnRhbCA9IHRoaXMuY3JlYXRlUG9ydGFsKG9wdGlvbnMuY29tcG9uZW50KTtcblxuICAgIHRoaXMudG91Y2hPbkFjdGl2YXRlKCk7XG4gICAgdGhpcy5ibG9ja1doZW5EaWFsb2dPcGVuZWQoKTtcbiAgICB0aGlzLmRldGVjdFJvdXRlQWN0aXZhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQb3J0YWwodmlld0NvbXBvbmVudDogQ29tcG9uZW50VHlwZTxWaWV3Q29tcG9uZW50Pik6IFdiQ29tcG9uZW50UG9ydGFsIHtcbiAgICByZXR1cm4gbmV3IFdiQ29tcG9uZW50UG9ydGFsKHZpZXdDb21wb25lbnQsIHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlVmlld0NvbnRleHQodGhpcyksXG4gICAgICAgIC8vIEZvciBlYWNoIHZpZXcsIHRoZSB3b3JrYmVuY2ggcmVnaXN0ZXJzIGF1eGlsaWFyeSByb3V0ZXMgb2YgYWxsIHRvcC1sZXZlbCByb3V0ZXMsIGVuYWJsaW5nIHJvdXRpbmcgb24gYSBwZXItdmlldyBiYXNpcy5cbiAgICAgICAgLy8gQnV0LCBpZiB0aGUgd29ya2JlbmNoIGNvbXBvbmVudCBpdHNlbGYgaXMgZGlzcGxheWVkIGluIGEgcm91dGVyIG91dGxldCwgdmlldyBvdXRsZXRzIGFyZSBub3QgdG9wLWxldmVsIG91dGxldHMuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgaW5zdHJ1Y3QgdGhlIG91dGxldCB0byBhY3QgYXMgYSB0b3AtbGV2ZWwgb3V0bGV0IHRvIGJlIHRoZSB0YXJnZXQgb2YgdGhlIHJlZ2lzdGVyZWQgdG9wLWxldmVsIHZpZXcgcm91dGVzLlxuICAgICAgICB7cHJvdmlkZTogQ2hpbGRyZW5PdXRsZXRDb250ZXh0cywgdXNlVmFsdWU6IHRoaXMuX2NoaWxkcmVuT3V0bGV0Q29udGV4dHN9LFxuICAgICAgICAvLyBQcmV2ZW50IGluamVjdGluZyB0aGlzIHBhcnQgaW50byB0aGUgdmlldyBiZWNhdXNlIHRoZSB2aWV3IG1heSBiZSBkcmFnZ2VkIHRvIGEgZGlmZmVyZW50IHBhcnQuXG4gICAgICAgIHtwcm92aWRlOiBXb3JrYmVuY2hQYXJ0LCB1c2VGYWN0b3J5OiAoKSA9PiB0aHJvd0Vycm9yKGBbTnVsbEluamVjdG9yRXJyb3JdIE5vIHByb3ZpZGVyIGZvciAnV29ya2JlbmNoUGFydCdgKX0sXG4gICAgICAgIHtwcm92aWRlOiDJtVdvcmtiZW5jaFBhcnQsIHVzZUZhY3Rvcnk6ICgpID0+IHRocm93RXJyb3IoYFtOdWxsSW5qZWN0b3JFcnJvcl0gTm8gcHJvdmlkZXIgZm9yICfJtVdvcmtiZW5jaFBhcnQnYCl9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaW52b2tlZCB3aGVuIGEgcm91dGUgaXMgYWJvdXQgdG8gYmUgYWN0aXZhdGVkIGZvciB0aGlzIHZpZXcuXG4gICAqL1xuICBwcml2YXRlIG9uUm91dGVBY3RpdmF0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IHZvaWQge1xuICAgIHRoaXMudGl0bGUgPSBSb3V0ZXJVdGlscy5sb29rdXBSb3V0ZURhdGEocm91dGUsIFdvcmtiZW5jaFJvdXRlRGF0YS50aXRsZSkgPz8gbnVsbDtcbiAgICB0aGlzLmhlYWRpbmcgPSBSb3V0ZXJVdGlscy5sb29rdXBSb3V0ZURhdGEocm91dGUsIFdvcmtiZW5jaFJvdXRlRGF0YS5oZWFkaW5nKSA/PyBudWxsO1xuICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5zZXQoUm91dGVyVXRpbHMubG9va3VwUm91dGVEYXRhKHJvdXRlLCBXb3JrYmVuY2hSb3V0ZURhdGEuY3NzQ2xhc3MpLCB7c2NvcGU6ICdyb3V0ZSd9KTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoe3Njb3BlOiAnYXBwbGljYXRpb24nfSk7XG4gICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKHtzY29wZTogJ25hdmlnYXRpb24nfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGludm9rZWQgd2hlbiB0aGUgd29ya2JlbmNoIGxheW91dCBoYXMgY2hhbmdlZC5cbiAgICpcbiAgICogVGhpcyBtZXRob2Q6XG4gICAqIC0gaXMgY2FsbGVkIG9uIGV2ZXJ5IGxheW91dCBjaGFuZ2UsIGluY2x1ZGluZyBjaGFuZ2VzIG5vdCByZWxldmFudCBmb3IgdGhpcyB2aWV3LlxuICAgKiAtIGlzIGNhbGxlZCBhZnRlciBzdWNjZXNzZnVsIG5hdmlnYXRpb24sIGkuZS4sIGFmdGVyIHtAbGluayBvblJvdXRlQWN0aXZhdGV9LlxuICAgKi9cbiAgcHVibGljIG9uTGF5b3V0Q2hhbmdlKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiB2b2lkIHtcbiAgICBjb25zdCBtUGFydCA9IGxheW91dC5wYXJ0KHt2aWV3SWQ6IHRoaXMuaWR9KTtcbiAgICBjb25zdCBtVmlldyA9IGxheW91dC52aWV3KHt2aWV3SWQ6IHRoaXMuaWR9KTtcbiAgICBjb25zdCBwcmV2TmF2aWdhdGlvbklkID0gdGhpcy5uYXZpZ2F0aW9uSWQ7XG5cbiAgICB0aGlzLnVpZCA9IG1WaWV3LnVpZDtcbiAgICB0aGlzLmFsdGVybmF0aXZlSWQgPSBtVmlldy5hbHRlcm5hdGl2ZUlkO1xuICAgIHRoaXMudXJsU2VnbWVudHMgPSBsYXlvdXQudXJsU2VnbWVudHMoe3ZpZXdJZDogdGhpcy5pZH0pO1xuICAgIHRoaXMubmF2aWdhdGlvbklkID0gbVZpZXcubmF2aWdhdGlvbj8uaWQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uSGludCA9IG1WaWV3Lm5hdmlnYXRpb24/LmhpbnQ7XG4gICAgdGhpcy5zdGF0ZSA9IGxheW91dC52aWV3U3RhdGUoe3ZpZXdJZDogdGhpcy5pZH0pO1xuICAgIHRoaXMuY2xhc3NMaXN0LnNldChtVmlldy5jc3NDbGFzcywge3Njb3BlOiAnbGF5b3V0J30pO1xuICAgIHRoaXMuY2xhc3NMaXN0LnNldChtVmlldy5uYXZpZ2F0aW9uPy5jc3NDbGFzcywge3Njb3BlOiAnbmF2aWdhdGlvbid9KTtcblxuICAgIGlmIChtUGFydC5pZCAhPT0gdGhpcy5wYXJ0SWQkLnZhbHVlKSB7XG4gICAgICB0aGlzLnBhcnRJZCQubmV4dChtUGFydC5pZCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlID0gbVBhcnQuYWN0aXZlVmlld0lkID09PSB0aGlzLmlkO1xuICAgIGlmIChhY3RpdmUgIT09IHRoaXMuYWN0aXZlKSB7XG4gICAgICB0aGlzLmFjdGl2ZSQubmV4dChhY3RpdmUpO1xuICAgIH1cblxuICAgIC8vIEluYWN0aXZlIHZpZXdzIGFyZSBub3QgY2hlY2tlZCBmb3IgY2hhbmdlcyBzaW5jZSBkZXRhY2hlZCBmcm9tIHRoZSBBbmd1bGFyIGNvbXBvbmVudCB0cmVlLlxuICAgIC8vIFRvIGNvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcm91dGVkIGNvbnRlbnQgKHRvIGVuc3VyZSB0aGF0IGBuZ09uSW5pdGAgaXMgY2FsbGVkKSxcbiAgICAvLyB3ZSBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgaWYgKCF0aGlzLmFjdGl2ZSAmJiB0aGlzLnBvcnRhbC5pc0NvbnN0cnVjdGVkICYmIHByZXZOYXZpZ2F0aW9uSWQgIT09IHRoaXMubmF2aWdhdGlvbklkKSB7XG4gICAgICB0aGlzLnBvcnRhbC5jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgb2YgdGhpcyB2aWV3LiBSZXR1cm5zIGBudWxsYCBpZiBub3QgbmF2aWdhdGVkIHRoZSB2aWV3LCBvciBiZWZvcmUgaXQgd2FzIGFjdGl2YXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcG9uZW50PFQgPSB1bmtub3duPigpOiBUIHwgbnVsbCB7XG4gICAgY29uc3Qgb3V0bGV0Q29udGV4dCA9IFJvdXRlclV0aWxzLnJlc29sdmVFZmZlY3RpdmVPdXRsZXRDb250ZXh0KHRoaXMuX2NoaWxkcmVuT3V0bGV0Q29udGV4dHMuZ2V0Q29udGV4dCh0aGlzLmlkKSk7XG4gICAgY29uc3Qgb3V0bGV0ID0gb3V0bGV0Q29udGV4dD8ub3V0bGV0O1xuICAgIHJldHVybiBvdXRsZXQ/LmlzQWN0aXZhdGVkID8gb3V0bGV0LmNvbXBvbmVudCBhcyBUIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmplY3RvciBvZiB0aGUgY29tcG9uZW50LiBSZXR1cm5zIGBudWxsYCBpZiBub3QgbmF2aWdhdGVkIHRoZSB2aWV3LCBvciBiZWZvcmUgaXQgd2FzIGFjdGl2YXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5qZWN0b3IoKTogSW5qZWN0b3IgfCBudWxsIHtcbiAgICBjb25zdCBvdXRsZXRDb250ZXh0ID0gUm91dGVyVXRpbHMucmVzb2x2ZUVmZmVjdGl2ZU91dGxldENvbnRleHQodGhpcy5fY2hpbGRyZW5PdXRsZXRDb250ZXh0cy5nZXRDb250ZXh0KHRoaXMuaWQpKTtcbiAgICByZXR1cm4gb3V0bGV0Q29udGV4dD8uaW5qZWN0b3IgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IGZpcnN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uID09PSAwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgbGFzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gdGhpcy5wYXJ0LnZpZXdJZHMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFydC52aWV3SWRzLmluZGV4T2YodGhpcy5pZCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIHNldCBjc3NDbGFzcyhjc3NDbGFzczogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLmNsYXNzTGlzdC5zZXQoY3NzQ2xhc3MsIHtzY29wZTogJ2FwcGxpY2F0aW9uJ30pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5nZXQoe3Njb3BlOiAnYXBwbGljYXRpb24nfSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlJC52YWx1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgc2V0IGNsb3NhYmxlKGNsb3NhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2xvc2FibGUgPSBjbG9zYWJsZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IGNsb3NhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jbG9zYWJsZSAmJiAhdGhpcy5ibG9ja2VkQnkkLnZhbHVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZShvcHRpb25zPzoge3NraXBMb2NhdGlvbkNoYW5nZT86IGJvb2xlYW59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuYWN0aXZlICYmIHRoaXMucGFydC5hY3RpdmUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dDtcbiAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoUm91dGVyLm5hdmlnYXRlKFxuICAgICAgbGF5b3V0ID0+IGN1cnJlbnRMYXlvdXQgPT09IGxheW91dCA/IGxheW91dC5hY3RpdmF0ZVZpZXcodGhpcy5pZCwge2FjdGl2YXRlUGFydDogdHJ1ZX0pIDogbnVsbCwgLy8gY2FuY2VsIG5hdmlnYXRpb24gaWYgdGhlIGxheW91dCBoYXMgYmVjb21lIHN0YWxlXG4gICAgICB7c2tpcExvY2F0aW9uQ2hhbmdlOiBvcHRpb25zPy5za2lwTG9jYXRpb25DaGFuZ2V9LFxuICAgICk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIHNldCBzY3JvbGxlZEludG9WaWV3KHNjcm9sbGVkSW50b1ZpZXc6IGJvb2xlYW4pIHtcbiAgICBpZiAoc2Nyb2xsZWRJbnRvVmlldyAhPT0gdGhpcy5fc2Nyb2xsZWRJbnRvVmlldyQudmFsdWUpIHtcbiAgICAgIHRoaXMuX3Njcm9sbGVkSW50b1ZpZXckLm5leHQoc2Nyb2xsZWRJbnRvVmlldyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgc2Nyb2xsZWRJbnRvVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsZWRJbnRvVmlldyQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSW5mb3JtcyB3aGV0aGVyIHRoZSB0YWIgb2YgdGhpcyB2aWV3IGlzIHNjcm9sbGVkIGludG8gdmlldyBpbiB0aGUgdGFiYmFyLlxuICAgKiBFbWl0cyB0aGUgY3VycmVudCBzdGF0ZSB1cG9uIHN1YnNjcmlwdGlvbiwgYW5kIHRoZW4gY29udGludW91c2x5IHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNjcm9sbGVkSW50b1ZpZXckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9zY3JvbGxlZEludG9WaWV3JDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZhdGlvbkluc3RhbnQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZhdGlvbkluc3RhbnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBwYXJ0KCk6IFdvcmtiZW5jaFBhcnQge1xuICAgIHJldHVybiB0aGlzLl9wYXJ0UmVnaXN0cnkuZ2V0KHRoaXMucGFydElkJC52YWx1ZSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGNsb3NlKHRhcmdldD86ICdzZWxmJyB8ICdhbGwtdmlld3MnIHwgJ290aGVyLXZpZXdzJyB8ICd2aWV3cy10by10aGUtcmlnaHQnIHwgJ3ZpZXdzLXRvLXRoZS1sZWZ0Jyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHN3aXRjaCAodGFyZ2V0IHx8ICdzZWxmJykge1xuICAgICAgY2FzZSAnc2VsZic6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UuY2xvc2VWaWV3cyh0aGlzLmlkKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2FsbC12aWV3cyc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UuY2xvc2VWaWV3cyguLi50aGlzLnBhcnQudmlld0lkcyk7XG4gICAgICB9XG4gICAgICBjYXNlICdvdGhlci12aWV3cyc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UuY2xvc2VWaWV3cyguLi50aGlzLnBhcnQudmlld0lkcy5maWx0ZXIodmlld0lkID0+IHZpZXdJZCAhPT0gdGhpcy5pZCkpO1xuICAgICAgfVxuICAgICAgY2FzZSAndmlld3MtdG8tdGhlLXJpZ2h0Jzoge1xuICAgICAgICBjb25zdCB2aWV3SWRzID0gdGhpcy5wYXJ0LnZpZXdJZHM7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLmNsb3NlVmlld3MoLi4udmlld0lkcy5zbGljZSh2aWV3SWRzLmluZGV4T2YodGhpcy5pZCkgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICd2aWV3cy10by10aGUtbGVmdCc6IHtcbiAgICAgICAgY29uc3Qgdmlld0lkcyA9IHRoaXMucGFydC52aWV3SWRzO1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnZpZXdJZHMuc2xpY2UoMCwgdmlld0lkcy5pbmRleE9mKHRoaXMuaWQpKSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgbW92ZSh0YXJnZXQ6ICduZXctd2luZG93Jyk6IHZvaWQ7XG4gIHB1YmxpYyBtb3ZlKHBhcnRJZDogc3RyaW5nLCBvcHRpb25zPzoge3JlZ2lvbj86ICdub3J0aCcgfCAnc291dGgnIHwgJ3dlc3QnIHwgJ2Vhc3QnOyB3b3JrYmVuY2hJZD86IHN0cmluZ30pOiB2b2lkO1xuICBwdWJsaWMgbW92ZSh0YXJnZXQ6ICduZXctd2luZG93JyB8IHN0cmluZywgb3B0aW9ucz86IHtyZWdpb24/OiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICd3ZXN0JyB8ICdlYXN0Jzsgd29ya2JlbmNoSWQ/OiBzdHJpbmd9KTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlOiBWaWV3TW92ZUV2ZW50U291cmNlID0ge1xuICAgICAgd29ya2JlbmNoSWQ6IHRoaXMuX3dvcmtiZW5jaElkLFxuICAgICAgcGFydElkOiB0aGlzLnBhcnQuaWQsXG4gICAgICB2aWV3SWQ6IHRoaXMuaWQsXG4gICAgICBhbHRlcm5hdGl2ZVZpZXdJZDogdGhpcy5hbHRlcm5hdGl2ZUlkLFxuICAgICAgdmlld1VybFNlZ21lbnRzOiB0aGlzLnVybFNlZ21lbnRzLFxuICAgICAgbmF2aWdhdGlvbkhpbnQ6IHRoaXMubmF2aWdhdGlvbkhpbnQsXG4gICAgICBjbGFzc0xpc3Q6IHRoaXMuY2xhc3NMaXN0LnRvTWFwKCksXG4gICAgfTtcblxuICAgIGlmICh0YXJnZXQgPT09ICduZXctd2luZG93Jykge1xuICAgICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLmRpc3BhdGNoVmlld01vdmVFdmVudCh7c291cmNlLCB0YXJnZXQ6IHt3b3JrYmVuY2hJZDogJ25ldy13aW5kb3cnfX0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS5kaXNwYXRjaFZpZXdNb3ZlRXZlbnQoe1xuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LFxuICAgICAgICAgIHJlZ2lvbjogb3B0aW9ucyEucmVnaW9uLFxuICAgICAgICAgIHdvcmtiZW5jaElkOiBvcHRpb25zIS53b3JrYmVuY2hJZCA/PyB0aGlzLl93b3JrYmVuY2hJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgcmVnaXN0ZXJNZW51SXRlbShtZW51SXRlbTogV29ya2JlbmNoTWVudUl0ZW0pOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBmYWN0b3J5Rm4gPSAoKTogV29ya2JlbmNoTWVudUl0ZW0gPT4gbWVudUl0ZW07XG4gICAgdGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLm5leHQodGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLnZhbHVlLmNvbmNhdChmYWN0b3J5Rm4pKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcG9zZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLl9tZW51SXRlbVByb3ZpZGVycyQubmV4dCh0aGlzLl9tZW51SXRlbVByb3ZpZGVycyQudmFsdWUuZmlsdGVyKGl0ID0+IGl0ICE9PSBmYWN0b3J5Rm4pKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gYWRhcHRlciBmb3IgdGhpcyB2aWV3LCByZXBsYWNpbmcgYW55IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBhZGFwdGVyIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAqXG4gICAqIEFkYXB0ZXJzIGVuYWJsZSBsb29zZWx5IGNvdXBsZWQgZXh0ZW5zaW9uIG9mIGFuIG9iamVjdCwgYWxsb3dpbmcgb25lIG9iamVjdCB0byBiZSBhZGFwdGVkIHRvIGFub3RoZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJBZGFwdGVyPFQ+KGFkYXB0ZXJUeXBlOiBBYnN0cmFjdFR5cGU8VD4gfCBUeXBlPFQ+LCBvYmplY3Q6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9hZGFwdGVycy5zZXQoYWRhcHRlclR5cGUsIG9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIGdpdmVuIGFkYXB0ZXIuIEhhcyBubyBlZmZlY3QgaWYgbm90IHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlckFkYXB0ZXIoYWRhcHRlclR5cGU6IEFic3RyYWN0VHlwZTx1bmtub3duPiB8IFR5cGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLl9hZGFwdGVycy5kZWxldGUoYWRhcHRlclR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkYXB0cyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuIFJldHVybnMgYG51bGxgIGlmIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyBhZGFwdDxUPihhZGFwdGVyVHlwZTogQWJzdHJhY3RUeXBlPFQ+IHwgVHlwZTxUPik6IFQgfCBudWxsIHtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5fYWRhcHRlcnMuZ2V0KGFkYXB0ZXJUeXBlKTtcbiAgICByZXR1cm4gYWRhcHRlciA/IGFkYXB0ZXIgYXMgVCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3J0YWwuaXNEZXN0cm95ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgYWN0aXZhdGlvbiBpbnN0YW50IHdoZW4gdGhpcyB2aWV3IGlzIGFjdGl2YXRlZC5cbiAgICovXG4gIHByaXZhdGUgdG91Y2hPbkFjdGl2YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25JbnN0YW50ID0gdGhpcy5fYWN0aXZhdGlvbkluc3RhbnRQcm92aWRlci5ub3coKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB0aGlzIHZpZXcgd2hlbiBhIGRpYWxvZyBvdmVybGF5cyBpdC5cbiAgICovXG4gIHByaXZhdGUgYmxvY2tXaGVuRGlhbG9nT3BlbmVkKCk6IHZvaWQge1xuICAgIHRoaXMuX3dvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5LnRvcCQoe3ZpZXdJZDogdGhpcy5pZH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuYmxvY2tlZEJ5JCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0cyB3aGVuIHRvIGFjdGl2YXRlIGEgcm91dGUgZm9yIHRoaXMgdmlldy5cbiAgICpcbiAgICogTGlzdGVuaW5nIGZvciByb3V0ZSBhY3RpdmF0aW9ucyBvbiB0aGUgdmlldydzIHJvdXRlciBvdXRsZXQgaXMgbm90IHN1ZmZpY2llbnQsXG4gICAqIGFzIHRoZSBvdXRsZXQgZG9lcyBub3QgcmVwb3J0IHN1YnNlcXVlbnQgYWN0aXZhdGlvbnMgb2YgbmVzdGVkIGNoaWxkIHJvdXRlcy5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgaHRtbFxuICAgKiA8cm91dGVyLW91dGxldCAjcm91dGVyX291dGxldD1cIm91dGxldFwiXG4gICAqICAgICAgICAgICAgICAgIChhY3RpdmF0ZSk9XCJvbkFjdGl2YXRlUm91dGUocm91dGVyX291dGxldC5hY3RpdmF0ZWRSb3V0ZSlcIj5cbiAgICogPC9yb3V0ZXItb3V0bGV0PlxuICAgKiBgYGBcbiAgICpcbiAgICogSW5zdGVhZCwgd2Ugc3Vic2NyaWJlIHRvIEFuZ3VsYXIncyBgQWN0aXZhdGlvblN0YXJ0YCByb3V0ZXIgZXZlbnRzIGFuZCB1cGRhdGUgdGhlIHZpZXcgcHJvcGVydGllcyBhY2NvcmRpbmdseS5cbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0Um91dGVBY3RpdmF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2YXRlZE91dGxldFJvdXRlID0gdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnJvb3QuY2hpbGRyZW4uZmluZChyb3V0ZSA9PiByb3V0ZS5vdXRsZXQgPT09IHRoaXMuaWQpO1xuICAgIGNvbnN0IGFjdGl2YXRlZENoaWxkUm91dGUgPSBhY3RpdmF0ZWRPdXRsZXRSb3V0ZSA/IFJvdXRlclV0aWxzLnJlc29sdmVFZmZlY3RpdmVSb3V0ZShhY3RpdmF0ZWRPdXRsZXRSb3V0ZSkuc25hcHNob3QgOiBudWxsO1xuICAgIC8vIFRoZSB2aWV3IGhhbmRsZSBpcyBjb25zdHJ1Y3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBuYXZpZ2F0aW9uIChzZWUgV29ya2JlbmNoVXJsT2JzZXJ2ZXIjb25OYXZpZ2F0aW9uRW5kKSwgaS5lLiwgYWZ0ZXIgdGhlIHJvdXRlIGhhcyBiZWVuIGFjdGl2YXRlZC5cbiAgICAvLyBUaGVyZWZvcmUsIHdlIGNhbGwgYG9uUm91dGVBY3RpdmF0ZWAgbWFudWFsbHkuXG4gICAgaWYgKGFjdGl2YXRlZENoaWxkUm91dGUpIHtcbiAgICAgIHRoaXMub25Sb3V0ZUFjdGl2YXRlKGFjdGl2YXRlZENoaWxkUm91dGUpO1xuICAgIH1cblxuICAgIHRoaXMuX3JvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2ZW50OiBFdmVudCB8IFJvdXRlckV2ZW50KTogZXZlbnQgaXMgQWN0aXZhdGlvblN0YXJ0ID0+IGV2ZW50IGluc3RhbmNlb2YgQWN0aXZhdGlvblN0YXJ0KSxcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnNuYXBzaG90LnBhdGhGcm9tUm9vdFsxXT8ub3V0bGV0ID09PSB0aGlzLmlkKSxcbiAgICAgICAgbWFwKGV2ZW50ID0+IGV2ZW50LnNuYXBzaG90KSxcbiAgICAgICAgc3RhcnRXaXRoKGFjdGl2YXRlZENoaWxkUm91dGUhKSxcbiAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW3ByZXZpb3VzLCBjdXJyZW50XTogW0FjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90XSkgPT4ge1xuICAgICAgICAvLyBPbmx5IGNhbGwgYG9uUm91dGVBY3RpdmF0ZWAgaWYgdGhlIGFjdGl2YXRlZCByb3V0ZSBoYXMgY2hhbmdlZC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBlLmcuLCB3aGVuIGNoYW5naW5nIG1hdHJpeCBwYXJhbWV0ZXJzLCB0aGUgdmlldyBwcm9wZXJ0aWVzIHNldCBieSB0aGUgYXBwbGljYXRpb24gd291bGQgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgIGlmIChwcmV2aW91cz8ucm91dGVDb25maWcgIT09IGN1cnJlbnQucm91dGVDb25maWcpIHtcbiAgICAgICAgICB0aGlzLm9uUm91dGVBY3RpdmF0ZShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95UmVmLmRlc3Ryb3koKTtcbiAgICB0aGlzLl93b3JrYmVuY2hEaWFsb2dSZWdpc3RyeS5kaWFsb2dzKHt2aWV3SWQ6IHRoaXMuaWR9KS5mb3JFYWNoKGRpYWxvZyA9PiBkaWFsb2cuZGVzdHJveSgpKTtcbiAgICB0aGlzLnBvcnRhbC5kZXN0cm95KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcHNldWRvLXR5cGUgZm9yIHRoZSBhY3R1YWwge0BsaW5rIFZpZXdDb21wb25lbnR9IHdoaWNoIG11c3Qgbm90IGJlIHJlZmVyZW5jZWQgaW4gb3JkZXIgdG8gYXZvaWQgaW1wb3J0IGN5Y2xlcy5cbiAqL1xudHlwZSBWaWV3Q29tcG9uZW50ID0gYW55O1xuIl19
|
|
337
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtdmlldy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sRUFBeUIsc0JBQXNCLEVBQTRCLE1BQU0saUJBQWlCLENBQUM7QUFDMUcsT0FBTyxFQUFDLGVBQWUsRUFBc0IsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFHdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBZSxRQUFRLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBb0IsTUFBTSxFQUFPLE1BQU0sZUFBZSxDQUFDO0FBQzFILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRSxPQUFPLEVBQUMsdUJBQXVCLEVB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O1lBQzVGLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxPQUFPO1FBQ1osSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgQ2hpbGRyZW5PdXRsZXRDb250ZXh0cywgT3V0bGV0Q29udGV4dCwgVXJsU2VnbWVudH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Vmlld0RyYWdTZXJ2aWNlLCBWaWV3TW92ZUV2ZW50U291cmNlfSBmcm9tICcuLi92aWV3LWRuZC92aWV3LWRyYWcuc2VydmljZSc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmaWx0ZXJBcnJheSwgbWFwQXJyYXl9IGZyb20gJ0BzY2lvbi90b29sa2l0L29wZXJhdG9ycyc7XG5pbXBvcnQge0Rpc3Bvc2FibGV9IGZyb20gJy4uL2NvbW1vbi9kaXNwb3NhYmxlJztcbmltcG9ydCB7dGhyb3dFcnJvcn0gZnJvbSAnLi4vY29tbW9uL3Rocm93LWVycm9yLnV0aWwnO1xuaW1wb3J0IHtXb3JrYmVuY2hNZW51SXRlbSwgV29ya2JlbmNoTWVudUl0ZW1GYWN0b3J5Rm59IGZyb20gJy4uL3dvcmtiZW5jaC5tb2RlbCc7XG5pbXBvcnQge1ZpZXdJZCwgV29ya2JlbmNoVmlld30gZnJvbSAnLi93b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1dvcmtiZW5jaFBhcnR9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFNlcnZpY2V9IGZyb20gJy4uL8m1d29ya2JlbmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtDb21wb25lbnRUeXBlfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7V2JDb21wb25lbnRQb3J0YWx9IGZyb20gJy4uL3BvcnRhbC93Yi1jb21wb25lbnQtcG9ydGFsJztcbmltcG9ydCB7QWJzdHJhY3RUeXBlLCBjb21wdXRlZCwgZWZmZWN0LCBFbnZpcm9ubWVudEluamVjdG9yLCBpbmplY3QsIEluamVjdG9yLCBTaWduYWwsIHNpZ25hbCwgVHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge8m1V29ya2JlbmNoUGFydH0gZnJvbSAnLi4vcGFydC/JtXdvcmtiZW5jaC1wYXJ0Lm1vZGVsJztcbmltcG9ydCB7QWN0aXZhdGlvbkluc3RhbnRQcm92aWRlcn0gZnJvbSAnLi4vYWN0aXZhdGlvbi1pbnN0YW50LnByb3ZpZGVyJztcbmltcG9ydCB7V09SS0JFTkNIX1BBUlRfUkVHSVNUUll9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQucmVnaXN0cnknO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7V29ya2JlbmNoRGlhbG9nUmVnaXN0cnl9IGZyb20gJy4uL2RpYWxvZy93b3JrYmVuY2gtZGlhbG9nLnJlZ2lzdHJ5JztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUsIHRvU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge3Byb3ZpZGVWaWV3Q29udGV4dH0gZnJvbSAnLi92aWV3LWNvbnRleHQtcHJvdmlkZXInO1xuaW1wb3J0IHvJtVdvcmtiZW5jaERpYWxvZ30gZnJvbSAnLi4vZGlhbG9nL8m1d29ya2JlbmNoLWRpYWxvZyc7XG5pbXBvcnQge0Jsb2NrYWJsZX0gZnJvbSAnLi4vZ2xhc3MtcGFuZS9ibG9ja2FibGUnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfSUR9IGZyb20gJy4uL3dvcmtiZW5jaC1pZCc7XG5pbXBvcnQge0NsYXNzTGlzdH0gZnJvbSAnLi4vY29tbW9uL2NsYXNzLWxpc3QnO1xuaW1wb3J0IHtOYXZpZ2F0aW9uRGF0YSwgTmF2aWdhdGlvblN0YXRlfSBmcm9tICcuLi9yb3V0aW5nL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtSb3V0aW5nfSBmcm9tICcuLi9yb3V0aW5nL3JvdXRpbmcudXRpbCc7XG5pbXBvcnQge1dvcmtiZW5jaFJvdXRlRGF0YX0gZnJvbSAnLi4vcm91dGluZy93b3JrYmVuY2gtcm91dGUtZGF0YSc7XG5pbXBvcnQge8m1V29ya2JlbmNoUm91dGVyfSBmcm9tICcuLi9yb3V0aW5nL8m1d29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7ybVXb3JrYmVuY2hMYXlvdXR9IGZyb20gJy4uL2xheW91dC/JtXdvcmtiZW5jaC1sYXlvdXQnO1xuXG5leHBvcnQgY2xhc3MgybVXb3JrYmVuY2hWaWV3IGltcGxlbWVudHMgV29ya2JlbmNoVmlldywgQmxvY2thYmxlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3RW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoSWQgPSBpbmplY3QoV09SS0JFTkNIX0lEKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoU2VydmljZSA9IGluamVjdCjJtVdvcmtiZW5jaFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlID0gaW5qZWN0KFdvcmtiZW5jaExheW91dFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hSb3V0ZXIgPSBpbmplY3QoybVXb3JrYmVuY2hSb3V0ZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jaGlsZHJlbk91dGxldENvbnRleHRzID0gaW5qZWN0KENoaWxkcmVuT3V0bGV0Q29udGV4dHMpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXJ0UmVnaXN0cnkgPSBpbmplY3QoV09SS0JFTkNIX1BBUlRfUkVHSVNUUlkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3RHJhZ1NlcnZpY2UgPSBpbmplY3QoVmlld0RyYWdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZhdGlvbkluc3RhbnRQcm92aWRlciA9IGluamVjdChBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoRGlhbG9nUmVnaXN0cnkgPSBpbmplY3QoV29ya2JlbmNoRGlhbG9nUmVnaXN0cnkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX21lbnVJdGVtUHJvdmlkZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8V29ya2JlbmNoTWVudUl0ZW1GYWN0b3J5Rm5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVycyA9IG5ldyBNYXA8VHlwZTx1bmtub3duPiB8IEFic3RyYWN0VHlwZTx1bmtub3duPiwgdW5rbm93bj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90aXRsZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGluZyA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlydHkgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zYWJsZSA9IHNpZ25hbCh0cnVlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2FibGVDb21wdXRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2Nsb3NhYmxlKCkgJiYgIXRoaXMuX2Jsb2NrZWRCeSgpKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYmxvY2tlZEJ5ID0gdG9TaWduYWwoaW5qZWN0KFdvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5KS50b3AkKHt2aWV3SWQ6IHRoaXMuaWR9KSwge3JlcXVpcmVTeW5jOiB0cnVlfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Njcm9sbGVkSW50b1ZpZXcgPSBzaWduYWwodHJ1ZSk7XG5cbiAgcHJpdmF0ZSBfYWN0aXZhdGlvbkluc3RhbnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUge0BsaW5rIE1WaWV3fS5cbiAgICpcbiAgICogQSB2aWV3IGhhbmRsZSByZXByZXNlbnRzIGEgdmlldyB3aXRoIGEgcGFydGljdWxhciB2aWV3IGlkLiBEaWZmZXJlbnQge0BsaW5rIE1WaWV3fXMgb2YgdGhlIHNhbWUgdmlldyBpZCBtYXkgc2hhcmUgdGhlIGhhbmRsZS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gY2hhbmdpbmcgdGhlIGxheW91dCwgdmlldyBoYW5kbGVzIGZvciB2aWV3cyB3aXRoIHRoZSBzYW1lIHZpZXcgaWQgd2lsbCBiZSByZXVzZWQsIHJlZ2FyZGxlc3Mgb2ZcbiAgICogd2hldGhlciB0aGV5IGhhdmUgdGhlIHNhbWUge0BsaW5rIE1WaWV3fS5cbiAgICovXG4gIHB1YmxpYyB1aWQhOiBzdHJpbmc7XG4gIHB1YmxpYyBhbHRlcm5hdGl2ZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBuYXZpZ2F0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIG5hdmlnYXRpb25IaW50ID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHVibGljIG5hdmlnYXRpb25EYXRhID0gc2lnbmFsPE5hdmlnYXRpb25EYXRhPih7fSk7XG4gIHB1YmxpYyBuYXZpZ2F0aW9uU3RhdGUgPSBzaWduYWw8TmF2aWdhdGlvblN0YXRlPih7fSk7XG4gIHB1YmxpYyB1cmxTZWdtZW50cyA9IHNpZ25hbDxVcmxTZWdtZW50W10+KFtdLCB7ZXF1YWw6IChhLCBiKSA9PiBhLmpvaW4oJy8nKSA9PT0gYi5qb2luKCcvJyl9KTtcbiAgcHVibGljIHBvc2l0aW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYXJ0KCkudmlld0lkcygpLmluZGV4T2YodGhpcy5pZCkpO1xuICBwdWJsaWMgZmlyc3QgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBvc2l0aW9uKCkgPT09IDApO1xuICBwdWJsaWMgbGFzdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucG9zaXRpb24oKSA9PT0gdGhpcy5wYXJ0KCkudmlld0lkcygpLmxlbmd0aCAtIDEpO1xuICBwdWJsaWMgc2Nyb2xsVG9wID0gMDtcbiAgcHVibGljIHNjcm9sbExlZnQgPSAwO1xuXG4gIHB1YmxpYyByZWFkb25seSBwYXJ0ID0gc2lnbmFsPMm1V29ya2JlbmNoUGFydD4obnVsbCEpO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IG1lbnVJdGVtcyQ6IE9ic2VydmFibGU8V29ya2JlbmNoTWVudUl0ZW1bXT47XG4gIHB1YmxpYyByZWFkb25seSBibG9ja2VkQnkkID0gdG9PYnNlcnZhYmxlPMm1V29ya2JlbmNoRGlhbG9nIHwgbnVsbD4odGhpcy5fYmxvY2tlZEJ5KTtcbiAgcHVibGljIHJlYWRvbmx5IHBvcnRhbDogV2JDb21wb25lbnRQb3J0YWw7XG4gIHB1YmxpYyByZWFkb25seSBjbGFzc0xpc3QgPSBuZXcgQ2xhc3NMaXN0KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBWaWV3SWQsIG9wdGlvbnM6IHtjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8Vmlld0NvbXBvbmVudD59KSB7XG4gICAgdGhpcy5tZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLCB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnZpZXdNZW51SXRlbVByb3ZpZGVycyRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoW2xvY2FsTWVudUl0ZW1Qcm92aWRlcnMsIGdsb2JhbE1lbnVJdGVtUHJvdmlkZXJzXSkgPT4gbG9jYWxNZW51SXRlbVByb3ZpZGVycy5jb25jYXQoZ2xvYmFsTWVudUl0ZW1Qcm92aWRlcnMpKSxcbiAgICAgICAgbWFwQXJyYXkobWVudUl0ZW1GYWN0b3J5Rm4gPT4gbWVudUl0ZW1GYWN0b3J5Rm4odGhpcykpLFxuICAgICAgICBmaWx0ZXJBcnJheSgobWVudUl0ZW06IFdvcmtiZW5jaE1lbnVJdGVtIHwgbnVsbCk6IG1lbnVJdGVtIGlzIFdvcmtiZW5jaE1lbnVJdGVtID0+IG1lbnVJdGVtICE9PSBudWxsKSxcbiAgICAgICk7XG5cbiAgICB0aGlzLnBvcnRhbCA9IHRoaXMuY3JlYXRlUG9ydGFsKG9wdGlvbnMuY29tcG9uZW50KTtcbiAgICB0aGlzLnRvdWNoT25BY3RpdmF0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbE1vZGVsVXBkYXRlcigpO1xuICAgIHRoaXMub25MYXlvdXRDaGFuZ2Uoe2xheW91dDogdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLmxheW91dH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQb3J0YWwodmlld0NvbXBvbmVudDogQ29tcG9uZW50VHlwZTxWaWV3Q29tcG9uZW50Pik6IFdiQ29tcG9uZW50UG9ydGFsIHtcbiAgICByZXR1cm4gbmV3IFdiQ29tcG9uZW50UG9ydGFsKHZpZXdDb21wb25lbnQsIHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlVmlld0NvbnRleHQodGhpcyksXG4gICAgICAgIC8vIEZvciBlYWNoIHZpZXcsIHRoZSB3b3JrYmVuY2ggcmVnaXN0ZXJzIGF1eGlsaWFyeSByb3V0ZXMgb2YgYWxsIHRvcC1sZXZlbCByb3V0ZXMsIGVuYWJsaW5nIHJvdXRpbmcgb24gYSBwZXItdmlldyBiYXNpcy5cbiAgICAgICAgLy8gQnV0LCBpZiB0aGUgd29ya2JlbmNoIGNvbXBvbmVudCBpdHNlbGYgaXMgZGlzcGxheWVkIGluIGEgcm91dGVyIG91dGxldCwgdmlldyBvdXRsZXRzIGFyZSBub3QgdG9wLWxldmVsIG91dGxldHMuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgaW5zdHJ1Y3QgdGhlIG91dGxldCB0byBhY3QgYXMgYSB0b3AtbGV2ZWwgb3V0bGV0IHRvIGJlIHRoZSB0YXJnZXQgb2YgdGhlIHJlZ2lzdGVyZWQgdG9wLWxldmVsIHZpZXcgcm91dGVzLlxuICAgICAgICB7cHJvdmlkZTogQ2hpbGRyZW5PdXRsZXRDb250ZXh0cywgdXNlVmFsdWU6IHRoaXMuX2NoaWxkcmVuT3V0bGV0Q29udGV4dHN9LFxuICAgICAgICAvLyBQcmV2ZW50IGluamVjdGluZyB0aGlzIHBhcnQgaW50byB0aGUgdmlldyBiZWNhdXNlIHRoZSB2aWV3IG1heSBiZSBkcmFnZ2VkIHRvIGEgZGlmZmVyZW50IHBhcnQuXG4gICAgICAgIHtwcm92aWRlOiBXb3JrYmVuY2hQYXJ0LCB1c2VGYWN0b3J5OiAoKSA9PiB0aHJvd0Vycm9yKGBbTnVsbEluamVjdG9yRXJyb3JdIE5vIHByb3ZpZGVyIGZvciAnV29ya2JlbmNoUGFydCdgKX0sXG4gICAgICAgIHtwcm92aWRlOiDJtVdvcmtiZW5jaFBhcnQsIHVzZUZhY3Rvcnk6ICgpID0+IHRocm93RXJyb3IoYFtOdWxsSW5qZWN0b3JFcnJvcl0gTm8gcHJvdmlkZXIgZm9yICfJtVdvcmtiZW5jaFBhcnQnYCl9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaW52b2tlZCB3aGVuIHRoZSB3b3JrYmVuY2ggbGF5b3V0IGhhcyBjaGFuZ2VkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZDpcbiAgICogLSBpcyBjYWxsZWQgb24gZXZlcnkgbGF5b3V0IGNoYW5nZSwgaW5jbHVkaW5nIGNoYW5nZXMgbm90IHJlbGV2YW50IGZvciB0aGlzIHZpZXcsIGUuZy4sIHRvIHVwZGF0ZSB0aGUgdmlldydzIHBhcnQuXG4gICAqIC0gaXMgY2FsbGVkIGFmdGVyIGRlc3Ryb3llZCB0aGUgcHJldmlvdXMgY29tcG9uZW50IChpZiBhbnkpLCBidXQgYmVmb3JlIGNvbnN0cnVjdGluZyB0aGUgbmV3IGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgb25MYXlvdXRDaGFuZ2UoY2hhbmdlOiB7bGF5b3V0OiDJtVdvcmtiZW5jaExheW91dDsgcHJldmlvdXNSb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsOyByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3R9KTogdm9pZCB7XG4gICAgY29uc3Qge2xheW91dCwgcm91dGUsIHByZXZpb3VzUm91dGV9ID0gY2hhbmdlO1xuXG4gICAgY29uc3QgbVBhcnQgPSBsYXlvdXQucGFydCh7dmlld0lkOiB0aGlzLmlkfSk7XG4gICAgY29uc3QgbVZpZXcgPSBsYXlvdXQudmlldyh7dmlld0lkOiB0aGlzLmlkfSk7XG5cbiAgICB0aGlzLnBhcnQuc2V0KHRoaXMuX3BhcnRSZWdpc3RyeS5nZXQobVBhcnQuaWQpKTtcbiAgICB0aGlzLmFjdGl2ZS5zZXQobVBhcnQuYWN0aXZlVmlld0lkID09PSB0aGlzLmlkKTtcbiAgICB0aGlzLnVybFNlZ21lbnRzLnNldChsYXlvdXQudXJsU2VnbWVudHMoe3ZpZXdJZDogdGhpcy5pZH0pKTtcblxuICAgIHRoaXMudWlkID0gbVZpZXcudWlkO1xuICAgIHRoaXMuYWx0ZXJuYXRpdmVJZCA9IG1WaWV3LmFsdGVybmF0aXZlSWQ7XG4gICAgdGhpcy5jbGFzc0xpc3QubGF5b3V0ID0gbVZpZXcuY3NzQ2xhc3M7XG5cbiAgICAvLyBUZXN0IGlmIGEgbmV3IHJvdXRlIGhhcyBiZWVuIGFjdGl2YXRlZCBmb3IgdGhpcyB2aWV3LlxuICAgIGNvbnN0IHJvdXRlQ2hhbmdlZCA9IHJvdXRlPy5yb3V0ZUNvbmZpZyAhPT0gcHJldmlvdXNSb3V0ZT8ucm91dGVDb25maWc7XG4gICAgaWYgKHJvdXRlQ2hhbmdlZCkge1xuICAgICAgdGhpcy50aXRsZSA9IFJvdXRpbmcubG9va3VwUm91dGVEYXRhKHJvdXRlISwgV29ya2JlbmNoUm91dGVEYXRhLnRpdGxlKSA/PyBudWxsO1xuICAgICAgdGhpcy5oZWFkaW5nID0gUm91dGluZy5sb29rdXBSb3V0ZURhdGEocm91dGUhLCBXb3JrYmVuY2hSb3V0ZURhdGEuaGVhZGluZykgPz8gbnVsbDtcbiAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LnJvdXRlID0gUm91dGluZy5sb29rdXBSb3V0ZURhdGEocm91dGUhLCBXb3JrYmVuY2hSb3V0ZURhdGEuY3NzQ2xhc3MpO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYXBwbGljYXRpb24gPSBbXTtcbiAgICB9XG5cbiAgICAvLyBUZXN0IGlmIHRoaXMgdmlldyB3YXMgbmF2aWdhdGVkLiBOYXZpZ2F0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNhdXNlIHRoZSByb3V0ZSB0byBjaGFuZ2UuXG4gICAgY29uc3QgbmF2aWdhdGlvbkNoYW5nZWQgPSBtVmlldy5uYXZpZ2F0aW9uPy5pZCAhPT0gdGhpcy5uYXZpZ2F0aW9uSWQ7XG4gICAgaWYgKG5hdmlnYXRpb25DaGFuZ2VkKSB7XG4gICAgICB0aGlzLm5hdmlnYXRpb25JZCA9IG1WaWV3Lm5hdmlnYXRpb24/LmlkO1xuICAgICAgdGhpcy5jbGFzc0xpc3QubmF2aWdhdGlvbiA9IG1WaWV3Lm5hdmlnYXRpb24/LmNzc0NsYXNzO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uSGludC5zZXQobVZpZXcubmF2aWdhdGlvbj8uaGludCk7XG4gICAgICB0aGlzLm5hdmlnYXRpb25EYXRhLnNldChtVmlldy5uYXZpZ2F0aW9uPy5kYXRhID8/IHt9KTtcbiAgICAgIHRoaXMubmF2aWdhdGlvblN0YXRlLnNldChsYXlvdXQubmF2aWdhdGlvblN0YXRlKHt2aWV3SWQ6IHRoaXMuaWR9KSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB2aWV3IGlzIGluYWN0aXZlLCBBbmd1bGFyIGRvZXMgbm90IGNoZWNrIGl0IGZvciBjaGFuZ2VzIGFzIGl0IGlzIGRldGFjaGVkIGZyb20gdGhlIEFuZ3VsYXIgY29tcG9uZW50IHRyZWUuXG4gICAgLy8gVG8gY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByb3V0ZWQgY29tcG9uZW50ICh0byBlbnN1cmUgdGhhdCBgbmdPbkluaXRgIGlzIGNhbGxlZCksIHdlIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlXG4gICAgLy8gZGV0ZWN0aW9uLiBXZSBjYW5ub3QgcGVyZm9ybSBjaGFuZ2UgZGV0ZWN0aW9uIHJpZ2h0IG5vdyBiZWNhdXNlIHRoZSByb3V0ZWQgY29tcG9uZW50IGhhcyBub3QgYmVlbiBhY3RpdmF0ZWQvY29uc3RydWN0ZWQgeWV0LlxuICAgIC8vIFVzZSBjYXNlOiBOYXZpZ2F0aW5nIGFuIChleGlzdGluZykgaW5hY3RpdmUgdmlldyB0byBhbm90aGVyIHJvdXRlLlxuICAgIGlmICghdGhpcy5hY3RpdmUoKSAmJiB0aGlzLnBvcnRhbC5pc0NvbnN0cnVjdGVkICYmIHJvdXRlQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLnJlZ2lzdGVyUG9zdE5hdmlnYXRpb25BY3Rpb24oKCkgPT4gdGhpcy5wb3J0YWwuY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBvZiB0aGlzIHZpZXcuIFJldHVybnMgYG51bGxgIGlmIG5vdCBuYXZpZ2F0ZWQgdGhlIHZpZXcsIG9yIGJlZm9yZSBpdCB3YXMgYWN0aXZhdGVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICovXG4gIHB1YmxpYyBnZXRDb21wb25lbnQ8VCA9IHVua25vd24+KCk6IFQgfCBudWxsIHtcbiAgICBjb25zdCBvdXRsZXQgPSB0aGlzLmdldE91dGxldENvbnRleHQoKT8ub3V0bGV0O1xuICAgIHJldHVybiBvdXRsZXQ/LmlzQWN0aXZhdGVkID8gb3V0bGV0LmNvbXBvbmVudCBhcyBUIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmplY3RvciBvZiB0aGUgY29tcG9uZW50LiBSZXR1cm5zIGBudWxsYCBpZiBub3QgbmF2aWdhdGVkIHRoZSB2aWV3LCBvciBiZWZvcmUgaXQgd2FzIGFjdGl2YXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5qZWN0b3IoKTogSW5qZWN0b3IgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRsZXRDb250ZXh0KCk/LmluamVjdG9yID8/IG51bGw7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBTaWduYWw8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgc2V0IHRpdGxlKHRpdGxlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fdGl0bGUuc2V0KHRpdGxlKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IGhlYWRpbmcoKTogU2lnbmFsPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGluZztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgc2V0IGhlYWRpbmcoaGVhZGluZzogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX2hlYWRpbmcuc2V0KGhlYWRpbmcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgZGlydHkoKTogU2lnbmFsPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGlydHk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIHNldCBkaXJ0eShkaXJ0eTogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpcnR5LnNldChkaXJ0eSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBzY3JvbGxlZEludG9WaWV3KCk6IFNpZ25hbDxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbGVkSW50b1ZpZXc7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNjcm9sbGVkSW50b1ZpZXcoc2Nyb2xsZWRJbnRvVmlldzogYm9vbGVhbikge1xuICAgIHRoaXMuX3Njcm9sbGVkSW50b1ZpZXcuc2V0KHNjcm9sbGVkSW50b1ZpZXcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBzZXQgY3NzQ2xhc3MoY3NzQ2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5jbGFzc0xpc3QuYXBwbGljYXRpb24gPSBjc3NDbGFzcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IGNzc0NsYXNzKCk6IFNpZ25hbDxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5hcHBsaWNhdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgc2V0IGNsb3NhYmxlKGNsb3NhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2xvc2FibGUuc2V0KGNsb3NhYmxlKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IGNsb3NhYmxlKCk6IFNpZ25hbDxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb3NhYmxlQ29tcHV0ZWQ7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGFzeW5jIGFjdGl2YXRlKG9wdGlvbnM/OiB7c2tpcExvY2F0aW9uQ2hhbmdlPzogYm9vbGVhbn0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5hY3RpdmUoKSAmJiB0aGlzLnBhcnQoKS5hY3RpdmUoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5uYXZpZ2F0ZShcbiAgICAgIGxheW91dCA9PiBjdXJyZW50TGF5b3V0ID09PSBsYXlvdXQgPyBsYXlvdXQuYWN0aXZhdGVWaWV3KHRoaXMuaWQsIHthY3RpdmF0ZVBhcnQ6IHRydWV9KSA6IG51bGwsIC8vIGNhbmNlbCBuYXZpZ2F0aW9uIGlmIHRoZSBsYXlvdXQgaGFzIGJlY29tZSBzdGFsZVxuICAgICAge3NraXBMb2NhdGlvbkNoYW5nZTogb3B0aW9ucz8uc2tpcExvY2F0aW9uQ2hhbmdlfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmF0aW9uSW5zdGFudCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmF0aW9uSW5zdGFudDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgY2xvc2UodGFyZ2V0PzogJ3NlbGYnIHwgJ2FsbC12aWV3cycgfCAnb3RoZXItdmlld3MnIHwgJ3ZpZXdzLXRvLXRoZS1yaWdodCcgfCAndmlld3MtdG8tdGhlLWxlZnQnKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgc3dpdGNoICh0YXJnZXQgfHwgJ3NlbGYnKSB7XG4gICAgICBjYXNlICdzZWxmJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKHRoaXMuaWQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYWxsLXZpZXdzJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnRoaXMucGFydCgpLnZpZXdJZHMoKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdvdGhlci12aWV3cyc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UuY2xvc2VWaWV3cyguLi50aGlzLnBhcnQoKS52aWV3SWRzKCkuZmlsdGVyKHZpZXdJZCA9PiB2aWV3SWQgIT09IHRoaXMuaWQpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZpZXdzLXRvLXRoZS1yaWdodCc6IHtcbiAgICAgICAgY29uc3Qgdmlld0lkcyA9IHRoaXMucGFydCgpLnZpZXdJZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UuY2xvc2VWaWV3cyguLi52aWV3SWRzLnNsaWNlKHZpZXdJZHMuaW5kZXhPZih0aGlzLmlkKSArIDEpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZpZXdzLXRvLXRoZS1sZWZ0Jzoge1xuICAgICAgICBjb25zdCB2aWV3SWRzID0gdGhpcy5wYXJ0KCkudmlld0lkcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnZpZXdJZHMuc2xpY2UoMCwgdmlld0lkcy5pbmRleE9mKHRoaXMuaWQpKSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgbW92ZSh0YXJnZXQ6ICduZXctd2luZG93Jyk6IHZvaWQ7XG4gIHB1YmxpYyBtb3ZlKHBhcnRJZDogc3RyaW5nLCBvcHRpb25zPzoge3JlZ2lvbj86ICdub3J0aCcgfCAnc291dGgnIHwgJ3dlc3QnIHwgJ2Vhc3QnOyB3b3JrYmVuY2hJZD86IHN0cmluZ30pOiB2b2lkO1xuICBwdWJsaWMgbW92ZSh0YXJnZXQ6ICduZXctd2luZG93JyB8IHN0cmluZywgb3B0aW9ucz86IHtyZWdpb24/OiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICd3ZXN0JyB8ICdlYXN0Jzsgd29ya2JlbmNoSWQ/OiBzdHJpbmd9KTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlOiBWaWV3TW92ZUV2ZW50U291cmNlID0ge1xuICAgICAgd29ya2JlbmNoSWQ6IHRoaXMuX3dvcmtiZW5jaElkLFxuICAgICAgcGFydElkOiB0aGlzLnBhcnQoKS5pZCxcbiAgICAgIHZpZXdJZDogdGhpcy5pZCxcbiAgICAgIGFsdGVybmF0aXZlVmlld0lkOiB0aGlzLmFsdGVybmF0aXZlSWQsXG4gICAgICB2aWV3VXJsU2VnbWVudHM6IHRoaXMudXJsU2VnbWVudHMoKSxcbiAgICAgIG5hdmlnYXRpb25IaW50OiB0aGlzLm5hdmlnYXRpb25IaW50KCksXG4gICAgICBuYXZpZ2F0aW9uRGF0YTogdGhpcy5uYXZpZ2F0aW9uRGF0YSgpLFxuICAgICAgY2xhc3NMaXN0OiB0aGlzLmNsYXNzTGlzdC5hc01hcCgpLFxuICAgIH07XG5cbiAgICBpZiAodGFyZ2V0ID09PSAnbmV3LXdpbmRvdycpIHtcbiAgICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS5kaXNwYXRjaFZpZXdNb3ZlRXZlbnQoe3NvdXJjZSwgdGFyZ2V0OiB7d29ya2JlbmNoSWQ6ICduZXctd2luZG93J319KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl92aWV3RHJhZ1NlcnZpY2UuZGlzcGF0Y2hWaWV3TW92ZUV2ZW50KHtcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldCxcbiAgICAgICAgICByZWdpb246IG9wdGlvbnMhLnJlZ2lvbixcbiAgICAgICAgICB3b3JrYmVuY2hJZDogb3B0aW9ucyEud29ya2JlbmNoSWQgPz8gdGhpcy5fd29ya2JlbmNoSWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIHJlZ2lzdGVyTWVudUl0ZW0obWVudUl0ZW06IFdvcmtiZW5jaE1lbnVJdGVtKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgZmFjdG9yeUZuID0gKCk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IG1lbnVJdGVtO1xuICAgIHRoaXMuX21lbnVJdGVtUHJvdmlkZXJzJC5uZXh0KHRoaXMuX21lbnVJdGVtUHJvdmlkZXJzJC52YWx1ZS5jb25jYXQoZmFjdG9yeUZuKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLm5leHQodGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLnZhbHVlLmZpbHRlcihpdCA9PiBpdCAhPT0gZmFjdG9yeUZuKSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBoYW5kbGUncyBpbmplY3Rvci4gVGhlIGluamVjdG9yIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gY2xvc2luZyB0aGUgdmlldy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5qZWN0b3IoKTogSW5qZWN0b3Ige1xuICAgIHJldHVybiB0aGlzLl92aWV3RW52aXJvbm1lbnRJbmplY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gYWRhcHRlciBmb3IgdGhpcyB2aWV3LCByZXBsYWNpbmcgYW55IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBhZGFwdGVyIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAqXG4gICAqIEFkYXB0ZXJzIGVuYWJsZSBsb29zZWx5IGNvdXBsZWQgZXh0ZW5zaW9uIG9mIGFuIG9iamVjdCwgYWxsb3dpbmcgb25lIG9iamVjdCB0byBiZSBhZGFwdGVkIHRvIGFub3RoZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJBZGFwdGVyPFQ+KGFkYXB0ZXJUeXBlOiBBYnN0cmFjdFR5cGU8VD4gfCBUeXBlPFQ+LCBvYmplY3Q6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9hZGFwdGVycy5zZXQoYWRhcHRlclR5cGUsIG9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIGdpdmVuIGFkYXB0ZXIuIEhhcyBubyBlZmZlY3QgaWYgbm90IHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlckFkYXB0ZXIoYWRhcHRlclR5cGU6IEFic3RyYWN0VHlwZTx1bmtub3duPiB8IFR5cGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLl9hZGFwdGVycy5kZWxldGUoYWRhcHRlclR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkYXB0cyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuIFJldHVybnMgYG51bGxgIGlmIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyBhZGFwdDxUPihhZGFwdGVyVHlwZTogQWJzdHJhY3RUeXBlPFQ+IHwgVHlwZTxUPik6IFQgfCBudWxsIHtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5fYWRhcHRlcnMuZ2V0KGFkYXB0ZXJUeXBlKTtcbiAgICByZXR1cm4gYWRhcHRlciA/IGFkYXB0ZXIgYXMgVCA6IG51bGw7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBkZXN0cm95ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucG9ydGFsLmlzRGVzdHJveWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG91dGxldCBjb250ZXh0IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZhdGVkIHJvdXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPdXRsZXRDb250ZXh0KCk6IE91dGxldENvbnRleHQgfCBudWxsIHtcbiAgICByZXR1cm4gUm91dGluZy5yZXNvbHZlRWZmZWN0aXZlT3V0bGV0Q29udGV4dCh0aGlzLl9jaGlsZHJlbk91dGxldENvbnRleHRzLmdldENvbnRleHQodGhpcy5pZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGFjdGl2YXRpb24gaW5zdGFudCB3aGVuIHRoaXMgdmlldyBpcyBhY3RpdmF0ZWQuXG4gICAqL1xuICBwcml2YXRlIHRvdWNoT25BY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlKCkpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGlvbkluc3RhbnQgPSB0aGlzLl9hY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyLm5vdygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgYXV0b21hdGljIHN5bmNocm9uaXphdGlvbiBvZiB7QGxpbmsgV29ya2JlbmNoVmlld30gb24gZXZlcnkgbGF5b3V0IGNoYW5nZS5cbiAgICpcbiAgICogSWYgdGhlIG9wZXJhdGlvbiBpcyBjYW5jZWxsZWQgKGUuZy4sIGR1ZSB0byBhIG5hdmlnYXRpb24gZmFpbHVyZSksIGl0IHJldmVydHMgdGhlIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxNb2RlbFVwZGF0ZXIoKTogdm9pZCB7XG4gICAgUm91dGluZy5hY3RpdmF0ZWRSb3V0ZSQodGhpcy5pZCwge2VtaXRPbjogJ2Fsd2F5cyd9KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKChbcHJldmlvdXNSb3V0ZSwgcm91dGVdOiBbQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwsIEFjdGl2YXRlZFJvdXRlU25hcHNob3RdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25Db250ZXh0ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuICAgICAgICBjb25zdCB7bGF5b3V0LCBwcmV2aW91c0xheW91dCwgbGF5b3V0RGlmZn0gPSBuYXZpZ2F0aW9uQ29udGV4dDtcblxuICAgICAgICBpZiAobGF5b3V0RGlmZi5yZW1vdmVkVmlld3MuaW5jbHVkZXModGhpcy5pZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uTGF5b3V0Q2hhbmdlKHtsYXlvdXQsIHJvdXRlLCBwcmV2aW91c1JvdXRlfSk7XG5cbiAgICAgICAgLy8gUmV2ZXJ0IGNoYW5nZSBpbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuICAgICAgICBpZiAocHJldmlvdXNMYXlvdXQ/Lmhhc1ZpZXcodGhpcy5pZCkpIHtcbiAgICAgICAgICBuYXZpZ2F0aW9uQ29udGV4dC5yZWdpc3RlclVuZG9BY3Rpb24oKCkgPT4gdGhpcy5vbkxheW91dENoYW5nZSh7bGF5b3V0OiBwcmV2aW91c0xheW91dH0pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3RW52aXJvbm1lbnRJbmplY3Rvci5kZXN0cm95KCk7XG4gICAgdGhpcy5fd29ya2JlbmNoRGlhbG9nUmVnaXN0cnkuZGlhbG9ncyh7dmlld0lkOiB0aGlzLmlkfSkuZm9yRWFjaChkaWFsb2cgPT4gZGlhbG9nLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5wb3J0YWwuZGVzdHJveSgpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHBzZXVkby10eXBlIGZvciB0aGUgYWN0dWFsIHtAbGluayBWaWV3Q29tcG9uZW50fSB3aGljaCBtdXN0IG5vdCBiZSByZWZlcmVuY2VkIGluIG9yZGVyIHRvIGF2b2lkIGltcG9ydCBjeWNsZXMuXG4gKi9cbnR5cGUgVmlld0NvbXBvbmVudCA9IGFueTtcbiJdfQ==
|