@jax-data-science/sci-image-visualizer 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +10 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +1 -1
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +11 -7
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +20 -3
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +28 -5
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +9 -2
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +5 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +81 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +115 -4
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +15 -3
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +18 -7
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +38 -8
- package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
- package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +1 -1
- package/esm2022/lib/models/class-preset.mjs +1 -1
- package/esm2022/lib/models/polygon-factory.mjs +17 -1
- package/esm2022/lib/models/region-geojson.mjs +44 -6
- package/esm2022/lib/models/region.mjs +1 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +77 -13
- package/esm2022/lib/region-editor/region-editor.component.mjs +670 -42
- package/esm2022/lib/region-editor/region-metrics.mjs +20 -2
- package/esm2022/lib/region-editor/region-persistence.service.mjs +44 -10
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +24 -8
- package/esm2022/lib/region-import/label-classes.mjs +149 -0
- package/esm2022/lib/region-import/label-volume.mjs +194 -0
- package/esm2022/lib/region-import/region-import.mjs +71 -0
- package/esm2022/lib/region-overlay/region-geometry.mjs +3 -3
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/routing-visualizer.service.mjs +510 -22
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/store/class-color.util.mjs +10 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-scope-cache.mjs +5 -1
- package/esm2022/lib/store/region-source-scope.mjs +186 -0
- package/esm2022/lib/store/region-store.service.mjs +774 -12
- package/esm2022/lib/store/visualizer-store.service.mjs +33 -6
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +8 -2
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +55 -15
- package/esm2022/lib/toolbar/toolbar.component.mjs +19 -5
- package/esm2022/lib/visualizer/region-load.mjs +67 -4
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +155 -7
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs} +9851 -2904
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs} +4 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -3
- package/fesm2022/region-source.worker.js +1067 -0
- package/index.d.ts +12 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +24 -0
- package/lib/contracts/region-editor-api.contract.d.ts +102 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/visualizer.contract.d.ts +10 -0
- package/lib/contracts/viz-config.d.ts +8 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -2
- package/lib/implementations/napari-js/napari-loading-state.d.ts +8 -1
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +6 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +33 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +3 -1
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +48 -0
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +45 -1
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +4 -3
- package/lib/implementations/osd/osd-region-overlay.d.ts +10 -3
- package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
- package/lib/implementations/osd/slice-cache.d.ts +13 -3
- package/lib/implementations/tile-server/tile-protocol.d.ts +3 -0
- package/lib/models/class-preset.d.ts +7 -0
- package/lib/models/polygon-factory.d.ts +5 -0
- package/lib/models/region-geojson.d.ts +40 -0
- package/lib/models/region.d.ts +19 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +36 -6
- package/lib/region-editor/region-editor.component.d.ts +159 -17
- package/lib/region-editor/region-metrics.d.ts +8 -0
- package/lib/region-editor/region-persistence.service.d.ts +17 -5
- package/lib/region-editor/region-table/region-table.component.d.ts +10 -4
- package/lib/region-import/label-classes.d.ts +39 -0
- package/lib/region-import/label-volume.d.ts +31 -0
- package/lib/region-import/region-import.d.ts +46 -0
- package/lib/region-overlay/region-geometry.d.ts +4 -3
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/routing-visualizer.service.d.ts +168 -1
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/store/class-color.util.d.ts +6 -3
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-scope-cache.d.ts +2 -0
- package/lib/store/region-source-scope.d.ts +74 -0
- package/lib/store/region-store.service.d.ts +216 -2
- package/lib/store/visualizer-store.service.d.ts +10 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +3 -1
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +20 -9
- package/lib/toolbar/toolbar.component.d.ts +9 -2
- package/lib/visualizer/region-load.d.ts +23 -4
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +40 -0
- package/package.json +2 -2
- package/src/lib/assets/slice.svg +23 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +0 -1
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { EMPTY, combineLatest, merge } from 'rxjs';
|
|
2
|
+
import { EMPTY, Subject, Subscription, combineLatest, merge, BehaviorSubject } from 'rxjs';
|
|
3
3
|
import { map } from 'rxjs/operators';
|
|
4
|
+
import { resolveColormap } from 'napari-js';
|
|
4
5
|
import { PlotlyService } from './implementations/plotly/plotly.service';
|
|
5
6
|
import { OpenSeadragonVisualizerService } from './implementations/osd/openseadragon-visualizer.service';
|
|
6
|
-
import { PlotType, isNapari3d, isNapariScatter, isSpatialOmics, isSpatialOmics3d, } from './contracts/plot-type';
|
|
7
|
+
import { PlotType, isNapari3d, isNapariScatter, isSpatialOmics, isSpatialOmics3d, isNapariIsosurface, isNapariVolume, } from './contracts/plot-type';
|
|
7
8
|
import { SPATIAL_DATA_PORT } from './contracts/ports/spatial-data.port';
|
|
8
9
|
import { SpatialControlsFacade } from './spatial/spatial-controls.facade';
|
|
9
10
|
import { RegionStore } from './store/region-store.service';
|
|
11
|
+
import { RegionScopeCache } from './store/region-scope-cache';
|
|
12
|
+
import { REGION_SOURCE_MIN_CHARS } from './region-source/region-source';
|
|
13
|
+
import { openGeoJsonRegionSource } from './region-source/worker-region-source';
|
|
10
14
|
import { SpatialSelectionStore } from './store/spatial-selection.service';
|
|
11
15
|
import { autoWindowFromHistogram } from './contracts/intensity';
|
|
12
16
|
import { VisualizerStore } from './store/visualizer-store.service';
|
|
13
17
|
import { NapariVisualizerService } from './implementations/napari-js/napari-visualizer.service';
|
|
18
|
+
import { channelTintColormap, volumeColormap } from './implementations/napari-js/napari-display-state';
|
|
14
19
|
import { VIZ_CONFIG } from './contracts/viz-config';
|
|
15
20
|
import { IntensityProfileService } from './intensity/intensity-profile.service';
|
|
21
|
+
import { changedClasses, classSignatures } from './store/class-signatures';
|
|
22
|
+
import { VolumeSections } from './visualizer/volume-sections';
|
|
16
23
|
import * as i0 from "@angular/core";
|
|
17
24
|
import * as i1 from "./implementations/plotly/plotly.service";
|
|
18
25
|
import * as i2 from "./implementations/osd/openseadragon-visualizer.service";
|
|
@@ -21,6 +28,8 @@ import * as i4 from "./store/visualizer-store.service";
|
|
|
21
28
|
import * as i5 from "./store/region-store.service";
|
|
22
29
|
import * as i6 from "./store/spatial-selection.service";
|
|
23
30
|
import * as i7 from "./intensity/intensity-profile.service";
|
|
31
|
+
/** How long after the last edit the surfaces of the classes it touched are rebuilt (ms). */
|
|
32
|
+
export const REGION_SURFACE_REBUILD_MS = 600;
|
|
24
33
|
/** Intensity-profile line ROIs are owned by the intensity tool, not the editor.
|
|
25
34
|
* Package-internal predicate (property-based so it also matches plain objects
|
|
26
35
|
* after a drag round-trip). */
|
|
@@ -75,6 +84,43 @@ export class RoutingVisualizerService {
|
|
|
75
84
|
this.napariFellBack = false;
|
|
76
85
|
/** The div the backends render into (every backend shares it); '' before the first plot. */
|
|
77
86
|
this.plotDiv = '';
|
|
87
|
+
/** Whether a napari volume view is the current plot type. */
|
|
88
|
+
this.volumeView$ = new BehaviorSubject(false);
|
|
89
|
+
/** Whether the volume view's slice pane is wanted (see {@link setSliceEditor}). */
|
|
90
|
+
this.sliceEditor$ = new BehaviorSubject(false);
|
|
91
|
+
/** Whether the volume view draws the region reconstructions through the volume. */
|
|
92
|
+
this.regionsThroughVolume$ = new BehaviorSubject(false);
|
|
93
|
+
/** Region reconstructions built so far, by image, resolution and classes (with those classes). */
|
|
94
|
+
this.meshCache = new Map();
|
|
95
|
+
/** Bumped per {@link showRegionClasses3d} (and per new image), so only the latest one shows. */
|
|
96
|
+
this.meshRequest = 0;
|
|
97
|
+
/** The class groups shown in 3D, and the image they belong to. */
|
|
98
|
+
this.classes3d$ = new BehaviorSubject([]);
|
|
99
|
+
/** The groups last asked for in 3D, with their colours: what an edit's rebuild shows again. */
|
|
100
|
+
this.shown3d = [];
|
|
101
|
+
/**
|
|
102
|
+
* Each class's fingerprint on the live slice (see classSignatures), which image and slice, and
|
|
103
|
+
* what the region sources hold (see RegionStore.getSourceStateKey). Null while nothing follows
|
|
104
|
+
* the edits (no surface built, no sections).
|
|
105
|
+
*/
|
|
106
|
+
this.liveClasses = null;
|
|
107
|
+
/** The pending rebuild of the surfaces an edit touched. */
|
|
108
|
+
this.rebuildTimer = null;
|
|
109
|
+
// ── The slice pane (the volume view's split): OSD editing one slice beside the 3D view ──
|
|
110
|
+
/** The div the slice pane renders into while it is wanted (null: no split). */
|
|
111
|
+
this.sliceDiv = null;
|
|
112
|
+
/** Whether OSD is mounted in the slice pane: region, tool and overlay calls go to it. */
|
|
113
|
+
this.sliceMounted = false;
|
|
114
|
+
/** Bumped per slice-pane mount or teardown, so only the latest one lands. */
|
|
115
|
+
this.sliceRequest = 0;
|
|
116
|
+
/** The z plane dragged in the volume: the slice to show (see {@link getSliceDrag$}). */
|
|
117
|
+
this.sliceDrag$ = new Subject();
|
|
118
|
+
this.sectionSubs = new Subscription();
|
|
119
|
+
/** The image info and screen height of the last plot (what the slice pane mounts). */
|
|
120
|
+
this.plottedInfo = null;
|
|
121
|
+
/** The current region import (see regionImportTicket): its id and the image it was taken for. */
|
|
122
|
+
this.importTicket = { id: 0, image: undefined };
|
|
123
|
+
this.plottedHeight = 0;
|
|
78
124
|
this.viewOptions = {
|
|
79
125
|
setNavigatorVisible: (visible) => {
|
|
80
126
|
for (const b of this.backends())
|
|
@@ -104,6 +150,57 @@ export class RoutingVisualizerService {
|
|
|
104
150
|
},
|
|
105
151
|
getViewportChange$: () => merge(...this.backends().map((b) => b.getIntensitySampling()?.getViewportChange$() ?? EMPTY)),
|
|
106
152
|
};
|
|
153
|
+
this.regionUpdates = this.regionStore.getRegionUpdateEvent().subscribe(() => this.onRegionsChanged());
|
|
154
|
+
this.sections = new VolumeSections({
|
|
155
|
+
volume: () => this.napari.volumeVoxels(),
|
|
156
|
+
image: () => this.plottedFileName,
|
|
157
|
+
showPlanes: (planes) => this.napari.setSlicePlanes(planes),
|
|
158
|
+
outlinesByClass: (level) => this.regionStore.outlinesByClass(level),
|
|
159
|
+
isClassHidden: (label) => this.regionStore.isClassHidden(label),
|
|
160
|
+
colorOf: (label) => this.classColor(label),
|
|
161
|
+
channelStates: () => this.store.currentChannelStates(),
|
|
162
|
+
colormap: (st, multichannel) => {
|
|
163
|
+
// As the volume scene colours the channel (invert is applied before the colormap).
|
|
164
|
+
const display = {
|
|
165
|
+
colormap: this.store.currentColormap(),
|
|
166
|
+
reverse: this.store.currentReverseScale(),
|
|
167
|
+
invert: false,
|
|
168
|
+
};
|
|
169
|
+
return resolveColormap(multichannel ? channelTintColormap(st?.color ?? '#ffffff', display) : volumeColormap(st, display));
|
|
170
|
+
},
|
|
171
|
+
invert: () => this.store.currentInvert(),
|
|
172
|
+
slice: () => this.currentZIndex,
|
|
173
|
+
});
|
|
174
|
+
// A plane dragged in the volume: the z plane picks the slice (through the host's slider, so
|
|
175
|
+
// the store and the slice pane follow), the others move their section.
|
|
176
|
+
this.sectionSubs.add(this.napari.getSlicePlaneMove$().subscribe(({ axis, value }) => {
|
|
177
|
+
if (axis === 'z')
|
|
178
|
+
this.sliceDrag$.next(Math.round(value));
|
|
179
|
+
else
|
|
180
|
+
this.sections.setPlane(axis, value);
|
|
181
|
+
}));
|
|
182
|
+
this.sectionSubs.add(this.store.getChannelStates().subscribe(() => this.sections.schedule()));
|
|
183
|
+
this.sectionSubs.add(this.store.getInvert().subscribe(() => this.sections.schedule()));
|
|
184
|
+
this.sectionSubs.add(this.store.getColormap().subscribe(() => this.sections.schedule()));
|
|
185
|
+
this.sectionSubs.add(this.store.getReverseScale().subscribe(() => this.sections.schedule()));
|
|
186
|
+
}
|
|
187
|
+
/** A class's colour: its classification colour, else its region source's, else a default. */
|
|
188
|
+
classColor(label) {
|
|
189
|
+
return (this.store.getClassificationColors().get(label) ??
|
|
190
|
+
this.regionStore.getRegionSourceView()?.colorOf({ label, color: null }) ??
|
|
191
|
+
'#ffcc00');
|
|
192
|
+
}
|
|
193
|
+
/** The sections beside the split volume view (nulls while it is not split). */
|
|
194
|
+
getSectionViews$() {
|
|
195
|
+
return this.sections.getViews$();
|
|
196
|
+
}
|
|
197
|
+
/** Move a section's plane to `at` (image px). */
|
|
198
|
+
setSectionPlane(axis, at) {
|
|
199
|
+
this.sections.setPlane(axis, at);
|
|
200
|
+
}
|
|
201
|
+
/** The slice picked by dragging the z plane in the volume: the host shows it (its slider). */
|
|
202
|
+
getSliceDrag$() {
|
|
203
|
+
return this.sliceDrag$.asObservable();
|
|
107
204
|
}
|
|
108
205
|
isImageType(t) {
|
|
109
206
|
return t === PlotType.IMAGE;
|
|
@@ -155,6 +252,14 @@ export class RoutingVisualizerService {
|
|
|
155
252
|
renderer() {
|
|
156
253
|
return this.lastRendered ?? this.plotly;
|
|
157
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* Backend region, tool and overlay calls act on: the slice pane's OSD while the volume view is
|
|
257
|
+
* split (regions are edited there), else the backend on screen. View calls (zoom, fit, colour,
|
|
258
|
+
* export) stay with {@link renderer}.
|
|
259
|
+
*/
|
|
260
|
+
regionBackend() {
|
|
261
|
+
return this.sliceMounted ? this.osd : this.renderer();
|
|
262
|
+
}
|
|
158
263
|
// System capabilities are Plotly's (the full-featured backend) so the UI
|
|
159
264
|
// keeps offering every plot type regardless of which one is on screen.
|
|
160
265
|
get capabilities() {
|
|
@@ -206,7 +311,17 @@ export class RoutingVisualizerService {
|
|
|
206
311
|
}
|
|
207
312
|
plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace) {
|
|
208
313
|
this.currentPlotType = plotType;
|
|
314
|
+
this.volumeView$.next(isNapariVolume(plotType) || isNapariIsosurface(plotType));
|
|
209
315
|
this.plottedFileName = imageInfo?.fileName;
|
|
316
|
+
this.plottedInfo = imageInfo ?? null;
|
|
317
|
+
this.plottedHeight = screenHeight;
|
|
318
|
+
// The slice pane belongs to the volume view: another plot type takes it down (OSD may be
|
|
319
|
+
// about to draw the main view, which must not find the pane's viewer still mounted).
|
|
320
|
+
if (!this.volumeView$.value)
|
|
321
|
+
this.unmountSlice();
|
|
322
|
+
// Region surfaces belong to the image they were built from: another image drops them.
|
|
323
|
+
if (this.classes3d$.value.length && this.plottedFileName !== this.classes3dImage)
|
|
324
|
+
this.clearRegionClasses3d();
|
|
210
325
|
this.plotDiv = plotDiv;
|
|
211
326
|
// Apply the per-image region cache (snapshot old regions, restore the new
|
|
212
327
|
// image's, clear selection) for whichever backend renders — Plotly does
|
|
@@ -224,7 +339,74 @@ export class RoutingVisualizerService {
|
|
|
224
339
|
this.lastRendered.reset();
|
|
225
340
|
}
|
|
226
341
|
this.lastRendered = next;
|
|
227
|
-
|
|
342
|
+
const plotted = next.plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace);
|
|
343
|
+
if (!this.sliceDiv || !this.volumeView$.value)
|
|
344
|
+
return plotted;
|
|
345
|
+
// The split volume view: the slice pane follows the image (a new one, or its sharper pass).
|
|
346
|
+
return plotted.then((ok) => {
|
|
347
|
+
if (ok && (!this.sliceMounted || this.sliceFile !== imageInfo?.fileName || inPlace)) {
|
|
348
|
+
void this.mountSlice(!!inPlace && this.sliceMounted && this.sliceFile === imageInfo?.fileName);
|
|
349
|
+
}
|
|
350
|
+
// The volume was assembled again (another image, or resolution): cut the sections from it.
|
|
351
|
+
if (ok)
|
|
352
|
+
this.sections.schedule();
|
|
353
|
+
return ok;
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Split the volume view: show the slice being edited in `div` (OpenSeadragon, with every region
|
|
358
|
+
* tool) beside the 3D view, or stop (null). Kept across re-plots of a volume view; another plot
|
|
359
|
+
* type takes the pane down and a volume view brings it back. Resolves whether the pane shows.
|
|
360
|
+
*/
|
|
361
|
+
async setSliceEditor(div) {
|
|
362
|
+
this.sliceDiv = div;
|
|
363
|
+
if (this.sliceEditor$.value !== !!div)
|
|
364
|
+
this.sliceEditor$.next(!!div);
|
|
365
|
+
if (!div) {
|
|
366
|
+
this.unmountSlice();
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
return this.mountSlice(false);
|
|
370
|
+
}
|
|
371
|
+
/** Mount (or refresh in place) OSD in the slice pane on the displayed slice. */
|
|
372
|
+
async mountSlice(inPlace) {
|
|
373
|
+
const div = this.sliceDiv;
|
|
374
|
+
const info = this.plottedInfo;
|
|
375
|
+
if (!div || !info?.urls?.length || !this.volumeView$.value)
|
|
376
|
+
return false;
|
|
377
|
+
const request = ++this.sliceRequest;
|
|
378
|
+
try {
|
|
379
|
+
const loaded = await this.osd.load(info, this.currentZIndex);
|
|
380
|
+
if (request !== this.sliceRequest)
|
|
381
|
+
return false;
|
|
382
|
+
const ok = await this.osd.plot(div, loaded, info, this.plottedHeight, PlotType.IMAGE, inPlace);
|
|
383
|
+
if (request !== this.sliceRequest)
|
|
384
|
+
return false;
|
|
385
|
+
this.sliceMounted = ok;
|
|
386
|
+
this.sliceFile = info.fileName;
|
|
387
|
+
if (ok) {
|
|
388
|
+
// The slice may have moved while the pane loaded.
|
|
389
|
+
this.osd.setZIndex(this.currentZIndex);
|
|
390
|
+
this.trackLiveClasses();
|
|
391
|
+
this.sections.start();
|
|
392
|
+
}
|
|
393
|
+
return ok;
|
|
394
|
+
}
|
|
395
|
+
catch (err) {
|
|
396
|
+
if (request === this.sliceRequest)
|
|
397
|
+
console.warn('[visualizer] The slice pane could not show the image.', err);
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/** Take the slice pane's viewer down (the split stays wanted while {@link sliceDiv} is set). */
|
|
402
|
+
unmountSlice() {
|
|
403
|
+
this.sliceRequest++;
|
|
404
|
+
if (this.sliceMounted) {
|
|
405
|
+
this.osd.reset();
|
|
406
|
+
this.sections.stop();
|
|
407
|
+
}
|
|
408
|
+
this.sliceMounted = false;
|
|
409
|
+
this.sliceFile = undefined;
|
|
228
410
|
}
|
|
229
411
|
reloadAndPlot() {
|
|
230
412
|
this.plotly.reloadAndPlot();
|
|
@@ -257,6 +439,8 @@ export class RoutingVisualizerService {
|
|
|
257
439
|
}
|
|
258
440
|
setDragMode(mode) {
|
|
259
441
|
this.renderer().setDragMode(mode);
|
|
442
|
+
if (this.sliceMounted)
|
|
443
|
+
this.osd.setDragMode(mode);
|
|
260
444
|
}
|
|
261
445
|
/** Every backend, on screen or not. */
|
|
262
446
|
backends() {
|
|
@@ -285,6 +469,10 @@ export class RoutingVisualizerService {
|
|
|
285
469
|
setZIndex(zIndex) {
|
|
286
470
|
this.currentZIndex = zIndex;
|
|
287
471
|
this.renderer().setZIndex(zIndex);
|
|
472
|
+
if (this.sliceMounted) {
|
|
473
|
+
this.osd.setZIndex(zIndex);
|
|
474
|
+
this.sections.schedule();
|
|
475
|
+
}
|
|
288
476
|
}
|
|
289
477
|
getTrueImageSize() {
|
|
290
478
|
return this.renderer().getTrueImageSize();
|
|
@@ -306,6 +494,7 @@ export class RoutingVisualizerService {
|
|
|
306
494
|
}
|
|
307
495
|
setPlotType(plotType) {
|
|
308
496
|
this.currentPlotType = plotType;
|
|
497
|
+
this.volumeView$.next(isNapariVolume(plotType) || isNapariIsosurface(plotType));
|
|
309
498
|
this.plotly.setPlotType(plotType);
|
|
310
499
|
}
|
|
311
500
|
/** @deprecated Use `getSurface3dControls()`. */
|
|
@@ -482,6 +671,290 @@ export class RoutingVisualizerService {
|
|
|
482
671
|
getGeoJsonString(regions) {
|
|
483
672
|
return this.regionStore.getGeoJsonString(regions);
|
|
484
673
|
}
|
|
674
|
+
/** Hold a large region set as a tiled region source (see RegionStore.attachRegionSource). */
|
|
675
|
+
attachRegionSource(source, slices) {
|
|
676
|
+
this.regionStore.attachRegionSource(source, slices);
|
|
677
|
+
}
|
|
678
|
+
async importRegionSource(geoJsonStr) {
|
|
679
|
+
if (geoJsonStr.length < (this.config?.regionSourceMinChars ?? REGION_SOURCE_MIN_CHARS))
|
|
680
|
+
return false;
|
|
681
|
+
let opened = await openGeoJsonRegionSource(geoJsonStr);
|
|
682
|
+
// The first open is the one just made; a source closed to save memory parses again.
|
|
683
|
+
this.regionStore.attachRegionSource(() => {
|
|
684
|
+
const source = opened;
|
|
685
|
+
opened = null;
|
|
686
|
+
return source ? Promise.resolve(source) : openGeoJsonRegionSource(geoJsonStr);
|
|
687
|
+
});
|
|
688
|
+
return true;
|
|
689
|
+
}
|
|
690
|
+
dropRegionSource() {
|
|
691
|
+
return this.regionStore.dropSliceRegionSource();
|
|
692
|
+
}
|
|
693
|
+
/**
|
|
694
|
+
* A ticket for a region import that is about to read or decode its files: the import methods
|
|
695
|
+
* given it change nothing once it is stale — another import took a ticket since, another image
|
|
696
|
+
* was plotted, or the service was destroyed — so an import that finishes late never lands on an
|
|
697
|
+
* image it was not started for.
|
|
698
|
+
*/
|
|
699
|
+
regionImportTicket() {
|
|
700
|
+
this.importTicket = { id: this.importTicket.id + 1, image: this.importImageKey() };
|
|
701
|
+
return this.importTicket.id;
|
|
702
|
+
}
|
|
703
|
+
/** Whether `ticket` is still the current import's, on the image it was taken for. */
|
|
704
|
+
importTicketValid(ticket) {
|
|
705
|
+
return ticket === this.importTicket.id && this.importTicket.image === this.importImageKey();
|
|
706
|
+
}
|
|
707
|
+
importImageKey() {
|
|
708
|
+
return RegionScopeCache.imageKey(this.plottedInfo ?? undefined);
|
|
709
|
+
}
|
|
710
|
+
/**
|
|
711
|
+
* Replace the image's regions and region sources with one source per slice, as an imported label
|
|
712
|
+
* volume or folder of per-slice region files gives them: `openers` by slice index, each opened
|
|
713
|
+
* the first time its slice is shown. A single image takes slice 0's. Returns how many slices
|
|
714
|
+
* have a source, or null (changing nothing) when `ticket` is stale (see
|
|
715
|
+
* {@link regionImportTicket}). The sources are marked imported, so a save writes every slice.
|
|
716
|
+
*/
|
|
717
|
+
importSliceRegionSources(openers, ticket) {
|
|
718
|
+
if (ticket !== undefined && !this.importTicketValid(ticket))
|
|
719
|
+
return null;
|
|
720
|
+
this.regionImportTicket(); // supersedes any import still in flight
|
|
721
|
+
const info = this.plottedInfo;
|
|
722
|
+
this.regionStore.detachRegionSources();
|
|
723
|
+
if (!info?.isStack) {
|
|
724
|
+
const first = openers.get(0) ?? openers.values().next().value;
|
|
725
|
+
this.regionStore.setRegions([]);
|
|
726
|
+
this.regionStore.resetUndoHistory();
|
|
727
|
+
if (!first)
|
|
728
|
+
return 0;
|
|
729
|
+
this.regionStore.attachRegionSource(first, { slice: 0 }, true);
|
|
730
|
+
return 1;
|
|
731
|
+
}
|
|
732
|
+
this.enterImportedStack(info);
|
|
733
|
+
for (const [z, open] of openers)
|
|
734
|
+
this.regionStore.attachRegionSource(open, { slice: z }, true);
|
|
735
|
+
return openers.size;
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* Replace the image's regions and region sources with one imported source (a region set the
|
|
739
|
+
* host's server serves): over every slice of a stack when it is z-indexed, else on the slice
|
|
740
|
+
* shown, as {@link applyImageRois} lays out an image's own. Resolves false, changing nothing
|
|
741
|
+
* (and disposing the source), when the import went stale while it opened: another import, or
|
|
742
|
+
* another image (see {@link regionImportTicket}; one is taken here when `ticket` is not given).
|
|
743
|
+
*/
|
|
744
|
+
async importRegionSourceOpener(open, ticket) {
|
|
745
|
+
const mine = ticket ?? this.regionImportTicket();
|
|
746
|
+
if (!this.importTicketValid(mine))
|
|
747
|
+
return false;
|
|
748
|
+
let first = await open();
|
|
749
|
+
if (!this.importTicketValid(mine)) {
|
|
750
|
+
first.dispose();
|
|
751
|
+
return false;
|
|
752
|
+
}
|
|
753
|
+
const reuse = () => {
|
|
754
|
+
const source = first;
|
|
755
|
+
first = null;
|
|
756
|
+
return source ? Promise.resolve(source) : open();
|
|
757
|
+
};
|
|
758
|
+
const info = this.plottedInfo;
|
|
759
|
+
const planes = first.info.planes;
|
|
760
|
+
const zIndexed = !!info?.isStack && planes.some((p) => p !== 0);
|
|
761
|
+
this.regionStore.detachRegionSources();
|
|
762
|
+
if (zIndexed) {
|
|
763
|
+
this.enterImportedStack(info);
|
|
764
|
+
this.regionStore.attachRegionSource(reuse, 'planes', [...planes]);
|
|
765
|
+
return true;
|
|
766
|
+
}
|
|
767
|
+
this.regionStore.setRegions([]);
|
|
768
|
+
this.regionStore.resetUndoHistory();
|
|
769
|
+
this.regionStore.attachRegionSource(reuse, { slice: this.regionStore.getDisplaySlice() }, true);
|
|
770
|
+
return true;
|
|
771
|
+
}
|
|
772
|
+
/** Empty every slice of a stack (its regions and undo history) for regions imported over it. */
|
|
773
|
+
enterImportedStack(info) {
|
|
774
|
+
const layout = this.regionStore.isStackMode()
|
|
775
|
+
? this.regionStore.getStackSaveLayout()
|
|
776
|
+
: info.tiled === false
|
|
777
|
+
? 'per-slice-file'
|
|
778
|
+
: 'combined';
|
|
779
|
+
this.regionStore.enterStackMode(new Map(), this.regionStore.getDisplaySlice(), layout);
|
|
780
|
+
}
|
|
781
|
+
getRegionSourceView$() {
|
|
782
|
+
return this.regionStore.getRegionSourceView$();
|
|
783
|
+
}
|
|
784
|
+
getRegionSourceIndex(query) {
|
|
785
|
+
return this.regionStore.getRegionSourceIndex(query);
|
|
786
|
+
}
|
|
787
|
+
selectSourceFeatures(ids, additive) {
|
|
788
|
+
return this.regionStore.selectSourceFeatures(ids, additive);
|
|
789
|
+
}
|
|
790
|
+
deleteSourceFeatures(ids) {
|
|
791
|
+
this.regionStore.deleteSourceFeatures(ids);
|
|
792
|
+
}
|
|
793
|
+
getRegionStyle$() {
|
|
794
|
+
return this.regionStore.getRegionStyle$();
|
|
795
|
+
}
|
|
796
|
+
setRegionStyle(patch) {
|
|
797
|
+
this.regionStore.setRegionStyle(patch);
|
|
798
|
+
}
|
|
799
|
+
// ── Regions in 3D: their reconstructions shown in the volume view ─────
|
|
800
|
+
/** Whether a napari volume (or isosurface) view is on screen: regions can be shown in 3D. */
|
|
801
|
+
getVolumeView$() {
|
|
802
|
+
return this.volumeView$.asObservable();
|
|
803
|
+
}
|
|
804
|
+
/** Whether the volume view's slice pane is wanted (it shows while a volume view is on screen). */
|
|
805
|
+
getSliceEditor$() {
|
|
806
|
+
return this.sliceEditor$.asObservable();
|
|
807
|
+
}
|
|
808
|
+
/** Whether the volume view draws the region reconstructions through the volume. */
|
|
809
|
+
getRegionsThroughVolume$() {
|
|
810
|
+
return this.regionsThroughVolume$.asObservable();
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* Draw the region reconstructions through the volume (it hides none of them: surfaces inside its
|
|
814
|
+
* bright structures, an OCT's layer boundaries) or hidden behind what it shows (the default).
|
|
815
|
+
*/
|
|
816
|
+
setRegionsThroughVolume(through) {
|
|
817
|
+
if (this.regionsThroughVolume$.value === through)
|
|
818
|
+
return;
|
|
819
|
+
this.regionsThroughVolume$.next(through);
|
|
820
|
+
this.napari.setRegionsThroughVolume(through);
|
|
821
|
+
}
|
|
822
|
+
/** The class groups shown in 3D on this image ([] after a switch to another image). */
|
|
823
|
+
getRegionClasses3d$() {
|
|
824
|
+
return this.classes3d$.asObservable();
|
|
825
|
+
}
|
|
826
|
+
/** Hide every region surface and forget them (a build still running is dropped). */
|
|
827
|
+
clearRegionClasses3d() {
|
|
828
|
+
this.meshRequest++;
|
|
829
|
+
this.shown3d = [];
|
|
830
|
+
this.classes3d$.next([]);
|
|
831
|
+
this.classes3dImage = undefined;
|
|
832
|
+
this.napari.setRegionMeshes([], undefined);
|
|
833
|
+
this.napari.setRegionHighlight([]);
|
|
834
|
+
}
|
|
835
|
+
/** Highlight the surfaces of these group keys in the volume view (none: all as usual). */
|
|
836
|
+
highlightRegionClasses3d(keys) {
|
|
837
|
+
this.napari.setRegionHighlight(keys);
|
|
838
|
+
}
|
|
839
|
+
/** A surface clicked in the volume view with the selection tool (its group key), or none (null). */
|
|
840
|
+
getRegionPicked3d$() {
|
|
841
|
+
return this.napari.getRegionMeshPick$();
|
|
842
|
+
}
|
|
843
|
+
/**
|
|
844
|
+
* Show these groups of classes in the volume view as 3D reconstructions (each group one surface
|
|
845
|
+
* in its colour: an atlas structure with its substructures), and only these; [] hides them.
|
|
846
|
+
* Reconstructed from every slice's outlines at the volume's resolution, cached per image.
|
|
847
|
+
*/
|
|
848
|
+
async showRegionClasses3d(groups) {
|
|
849
|
+
const request = ++this.meshRequest;
|
|
850
|
+
this.classes3dImage = this.plottedFileName;
|
|
851
|
+
this.shown3d = groups;
|
|
852
|
+
// What an edit from now on is compared with (the live slice may not have changed yet).
|
|
853
|
+
this.liveClasses = null;
|
|
854
|
+
this.trackLiveClasses();
|
|
855
|
+
this.classes3d$.next(groups.map((g) => ({ key: g.key, classes: g.classes })));
|
|
856
|
+
const width = this.getTrueImageSize()?.width ?? 1024;
|
|
857
|
+
const step = this.napari.regionVoxelStep() ?? Math.max(1, width / 256);
|
|
858
|
+
const image = this.plottedFileName ?? '';
|
|
859
|
+
const cacheKey = (g) => `${image}|${step.toFixed(3)}|${g.classes.join(',')}`;
|
|
860
|
+
const missing = groups.filter((g) => !this.meshCache.has(cacheKey(g)));
|
|
861
|
+
if (missing.length) {
|
|
862
|
+
const names = missing.map((g) => g.key);
|
|
863
|
+
const what = names.length > 3 ? `${names.length} regions` : names.join(', ');
|
|
864
|
+
const done = this.napari.beginTask(`Building ${what} in 3D…`);
|
|
865
|
+
try {
|
|
866
|
+
const built = await this.regionStore.reconstructClasses(missing.map((g) => ({ key: cacheKey(g), classes: g.classes })), step);
|
|
867
|
+
const classesOf = new Map(missing.map((g) => [cacheKey(g), g.classes]));
|
|
868
|
+
for (const b of built)
|
|
869
|
+
this.meshCache.set(b.key, { mesh: b.mesh, classes: classesOf.get(b.key) ?? [] });
|
|
870
|
+
}
|
|
871
|
+
finally {
|
|
872
|
+
done();
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
if (request !== this.meshRequest)
|
|
876
|
+
return;
|
|
877
|
+
this.napari.setRegionMeshes(groups.map((g) => {
|
|
878
|
+
const mesh = this.meshCache.get(cacheKey(g)).mesh;
|
|
879
|
+
return { key: g.key, color: g.color, label: g.label, vertices: mesh.vertices, faces: mesh.faces };
|
|
880
|
+
}), this.plottedFileName);
|
|
881
|
+
}
|
|
882
|
+
/**
|
|
883
|
+
* The regions changed: when the live slice's regions of some classes did (an edit, an undo, not
|
|
884
|
+
* a slice or image switch), their reconstructions are stale. They are dropped, and those shown
|
|
885
|
+
* in 3D are rebuilt once the edits pause.
|
|
886
|
+
*/
|
|
887
|
+
onRegionsChanged() {
|
|
888
|
+
// Nothing follows the edits (no surface built or shown, no sections): skip the fingerprints.
|
|
889
|
+
if (!this.sliceMounted && !this.shown3d.length && !this.meshCache.size) {
|
|
890
|
+
this.liveClasses = null;
|
|
891
|
+
return;
|
|
892
|
+
}
|
|
893
|
+
const before = this.liveClasses;
|
|
894
|
+
this.liveClasses = null;
|
|
895
|
+
const now = this.trackLiveClasses();
|
|
896
|
+
// Another slice or image came up: no region changed (the sections recut for the slice).
|
|
897
|
+
if (!before || before.at !== now.at)
|
|
898
|
+
return;
|
|
899
|
+
const changed = changedClasses(before.signatures, now.signatures);
|
|
900
|
+
// Source features deleted (or that undone) change no live region, and which classes they were
|
|
901
|
+
// is not known here: every class is stale. A feature taken shows as its class's change.
|
|
902
|
+
const everyClass = !changed.size && before.sources !== now.sources;
|
|
903
|
+
if (!changed.size && !everyClass)
|
|
904
|
+
return;
|
|
905
|
+
const touched = (c) => everyClass || changed.has(c);
|
|
906
|
+
if (this.sliceMounted)
|
|
907
|
+
this.sections.regionsChanged();
|
|
908
|
+
for (const [key, entry] of [...this.meshCache]) {
|
|
909
|
+
if (entry.classes.some(touched))
|
|
910
|
+
this.meshCache.delete(key);
|
|
911
|
+
}
|
|
912
|
+
if (!this.shown3d.some((g) => g.classes.some(touched)))
|
|
913
|
+
return;
|
|
914
|
+
if (this.rebuildTimer)
|
|
915
|
+
clearTimeout(this.rebuildTimer);
|
|
916
|
+
this.rebuildTimer = setTimeout(() => {
|
|
917
|
+
this.rebuildTimer = null;
|
|
918
|
+
if (this.shown3d.length && this.classes3dImage === this.plottedFileName) {
|
|
919
|
+
void this.showRegionClasses3d(this.shown3d);
|
|
920
|
+
}
|
|
921
|
+
}, REGION_SURFACE_REBUILD_MS);
|
|
922
|
+
}
|
|
923
|
+
/** Fingerprint the live slice's classes, unless already: what the next edit is compared with. */
|
|
924
|
+
trackLiveClasses() {
|
|
925
|
+
this.liveClasses ??= {
|
|
926
|
+
at: this.liveSliceKey(),
|
|
927
|
+
signatures: classSignatures(this.regionStore.getRegions()),
|
|
928
|
+
sources: this.regionStore.getSourceStateKey(),
|
|
929
|
+
};
|
|
930
|
+
return this.liveClasses;
|
|
931
|
+
}
|
|
932
|
+
/** Which slice of which image the live regions are. */
|
|
933
|
+
liveSliceKey() {
|
|
934
|
+
return `${this.regionStore.getDisplaySlice()}\n${this.plottedFileName ?? ''}`;
|
|
935
|
+
}
|
|
936
|
+
/** Each class's volume over the whole stack, in px² × slices (see RegionStore.classVolumes). */
|
|
937
|
+
async getClassVolumes(classes) {
|
|
938
|
+
return Object.fromEntries(await this.regionStore.classVolumes(classes));
|
|
939
|
+
}
|
|
940
|
+
getRegionSourceClassCounts(stack) {
|
|
941
|
+
return this.regionStore.getRegionSourceClassCounts(stack);
|
|
942
|
+
}
|
|
943
|
+
getHiddenClasses$() {
|
|
944
|
+
return this.regionStore.getHiddenClasses$();
|
|
945
|
+
}
|
|
946
|
+
setClassesHidden(classes, hidden) {
|
|
947
|
+
this.regionStore.setClassesHidden(classes, hidden);
|
|
948
|
+
// A surface is its class's (its group key is the class name).
|
|
949
|
+
this.napari.setRegionHidden([...this.regionStore.getHiddenClasses()]);
|
|
950
|
+
this.sections.schedule();
|
|
951
|
+
}
|
|
952
|
+
async selectRegionClasses(classes, additive) {
|
|
953
|
+
await this.regionStore.selectClasses(classes, additive);
|
|
954
|
+
}
|
|
955
|
+
getGeoJsonStringWithSource(regions, slice) {
|
|
956
|
+
return this.regionStore.getGeoJsonWithSource(regions, slice);
|
|
957
|
+
}
|
|
485
958
|
// ── Per-slice z-stack regions (jit-ui#93), from the shared RegionStore. ──
|
|
486
959
|
enterStackMode(slices, initialZ, saveLayout) {
|
|
487
960
|
this.regionStore.enterStackMode(slices, initialZ, saveLayout);
|
|
@@ -492,6 +965,10 @@ export class RoutingVisualizerService {
|
|
|
492
965
|
isStackMode() {
|
|
493
966
|
return this.regionStore.isStackMode();
|
|
494
967
|
}
|
|
968
|
+
/** The slice the regions are shown for (recorded outside stack mode too). */
|
|
969
|
+
getDisplaySlice() {
|
|
970
|
+
return this.regionStore.getDisplaySlice();
|
|
971
|
+
}
|
|
495
972
|
getStackSaveLayout() {
|
|
496
973
|
return this.regionStore.getStackSaveLayout();
|
|
497
974
|
}
|
|
@@ -568,56 +1045,56 @@ export class RoutingVisualizerService {
|
|
|
568
1045
|
// ── tools → active renderer (run on either backend) ─────────────────
|
|
569
1046
|
// The wand, vertex eraser and zoom-to-box are implemented on both backends
|
|
570
1047
|
// via ICoordinateTransform (+ a viewport pixel readback for the wand), so they
|
|
571
|
-
// follow the active renderer.
|
|
1048
|
+
// follow the active renderer — the slice pane's while the volume view is split.
|
|
572
1049
|
setActiveTool(id, options) {
|
|
573
|
-
this.
|
|
1050
|
+
this.regionBackend().setActiveTool(id, options);
|
|
574
1051
|
}
|
|
575
1052
|
/** @deprecated Use {@link setActiveTool}. */
|
|
576
1053
|
setWandMode(active, options) {
|
|
577
|
-
this.
|
|
1054
|
+
this.regionBackend().setWandMode(active, options);
|
|
578
1055
|
}
|
|
579
1056
|
setWandOptions(options) {
|
|
580
|
-
this.
|
|
1057
|
+
this.regionBackend().setWandOptions(options);
|
|
581
1058
|
}
|
|
582
1059
|
clearActiveWandRegion() {
|
|
583
|
-
this.
|
|
1060
|
+
this.regionBackend().clearActiveWandRegion();
|
|
584
1061
|
}
|
|
585
1062
|
/** @deprecated Use {@link setActiveTool}. */
|
|
586
1063
|
setBrushMode(active, options) {
|
|
587
|
-
this.
|
|
1064
|
+
this.regionBackend().setBrushMode(active, options);
|
|
588
1065
|
}
|
|
589
1066
|
setBrushOptions(options) {
|
|
590
|
-
this.
|
|
1067
|
+
this.regionBackend().setBrushOptions(options);
|
|
591
1068
|
}
|
|
592
1069
|
/** @deprecated Use {@link setActiveTool}. */
|
|
593
1070
|
setVertexEraserMode(active) {
|
|
594
|
-
this.
|
|
1071
|
+
this.regionBackend().setVertexEraserMode(active);
|
|
595
1072
|
}
|
|
596
1073
|
setVertexEraserRadius(radius) {
|
|
597
|
-
this.
|
|
1074
|
+
this.regionBackend().setVertexEraserRadius(radius);
|
|
598
1075
|
}
|
|
599
1076
|
/** @deprecated Use {@link setActiveTool}. */
|
|
600
1077
|
setZoomToBoxMode(active) {
|
|
601
|
-
this.
|
|
1078
|
+
this.regionBackend().setZoomToBoxMode(active);
|
|
602
1079
|
}
|
|
603
1080
|
segmentRectangles() {
|
|
604
|
-
return this.
|
|
1081
|
+
return this.regionBackend().segmentRectangles();
|
|
605
1082
|
}
|
|
606
1083
|
segmentRectanglesCellpose() {
|
|
607
|
-
return this.
|
|
1084
|
+
return this.regionBackend().segmentRectanglesCellpose();
|
|
608
1085
|
}
|
|
609
1086
|
setSamModel(id) {
|
|
610
|
-
this.
|
|
1087
|
+
this.regionBackend().setSamModel(id);
|
|
611
1088
|
}
|
|
612
1089
|
/** @deprecated Use {@link setActiveTool}. */
|
|
613
1090
|
setSamPointMode(active) {
|
|
614
|
-
this.
|
|
1091
|
+
this.regionBackend().setSamPointMode(active);
|
|
615
1092
|
}
|
|
616
1093
|
commitSamPoints() {
|
|
617
|
-
this.
|
|
1094
|
+
this.regionBackend().commitSamPoints();
|
|
618
1095
|
}
|
|
619
1096
|
clearSamPoints() {
|
|
620
|
-
this.
|
|
1097
|
+
this.regionBackend().clearSamPoints();
|
|
621
1098
|
}
|
|
622
1099
|
// ── display options ──────────────────────────────────────────────────
|
|
623
1100
|
// State lives in the shared VisualizerStore — reads go straight to it.
|
|
@@ -699,12 +1176,13 @@ export class RoutingVisualizerService {
|
|
|
699
1176
|
this.store.setInvert(on);
|
|
700
1177
|
}
|
|
701
1178
|
/**
|
|
702
|
-
* The active backend's region overlay
|
|
1179
|
+
* The active backend's region overlay (the slice pane's while the volume view is split). Falls
|
|
1180
|
+
* back to Plotly's when the active backend
|
|
703
1181
|
* (OSD or napari-js) is selected but a plot isn't mounted yet, so callers always get a
|
|
704
1182
|
* usable overlay.
|
|
705
1183
|
*/
|
|
706
1184
|
getRegionOverlay() {
|
|
707
|
-
const r = this.
|
|
1185
|
+
const r = this.regionBackend();
|
|
708
1186
|
if (r === this.osd) {
|
|
709
1187
|
return this.osd.getRegionOverlay() ?? this.plotly.getRegionOverlay();
|
|
710
1188
|
}
|
|
@@ -750,8 +1228,14 @@ export class RoutingVisualizerService {
|
|
|
750
1228
|
* component for a `provideVisualization()` chain. The dataset subscription would
|
|
751
1229
|
* otherwise keep the whole isolated chain reachable from the root data port. */
|
|
752
1230
|
ngOnDestroy() {
|
|
1231
|
+
this.importTicket = { id: this.importTicket.id + 1, image: undefined }; // a late import changes nothing
|
|
753
1232
|
this.spatialFacade?.dispose();
|
|
754
1233
|
this.spatialFacade = null;
|
|
1234
|
+
this.regionUpdates.unsubscribe();
|
|
1235
|
+
this.sectionSubs.unsubscribe();
|
|
1236
|
+
this.sections.stop();
|
|
1237
|
+
if (this.rebuildTimer)
|
|
1238
|
+
clearTimeout(this.rebuildTimer);
|
|
755
1239
|
}
|
|
756
1240
|
/**
|
|
757
1241
|
* Intensity-profile sampling, whichever backend is on screen: the sampling is the
|
|
@@ -784,6 +1268,10 @@ export class RoutingVisualizerService {
|
|
|
784
1268
|
* buffers would otherwise outlive the view (for a component-scoped chain, forever).
|
|
785
1269
|
* Nothing is on screen afterwards, so the next plot starts from the default backend. */
|
|
786
1270
|
detach() {
|
|
1271
|
+
this.sliceRequest++;
|
|
1272
|
+
this.sections.stop();
|
|
1273
|
+
this.sliceMounted = false;
|
|
1274
|
+
this.sliceDiv = null;
|
|
787
1275
|
this.plotly.detach();
|
|
788
1276
|
this.osd.detach();
|
|
789
1277
|
this.napari.detach();
|
|
@@ -808,4 +1296,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
808
1296
|
type: Inject,
|
|
809
1297
|
args: [SPATIAL_DATA_PORT]
|
|
810
1298
|
}] }] });
|
|
811
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTXJDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUN4RyxPQUFPLEVBQ0wsUUFBUSxFQUVSLFVBQVUsRUFDVixlQUFlLEVBQ2YsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixNQUFNLHVCQUF1QixDQUFDO0FBZS9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxxQ0FBcUMsQ0FBQztBQUV6RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFLMUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7O0FB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a0hBN0JoQix3QkFBd0IsY0FEWCxNQUFNOzsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBdUI3QixNQUFNOzJCQUFDLFVBQVU7OzBCQU1qQixRQUFROzswQkFDUixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBQb2x5Z29uLCBSZWdpb24gfSBmcm9tICcuL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgQ2xhc3NQcmVzZXQsIFByZXNldFNldCB9IGZyb20gJy4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBQbG90bHlTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvcGxvdGx5L3Bsb3RseS5zZXJ2aWNlJztcbmltcG9ydCB7IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL29zZC9vcGVuc2VhZHJhZ29uLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQge1xuICBQbG90VHlwZSxcbiAgUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBpc05hcGFyaTNkLFxuICBpc05hcGFyaVNjYXR0ZXIsXG4gIGlzU3BhdGlhbE9taWNzLFxuICBpc1NwYXRpYWxPbWljczNkLFxufSBmcm9tICcuL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHtcbiAgSVZpZXdlckJhY2tlbmQsXG4gIElWaXN1YWxpemVyLFxuICBMb2FkZWRJbWFnZSxcbiAgUGl4ZWxEYXRhLFxuICBJbnRlbnNpdHlQcm9maWxlLFxuICBJSXNvc3VyZmFjZUNvbnRyb2xzLFxuICBJSW50ZW5zaXR5Q29udHJvbHMsXG4gIElTdXJmYWNlM2RDb250cm9scyxcbiAgSVNwYXRpYWxDb250cm9scyxcbiAgSUludGVuc2l0eVNhbXBsaW5nLFxuICBJT3NkVmlld09wdGlvbnMsXG4gIElWb2x1bWVSZXNvbHV0aW9uLFxufSBmcm9tICcuL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNQQVRJQUxfREFUQV9QT1JULCBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQgeyBDYW52YXNUb29sT3B0aW9ucywgQ29sb3JtYXBOb2RlLCBJQnJ1c2hPcHRpb25zLCBJV2FuZE9wdGlvbnMgfSBmcm9tICcuL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IFNwYXRpYWxDb250cm9sc0ZhY2FkZSB9IGZyb20gJy4vc3BhdGlhbC9zcGF0aWFsLWNvbnRyb2xzLmZhY2FkZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25FZGl0b3JBcGkgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbEhpc3RvZ3JhbUFwaSwgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBhdXRvV2luZG93RnJvbUhpc3RvZ3JhbSB9IGZyb20gJy4vY29udHJhY3RzL2ludGVuc2l0eSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgUGxvdE1vZGVWaWV3cG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgfSBmcm9tICcuL2ludGVuc2l0eS9pbnRlbnNpdHktcHJvZmlsZS5zZXJ2aWNlJztcblxuLyoqIEludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JcyBhcmUgb3duZWQgYnkgdGhlIGludGVuc2l0eSB0b29sLCBub3QgdGhlIGVkaXRvci5cbiAqICBQYWNrYWdlLWludGVybmFsIHByZWRpY2F0ZSAocHJvcGVydHktYmFzZWQgc28gaXQgYWxzbyBtYXRjaGVzIHBsYWluIG9iamVjdHNcbiAqICBhZnRlciBhIGRyYWcgcm91bmQtdHJpcCkuICovXG5mdW5jdGlvbiBpc1Byb2ZpbGVSZWdpb24ocjogeyBraW5kPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiByPy5raW5kID09PSAncHJvZmlsZSc7XG59XG5cbi8qKlxuICogVGhlIHZpc3VhbGl6ZXIgY2hhaW4ncyBmcm9udCBkb29yOiBpbXBsZW1lbnRzIGBJVmlzdWFsaXplcmAsIGBJUmVnaW9uRWRpdG9yQXBpYFxuICogYW5kIGBJQ2hhbm5lbEhpc3RvZ3JhbUFwaWAgKGJvdW5kIHRvIHRoZSBgVklTVUFMSVpFUmAgLyBgUkVHSU9OX0VESVRPUl9BUElgIC9cbiAqIGBDSEFOTkVMX0hJU1RPR1JBTV9BUElgIHRva2Vucykgb3ZlciB0aHJlZSByZW5kZXJpbmcgYmFja2VuZHMsIGNob3NlbiBwZXIgcGxvdCB0eXBlOlxuICogIC0gKipJbWFnZSoqIHJlbmRlcnMgdGhyb3VnaCBPcGVuU2VhZHJhZ29uIChuYXRpdmVseSB0aWxlZCwgcmVnaW9uIHRvb2xzLFxuICogICAgY2xpZW50LXNpZGUgY29sb3JtYXApLCBvciB0aHJvdWdoIG5hcGFyaS1qcyB3aGVuIGBWaXpDb25maWcudXNlTmFwYXJpUmVuZGVyZXJgXG4gKiAgICBvcHRzIGluOyB0aGUgbmFwYXJpIGltYWdlIHR5cGVzIGFuZCB0aGUgMkQgc3BhdGlhbC1vbWljcyBtb2RlIHJlbmRlciB0aHJvdWdoXG4gKiAgICBuYXBhcmktanMuIEEgZmFpbGVkIGxvYWQgZmFsbHMgYmFjayBuYXBhcmktanMg4oaSIE9TRCDihpIgUGxvdGx5IGZvciB0aGF0IGltYWdlIG9ubHlcbiAqICAgIChzZWUgYG5hcGFyaUZlbGxCYWNrYCAvIGBvc2RGZWxsQmFja2AsIGNsZWFyZWQgYnkgYHJlc2V0KClgKS5cbiAqICAtIHRoZSBuYXBhcmkgM0QgdHlwZXMgKHZvbHVtZSwgaXNvc3VyZmFjZSwgc3VyZmFjZSwgM0Qgc2NhdHRlciwgdGhlIDNEIHNwYXRpYWxcbiAqICAgIGNsb3VkKSByZW5kZXIgdGhyb3VnaCBuYXBhcmktanMsIGZhbGxpbmcgYmFjayB0byBQbG90bHkuXG4gKiAgLSBldmVyeSBvdGhlciBwbG90IHR5cGUgKGhlYXRtYXAsIGNvbnRvdXIsIHN1cmZhY2UsIHNjYXR0ZXIsIGxpbmUsIOKApikgcmVuZGVyc1xuICogICAgdGhyb3VnaCBQbG90bHkuXG4gKlxuICogT25seSByZW5kZXJpbmcgYW5kIHRoZSB2aWV3cG9ydCBhcmUgcm91dGVkIHRvIHRoZSBiYWNrZW5kIG9uIHNjcmVlbi4gUmVnaW9uIHN0YXRlXG4gKiBsaXZlcyBpbiB0aGUgc2hhcmVkIGBSZWdpb25TdG9yZWAgYW5kIGRpc3BsYXkgc3RhdGUgKGNvbG9ybWFwLCBjaGFubmVscywgcHJlc2V0cyxcbiAqIHNwYXRpYWwgdmlldykgaW4gdGhlIHNoYXJlZCBgVmlzdWFsaXplclN0b3JlYCwgc28gZXZlcnkgYmFja2VuZCBzZWVzIHRoZSBzYW1lXG4gKiB2YWx1ZXM7IHRoZSBiYWNrZW5kcyBzdWJzY3JpYmUgdG8gdGhlbSB0byByZWRyYXcuXG4gKlxuICogUGFja2FnZS1pbnRlcm5hbDogaG9zdHMgZGVwZW5kIG9uIHRoZSB0b2tlbnMsIG5vdCBvbiB0aGlzIGNsYXNzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSBpbXBsZW1lbnRzIElWaXN1YWxpemVyLCBJUmVnaW9uRWRpdG9yQXBpLCBJQ2hhbm5lbEhpc3RvZ3JhbUFwaSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gIHByaXZhdGUgbGFzdFJlbmRlcmVkOiBJVmlld2VyQmFja2VuZCB8IG51bGwgPSBudWxsO1xuICAvKiogT1NEIGZhaWxlZCBmb3IgdGhlICpjdXJyZW50KiByZW5kZXIgY3ljbGUgKGUuZy4gYSBmcmVzaCBmaWxlIHN0aWxsIGNhY2hpbmdcbiAgICogIHBhc3QgdGhlIGRlYWRsaW5lKSDihpIgZmFsbCBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSBvbmx5LiBSZXNldCBieVxuICAgKiAgcmVzZXQoKSBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgcmVuZGVyIGN5Y2xlLCBzbyB0aGUgbmV4dCBmaWxlIOKAlCBvciBhXG4gICAqICByZS1zZWxlY3Qgb25jZSB0aGUgZmlsZSBpcyBjYWNoZWQg4oCUIHJldHJpZXMgT1NELiAoV2FzIGEgcGVybWFuZW50IGZsYWcsXG4gICAqICB3aGljaCBsZWZ0IHRoZSB3aG9sZSBzZXNzaW9uIHN0dWNrIG9uIFBsb3RseSBhZnRlciBvbmUgc2xvdyBsb2FkLikgKi9cbiAgcHJpdmF0ZSBvc2RGZWxsQmFjayA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGZhaWxlZCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyIGN5Y2xlIOKGkiBmYWxsIGJhY2sgdG8gT1NEICh0aGVuIFBsb3RseSkuXG4gICAqICBSZXNldCBieSByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSBjeWNsZSwgbGlrZSB7QGxpbmsgb3NkRmVsbEJhY2t9LiAqL1xuICBwcml2YXRlIG5hcGFyaUZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBUaGUgZmlsZSBuYW1lIG9mIHRoZSBpbWFnZSBsYXN0IHBsb3R0ZWQgKG5hbWVzIGEgR2VvSlNPTiBleHBvcnQpLiAqL1xuICBwcml2YXRlIHBsb3R0ZWRGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIGRpdiB0aGUgYmFja2VuZHMgcmVuZGVyIGludG8gKGV2ZXJ5IGJhY2tlbmQgc2hhcmVzIGl0KTsgJycgYmVmb3JlIHRoZSBmaXJzdCBwbG90LiAqL1xuICBwcml2YXRlIHBsb3REaXYgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBsb3RseTogUGxvdGx5U2VydmljZSxcbiAgICBwcml2YXRlIG9zZDogT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmFwYXJpOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBhIGhvc3QgdGhhdCBzZXJ2ZXMgbm8gc3BhdGlhbC1vbWljcyBkYXRhIGJpbmRzIG5vdGhpbmcsXG4gICAgLy8gYW5kIGBnZXRTcGF0aWFsQ29udHJvbHMoKWAgdGhlbiByZXR1cm5zIG51bGwuXG4gICAgcHJpdmF0ZSByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TdG9yZTogU3BhdGlhbFNlbGVjdGlvblN0b3JlLFxuICAgIHByaXZhdGUgaW50ZW5zaXR5OiBJbnRlbnNpdHlQcm9maWxlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpXG4gICAgcHJpdmF0ZSBzcGF0aWFsRGF0YTogU3BhdGlhbERhdGFQb3J0IHwgbnVsbCA9IG51bGwsXG4gICkge31cblxuICBwcml2YXRlIGlzSW1hZ2VUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHQgPT09IFBsb3RUeXBlLklNQUdFO1xuICB9XG5cbiAgLyoqIFRoZSAyRCBuYXBhcmkgdHlwZXMgKGltYWdlLCByZWdpb24tY2VudHJvaWQgc2NhdHRlciwgc3BhdGlhbCBvbWljcykg4oCUIGEgMkQgZmFsbGJhY2sgY2hhaW5cbiAgICogIChPU0QsIHRoZW4gUGxvdGx5KS5cbiAgICpcbiAgICogIE5PVEUgZm9yIFNQQVRJQUxfT01JQ1M6IG9ubHkgbmFwYXJpLWpzIGRyYXdzIHRoZSBvYnNlcnZhdGlvbiBtYXJrZXJzLiBJZiBpdCBmYWlscyAobm8gV2ViR1BVLFxuICAgKiAgZGV2aWNlIGxvc3MpIHRoZSBmYWxsYmFjayByZW5kZXJzIHRoZSB0aXNzdWUgaW1hZ2UgQUxPTkUg4oCUIHRoZSBzcGF0aWFsIGxheWVyIGlzIGFic2VudCwgbm90XG4gICAqICBkZWdyYWRlZC4gVGhhdCBpcyBkZWxpYmVyYXRlIGZvciBub3c6IHNob3dpbmcgdGhlIHNsaWRlIGJlYXRzIHNob3dpbmcgbm90aGluZywgYW5kIGEgUGxvdGx5XG4gICAqICBgc2NhdHRlcmdsYCBzcGF0aWFsIG1vZGUgaXMgdGhlIHBsYW5uZWQgcmVhbCBmYWxsYmFjayAoc2VlIHRoZSBwbG90LW1vZGUgZGVzaWduIGRvYykuICovXG4gIHByaXZhdGUgaXNOYXBhcmlJbWFnZVR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdCA9PT0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFIHx8IGlzTmFwYXJpU2NhdHRlcih0KSB8fCBpc1NwYXRpYWxPbWljcyh0KTtcbiAgfVxuXG4gIC8qKiBUaGUgM0QgbmFwYXJpIHR5cGVzICh2b2x1bWUvaXNvc3VyZmFjZS9zdXJmYWNlL3NjYXR0ZXIsIHBsdXMgdGhlIDNEIHNwYXRpYWwgY2xvdWQpIOKAlCBubyAyRFxuICAgKiAgZmFsbGJhY2sgZXhpc3RzIChPU0QgaXMgaW1hZ2Utb25seSksIHNvIHRoZXkgZmFsbCBzdHJhaWdodCB0byBQbG90bHkuICovXG4gIHByaXZhdGUgaXNOYXBhcmkzZFR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOYXBhcmkzZCh0KSB8fCBpc1NwYXRpYWxPbWljczNkKHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2tlbmQgdG8gYXR0ZW1wdCBmb3IgdGhlIGN1cnJlbnQgcGxvdCB0eXBlIHRoaXMgcmVuZGVyLiBUaGUgZmFsbGJhY2sgY2hhaW5zIGJlbG93IGFyZVxuICAgKiBtaXJyb3JlZCBleGFjdGx5IGJ5IHtAbGluayBsb2FkfSBzbyB0aGUgaGFuZGxlIGBwbG90KClgIHJlY2VpdmVzIGFsd2F5cyBjb21lcyBmcm9tIHRoZVxuICAgKiBiYWNrZW5kIGBwbG90KClgIHNlbGVjdHMgKG5vIGxvYWQvcGxvdCBiYWNrZW5kIG1pc21hdGNoKTpcbiAgICogIC0gMkQgaW1hZ2UgKGV4cGxpY2l0IGBOQVBBUklfSU1BR0VgLCBvciBgSU1BR0VgIHdpdGggdGhlIFdlYkdQVSBvcHQtaW4pOiBuYXBhcmktanMg4oaSIE9TRCDihpIgUGxvdGx5LlxuICAgKiAgLSBwbGFpbiBgSU1BR0VgIChubyBvcHQtaW4pOiBPU0Qg4oaSIFBsb3RseS5cbiAgICogIC0gM0QgbmFwYXJpIChgTkFQQVJJX1ZPTFVNRWAvYE5BUEFSSV9JU09TVVJGQUNFYCk6IG5hcGFyaS1qcyDihpIgUGxvdGx5IChPU0QgY2FuJ3QgcmVuZGVyIDNEKS5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VCYWNrZW5kKCk6IElWaWV3ZXJCYWNrZW5kIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50UGxvdFR5cGU7XG4gICAgLy8gMkQgaW1hZ2Ugd2l0aCBhIG5hcGFyaS1qcyBhdHRlbXB0IChleHBsaWNpdCBuYXBhcmkgaW1hZ2UsIG9yIG9wdC1pbiBvbiB0aGUgSW1hZ2UgdHlwZSkuXG4gICAgaWYgKHRoaXMuaXNOYXBhcmlJbWFnZVR5cGUodCkgfHwgKHRoaXMuaXNJbWFnZVR5cGUodCkgJiYgdGhpcy5jb25maWcudXNlTmFwYXJpUmVuZGVyZXIpKSB7XG4gICAgICBpZiAoIXRoaXMubmFwYXJpRmVsbEJhY2spIHJldHVybiB0aGlzLm5hcGFyaTtcbiAgICAgIGlmICghdGhpcy5vc2RGZWxsQmFjaykgcmV0dXJuIHRoaXMub3NkO1xuICAgICAgcmV0dXJuIHRoaXMucGxvdGx5O1xuICAgIH1cbiAgICAvLyBQbGFpbiBJbWFnZSB0eXBlIChubyBuYXBhcmkgb3B0LWluKTogT1NELCB0aGVuIFBsb3RseS5cbiAgICBpZiAodGhpcy5pc0ltYWdlVHlwZSh0KSkge1xuICAgICAgcmV0dXJuIHRoaXMub3NkRmVsbEJhY2sgPyB0aGlzLnBsb3RseSA6IHRoaXMub3NkO1xuICAgIH1cbiAgICAvLyAzRCBuYXBhcmkgdHlwZXM6IG5hcGFyaS1qcywgd2l0aCBQbG90bHkgYXMgdGhlIG9ubHkgdmlhYmxlIGZhbGxiYWNrLlxuICAgIGlmICh0aGlzLmlzTmFwYXJpM2RUeXBlKHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXBhcmlGZWxsQmFjayA/IHRoaXMucGxvdGx5IDogdGhpcy5uYXBhcmk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseTtcbiAgfVxuXG4gIC8qKiBCYWNrZW5kIGN1cnJlbnRseSBvbiBzY3JlZW4g4oCUIHdoYXQgb25nb2luZyB6b29tL3Rvb2wvcmVnaW9uIG9wcyBhY3Qgb24uICovXG4gIHByaXZhdGUgcmVuZGVyZXIoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIHJldHVybiB0aGlzLmxhc3RSZW5kZXJlZCA/PyB0aGlzLnBsb3RseTtcbiAgfVxuXG4gIC8vIFN5c3RlbSBjYXBhYmlsaXRpZXMgYXJlIFBsb3RseSdzICh0aGUgZnVsbC1mZWF0dXJlZCBiYWNrZW5kKSBzbyB0aGUgVUlcbiAgLy8ga2VlcHMgb2ZmZXJpbmcgZXZlcnkgcGxvdCB0eXBlIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIGlzIG9uIHNjcmVlbi5cbiAgZ2V0IGNhcGFiaWxpdGllcygpOiBWaWV3ZXJDYXBhYmlsaXRpZXMge1xuICAgIHJldHVybiB0aGlzLnBsb3RseS5jYXBhYmlsaXRpZXM7XG4gIH1cblxuICAvLyDilIDilIAgcmVuZGVyIC8gdmlld3BvcnQg4oaSIGFjdGl2ZSByZW5kZXJlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICAvLyBBIHN0YWNrIGNhbiBvcGVuIGF3YXkgZnJvbSBzbGljZSAwIChgaW5pdGlhbFpJbmRleGAg4oCUIGEgdm9sdW1lIG9wZW5zXG4gICAgLy8gbWlkLXNwZWNpbWVuKSwgYW5kIHRoYXQgYXJyaXZlcyBoZXJlIHJhdGhlciB0aGFuIHRocm91Z2ggc2V0WkluZGV4LlxuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICBjb25zdCBiYWNrZW5kID0gdGhpcy5pbWFnZUJhY2tlbmQoKTtcbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5uYXBhcmkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm5hcGFyaS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIEFib3J0ZWQ6IG5vYm9keSB3YW50cyB0aGlzIGltYWdlIGFueSBtb3JlLCBzbyBkb24ndCBnbyBvbiB0byBsb2FkIGl0IGVsc2V3aGVyZS5cbiAgICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgZXJyO1xuICAgICAgICB0aGlzLm5hcGFyaUZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgICAgLy8gTWlycm9yIGltYWdlQmFja2VuZCgpJ3MgZmFsbGJhY2sgc28gbG9hZCArIHBsb3QgcGljayB0aGUgc2FtZSBiYWNrZW5kOlxuICAgICAgICAvLyAgLSAzRCBuYXBhcmkgdHlwZXMgaGF2ZSBubyAyRCBmYWxsYmFjayDihpIgc3RyYWlnaHQgdG8gUGxvdGx5LlxuICAgICAgICAvLyAgLSAyRCBpbWFnZSDihpIgT1NELCB0aGVuIFBsb3RseS5cbiAgICAgICAgaWYgKHRoaXMuaXNOYXBhcmkzZFR5cGUodGhpcy5jdXJyZW50UGxvdFR5cGUpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gbmFwYXJpLWpzIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5LicsIGVycik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGxvdGx5LmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gbmFwYXJpLWpzIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gT3BlblNlYWRyYWdvbi4nLCBlcnIpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkVmlhT3NkVGhlblBsb3RseShpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhY2tlbmQgPT09IHRoaXMub3NkKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkVmlhT3NkVGhlblBsb3RseShpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogVHJ5IE9TRDsgb24gZmFpbHVyZSBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIChub3QgcGVybWFuZW50IOKAlCBzZWUgcmVzZXQoKSkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpYU9zZFRoZW5QbG90bHkoXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIHpJbmRleDogbnVtYmVyLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9zZC5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgZXJyO1xuICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gT3BlblNlYWRyYWdvbiBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZS4nLCBlcnIpO1xuICAgICAgdGhpcy5vc2RGZWxsQmFjayA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICB9XG4gIH1cbiAgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IHVua25vd24sXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBpblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgICB0aGlzLnBsb3R0ZWRGaWxlTmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICAvLyBBcHBseSB0aGUgcGVyLWltYWdlIHJlZ2lvbiBjYWNoZSAoc25hcHNob3Qgb2xkIHJlZ2lvbnMsIHJlc3RvcmUgdGhlIG5ld1xuICAgIC8vIGltYWdlJ3MsIGNsZWFyIHNlbGVjdGlvbikgZm9yIHdoaWNoZXZlciBiYWNrZW5kIHJlbmRlcnMg4oCUIFBsb3RseSBkb2VzXG4gICAgLy8gdGhpcyBpbnNpZGUgaXRzIG93biBwbG90KCksIGJ1dCBPU0QgZG9lc24ndCwgc28gZHJpdmUgaXQgaGVyZS4gSWRlbXBvdGVudFxuICAgIC8vIGZvciB0aGUgc2FtZSBpbWFnZSwgc28gaXQncyBzYWZlIHRvIGNhbGwgb24gZXZlcnkgKHJlKXBsb3QuXG4gICAgdGhpcy5wbG90bHkuc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvKTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pbWFnZUJhY2tlbmQoKTtcbiAgICAvLyBCb3RoIGJhY2tlbmRzIHNoYXJlIHRoZSBzYW1lIGRpdiDigJQgdGVhciBkb3duIHRoZSBvdXRnb2luZyBvbmUgb24gc3dpdGNoLlxuICAgIC8vIFBsb3RseSBtdXN0IGJlICpwdXJnZWQqIChub3QgcmVzZXQsIHdoaWNoIHJlLWRyYXdzIGVtcHR5IGF4ZXMpIGJlZm9yZSBPU0RcbiAgICAvLyB0YWtlcyB0aGUgZGl2LlxuICAgIGlmICh0aGlzLmxhc3RSZW5kZXJlZCAmJiB0aGlzLmxhc3RSZW5kZXJlZCAhPT0gbmV4dCkge1xuICAgICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkID09PSB0aGlzLnBsb3RseSkgdGhpcy5wbG90bHkucHVyZ2VQbG90KCk7XG4gICAgICBlbHNlIHRoaXMubGFzdFJlbmRlcmVkLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMubGFzdFJlbmRlcmVkID0gbmV4dDtcbiAgICByZXR1cm4gbmV4dC5wbG90KHBsb3REaXYsIGltYWdlTG9hZGVkLCBpbWFnZUluZm8sIHNjcmVlbkhlaWdodCwgcGxvdFR5cGUsIGluUGxhY2UpO1xuICB9XG4gIHJlbG9hZEFuZFBsb3QoKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkucmVsb2FkQW5kUGxvdCgpO1xuICB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IG9mIGEgcmVuZGVyIGN5Y2xlOiByZS1lbmFibGUgbmFwYXJpLWpzL09TRCBhdHRlbXB0cyAoY2xlYXIgYW55IHByaW9yXG4gICAgLy8gcGVyLWltYWdlIGZhbGxiYWNrKSBhbmQgdGVhciBkb3duIHdoYXRldmVyJ3Mgb24gc2NyZWVuLlxuICAgIHRoaXMub3NkRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLm5hcGFyaUZlbGxCYWNrID0gZmFsc2U7XG4gICAgdGhpcy5yZW5kZXJlcigpLnJlc2V0KCk7XG4gIH1cbiAgcmVsYXlvdXQodHJ1ZUltYWdlU2l6ZT86IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnJlbGF5b3V0KHRydWVJbWFnZVNpemUpO1xuICB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVzZXRBeGVzKCk7XG4gIH1cbiAgZml0VG9WaWV3KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5maXRUb1ZpZXcoKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBmaXRUb1ZpZXd9LiAqL1xuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy5maXRUb1ZpZXcoKTtcbiAgfVxuICB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnpvb21JbigpO1xuICB9XG4gIHpvb21PdXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnpvb21PdXQoKTtcbiAgfVxuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXREcmFnTW9kZShtb2RlKTtcbiAgfVxuICAvKiogRXZlcnkgYmFja2VuZCwgb24gc2NyZWVuIG9yIG5vdC4gKi9cbiAgcHJpdmF0ZSBiYWNrZW5kcygpOiBJVmlld2VyQmFja2VuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYXZpZ2F0b3IgLyBzbW9vdGhpbmcgb3B0aW9ucywgYXBwbGllZCB0byBFVkVSWSBiYWNrZW5kIHRoYXQgaGFzIHRoZW0gKG5vdFxuICAgKiBqdXN0IHRoZSBhY3RpdmUgcmVuZGVyZXIpOiBjb25zdW1lcnMgc2V0IHRoZW0gYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIsIHdoZW5cbiAgICogYHJlbmRlcmVyKClgIGlzIHN0aWxsIHRoZSBQbG90bHkgZGVmYXVsdCwgYW5kIE9TRC9uYXBhcmktanMgbXVzdCByZWNlaXZlIHRoZW1cbiAgICogdG8gaG9ub3VyIHRoZW0gYXQgdmlld2VyIGNyZWF0aW9uLlxuICAgKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy52aWV3T3B0aW9ucztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdPcHRpb25zOiBJT3NkVmlld09wdGlvbnMgPSB7XG4gICAgc2V0TmF2aWdhdG9yVmlzaWJsZTogKHZpc2libGUpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmJhY2tlbmRzKCkpIGIuZ2V0T3NkVmlld09wdGlvbnMoKT8uc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9LFxuICAgIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZDogKGVuYWJsZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmJhY2tlbmRzKCkpIGIuZ2V0T3NkVmlld09wdGlvbnMoKT8uc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICAgIH0sXG4gIH07XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYC4gKi9cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aWV3T3B0aW9ucy5zZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKClgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICB9XG4gIHNldFNob3dTdGFjayhzaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0U2hvd1N0YWNrKHNob3dzdGFjayk7XG4gIH1cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50WkluZGV4ID0gekluZGV4O1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXRaSW5kZXgoekluZGV4KTtcbiAgfVxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICB9XG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Q3VycmVudEltYWdlKCk7XG4gIH1cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk7XG4gIH1cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk7XG4gIH1cbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZG93bmxvYWRJbWFnZSgpO1xuICB9XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZXhwb3J0Q29tcG9zaXRlKCk7XG4gIH1cblxuICBzZXRQbG90VHlwZShwbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMucGxvdGx5LnNldFBsb3RUeXBlKHBsb3RUeXBlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRTdXJmYWNlM2RDb250cm9scygpYC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKG1vZGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4gKG5hcGFyaS1qcyksIGVsc2UgbnVsbC4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uc2V0KClgLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoc2NhbGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KClgLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LmdldCgpID8/IDE7XG4gIH1cbiAgLyoqIFRoZSB2aWV3cG9ydCBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIGZvciBhIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZS4gTnVsbFxuICAgKiAgd2hlbiB0aGF0IGJhY2tlbmQgY2Fubm90IHByb3ZpZGUgb25lIChlLmcuIE9TRCBmZWxsIGJhY2sgdG8gUGxvdGx5KS4gKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRQbG90TW9kZVZpZXdwb3J0Py4oKSA/PyBudWxsO1xuICB9XG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFBsb3RseSBlbnVtZXJhdGVzIHRoZSBmdWxsIFBMT1RfVFlQRV9ERVNDUklQVE9SUyBtYXAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgdGhlXG4gICAgLy8gbmFwYXJpLWpzIFdlYkdQVSB0eXBlcyAoaml0LXVpIzEwMikg4oCUIHNvIHRoaXMgc2luZ2xlIHNvdXJjZSBjb3ZlcnMgdGhlbSAobm8gZHVwbGljYXRlcykuXG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsb25nLWxpdmVkIG9ic2VydmFibGVzICsgc3RhY2sgZmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNldFN0YWNrTG9hZGluZyhiOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0U3RhY2tMb2FkaW5nKGIpO1xuICB9XG4gIC8vIENhbmNlbCBpbi1mbGlnaHQgbG9hZGluZyBvbiBldmVyeSBiYWNrZW5kIOKAlCB0aGUgdXNlcidzIENhbmNlbCBzaG91bGRuJ3QgZGVwZW5kIG9uIHdoaWNoIG9uZSBpc1xuICAvLyBhY3RpdmUuIE9ubHkgYmFja2VuZHMgdGhhdCBzdHJlYW0gZnJhbWVzIChuYXBhcmktanMpIGRvIHJlYWwgd29yazsgdGhlIHJlc3Qgbm8tb3AuIFRoZSBjb25jcmV0ZVxuICAvLyBiYWNrZW5kIGNsYXNzZXMgZG9uJ3QgYWxsIGRlY2xhcmUgdGhlIG9wdGlvbmFsIGNvbnRyYWN0IG1ldGhvZCwgc28gY2FsbCBpdCB2aWEgSVZpZXdlckJhY2tlbmQuXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBiYWNrZW5kIG9mIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXSBhcyBJVmlld2VyQmFja2VuZFtdKSB7XG4gICAgICBiYWNrZW5kLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIH1cbiAgfVxuICAvLyBMb2FkaW5nIHN0YXRlIGlzIHN1cmZhY2VkIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgZG9pbmcgdGhlIHdvcms6IE9TRCBhbmQgbmFwYXJpLWpzICh2b2x1bWVcbiAgLy8gYXNzZW1ibHkpIGRyaXZlIHRoZWlyIG93biBzdWJqZWN0cywgc28gbWVyZ2UgYWxsIHRocmVlIGludG8gb25lIHN0YWJsZSBzdHJlYW0gdGhlIGhvc3RcbiAgLy8gc3Vic2NyaWJlcyB0byBvbmNlLiAoUHJldmlvdXNseSBoYXJkY29kZWQgdG8gUGxvdGx5LCBzbyBuYXBhcmkvT1NEIHByb2dyZXNzIG5ldmVyIHNob3dlZC4pXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucGxvdGx5LmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm9zZC5pc1N0YWNrTG9hZGluZygpLFxuICAgICAgdGhpcy5uYXBhcmkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICBdKS5waXBlKG1hcCgoZmxhZ3MpID0+IGZsYWdzLnNvbWUoQm9vbGVhbikpKTtcbiAgfVxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIC8vIFJlcG9ydCB0aGUgcHJvZ3Jlc3Mgb2Ygd2hpY2hldmVyIGJhY2tlbmQgaXMgQUNUSVZFTFkgbG9hZGluZyAobWF4IGFjcm9zcyBhY3RpdmUgb25lcykuIEEgcGxhaW5cbiAgICAvLyBtZXJnZSBsZXQgYW4gaWRsZSBiYWNrZW5kJ3Mgc3RhbGUgdmFsdWUgd2luIHRoZSBzdHJlYW0gb24gYSByZS1sb2FkIOKAlCBsZWF2aW5nIHRoZSBiYXIgYmVsb3cgdGhlXG4gICAgLy8gYWN0aXZlIGJhY2tlbmQncyByZWFsIHByb2dyZXNzIChlLmcuIHN0dWNrIH7ihZMgd2hpbGUgdGhlICUgcmVhZCAxMDApLiBHYXRpbmcgYnkgdGhlIGxvYWRpbmcgZmxhZ1xuICAgIC8vIGlnbm9yZXMgaWRsZSBiYWNrZW5kcywgc28gdGhlIGJhciB0cmFja3MgdGhlIG9uZSBkb2luZyB0aGUgd29yayBhbmQgcmVhY2hlcyAxMDAlLlxuICAgIGNvbnN0IHRyYWNrID0gKHY6IElWaWV3ZXJCYWNrZW5kKTogT2JzZXJ2YWJsZTxbbnVtYmVyLCBib29sZWFuXT4gPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW3YuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKSwgdi5pc1N0YWNrTG9hZGluZygpXSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RyYWNrKHRoaXMucGxvdGx5KSwgdHJhY2sodGhpcy5vc2QpLCB0cmFjayh0aGlzLm5hcGFyaSldKS5waXBlKFxuICAgICAgbWFwKChwYWlycykgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBwYWlycy5maWx0ZXIoKFssIGxvYWRpbmddKSA9PiBsb2FkaW5nKS5tYXAoKFtwXSkgPT4gcCk7XG4gICAgICAgIHJldHVybiBhY3RpdmUubGVuZ3RoID8gTWF0aC5tYXgoLi4uYWN0aXZlKSA6IDA7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIC8vIEV2ZXJ5IGJhY2tlbmQgZml0cyB0byB2aWV3IG9uIGl0cyBvd24gKFBsb3RseSdzIGF1dG9zY2FsZSwgT1NEJ3MgZ29Ib21lLCBuYXBhcmkncyBjYW1lcmFcbiAgLy8gZml0KSBhbmQgZWFjaCBlbWl0cyBmcm9tIGl0cyBvd24gc3ViamVjdCwgc28gbWVyZ2UgYWxsIHRocmVlOiBsaXN0ZW5pbmcgdG8gUGxvdGx5IGFsb25lXG4gIC8vIG1pc3NlZCB0aGUgY29udGV4dC1tZW51IEF1dG9zY2FsZSBvbiB0aGUgSW1hZ2UgYW5kIG5hcGFyaSB2aWV3cy5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgdGhpcy5wbG90bHkuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMub3NkLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgICB0aGlzLm5hcGFyaS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICkucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG4gIH1cbiAgLyoqIFRoZSBsaW5lLVJPSSBwcm9maWxlczogc2FtcGxlZCBieSB0aGUgYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5nZXRJbnRlbnNpdHlQcm9maWxlJCgpO1xuICB9XG4gIC8vIFRoZSBpbnRlbnNpdHkgaW5zZXQgaXMgYSBQbG90bHkgTElORSBjaGFydCDigJQgcmVuZGVyIGl0IHRocm91Z2ggUGxvdGx5IHdoaWNoZXZlclxuICAvLyBiYWNrZW5kIGRyYXdzIHRoZSBtYWluIGltYWdlLlxuICByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkucmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQsIHByb2ZpbGVzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCByZWdpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBSZWdpb24gc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSwgc28gZXZlcnkgcmVhZCBhbmQgd3JpdGUgZ29lc1xuICAvLyBzdHJhaWdodCB0byBpdC4gRXZlcnkgYmFja2VuZCBkcmF3cyBmcm9tIHRoZSBzdG9yZSdzIGV2ZW50czogdGhlIE9TRCBhbmRcbiAgLy8gbmFwYXJpLWpzIG92ZXJsYXlzIGFuZCBQbG90bHkncyBzaGFwZSBwcm9qZWN0aW9uIHJlZHJhdyBvbiBpdHMgcmVnaW9uLXVwZGF0ZVxuICAvLyBhbmQgc2VsZWN0aW9uIHN0cmVhbXMsIGFuZCB0aGUgY2FudmFzIHRvb2xzIHJlc2V0IG9uIGdldFJlZ2lvblNldFJlcGxhY2VkJFxuICAvLyAodW5kbywgcmVkbywgYSBzbGljZSBzd2l0Y2gpLlxuICBzZXRSZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgICBhcHBlbmQ/OiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucywgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBhcHBlbmQpO1xuICB9XG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblBvbHlnb25zKCk7XG4gIH1cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpO1xuICB9XG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0UmVnaW9uKHJlZ2lvbik7XG4gIH1cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTtcbiAgfVxuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG4gIH1cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICB9XG4gIGdldEZpbGxDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpO1xuICB9XG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7XG4gIH1cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsLCBjb2xvcik7XG4gIH1cbiAgLy8gQW5ub3RhdGlvbi1jbGFzcyBwcmVzZXRzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgKGJhY2tlbmQtbmV1dHJhbFxuICAvLyBzZXNzaW9uIHN0YXRlKSwgc28gcm91dGUgc3RyYWlnaHQgdG8gaXQgcmF0aGVyIHRoYW4gdGhyb3VnaCByZW5kZXJlcigpLiAoaml0LXVpIzcwKVxuICBnZXRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKTtcbiAgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0JCgpO1xuICB9XG4gIHNldFByZXNldFNldChzZXQ6IFByZXNldFNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0UHJlc2V0U2V0KHNldCk7XG4gIH1cbiAgdXBzZXJ0Q2xhc3MocHJlc2V0OiBDbGFzc1ByZXNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUudXBzZXJ0Q2xhc3MocHJlc2V0KTtcbiAgfVxuICByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlbW92ZUNsYXNzKG5hbWUpO1xuICB9XG4gIHJlc2V0UHJlc2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlc2V0UHJlc2V0cygpO1xuICB9XG4gIHVuZG8oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS51bmRvKCk7XG4gIH1cbiAgcmVkbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlZG8oKTtcbiAgfVxuICBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblVuZG8oKTtcbiAgfVxuICBjYW5SZWRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblJlZG8oKTtcbiAgfVxuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRDYW5VbmRvJCgpO1xuICB9XG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblJlZG8kKCk7XG4gIH1cbiAgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgfVxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pbXBvcnRSZWdpb25zKGdlb0pzb25TdHIpO1xuICB9XG4gIC8qKiBEb3dubG9hZCBgcmVnaW9uc2AgYXMgR2VvSlNPTiwgbmFtZWQgYWZ0ZXIgdGhlIGltYWdlIGxhc3QgcGxvdHRlZC4gKi9cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZXhwb3J0UmVnaW9ucyhyZWdpb25zLCB0aGlzLnBsb3R0ZWRGaWxlTmFtZSk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2Ugei1zdGFjayByZWdpb25zIChqaXQtdWkjOTMpLCBmcm9tIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUuIOKUgOKUgFxuICBlbnRlclN0YWNrTW9kZShcbiAgICBzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPixcbiAgICBpbml0aWFsWj86IG51bWJlcixcbiAgICBzYXZlTGF5b3V0PzogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScsXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUoc2xpY2VzLCBpbml0aWFsWiwgc2F2ZUxheW91dCk7XG4gIH1cbiAgZXhpdFN0YWNrTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmV4aXRTdGFja01vZGUoKTtcbiAgfVxuICBpc1N0YWNrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpO1xuICB9XG4gIGdldFN0YWNrU2F2ZUxheW91dCgpOiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlTGF5b3V0KCk7XG4gIH1cbiAgc2V0RGlzcGxheVNsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0RGlzcGxheVNsaWNlKHopO1xuICB9XG4gIGdldFNsaWNlUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2xpY2VSZWdpb25zKCk7XG4gIH1cbiAgZ2V0U3RhY2tTYXZlU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCk7XG4gIH1cbiAgLyoqIEFsbCBzbGljZXMnIEFOTk9UQVRJT04gcmVnaW9ucyBmb3IgYSB6LXN0YWNrIHNhdmUgKGppdC11aSM5MyksIGVhY2ggdGFnZ2VkXG4gICAqICB3aXRoIGl0cyB6ZXJvLWJhc2VkIFJlZ2lvbi56OyBwcm9maWxlIGxpbmVzIGV4Y2x1ZGVkLiBGbGF0IGFubm90YXRpb24gc2V0XG4gICAqICBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIGdldFNsaWNlQW5ub3RhdGlvblJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gIH1cbiAgLyoqIFBlci1zbGljZSBhbm5vdGF0aW9uIHJlZ2lvbnMgdG8gd3JpdGUgb24gYSBmb2xkZXItc3RhY2sgc2F2ZSAoaml0LXVpIzkzKTpcbiAgICogIHNsaWNlIGluZGV4IOKGkiB0aGF0IHNsaWNlJ3MgYW5ub3RhdGlvbiByZWdpb25zIChwcm9maWxlIGxpbmVzIGV4Y2x1ZGVkKSxcbiAgICogIGluY2x1ZGluZyBub3ctZW1wdHkgc2xpY2VzIHRoYXQgd2VyZSBsb2FkZWQgbm9uLWVtcHR5IChzbyB0aGV5IG92ZXJ3cml0ZSkuICovXG4gIGdldFN0YWNrU2F2ZUFubm90YXRpb25TbGljZXMoKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgZm9yIChjb25zdCBbeiwgcmVnc10gb2YgdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVTbGljZXMoKSkge1xuICAgICAgb3V0LnNldChcbiAgICAgICAgeixcbiAgICAgICAgcmVncy5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBBdXRob3JpdGF0aXZlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBzaXplIGZvciBtYXNrIGV4cG9ydC4gUHJlZmVycyB0aGVcbiAgICogIGFjdGl2ZSByZW5kZXJlcidzIHJlcG9ydGVkIHNpemUsIGZhbGxpbmcgYmFjayB0byB0aGUgaW1hZ2UgbWV0YWRhdGEgKHgveVxuICAgKiAgYXJlIHRoZSBmdWxsLXJlcyBwaXhlbCBkaW1lbnNpb25zIHVzZWQgYWNyb3NzIHRoZSBhcHApLiBSZWplY3RzIG5vbi1maW5pdGVcbiAgICogIG9yIG5vbi1wb3NpdGl2ZSBzaXplcyDigJQgdGhlIFBsb3RseSBib3VuZHMgY2FuIHlpZWxkIE5hTiBiZWZvcmUgYSBwbG90IGlzXG4gICAqICBmdWxseSBsYWlkIG91dCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNyYXNoIG1hc2sgY3JlYXRpb24uICovXG4gIGdldE1hc2tJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdmFsaWQgPSAoczogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB8IHVuZGVmaW5lZCkgPT5cbiAgICAgIHMgJiYgTnVtYmVyLmlzRmluaXRlKHMud2lkdGgpICYmIE51bWJlci5pc0Zpbml0ZShzLmhlaWdodCkgJiYgcy53aWR0aCA+PSAxICYmIHMuaGVpZ2h0ID49IDFcbiAgICAgICAgPyB7IHdpZHRoOiBNYXRoLnJvdW5kKHMud2lkdGgpLCBoZWlnaHQ6IE1hdGgucm91bmQocy5oZWlnaHQpIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZnJvbVJlbmRlcmVyID0gdmFsaWQodGhpcy5nZXRUcnVlSW1hZ2VTaXplKCkpO1xuICAgIGlmIChmcm9tUmVuZGVyZXIpIHJldHVybiBmcm9tUmVuZGVyZXI7XG5cbiAgICBsZXQgbWV0YTogSUltYWdlTWV0YWRhdGFbXSA9IFtdO1xuICAgIHRoaXMuZ2V0SW1hZ2VNZXRhKClcbiAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXRhID0gbSkpXG4gICAgICAudW5zdWJzY3JpYmUoKTtcbiAgICBjb25zdCBtMCA9IG1ldGE/LlswXTtcbiAgICByZXR1cm4gbTAgPyB2YWxpZCh7IHdpZHRoOiBtMC54LCBoZWlnaHQ6IG0wLnkgfSkgOiBudWxsO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25FZGl0b3JBcGk6IGFubm90YXRpb24tb25seSBzdXJmYWNlIGZvciB0aGUgUmVnaW9uIEVkaXRvciDilIDilIDilIBcbiAgLy8gSW50ZW5zaXR5LXByb2ZpbGUgbGluZXMgKGtpbmQ9J3Byb2ZpbGUnKSBiZWxvbmcgdG8gdGhlIGludGVuc2l0eSB0b29sLCBub3RcbiAgLy8gdGhlIGVkaXRvci4gVGhlc2UgbWV0aG9kcyBnaXZlIGV4dGVybmFsIGNvbnN1bWVycyBhbiBhbm5vdGF0aW9uLW9ubHkgdmlld1xuICAvLyBhbmQgZ3VhcmFudGVlIHByb2ZpbGUgbGluZXMgYXJlIHByZXNlcnZlZC4gVGhlIHdyaXRlcyBsYW5kIGluIHRoZSBzdG9yZSBsaWtlXG4gIC8vIGFueSBvdGhlciwgYW5kIGV2ZXJ5IGJhY2tlbmQgcmVkcmF3cyBmcm9tIGl0cyBldmVudHMuXG5cbiAgZ2V0QW5ub3RhdGlvblJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIHNldEFubm90YXRpb25SZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gUmUtYXBwZW5kIHRoZSBzdG9yZSdzIHByb2ZpbGUgbGluZXMgc28gYW4gZWRpdG9yIHNhdmUvZGVsZXRlIGNhbid0IGRyb3AgdGhlbS5cbiAgICBjb25zdCBwcm9maWxlcyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IChyZWdpb25zIHx8IFtdKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgIHRoaXMuc2V0UmVnaW9ucyhbLi4uYW5ub3RhdGlvbnMsIC4uLnByb2ZpbGVzXSwgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBmYWxzZSk7XG4gIH1cbiAgZ2V0U2VsZWN0ZWRSZWdpb25zJCgpOiBPYnNlcnZhYmxlPFJlZ2lvbltdPiB7XG4gICAgLy8gTWFwIHRoZSBpbnRlcm5hbCBpbmRleC1iYXNlZCBzZWxlY3Rpb24gdG8gdGhlIHNlbGVjdGVkIGFubm90YXRpb24gcmVnaW9ucy5cbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKS5waXBlKFxuICAgICAgbWFwKChpZHhzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZ3MgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICAgICAgcmV0dXJuIGlkeHMubWFwKChpKSA9PiByZWdzW2ldKS5maWx0ZXIoKHIpOiByIGlzIFJlZ2lvbiA9PiAhIXIgJiYgIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIHNldFNlbGVjdGVkUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIGNvbnN0IHJlZ3MgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBpbmRpY2VzID0gKHJlZ2lvbnMgfHwgW10pLm1hcCgocikgPT4gcmVncy5maW5kSW5kZXgoKHgpID0+IHguaWQgPT09IHIuaWQpKS5maWx0ZXIoKGkpID0+IGkgPj0gMCk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0b29scyDihpIgYWN0aXZlIHJlbmRlcmVyIChydW4gb24gZWl0aGVyIGJhY2tlbmQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBUaGUgd2FuZCwgdmVydGV4IGVyYXNlciBhbmQgem9vbS10by1ib3ggYXJlIGltcGxlbWVudGVkIG9uIGJvdGggYmFja2VuZHNcbiAgLy8gdmlhIElDb29yZGluYXRlVHJhbnNmb3JtICgrIGEgdmlld3BvcnQgcGl4ZWwgcmVhZGJhY2sgZm9yIHRoZSB3YW5kKSwgc28gdGhleVxuICAvLyBmb2xsb3cgdGhlIGFjdGl2ZSByZW5kZXJlci5cbiAgc2V0QWN0aXZlVG9vbChpZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IENhbnZhc1Rvb2xPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldEFjdGl2ZVRvb2woaWQsIG9wdGlvbnMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRXYW5kTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0V2FuZE1vZGUoYWN0aXZlLCBvcHRpb25zKTtcbiAgfVxuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0V2FuZE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5jbGVhckFjdGl2ZVdhbmRSZWdpb24oKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0QnJ1c2hNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0QnJ1c2hNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXRab29tVG9Cb3hNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLnNlZ21lbnRSZWN0YW5nbGVzKCk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0U2FtTW9kZWwoaWQpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRTYW1Qb2ludE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFNhbVBvaW50TW9kZShhY3RpdmUpO1xuICB9XG4gIGNvbW1pdFNhbVBvaW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuY29tbWl0U2FtUG9pbnRzKCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmNsZWFyU2FtUG9pbnRzKCk7XG4gIH1cblxuICAvLyDilIDilIAgZGlzcGxheSBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBTdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSDigJQgcmVhZHMgZ28gc3RyYWlnaHQgdG8gaXQuXG4gIC8vIFRoZSB0d28gU0VUVEVSUyBzdGlsbCByb3V0ZSB0aHJvdWdoIFBsb3RseSBiZWNhdXNlIGl0cyBpbXBsZW1lbnRhdGlvbnNcbiAgLy8gY2FycnkgcmVuZGVyIGdsdWUgYmV5b25kIHRoZSBzdG9yZSB3cml0ZSAoYSBsaXZlIFBsb3RseS5yZXN0eWxlIG9mXG4gIC8vIGNvbG9yc2NhbGUvcmV2ZXJzZXNjYWxlIG9uIHRoZSBtb3VudGVkIGhlYXRtYXApOyBPU0QgcmVjb2xvcnMgdmlhIGl0cyBvd25cbiAgLy8gc3RvcmUgc3Vic2NyaXB0aW9uIGVpdGhlciB3YXkuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCk7XG4gIH1cbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IENvbG9ybWFwTm9kZSk6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnNldENvbG9ybWFwKGNvbG9ybWFwKTtcbiAgfVxuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwT3B0aW9ucygpO1xuICB9XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKTtcbiAgfVxuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnNldFJldmVyc2VTY2FsZShyZXZlcnNlKTtcbiAgfVxuICBzZXRJbWFnZU1ldGEoaW1hZ2VNZXRhOiBJSW1hZ2VNZXRhZGF0YVtdLCBpbWFnZUtleT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0SW1hZ2VNZXRhKGltYWdlTWV0YSwgaW1hZ2VLZXkpO1xuICB9XG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbWFnZU1ldGEoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJQ2hhbm5lbEhpc3RvZ3JhbUFwaTogQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSBzdXJmYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBDaGFubmVsL2dyYXlzY2FsZS9pbnZlcnQgc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmU7IGJvdGhcbiAgLy8gYmFja2VuZHMgc3Vic2NyaWJlIGFuZCByZWNvbG9yIGxpdmUsIHNvIHNldHRlcnMganVzdCB3cml0ZSB0aGUgc3RvcmUuIFRoZVxuICAvLyBoaXN0b2dyYW0gY29tZXMgZnJvbSB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW4gKGl0cyBuYXRpdmUgcGl4ZWxzKS5cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cbiAgLyoqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBkYXRhICgxNi1iaXQgbXVsdGktYmFuZCBUSUZGKSB2aWEgdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBleHBvcnREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5leHBvcnREYXRhKCk7XG4gIH1cbiAgZ2V0Q2hhbm5lbHMkKCk6IE9ic2VydmFibGU8SUNoYW5uZWxTdGF0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpO1xuICB9XG4gIHNldFNlbGVjdGVkQ2hhbm5lbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRTZWxlY3RlZENoYW5uZWwoaW5kZXgpO1xuICB9XG4gIHNldENoYW5uZWxTdGF0ZShpbmRleDogbnVtYmVyLCBwYXJ0aWFsOiBQYXJ0aWFsPElDaGFubmVsU3RhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoaW5kZXgsIHBhcnRpYWwpO1xuICB9XG4gIHJlc2V0Q29udHJhc3QoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICAvLyBGdWxsIHJlc2V0OiB3aW5kb3cgKDAuLjI1NSksIGdhbW1hICgxKSBBTkQgdGhlIGNoYW5uZWwncyBkZWZhdWx0IHRpbnQuXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHRoaXMuc3RvcmUucmVzZXRDaGFubmVsU3RhdGUoaSk7XG4gIH1cbiAgLyoqIEF1dG8td2luZG93IGVhY2ggY2hhbm5lbCBieSBzYXR1cmF0aW5nIGBzYXR1cmF0aW9uYCAoMC4uMSkgb2YgcGl4ZWxzIGF0IGVhY2hcbiAgICogIGVuZCBvZiBpdHMgaGlzdG9ncmFtIChza2lwcGluZyBvdXRsaWVyIGZpcnN0L2xhc3QgYmlucykuICovXG4gIGF1dG9Db250cmFzdChpbmRpY2VzOiBudW1iZXJbXSwgc2F0dXJhdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICAgIGNvbnN0IGggPSB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtKGksIDI1Nik7XG4gICAgICBpZiAoIWgpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtKGgsIHNhdHVyYXRpb24sIFswLCAyNTVdKTtcbiAgICAgIGlmIChtYXggPiBtaW4pIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGksIHsgbWluLCBtYXggfSk7XG4gICAgfVxuICB9XG4gIGdldEdyYXlzY2FsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0R3JheXNjYWxlKCk7XG4gIH1cbiAgc2V0R3JheXNjYWxlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRHcmF5c2NhbGUob24pO1xuICB9XG4gIGdldEludmVydCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCk7XG4gIH1cbiAgc2V0SW52ZXJ0KG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbnZlcnQob24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3RpdmUgYmFja2VuZCdzIHJlZ2lvbiBvdmVybGF5LiBGYWxscyBiYWNrIHRvIFBsb3RseSdzIHdoZW4gdGhlIGFjdGl2ZSBiYWNrZW5kXG4gICAqIChPU0Qgb3IgbmFwYXJpLWpzKSBpcyBzZWxlY3RlZCBidXQgYSBwbG90IGlzbid0IG1vdW50ZWQgeWV0LCBzbyBjYWxsZXJzIGFsd2F5cyBnZXQgYVxuICAgKiB1c2FibGUgb3ZlcmxheS5cbiAgICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnJlbmRlcmVyKCk7XG4gICAgaWYgKHIgPT09IHRoaXMub3NkKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2QuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgaWYgKHIgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXBhcmkuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGNvbnRyb2xzIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgd2hlbiBpdCByZW5kZXJzIGlzb3N1cmZhY2VzLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk7XG4gIH1cblxuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgb2YgdGhlIGJhY2tlbmQgb24gc2NyZWVuIChQbG90bHkgb3IgbmFwYXJpLWpzKSwgb3IgbnVsbCBvbiBhXG4gICAqICAyRC1vbmx5IG9uZS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdXJmYWNlM2RDb250cm9scygpO1xuICB9XG5cbiAgLyoqIEludGVuc2l0eSAobGluZS1ST0kpIGNvbnRyb2xzLCB3aGljaGV2ZXIgYmFja2VuZCBkcmF3cyB0aGUgaW1hZ2U6IHRoZVxuICAgKiAgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgYWRkcyB0aGUgbGluZSB0byB0aGUgc3RvcmUsIGFuZCBldmVyeSBiYWNrZW5kXG4gICAqICAoUGxvdGx5IGluY2x1ZGVkKSBkcmF3cyBpdCBmcm9tIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudC4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXRpYWwtb21pY3MgY29udHJvbHMsIG9yIG51bGwgd2hlbiBubyBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLiBTZXJ2ZWQgYnkgYVxuICAgKiBiYWNrZW5kLW5ldXRyYWwge0BsaW5rIFNwYXRpYWxDb250cm9sc0ZhY2FkZX0gKHN0YXRlIGluIHRoZSBzaGFyZWQgc3RvcmVzKSwgc28gdGhlXG4gICAqIGNvbnRyb2xzIHdvcmsgYWNyb3NzIGEgcGxvdC10eXBlIHN3aXRjaCBhbmQgYmVmb3JlIGFueSBiYWNrZW5kIGhhcyBtb3VudGVkLlxuICAgKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzKCk6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc3BhdGlhbERhdGEpIHJldHVybiBudWxsO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA/Pz0gbmV3IFNwYXRpYWxDb250cm9sc0ZhY2FkZSh0aGlzLnNwYXRpYWxEYXRhLCB7XG4gICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgIHJlZ2lvblN0b3JlOiB0aGlzLnJlZ2lvblN0b3JlLFxuICAgICAgc2VsZWN0aW9uU3RvcmU6IHRoaXMuc2VsZWN0aW9uU3RvcmUsXG4gICAgICBuYXBhcmk6IHRoaXMubmFwYXJpLFxuICAgICAgcGxvdFR5cGU6ICgpID0+IHRoaXMuY3VycmVudFBsb3RUeXBlLFxuICAgICAgekluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaSW5kZXgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbEZhY2FkZS5jb250cm9scztcbiAgfVxuXG4gIC8qKiBDcmVhdGVkIG9uIGZpcnN0IHVzZTsgb3ducyB0aGUgZGF0YXNldCBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc3BhdGlhbEZhY2FkZTogU3BhdGlhbENvbnRyb2xzRmFjYWRlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEaXNwbGF5ZWQgc2xpY2UuIE9ubHkgYSB2b2x1bWUtYmFja2VkIHNwYXRpYWwgZGF0YXNldCByZWFkcyBpdCwgdG8ga2VlcCBhXG4gICAqICByZWdpb24gZHJhd24gb3ZlciBvbmUgc2VjdGlvbiBmcm9tIHNlbGVjdGluZyB0aGUgd2hvbGUgZGVwdGggYmVoaW5kIGl0LiAqL1xuICBwcml2YXRlIGN1cnJlbnRaSW5kZXggPSAwO1xuXG4gIC8qKiBBbmd1bGFyIGNhbGxzIHRoaXMgd2hlbiB0aGUgaW5qZWN0b3IgcHJvdmlkaW5nIHRoZSByb3V0ZXIgaXMgZGVzdHJveWVkIOKAlCB0aGUgaG9zdFxuICAgKiAgY29tcG9uZW50IGZvciBhIGBwcm92aWRlVmlzdWFsaXphdGlvbigpYCBjaGFpbi4gVGhlIGRhdGFzZXQgc3Vic2NyaXB0aW9uIHdvdWxkXG4gICAqICBvdGhlcndpc2Uga2VlcCB0aGUgd2hvbGUgaXNvbGF0ZWQgY2hhaW4gcmVhY2hhYmxlIGZyb20gdGhlIHJvb3QgZGF0YSBwb3J0LiAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuc2l0eS1wcm9maWxlIHNhbXBsaW5nLCB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW46IHRoZSBzYW1wbGluZyBpcyB0aGVcbiAgICogYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlJ3M7IHRoZSB2aWV3cG9ydCBjaGFuZ2VzIGNvbWUgZnJvbSBldmVyeVxuICAgKiBiYWNrZW5kIHRoYXQgcmVwb3J0cyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBtZXJnZWQgaW50byBvbmUgc3RhYmxlXG4gICAqIHN0cmVhbSB0aGUgaW5zZXQgc3Vic2NyaWJlcyB0byBvbmNlLlxuICAgKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVNhbXBsaW5nOiBJSW50ZW5zaXR5U2FtcGxpbmcgPSB7XG4gICAgLy8gTG9hZCB0aGUgZGlzcGxheWVkIHNsaWNlJ3MgcGl4ZWxzIGZvciBhIGJhY2tlbmQgdGhhdCBoYXMgbm8gZnJhbWVzIG9mIGl0cyBvd25cbiAgICAvLyAoT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzOyBQbG90bHkgZmVlZHMgaXRzIGZyYW1lcyB0byB0aGUgc2VydmljZSB3aGVuIGl0IHBsb3RzKS5cbiAgICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZzogKGltYWdlSW5mbywgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfSxcbiAgICAvLyBSZS1zYW1wbGUgZnJvbSBhIGZyZXNoIGNyb3Agb2YgdGhlIGltYWdlLXBpeGVsIFJPSSBhdCBkaXNwbGF5IHJlc29sdXRpb24uXG4gICAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pOiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHRoaXMuaW50ZW5zaXR5LnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICAgIH0sXG4gICAgZ2V0Vmlld3BvcnRDaGFuZ2UkOiAoKSA9PlxuICAgICAgbWVyZ2UoLi4udGhpcy5iYWNrZW5kcygpLm1hcCgoYikgPT4gYi5nZXRJbnRlbnNpdHlTYW1wbGluZygpPy5nZXRWaWV3cG9ydENoYW5nZSQoKSA/PyBFTVBUWSkpLFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIENyb3BzIGZvciBzYW1wbGluZyBhcmUgc2l6ZWQgZnJvbSB0aGUgcGxvdCBkaXYgKHdoaWNoZXZlciBiYWNrZW5kIHJlbmRlcnMgaW50byBpdCkuICovXG4gIHByaXZhdGUgcG9pbnRTYW1wbGluZ0F0UGxvdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB0aGlzLmludGVuc2l0eS5zZXRTYW1wbGluZ0VsZW1lbnQodGhpcy5wbG90RGl2KTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkuZ2V0Vmlld3BvcnRDaGFuZ2UkKClgLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZ2V0Vmlld3BvcnRDaGFuZ2UkKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSgpYC4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmludGVuc2l0eVNhbXBsaW5nLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXN1YWxpemVyIHZpZXcgaXMgZ29pbmcgYXdheTogZGV0YWNoIGV2ZXJ5IGJhY2tlbmQg4oCUIGRyb3BwaW5nIHRoZWlyIHZpZXctYm91bmRcbiAgICogIHN1YnNjcmlwdGlvbnMgYW5kIGRpc3Bvc2luZyB0aGUgbmFwYXJpLWpzIHZpZXdlciwgd2hvc2UgY2FudmFzLCByZW5kZXIgbG9vcCBhbmQgR1BVXG4gICAqICBidWZmZXJzIHdvdWxkIG90aGVyd2lzZSBvdXRsaXZlIHRoZSB2aWV3IChmb3IgYSBjb21wb25lbnQtc2NvcGVkIGNoYWluLCBmb3JldmVyKS5cbiAgICogIE5vdGhpbmcgaXMgb24gc2NyZWVuIGFmdGVyd2FyZHMsIHNvIHRoZSBuZXh0IHBsb3Qgc3RhcnRzIGZyb20gdGhlIGRlZmF1bHQgYmFja2VuZC4gKi9cbiAgZGV0YWNoKCk6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LmRldGFjaCgpO1xuICAgIHRoaXMub3NkLmRldGFjaCgpO1xuICAgIHRoaXMubmFwYXJpLmRldGFjaCgpO1xuICAgIHRoaXMubGFzdFJlbmRlcmVkID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGRldGFjaH0uICovXG4gIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoKCk7XG4gIH1cbn1cbiJdfQ==
|
|
1299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBa0MsTUFBTSwrQkFBK0IsQ0FBQztBQUl4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztB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QUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7OEdBOXhDVSx3QkFBd0IsbUtBb0V6QixVQUFVLG9IQU9WLGlCQUFpQjtrSEEzRWhCLHdCQUF3QixjQURYLE1BQU07OzJGQUNuQix3QkFBd0I7a0JBRHBDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFxRTdCLE1BQU07MkJBQUMsVUFBVTs7MEJBTWpCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBtZXJnZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHJlc29sdmVDb2xvcm1hcCB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUG9seWdvbiwgUmVnaW9uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IENsYXNzUHJlc2V0LCBQcmVzZXRTZXQgfSBmcm9tICcuL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuaW1wb3J0IHsgUGxvdGx5U2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL3Bsb3RseS9wbG90bHkuc2VydmljZSc7XG5pbXBvcnQgeyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUGxvdFR5cGUsXG4gIFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVZvbHVtZSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIElWaWV3ZXJCYWNrZW5kLFxuICBJVmlzdWFsaXplcixcbiAgTG9hZGVkSW1hZ2UsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG4gIElTcGF0aWFsQ29udHJvbHMsXG4gIElJbnRlbnNpdHlTYW1wbGluZyxcbiAgSU9zZFZpZXdPcHRpb25zLFxuICBJVm9sdW1lUmVzb2x1dGlvbixcbn0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgQ2FudmFzVG9vbE9wdGlvbnMsIENvbG9ybWFwTm9kZSwgSUJydXNoT3B0aW9ucywgSVdhbmRPcHRpb25zIH0gZnJvbSAnLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblNjb3BlQ2FjaGUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zY29wZS1jYWNoZSc7XG5pbXBvcnQgeyBSRUdJT05fU09VUkNFX01JTl9DSEFSUywgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25JbmRleFBhZ2UsIFJlZ2lvbkluZGV4UXVlcnkgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsSGlzdG9ncmFtQXBpLCBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbFRpbnRDb2xvcm1hcCwgdm9sdW1lQ29sb3JtYXAgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlLWNvbnRyaWJ1dGlvbi5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlU2VydmljZSB9IGZyb20gJy4vaW50ZW5zaXR5L2ludGVuc2l0eS1wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbmdlZENsYXNzZXMsIGNsYXNzU2lnbmF0dXJlcyB9IGZyb20gJy4vc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcyc7XG5pbXBvcnQgeyBWb2x1bWVTZWN0aW9ucyB9IGZyb20gJy4vdmlzdWFsaXplci92b2x1bWUtc2VjdGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXdzIH0gZnJvbSAnLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcblxuLyoqIEhvdyBsb25nIGFmdGVyIHRoZSBsYXN0IGVkaXQgdGhlIHN1cmZhY2VzIG9mIHRoZSBjbGFzc2VzIGl0IHRvdWNoZWQgYXJlIHJlYnVpbHQgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TID0gNjAwO1xuXG4vKiogSW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzIGFyZSBvd25lZCBieSB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgZWRpdG9yLlxuICogIFBhY2thZ2UtaW50ZXJuYWwgcHJlZGljYXRlIChwcm9wZXJ0eS1iYXNlZCBzbyBpdCBhbHNvIG1hdGNoZXMgcGxhaW4gb2JqZWN0c1xuICogIGFmdGVyIGEgZHJhZyByb3VuZC10cmlwKS4gKi9cbmZ1bmN0aW9uIGlzUHJvZmlsZVJlZ2lvbihyOiB7IGtpbmQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHI/LmtpbmQgPT09ICdwcm9maWxlJztcbn1cblxuLyoqXG4gKiBUaGUgdmlzdWFsaXplciBjaGFpbidzIGZyb250IGRvb3I6IGltcGxlbWVudHMgYElWaXN1YWxpemVyYCwgYElSZWdpb25FZGl0b3JBcGlgXG4gKiBhbmQgYElDaGFubmVsSGlzdG9ncmFtQXBpYCAoYm91bmQgdG8gdGhlIGBWSVNVQUxJWkVSYCAvIGBSRUdJT05fRURJVE9SX0FQSWAgL1xuICogYENIQU5ORUxfSElTVE9HUkFNX0FQSWAgdG9rZW5zKSBvdmVyIHRocmVlIHJlbmRlcmluZyBiYWNrZW5kcywgY2hvc2VuIHBlciBwbG90IHR5cGU6XG4gKiAgLSAqKkltYWdlKiogcmVuZGVycyB0aHJvdWdoIE9wZW5TZWFkcmFnb24gKG5hdGl2ZWx5IHRpbGVkLCByZWdpb24gdG9vbHMsXG4gKiAgICBjbGllbnQtc2lkZSBjb2xvcm1hcCksIG9yIHRocm91Z2ggbmFwYXJpLWpzIHdoZW4gYFZpekNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcmBcbiAqICAgIG9wdHMgaW47IHRoZSBuYXBhcmkgaW1hZ2UgdHlwZXMgYW5kIHRoZSAyRCBzcGF0aWFsLW9taWNzIG1vZGUgcmVuZGVyIHRocm91Z2hcbiAqICAgIG5hcGFyaS1qcy4gQSBmYWlsZWQgbG9hZCBmYWxscyBiYWNrIG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkgZm9yIHRoYXQgaW1hZ2Ugb25seVxuICogICAgKHNlZSBgbmFwYXJpRmVsbEJhY2tgIC8gYG9zZEZlbGxCYWNrYCwgY2xlYXJlZCBieSBgcmVzZXQoKWApLlxuICogIC0gdGhlIG5hcGFyaSAzRCB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlLCBzdXJmYWNlLCAzRCBzY2F0dGVyLCB0aGUgM0Qgc3BhdGlhbFxuICogICAgY2xvdWQpIHJlbmRlciB0aHJvdWdoIG5hcGFyaS1qcywgZmFsbGluZyBiYWNrIHRvIFBsb3RseS5cbiAqICAtIGV2ZXJ5IG90aGVyIHBsb3QgdHlwZSAoaGVhdG1hcCwgY29udG91ciwgc3VyZmFjZSwgc2NhdHRlciwgbGluZSwg4oCmKSByZW5kZXJzXG4gKiAgICB0aHJvdWdoIFBsb3RseS5cbiAqXG4gKiBPbmx5IHJlbmRlcmluZyBhbmQgdGhlIHZpZXdwb3J0IGFyZSByb3V0ZWQgdG8gdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBSZWdpb24gc3RhdGVcbiAqIGxpdmVzIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCBhbmQgZGlzcGxheSBzdGF0ZSAoY29sb3JtYXAsIGNoYW5uZWxzLCBwcmVzZXRzLFxuICogc3BhdGlhbCB2aWV3KSBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgLCBzbyBldmVyeSBiYWNrZW5kIHNlZXMgdGhlIHNhbWVcbiAqIHZhbHVlczsgdGhlIGJhY2tlbmRzIHN1YnNjcmliZSB0byB0aGVtIHRvIHJlZHJhdy5cbiAqXG4gKiBQYWNrYWdlLWludGVybmFsOiBob3N0cyBkZXBlbmQgb24gdGhlIHRva2Vucywgbm90IG9uIHRoaXMgY2xhc3MuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIsIElSZWdpb25FZGl0b3JBcGksIElDaGFubmVsSGlzdG9ncmFtQXBpLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWQ6IElWaWV3ZXJCYWNrZW5kIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPU0QgZmFpbGVkIGZvciB0aGUgKmN1cnJlbnQqIHJlbmRlciBjeWNsZSAoZS5nLiBhIGZyZXNoIGZpbGUgc3RpbGwgY2FjaGluZ1xuICAgKiAgcGFzdCB0aGUgZGVhZGxpbmUpIOKGkiBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIG9ubHkuIFJlc2V0IGJ5XG4gICAqICByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSByZW5kZXIgY3ljbGUsIHNvIHRoZSBuZXh0IGZpbGUg4oCUIG9yIGFcbiAgICogIHJlLXNlbGVjdCBvbmNlIHRoZSBmaWxlIGlzIGNhY2hlZCDigJQgcmV0cmllcyBPU0QuIChXYXMgYSBwZXJtYW5lbnQgZmxhZyxcbiAgICogIHdoaWNoIGxlZnQgdGhlIHdob2xlIHNlc3Npb24gc3R1Y2sgb24gUGxvdGx5IGFmdGVyIG9uZSBzbG93IGxvYWQuKSAqL1xuICBwcml2YXRlIG9zZEZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgZmFpbGVkIGZvciB0aGUgY3VycmVudCByZW5kZXIgY3ljbGUg4oaSIGZhbGwgYmFjayB0byBPU0QgKHRoZW4gUGxvdGx5KS5cbiAgICogIFJlc2V0IGJ5IHJlc2V0KCkgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGN5Y2xlLCBsaWtlIHtAbGluayBvc2RGZWxsQmFja30uICovXG4gIHByaXZhdGUgbmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgLyoqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGltYWdlIGxhc3QgcGxvdHRlZCAobmFtZXMgYSBHZW9KU09OIGV4cG9ydCkuICovXG4gIHByaXZhdGUgcGxvdHRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZGl2IHRoZSBiYWNrZW5kcyByZW5kZXIgaW50byAoZXZlcnkgYmFja2VuZCBzaGFyZXMgaXQpOyAnJyBiZWZvcmUgdGhlIGZpcnN0IHBsb3QuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgdmlldyBpcyB0aGUgY3VycmVudCBwbG90IHR5cGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdm9sdW1lVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKHNlZSB7QGxpbmsgc2V0U2xpY2VFZGl0b3J9KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzbGljZUVkaXRvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3IGRyYXdzIHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlIHZvbHVtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25zVGhyb3VnaFZvbHVtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgYnVpbHQgc28gZmFyLCBieSBpbWFnZSwgcmVzb2x1dGlvbiBhbmQgY2xhc3NlcyAod2l0aCB0aG9zZSBjbGFzc2VzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtZXNoQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBtZXNoOiBNZXNoOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9PigpO1xuICAvKiogQnVtcGVkIHBlciB7QGxpbmsgc2hvd1JlZ2lvbkNsYXNzZXMzZH0gKGFuZCBwZXIgbmV3IGltYWdlKSwgc28gb25seSB0aGUgbGF0ZXN0IG9uZSBzaG93cy4gKi9cbiAgcHJpdmF0ZSBtZXNoUmVxdWVzdCA9IDA7XG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNELCBhbmQgdGhlIGltYWdlIHRoZXkgYmVsb25nIHRvLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsYXNzZXMzZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfT4+KFxuICAgIFtdLFxuICApO1xuICBwcml2YXRlIGNsYXNzZXMzZEltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZ3JvdXBzIGxhc3QgYXNrZWQgZm9yIGluIDNELCB3aXRoIHRoZWlyIGNvbG91cnM6IHdoYXQgYW4gZWRpdCdzIHJlYnVpbGQgc2hvd3MgYWdhaW4uICovXG4gIHByaXZhdGUgc2hvd24zZDogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4gPSBbXTtcbiAgLyoqXG4gICAqIEVhY2ggY2xhc3MncyBmaW5nZXJwcmludCBvbiB0aGUgbGl2ZSBzbGljZSAoc2VlIGNsYXNzU2lnbmF0dXJlcyksIHdoaWNoIGltYWdlIGFuZCBzbGljZSwgYW5kXG4gICAqIHdoYXQgdGhlIHJlZ2lvbiBzb3VyY2VzIGhvbGQgKHNlZSBSZWdpb25TdG9yZS5nZXRTb3VyY2VTdGF0ZUtleSkuIE51bGwgd2hpbGUgbm90aGluZyBmb2xsb3dzXG4gICAqIHRoZSBlZGl0cyAobm8gc3VyZmFjZSBidWlsdCwgbm8gc2VjdGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXZlQ2xhc3NlczogeyBhdDogc3RyaW5nOyBzaWduYXR1cmVzOiBNYXA8c3RyaW5nLCBudW1iZXI+OyBzb3VyY2VzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBlbmRpbmcgcmVidWlsZCBvZiB0aGUgc3VyZmFjZXMgYW4gZWRpdCB0b3VjaGVkLiAqL1xuICBwcml2YXRlIHJlYnVpbGRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25VcGRhdGVzOiBTdWJzY3JpcHRpb247XG5cbiAgLy8g4pSA4pSAIFRoZSBzbGljZSBwYW5lICh0aGUgdm9sdW1lIHZpZXcncyBzcGxpdCk6IE9TRCBlZGl0aW5nIG9uZSBzbGljZSBiZXNpZGUgdGhlIDNEIHZpZXcg4pSA4pSAXG4gIC8qKiBUaGUgZGl2IHRoZSBzbGljZSBwYW5lIHJlbmRlcnMgaW50byB3aGlsZSBpdCBpcyB3YW50ZWQgKG51bGw6IG5vIHNwbGl0KS4gKi9cbiAgcHJpdmF0ZSBzbGljZURpdjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIE9TRCBpcyBtb3VudGVkIGluIHRoZSBzbGljZSBwYW5lOiByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgZ28gdG8gaXQuICovXG4gIHByaXZhdGUgc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIHNsaWNlIHBhbmUgc2hvd3MuICovXG4gIHByaXZhdGUgc2xpY2VGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBCdW1wZWQgcGVyIHNsaWNlLXBhbmUgbW91bnQgb3IgdGVhcmRvd24sIHNvIG9ubHkgdGhlIGxhdGVzdCBvbmUgbGFuZHMuICovXG4gIHByaXZhdGUgc2xpY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3ICh0aGUgcGxhbmVzIHggYW5kIHkgdGhyb3VnaCB0aGUgc3RhY2spLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zOiBWb2x1bWVTZWN0aW9ucztcbiAgLyoqIFRoZSB6IHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHNsaWNlIHRvIHNob3cgKHNlZSB7QGxpbmsgZ2V0U2xpY2VEcmFnJH0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRHJhZyQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvblN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBUaGUgaW1hZ2UgaW5mbyBhbmQgc2NyZWVuIGhlaWdodCBvZiB0aGUgbGFzdCBwbG90ICh3aGF0IHRoZSBzbGljZSBwYW5lIG1vdW50cykuICovXG4gIHByaXZhdGUgcGxvdHRlZEluZm86IElJbWFnZUluZm8gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHJlZ2lvbiBpbXBvcnQgKHNlZSByZWdpb25JbXBvcnRUaWNrZXQpOiBpdHMgaWQgYW5kIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldDogeyBpZDogbnVtYmVyOyBpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7IGlkOiAwLCBpbWFnZTogdW5kZWZpbmVkIH07XG4gIHByaXZhdGUgcGxvdHRlZEhlaWdodCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbG90bHk6IFBsb3RseVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvc2Q6IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIG5hcGFyaTogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogYSBob3N0IHRoYXQgc2VydmVzIG5vIHNwYXRpYWwtb21pY3MgZGF0YSBiaW5kcyBub3RoaW5nLFxuICAgIC8vIGFuZCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHRoZW4gcmV0dXJucyBudWxsLlxuICAgIHByaXZhdGUgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSxcbiAgICBwcml2YXRlIGludGVuc2l0eTogSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKVxuICAgIHByaXZhdGUgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25SZWdpb25zQ2hhbmdlZCgpKTtcbiAgICB0aGlzLnNlY3Rpb25zID0gbmV3IFZvbHVtZVNlY3Rpb25zKHtcbiAgICAgIHZvbHVtZTogKCkgPT4gdGhpcy5uYXBhcmkudm9sdW1lVm94ZWxzKCksXG4gICAgICBpbWFnZTogKCkgPT4gdGhpcy5wbG90dGVkRmlsZU5hbWUsXG4gICAgICBzaG93UGxhbmVzOiAocGxhbmVzKSA9PiB0aGlzLm5hcGFyaS5zZXRTbGljZVBsYW5lcyhwbGFuZXMpLFxuICAgICAgb3V0bGluZXNCeUNsYXNzOiAobGV2ZWwpID0+IHRoaXMucmVnaW9uU3RvcmUub3V0bGluZXNCeUNsYXNzKGxldmVsKSxcbiAgICAgIGlzQ2xhc3NIaWRkZW46IChsYWJlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5pc0NsYXNzSGlkZGVuKGxhYmVsKSxcbiAgICAgIGNvbG9yT2Y6IChsYWJlbCkgPT4gdGhpcy5jbGFzc0NvbG9yKGxhYmVsKSxcbiAgICAgIGNoYW5uZWxTdGF0ZXM6ICgpID0+IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIGNvbG9ybWFwOiAoc3QsIG11bHRpY2hhbm5lbCkgPT4ge1xuICAgICAgICAvLyBBcyB0aGUgdm9sdW1lIHNjZW5lIGNvbG91cnMgdGhlIGNoYW5uZWwgKGludmVydCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUgY29sb3JtYXApLlxuICAgICAgICBjb25zdCBkaXNwbGF5ID0ge1xuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnN0b3JlLmN1cnJlbnRDb2xvcm1hcCgpLFxuICAgICAgICAgIHJldmVyc2U6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgICAgIGludmVydDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29sb3JtYXAoXG4gICAgICAgICAgbXVsdGljaGFubmVsID8gY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnLCBkaXNwbGF5KSA6IHZvbHVtZUNvbG9ybWFwKHN0LCBkaXNwbGF5KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBpbnZlcnQ6ICgpID0+IHRoaXMuc3RvcmUuY3VycmVudEludmVydCgpLFxuICAgICAgc2xpY2U6ICgpID0+IHRoaXMuY3VycmVudFpJbmRleCxcbiAgICB9KTtcbiAgICAvLyBBIHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHogcGxhbmUgcGlja3MgdGhlIHNsaWNlICh0aHJvdWdoIHRoZSBob3N0J3Mgc2xpZGVyLCBzb1xuICAgIC8vIHRoZSBzdG9yZSBhbmQgdGhlIHNsaWNlIHBhbmUgZm9sbG93KSwgdGhlIG90aGVycyBtb3ZlIHRoZWlyIHNlY3Rpb24uXG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQoXG4gICAgICB0aGlzLm5hcGFyaS5nZXRTbGljZVBsYW5lTW92ZSQoKS5zdWJzY3JpYmUoKHsgYXhpcywgdmFsdWUgfSkgPT4ge1xuICAgICAgICBpZiAoYXhpcyA9PT0gJ3onKSB0aGlzLnNsaWNlRHJhZyQubmV4dChNYXRoLnJvdW5kKHZhbHVlKSk7XG4gICAgICAgIGVsc2UgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCB2YWx1ZSk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCkpKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZCh0aGlzLnN0b3JlLmdldEludmVydCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCkpKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZCh0aGlzLnN0b3JlLmdldENvbG9ybWFwKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICB9XG5cbiAgLyoqIEEgY2xhc3MncyBjb2xvdXI6IGl0cyBjbGFzc2lmaWNhdGlvbiBjb2xvdXIsIGVsc2UgaXRzIHJlZ2lvbiBzb3VyY2UncywgZWxzZSBhIGRlZmF1bHQuICovXG4gIHByaXZhdGUgY2xhc3NDb2xvcihsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdG9yZS5nZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpLmdldChsYWJlbCkgPz9cbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldygpPy5jb2xvck9mKHsgbGFiZWwsIGNvbG9yOiBudWxsIH0pID8/XG4gICAgICAnI2ZmY2MwMCdcbiAgICApO1xuICB9XG5cbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3IChudWxscyB3aGlsZSBpdCBpcyBub3Qgc3BsaXQpLiAqL1xuICBnZXRTZWN0aW9uVmlld3MkKCk6IE9ic2VydmFibGU8U2VjdGlvblZpZXdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VjdGlvbnMuZ2V0Vmlld3MkKCk7XG4gIH1cblxuICAvKiogTW92ZSBhIHNlY3Rpb24ncyBwbGFuZSB0byBgYXRgIChpbWFnZSBweCkuICovXG4gIHNldFNlY3Rpb25QbGFuZShheGlzOiBTZWN0aW9uQXhpcywgYXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VjdGlvbnMuc2V0UGxhbmUoYXhpcywgYXQpO1xuICB9XG5cbiAgLyoqIFRoZSBzbGljZSBwaWNrZWQgYnkgZHJhZ2dpbmcgdGhlIHogcGxhbmUgaW4gdGhlIHZvbHVtZTogdGhlIGhvc3Qgc2hvd3MgaXQgKGl0cyBzbGlkZXIpLiAqL1xuICBnZXRTbGljZURyYWckKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VEcmFnJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbWFnZVR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdCA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogVGhlIDJEIG5hcGFyaSB0eXBlcyAoaW1hZ2UsIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyLCBzcGF0aWFsIG9taWNzKSDigJQgYSAyRCBmYWxsYmFjayBjaGFpblxuICAgKiAgKE9TRCwgdGhlbiBQbG90bHkpLlxuICAgKlxuICAgKiAgTk9URSBmb3IgU1BBVElBTF9PTUlDUzogb25seSBuYXBhcmktanMgZHJhd3MgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMuIElmIGl0IGZhaWxzIChubyBXZWJHUFUsXG4gICAqICBkZXZpY2UgbG9zcykgdGhlIGZhbGxiYWNrIHJlbmRlcnMgdGhlIHRpc3N1ZSBpbWFnZSBBTE9ORSDigJQgdGhlIHNwYXRpYWwgbGF5ZXIgaXMgYWJzZW50LCBub3RcbiAgICogIGRlZ3JhZGVkLiBUaGF0IGlzIGRlbGliZXJhdGUgZm9yIG5vdzogc2hvd2luZyB0aGUgc2xpZGUgYmVhdHMgc2hvd2luZyBub3RoaW5nLCBhbmQgYSBQbG90bHlcbiAgICogIGBzY2F0dGVyZ2xgIHNwYXRpYWwgbW9kZSBpcyB0aGUgcGxhbm5lZCByZWFsIGZhbGxiYWNrIChzZWUgdGhlIHBsb3QtbW9kZSBkZXNpZ24gZG9jKS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaUltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5OQVBBUklfSU1BR0UgfHwgaXNOYXBhcmlTY2F0dGVyKHQpIHx8IGlzU3BhdGlhbE9taWNzKHQpO1xuICB9XG5cbiAgLyoqIFRoZSAzRCBuYXBhcmkgdHlwZXMgKHZvbHVtZS9pc29zdXJmYWNlL3N1cmZhY2Uvc2NhdHRlciwgcGx1cyB0aGUgM0Qgc3BhdGlhbCBjbG91ZCkg4oCUIG5vIDJEXG4gICAqICBmYWxsYmFjayBleGlzdHMgKE9TRCBpcyBpbWFnZS1vbmx5KSwgc28gdGhleSBmYWxsIHN0cmFpZ2h0IHRvIFBsb3RseS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaTNkVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05hcGFyaTNkKHQpIHx8IGlzU3BhdGlhbE9taWNzM2QodCk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCB0byBhdHRlbXB0IGZvciB0aGUgY3VycmVudCBwbG90IHR5cGUgdGhpcyByZW5kZXIuIFRoZSBmYWxsYmFjayBjaGFpbnMgYmVsb3cgYXJlXG4gICAqIG1pcnJvcmVkIGV4YWN0bHkgYnkge0BsaW5rIGxvYWR9IHNvIHRoZSBoYW5kbGUgYHBsb3QoKWAgcmVjZWl2ZXMgYWx3YXlzIGNvbWVzIGZyb20gdGhlXG4gICAqIGJhY2tlbmQgYHBsb3QoKWAgc2VsZWN0cyAobm8gbG9hZC9wbG90IGJhY2tlbmQgbWlzbWF0Y2gpOlxuICAgKiAgLSAyRCBpbWFnZSAoZXhwbGljaXQgYE5BUEFSSV9JTUFHRWAsIG9yIGBJTUFHRWAgd2l0aCB0aGUgV2ViR1BVIG9wdC1pbik6IG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIHBsYWluIGBJTUFHRWAgKG5vIG9wdC1pbik6IE9TRCDihpIgUGxvdGx5LlxuICAgKiAgLSAzRCBuYXBhcmkgKGBOQVBBUklfVk9MVU1FYC9gTkFQQVJJX0lTT1NVUkZBQ0VgKTogbmFwYXJpLWpzIOKGkiBQbG90bHkgKE9TRCBjYW4ndCByZW5kZXIgM0QpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUJhY2tlbmQoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQbG90VHlwZTtcbiAgICAvLyAyRCBpbWFnZSB3aXRoIGEgbmFwYXJpLWpzIGF0dGVtcHQgKGV4cGxpY2l0IG5hcGFyaSBpbWFnZSwgb3Igb3B0LWluIG9uIHRoZSBJbWFnZSB0eXBlKS5cbiAgICBpZiAodGhpcy5pc05hcGFyaUltYWdlVHlwZSh0KSB8fCAodGhpcy5pc0ltYWdlVHlwZSh0KSAmJiB0aGlzLmNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcikpIHtcbiAgICAgIGlmICghdGhpcy5uYXBhcmlGZWxsQmFjaykgcmV0dXJuIHRoaXMubmFwYXJpO1xuICAgICAgaWYgKCF0aGlzLm9zZEZlbGxCYWNrKSByZXR1cm4gdGhpcy5vc2Q7XG4gICAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gICAgfVxuICAgIC8vIFBsYWluIEltYWdlIHR5cGUgKG5vIG5hcGFyaSBvcHQtaW4pOiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgIGlmICh0aGlzLmlzSW1hZ2VUeXBlKHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2RGZWxsQmFjayA/IHRoaXMucGxvdGx5IDogdGhpcy5vc2Q7XG4gICAgfVxuICAgIC8vIDNEIG5hcGFyaSB0eXBlczogbmFwYXJpLWpzLCB3aXRoIFBsb3RseSBhcyB0aGUgb25seSB2aWFibGUgZmFsbGJhY2suXG4gICAgaWYgKHRoaXMuaXNOYXBhcmkzZFR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hcGFyaUZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm5hcGFyaTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqIEJhY2tlbmQgY3VycmVudGx5IG9uIHNjcmVlbiDigJQgd2hhdCBvbmdvaW5nIHpvb20vdG9vbC9yZWdpb24gb3BzIGFjdCBvbi4gKi9cbiAgcHJpdmF0ZSByZW5kZXJlcigpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlbmRlcmVkID8/IHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2tlbmQgcmVnaW9uLCB0b29sIGFuZCBvdmVybGF5IGNhbGxzIGFjdCBvbjogdGhlIHNsaWNlIHBhbmUncyBPU0Qgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzXG4gICAqIHNwbGl0IChyZWdpb25zIGFyZSBlZGl0ZWQgdGhlcmUpLCBlbHNlIHRoZSBiYWNrZW5kIG9uIHNjcmVlbi4gVmlldyBjYWxscyAoem9vbSwgZml0LCBjb2xvdXIsXG4gICAqIGV4cG9ydCkgc3RheSB3aXRoIHtAbGluayByZW5kZXJlcn0uXG4gICAqL1xuICBwcml2YXRlIHJlZ2lvbkJhY2tlbmQoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIHJldHVybiB0aGlzLnNsaWNlTW91bnRlZCA/IHRoaXMub3NkIDogdGhpcy5yZW5kZXJlcigpO1xuICB9XG5cbiAgLy8gU3lzdGVtIGNhcGFiaWxpdGllcyBhcmUgUGxvdGx5J3MgKHRoZSBmdWxsLWZlYXR1cmVkIGJhY2tlbmQpIHNvIHRoZSBVSVxuICAvLyBrZWVwcyBvZmZlcmluZyBldmVyeSBwbG90IHR5cGUgcmVnYXJkbGVzcyBvZiB3aGljaCBvbmUgaXMgb24gc2NyZWVuLlxuICBnZXQgY2FwYWJpbGl0aWVzKCk6IFZpZXdlckNhcGFiaWxpdGllcyB7XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmNhcGFiaWxpdGllcztcbiAgfVxuXG4gIC8vIOKUgOKUgCByZW5kZXIgLyB2aWV3cG9ydCDihpIgYWN0aXZlIHJlbmRlcmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIC8vIEEgc3RhY2sgY2FuIG9wZW4gYXdheSBmcm9tIHNsaWNlIDAgKGBpbml0aWFsWkluZGV4YCDigJQgYSB2b2x1bWUgb3BlbnNcbiAgICAvLyBtaWQtc3BlY2ltZW4pLCBhbmQgdGhhdCBhcnJpdmVzIGhlcmUgcmF0aGVyIHRoYW4gdGhyb3VnaCBzZXRaSW5kZXguXG4gICAgdGhpcy5jdXJyZW50WkluZGV4ID0gekluZGV4O1xuICAgIGNvbnN0IGJhY2tlbmQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubmFwYXJpLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWJvcnRlZDogbm9ib2R5IHdhbnRzIHRoaXMgaW1hZ2UgYW55IG1vcmUsIHNvIGRvbid0IGdvIG9uIHRvIGxvYWQgaXQgZWxzZXdoZXJlLlxuICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgICAvLyBNaXJyb3IgaW1hZ2VCYWNrZW5kKCkncyBmYWxsYmFjayBzbyBsb2FkICsgcGxvdCBwaWNrIHRoZSBzYW1lIGJhY2tlbmQ6XG4gICAgICAgIC8vICAtIDNEIG5hcGFyaSB0eXBlcyBoYXZlIG5vIDJEIGZhbGxiYWNrIOKGkiBzdHJhaWdodCB0byBQbG90bHkuXG4gICAgICAgIC8vICAtIDJEIGltYWdlIOKGkiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgICAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkuJywgZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBPcGVuU2VhZHJhZ29uLicsIGVycik7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcnkgT1NEOyBvbiBmYWlsdXJlIGZhbGwgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UgKG5vdCBwZXJtYW5lbnQg4oCUIHNlZSByZXNldCgpKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlhT3NkVGhlblBsb3RseShcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub3NkLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBPcGVuU2VhZHJhZ29uIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlLicsIGVycik7XG4gICAgICB0aGlzLm9zZEZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgfVxuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMudm9sdW1lVmlldyQubmV4dChpc05hcGFyaVZvbHVtZShwbG90VHlwZSkgfHwgaXNOYXBhcmlJc29zdXJmYWNlKHBsb3RUeXBlKSk7XG4gICAgdGhpcy5wbG90dGVkRmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMucGxvdHRlZEluZm8gPSBpbWFnZUluZm8gPz8gbnVsbDtcbiAgICB0aGlzLnBsb3R0ZWRIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgLy8gVGhlIHNsaWNlIHBhbmUgYmVsb25ncyB0byB0aGUgdm9sdW1lIHZpZXc6IGFub3RoZXIgcGxvdCB0eXBlIHRha2VzIGl0IGRvd24gKE9TRCBtYXkgYmVcbiAgICAvLyBhYm91dCB0byBkcmF3IHRoZSBtYWluIHZpZXcsIHdoaWNoIG11c3Qgbm90IGZpbmQgdGhlIHBhbmUncyB2aWV3ZXIgc3RpbGwgbW91bnRlZCkuXG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXckLnZhbHVlKSB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgIC8vIFJlZ2lvbiBzdXJmYWNlcyBiZWxvbmcgdG8gdGhlIGltYWdlIHRoZXkgd2VyZSBidWlsdCBmcm9tOiBhbm90aGVyIGltYWdlIGRyb3BzIHRoZW0uXG4gICAgaWYgKHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGggJiYgdGhpcy5wbG90dGVkRmlsZU5hbWUgIT09IHRoaXMuY2xhc3NlczNkSW1hZ2UpIHRoaXMuY2xlYXJSZWdpb25DbGFzc2VzM2QoKTtcbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIC8vIEFwcGx5IHRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChzbmFwc2hvdCBvbGQgcmVnaW9ucywgcmVzdG9yZSB0aGUgbmV3XG4gICAgLy8gaW1hZ2UncywgY2xlYXIgc2VsZWN0aW9uKSBmb3Igd2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyDigJQgUGxvdGx5IGRvZXNcbiAgICAvLyB0aGlzIGluc2lkZSBpdHMgb3duIHBsb3QoKSwgYnV0IE9TRCBkb2Vzbid0LCBzbyBkcml2ZSBpdCBoZXJlLiBJZGVtcG90ZW50XG4gICAgLy8gZm9yIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSAocmUpcGxvdC5cbiAgICB0aGlzLnBsb3RseS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIC8vIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlIHNhbWUgZGl2IOKAlCB0ZWFyIGRvd24gdGhlIG91dGdvaW5nIG9uZSBvbiBzd2l0Y2guXG4gICAgLy8gUGxvdGx5IG11c3QgYmUgKnB1cmdlZCogKG5vdCByZXNldCwgd2hpY2ggcmUtZHJhd3MgZW1wdHkgYXhlcykgYmVmb3JlIE9TRFxuICAgIC8vIHRha2VzIHRoZSBkaXYuXG4gICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkICYmIHRoaXMubGFzdFJlbmRlcmVkICE9PSBuZXh0KSB7XG4gICAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgPT09IHRoaXMucGxvdGx5KSB0aGlzLnBsb3RseS5wdXJnZVBsb3QoKTtcbiAgICAgIGVsc2UgdGhpcy5sYXN0UmVuZGVyZWQucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBuZXh0O1xuICAgIGNvbnN0IHBsb3R0ZWQgPSBuZXh0LnBsb3QocGxvdERpdiwgaW1hZ2VMb2FkZWQsIGltYWdlSW5mbywgc2NyZWVuSGVpZ2h0LCBwbG90VHlwZSwgaW5QbGFjZSk7XG4gICAgaWYgKCF0aGlzLnNsaWNlRGl2IHx8ICF0aGlzLnZvbHVtZVZpZXckLnZhbHVlKSByZXR1cm4gcGxvdHRlZDtcbiAgICAvLyBUaGUgc3BsaXQgdm9sdW1lIHZpZXc6IHRoZSBzbGljZSBwYW5lIGZvbGxvd3MgdGhlIGltYWdlIChhIG5ldyBvbmUsIG9yIGl0cyBzaGFycGVyIHBhc3MpLlxuICAgIHJldHVybiBwbG90dGVkLnRoZW4oKG9rKSA9PiB7XG4gICAgICBpZiAob2sgJiYgKCF0aGlzLnNsaWNlTW91bnRlZCB8fCB0aGlzLnNsaWNlRmlsZSAhPT0gaW1hZ2VJbmZvPy5maWxlTmFtZSB8fCBpblBsYWNlKSkge1xuICAgICAgICB2b2lkIHRoaXMubW91bnRTbGljZSghIWluUGxhY2UgJiYgdGhpcy5zbGljZU1vdW50ZWQgJiYgdGhpcy5zbGljZUZpbGUgPT09IGltYWdlSW5mbz8uZmlsZU5hbWUpO1xuICAgICAgfVxuICAgICAgLy8gVGhlIHZvbHVtZSB3YXMgYXNzZW1ibGVkIGFnYWluIChhbm90aGVyIGltYWdlLCBvciByZXNvbHV0aW9uKTogY3V0IHRoZSBzZWN0aW9ucyBmcm9tIGl0LlxuICAgICAgaWYgKG9rKSB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCk7XG4gICAgICByZXR1cm4gb2s7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgdGhlIHZvbHVtZSB2aWV3OiBzaG93IHRoZSBzbGljZSBiZWluZyBlZGl0ZWQgaW4gYGRpdmAgKE9wZW5TZWFkcmFnb24sIHdpdGggZXZlcnkgcmVnaW9uXG4gICAqIHRvb2wpIGJlc2lkZSB0aGUgM0Qgdmlldywgb3Igc3RvcCAobnVsbCkuIEtlcHQgYWNyb3NzIHJlLXBsb3RzIG9mIGEgdm9sdW1lIHZpZXc7IGFub3RoZXIgcGxvdFxuICAgKiB0eXBlIHRha2VzIHRoZSBwYW5lIGRvd24gYW5kIGEgdm9sdW1lIHZpZXcgYnJpbmdzIGl0IGJhY2suIFJlc29sdmVzIHdoZXRoZXIgdGhlIHBhbmUgc2hvd3MuXG4gICAqL1xuICBhc3luYyBzZXRTbGljZUVkaXRvcihkaXY6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLnNsaWNlRGl2ID0gZGl2O1xuICAgIGlmICh0aGlzLnNsaWNlRWRpdG9yJC52YWx1ZSAhPT0gISFkaXYpIHRoaXMuc2xpY2VFZGl0b3IkLm5leHQoISFkaXYpO1xuICAgIGlmICghZGl2KSB7XG4gICAgICB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb3VudFNsaWNlKGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBNb3VudCAob3IgcmVmcmVzaCBpbiBwbGFjZSkgT1NEIGluIHRoZSBzbGljZSBwYW5lIG9uIHRoZSBkaXNwbGF5ZWQgc2xpY2UuICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTbGljZShpblBsYWNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGl2ID0gdGhpcy5zbGljZURpdjtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICBpZiAoIWRpdiB8fCAhaW5mbz8udXJscz8ubGVuZ3RoIHx8ICF0aGlzLnZvbHVtZVZpZXckLnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5zbGljZVJlcXVlc3Q7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHRoaXMub3NkLmxvYWQoaW5mbywgdGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLm9zZC5wbG90KGRpdiwgbG9hZGVkLCBpbmZvLCB0aGlzLnBsb3R0ZWRIZWlnaHQsIFBsb3RUeXBlLklNQUdFLCBpblBsYWNlKTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zbGljZU1vdW50ZWQgPSBvaztcbiAgICAgIHRoaXMuc2xpY2VGaWxlID0gaW5mby5maWxlTmFtZTtcbiAgICAgIGlmIChvaykge1xuICAgICAgICAvLyBUaGUgc2xpY2UgbWF5IGhhdmUgbW92ZWQgd2hpbGUgdGhlIHBhbmUgbG9hZGVkLlxuICAgICAgICB0aGlzLm9zZC5zZXRaSW5kZXgodGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgICAgdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMuc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvaztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLnNsaWNlUmVxdWVzdClcbiAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gVGhlIHNsaWNlIHBhbmUgY291bGQgbm90IHNob3cgdGhlIGltYWdlLicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRha2UgdGhlIHNsaWNlIHBhbmUncyB2aWV3ZXIgZG93biAodGhlIHNwbGl0IHN0YXlzIHdhbnRlZCB3aGlsZSB7QGxpbmsgc2xpY2VEaXZ9IGlzIHNldCkuICovXG4gIHByaXZhdGUgdW5tb3VudFNsaWNlKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5yZXNldCgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgfVxuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZUZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZWxvYWRBbmRQbG90KCk7XG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgb2YgYSByZW5kZXIgY3ljbGU6IHJlLWVuYWJsZSBuYXBhcmktanMvT1NEIGF0dGVtcHRzIChjbGVhciBhbnkgcHJpb3JcbiAgICAvLyBwZXItaW1hZ2UgZmFsbGJhY2spIGFuZCB0ZWFyIGRvd24gd2hhdGV2ZXIncyBvbiBzY3JlZW4uXG4gICAgdGhpcy5vc2RGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVzZXQoKTtcbiAgfVxuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVsYXlvdXQodHJ1ZUltYWdlU2l6ZSk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldEF4ZXMoKTtcbiAgfVxuICBmaXRUb1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmZpdFRvVmlldygpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30uICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpdFRvVmlldygpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbUluKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbU91dCgpO1xuICB9XG4gIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldERyYWdNb2RlKG1vZGUpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkgdGhpcy5vc2Quc2V0RHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEV2ZXJ5IGJhY2tlbmQsIG9uIHNjcmVlbiBvciBub3QuICovXG4gIHByaXZhdGUgYmFja2VuZHMoKTogSVZpZXdlckJhY2tlbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmF2aWdhdG9yIC8gc21vb3RoaW5nIG9wdGlvbnMsIGFwcGxpZWQgdG8gRVZFUlkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChub3RcbiAgICoganVzdCB0aGUgYWN0aXZlIHJlbmRlcmVyKTogY29uc3VtZXJzIHNldCB0aGVtIGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyLCB3aGVuXG4gICAqIGByZW5kZXJlcigpYCBpcyBzdGlsbCB0aGUgUGxvdGx5IGRlZmF1bHQsIGFuZCBPU0QvbmFwYXJpLWpzIG11c3QgcmVjZWl2ZSB0aGVtXG4gICAqIHRvIGhvbm91ciB0aGVtIGF0IHZpZXdlciBjcmVhdGlvbi5cbiAgICovXG4gIGdldE9zZFZpZXdPcHRpb25zKCk6IElPc2RWaWV3T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMudmlld09wdGlvbnM7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3T3B0aW9uczogSU9zZFZpZXdPcHRpb25zID0ge1xuICAgIHNldE5hdmlnYXRvclZpc2libGU6ICh2aXNpYmxlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gICAgfSxcbiAgICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQ6IChlbmFibGVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICB9LFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldE5hdmlnYXRvclZpc2libGUoKWAuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYC4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgfVxuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0WkluZGV4KHpJbmRleCk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5zZXRaSW5kZXgoekluZGV4KTtcbiAgICAgIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICB9XG4gIH1cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFRydWVJbWFnZVNpemUoKTtcbiAgfVxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEN1cnJlbnRJbWFnZSgpO1xuICB9XG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldERpc3BsYXllZFBpeGVsRGF0YSgpO1xuICB9XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpO1xuICB9XG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgICB0aGlzLnZvbHVtZVZpZXckLm5leHQoaXNOYXBhcmlWb2x1bWUocGxvdFR5cGUpIHx8IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSkpO1xuICAgIHRoaXMucGxvdGx5LnNldFBsb3RUeXBlKHBsb3RUeXBlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRTdXJmYWNlM2RDb250cm9scygpYC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKG1vZGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4gKG5hcGFyaS1qcyksIGVsc2UgbnVsbC4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uc2V0KClgLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoc2NhbGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KClgLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LmdldCgpID8/IDE7XG4gIH1cbiAgLyoqIFRoZSB2aWV3cG9ydCBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIGZvciBhIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZS4gTnVsbFxuICAgKiAgd2hlbiB0aGF0IGJhY2tlbmQgY2Fubm90IHByb3ZpZGUgb25lIChlLmcuIE9TRCBmZWxsIGJhY2sgdG8gUGxvdGx5KS4gKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRQbG90TW9kZVZpZXdwb3J0Py4oKSA/PyBudWxsO1xuICB9XG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFBsb3RseSBlbnVtZXJhdGVzIHRoZSBmdWxsIFBMT1RfVFlQRV9ERVNDUklQVE9SUyBtYXAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgdGhlXG4gICAgLy8gbmFwYXJpLWpzIFdlYkdQVSB0eXBlcyAoaml0LXVpIzEwMikg4oCUIHNvIHRoaXMgc2luZ2xlIHNvdXJjZSBjb3ZlcnMgdGhlbSAobm8gZHVwbGljYXRlcykuXG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsb25nLWxpdmVkIG9ic2VydmFibGVzICsgc3RhY2sgZmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNldFN0YWNrTG9hZGluZyhiOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0U3RhY2tMb2FkaW5nKGIpO1xuICB9XG4gIC8vIENhbmNlbCBpbi1mbGlnaHQgbG9hZGluZyBvbiBldmVyeSBiYWNrZW5kIOKAlCB0aGUgdXNlcidzIENhbmNlbCBzaG91bGRuJ3QgZGVwZW5kIG9uIHdoaWNoIG9uZSBpc1xuICAvLyBhY3RpdmUuIE9ubHkgYmFja2VuZHMgdGhhdCBzdHJlYW0gZnJhbWVzIChuYXBhcmktanMpIGRvIHJlYWwgd29yazsgdGhlIHJlc3Qgbm8tb3AuIFRoZSBjb25jcmV0ZVxuICAvLyBiYWNrZW5kIGNsYXNzZXMgZG9uJ3QgYWxsIGRlY2xhcmUgdGhlIG9wdGlvbmFsIGNvbnRyYWN0IG1ldGhvZCwgc28gY2FsbCBpdCB2aWEgSVZpZXdlckJhY2tlbmQuXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBiYWNrZW5kIG9mIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXSBhcyBJVmlld2VyQmFja2VuZFtdKSB7XG4gICAgICBiYWNrZW5kLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIH1cbiAgfVxuICAvLyBMb2FkaW5nIHN0YXRlIGlzIHN1cmZhY2VkIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgZG9pbmcgdGhlIHdvcms6IE9TRCBhbmQgbmFwYXJpLWpzICh2b2x1bWVcbiAgLy8gYXNzZW1ibHkpIGRyaXZlIHRoZWlyIG93biBzdWJqZWN0cywgc28gbWVyZ2UgYWxsIHRocmVlIGludG8gb25lIHN0YWJsZSBzdHJlYW0gdGhlIGhvc3RcbiAgLy8gc3Vic2NyaWJlcyB0byBvbmNlLiAoUHJldmlvdXNseSBoYXJkY29kZWQgdG8gUGxvdGx5LCBzbyBuYXBhcmkvT1NEIHByb2dyZXNzIG5ldmVyIHNob3dlZC4pXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucGxvdGx5LmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm9zZC5pc1N0YWNrTG9hZGluZygpLFxuICAgICAgdGhpcy5uYXBhcmkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICBdKS5waXBlKG1hcCgoZmxhZ3MpID0+IGZsYWdzLnNvbWUoQm9vbGVhbikpKTtcbiAgfVxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIC8vIFJlcG9ydCB0aGUgcHJvZ3Jlc3Mgb2Ygd2hpY2hldmVyIGJhY2tlbmQgaXMgQUNUSVZFTFkgbG9hZGluZyAobWF4IGFjcm9zcyBhY3RpdmUgb25lcykuIEEgcGxhaW5cbiAgICAvLyBtZXJnZSBsZXQgYW4gaWRsZSBiYWNrZW5kJ3Mgc3RhbGUgdmFsdWUgd2luIHRoZSBzdHJlYW0gb24gYSByZS1sb2FkIOKAlCBsZWF2aW5nIHRoZSBiYXIgYmVsb3cgdGhlXG4gICAgLy8gYWN0aXZlIGJhY2tlbmQncyByZWFsIHByb2dyZXNzIChlLmcuIHN0dWNrIH7ihZMgd2hpbGUgdGhlICUgcmVhZCAxMDApLiBHYXRpbmcgYnkgdGhlIGxvYWRpbmcgZmxhZ1xuICAgIC8vIGlnbm9yZXMgaWRsZSBiYWNrZW5kcywgc28gdGhlIGJhciB0cmFja3MgdGhlIG9uZSBkb2luZyB0aGUgd29yayBhbmQgcmVhY2hlcyAxMDAlLlxuICAgIGNvbnN0IHRyYWNrID0gKHY6IElWaWV3ZXJCYWNrZW5kKTogT2JzZXJ2YWJsZTxbbnVtYmVyLCBib29sZWFuXT4gPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW3YuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKSwgdi5pc1N0YWNrTG9hZGluZygpXSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RyYWNrKHRoaXMucGxvdGx5KSwgdHJhY2sodGhpcy5vc2QpLCB0cmFjayh0aGlzLm5hcGFyaSldKS5waXBlKFxuICAgICAgbWFwKChwYWlycykgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBwYWlycy5maWx0ZXIoKFssIGxvYWRpbmddKSA9PiBsb2FkaW5nKS5tYXAoKFtwXSkgPT4gcCk7XG4gICAgICAgIHJldHVybiBhY3RpdmUubGVuZ3RoID8gTWF0aC5tYXgoLi4uYWN0aXZlKSA6IDA7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIC8vIEV2ZXJ5IGJhY2tlbmQgZml0cyB0byB2aWV3IG9uIGl0cyBvd24gKFBsb3RseSdzIGF1dG9zY2FsZSwgT1NEJ3MgZ29Ib21lLCBuYXBhcmkncyBjYW1lcmFcbiAgLy8gZml0KSBhbmQgZWFjaCBlbWl0cyBmcm9tIGl0cyBvd24gc3ViamVjdCwgc28gbWVyZ2UgYWxsIHRocmVlOiBsaXN0ZW5pbmcgdG8gUGxvdGx5IGFsb25lXG4gIC8vIG1pc3NlZCB0aGUgY29udGV4dC1tZW51IEF1dG9zY2FsZSBvbiB0aGUgSW1hZ2UgYW5kIG5hcGFyaSB2aWV3cy5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgdGhpcy5wbG90bHkuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMub3NkLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgICB0aGlzLm5hcGFyaS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICkucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG4gIH1cbiAgLyoqIFRoZSBsaW5lLVJPSSBwcm9maWxlczogc2FtcGxlZCBieSB0aGUgYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5nZXRJbnRlbnNpdHlQcm9maWxlJCgpO1xuICB9XG4gIC8vIFRoZSBpbnRlbnNpdHkgaW5zZXQgaXMgYSBQbG90bHkgTElORSBjaGFydCDigJQgcmVuZGVyIGl0IHRocm91Z2ggUGxvdGx5IHdoaWNoZXZlclxuICAvLyBiYWNrZW5kIGRyYXdzIHRoZSBtYWluIGltYWdlLlxuICByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkucmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQsIHByb2ZpbGVzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCByZWdpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBSZWdpb24gc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSwgc28gZXZlcnkgcmVhZCBhbmQgd3JpdGUgZ29lc1xuICAvLyBzdHJhaWdodCB0byBpdC4gRXZlcnkgYmFja2VuZCBkcmF3cyBmcm9tIHRoZSBzdG9yZSdzIGV2ZW50czogdGhlIE9TRCBhbmRcbiAgLy8gbmFwYXJpLWpzIG92ZXJsYXlzIGFuZCBQbG90bHkncyBzaGFwZSBwcm9qZWN0aW9uIHJlZHJhdyBvbiBpdHMgcmVnaW9uLXVwZGF0ZVxuICAvLyBhbmQgc2VsZWN0aW9uIHN0cmVhbXMsIGFuZCB0aGUgY2FudmFzIHRvb2xzIHJlc2V0IG9uIGdldFJlZ2lvblNldFJlcGxhY2VkJFxuICAvLyAodW5kbywgcmVkbywgYSBzbGljZSBzd2l0Y2gpLlxuICBzZXRSZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgICBhcHBlbmQ/OiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucywgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBhcHBlbmQpO1xuICB9XG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblBvbHlnb25zKCk7XG4gIH1cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpO1xuICB9XG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0UmVnaW9uKHJlZ2lvbik7XG4gIH1cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTtcbiAgfVxuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG4gIH1cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICB9XG4gIGdldEZpbGxDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpO1xuICB9XG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7XG4gIH1cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsLCBjb2xvcik7XG4gIH1cbiAgLy8gQW5ub3RhdGlvbi1jbGFzcyBwcmVzZXRzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgKGJhY2tlbmQtbmV1dHJhbFxuICAvLyBzZXNzaW9uIHN0YXRlKSwgc28gcm91dGUgc3RyYWlnaHQgdG8gaXQgcmF0aGVyIHRoYW4gdGhyb3VnaCByZW5kZXJlcigpLiAoaml0LXVpIzcwKVxuICBnZXRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKTtcbiAgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0JCgpO1xuICB9XG4gIHNldFByZXNldFNldChzZXQ6IFByZXNldFNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0UHJlc2V0U2V0KHNldCk7XG4gIH1cbiAgdXBzZXJ0Q2xhc3MocHJlc2V0OiBDbGFzc1ByZXNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUudXBzZXJ0Q2xhc3MocHJlc2V0KTtcbiAgfVxuICByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlbW92ZUNsYXNzKG5hbWUpO1xuICB9XG4gIHJlc2V0UHJlc2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlc2V0UHJlc2V0cygpO1xuICB9XG4gIHVuZG8oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS51bmRvKCk7XG4gIH1cbiAgcmVkbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlZG8oKTtcbiAgfVxuICBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblVuZG8oKTtcbiAgfVxuICBjYW5SZWRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblJlZG8oKTtcbiAgfVxuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRDYW5VbmRvJCgpO1xuICB9XG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblJlZG8kKCk7XG4gIH1cbiAgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgfVxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pbXBvcnRSZWdpb25zKGdlb0pzb25TdHIpO1xuICB9XG4gIC8qKiBEb3dubG9hZCBgcmVnaW9uc2AgYXMgR2VvSlNPTiwgbmFtZWQgYWZ0ZXIgdGhlIGltYWdlIGxhc3QgcGxvdHRlZC4gKi9cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZXhwb3J0UmVnaW9ucyhyZWdpb25zLCB0aGlzLnBsb3R0ZWRGaWxlTmFtZSk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zKTtcbiAgfVxuXG4gIC8qKiBIb2xkIGEgbGFyZ2UgcmVnaW9uIHNldCBhcyBhIHRpbGVkIHJlZ2lvbiBzb3VyY2UgKHNlZSBSZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UpLiAqL1xuICBhdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlOiBSZWdpb25Tb3VyY2UgfCBSZWdpb25Tb3VyY2VPcGVuZXIsIHNsaWNlcz86IFJlZ2lvblNvdXJjZVNsaWNlcyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHNvdXJjZSwgc2xpY2VzKTtcbiAgfVxuICBhc3luYyBpbXBvcnRSZWdpb25Tb3VyY2UoZ2VvSnNvblN0cjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGdlb0pzb25TdHIubGVuZ3RoIDwgKHRoaXMuY29uZmlnPy5yZWdpb25Tb3VyY2VNaW5DaGFycyA/PyBSRUdJT05fU09VUkNFX01JTl9DSEFSUykpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgb3BlbmVkOiBSZWdpb25Tb3VyY2UgfCBudWxsID0gYXdhaXQgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgLy8gVGhlIGZpcnN0IG9wZW4gaXMgdGhlIG9uZSBqdXN0IG1hZGU7IGEgc291cmNlIGNsb3NlZCB0byBzYXZlIG1lbW9yeSBwYXJzZXMgYWdhaW4uXG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UoKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gb3BlbmVkO1xuICAgICAgb3BlbmVkID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW5HZW9Kc29uUmVnaW9uU291cmNlKGdlb0pzb25TdHIpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRyb3BSZWdpb25Tb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZHJvcFNsaWNlUmVnaW9uU291cmNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQSB0aWNrZXQgZm9yIGEgcmVnaW9uIGltcG9ydCB0aGF0IGlzIGFib3V0IHRvIHJlYWQgb3IgZGVjb2RlIGl0cyBmaWxlczogdGhlIGltcG9ydCBtZXRob2RzXG4gICAqIGdpdmVuIGl0IGNoYW5nZSBub3RoaW5nIG9uY2UgaXQgaXMgc3RhbGUg4oCUIGFub3RoZXIgaW1wb3J0IHRvb2sgYSB0aWNrZXQgc2luY2UsIGFub3RoZXIgaW1hZ2VcbiAgICogd2FzIHBsb3R0ZWQsIG9yIHRoZSBzZXJ2aWNlIHdhcyBkZXN0cm95ZWQg4oCUIHNvIGFuIGltcG9ydCB0aGF0IGZpbmlzaGVzIGxhdGUgbmV2ZXIgbGFuZHMgb24gYW5cbiAgICogaW1hZ2UgaXQgd2FzIG5vdCBzdGFydGVkIGZvci5cbiAgICovXG4gIHJlZ2lvbkltcG9ydFRpY2tldCgpOiBudW1iZXIge1xuICAgIHRoaXMuaW1wb3J0VGlja2V0ID0geyBpZDogdGhpcy5pbXBvcnRUaWNrZXQuaWQgKyAxLCBpbWFnZTogdGhpcy5pbXBvcnRJbWFnZUtleSgpIH07XG4gICAgcmV0dXJuIHRoaXMuaW1wb3J0VGlja2V0LmlkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHRpY2tldGAgaXMgc3RpbGwgdGhlIGN1cnJlbnQgaW1wb3J0J3MsIG9uIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldFZhbGlkKHRpY2tldDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRpY2tldCA9PT0gdGhpcy5pbXBvcnRUaWNrZXQuaWQgJiYgdGhpcy5pbXBvcnRUaWNrZXQuaW1hZ2UgPT09IHRoaXMuaW1wb3J0SW1hZ2VLZXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW1wb3J0SW1hZ2VLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gUmVnaW9uU2NvcGVDYWNoZS5pbWFnZUtleSh0aGlzLnBsb3R0ZWRJbmZvID8/IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgaW1hZ2UncyByZWdpb25zIGFuZCByZWdpb24gc291cmNlcyB3aXRoIG9uZSBzb3VyY2UgcGVyIHNsaWNlLCBhcyBhbiBpbXBvcnRlZCBsYWJlbFxuICAgKiB2b2x1bWUgb3IgZm9sZGVyIG9mIHBlci1zbGljZSByZWdpb24gZmlsZXMgZ2l2ZXMgdGhlbTogYG9wZW5lcnNgIGJ5IHNsaWNlIGluZGV4LCBlYWNoIG9wZW5lZFxuICAgKiB0aGUgZmlyc3QgdGltZSBpdHMgc2xpY2UgaXMgc2hvd24uIEEgc2luZ2xlIGltYWdlIHRha2VzIHNsaWNlIDAncy4gUmV0dXJucyBob3cgbWFueSBzbGljZXNcbiAgICogaGF2ZSBhIHNvdXJjZSwgb3IgbnVsbCAoY2hhbmdpbmcgbm90aGluZykgd2hlbiBgdGlja2V0YCBpcyBzdGFsZSAoc2VlXG4gICAqIHtAbGluayByZWdpb25JbXBvcnRUaWNrZXR9KS4gVGhlIHNvdXJjZXMgYXJlIG1hcmtlZCBpbXBvcnRlZCwgc28gYSBzYXZlIHdyaXRlcyBldmVyeSBzbGljZS5cbiAgICovXG4gIGltcG9ydFNsaWNlUmVnaW9uU291cmNlcyhvcGVuZXJzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlZ2lvblNvdXJjZU9wZW5lcj4sIHRpY2tldD86IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh0aWNrZXQgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pbXBvcnRUaWNrZXRWYWxpZCh0aWNrZXQpKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnJlZ2lvbkltcG9ydFRpY2tldCgpOyAvLyBzdXBlcnNlZGVzIGFueSBpbXBvcnQgc3RpbGwgaW4gZmxpZ2h0XG4gICAgY29uc3QgaW5mbyA9IHRoaXMucGxvdHRlZEluZm87XG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZXRhY2hSZWdpb25Tb3VyY2VzKCk7XG4gICAgaWYgKCFpbmZvPy5pc1N0YWNrKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IG9wZW5lcnMuZ2V0KDApID8/IG9wZW5lcnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgICAgaWYgKCFmaXJzdCkgcmV0dXJuIDA7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShmaXJzdCwgeyBzbGljZTogMCB9LCB0cnVlKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aGlzLmVudGVySW1wb3J0ZWRTdGFjayhpbmZvKTtcbiAgICBmb3IgKGNvbnN0IFt6LCBvcGVuXSBvZiBvcGVuZXJzKSB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShvcGVuLCB7IHNsaWNlOiB6IH0sIHRydWUpO1xuICAgIHJldHVybiBvcGVuZXJzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgaW1hZ2UncyByZWdpb25zIGFuZCByZWdpb24gc291cmNlcyB3aXRoIG9uZSBpbXBvcnRlZCBzb3VyY2UgKGEgcmVnaW9uIHNldCB0aGVcbiAgICogaG9zdCdzIHNlcnZlciBzZXJ2ZXMpOiBvdmVyIGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgd2hlbiBpdCBpcyB6LWluZGV4ZWQsIGVsc2Ugb24gdGhlIHNsaWNlXG4gICAqIHNob3duLCBhcyB7QGxpbmsgYXBwbHlJbWFnZVJvaXN9IGxheXMgb3V0IGFuIGltYWdlJ3Mgb3duLiBSZXNvbHZlcyBmYWxzZSwgY2hhbmdpbmcgbm90aGluZ1xuICAgKiAoYW5kIGRpc3Bvc2luZyB0aGUgc291cmNlKSwgd2hlbiB0aGUgaW1wb3J0IHdlbnQgc3RhbGUgd2hpbGUgaXQgb3BlbmVkOiBhbm90aGVyIGltcG9ydCwgb3JcbiAgICogYW5vdGhlciBpbWFnZSAoc2VlIHtAbGluayByZWdpb25JbXBvcnRUaWNrZXR9OyBvbmUgaXMgdGFrZW4gaGVyZSB3aGVuIGB0aWNrZXRgIGlzIG5vdCBnaXZlbikuXG4gICAqL1xuICBhc3luYyBpbXBvcnRSZWdpb25Tb3VyY2VPcGVuZXIob3BlbjogUmVnaW9uU291cmNlT3BlbmVyLCB0aWNrZXQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBtaW5lID0gdGlja2V0ID8/IHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGZpcnN0OiBSZWdpb25Tb3VyY2UgfCBudWxsID0gYXdhaXQgb3BlbigpO1xuICAgIGlmICghdGhpcy5pbXBvcnRUaWNrZXRWYWxpZChtaW5lKSkge1xuICAgICAgZmlyc3QuZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXVzZTogUmVnaW9uU291cmNlT3BlbmVyID0gKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gZmlyc3Q7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICByZXR1cm4gc291cmNlID8gUHJvbWlzZS5yZXNvbHZlKHNvdXJjZSkgOiBvcGVuKCk7XG4gICAgfTtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICBjb25zdCBwbGFuZXMgPSBmaXJzdC5pbmZvLnBsYW5lcztcbiAgICBjb25zdCB6SW5kZXhlZCA9ICEhaW5mbz8uaXNTdGFjayAmJiBwbGFuZXMuc29tZSgocCkgPT4gcCAhPT0gMCk7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZXRhY2hSZWdpb25Tb3VyY2VzKCk7XG4gICAgaWYgKHpJbmRleGVkKSB7XG4gICAgICB0aGlzLmVudGVySW1wb3J0ZWRTdGFjayhpbmZvIGFzIElJbWFnZUluZm8pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UocmV1c2UsICdwbGFuZXMnLCBbLi4ucGxhbmVzXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgeyBzbGljZTogdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKSB9LCB0cnVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBFbXB0eSBldmVyeSBzbGljZSBvZiBhIHN0YWNrIChpdHMgcmVnaW9ucyBhbmQgdW5kbyBoaXN0b3J5KSBmb3IgcmVnaW9ucyBpbXBvcnRlZCBvdmVyIGl0LiAqL1xuICBwcml2YXRlIGVudGVySW1wb3J0ZWRTdGFjayhpbmZvOiBJSW1hZ2VJbmZvKTogdm9pZCB7XG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpXG4gICAgICA/IHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlTGF5b3V0KClcbiAgICAgIDogaW5mby50aWxlZCA9PT0gZmFsc2VcbiAgICAgICAgPyAncGVyLXNsaWNlLWZpbGUnXG4gICAgICAgIDogJ2NvbWJpbmVkJztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKG5ldyBNYXAoKSwgdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKSwgbGF5b3V0KTtcbiAgfVxuICBnZXRSZWdpb25Tb3VyY2VWaWV3JCgpOiBPYnNlcnZhYmxlPFJlZ2lvblNvdXJjZVZpZXcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldyQoKTtcbiAgfVxuICBnZXRSZWdpb25Tb3VyY2VJbmRleChxdWVyeTogT21pdDxSZWdpb25JbmRleFF1ZXJ5LCAnZXhjbHVkZSc+KTogUHJvbWlzZTxSZWdpb25JbmRleFBhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VJbmRleChxdWVyeSk7XG4gIH1cbiAgc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSwgYWRkaXRpdmU/OiBib29sZWFuKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKGlkcywgYWRkaXRpdmUpO1xuICB9XG4gIGRlbGV0ZVNvdXJjZUZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZVNvdXJjZUZlYXR1cmVzKGlkcyk7XG4gIH1cbiAgZ2V0UmVnaW9uU3R5bGUkKCk6IE9ic2VydmFibGU8UmVnaW9uU3R5bGU+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25TdHlsZSQoKTtcbiAgfVxuICBzZXRSZWdpb25TdHlsZShwYXRjaDogUGFydGlhbDxSZWdpb25TdHlsZT4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvblN0eWxlKHBhdGNoKTtcbiAgfVxuICAvLyDilIDilIAgUmVnaW9ucyBpbiAzRDogdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIHNob3duIGluIHRoZSB2b2x1bWUgdmlldyDilIDilIDilIDilIDilIBcblxuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcgaXMgb24gc2NyZWVuOiByZWdpb25zIGNhbiBiZSBzaG93biBpbiAzRC4gKi9cbiAgZ2V0Vm9sdW1lVmlldyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lVmlldyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAoaXQgc2hvd3Mgd2hpbGUgYSB2b2x1bWUgdmlldyBpcyBvbiBzY3JlZW4pLiAqL1xuICBnZXRTbGljZUVkaXRvciQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VFZGl0b3IkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3IGRyYXdzIHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlIHZvbHVtZS4gKi9cbiAgZ2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlIHZvbHVtZSAoaXQgaGlkZXMgbm9uZSBvZiB0aGVtOiBzdXJmYWNlcyBpbnNpZGUgaXRzXG4gICAqIGJyaWdodCBzdHJ1Y3R1cmVzLCBhbiBPQ1QncyBsYXllciBib3VuZGFyaWVzKSBvciBoaWRkZW4gYmVoaW5kIHdoYXQgaXQgc2hvd3MgKHRoZSBkZWZhdWx0KS5cbiAgICovXG4gIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKHRocm91Z2g6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQudmFsdWUgPT09IHRocm91Z2gpIHJldHVybjtcbiAgICB0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lJC5uZXh0KHRocm91Z2gpO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKHRocm91Z2gpO1xuICB9XG5cbiAgLyoqIFRoZSBjbGFzcyBncm91cHMgc2hvd24gaW4gM0Qgb24gdGhpcyBpbWFnZSAoW10gYWZ0ZXIgYSBzd2l0Y2ggdG8gYW5vdGhlciBpbWFnZSkuICovXG4gIGdldFJlZ2lvbkNsYXNzZXMzZCQoKTogT2JzZXJ2YWJsZTxSZWFkb25seUFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0+PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NlczNkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBIaWRlIGV2ZXJ5IHJlZ2lvbiBzdXJmYWNlIGFuZCBmb3JnZXQgdGhlbSAoYSBidWlsZCBzdGlsbCBydW5uaW5nIGlzIGRyb3BwZWQpLiAqL1xuICBwcml2YXRlIGNsZWFyUmVnaW9uQ2xhc3NlczNkKCk6IHZvaWQge1xuICAgIHRoaXMubWVzaFJlcXVlc3QrKztcbiAgICB0aGlzLnNob3duM2QgPSBbXTtcbiAgICB0aGlzLmNsYXNzZXMzZCQubmV4dChbXSk7XG4gICAgdGhpcy5jbGFzc2VzM2RJbWFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25NZXNoZXMoW10sIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlnaGxpZ2h0KFtdKTtcbiAgfVxuXG4gIC8qKiBIaWdobGlnaHQgdGhlIHN1cmZhY2VzIG9mIHRoZXNlIGdyb3VwIGtleXMgaW4gdGhlIHZvbHVtZSB2aWV3IChub25lOiBhbGwgYXMgdXN1YWwpLiAqL1xuICBoaWdobGlnaHRSZWdpb25DbGFzc2VzM2Qoa2V5czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWdobGlnaHQoa2V5cyk7XG4gIH1cblxuICAvKiogQSBzdXJmYWNlIGNsaWNrZWQgaW4gdGhlIHZvbHVtZSB2aWV3IHdpdGggdGhlIHNlbGVjdGlvbiB0b29sIChpdHMgZ3JvdXAga2V5KSwgb3Igbm9uZSAobnVsbCkuICovXG4gIGdldFJlZ2lvblBpY2tlZDNkJCgpOiBPYnNlcnZhYmxlPHsga2V5OiBzdHJpbmcgfCBudWxsOyBhZGRpdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMubmFwYXJpLmdldFJlZ2lvbk1lc2hQaWNrJCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlc2UgZ3JvdXBzIG9mIGNsYXNzZXMgaW4gdGhlIHZvbHVtZSB2aWV3IGFzIDNEIHJlY29uc3RydWN0aW9ucyAoZWFjaCBncm91cCBvbmUgc3VyZmFjZVxuICAgKiBpbiBpdHMgY29sb3VyOiBhbiBhdGxhcyBzdHJ1Y3R1cmUgd2l0aCBpdHMgc3Vic3RydWN0dXJlcyksIGFuZCBvbmx5IHRoZXNlOyBbXSBoaWRlcyB0aGVtLlxuICAgKiBSZWNvbnN0cnVjdGVkIGZyb20gZXZlcnkgc2xpY2UncyBvdXRsaW5lcyBhdCB0aGUgdm9sdW1lJ3MgcmVzb2x1dGlvbiwgY2FjaGVkIHBlciBpbWFnZS5cbiAgICovXG4gIGFzeW5jIHNob3dSZWdpb25DbGFzc2VzM2QoXG4gICAgZ3JvdXBzOiBSZWFkb25seUFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdOyBjb2xvcjogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5tZXNoUmVxdWVzdDtcbiAgICB0aGlzLmNsYXNzZXMzZEltYWdlID0gdGhpcy5wbG90dGVkRmlsZU5hbWU7XG4gICAgdGhpcy5zaG93bjNkID0gZ3JvdXBzO1xuICAgIC8vIFdoYXQgYW4gZWRpdCBmcm9tIG5vdyBvbiBpcyBjb21wYXJlZCB3aXRoICh0aGUgbGl2ZSBzbGljZSBtYXkgbm90IGhhdmUgY2hhbmdlZCB5ZXQpLlxuICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgIHRoaXMudHJhY2tMaXZlQ2xhc3NlcygpO1xuICAgIHRoaXMuY2xhc3NlczNkJC5uZXh0KGdyb3Vwcy5tYXAoKGcpID0+ICh7IGtleTogZy5rZXksIGNsYXNzZXM6IGcuY2xhc3NlcyB9KSkpO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk/LndpZHRoID8/IDEwMjQ7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMubmFwYXJpLnJlZ2lvblZveGVsU3RlcCgpID8/IE1hdGgubWF4KDEsIHdpZHRoIC8gMjU2KTtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMucGxvdHRlZEZpbGVOYW1lID8/ICcnO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gKGc6IHsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfSkgPT4gYCR7aW1hZ2V9fCR7c3RlcC50b0ZpeGVkKDMpfXwke2cuY2xhc3Nlcy5qb2luKCcsJyl9YDtcbiAgICBjb25zdCBtaXNzaW5nID0gZ3JvdXBzLmZpbHRlcigoZykgPT4gIXRoaXMubWVzaENhY2hlLmhhcyhjYWNoZUtleShnKSkpO1xuICAgIGlmIChtaXNzaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmFtZXMgPSBtaXNzaW5nLm1hcCgoZykgPT4gZy5rZXkpO1xuICAgICAgY29uc3Qgd2hhdCA9IG5hbWVzLmxlbmd0aCA+IDMgPyBgJHtuYW1lcy5sZW5ndGh9IHJlZ2lvbnNgIDogbmFtZXMuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IGRvbmUgPSB0aGlzLm5hcGFyaS5iZWdpblRhc2soYEJ1aWxkaW5nICR7d2hhdH0gaW4gM0TigKZgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1aWx0ID0gYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5yZWNvbnN0cnVjdENsYXNzZXMoXG4gICAgICAgICAgbWlzc2luZy5tYXAoKGcpID0+ICh7IGtleTogY2FjaGVLZXkoZyksIGNsYXNzZXM6IGcuY2xhc3NlcyB9KSksXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY2xhc3Nlc09mID0gbmV3IE1hcChtaXNzaW5nLm1hcCgoZykgPT4gW2NhY2hlS2V5KGcpLCBnLmNsYXNzZXNdKSk7XG4gICAgICAgIGZvciAoY29uc3QgYiBvZiBidWlsdCkgdGhpcy5tZXNoQ2FjaGUuc2V0KGIua2V5LCB7IG1lc2g6IGIubWVzaCwgY2xhc3NlczogY2xhc3Nlc09mLmdldChiLmtleSkgPz8gW10gfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLm1lc2hSZXF1ZXN0KSByZXR1cm47XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uTWVzaGVzKFxuICAgICAgZ3JvdXBzLm1hcCgoZykgPT4ge1xuICAgICAgICBjb25zdCBtZXNoID0gdGhpcy5tZXNoQ2FjaGUuZ2V0KGNhY2hlS2V5KGcpKSEubWVzaDtcbiAgICAgICAgcmV0dXJuIHsga2V5OiBnLmtleSwgY29sb3I6IGcuY29sb3IsIGxhYmVsOiBnLmxhYmVsLCB2ZXJ0aWNlczogbWVzaC52ZXJ0aWNlcywgZmFjZXM6IG1lc2guZmFjZXMgfTtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5wbG90dGVkRmlsZU5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9ucyBjaGFuZ2VkOiB3aGVuIHRoZSBsaXZlIHNsaWNlJ3MgcmVnaW9ucyBvZiBzb21lIGNsYXNzZXMgZGlkIChhbiBlZGl0LCBhbiB1bmRvLCBub3RcbiAgICogYSBzbGljZSBvciBpbWFnZSBzd2l0Y2gpLCB0aGVpciByZWNvbnN0cnVjdGlvbnMgYXJlIHN0YWxlLiBUaGV5IGFyZSBkcm9wcGVkLCBhbmQgdGhvc2Ugc2hvd25cbiAgICogaW4gM0QgYXJlIHJlYnVpbHQgb25jZSB0aGUgZWRpdHMgcGF1c2UuXG4gICAqL1xuICBwcml2YXRlIG9uUmVnaW9uc0NoYW5nZWQoKTogdm9pZCB7XG4gICAgLy8gTm90aGluZyBmb2xsb3dzIHRoZSBlZGl0cyAobm8gc3VyZmFjZSBidWlsdCBvciBzaG93biwgbm8gc2VjdGlvbnMpOiBza2lwIHRoZSBmaW5nZXJwcmludHMuXG4gICAgaWYgKCF0aGlzLnNsaWNlTW91bnRlZCAmJiAhdGhpcy5zaG93bjNkLmxlbmd0aCAmJiAhdGhpcy5tZXNoQ2FjaGUuc2l6ZSkge1xuICAgICAgdGhpcy5saXZlQ2xhc3NlcyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMubGl2ZUNsYXNzZXM7XG4gICAgdGhpcy5saXZlQ2xhc3NlcyA9IG51bGw7XG4gICAgY29uc3Qgbm93ID0gdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgLy8gQW5vdGhlciBzbGljZSBvciBpbWFnZSBjYW1lIHVwOiBubyByZWdpb24gY2hhbmdlZCAodGhlIHNlY3Rpb25zIHJlY3V0IGZvciB0aGUgc2xpY2UpLlxuICAgIGlmICghYmVmb3JlIHx8IGJlZm9yZS5hdCAhPT0gbm93LmF0KSByZXR1cm47XG4gICAgY29uc3QgY2hhbmdlZCA9IGNoYW5nZWRDbGFzc2VzKGJlZm9yZS5zaWduYXR1cmVzLCBub3cuc2lnbmF0dXJlcyk7XG4gICAgLy8gU291cmNlIGZlYXR1cmVzIGRlbGV0ZWQgKG9yIHRoYXQgdW5kb25lKSBjaGFuZ2Ugbm8gbGl2ZSByZWdpb24sIGFuZCB3aGljaCBjbGFzc2VzIHRoZXkgd2VyZVxuICAgIC8vIGlzIG5vdCBrbm93biBoZXJlOiBldmVyeSBjbGFzcyBpcyBzdGFsZS4gQSBmZWF0dXJlIHRha2VuIHNob3dzIGFzIGl0cyBjbGFzcydzIGNoYW5nZS5cbiAgICBjb25zdCBldmVyeUNsYXNzID0gIWNoYW5nZWQuc2l6ZSAmJiBiZWZvcmUuc291cmNlcyAhPT0gbm93LnNvdXJjZXM7XG4gICAgaWYgKCFjaGFuZ2VkLnNpemUgJiYgIWV2ZXJ5Q2xhc3MpIHJldHVybjtcbiAgICBjb25zdCB0b3VjaGVkID0gKGM6IHN0cmluZykgPT4gZXZlcnlDbGFzcyB8fCBjaGFuZ2VkLmhhcyhjKTtcbiAgICBpZiAodGhpcy5zbGljZU1vdW50ZWQpIHRoaXMuc2VjdGlvbnMucmVnaW9uc0NoYW5nZWQoKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBbLi4udGhpcy5tZXNoQ2FjaGVdKSB7XG4gICAgICBpZiAoZW50cnkuY2xhc3Nlcy5zb21lKHRvdWNoZWQpKSB0aGlzLm1lc2hDYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNob3duM2Quc29tZSgoZykgPT4gZy5jbGFzc2VzLnNvbWUodG91Y2hlZCkpKSByZXR1cm47XG4gICAgaWYgKHRoaXMucmVidWlsZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWJ1aWxkVGltZXIpO1xuICAgIHRoaXMucmVidWlsZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlYnVpbGRUaW1lciA9IG51bGw7XG4gICAgICBpZiAodGhpcy5zaG93bjNkLmxlbmd0aCAmJiB0aGlzLmNsYXNzZXMzZEltYWdlID09PSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSkge1xuICAgICAgICB2b2lkIHRoaXMuc2hvd1JlZ2lvbkNsYXNzZXMzZCh0aGlzLnNob3duM2QpO1xuICAgICAgfVxuICAgIH0sIFJFR0lPTl9TVVJGQUNFX1JFQlVJTERfTVMpO1xuICB9XG5cbiAgLyoqIEZpbmdlcnByaW50IHRoZSBsaXZlIHNsaWNlJ3MgY2xhc3NlcywgdW5sZXNzIGFscmVhZHk6IHdoYXQgdGhlIG5leHQgZWRpdCBpcyBjb21wYXJlZCB3aXRoLiAqL1xuICBwcml2YXRlIHRyYWNrTGl2ZUNsYXNzZXMoKTogeyBhdDogc3RyaW5nOyBzaWduYXR1cmVzOiBNYXA8c3RyaW5nLCBudW1iZXI+OyBzb3VyY2VzOiBzdHJpbmcgfSB7XG4gICAgdGhpcy5saXZlQ2xhc3NlcyA/Pz0ge1xuICAgICAgYXQ6IHRoaXMubGl2ZVNsaWNlS2V5KCksXG4gICAgICBzaWduYXR1cmVzOiBjbGFzc1NpZ25hdHVyZXModGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkpLFxuICAgICAgc291cmNlczogdGhpcy5yZWdpb25TdG9yZS5nZXRTb3VyY2VTdGF0ZUtleSgpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGl2ZUNsYXNzZXM7XG4gIH1cblxuICAvKiogV2hpY2ggc2xpY2Ugb2Ygd2hpY2ggaW1hZ2UgdGhlIGxpdmUgcmVnaW9ucyBhcmUuICovXG4gIHByaXZhdGUgbGl2ZVNsaWNlS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucmVnaW9uU3RvcmUuZ2V0RGlzcGxheVNsaWNlKCl9XFxuJHt0aGlzLnBsb3R0ZWRGaWxlTmFtZSA/PyAnJ31gO1xuICB9XG5cbiAgLyoqIEVhY2ggY2xhc3MncyB2b2x1bWUgb3ZlciB0aGUgd2hvbGUgc3RhY2ssIGluIHB4wrIgw5cgc2xpY2VzIChzZWUgUmVnaW9uU3RvcmUuY2xhc3NWb2x1bWVzKS4gKi9cbiAgYXN5bmMgZ2V0Q2xhc3NWb2x1bWVzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhhd2FpdCB0aGlzLnJlZ2lvblN0b3JlLmNsYXNzVm9sdW1lcyhjbGFzc2VzKSk7XG4gIH1cblxuICBnZXRSZWdpb25Tb3VyY2VDbGFzc0NvdW50cyhzdGFjaz86IGJvb2xlYW4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VDbGFzc0NvdW50cyhzdGFjayk7XG4gIH1cbiAgZ2V0SGlkZGVuQ2xhc3NlcyQoKTogT2JzZXJ2YWJsZTxSZWFkb25seVNldDxzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0SGlkZGVuQ2xhc3NlcyQoKTtcbiAgfVxuICBzZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldENsYXNzZXNIaWRkZW4oY2xhc3NlcywgaGlkZGVuKTtcbiAgICAvLyBBIHN1cmZhY2UgaXMgaXRzIGNsYXNzJ3MgKGl0cyBncm91cCBrZXkgaXMgdGhlIGNsYXNzIG5hbWUpLlxuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZGRlbihbLi4udGhpcy5yZWdpb25TdG9yZS5nZXRIaWRkZW5DbGFzc2VzKCldKTtcbiAgICB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCk7XG4gIH1cbiAgYXN5bmMgc2VsZWN0UmVnaW9uQ2xhc3NlcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgYWRkaXRpdmU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RDbGFzc2VzKGNsYXNzZXMsIGFkZGl0aXZlKTtcbiAgfVxuICBnZXRHZW9Kc29uU3RyaW5nV2l0aFNvdXJjZShyZWdpb25zOiBSZWdpb25bXSwgc2xpY2U/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEdlb0pzb25XaXRoU291cmNlKHJlZ2lvbnMsIHNsaWNlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2Ugei1zdGFjayByZWdpb25zIChqaXQtdWkjOTMpLCBmcm9tIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUuIOKUgOKUgFxuICBlbnRlclN0YWNrTW9kZShcbiAgICBzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPixcbiAgICBpbml0aWFsWj86IG51bWJlcixcbiAgICBzYXZlTGF5b3V0PzogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScsXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUoc2xpY2VzLCBpbml0aWFsWiwgc2F2ZUxheW91dCk7XG4gIH1cbiAgZXhpdFN0YWNrTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmV4aXRTdGFja01vZGUoKTtcbiAgfVxuICBpc1N0YWNrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpO1xuICB9XG4gIC8qKiBUaGUgc2xpY2UgdGhlIHJlZ2lvbnMgYXJlIHNob3duIGZvciAocmVjb3JkZWQgb3V0c2lkZSBzdGFjayBtb2RlIHRvbykuICovXG4gIGdldERpc3BsYXlTbGljZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpO1xuICB9XG4gIGdldFN0YWNrU2F2ZUxheW91dCgpOiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlTGF5b3V0KCk7XG4gIH1cbiAgc2V0RGlzcGxheVNsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0RGlzcGxheVNsaWNlKHopO1xuICB9XG4gIGdldFNsaWNlUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2xpY2VSZWdpb25zKCk7XG4gIH1cbiAgZ2V0U3RhY2tTYXZlU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCk7XG4gIH1cbiAgLyoqIEFsbCBzbGljZXMnIEFOTk9UQVRJT04gcmVnaW9ucyBmb3IgYSB6LXN0YWNrIHNhdmUgKGppdC11aSM5MyksIGVhY2ggdGFnZ2VkXG4gICAqICB3aXRoIGl0cyB6ZXJvLWJhc2VkIFJlZ2lvbi56OyBwcm9maWxlIGxpbmVzIGV4Y2x1ZGVkLiBGbGF0IGFubm90YXRpb24gc2V0XG4gICAqICBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIGdldFNsaWNlQW5ub3RhdGlvblJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gIH1cbiAgLyoqIFBlci1zbGljZSBhbm5vdGF0aW9uIHJlZ2lvbnMgdG8gd3JpdGUgb24gYSBmb2xkZXItc3RhY2sgc2F2ZSAoaml0LXVpIzkzKTpcbiAgICogIHNsaWNlIGluZGV4IOKGkiB0aGF0IHNsaWNlJ3MgYW5ub3RhdGlvbiByZWdpb25zIChwcm9maWxlIGxpbmVzIGV4Y2x1ZGVkKSxcbiAgICogIGluY2x1ZGluZyBub3ctZW1wdHkgc2xpY2VzIHRoYXQgd2VyZSBsb2FkZWQgbm9uLWVtcHR5IChzbyB0aGV5IG92ZXJ3cml0ZSkuICovXG4gIGdldFN0YWNrU2F2ZUFubm90YXRpb25TbGljZXMoKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgZm9yIChjb25zdCBbeiwgcmVnc10gb2YgdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVTbGljZXMoKSkge1xuICAgICAgb3V0LnNldChcbiAgICAgICAgeixcbiAgICAgICAgcmVncy5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBBdXRob3JpdGF0aXZlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBzaXplIGZvciBtYXNrIGV4cG9ydC4gUHJlZmVycyB0aGVcbiAgICogIGFjdGl2ZSByZW5kZXJlcidzIHJlcG9ydGVkIHNpemUsIGZhbGxpbmcgYmFjayB0byB0aGUgaW1hZ2UgbWV0YWRhdGEgKHgveVxuICAgKiAgYXJlIHRoZSBmdWxsLXJlcyBwaXhlbCBkaW1lbnNpb25zIHVzZWQgYWNyb3NzIHRoZSBhcHApLiBSZWplY3RzIG5vbi1maW5pdGVcbiAgICogIG9yIG5vbi1wb3NpdGl2ZSBzaXplcyDigJQgdGhlIFBsb3RseSBib3VuZHMgY2FuIHlpZWxkIE5hTiBiZWZvcmUgYSBwbG90IGlzXG4gICAqICBmdWxseSBsYWlkIG91dCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNyYXNoIG1hc2sgY3JlYXRpb24uICovXG4gIGdldE1hc2tJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdmFsaWQgPSAoczogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB8IHVuZGVmaW5lZCkgPT5cbiAgICAgIHMgJiYgTnVtYmVyLmlzRmluaXRlKHMud2lkdGgpICYmIE51bWJlci5pc0Zpbml0ZShzLmhlaWdodCkgJiYgcy53aWR0aCA+PSAxICYmIHMuaGVpZ2h0ID49IDFcbiAgICAgICAgPyB7IHdpZHRoOiBNYXRoLnJvdW5kKHMud2lkdGgpLCBoZWlnaHQ6IE1hdGgucm91bmQocy5oZWlnaHQpIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZnJvbVJlbmRlcmVyID0gdmFsaWQodGhpcy5nZXRUcnVlSW1hZ2VTaXplKCkpO1xuICAgIGlmIChmcm9tUmVuZGVyZXIpIHJldHVybiBmcm9tUmVuZGVyZXI7XG5cbiAgICBsZXQgbWV0YTogSUltYWdlTWV0YWRhdGFbXSA9IFtdO1xuICAgIHRoaXMuZ2V0SW1hZ2VNZXRhKClcbiAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXRhID0gbSkpXG4gICAgICAudW5zdWJzY3JpYmUoKTtcbiAgICBjb25zdCBtMCA9IG1ldGE/LlswXTtcbiAgICByZXR1cm4gbTAgPyB2YWxpZCh7IHdpZHRoOiBtMC54LCBoZWlnaHQ6IG0wLnkgfSkgOiBudWxsO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25FZGl0b3JBcGk6IGFubm90YXRpb24tb25seSBzdXJmYWNlIGZvciB0aGUgUmVnaW9uIEVkaXRvciDilIDilIDilIBcbiAgLy8gSW50ZW5zaXR5LXByb2ZpbGUgbGluZXMgKGtpbmQ9J3Byb2ZpbGUnKSBiZWxvbmcgdG8gdGhlIGludGVuc2l0eSB0b29sLCBub3RcbiAgLy8gdGhlIGVkaXRvci4gVGhlc2UgbWV0aG9kcyBnaXZlIGV4dGVybmFsIGNvbnN1bWVycyBhbiBhbm5vdGF0aW9uLW9ubHkgdmlld1xuICAvLyBhbmQgZ3VhcmFudGVlIHByb2ZpbGUgbGluZXMgYXJlIHByZXNlcnZlZC4gVGhlIHdyaXRlcyBsYW5kIGluIHRoZSBzdG9yZSBsaWtlXG4gIC8vIGFueSBvdGhlciwgYW5kIGV2ZXJ5IGJhY2tlbmQgcmVkcmF3cyBmcm9tIGl0cyBldmVudHMuXG5cbiAgZ2V0QW5ub3RhdGlvblJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIHNldEFubm90YXRpb25SZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gUmUtYXBwZW5kIHRoZSBzdG9yZSdzIHByb2ZpbGUgbGluZXMgc28gYW4gZWRpdG9yIHNhdmUvZGVsZXRlIGNhbid0IGRyb3AgdGhlbS5cbiAgICBjb25zdCBwcm9maWxlcyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IChyZWdpb25zIHx8IFtdKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgIHRoaXMuc2V0UmVnaW9ucyhbLi4uYW5ub3RhdGlvbnMsIC4uLnByb2ZpbGVzXSwgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBmYWxzZSk7XG4gIH1cbiAgZ2V0U2VsZWN0ZWRSZWdpb25zJCgpOiBPYnNlcnZhYmxlPFJlZ2lvbltdPiB7XG4gICAgLy8gTWFwIHRoZSBpbnRlcm5hbCBpbmRleC1iYXNlZCBzZWxlY3Rpb24gdG8gdGhlIHNlbGVjdGVkIGFubm90YXRpb24gcmVnaW9ucy5cbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKS5waXBlKFxuICAgICAgbWFwKChpZHhzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZ3MgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICAgICAgcmV0dXJuIGlkeHMubWFwKChpKSA9PiByZWdzW2ldKS5maWx0ZXIoKHIpOiByIGlzIFJlZ2lvbiA9PiAhIXIgJiYgIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIHNldFNlbGVjdGVkUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIGNvbnN0IHJlZ3MgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBpbmRpY2VzID0gKHJlZ2lvbnMgfHwgW10pLm1hcCgocikgPT4gcmVncy5maW5kSW5kZXgoKHgpID0+IHguaWQgPT09IHIuaWQpKS5maWx0ZXIoKGkpID0+IGkgPj0gMCk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0b29scyDihpIgYWN0aXZlIHJlbmRlcmVyIChydW4gb24gZWl0aGVyIGJhY2tlbmQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBUaGUgd2FuZCwgdmVydGV4IGVyYXNlciBhbmQgem9vbS10by1ib3ggYXJlIGltcGxlbWVudGVkIG9uIGJvdGggYmFja2VuZHNcbiAgLy8gdmlhIElDb29yZGluYXRlVHJhbnNmb3JtICgrIGEgdmlld3BvcnQgcGl4ZWwgcmVhZGJhY2sgZm9yIHRoZSB3YW5kKSwgc28gdGhleVxuICAvLyBmb2xsb3cgdGhlIGFjdGl2ZSByZW5kZXJlciDigJQgdGhlIHNsaWNlIHBhbmUncyB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXMgc3BsaXQuXG4gIHNldEFjdGl2ZVRvb2woaWQ6IHN0cmluZyB8IG51bGwsIG9wdGlvbnM/OiBDYW52YXNUb29sT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldEFjdGl2ZVRvb2woaWQsIG9wdGlvbnMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRXYW5kTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRXYW5kTW9kZShhY3RpdmUsIG9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFdhbmRPcHRpb25zKG9wdGlvbnMpO1xuICB9XG4gIGNsZWFyQWN0aXZlV2FuZFJlZ2lvbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5jbGVhckFjdGl2ZVdhbmRSZWdpb24oKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0QnJ1c2hNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRCcnVzaE1vZGUoYWN0aXZlLCBvcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldEJydXNoT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1cyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0Wm9vbVRvQm94TW9kZShhY3RpdmUpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uQmFja2VuZCgpLnNlZ21lbnRSZWN0YW5nbGVzKCk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk7XG4gIH1cbiAgc2V0U2FtTW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFNhbU1vZGVsKGlkKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFNhbVBvaW50TW9kZShhY3RpdmUpO1xuICB9XG4gIGNvbW1pdFNhbVBvaW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5jb21taXRTYW1Qb2ludHMoKTtcbiAgfVxuICBjbGVhclNhbVBvaW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5jbGVhclNhbVBvaW50cygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGRpc3BsYXkgb3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gU3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUg4oCUIHJlYWRzIGdvIHN0cmFpZ2h0IHRvIGl0LlxuICAvLyBUaGUgdHdvIFNFVFRFUlMgc3RpbGwgcm91dGUgdGhyb3VnaCBQbG90bHkgYmVjYXVzZSBpdHMgaW1wbGVtZW50YXRpb25zXG4gIC8vIGNhcnJ5IHJlbmRlciBnbHVlIGJleW9uZCB0aGUgc3RvcmUgd3JpdGUgKGEgbGl2ZSBQbG90bHkucmVzdHlsZSBvZlxuICAvLyBjb2xvcnNjYWxlL3JldmVyc2VzY2FsZSBvbiB0aGUgbW91bnRlZCBoZWF0bWFwKTsgT1NEIHJlY29sb3JzIHZpYSBpdHMgb3duXG4gIC8vIHN0b3JlIHN1YnNjcmlwdGlvbiBlaXRoZXIgd2F5LlxuICBnZXRDb2xvcm1hcCgpOiBPYnNlcnZhYmxlPENvbG9ybWFwTm9kZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpO1xuICB9XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBDb2xvcm1hcE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRDb2xvcm1hcChjb2xvcm1hcCk7XG4gIH1cbiAgZ2V0Q29sb3JtYXBPcHRpb25zKCk6IENvbG9ybWFwTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDb2xvcm1hcE9wdGlvbnMoKTtcbiAgfVxuICBnZXRSZXZlcnNlU2NhbGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCk7XG4gIH1cbiAgc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRSZXZlcnNlU2NhbGUocmV2ZXJzZSk7XG4gIH1cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEltYWdlTWV0YShpbWFnZU1ldGEsIGltYWdlS2V5KTtcbiAgfVxuICBnZXRJbWFnZU1ldGEoKTogT2JzZXJ2YWJsZTxJSW1hZ2VNZXRhZGF0YVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW1hZ2VNZXRhKCk7XG4gIH1cblxuICAvLyDilIDilIAgSUNoYW5uZWxIaXN0b2dyYW1BcGk6IENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgc3VyZmFjZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ2hhbm5lbC9ncmF5c2NhbGUvaW52ZXJ0IHN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlOyBib3RoXG4gIC8vIGJhY2tlbmRzIHN1YnNjcmliZSBhbmQgcmVjb2xvciBsaXZlLCBzbyBzZXR0ZXJzIGp1c3Qgd3JpdGUgdGhlIHN0b3JlLiBUaGVcbiAgLy8gaGlzdG9ncmFtIGNvbWVzIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuIChpdHMgbmF0aXZlIHBpeGVscykuXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIC8qKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgZGF0YSAoMTYtYml0IG11bHRpLWJhbmQgVElGRikgdmlhIHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgZXhwb3J0RGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZXhwb3J0RGF0YSgpO1xuICB9XG4gIGdldENoYW5uZWxzJCgpOiBPYnNlcnZhYmxlPElDaGFubmVsU3RhdGVbXT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKTtcbiAgfVxuICBzZXRTZWxlY3RlZENoYW5uZWwoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4KTtcbiAgfVxuICBzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlciwgcGFydGlhbDogUGFydGlhbDxJQ2hhbm5lbFN0YXRlPik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGluZGV4LCBwYXJ0aWFsKTtcbiAgfVxuICByZXNldENvbnRyYXN0KGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgLy8gRnVsbCByZXNldDogd2luZG93ICgwLi4yNTUpLCBnYW1tYSAoMSkgQU5EIHRoZSBjaGFubmVsJ3MgZGVmYXVsdCB0aW50LlxuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB0aGlzLnN0b3JlLnJlc2V0Q2hhbm5lbFN0YXRlKGkpO1xuICB9XG4gIC8qKiBBdXRvLXdpbmRvdyBlYWNoIGNoYW5uZWwgYnkgc2F0dXJhdGluZyBgc2F0dXJhdGlvbmAgKDAuLjEpIG9mIHBpeGVscyBhdCBlYWNoXG4gICAqICBlbmQgb2YgaXRzIGhpc3RvZ3JhbSAoc2tpcHBpbmcgb3V0bGllciBmaXJzdC9sYXN0IGJpbnMpLiAqL1xuICBhdXRvQ29udHJhc3QoaW5kaWNlczogbnVtYmVyW10sIHNhdHVyYXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShpLCAyNTYpO1xuICAgICAgaWYgKCFoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBhdXRvV2luZG93RnJvbUhpc3RvZ3JhbShoLCBzYXR1cmF0aW9uLCBbMCwgMjU1XSk7XG4gICAgICBpZiAobWF4ID4gbWluKSB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZShpLCB7IG1pbiwgbWF4IH0pO1xuICAgIH1cbiAgfVxuICBnZXRHcmF5c2NhbGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEdyYXlzY2FsZSgpO1xuICB9XG4gIHNldEdyYXlzY2FsZShvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0R3JheXNjYWxlKG9uKTtcbiAgfVxuICBnZXRJbnZlcnQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEludmVydCgpO1xuICB9XG4gIHNldEludmVydChvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0SW52ZXJ0KG9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWN0aXZlIGJhY2tlbmQncyByZWdpb24gb3ZlcmxheSAodGhlIHNsaWNlIHBhbmUncyB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXMgc3BsaXQpLiBGYWxsc1xuICAgKiBiYWNrIHRvIFBsb3RseSdzIHdoZW4gdGhlIGFjdGl2ZSBiYWNrZW5kXG4gICAqIChPU0Qgb3IgbmFwYXJpLWpzKSBpcyBzZWxlY3RlZCBidXQgYSBwbG90IGlzbid0IG1vdW50ZWQgeWV0LCBzbyBjYWxsZXJzIGFsd2F5cyBnZXQgYVxuICAgKiB1c2FibGUgb3ZlcmxheS5cbiAgICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnJlZ2lvbkJhY2tlbmQoKTtcbiAgICBpZiAociA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9zZC5nZXRSZWdpb25PdmVybGF5KCkgPz8gdGhpcy5wbG90bHkuZ2V0UmVnaW9uT3ZlcmxheSgpO1xuICAgIH1cbiAgICBpZiAociA9PT0gdGhpcy5uYXBhcmkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hcGFyaS5nZXRSZWdpb25PdmVybGF5KCkgPz8gdGhpcy5wbG90bHkuZ2V0UmVnaW9uT3ZlcmxheSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZ2V0UmVnaW9uT3ZlcmxheSgpO1xuICB9XG5cbiAgLyoqIElzb3N1cmZhY2UgY29udHJvbHMgb2YgdGhlIGJhY2tlbmQgb24gc2NyZWVuLCB3aGVuIGl0IHJlbmRlcnMgaXNvc3VyZmFjZXMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRJc29zdXJmYWNlQ29udHJvbHMoKTtcbiAgfVxuXG4gIC8qKiAzRCBzY2VuZSBjb250cm9scyBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4gKFBsb3RseSBvciBuYXBhcmktanMpLCBvciBudWxsIG9uIGFcbiAgICogIDJELW9ubHkgb25lLiAqL1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFN1cmZhY2UzZENvbnRyb2xzKCk7XG4gIH1cblxuICAvKiogSW50ZW5zaXR5IChsaW5lLVJPSSkgY29udHJvbHMsIHdoaWNoZXZlciBiYWNrZW5kIGRyYXdzIHRoZSBpbWFnZTogdGhlXG4gICAqICBJbnRlbnNpdHlQcm9maWxlU2VydmljZSBhZGRzIHRoZSBsaW5lIHRvIHRoZSBzdG9yZSwgYW5kIGV2ZXJ5IGJhY2tlbmRcbiAgICogIChQbG90bHkgaW5jbHVkZWQpIGRyYXdzIGl0IGZyb20gdGhlIHN0b3JlJ3MgdXBkYXRlIGV2ZW50LiAqL1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHk7XG4gIH1cblxuICAvKipcbiAgICogU3BhdGlhbC1vbWljcyBjb250cm9scywgb3IgbnVsbCB3aGVuIG5vIGBTUEFUSUFMX0RBVEFfUE9SVGAgaXMgYm91bmQuIFNlcnZlZCBieSBhXG4gICAqIGJhY2tlbmQtbmV1dHJhbCB7QGxpbmsgU3BhdGlhbENvbnRyb2xzRmFjYWRlfSAoc3RhdGUgaW4gdGhlIHNoYXJlZCBzdG9yZXMpLCBzbyB0aGVcbiAgICogY29udHJvbHMgd29yayBhY3Jvc3MgYSBwbG90LXR5cGUgc3dpdGNoIGFuZCBiZWZvcmUgYW55IGJhY2tlbmQgaGFzIG1vdW50ZWQuXG4gICAqL1xuICBnZXRTcGF0aWFsQ29udHJvbHMoKTogSVNwYXRpYWxDb250cm9scyB8IG51bGwge1xuICAgIGlmICghdGhpcy5zcGF0aWFsRGF0YSkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5zcGF0aWFsRmFjYWRlID8/PSBuZXcgU3BhdGlhbENvbnRyb2xzRmFjYWRlKHRoaXMuc3BhdGlhbERhdGEsIHtcbiAgICAgIHN0b3JlOiB0aGlzLnN0b3JlLFxuICAgICAgcmVnaW9uU3RvcmU6IHRoaXMucmVnaW9uU3RvcmUsXG4gICAgICBzZWxlY3Rpb25TdG9yZTogdGhpcy5zZWxlY3Rpb25TdG9yZSxcbiAgICAgIG5hcGFyaTogdGhpcy5uYXBhcmksXG4gICAgICBwbG90VHlwZTogKCkgPT4gdGhpcy5jdXJyZW50UGxvdFR5cGUsXG4gICAgICB6SW5kZXg6ICgpID0+IHRoaXMuY3VycmVudFpJbmRleCxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5zcGF0aWFsRmFjYWRlLmNvbnRyb2xzO1xuICB9XG5cbiAgLyoqIENyZWF0ZWQgb24gZmlyc3QgdXNlOyBvd25zIHRoZSBkYXRhc2V0IHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRmFjYWRlOiBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIERpc3BsYXllZCBzbGljZS4gT25seSBhIHZvbHVtZS1iYWNrZWQgc3BhdGlhbCBkYXRhc2V0IHJlYWRzIGl0LCB0byBrZWVwIGFcbiAgICogIHJlZ2lvbiBkcmF3biBvdmVyIG9uZSBzZWN0aW9uIGZyb20gc2VsZWN0aW5nIHRoZSB3aG9sZSBkZXB0aCBiZWhpbmQgaXQuICovXG4gIHByaXZhdGUgY3VycmVudFpJbmRleCA9IDA7XG5cbiAgLyoqIEFuZ3VsYXIgY2FsbHMgdGhpcyB3aGVuIHRoZSBpbmplY3RvciBwcm92aWRpbmcgdGhlIHJvdXRlciBpcyBkZXN0cm95ZWQg4oCUIHRoZSBob3N0XG4gICAqICBjb21wb25lbnQgZm9yIGEgYHByb3ZpZGVWaXN1YWxpemF0aW9uKClgIGNoYWluLiBUaGUgZGF0YXNldCBzdWJzY3JpcHRpb24gd291bGRcbiAgICogIG90aGVyd2lzZSBrZWVwIHRoZSB3aG9sZSBpc29sYXRlZCBjaGFpbiByZWFjaGFibGUgZnJvbSB0aGUgcm9vdCBkYXRhIHBvcnQuICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0VGlja2V0ID0geyBpZDogdGhpcy5pbXBvcnRUaWNrZXQuaWQgKyAxLCBpbWFnZTogdW5kZWZpbmVkIH07IC8vIGEgbGF0ZSBpbXBvcnQgY2hhbmdlcyBub3RoaW5nXG4gICAgdGhpcy5zcGF0aWFsRmFjYWRlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zcGF0aWFsRmFjYWRlID0gbnVsbDtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgaWYgKHRoaXMucmVidWlsZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWJ1aWxkVGltZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuc2l0eS1wcm9maWxlIHNhbXBsaW5nLCB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW46IHRoZSBzYW1wbGluZyBpcyB0aGVcbiAgICogYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlJ3M7IHRoZSB2aWV3cG9ydCBjaGFuZ2VzIGNvbWUgZnJvbSBldmVyeVxuICAgKiBiYWNrZW5kIHRoYXQgcmVwb3J0cyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBtZXJnZWQgaW50byBvbmUgc3RhYmxlXG4gICAqIHN0cmVhbSB0aGUgaW5zZXQgc3Vic2NyaWJlcyB0byBvbmNlLlxuICAgKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVNhbXBsaW5nOiBJSW50ZW5zaXR5U2FtcGxpbmcgPSB7XG4gICAgLy8gTG9hZCB0aGUgZGlzcGxheWVkIHNsaWNlJ3MgcGl4ZWxzIGZvciBhIGJhY2tlbmQgdGhhdCBoYXMgbm8gZnJhbWVzIG9mIGl0cyBvd25cbiAgICAvLyAoT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzOyBQbG90bHkgZmVlZHMgaXRzIGZyYW1lcyB0byB0aGUgc2VydmljZSB3aGVuIGl0IHBsb3RzKS5cbiAgICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZzogKGltYWdlSW5mbywgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfSxcbiAgICAvLyBSZS1zYW1wbGUgZnJvbSBhIGZyZXNoIGNyb3Agb2YgdGhlIGltYWdlLXBpeGVsIFJPSSBhdCBkaXNwbGF5IHJlc29sdXRpb24uXG4gICAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pOiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHRoaXMuaW50ZW5zaXR5LnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICAgIH0sXG4gICAgZ2V0Vmlld3BvcnRDaGFuZ2UkOiAoKSA9PlxuICAgICAgbWVyZ2UoLi4udGhpcy5iYWNrZW5kcygpLm1hcCgoYikgPT4gYi5nZXRJbnRlbnNpdHlTYW1wbGluZygpPy5nZXRWaWV3cG9ydENoYW5nZSQoKSA/PyBFTVBUWSkpLFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIENyb3BzIGZvciBzYW1wbGluZyBhcmUgc2l6ZWQgZnJvbSB0aGUgcGxvdCBkaXYgKHdoaWNoZXZlciBiYWNrZW5kIHJlbmRlcnMgaW50byBpdCkuICovXG4gIHByaXZhdGUgcG9pbnRTYW1wbGluZ0F0UGxvdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB0aGlzLmludGVuc2l0eS5zZXRTYW1wbGluZ0VsZW1lbnQodGhpcy5wbG90RGl2KTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkuZ2V0Vmlld3BvcnRDaGFuZ2UkKClgLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZ2V0Vmlld3BvcnRDaGFuZ2UkKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSgpYC4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmludGVuc2l0eVNhbXBsaW5nLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXN1YWxpemVyIHZpZXcgaXMgZ29pbmcgYXdheTogZGV0YWNoIGV2ZXJ5IGJhY2tlbmQg4oCUIGRyb3BwaW5nIHRoZWlyIHZpZXctYm91bmRcbiAgICogIHN1YnNjcmlwdGlvbnMgYW5kIGRpc3Bvc2luZyB0aGUgbmFwYXJpLWpzIHZpZXdlciwgd2hvc2UgY2FudmFzLCByZW5kZXIgbG9vcCBhbmQgR1BVXG4gICAqICBidWZmZXJzIHdvdWxkIG90aGVyd2lzZSBvdXRsaXZlIHRoZSB2aWV3IChmb3IgYSBjb21wb25lbnQtc2NvcGVkIGNoYWluLCBmb3JldmVyKS5cbiAgICogIE5vdGhpbmcgaXMgb24gc2NyZWVuIGFmdGVyd2FyZHMsIHNvIHRoZSBuZXh0IHBsb3Qgc3RhcnRzIGZyb20gdGhlIGRlZmF1bHQgYmFja2VuZC4gKi9cbiAgZGV0YWNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgdGhpcy5zbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlRGl2ID0gbnVsbDtcbiAgICB0aGlzLnBsb3RseS5kZXRhY2goKTtcbiAgICB0aGlzLm9zZC5kZXRhY2goKTtcbiAgICB0aGlzLm5hcGFyaS5kZXRhY2goKTtcbiAgICB0aGlzLmxhc3RSZW5kZXJlZCA9IG51bGw7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBkZXRhY2h9LiAqL1xuICB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaCgpO1xuICB9XG59XG4iXX0=
|