@jax-data-science/sci-image-visualizer 0.3.3 → 0.5.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/README.md +268 -4
- package/esm2022/index.mjs +21 -1
- package/esm2022/lib/contracts/display-types.mjs +20 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +66 -0
- package/esm2022/lib/contracts/plot-type.mjs +41 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -0
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +45 -0
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +10 -19
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +71 -7
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +1934 -55
- package/esm2022/lib/implementations/napari-js/napari-zoom.mjs +18 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +73 -8
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +8 -1
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +3 -4
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +20 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +555 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +13 -7
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +304 -0
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +179 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +329 -0
- package/esm2022/lib/routing-visualizer.service.mjs +228 -12
- package/esm2022/lib/spatial/embedding-compute.mjs +142 -0
- package/esm2022/lib/spatial/gene-search.mjs +77 -0
- package/esm2022/lib/spatial/spatial-density.mjs +224 -0
- package/esm2022/lib/spatial/spatial-encoding.mjs +232 -0
- package/esm2022/lib/spatial/spatial-expression.mjs +257 -0
- package/esm2022/lib/spatial/spatial-framing.mjs +60 -0
- package/esm2022/lib/spatial/spatial-heatmap.mjs +185 -0
- package/esm2022/lib/spatial/spatial-hover.mjs +79 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +96 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +264 -0
- package/esm2022/lib/spatial/spatial-volume-image.mjs +163 -0
- package/esm2022/lib/spatial/tsne-worker.mjs +10 -0
- package/esm2022/lib/spatial/world-grid.mjs +77 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +1278 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +621 -0
- package/esm2022/lib/store/spatial-selection.service.mjs +47 -0
- package/esm2022/lib/store/visualizer-store.service.mjs +23 -1
- package/esm2022/lib/toolbar/toolbar.component.mjs +61 -21
- package/esm2022/lib/visualization.module.mjs +23 -5
- package/esm2022/lib/visualizer.component.mjs +527 -44
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs} +6 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +15971 -7808
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/tsne.worker.js +19091 -0
- package/index.d.ts +16 -0
- package/lib/contracts/display-types.d.ts +131 -0
- package/lib/contracts/image.contract.d.ts +7 -0
- package/lib/contracts/plot-type-contribution.contract.d.ts +172 -0
- package/lib/contracts/plot-type.d.ts +52 -2
- package/lib/contracts/ports/spatial-data.port.d.ts +90 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +281 -0
- package/lib/contracts/visualizer.contract.d.ts +104 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +9 -7
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +38 -4
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +7 -3
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +32 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +497 -16
- package/lib/implementations/napari-js/napari-zoom.d.ts +15 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +21 -0
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +6 -0
- package/lib/implementations/osd/osd-zoom.d.ts +19 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +193 -0
- package/lib/implementations/plotly/plotly.service.d.ts +9 -0
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +123 -0
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +115 -0
- package/lib/plot-mode/plot-mode-controller.d.ts +130 -0
- package/lib/routing-visualizer.service.d.ts +49 -6
- package/lib/spatial/embedding-compute.d.ts +73 -0
- package/lib/spatial/gene-search.d.ts +48 -0
- package/lib/spatial/spatial-density.d.ts +73 -0
- package/lib/spatial/spatial-encoding.d.ts +155 -0
- package/lib/spatial/spatial-expression.d.ts +144 -0
- package/lib/spatial/spatial-framing.d.ts +37 -0
- package/lib/spatial/spatial-heatmap.d.ts +111 -0
- package/lib/spatial/spatial-hover.d.ts +49 -0
- package/lib/spatial/spatial-sections.d.ts +59 -0
- package/lib/spatial/spatial-selection.d.ts +113 -0
- package/lib/spatial/spatial-volume-image.d.ts +67 -0
- package/lib/spatial/tsne-worker.d.ts +7 -0
- package/lib/spatial/world-grid.d.ts +58 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +439 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +257 -0
- package/lib/store/spatial-selection.service.d.ts +27 -0
- package/lib/store/visualizer-store.service.d.ts +13 -0
- package/lib/toolbar/toolbar.component.d.ts +36 -8
- package/lib/visualization.module.d.ts +28 -24
- package/lib/visualizer.component.d.ts +139 -7
- package/package.json +6 -2
- package/src/lib/assets/spatial-omics-3d.svg +31 -0
- package/src/lib/assets/spatial-omics.svg +27 -0
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, Subject, combineLatest, from, of } from 'rxjs';
|
|
2
|
+
import { BehaviorSubject, Subject, combineLatest, from, of, } from 'rxjs';
|
|
3
3
|
import { saveAs } from 'file-saver';
|
|
4
|
-
import { Viewer, histogramScalar, colormapFromLut, tintColormap, reverseColormap, heightField, MultiChannelImageView, MultiChannelVolumeView, } from 'napari-js';
|
|
4
|
+
import { Viewer, histogramScalar, colormapFromLut, tintColormap, reverseColormap, heightField, LUT_SIZE, MultiChannelImageView, MultiChannelVolumeView, } from 'napari-js';
|
|
5
|
+
import { nearestProjectedIndex, ScreenIndex, SCREEN_INDEX_MIN_POINTS } from 'napari-js';
|
|
5
6
|
import { buildColormapLut } from '../../contracts/colormap-lut';
|
|
6
|
-
import {
|
|
7
|
+
import { SPATIAL_DATA_PORT } from '../../contracts/ports/spatial-data.port';
|
|
8
|
+
import { findColumnMeta, isCategoricalColumn, } from '../../contracts/spatial-dataset.contract';
|
|
9
|
+
import { contrastWindow, encodeCategorical, encodeContinuous, markerDiameters, resolveCategoryColors, toRgbaTuples, parseHex, MISSING_COLOR, DEFAULT_MUTED_OPACITY, SPATIAL_3D_MAX_CATEGORIES, spatialContinuousLut, } from '../../spatial/spatial-encoding';
|
|
10
|
+
import { NO_CATEGORY } from '../../contracts/spatial-dataset.contract';
|
|
11
|
+
import { emptySelection, maskToIndices, mutedFromSelection, sameSelection, selectByCategory, } from '../../spatial/spatial-selection';
|
|
12
|
+
import { framePositions } from '../../spatial/spatial-framing';
|
|
13
|
+
import { PIXEL_WORLD_QUANTUM, worldQuantumForExtent } from '../../spatial/world-grid';
|
|
14
|
+
import { observationsInSlice, volumeImageRef } from '../../spatial/spatial-volume-image';
|
|
15
|
+
import { defaultSigma, densityGrid, rasterizeDensity } from '../../spatial/spatial-density';
|
|
16
|
+
import { observationsInSection, sectionsOf } from '../../spatial/spatial-sections';
|
|
17
|
+
import { hoverText, nearestObservation } from '../../spatial/spatial-hover';
|
|
18
|
+
import { NapariSpatialTooltip } from './napari-spatial-tooltip';
|
|
19
|
+
import { NAPARI_WHEEL_ZOOM_SPEED } from './napari-zoom';
|
|
20
|
+
import { colorExpressionField, encodeExpressionVolume, expressionField, expressionVolume, } from '../../spatial/spatial-expression';
|
|
21
|
+
import { PlotType, PLOT_TYPE_DESCRIPTORS, isNapari3d, isNapariIsosurface, isNapariSurface, isNapariScatter, isNapariScatter3d, isSpatialOmics, isSpatialOmics3d, NAPARI_DEFAULT_DECIMATE, } from '../../contracts/plot-type';
|
|
7
22
|
import { ViewerFeature, capabilitiesOf, } from '../../contracts/capabilities.contract';
|
|
8
23
|
import { VIZ_CONFIG } from '../../contracts/viz-config';
|
|
9
24
|
import { TILE_ACCESS_PORT } from '../../contracts/ports/tile-access.port';
|
|
@@ -34,6 +49,39 @@ import * as i7 from "../../toolbar/segmentation/sam-tool.service";
|
|
|
34
49
|
import * as i8 from "../../toolbar/segmentation/sam-point-tool.service";
|
|
35
50
|
import * as i9 from "../../toolbar/segmentation/cell-segment-tool.service";
|
|
36
51
|
import * as i10 from "../simple-slice-access.service";
|
|
52
|
+
import * as i11 from "../../store/spatial-selection.service";
|
|
53
|
+
/**
|
|
54
|
+
* A short, stable id for a colormap value, for cache keys.
|
|
55
|
+
*
|
|
56
|
+
* Half the library's colormaps are NAMES and half are inline `[stop, colour]`
|
|
57
|
+
* arrays of 256 entries. Stringifying the array kind would put 6 KB in a key that
|
|
58
|
+
* is rebuilt and compared on every view change; hashing it keeps the key small,
|
|
59
|
+
* and it only has to distinguish one colormap from another.
|
|
60
|
+
*/
|
|
61
|
+
function colormapId(value) {
|
|
62
|
+
if (value == null)
|
|
63
|
+
return '';
|
|
64
|
+
if (typeof value === 'string')
|
|
65
|
+
return value;
|
|
66
|
+
if (!Array.isArray(value))
|
|
67
|
+
return '?';
|
|
68
|
+
// FNV-1a over the stops. A collision would leave a stale colouring on screen,
|
|
69
|
+
// not corrupt anything, and 32 bits over a few hundred colormaps will not.
|
|
70
|
+
let hash = 0x811c9dc5;
|
|
71
|
+
const text = value.map((stop) => String(stop)).join(',');
|
|
72
|
+
for (let i = 0; i < text.length; i++) {
|
|
73
|
+
hash ^= text.charCodeAt(i);
|
|
74
|
+
hash = Math.imul(hash, 0x01000193);
|
|
75
|
+
}
|
|
76
|
+
return `#${(hash >>> 0).toString(36)}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* In-plane coarsening of the 3D gene map's lattice, relative to the reference
|
|
80
|
+
* volume. The field is smooth, so its detail is set by the kernel rather than the
|
|
81
|
+
* raster — and the estimate is a pair of separable blurs on the main thread, which
|
|
82
|
+
* at the template's full resolution means seconds of frozen UI per toggle.
|
|
83
|
+
*/
|
|
84
|
+
const GENE_MAP_VOLUME_STRIDE = 2;
|
|
37
85
|
/** ICoordinateTransform over the napari camera: pointer client coords ↔ image/world coords. */
|
|
38
86
|
class NapariCoordinateTransform {
|
|
39
87
|
constructor(viewer, ready) {
|
|
@@ -108,22 +156,11 @@ const DEFAULT_TINTS = ['#ff0000', '#00ff00', '#0000ff', '#ffff00', '#ff00ff', '#
|
|
|
108
156
|
function tintFor(channel) {
|
|
109
157
|
return DEFAULT_TINTS[channel % DEFAULT_TINTS.length];
|
|
110
158
|
}
|
|
111
|
-
/**
|
|
112
|
-
* A WebGPU image backend built on the published `napari-js` library — the POC engine for
|
|
113
|
-
* jit-ui#102 (a browser-based napari shipped as a JS library, swapping image plotting with
|
|
114
|
-
* OpenSeadragon and 3D slicing/isosurfaces with Plotly).
|
|
115
|
-
*
|
|
116
|
-
* Render strategy: rather than re-implement the server's tile/pyramid protocol (which OSD
|
|
117
|
-
* already handles), this backend renders the **complete per-slice image URLs the app already
|
|
118
|
-
* produces** (`IImageInfo.urls`) — `urls[z]` for the 2D image, and the full `urls` stack
|
|
119
|
-
* assembled into a downsampled volume for the 3D types. Region state and display options
|
|
120
|
-
* delegate to the shared {@link RegionStore} / {@link VisualizerStore}, exactly as OSD does.
|
|
121
|
-
*
|
|
122
|
-
* Follow-ups (jit-ui#102): native-resolution pyramidal tiling, on-canvas tools, region
|
|
123
|
-
* overlay rendering, per-channel histograms, TIFF export.
|
|
124
|
-
*/
|
|
125
159
|
export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
126
|
-
constructor(tiles, store, regionStore, wandTool, brushTool, eraserTool, zoomToBoxTool, samTool, samPointTool, cellSegmentTool, cellSegmenter, simpleStack, config
|
|
160
|
+
constructor(tiles, store, regionStore, wandTool, brushTool, eraserTool, zoomToBoxTool, samTool, samPointTool, cellSegmentTool, cellSegmenter, simpleStack, config,
|
|
161
|
+
// Optional: only a host that serves spatial-omics data provides it, and
|
|
162
|
+
// without it the SPATIAL_OMICS plot type is never offered anyway.
|
|
163
|
+
spatialData = null, selectionStore = null) {
|
|
127
164
|
super(regionStore, store);
|
|
128
165
|
this.tiles = tiles;
|
|
129
166
|
this.wandTool = wandTool;
|
|
@@ -135,6 +172,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
135
172
|
this.cellSegmentTool = cellSegmentTool;
|
|
136
173
|
this.cellSegmenter = cellSegmenter;
|
|
137
174
|
this.simpleStack = simpleStack;
|
|
175
|
+
this.spatialData = spatialData;
|
|
176
|
+
this.selectionStore = selectionStore;
|
|
138
177
|
this.capabilities = capabilitiesOf([
|
|
139
178
|
ViewerFeature.ImageDisplay,
|
|
140
179
|
ViewerFeature.StackSlider,
|
|
@@ -175,6 +214,97 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
175
214
|
this.scatterRegionSub = null;
|
|
176
215
|
/** napari-js 3D scatter (voxel point cloud). */
|
|
177
216
|
this.scatter3dLayer = null;
|
|
217
|
+
/** Spatial-omics observation markers + the dataset/view subscription driving them. */
|
|
218
|
+
this.spatialPoints = null;
|
|
219
|
+
/** The 3D point cloud. One layer: selection is a per-point alpha on it, not a second. */
|
|
220
|
+
this.spatialPoints3d = null;
|
|
221
|
+
this.spatialLayerKey3d = null;
|
|
222
|
+
/** Interleaved x,y,z, cached so a colour change does not re-walk 3.7M observations. */
|
|
223
|
+
this.spatialPositions3d = null;
|
|
224
|
+
/** Identity of the scalars currently uploaded — see {@link rebuildSpatialPoints3d}. */
|
|
225
|
+
this.spatialScalarKey3d = null;
|
|
226
|
+
/** The anatomical volume the cloud sits inside, when the dataset has one. */
|
|
227
|
+
this.spatialVolume = null;
|
|
228
|
+
this.spatialVolumeKey = null;
|
|
229
|
+
/** Per-cluster density volumes drawn alongside the cloud, and what they were
|
|
230
|
+
* built from — rasterising is seconds of work, so it must not repeat for a
|
|
231
|
+
* change that cannot affect the field. */
|
|
232
|
+
this.densityLayers = [];
|
|
233
|
+
this.densityKey = null;
|
|
234
|
+
/** Selection identity, as a number the density key can carry. */
|
|
235
|
+
this.lastSelectionSeen = null;
|
|
236
|
+
this.selectionRevision = 0;
|
|
237
|
+
/** The gene map: its layer, the field it was estimated from, and the inputs each
|
|
238
|
+
* was built for — the field is the expensive half and survives a recolour. */
|
|
239
|
+
this.geneMapLayer = null;
|
|
240
|
+
this.geneMapKey = null;
|
|
241
|
+
this.geneMapField = null;
|
|
242
|
+
this.geneMapFieldKey = null;
|
|
243
|
+
/** The 3D gene map: its volume layer, the field behind it, and the inputs each
|
|
244
|
+
* was built for — same two clocks as the 2D map. */
|
|
245
|
+
this.geneMapVolumeLayer = null;
|
|
246
|
+
this.geneMapVolumeKey = null;
|
|
247
|
+
this.geneMapVolumeField = null;
|
|
248
|
+
this.geneMapVolumeFieldKey = null;
|
|
249
|
+
/** Offset applied to observation coordinates to sit them in the volume's box. */
|
|
250
|
+
this.spatialOrigin3d = [0, 0, 0];
|
|
251
|
+
/** Cursor tooltip for the spatial views, and everything it needs: what the
|
|
252
|
+
* cloud is coloured by, and where each drawn observation is. */
|
|
253
|
+
this.spatialTooltip = null;
|
|
254
|
+
this.hoverSource = null;
|
|
255
|
+
this.hoverSourceKey = null;
|
|
256
|
+
/** Sequences the async resolutions. The KEY is only committed once one lands,
|
|
257
|
+
* so a superseded fetch cannot leave the cache claiming to hold a source it
|
|
258
|
+
* never stored. */
|
|
259
|
+
this.hoverSourceToken = 0;
|
|
260
|
+
/** Drawn observations' positions for hit-testing, indexed BY OBSERVATION with
|
|
261
|
+
* NaN for anything not drawn. Screen pixels in 3D (the camera moves them, so
|
|
262
|
+
* they are rebuilt when it does) and WORLD units in 2D (where the camera only
|
|
263
|
+
* scales, so the pointer is converted instead of 374k points). */
|
|
264
|
+
this.hoverPositions = null;
|
|
265
|
+
this.hoverPositionsRev = -1;
|
|
266
|
+
/**
|
|
267
|
+
* Screen-space bucket index over the 3D projection, built on the first hover after the
|
|
268
|
+
* scene moved rather than when it moves.
|
|
269
|
+
*
|
|
270
|
+
* Lazily, and that is the whole design: an orbit drag changes the camera every frame, so
|
|
271
|
+
* building eagerly would spend tens of milliseconds a frame indexing for picks nobody is
|
|
272
|
+
* making. Deferred, it is built once when the drag stops and the pointer next moves —
|
|
273
|
+
* measured upstream at 3.7M points, that turns a 12.6 ms scan per pointermove into
|
|
274
|
+
* 0.066 ms.
|
|
275
|
+
*/
|
|
276
|
+
this.hoverIndex = null;
|
|
277
|
+
/** Bumped whenever the cached positions go stale: a marker rebuild, or — in 3D
|
|
278
|
+
* only, where the projection depends on it — a camera move. */
|
|
279
|
+
this.spatialSceneRev = 0;
|
|
280
|
+
this.hoverPointer = null;
|
|
281
|
+
this.hoverFrame = 0;
|
|
282
|
+
this.hoverOff = [];
|
|
283
|
+
/** Observation indices the cached 3D positions belong to, in the same order;
|
|
284
|
+
* null when every observation is drawn. Without it a projection built from the
|
|
285
|
+
* positions is indexed by DRAWN order and silently attributes each point to
|
|
286
|
+
* the wrong observation as soon as a section is isolated. */
|
|
287
|
+
this.spatialDrawn3d = null;
|
|
288
|
+
/** Reused projection buffers — see {@link getSpatialScreenProjection}. */
|
|
289
|
+
this.spatialProjection3d = undefined;
|
|
290
|
+
/** Per-observation depth from the last projection, for the depth-aware hover pick. */
|
|
291
|
+
this.spatialDepths3d = null;
|
|
292
|
+
/** The (viewer, dataset) whose 3D scene has already had its opening framing. */
|
|
293
|
+
/** Whose 2D observations the camera has been framed on — see {@link frameSpatialPointsOnce}. */
|
|
294
|
+
this.spatial2dFramed = null;
|
|
295
|
+
/** Dataset the 3D scale bar was built for. */
|
|
296
|
+
this.spatialScaleBarKey = null;
|
|
297
|
+
this.spatialSub = null;
|
|
298
|
+
/** Latest (dataset, view, selection) the spatial subscription saw, so a slice
|
|
299
|
+
* change can rebuild the markers for the new plane. */
|
|
300
|
+
this.spatialLatest = null;
|
|
301
|
+
/** Which dataset the current marker layer was built for, so a display-only
|
|
302
|
+
* change (size, colour, opacity, selection) can update it in place. */
|
|
303
|
+
this.spatialLayerKey = null;
|
|
304
|
+
/** Monotonic guard for the async colour rebuild: fetching a gene vector is a
|
|
305
|
+
* round-trip, so a fast sequence of colour-by changes can resolve out of
|
|
306
|
+
* order. Only the newest rebuild is allowed to touch the layer. */
|
|
307
|
+
this.spatialRebuildToken = 0;
|
|
178
308
|
/** Monotonic load generation. Bumped by {@link reset} and {@link cancelLoading}; the frame-loading
|
|
179
309
|
* loops (volume assembly, surface preload) capture it and bail when it changes, so a Cancel (or a
|
|
180
310
|
* new plot) actually stops fetching frames instead of running to completion in the background. */
|
|
@@ -499,11 +629,43 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
499
629
|
const info = imageLoaded?.imageInfo ?? imageInfo;
|
|
500
630
|
const z = imageLoaded?.z ?? 0;
|
|
501
631
|
try {
|
|
502
|
-
const viewer = new Viewer({
|
|
632
|
+
const viewer = new Viewer({
|
|
633
|
+
canvas,
|
|
634
|
+
background: { r: 0.07, g: 0.07, b: 0.09, a: 1 },
|
|
635
|
+
// Set here rather than left to napari-js's own default so the gentler
|
|
636
|
+
// step applies with the version currently installed. Chosen to match the
|
|
637
|
+
// OSD backend's step (see OSD_ZOOM_PER_SCROLL): the wheel should feel the
|
|
638
|
+
// same on an image whichever renderer is drawing it. The step applies per
|
|
639
|
+
// scroll EVENT, and a trackpad sends a burst of them per swipe, so a step
|
|
640
|
+
// tuned to a mouse notch runs away under a trackpad.
|
|
641
|
+
wheelZoomSpeed: NAPARI_WHEEL_ZOOM_SPEED,
|
|
642
|
+
// The FIRST 3D layer of a scene frames the orbit camera; every later one leaves the
|
|
643
|
+
// pose alone. A spatial scene is built from several layers and rebuilt constantly —
|
|
644
|
+
// recolouring by a class, picking a gene, stepping a section — and with napari-js's
|
|
645
|
+
// previous unconditional framing each of those threw away an orbit the user had set.
|
|
646
|
+
// The pose it snapped back to depended on WHICH layer was rebuilt, so isolating one
|
|
647
|
+
// section zoomed to that section's bounds. `resetFit3D()` on a dataset change is what
|
|
648
|
+
// lets the next scene frame itself.
|
|
649
|
+
fit3d: 'once',
|
|
650
|
+
// In the spatial modes a plain click SELECTS the class under the cursor,
|
|
651
|
+
// so napari's OSD-style click-to-zoom is turned off there: otherwise one
|
|
652
|
+
// click would both select a class and zoom 2x about the cursor, and the
|
|
653
|
+
// zoom would then halve the pixel radius the next click hit-tests with.
|
|
654
|
+
// Zooming is still on the wheel, the zoom buttons and the zoom-box tool.
|
|
655
|
+
...(isSpatialOmics(plotType) || isSpatialOmics3d(plotType)
|
|
656
|
+
? { clickZoomFactor: 0 }
|
|
657
|
+
: {}),
|
|
658
|
+
});
|
|
503
659
|
this.viewer = viewer;
|
|
504
660
|
await viewer.ready;
|
|
505
|
-
if (
|
|
506
|
-
await this.
|
|
661
|
+
if (isSpatialOmics3d(plotType)) {
|
|
662
|
+
await this.mountSpatialOmics3d(viewer, host);
|
|
663
|
+
}
|
|
664
|
+
else if (isSpatialOmics(plotType)) {
|
|
665
|
+
await this.mountSpatialOmics(viewer, host, z);
|
|
666
|
+
}
|
|
667
|
+
else if (isNapariScatter(plotType)) {
|
|
668
|
+
await this.mountScatter(viewer, host, z);
|
|
507
669
|
}
|
|
508
670
|
else if (isNapariScatter3d(plotType)) {
|
|
509
671
|
await this.mountScatter3d(viewer, info);
|
|
@@ -519,11 +681,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
519
681
|
this.fitCameraSoon();
|
|
520
682
|
this.subscribeDisplayState();
|
|
521
683
|
this.installScaleBar();
|
|
522
|
-
this.
|
|
523
|
-
this.buildToolHosts();
|
|
524
|
-
// Keep the pixel-tool readback (lastPixels) current as the view pans/zooms and tiled
|
|
525
|
-
// levels load, so wand/brush/SAM sample the actually-displayed image (jit-ui#102).
|
|
526
|
-
this.cameraReadbackOff = viewer.camera.changed.connect(() => this.armReadback());
|
|
684
|
+
this.install2dInteraction(viewer, host);
|
|
527
685
|
}
|
|
528
686
|
this.scheduleReadback();
|
|
529
687
|
return true;
|
|
@@ -960,7 +1118,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
960
1118
|
const states = this.store.currentChannelStates();
|
|
961
1119
|
this.volumeChannelData.clear();
|
|
962
1120
|
this.volumeMultichannel = multichannel;
|
|
963
|
-
this.imageMode =
|
|
1121
|
+
this.imageMode = this.volumeMultichannel ? 'multichannel' : 'grayscale';
|
|
964
1122
|
const view = new MultiChannelVolumeView(viewer);
|
|
965
1123
|
this.volumeView = view;
|
|
966
1124
|
// Assemble per-channel scalar volumes from the server tiles (jit-specific); the napari-js view
|
|
@@ -1021,15 +1179,41 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1021
1179
|
// to shrink at higher resolution. Instead anchor the in-plane long side to a fixed reference and
|
|
1022
1180
|
// let Z span the full slice count; the box shape is then identical at every decimate factor. The
|
|
1023
1181
|
// per-axis `voxelSize` (napari `scale`) maps the sampled grid onto that fixed world box.
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1182
|
+
// A stack that declares its physical spacing on ALL THREE axes gets its true
|
|
1183
|
+
// extent as the world box — the only way anisotropy survives, and what makes a
|
|
1184
|
+
// resampled 40 x 40 x 200 µm volume read as a brain instead of a cube-aspect
|
|
1185
|
+
// brick. It needs none of the reference-box arithmetic: a physical box is
|
|
1186
|
+
// already independent of the decimate factor.
|
|
1187
|
+
//
|
|
1188
|
+
// Everything else keeps that arithmetic. Sizing the box by the sampled voxel
|
|
1189
|
+
// counts made higher in-plane resolution grow X/Y while the depth stayed the
|
|
1190
|
+
// (constant) slice count — so Z appeared to shrink at higher resolution.
|
|
1191
|
+
// Anchoring the in-plane long side to a fixed reference and letting Z span the
|
|
1192
|
+
// full slice count makes the box shape identical at every decimate factor.
|
|
1193
|
+
const meta = this.loaded?.imageInfo.imageMeta?.[0];
|
|
1194
|
+
const mppXYZ = meta?.mppX && meta?.mppY && meta?.mppZ ? [meta.mppX, meta.mppY, meta.mppZ] : null;
|
|
1195
|
+
// The image's DECLARED pixel dimensions, which is what mpp is per: the sampled
|
|
1196
|
+
// dims are decimated, so sizing a physical box by them would make the world
|
|
1197
|
+
// box depend on the resolution the user happens to be viewing at.
|
|
1198
|
+
const fullW = this.descriptor?.width ?? meta?.x ?? dims.width;
|
|
1199
|
+
const fullH = this.descriptor?.height ?? meta?.y ?? dims.height;
|
|
1200
|
+
const fullD = meta?.z || this.loaded?.imageInfo.urls?.length || dims.depth;
|
|
1201
|
+
let world;
|
|
1202
|
+
if (mppXYZ) {
|
|
1203
|
+
world = {
|
|
1204
|
+
width: fullW * mppXYZ[0],
|
|
1205
|
+
height: fullH * mppXYZ[1],
|
|
1206
|
+
depth: fullD * mppXYZ[2],
|
|
1207
|
+
};
|
|
1208
|
+
}
|
|
1209
|
+
else {
|
|
1210
|
+
const fullLong = Math.max(1, fullW, fullH);
|
|
1211
|
+
world = {
|
|
1212
|
+
width: (fullW * VOLUME_WORLD_INPLANE_REF) / fullLong,
|
|
1213
|
+
height: (fullH * VOLUME_WORLD_INPLANE_REF) / fullLong,
|
|
1214
|
+
depth: fullD,
|
|
1215
|
+
};
|
|
1216
|
+
}
|
|
1033
1217
|
// Base box (Z-scale = 1) + the sampled depth drive the live Z-height handle below; the persisted
|
|
1034
1218
|
// `volumeZScale` (user drag) applies on top so changing resolution keeps the chosen height.
|
|
1035
1219
|
this.volumeWorldBase = world;
|
|
@@ -1042,16 +1226,15 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1042
1226
|
];
|
|
1043
1227
|
for (const ch of channels)
|
|
1044
1228
|
ch.voxelSize = voxelSize;
|
|
1045
|
-
view.render(
|
|
1229
|
+
view.render(this.volumeMultichannel ? 'multichannel' : 'grayscale', channels, { rendering });
|
|
1046
1230
|
this.imageW = dims.width;
|
|
1047
1231
|
this.imageH = dims.height;
|
|
1048
1232
|
this.volumeDims = dims;
|
|
1049
1233
|
// 3D coordinate-axes / scale gizmo + labels, sharing the volume's world box so the gizmo tracks
|
|
1050
1234
|
// the rendered proportions. Physical scale text still comes from the FULL image extent.
|
|
1051
|
-
const mppX = this.descriptor?.mppX || this.loaded?.imageInfo.imageMeta?.[0]?.mppX || 0;
|
|
1052
1235
|
this.axesLayer = viewer.addAxes(world.width, world.height, worldZ, { visible: this.axesVisible });
|
|
1053
1236
|
if (this.host) {
|
|
1054
|
-
this.axesLabels = new NapariAxesLabels(this.host, viewer.camera3d, this.buildAxesLabels({ width: world.width, height: world.height, depth: worldZ }
|
|
1237
|
+
this.axesLabels = new NapariAxesLabels(this.host, viewer.camera3d, this.buildAxesLabels({ width: world.width, height: world.height, depth: worldZ }));
|
|
1055
1238
|
this.axesLabels.setVisible(this.axesVisible);
|
|
1056
1239
|
// In-view drag handle at the TOP END OF THE Z AXIS (the box's min-XY corner, where the blue
|
|
1057
1240
|
// "Z" axis + label live), so it reads as the Z-height control. Floated a little past the axis
|
|
@@ -1087,28 +1270,53 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1087
1270
|
}
|
|
1088
1271
|
if (this.axesLayer)
|
|
1089
1272
|
this.axesLayer.depth = worldZ;
|
|
1090
|
-
|
|
1091
|
-
this.axesLabels?.updateAnchors(this.buildAxesLabels({ width: base.width, height: base.height, depth: worldZ }, mppX));
|
|
1273
|
+
this.axesLabels?.updateAnchors(this.buildAxesLabels({ width: base.width, height: base.height, depth: worldZ }));
|
|
1092
1274
|
this.zHandle?.reposition();
|
|
1093
1275
|
this.viewer?.requestRender();
|
|
1094
1276
|
}
|
|
1095
1277
|
/** Build the X/Y/Z axis-end label specs for the 3D gizmo. Anchors are in the volume's centred
|
|
1096
1278
|
* world box (matching the AxesLayer geometry); the scale text reflects the FULL image extent —
|
|
1097
1279
|
* physical µm when µm/pixel is known, else pixel (X/Y) / slice (Z) counts. */
|
|
1098
|
-
buildAxesLabels(vol
|
|
1280
|
+
buildAxesLabels(vol) {
|
|
1099
1281
|
const hx = vol.width / 2;
|
|
1100
1282
|
const hy = vol.height / 2;
|
|
1101
1283
|
const hz = vol.depth / 2;
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
const
|
|
1284
|
+
// Measured from the IMAGE's own extent, never from the world box: the box is a
|
|
1285
|
+
// shape (and for a physically sized volume it is already in µm, so reading a
|
|
1286
|
+
// pixel count off it and multiplying by mpp would scale the label twice).
|
|
1287
|
+
const { px, mpp } = this.imageExtent();
|
|
1288
|
+
const len = (n, um) => (um > 0 ? formatUm(n * um) : `${n} px`);
|
|
1106
1289
|
return [
|
|
1107
|
-
{ anchor: [hx, -hy, -hz], text: `X · ${len(
|
|
1108
|
-
{ anchor: [-hx, hy, -hz], text: `Y · ${len(
|
|
1109
|
-
|
|
1290
|
+
{ anchor: [hx, -hy, -hz], text: `X · ${len(px[0], mpp[0])}`, color: '#ed4545' },
|
|
1291
|
+
{ anchor: [-hx, hy, -hz], text: `Y · ${len(px[1], mpp[1])}`, color: '#4dd959' },
|
|
1292
|
+
// Physical when the stack declares its slice spacing (`mppZ`) — a resampled
|
|
1293
|
+
// volume knows how thick it is; a plain z-stack can only say how many slices.
|
|
1294
|
+
{ anchor: [-hx, -hy, hz], text: `Z · ${len(px[2], mpp[2])}`, color: '#668cff' },
|
|
1110
1295
|
];
|
|
1111
1296
|
}
|
|
1297
|
+
/**
|
|
1298
|
+
* The image's declared extent in pixels/slices, and its physical spacing per
|
|
1299
|
+
* axis in µm (0 = undeclared, and then that axis reads in pixels).
|
|
1300
|
+
*
|
|
1301
|
+
* One place, because the volume world box and the axis labels have to agree
|
|
1302
|
+
* about what the image's real dimensions are — the sampled grid is decimated and
|
|
1303
|
+
* says nothing about either.
|
|
1304
|
+
*/
|
|
1305
|
+
imageExtent() {
|
|
1306
|
+
const meta = this.loaded?.imageInfo.imageMeta?.[0];
|
|
1307
|
+
const dims = this.volumeDims;
|
|
1308
|
+
const mppX = this.descriptor?.mppX || meta?.mppX || 0;
|
|
1309
|
+
return {
|
|
1310
|
+
px: [
|
|
1311
|
+
this.descriptor?.width ?? meta?.x ?? dims?.width ?? 1,
|
|
1312
|
+
this.descriptor?.height ?? meta?.y ?? dims?.height ?? 1,
|
|
1313
|
+
meta?.z || this.loaded?.imageInfo.urls?.length || dims?.depth || 1,
|
|
1314
|
+
],
|
|
1315
|
+
// A descriptor that reports only mppX is square-pixel by convention, which is
|
|
1316
|
+
// what the 2D scale bar already assumes of it.
|
|
1317
|
+
mpp: [mppX, this.descriptor?.mppY || meta?.mppY || mppX, meta?.mppZ || 0],
|
|
1318
|
+
};
|
|
1319
|
+
}
|
|
1112
1320
|
/**
|
|
1113
1321
|
* Assemble a downsampled uint8 volume (luminance) from the per-slice tile endpoint. Slices are
|
|
1114
1322
|
* fetched with bounded concurrency (keeps the connection pool full without flooding it on a deep
|
|
@@ -1198,11 +1406,14 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1198
1406
|
* centroid (napari-js analog of Plotly's region-centroid scatter). Rebuilds the points live as
|
|
1199
1407
|
* regions change.
|
|
1200
1408
|
*/
|
|
1201
|
-
async mountScatter(viewer, z) {
|
|
1409
|
+
async mountScatter(viewer, host, z) {
|
|
1202
1410
|
await this.renderImage(z);
|
|
1203
1411
|
this.fitCameraSoon();
|
|
1204
1412
|
this.subscribeDisplayState();
|
|
1205
1413
|
this.installScaleBar();
|
|
1414
|
+
// This mode plots REGION centroids, so without the region tools there is no
|
|
1415
|
+
// way to produce a point — drawing a region now adds one immediately.
|
|
1416
|
+
this.install2dInteraction(viewer, host);
|
|
1206
1417
|
this.rebuildScatterPoints();
|
|
1207
1418
|
this.scatterRegionSub = this.regionStore
|
|
1208
1419
|
.getRegionUpdateEvent()
|
|
@@ -1260,6 +1471,1641 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1260
1471
|
}
|
|
1261
1472
|
return new Float32Array(out);
|
|
1262
1473
|
}
|
|
1474
|
+
/**
|
|
1475
|
+
* The interaction stack every 2D mode needs: the region overlay (draw/select/edit), the pixel
|
|
1476
|
+
* tools that read back displayed pixels (wand, brush, vertex eraser, zoom-to-box, SAM/cellpose),
|
|
1477
|
+
* and a camera hook that keeps that readback current as the view pans/zooms and tiled levels
|
|
1478
|
+
* load.
|
|
1479
|
+
*
|
|
1480
|
+
* Extracted because forgetting it is invisible: the toolbar gates its region buttons on 2D-vs-3D
|
|
1481
|
+
* rather than on plot type, so a 2D mode that skips this shows every tool and silently does
|
|
1482
|
+
* nothing. That is exactly what happened to the spatial and region-centroid scatter modes.
|
|
1483
|
+
*/
|
|
1484
|
+
install2dInteraction(viewer, host) {
|
|
1485
|
+
this.regionOverlay = new NapariRegionOverlay(host, viewer, this.regionStore);
|
|
1486
|
+
this.buildToolHosts();
|
|
1487
|
+
this.cameraReadbackOff = viewer.camera.changed.connect(() => this.armReadback());
|
|
1488
|
+
}
|
|
1489
|
+
// ── Spatial omics ────────────────────────────────────────────────────────────────────────
|
|
1490
|
+
/** Marker radius (image px) for a dataset that declares none — segmented cells often don't. */
|
|
1491
|
+
static { this.SPATIAL_FALLBACK_RADIUS = 4; }
|
|
1492
|
+
/** Smallest marker DIAMETER, in slice pixels, over a volume-backed dataset. A cell's real
|
|
1493
|
+
* size is honoured wherever it survives the grid: the ABC atlas serves 5 µm radii on a
|
|
1494
|
+
* 40 µm/px template, so drawing them to scale would put every cell a fifth of a pixel wide
|
|
1495
|
+
* and the section would come up empty. The point-size control scales up from this floor. */
|
|
1496
|
+
static { this.SPATIAL_SLICE_MIN_DIAMETER_PX = 1.5; }
|
|
1497
|
+
/** Longest side of the gene-map raster, in field pixels. A gene map is a smooth
|
|
1498
|
+
* field read as territory, so it gains nothing from matching a 2 Gpx slide's
|
|
1499
|
+
* resolution — and the estimate costs one pass over this many pixels. */
|
|
1500
|
+
static { this.GENE_MAP_MAX_SIDE = 512; }
|
|
1501
|
+
/** Kernel σ in field pixels at smoothing 1: wide enough to read between cells,
|
|
1502
|
+
* tight enough to keep a nucleus-scale structure distinct. */
|
|
1503
|
+
static { this.GENE_MAP_SIGMA = 2.5; }
|
|
1504
|
+
/** Clusters drawn as density volumes at once. Past a handful, additive translucent
|
|
1505
|
+
* clouds stop being separable by eye — and each one is a full rasterisation. */
|
|
1506
|
+
static { this.DENSITY_MAX_CLUSTERS = 6; }
|
|
1507
|
+
/** Colour for observations when nothing is selected to colour by: visible, neutral, and
|
|
1508
|
+
* obviously not encoding anything. */
|
|
1509
|
+
/** How much larger a selected marker is drawn, so a small selection is findable inside a
|
|
1510
|
+
* 3.7M-point cloud rather than merely brighter. */
|
|
1511
|
+
static { this.SPATIAL_SELECTED_SIZE_SCALE = 1.6; }
|
|
1512
|
+
static { this.SPATIAL_NEUTRAL_COLOR = [0.35, 0.72, 0.95, 0.9]; }
|
|
1513
|
+
/**
|
|
1514
|
+
* Mount the SPATIAL_OMICS view: the tissue image with one marker per observation, coloured by
|
|
1515
|
+
* an annotation column or a gene. The markers rebuild whenever the dataset or the view state
|
|
1516
|
+
* changes, so switching the colour-by column does not remount the scene.
|
|
1517
|
+
*
|
|
1518
|
+
* Sets up the full 2D interaction stack — region overlay, pixel-tool hosts, readback currency —
|
|
1519
|
+
* exactly as the plain image view does. That is NOT optional here: this mode's selection is
|
|
1520
|
+
* driven by drawn ROIs, so without the overlay there is no way to make a selection at all.
|
|
1521
|
+
*/
|
|
1522
|
+
async mountSpatialOmics(viewer, host, z) {
|
|
1523
|
+
await this.renderImage(z);
|
|
1524
|
+
// Only fit to the image when this dataset actually has one. Otherwise there is
|
|
1525
|
+
// nothing to fit, `imageW`/`imageH` still hold the LAST image's dimensions, and
|
|
1526
|
+
// this fits to those — and because it defers to a frame, it lands AFTER the points
|
|
1527
|
+
// are added and overwrites the framing they set. That is what left an image-less
|
|
1528
|
+
// dataset as a ten-pixel speck off to one side.
|
|
1529
|
+
if (this.spatialLatest?.[0]?.imageRef)
|
|
1530
|
+
this.fitCameraSoon();
|
|
1531
|
+
this.subscribeDisplayState();
|
|
1532
|
+
this.installScaleBar();
|
|
1533
|
+
this.install2dInteraction(viewer, host);
|
|
1534
|
+
this.installSpatialHover(host);
|
|
1535
|
+
this.subscribeSpatial();
|
|
1536
|
+
this.scheduleReadback();
|
|
1537
|
+
}
|
|
1538
|
+
/**
|
|
1539
|
+
* Region drawing for the 3D cloud.
|
|
1540
|
+
*
|
|
1541
|
+
* Reuses {@link NapariRegionOverlay} verbatim by handing it a SCREEN-SPACE viewer: the drawn
|
|
1542
|
+
* shape is a lasso in canvas pixels, so "world" is the canvas and both transforms are identity
|
|
1543
|
+
* (bar the client→canvas offset). Every existing tool — rectangle, polygon, freehand — therefore
|
|
1544
|
+
* works in 3D with no new drawing code.
|
|
1545
|
+
*
|
|
1546
|
+
* A screen-space shape stops meaning anything the moment the camera moves, so an orbit clears
|
|
1547
|
+
* the drawn regions. The SELECTION it produced is kept: that is the durable artefact, and the
|
|
1548
|
+
* highlighted points stay highlighted from every angle.
|
|
1549
|
+
*/
|
|
1550
|
+
install3dInteraction(viewer, host) {
|
|
1551
|
+
const canvasRect = () => this.canvas?.getBoundingClientRect();
|
|
1552
|
+
const screenSpace = {
|
|
1553
|
+
canvasToWorld: (clientX, clientY) => {
|
|
1554
|
+
const r = canvasRect();
|
|
1555
|
+
return r ? [clientX - r.left, clientY - r.top] : [clientX, clientY];
|
|
1556
|
+
},
|
|
1557
|
+
// Already canvas pixels.
|
|
1558
|
+
worldToCanvas: (x, y) => [x, y],
|
|
1559
|
+
setControlsEnabled: (enabled) => viewer.setControlsEnabled(enabled),
|
|
1560
|
+
camera: viewer.camera3d,
|
|
1561
|
+
};
|
|
1562
|
+
this.regionOverlay = new NapariRegionOverlay(host, screenSpace, this.regionStore);
|
|
1563
|
+
this.buildToolHosts();
|
|
1564
|
+
this.cameraReadbackOff = viewer.camera3d.changed.connect(() => {
|
|
1565
|
+
// Only while nothing is being drawn — clearing mid-gesture would delete the
|
|
1566
|
+
// shape under the user's cursor.
|
|
1567
|
+
if (this.regionStore.getRegions().length > 0)
|
|
1568
|
+
this.regionStore.setRegions([]);
|
|
1569
|
+
});
|
|
1570
|
+
}
|
|
1571
|
+
/** Movement, in screen pixels, under which a press-release is a CLICK and not a
|
|
1572
|
+
* drag. An orbit or a pan starts the same way, so the two have to be told
|
|
1573
|
+
* apart by how far the pointer travelled. */
|
|
1574
|
+
static { this.CLICK_SLOP_PX = 4; }
|
|
1575
|
+
/** Longest press-release still treated as a click. A long press with the mouse
|
|
1576
|
+
* held still is more likely an interrupted drag than a selection. */
|
|
1577
|
+
static { this.CLICK_MAX_MS = 600; }
|
|
1578
|
+
/** Pointer distance, in screen pixels, that still counts as "on" a marker.
|
|
1579
|
+
* Generous relative to a 1.5px disc: the cursor is a blunt instrument, and a
|
|
1580
|
+
* tooltip you have to hunt for is worse than none. */
|
|
1581
|
+
static { this.HOVER_RADIUS_PX = 10; }
|
|
1582
|
+
/**
|
|
1583
|
+
* Cursor tooltip for the spatial views: hover a marker, read its class.
|
|
1584
|
+
*
|
|
1585
|
+
* A 34-entry legend cannot be read back from a dot — several classes get
|
|
1586
|
+
* similar colours, and matching one to a swatch by eye is exactly the task this
|
|
1587
|
+
* removes. It reports whatever the cloud is CURRENTLY coloured by, so it and
|
|
1588
|
+
* the legend can never say different things.
|
|
1589
|
+
*
|
|
1590
|
+
* Listens on the HOST rather than the canvas so it keeps working over the region
|
|
1591
|
+
* overlay (an SVG covering the canvas, which would otherwise swallow every
|
|
1592
|
+
* move), and throttles to one hit-test per animation frame: a pointermove can
|
|
1593
|
+
* fire far more often than that, and each test is a pass over the cloud.
|
|
1594
|
+
*/
|
|
1595
|
+
installSpatialHover(host) {
|
|
1596
|
+
this.removeSpatialHover();
|
|
1597
|
+
this.spatialTooltip = new NapariSpatialTooltip(host);
|
|
1598
|
+
const onMove = (e) => {
|
|
1599
|
+
const canvas = this.canvas;
|
|
1600
|
+
if (!canvas)
|
|
1601
|
+
return;
|
|
1602
|
+
const rect = canvas.getBoundingClientRect();
|
|
1603
|
+
this.hoverPointer = {
|
|
1604
|
+
x: e.clientX - rect.left,
|
|
1605
|
+
y: e.clientY - rect.top,
|
|
1606
|
+
clientX: e.clientX,
|
|
1607
|
+
clientY: e.clientY,
|
|
1608
|
+
};
|
|
1609
|
+
if (this.hoverFrame)
|
|
1610
|
+
return;
|
|
1611
|
+
this.hoverFrame = requestAnimationFrame(() => {
|
|
1612
|
+
this.hoverFrame = 0;
|
|
1613
|
+
this.updateHover(host);
|
|
1614
|
+
});
|
|
1615
|
+
};
|
|
1616
|
+
const onLeave = () => {
|
|
1617
|
+
this.hoverPointer = null;
|
|
1618
|
+
this.spatialTooltip?.hide();
|
|
1619
|
+
};
|
|
1620
|
+
// A click on a marker selects its class, exactly as clicking that class in the
|
|
1621
|
+
// panel's legend does — including clicking again to clear, so a click is
|
|
1622
|
+
// always reversible. Tracked as down/up rather than bound to `click` so a DRAG
|
|
1623
|
+
// (an orbit in 3D, a pan in 2D) can be told apart from a click: the gesture
|
|
1624
|
+
// has to move less than a few pixels and be over quickly.
|
|
1625
|
+
let down = null;
|
|
1626
|
+
const onDown = (e) => {
|
|
1627
|
+
down = { x: e.clientX, y: e.clientY, t: Date.now() };
|
|
1628
|
+
};
|
|
1629
|
+
const onUp = (e) => {
|
|
1630
|
+
const start = down;
|
|
1631
|
+
down = null;
|
|
1632
|
+
if (!start)
|
|
1633
|
+
return;
|
|
1634
|
+
const moved = Math.hypot(e.clientX - start.x, e.clientY - start.y);
|
|
1635
|
+
if (moved > NapariVisualizerService.CLICK_SLOP_PX)
|
|
1636
|
+
return;
|
|
1637
|
+
if (Date.now() - start.t > NapariVisualizerService.CLICK_MAX_MS)
|
|
1638
|
+
return;
|
|
1639
|
+
// A region tool owns the pointer while it is active, and placing a polygon
|
|
1640
|
+
// vertex is also a click that does not move.
|
|
1641
|
+
if (this.regionOverlay?.toolActive)
|
|
1642
|
+
return;
|
|
1643
|
+
this.selectClassAt(e.clientX, e.clientY);
|
|
1644
|
+
};
|
|
1645
|
+
host.addEventListener('pointermove', onMove);
|
|
1646
|
+
host.addEventListener('pointerleave', onLeave);
|
|
1647
|
+
host.addEventListener('pointerdown', onDown);
|
|
1648
|
+
host.addEventListener('pointerup', onUp);
|
|
1649
|
+
this.hoverOff.push(() => host.removeEventListener('pointermove', onMove));
|
|
1650
|
+
this.hoverOff.push(() => host.removeEventListener('pointerleave', onLeave));
|
|
1651
|
+
this.hoverOff.push(() => host.removeEventListener('pointerdown', onDown));
|
|
1652
|
+
this.hoverOff.push(() => host.removeEventListener('pointerup', onUp));
|
|
1653
|
+
// In 3D the cached positions are screen pixels, so an orbit invalidates them.
|
|
1654
|
+
const camera = this.viewer?.camera3d;
|
|
1655
|
+
if (camera && isSpatialOmics3d(this.currentPlotType)) {
|
|
1656
|
+
const off = camera.changed.connect(() => {
|
|
1657
|
+
this.spatialSceneRev++;
|
|
1658
|
+
});
|
|
1659
|
+
this.hoverOff.push(off);
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
removeSpatialHover() {
|
|
1663
|
+
for (const off of this.hoverOff)
|
|
1664
|
+
off();
|
|
1665
|
+
this.hoverOff = [];
|
|
1666
|
+
if (this.hoverFrame)
|
|
1667
|
+
cancelAnimationFrame(this.hoverFrame);
|
|
1668
|
+
this.hoverFrame = 0;
|
|
1669
|
+
this.hoverPointer = null;
|
|
1670
|
+
this.spatialTooltip?.dispose();
|
|
1671
|
+
this.spatialTooltip = null;
|
|
1672
|
+
this.hoverPositions = null;
|
|
1673
|
+
this.hoverPositionsRev = -1;
|
|
1674
|
+
this.hoverIndex = null;
|
|
1675
|
+
}
|
|
1676
|
+
/** Hit-test the last pointer position and show or hide the tooltip. */
|
|
1677
|
+
updateHover(host) {
|
|
1678
|
+
const tip = this.spatialTooltip;
|
|
1679
|
+
const pointer = this.hoverPointer;
|
|
1680
|
+
const dataset = this.spatialLatest?.[0];
|
|
1681
|
+
if (!tip || !pointer || !dataset)
|
|
1682
|
+
return;
|
|
1683
|
+
const positions = this.hoverPositionsFor(dataset.observations);
|
|
1684
|
+
if (!positions) {
|
|
1685
|
+
tip.hide();
|
|
1686
|
+
return;
|
|
1687
|
+
}
|
|
1688
|
+
const is3d = isSpatialOmics3d(this.currentPlotType);
|
|
1689
|
+
// 3D compares screen pixels directly; 2D holds world positions, so the radius
|
|
1690
|
+
// is converted once instead of projecting the whole cloud.
|
|
1691
|
+
const zoom = is3d ? 1 : (this.viewer?.camera.zoom ?? 1);
|
|
1692
|
+
const radius = NapariVisualizerService.HOVER_RADIUS_PX / (zoom > 0 ? zoom : 1);
|
|
1693
|
+
let x = pointer.x;
|
|
1694
|
+
let y = pointer.y;
|
|
1695
|
+
if (!is3d) {
|
|
1696
|
+
const world = this.viewer?.canvasToWorld(pointer.clientX, pointer.clientY);
|
|
1697
|
+
if (!world) {
|
|
1698
|
+
tip.hide();
|
|
1699
|
+
return;
|
|
1700
|
+
}
|
|
1701
|
+
[x, y] = world;
|
|
1702
|
+
}
|
|
1703
|
+
const hit = this.pickObservation(positions, x, y, radius, is3d);
|
|
1704
|
+
const lines = hoverText(this.hoverSource, hit);
|
|
1705
|
+
if (!lines) {
|
|
1706
|
+
tip.hide();
|
|
1707
|
+
return;
|
|
1708
|
+
}
|
|
1709
|
+
const rect = host.getBoundingClientRect();
|
|
1710
|
+
tip.show(lines, pointer.clientX - rect.left, pointer.clientY - rect.top);
|
|
1711
|
+
}
|
|
1712
|
+
/**
|
|
1713
|
+
* Select the class of the marker at a client position — the canvas equivalent of
|
|
1714
|
+
* clicking that class in the panel's legend, and the same selection object, so
|
|
1715
|
+
* the two controls cannot produce different results.
|
|
1716
|
+
*
|
|
1717
|
+
* Clicking a class that is already the whole selection CLEARS it, which is what
|
|
1718
|
+
* the legend does. Compared against the selection itself rather than against a
|
|
1719
|
+
* remembered click, so selecting from the legend and then clicking the same
|
|
1720
|
+
* class on the canvas still toggles.
|
|
1721
|
+
*/
|
|
1722
|
+
selectClassAt(clientX, clientY) {
|
|
1723
|
+
const source = this.hoverSource;
|
|
1724
|
+
const store = this.selectionStore;
|
|
1725
|
+
const dataset = this.spatialLatest?.[0];
|
|
1726
|
+
// Only a categorical source has classes to select. A gene is continuous:
|
|
1727
|
+
// there is no set of cells that "is" a value.
|
|
1728
|
+
if (!store || !dataset || source?.kind !== 'categorical')
|
|
1729
|
+
return;
|
|
1730
|
+
const positions = this.hoverPositionsFor(dataset.observations);
|
|
1731
|
+
if (!positions)
|
|
1732
|
+
return;
|
|
1733
|
+
const canvas = this.canvas;
|
|
1734
|
+
if (!canvas)
|
|
1735
|
+
return;
|
|
1736
|
+
const rect = canvas.getBoundingClientRect();
|
|
1737
|
+
const is3d = isSpatialOmics3d(this.currentPlotType);
|
|
1738
|
+
const zoom = is3d ? 1 : (this.viewer?.camera.zoom ?? 1);
|
|
1739
|
+
const radius = NapariVisualizerService.HOVER_RADIUS_PX / (zoom > 0 ? zoom : 1);
|
|
1740
|
+
let x = clientX - rect.left;
|
|
1741
|
+
let y = clientY - rect.top;
|
|
1742
|
+
if (!is3d) {
|
|
1743
|
+
const world = this.viewer?.canvasToWorld(clientX, clientY);
|
|
1744
|
+
if (!world)
|
|
1745
|
+
return;
|
|
1746
|
+
[x, y] = world;
|
|
1747
|
+
}
|
|
1748
|
+
const hit = nearestObservation(positions, x, y, radius);
|
|
1749
|
+
if (hit < 0)
|
|
1750
|
+
return;
|
|
1751
|
+
const code = source.codes[hit];
|
|
1752
|
+
// A cell the annotation does not cover has no class to select.
|
|
1753
|
+
if (code === undefined || code === NO_CATEGORY)
|
|
1754
|
+
return;
|
|
1755
|
+
const next = selectByCategory(source.codes, code);
|
|
1756
|
+
const current = store.current();
|
|
1757
|
+
if (sameSelection(current, next)) {
|
|
1758
|
+
store.clear();
|
|
1759
|
+
return;
|
|
1760
|
+
}
|
|
1761
|
+
store.set(next);
|
|
1762
|
+
}
|
|
1763
|
+
/**
|
|
1764
|
+
* Which observation is under the cursor.
|
|
1765
|
+
*
|
|
1766
|
+
* In 3D this defers to napari-js's {@link nearestProjectedIndex} WITH the depths the
|
|
1767
|
+
* projection produced, so the front-most candidate wins. That matters more than it
|
|
1768
|
+
* sounds: the renderer depth-tests the billboards, and in a 3.7M-point cloud the cursor
|
|
1769
|
+
* covers many of them — picking the one nearest the cursor's centre regularly names a
|
|
1770
|
+
* cell that something else is drawn over, which reads as a wrong tooltip rather than as
|
|
1771
|
+
* a subtlety of picking.
|
|
1772
|
+
*
|
|
1773
|
+
* In 2D the positions are WORLD coordinates on one plane, so there is no depth to break
|
|
1774
|
+
* ties with and the existing nearest-marker rule is the right one.
|
|
1775
|
+
*/
|
|
1776
|
+
pickObservation(positions, x, y, radius, is3d) {
|
|
1777
|
+
if (!is3d)
|
|
1778
|
+
return nearestObservation(positions, x, y, radius);
|
|
1779
|
+
// The cloud draws a selected marker LARGER, so the pick has to use the same radius the
|
|
1780
|
+
// renderer used — otherwise the highlighted cells, the ones a reader is most likely to
|
|
1781
|
+
// be pointing at, are the hardest to hover.
|
|
1782
|
+
const scale = NapariVisualizerService.SPATIAL_SELECTED_SIZE_SCALE;
|
|
1783
|
+
const mask = this.selectionStore?.current()?.mask;
|
|
1784
|
+
const opts = mask?.length
|
|
1785
|
+
? { radiusAt: (i) => (mask[i] ? radius * scale : radius) }
|
|
1786
|
+
: undefined;
|
|
1787
|
+
// `radius` still bounds which buckets are visited, so it has to be the LARGEST any
|
|
1788
|
+
// point can claim, not the base one.
|
|
1789
|
+
const reach = mask?.length ? radius * scale : radius;
|
|
1790
|
+
if (this.hoverIndex)
|
|
1791
|
+
return this.hoverIndex.pick(x, y, reach, opts);
|
|
1792
|
+
return nearestProjectedIndex(positions, x, y, reach, this.spatialDepths3d, opts);
|
|
1793
|
+
}
|
|
1794
|
+
/**
|
|
1795
|
+
* Positions to hit-test against, rebuilt only when the scene or camera moved.
|
|
1796
|
+
*
|
|
1797
|
+
* A pass over 3.7M observations is not something to do per pointermove, and the
|
|
1798
|
+
* cloud does not move between frames unless something says it did.
|
|
1799
|
+
*/
|
|
1800
|
+
hoverPositionsFor(obs) {
|
|
1801
|
+
if (this.hoverPositions && this.hoverPositionsRev === this.spatialSceneRev) {
|
|
1802
|
+
return this.hoverPositions;
|
|
1803
|
+
}
|
|
1804
|
+
const is3d = isSpatialOmics3d(this.currentPlotType);
|
|
1805
|
+
const built = is3d
|
|
1806
|
+
? this.getSpatialScreenProjection(obs)
|
|
1807
|
+
: this.hoverWorldPositions(obs);
|
|
1808
|
+
this.hoverPositions = built;
|
|
1809
|
+
this.hoverPositionsRev = this.spatialSceneRev;
|
|
1810
|
+
// Built here, in the same lazy slot, so it is paid for on the first hover after the
|
|
1811
|
+
// scene moved and not on every frame of an orbit. Only worth it past the point where
|
|
1812
|
+
// the linear scan stops being free; below that the build costs more than it saves.
|
|
1813
|
+
this.hoverIndex = null;
|
|
1814
|
+
if (is3d && built && this.canvas && built.length / 2 >= SCREEN_INDEX_MIN_POINTS) {
|
|
1815
|
+
const w = this.canvas.clientWidth || this.canvas.width;
|
|
1816
|
+
const h = this.canvas.clientHeight || this.canvas.height;
|
|
1817
|
+
if (w && h) {
|
|
1818
|
+
this.hoverIndex = new ScreenIndex({ screen: built, depth: this.spatialDepths3d ?? new Float32Array(built.length / 2) }, w, h,
|
|
1819
|
+
// The largest radius any pick here can claim: the base hover radius, times the
|
|
1820
|
+
// scale a SELECTED marker is drawn at. Stated rather than left to the default,
|
|
1821
|
+
// because it is what decides whether a marker straddling the canvas edge is
|
|
1822
|
+
// found — its centre is off screen while part of it is not.
|
|
1823
|
+
{
|
|
1824
|
+
maxReach: NapariVisualizerService.HOVER_RADIUS_PX
|
|
1825
|
+
* NapariVisualizerService.SPATIAL_SELECTED_SIZE_SCALE,
|
|
1826
|
+
});
|
|
1827
|
+
}
|
|
1828
|
+
}
|
|
1829
|
+
return built;
|
|
1830
|
+
}
|
|
1831
|
+
/**
|
|
1832
|
+
* The 2D markers' WORLD positions, indexed by observation, NaN for any not on
|
|
1833
|
+
* the displayed plane — the same affine and the same subset the marker layer was
|
|
1834
|
+
* built from, so the tooltip cannot point at a cell that is not drawn.
|
|
1835
|
+
*/
|
|
1836
|
+
hoverWorldPositions(obs) {
|
|
1837
|
+
const dataset = this.spatialLatest?.[0];
|
|
1838
|
+
if (!dataset || obs.count === 0)
|
|
1839
|
+
return null;
|
|
1840
|
+
const slab = this.spatialSlab(dataset);
|
|
1841
|
+
const ref = slab?.ref ?? dataset.imageRef;
|
|
1842
|
+
const [sx, sy] = ref?.scale ?? [1, 1];
|
|
1843
|
+
const [tx, ty] = ref?.translate ?? [0, 0];
|
|
1844
|
+
const drawn = slab?.indices ?? null;
|
|
1845
|
+
const out = new Float32Array(obs.count * 2).fill(NaN);
|
|
1846
|
+
const n = drawn ? drawn.length : obs.count;
|
|
1847
|
+
for (let k = 0; k < n; k++) {
|
|
1848
|
+
const i = drawn ? drawn[k] : k;
|
|
1849
|
+
out[i * 2] = obs.x[i] * sx + tx;
|
|
1850
|
+
out[i * 2 + 1] = obs.y[i] * sy + ty;
|
|
1851
|
+
}
|
|
1852
|
+
return out;
|
|
1853
|
+
}
|
|
1854
|
+
/**
|
|
1855
|
+
* What the tooltip says, resolved once per colour source rather than per hover.
|
|
1856
|
+
*
|
|
1857
|
+
* Fetched separately from the colouring on purpose: the reference port caches
|
|
1858
|
+
* columns, but a host's need not, and re-fetching a 3.7M-element vector because
|
|
1859
|
+
* the pointer moved would be indefensible either way.
|
|
1860
|
+
*/
|
|
1861
|
+
async resolveHoverSource(dataset, view) {
|
|
1862
|
+
const port = this.spatialData;
|
|
1863
|
+
const colorBy = view.colorBy;
|
|
1864
|
+
const key = dataset && colorBy
|
|
1865
|
+
? `${dataset.id}|${colorBy.kind}:${colorBy.name}`
|
|
1866
|
+
: null;
|
|
1867
|
+
if (key === this.hoverSourceKey)
|
|
1868
|
+
return;
|
|
1869
|
+
// The key is committed only where a value is actually stored. Setting it up
|
|
1870
|
+
// front would mean a resolution that loses the race leaves the key claiming a
|
|
1871
|
+
// source that was never stored — and since every later emission carries the
|
|
1872
|
+
// same key, it would short-circuit here forever and the tooltip would stay
|
|
1873
|
+
// silent for the rest of the session.
|
|
1874
|
+
const token = ++this.hoverSourceToken;
|
|
1875
|
+
// No colour source means nothing is being said about the cells, so there is no
|
|
1876
|
+
// cluster to name and the tooltip stays silent.
|
|
1877
|
+
if (!key || !dataset || !colorBy || !port) {
|
|
1878
|
+
this.hoverSource = null;
|
|
1879
|
+
this.hoverSourceKey = key;
|
|
1880
|
+
return;
|
|
1881
|
+
}
|
|
1882
|
+
try {
|
|
1883
|
+
if (colorBy.kind === 'column') {
|
|
1884
|
+
const column = await port.getColumn(colorBy.name);
|
|
1885
|
+
if (token !== this.hoverSourceToken)
|
|
1886
|
+
return;
|
|
1887
|
+
this.hoverSource = isCategoricalColumn(column)
|
|
1888
|
+
? {
|
|
1889
|
+
kind: 'categorical',
|
|
1890
|
+
name: colorBy.name,
|
|
1891
|
+
categories: column.meta.categories,
|
|
1892
|
+
codes: column.codes,
|
|
1893
|
+
}
|
|
1894
|
+
: {
|
|
1895
|
+
kind: 'continuous',
|
|
1896
|
+
name: colorBy.name,
|
|
1897
|
+
values: column.values,
|
|
1898
|
+
...(column.meta.unit ? { unit: column.meta.unit } : {}),
|
|
1899
|
+
};
|
|
1900
|
+
this.hoverSourceKey = key;
|
|
1901
|
+
return;
|
|
1902
|
+
}
|
|
1903
|
+
const values = await port.getFeatureVector(colorBy.name);
|
|
1904
|
+
if (token !== this.hoverSourceToken)
|
|
1905
|
+
return;
|
|
1906
|
+
this.hoverSource = {
|
|
1907
|
+
kind: 'continuous',
|
|
1908
|
+
name: colorBy.name,
|
|
1909
|
+
values,
|
|
1910
|
+
...(dataset.features?.unit ? { unit: dataset.features.unit } : {}),
|
|
1911
|
+
};
|
|
1912
|
+
this.hoverSourceKey = key;
|
|
1913
|
+
}
|
|
1914
|
+
catch {
|
|
1915
|
+
if (token !== this.hoverSourceToken)
|
|
1916
|
+
return;
|
|
1917
|
+
// The tooltip is an extra; a failed fetch must not disturb the render. The
|
|
1918
|
+
// key is left unset so a later emission retries rather than inheriting a
|
|
1919
|
+
// permanent silence.
|
|
1920
|
+
this.hoverSource = null;
|
|
1921
|
+
this.hoverSourceKey = null;
|
|
1922
|
+
}
|
|
1923
|
+
}
|
|
1924
|
+
/**
|
|
1925
|
+
* Project every observation to canvas pixels under the current 3D camera.
|
|
1926
|
+
*
|
|
1927
|
+
* The projection itself is the renderer's: `viewer.projectPoints` owns the camera, the
|
|
1928
|
+
* viewport in CSS pixels, the perspective divide and the y-flip. This used to be fifteen
|
|
1929
|
+
* lines of column-major matrix arithmetic here, duplicating a second copy in
|
|
1930
|
+
* `napari-axes-labels` — and the two had drifted on what to do with a NaN w.
|
|
1931
|
+
*
|
|
1932
|
+
* What is left is the part that is genuinely this adapter's: SCATTERING the drawn subset
|
|
1933
|
+
* back into observation order. The cloud holds only the points of the displayed section,
|
|
1934
|
+
* in its own packing; every consumer indexes by observation. NaN stands for "not on
|
|
1935
|
+
* screen", which is also the right answer for an observation whose section is hidden.
|
|
1936
|
+
*
|
|
1937
|
+
* Null when the 3D cloud is not mounted, so the caller falls back to the 2D affine path.
|
|
1938
|
+
*/
|
|
1939
|
+
getSpatialScreenProjection(obs) {
|
|
1940
|
+
const viewer = this.viewer;
|
|
1941
|
+
if (!viewer || !this.spatialPositions3d)
|
|
1942
|
+
return null;
|
|
1943
|
+
const projected = viewer.projectPoints(this.spatialPositions3d, this.spatialProjection3d);
|
|
1944
|
+
if (!projected)
|
|
1945
|
+
return null;
|
|
1946
|
+
// Reused across camera changes: at 3.7M observations this is a 30 MB allocation that
|
|
1947
|
+
// would otherwise happen on every orbit.
|
|
1948
|
+
this.spatialProjection3d = projected;
|
|
1949
|
+
const drawn = this.spatialDrawn3d;
|
|
1950
|
+
const { screen, depth } = projected;
|
|
1951
|
+
const count = screen.length >> 1;
|
|
1952
|
+
const out = new Float32Array(obs.count * 2).fill(NaN);
|
|
1953
|
+
const depths = new Float32Array(obs.count).fill(NaN);
|
|
1954
|
+
for (let k = 0; k < count; k++) {
|
|
1955
|
+
const i = drawn ? drawn[k] : k;
|
|
1956
|
+
if (i >= obs.count)
|
|
1957
|
+
continue;
|
|
1958
|
+
out[i * 2] = screen[k * 2];
|
|
1959
|
+
out[i * 2 + 1] = screen[k * 2 + 1];
|
|
1960
|
+
depths[i] = depth[k];
|
|
1961
|
+
}
|
|
1962
|
+
// Kept beside the screen positions so the hover pick can prefer the FRONT-most point
|
|
1963
|
+
// under the cursor rather than the one nearest its centre — which in a dense cloud is
|
|
1964
|
+
// regularly something the renderer drew another point over.
|
|
1965
|
+
this.spatialDepths3d = depths;
|
|
1966
|
+
return out;
|
|
1967
|
+
}
|
|
1968
|
+
/** Rebuild the markers on any dataset or view-state change. */
|
|
1969
|
+
subscribeSpatial() {
|
|
1970
|
+
this.spatialSub?.unsubscribe();
|
|
1971
|
+
const port = this.spatialData;
|
|
1972
|
+
if (!port)
|
|
1973
|
+
return;
|
|
1974
|
+
const selection$ = this.selectionStore?.getSelection$() ?? of(emptySelection());
|
|
1975
|
+
// The display colormap is an input here, not just something read at build
|
|
1976
|
+
// time: `continuousColormap: null` means "follow the image's colormap", and a
|
|
1977
|
+
// setting that only takes effect at the next unrelated rebuild is not one.
|
|
1978
|
+
this.spatialSub = combineLatest([
|
|
1979
|
+
port.getDataset$(), this.store.getSpatialView$(), selection$,
|
|
1980
|
+
this.store.getColormap(), this.store.getReverseScale(),
|
|
1981
|
+
]).subscribe(([dataset, view, selection, colormap, reverse]) => {
|
|
1982
|
+
this.currentColormap = colormap ?? null;
|
|
1983
|
+
this.currentReverse = !!reverse;
|
|
1984
|
+
// Kept so a slice change can redraw the markers for the new plane, which
|
|
1985
|
+
// arrives through setZIndex rather than through any of these streams.
|
|
1986
|
+
this.spatialLatest = [dataset, view, selection];
|
|
1987
|
+
// The markers are about to move or change meaning, so both halves of the
|
|
1988
|
+
// tooltip — where the points are, and what they are — are stale.
|
|
1989
|
+
this.spatialSceneRev++;
|
|
1990
|
+
void this.resolveHoverSource(dataset, view);
|
|
1991
|
+
void (isSpatialOmics3d(this.currentPlotType)
|
|
1992
|
+
? this.rebuildSpatialPoints3d(dataset, view, selection)
|
|
1993
|
+
: this.rebuildSpatialPoints(dataset, view, selection));
|
|
1994
|
+
});
|
|
1995
|
+
}
|
|
1996
|
+
/** (Re)build the observation marker layer for the current dataset + view state. */
|
|
1997
|
+
async rebuildSpatialPoints(dataset, view, selection = emptySelection()) {
|
|
1998
|
+
const viewer = this.viewer;
|
|
1999
|
+
if (!viewer)
|
|
2000
|
+
return;
|
|
2001
|
+
const token = ++this.spatialRebuildToken;
|
|
2002
|
+
// Resolve colours BEFORE touching the scene: a gene fetch can fail or be
|
|
2003
|
+
// superseded, and dropping the existing layer first would blank the view.
|
|
2004
|
+
let faceColor;
|
|
2005
|
+
try {
|
|
2006
|
+
faceColor = dataset
|
|
2007
|
+
? await this.spatialFaceColors(dataset, view, selection)
|
|
2008
|
+
: NapariVisualizerService.SPATIAL_NEUTRAL_COLOR;
|
|
2009
|
+
}
|
|
2010
|
+
catch (err) {
|
|
2011
|
+
console.warn('[napari-js] spatial colouring failed — falling back to a flat colour', err);
|
|
2012
|
+
faceColor = NapariVisualizerService.SPATIAL_NEUTRAL_COLOR;
|
|
2013
|
+
}
|
|
2014
|
+
// A newer rebuild (or a teardown) started while the vector was in flight.
|
|
2015
|
+
if (token !== this.spatialRebuildToken || this.viewer !== viewer)
|
|
2016
|
+
return;
|
|
2017
|
+
if (!dataset || dataset.observations.count === 0) {
|
|
2018
|
+
if (this.spatialPoints) {
|
|
2019
|
+
viewer.layers.remove(this.spatialPoints);
|
|
2020
|
+
this.spatialPoints = null;
|
|
2021
|
+
this.spatialLayerKey = null;
|
|
2022
|
+
}
|
|
2023
|
+
if (this.geneMapLayer) {
|
|
2024
|
+
viewer.layers.remove(this.geneMapLayer);
|
|
2025
|
+
this.geneMapLayer = null;
|
|
2026
|
+
this.geneMapKey = null;
|
|
2027
|
+
}
|
|
2028
|
+
return;
|
|
2029
|
+
}
|
|
2030
|
+
const obs = dataset.observations;
|
|
2031
|
+
// A dataset whose image IS its volume shows ONE PLANE at a time, so the
|
|
2032
|
+
// markers are the observations in the displayed plane, drawn in that plane's
|
|
2033
|
+
// pixel grid. Without the filter the specimen's whole depth piles onto one
|
|
2034
|
+
// section and reads as a smear; without the affine the coordinates are read
|
|
2035
|
+
// as pixels and land off the slice entirely.
|
|
2036
|
+
const slab = this.spatialSlab(dataset);
|
|
2037
|
+
// The gene map goes UNDER the cells, so it is settled before they are added.
|
|
2038
|
+
await this.ensureGeneMap(viewer, dataset, view, selection, slab);
|
|
2039
|
+
if (token !== this.spatialRebuildToken || this.viewer !== viewer)
|
|
2040
|
+
return;
|
|
2041
|
+
const ref = slab?.ref ?? dataset.imageRef;
|
|
2042
|
+
const base = markerDiameters(obs, NapariVisualizerService.SPATIAL_FALLBACK_RADIUS);
|
|
2043
|
+
const scale = view.pointScale > 0 ? view.pointScale : 1;
|
|
2044
|
+
const floor = slab?.minDiameter ?? 0;
|
|
2045
|
+
const sizeOf = (i) => Math.max(typeof base === 'number' ? base : base[i], floor) * scale;
|
|
2046
|
+
const size = typeof base === 'number' && !slab
|
|
2047
|
+
? Math.max(base, floor) * scale
|
|
2048
|
+
: Float32Array.from(slab?.indices ?? { length: obs.count }, (_v, i) => sizeOf(slab ? slab.indices[i] : i));
|
|
2049
|
+
// napari's image view CLEARS the whole layer list on every render, so the
|
|
2050
|
+
// markers go with it whenever the image is re-rendered — a scrub, a contrast
|
|
2051
|
+
// change. The cached handle is then detached, and mutating it draws nothing:
|
|
2052
|
+
// treat a layer that is no longer in the scene as absent so it gets re-added.
|
|
2053
|
+
if (this.spatialPoints && !viewer.layers.items.includes(this.spatialPoints)) {
|
|
2054
|
+
this.spatialPoints = null;
|
|
2055
|
+
this.spatialLayerKey = null;
|
|
2056
|
+
}
|
|
2057
|
+
// A size/colour/opacity/selection change is DISPLAY-only: mutate the layer
|
|
2058
|
+
// rather than dropping and re-adding it. Both setters bump the layer's
|
|
2059
|
+
// dataVersion, which is what makes napari-js rebuild the instance buffer and
|
|
2060
|
+
// redraw — and it avoids rebuilding 84k positions to change one number.
|
|
2061
|
+
// The slice is part of the key: a scrub changes WHICH observations are drawn,
|
|
2062
|
+
// which is geometry, not display.
|
|
2063
|
+
const key = `${dataset.id}:${obs.count}:${slab?.slice ?? ''}`;
|
|
2064
|
+
if (this.spatialPoints && key === this.spatialLayerKey) {
|
|
2065
|
+
this.spatialPoints.size = size;
|
|
2066
|
+
this.spatialPoints.faceColor = this.gatherColors(faceColor, slab?.indices);
|
|
2067
|
+
viewer.requestRender();
|
|
2068
|
+
return;
|
|
2069
|
+
}
|
|
2070
|
+
if (this.spatialPoints) {
|
|
2071
|
+
viewer.layers.remove(this.spatialPoints);
|
|
2072
|
+
this.spatialPoints = null;
|
|
2073
|
+
}
|
|
2074
|
+
const drawn = slab?.indices;
|
|
2075
|
+
const count = drawn ? drawn.length : obs.count;
|
|
2076
|
+
const positions = new Float32Array(count * 2);
|
|
2077
|
+
for (let i = 0; i < count; i++) {
|
|
2078
|
+
const o = drawn ? drawn[i] : i;
|
|
2079
|
+
positions[i * 2] = obs.x[o];
|
|
2080
|
+
positions[i * 2 + 1] = obs.y[o];
|
|
2081
|
+
}
|
|
2082
|
+
this.spatialLayerKey = key;
|
|
2083
|
+
this.spatialPoints = viewer.addPoints(positions, {
|
|
2084
|
+
name: 'observations',
|
|
2085
|
+
size,
|
|
2086
|
+
faceColor: this.gatherColors(faceColor, drawn),
|
|
2087
|
+
// No border: at Visium spot density an outline per marker reads as noise,
|
|
2088
|
+
// and it costs a second colour array.
|
|
2089
|
+
borderWidth: 0,
|
|
2090
|
+
// The dataset's data->world affine. SpatialData records one per coordinate
|
|
2091
|
+
// system (Visium spot coords are in the FULL-resolution frame while the
|
|
2092
|
+
// served image may be the hires downscale), so without this the markers
|
|
2093
|
+
// land in the right shape at the wrong scale. Defaults to identity when
|
|
2094
|
+
// the coordinates are already in the image's pixel space.
|
|
2095
|
+
scale: ref?.scale ?? [1, 1],
|
|
2096
|
+
translate: ref?.translate ?? [0, 0],
|
|
2097
|
+
});
|
|
2098
|
+
this.frameSpatialPointsOnce(viewer, dataset.id, positions, !!ref);
|
|
2099
|
+
this.hideForeignImage(viewer, !!ref || !!dataset.volume);
|
|
2100
|
+
this.setRegionGridFor(dataset, positions);
|
|
2101
|
+
}
|
|
2102
|
+
/**
|
|
2103
|
+
* Tell the region overlay how finely a drawn vertex may be placed.
|
|
2104
|
+
*
|
|
2105
|
+
* Region geometry is stored in whole world units, which is right when the world IS
|
|
2106
|
+
* pixels — a region should align to them. It is wrong for a dataset that registers onto
|
|
2107
|
+
* no image: seqFISH's observations span about 5 x 7 units in total, so whole-unit
|
|
2108
|
+
* vertices leave roughly six by eight placeable positions across the entire sample and
|
|
2109
|
+
* an ROI cannot be drawn at any zoom. Nothing errors; the tool just cannot express the
|
|
2110
|
+
* shape.
|
|
2111
|
+
*
|
|
2112
|
+
* Keyed on whether the dataset brings PIXELS rather than on the extent, because the
|
|
2113
|
+
* extent cannot tell the two apart — 2,000 units is a small slide or a large section
|
|
2114
|
+
* depending only on what the units are, and only the dataset knows.
|
|
2115
|
+
*/
|
|
2116
|
+
setRegionGridFor(dataset, positions) {
|
|
2117
|
+
const overlay = this.regionOverlay;
|
|
2118
|
+
if (!overlay?.setWorldQuantum)
|
|
2119
|
+
return;
|
|
2120
|
+
if (dataset.imageRef || dataset.volume) {
|
|
2121
|
+
overlay.setWorldQuantum(PIXEL_WORLD_QUANTUM);
|
|
2122
|
+
return;
|
|
2123
|
+
}
|
|
2124
|
+
let minX = Infinity;
|
|
2125
|
+
let maxX = -Infinity;
|
|
2126
|
+
let minY = Infinity;
|
|
2127
|
+
let maxY = -Infinity;
|
|
2128
|
+
for (let i = 0; i < positions.length; i += 2) {
|
|
2129
|
+
const x = positions[i];
|
|
2130
|
+
const y = positions[i + 1];
|
|
2131
|
+
if (!Number.isFinite(x) || !Number.isFinite(y))
|
|
2132
|
+
continue;
|
|
2133
|
+
if (x < minX)
|
|
2134
|
+
minX = x;
|
|
2135
|
+
if (x > maxX)
|
|
2136
|
+
maxX = x;
|
|
2137
|
+
if (y < minY)
|
|
2138
|
+
minY = y;
|
|
2139
|
+
if (y > maxY)
|
|
2140
|
+
maxY = y;
|
|
2141
|
+
}
|
|
2142
|
+
overlay.setWorldQuantum(worldQuantumForExtent(maxX - minX, maxY - minY));
|
|
2143
|
+
}
|
|
2144
|
+
/**
|
|
2145
|
+
* Frame the 2D camera on the observations, for a dataset that brings no image.
|
|
2146
|
+
*
|
|
2147
|
+
* The 2D camera is normally fitted to the IMAGE, because the observations are in that
|
|
2148
|
+
* image's pixel space and framing the image frames them too. A dataset with no
|
|
2149
|
+
* reference image has coordinates in its own units instead — seqFISH's span about
|
|
2150
|
+
* 5x7 — so the image framing left over from whatever was on screen before puts the
|
|
2151
|
+
* whole cloud offscreen: measured at 9.7 x 13.4 PIXELS, centred 256px from where the
|
|
2152
|
+
* camera was looking. The points are all there and drawn; they are a speck. Which
|
|
2153
|
+
* looks exactly like the dataset having failed to load.
|
|
2154
|
+
*
|
|
2155
|
+
* Once per dataset, as napari-js's `fit3d: 'once'` does for the cloud: re-colouring,
|
|
2156
|
+
* slicing or picking a gene re-adds this layer, and re-framing on those would move
|
|
2157
|
+
* the camera under the user — the camera tools and the canvas drag are meant to be
|
|
2158
|
+
* the only things that do.
|
|
2159
|
+
*/
|
|
2160
|
+
/**
|
|
2161
|
+
* Hide the image layer for a dataset that brings no image of its own.
|
|
2162
|
+
*
|
|
2163
|
+
* The host's viewer keeps whatever image was last loaded, and for a dataset that
|
|
2164
|
+
* registers onto none that picture belongs to something else entirely — the example's
|
|
2165
|
+
* default slide, say. It is not merely irrelevant: the two live in different coordinate
|
|
2166
|
+
* spaces (image pixels against the embedding's own units), so the leftover is magnified
|
|
2167
|
+
* roughly a hundredfold. At the fitted zoom the camera sits inside its corner, where it
|
|
2168
|
+
* reads as blank background, and it appears only once you zoom out far enough to find
|
|
2169
|
+
* it — which is exactly how it gets noticed.
|
|
2170
|
+
*
|
|
2171
|
+
* Hidden rather than removed, and hidden HERE rather than by clearing the host's image
|
|
2172
|
+
* state: that state drives the whole render pipeline, including a Plotly backend whose
|
|
2173
|
+
* fields are declared with definite-assignment assertions, so emptying it throws from
|
|
2174
|
+
* whichever field the next path happens to read. This touches one layer's visibility
|
|
2175
|
+
* and nothing else.
|
|
2176
|
+
*/
|
|
2177
|
+
hideForeignImage(viewer, datasetHasPixels) {
|
|
2178
|
+
for (const layer of viewer.layers.items) {
|
|
2179
|
+
if (layer.kind !== 'image')
|
|
2180
|
+
continue;
|
|
2181
|
+
// Re-shown when a dataset that owns an image comes back, so switching between
|
|
2182
|
+
// datasets does not leave the tissue permanently hidden.
|
|
2183
|
+
layer.visible = datasetHasPixels;
|
|
2184
|
+
}
|
|
2185
|
+
viewer.requestRender();
|
|
2186
|
+
}
|
|
2187
|
+
frameSpatialPointsOnce(viewer, datasetId, positions, registered) {
|
|
2188
|
+
// Gated on whether THIS dataset registers onto an image, not on `imageW`/`imageH`:
|
|
2189
|
+
// those keep the last plotted image's dimensions after the host clears it, so a
|
|
2190
|
+
// stale 512x383 read as "there is an image" and skipped the framing entirely.
|
|
2191
|
+
if (registered)
|
|
2192
|
+
return;
|
|
2193
|
+
// Once per dataset, as napari-js's `fit3d: 'once'` does for the cloud: re-colouring, slicing
|
|
2194
|
+
// or picking a gene re-adds this layer, and re-framing on those would move the
|
|
2195
|
+
// camera under the user — the camera tools and the canvas drag are meant to be the
|
|
2196
|
+
// only things that do.
|
|
2197
|
+
if (this.spatial2dFramed?.viewer === viewer
|
|
2198
|
+
&& this.spatial2dFramed.datasetId === datasetId)
|
|
2199
|
+
return;
|
|
2200
|
+
const fit = framePositions(positions, this.canvas?.clientWidth ?? 0, this.canvas?.clientHeight ?? 0);
|
|
2201
|
+
// Null means there is nothing to frame on; leave the camera where it is rather
|
|
2202
|
+
// than moving the view for a dataset we cannot fit.
|
|
2203
|
+
if (!fit)
|
|
2204
|
+
return;
|
|
2205
|
+
viewer.camera.set(fit.center, fit.zoom ?? viewer.camera.zoom);
|
|
2206
|
+
this.spatial2dFramed = { viewer, datasetId };
|
|
2207
|
+
}
|
|
2208
|
+
/**
|
|
2209
|
+
* The **gene map**: the active gene's expression as a continuous field drawn under
|
|
2210
|
+
* the cells.
|
|
2211
|
+
*
|
|
2212
|
+
* A scatter coloured by a gene says which cells express it; it cannot say where,
|
|
2213
|
+
* because the eye will not integrate thousands of dots into a territory. The field
|
|
2214
|
+
* is a kernel-weighted MEAN per cell (see `spatial-expression.ts`), so a dense
|
|
2215
|
+
* region does not glow merely for being dense, and it is transparent wherever no
|
|
2216
|
+
* cell was measured — an unsampled gap must not read as "not expressed".
|
|
2217
|
+
*
|
|
2218
|
+
* It shares the points' LUT, percentile window and log flag, so the layer under
|
|
2219
|
+
* the cells and the cells themselves cannot disagree about what a colour means.
|
|
2220
|
+
*
|
|
2221
|
+
* Estimated on the DISPLAYED image's pixel grid, coarsened so the long side is at
|
|
2222
|
+
* most {@link GENE_MAP_MAX_SIDE}: a smooth field gains nothing from a slide's full
|
|
2223
|
+
* resolution. For a volume-backed dataset that grid is the current slice, and only
|
|
2224
|
+
* that plane's observations are included — the same rule the markers follow.
|
|
2225
|
+
*/
|
|
2226
|
+
async ensureGeneMap(viewer, dataset, view, selection, slab) {
|
|
2227
|
+
const gene = view.geneMap && view.colorBy?.kind === 'feature' ? view.colorBy.name : null;
|
|
2228
|
+
const port = this.spatialData;
|
|
2229
|
+
const smoothing = view.geneMapSmoothing > 0 ? view.geneMapSmoothing : 1;
|
|
2230
|
+
const clip = view.percentileClip ?? [0.01, 0.99];
|
|
2231
|
+
// Two clocks: the FIELD depends on the gene, the plane and the bandwidth, while
|
|
2232
|
+
// the colours depend on the window, the log flag and the opacity. Recolouring a
|
|
2233
|
+
// cached field is a fraction of estimating one.
|
|
2234
|
+
const fieldKey = gene
|
|
2235
|
+
? [dataset.id, gene, slab?.slice ?? '', smoothing, this.selectionRev(selection)].join('|')
|
|
2236
|
+
: null;
|
|
2237
|
+
const key = fieldKey
|
|
2238
|
+
? [
|
|
2239
|
+
fieldKey, clip.join(','), view.logScale ? 'log' : 'lin', view.geneMapOpacity,
|
|
2240
|
+
this.continuousColormapKey(view),
|
|
2241
|
+
].join('|')
|
|
2242
|
+
: null;
|
|
2243
|
+
if (key === this.geneMapKey)
|
|
2244
|
+
return;
|
|
2245
|
+
if (this.geneMapLayer) {
|
|
2246
|
+
viewer.layers.remove(this.geneMapLayer);
|
|
2247
|
+
this.geneMapLayer = null;
|
|
2248
|
+
}
|
|
2249
|
+
// ANY change here changes the order the cells have to sit above — including the
|
|
2250
|
+
// first one, where there is no previous layer to remove — and the layer list is
|
|
2251
|
+
// append-only. So drop the markers unconditionally and let the rebuild below put
|
|
2252
|
+
// them back on top; otherwise the field is appended over the measurement.
|
|
2253
|
+
if (this.spatialPoints) {
|
|
2254
|
+
viewer.layers.remove(this.spatialPoints);
|
|
2255
|
+
this.spatialPoints = null;
|
|
2256
|
+
this.spatialLayerKey = null;
|
|
2257
|
+
}
|
|
2258
|
+
this.geneMapKey = key;
|
|
2259
|
+
if (!key || !gene || !port) {
|
|
2260
|
+
this.geneMapField = null;
|
|
2261
|
+
this.geneMapFieldKey = null;
|
|
2262
|
+
return;
|
|
2263
|
+
}
|
|
2264
|
+
// The raster covers the displayed image; without one there is nothing to
|
|
2265
|
+
// overlay and the cloud is the 3D mode's business, not this one's.
|
|
2266
|
+
const imageW = slab ? dataset.volume.width : this.imageW;
|
|
2267
|
+
const imageH = slab ? dataset.volume.height : this.imageH;
|
|
2268
|
+
if (!imageW || !imageH)
|
|
2269
|
+
return;
|
|
2270
|
+
const step = Math.max(1, Math.ceil(Math.max(imageW, imageH) / NapariVisualizerService.GENE_MAP_MAX_SIDE));
|
|
2271
|
+
if (fieldKey !== this.geneMapFieldKey) {
|
|
2272
|
+
let values;
|
|
2273
|
+
try {
|
|
2274
|
+
values = await port.getFeatureVector(gene);
|
|
2275
|
+
}
|
|
2276
|
+
catch (err) {
|
|
2277
|
+
console.warn(`[napari-js] gene map: "${gene}" unavailable`, err);
|
|
2278
|
+
this.geneMapKey = null;
|
|
2279
|
+
return;
|
|
2280
|
+
}
|
|
2281
|
+
if (this.viewer !== viewer || this.geneMapKey !== key)
|
|
2282
|
+
return;
|
|
2283
|
+
const inSelection = selection.count > 0 ? maskToIndices(selection.mask) : undefined;
|
|
2284
|
+
this.geneMapField = expressionField(dataset.observations, {
|
|
2285
|
+
ref: slab?.ref ?? dataset.imageRef,
|
|
2286
|
+
width: Math.ceil(imageW / step),
|
|
2287
|
+
height: Math.ceil(imageH / step),
|
|
2288
|
+
step,
|
|
2289
|
+
sigma: NapariVisualizerService.GENE_MAP_SIGMA * smoothing,
|
|
2290
|
+
values,
|
|
2291
|
+
// A plane wins over a selection: the 2D view is showing one section, so a
|
|
2292
|
+
// field spanning the specimen's depth would not be the thing on screen.
|
|
2293
|
+
indices: slab?.indices ?? inSelection,
|
|
2294
|
+
});
|
|
2295
|
+
this.geneMapFieldKey = fieldKey;
|
|
2296
|
+
}
|
|
2297
|
+
const field = this.geneMapField;
|
|
2298
|
+
if (!field)
|
|
2299
|
+
return;
|
|
2300
|
+
const node = this.currentColormap;
|
|
2301
|
+
const lut = spatialContinuousLut(node?.data?.value, this.currentReverse, view.continuousColormap);
|
|
2302
|
+
const [lo, hi] = contrastWindow(field.mean, clip[0], clip[1]);
|
|
2303
|
+
const rgba = colorExpressionField(field, lut, [lo, hi], {
|
|
2304
|
+
log: view.logScale,
|
|
2305
|
+
// The MAP's own opacity: reading a field under the cells means turning the
|
|
2306
|
+
// cells down, which must not take the field with them.
|
|
2307
|
+
opacity: view.geneMapOpacity,
|
|
2308
|
+
});
|
|
2309
|
+
this.geneMapLayer = viewer.addImage({ kind: 'typed', width: field.width, height: field.height, channels: 4, dtype: 'uint8', data: rgba }, {
|
|
2310
|
+
name: `gene map · ${gene}`,
|
|
2311
|
+
scale: [step, step],
|
|
2312
|
+
translate: [0, 0],
|
|
2313
|
+
blending: 'translucent',
|
|
2314
|
+
});
|
|
2315
|
+
viewer.requestRender();
|
|
2316
|
+
}
|
|
2317
|
+
/**
|
|
2318
|
+
* The plane a volume-backed dataset is currently showing: its pixel affine, the
|
|
2319
|
+
* observations that fall in it, and the marker floor that grid needs.
|
|
2320
|
+
*
|
|
2321
|
+
* Null for a dataset with a real `imageRef` (its coordinates are already the
|
|
2322
|
+
* image's pixels and every observation belongs to the one section) and for one
|
|
2323
|
+
* with no volume at all — both of which draw exactly as before.
|
|
2324
|
+
*/
|
|
2325
|
+
spatialSlab(dataset) {
|
|
2326
|
+
const volume = dataset.volume;
|
|
2327
|
+
if (dataset.imageRef || !volume)
|
|
2328
|
+
return null;
|
|
2329
|
+
const slice = this.loaded?.z ?? 0;
|
|
2330
|
+
return {
|
|
2331
|
+
ref: volumeImageRef(volume, dataset.micronsPerUnit),
|
|
2332
|
+
indices: observationsInSlice(dataset.observations, volume, slice),
|
|
2333
|
+
slice,
|
|
2334
|
+
minDiameter: NapariVisualizerService.SPATIAL_SLICE_MIN_DIAMETER_PX * volume.voxelSize[0],
|
|
2335
|
+
};
|
|
2336
|
+
}
|
|
2337
|
+
/** Per-point colours for the drawn subset. A broadcast tuple stays broadcast —
|
|
2338
|
+
* it is one colour for every point either way. */
|
|
2339
|
+
gatherColors(colors, indices) {
|
|
2340
|
+
if (!indices || !Array.isArray(colors))
|
|
2341
|
+
return colors;
|
|
2342
|
+
const out = new Array(indices.length);
|
|
2343
|
+
for (let i = 0; i < indices.length; i++)
|
|
2344
|
+
out[i] = colors[indices[i]];
|
|
2345
|
+
return out;
|
|
2346
|
+
}
|
|
2347
|
+
/**
|
|
2348
|
+
* Redraw the observation markers over a freshly rendered image.
|
|
2349
|
+
*
|
|
2350
|
+
* Two reasons, both invisible from the spatial store — which is why a scrub or a
|
|
2351
|
+
* re-render never reached the markers on its own:
|
|
2352
|
+
* - the image render CLEARS the layer list, taking the markers with it;
|
|
2353
|
+
* - over a volume-backed dataset the displayed plane decides which
|
|
2354
|
+
* observations belong on screen at all, so the cells have to move with the
|
|
2355
|
+
* section rather than hang over a different one.
|
|
2356
|
+
*
|
|
2357
|
+
* Uses the latest values the marker subscription saw; a no-op until it has seen
|
|
2358
|
+
* any, in the 3D cloud (no image, no plane), and with no dataset to draw.
|
|
2359
|
+
*/
|
|
2360
|
+
redrawSpatialMarkers() {
|
|
2361
|
+
const latest = this.spatialLatest;
|
|
2362
|
+
if (!latest?.[0] || isSpatialOmics3d(this.currentPlotType))
|
|
2363
|
+
return;
|
|
2364
|
+
void this.rebuildSpatialPoints(...latest);
|
|
2365
|
+
}
|
|
2366
|
+
/**
|
|
2367
|
+
* Mount the SPATIAL_OMICS_3D view: observations as a 3D point cloud under the orbit camera.
|
|
2368
|
+
*
|
|
2369
|
+
* Deliberately much thinner than the 2D mount. There is no tissue image to render (a registered
|
|
2370
|
+
* volume like the Allen CCF has no single reference plane), so no scale bar, no readback, and no
|
|
2371
|
+
* 2D interaction stack — the region tools draw in screen space and have no meaning against an
|
|
2372
|
+
* orbiting camera, which is why `Select from ROIs` is hidden in this mode. `addPoints3D` puts
|
|
2373
|
+
* the viewer in 3D and frames the camera on the cloud itself.
|
|
2374
|
+
*/
|
|
2375
|
+
async mountSpatialOmics3d(viewer, host) {
|
|
2376
|
+
this.install3dInteraction(viewer, host);
|
|
2377
|
+
this.installSpatialHover(host);
|
|
2378
|
+
this.subscribeSpatial();
|
|
2379
|
+
}
|
|
2380
|
+
/**
|
|
2381
|
+
* Scale bar for the 3D cloud, measured at the ORBIT PIVOT.
|
|
2382
|
+
*
|
|
2383
|
+
* A perspective camera has no single scale — things farther away are smaller — so a bar can
|
|
2384
|
+
* only be true at one depth. The pivot is the honest choice: it is what the camera is framing,
|
|
2385
|
+
* what a zoom moves towards, and where the eye is anyway. napari's own 3D scale bar works the
|
|
2386
|
+
* same way.
|
|
2387
|
+
*
|
|
2388
|
+
* `NapariScaleBar` needs CSS px per world unit, which an orbit camera does not expose, but at
|
|
2389
|
+
* the pivot it is exactly `viewportHeight / (2 * distance * tan(fov / 2))` — the same
|
|
2390
|
+
* relationship `Camera3D.pan` uses to track the cursor. The bar then converts through
|
|
2391
|
+
* `micronsPerUnit`, and draws nothing at all when the dataset does not declare one, because a
|
|
2392
|
+
* bar labelled in microns over unknown units would read as a measurement.
|
|
2393
|
+
*/
|
|
2394
|
+
installSpatial3dScaleBar(viewer, dataset) {
|
|
2395
|
+
this.scaleBar?.destroy();
|
|
2396
|
+
this.scaleBar = null;
|
|
2397
|
+
const micronsPerUnit = dataset?.micronsPerUnit;
|
|
2398
|
+
if (!this.host || !micronsPerUnit || micronsPerUnit <= 0)
|
|
2399
|
+
return;
|
|
2400
|
+
const canvas = this.canvas;
|
|
2401
|
+
const cam = viewer.camera3d;
|
|
2402
|
+
const shim = {
|
|
2403
|
+
get zoom() {
|
|
2404
|
+
const h = canvas?.clientHeight || canvas?.height || 0;
|
|
2405
|
+
const worldPerPx = (2 * cam.distance * Math.tan(cam.fov / 2)) / (h || 1);
|
|
2406
|
+
return worldPerPx > 0 ? 1 / worldPerPx : 0;
|
|
2407
|
+
},
|
|
2408
|
+
changed: cam.changed,
|
|
2409
|
+
};
|
|
2410
|
+
this.scaleBar = new NapariScaleBar(this.host, shim, micronsPerUnit);
|
|
2411
|
+
}
|
|
2412
|
+
/** Base marker diameter for the 3D cloud, in SCREEN pixels (the layer's unit). */
|
|
2413
|
+
static { this.SPATIAL_3D_BASE_SIZE = 3; }
|
|
2414
|
+
/** (Re)build the 3D point cloud for the current dataset + view state. */
|
|
2415
|
+
async rebuildSpatialPoints3d(dataset, view, selection = emptySelection()) {
|
|
2416
|
+
const viewer = this.viewer;
|
|
2417
|
+
if (!viewer)
|
|
2418
|
+
return;
|
|
2419
|
+
const token = ++this.spatialRebuildToken;
|
|
2420
|
+
// Resolve the scalar encoding BEFORE touching the scene, for the same reason
|
|
2421
|
+
// the 2D path does: a gene fetch can fail or be superseded, and dropping the
|
|
2422
|
+
// layer first would blank the view.
|
|
2423
|
+
let enc = null;
|
|
2424
|
+
if (dataset) {
|
|
2425
|
+
try {
|
|
2426
|
+
enc = await this.spatialScalar3d(dataset, view);
|
|
2427
|
+
}
|
|
2428
|
+
catch (err) {
|
|
2429
|
+
console.warn('[napari-js] spatial 3D colouring failed — falling back to a flat colour', err);
|
|
2430
|
+
enc = null;
|
|
2431
|
+
}
|
|
2432
|
+
}
|
|
2433
|
+
if (token !== this.spatialRebuildToken || this.viewer !== viewer)
|
|
2434
|
+
return;
|
|
2435
|
+
const obs = dataset?.observations;
|
|
2436
|
+
// No z means nothing to draw in 3D. The plot type is gated on `requiresSpatial3d`
|
|
2437
|
+
// so this should be unreachable from the UI, but a host can set the type directly.
|
|
2438
|
+
if (!dataset || !obs || obs.count === 0 || !obs.z) {
|
|
2439
|
+
this.removeSpatial3dLayers(viewer);
|
|
2440
|
+
return;
|
|
2441
|
+
}
|
|
2442
|
+
// Anatomy first: on a scene's FIRST layer napari frames the orbit camera, and
|
|
2443
|
+
// the reference volume is the framing we want — the brain, not the outermost
|
|
2444
|
+
// stray segmentation. Every later add keeps the pose instead (napari-js `fit3d: 'once'`).
|
|
2445
|
+
await this.ensureSpatialVolume(viewer, dataset, view);
|
|
2446
|
+
if (token !== this.spatialRebuildToken || this.viewer !== viewer)
|
|
2447
|
+
return;
|
|
2448
|
+
// Then the cluster density volumes, which can set the centring offset when
|
|
2449
|
+
// there is no reference volume — so before any position is computed from it.
|
|
2450
|
+
await this.ensureDensityVolumes(viewer, dataset, view, selection);
|
|
2451
|
+
if (token !== this.spatialRebuildToken || this.viewer !== viewer)
|
|
2452
|
+
return;
|
|
2453
|
+
// Then the gene map, which shares the reference volume's lattice — so it goes
|
|
2454
|
+
// after anything that can still move the centring offset.
|
|
2455
|
+
await this.ensureGeneMapVolume(viewer, dataset, view, selection);
|
|
2456
|
+
if (token !== this.spatialRebuildToken || this.viewer !== viewer)
|
|
2457
|
+
return;
|
|
2458
|
+
// Scale depends on the dataset's declared unit, so it waits for the dataset
|
|
2459
|
+
// rather than being set up at mount time.
|
|
2460
|
+
if (dataset.id !== this.spatialScaleBarKey) {
|
|
2461
|
+
this.spatialScaleBarKey = dataset.id;
|
|
2462
|
+
this.installSpatial3dScaleBar(viewer, dataset);
|
|
2463
|
+
}
|
|
2464
|
+
// The reference volume is hidden, not removed: it also fixes the centring
|
|
2465
|
+
// offset every position is computed from, and re-fetching a 100 MB template
|
|
2466
|
+
// to un-hide it would make a checkbox feel like a load.
|
|
2467
|
+
if (this.spatialVolume) {
|
|
2468
|
+
this.spatialVolume.visible = view.showVolume;
|
|
2469
|
+
this.spatialVolume.opacity = view.volumeOpacity;
|
|
2470
|
+
}
|
|
2471
|
+
const scale = view.pointScale > 0 ? view.pointScale : 1;
|
|
2472
|
+
const size = NapariVisualizerService.SPATIAL_3D_BASE_SIZE * scale;
|
|
2473
|
+
const scalars = enc?.values ?? new Float32Array(obs.count);
|
|
2474
|
+
const colormap = enc?.colormap ?? this.spatialFlatColormap();
|
|
2475
|
+
const contrastLimits = enc?.contrastLimits ?? [0, 1];
|
|
2476
|
+
// One imaged section, or the whole stack. The subset IS the geometry, so it
|
|
2477
|
+
// belongs in the geometry key rather than being re-derived per frame — and an
|
|
2478
|
+
// out-of-range index is clamped rather than dropping the cloud, because the
|
|
2479
|
+
// section count changes with the dataset while the view state persists.
|
|
2480
|
+
const sections = sectionsOf(obs);
|
|
2481
|
+
const section = view.pointSection != null && sections && sections.length > 0
|
|
2482
|
+
? sections[Math.max(0, Math.min(sections.length - 1, view.pointSection))]
|
|
2483
|
+
: null;
|
|
2484
|
+
const shown = section != null ? observationsInSection(obs, section) : null;
|
|
2485
|
+
const shownCount = shown ? shown.length : obs.count;
|
|
2486
|
+
const key = `${dataset.id}:${obs.count}:${section ?? 'all'}`;
|
|
2487
|
+
// `Points3DLayer.values` is readonly and the layer exposes no dataVersion to
|
|
2488
|
+
// bump, so unlike the 2D path a change of colour SOURCE cannot be mutated in
|
|
2489
|
+
// — the layer has to be rebuilt. Only the size/opacity/colormap knobs are
|
|
2490
|
+
// genuinely display-only. So track the scalars' identity separately from the
|
|
2491
|
+
// geometry's: `colorBy` plus the transforms feeding the encoding.
|
|
2492
|
+
const clip = view.percentileClip ?? [0.01, 0.99];
|
|
2493
|
+
const scalarKey = [
|
|
2494
|
+
key,
|
|
2495
|
+
view.colorBy ? `${view.colorBy.kind}:${view.colorBy.name}` : 'flat',
|
|
2496
|
+
view.logScale ? 'log' : 'lin',
|
|
2497
|
+
clip.join(','),
|
|
2498
|
+
].join('|');
|
|
2499
|
+
if (key !== this.spatialLayerKey3d) {
|
|
2500
|
+
// New geometry: interleave x,y,z (the layer's documented layout, x-fastest)
|
|
2501
|
+
// and cache it, so later colour changes rebuild the layer without walking
|
|
2502
|
+
// the observations again.
|
|
2503
|
+
const [ox, oy, oz] = this.spatialOrigin3d;
|
|
2504
|
+
const positions = new Float32Array(shownCount * 3);
|
|
2505
|
+
for (let k = 0; k < shownCount; k++) {
|
|
2506
|
+
const i = shown ? shown[k] : k;
|
|
2507
|
+
positions[k * 3] = obs.x[i] + ox;
|
|
2508
|
+
positions[k * 3 + 1] = obs.y[i] + oy;
|
|
2509
|
+
positions[k * 3 + 2] = obs.z[i] + oz;
|
|
2510
|
+
}
|
|
2511
|
+
this.spatialPositions3d = positions;
|
|
2512
|
+
this.spatialDrawn3d = shown;
|
|
2513
|
+
}
|
|
2514
|
+
// The scalars have to follow the geometry: a per-observation vector against one
|
|
2515
|
+
// section's positions would colour each cell by a stranger's value.
|
|
2516
|
+
const valuesFor = () => (shown ? Float32Array.from(shown, (i) => scalars[i]) : scalars);
|
|
2517
|
+
if (!this.spatialPoints3d || key !== this.spatialLayerKey3d) {
|
|
2518
|
+
// New GEOMETRY — a different dataset, or a different section — so a new layer.
|
|
2519
|
+
if (this.spatialPoints3d)
|
|
2520
|
+
viewer.layers.remove(this.spatialPoints3d);
|
|
2521
|
+
this.spatialLayerKey3d = key;
|
|
2522
|
+
this.spatialScalarKey3d = scalarKey;
|
|
2523
|
+
this.spatialPoints3d = viewer.addPoints3D(this.spatialPositions3d, valuesFor(), {
|
|
2524
|
+
name: 'observations',
|
|
2525
|
+
colormap,
|
|
2526
|
+
contrastLimits,
|
|
2527
|
+
size,
|
|
2528
|
+
});
|
|
2529
|
+
}
|
|
2530
|
+
else {
|
|
2531
|
+
if (scalarKey !== this.spatialScalarKey3d) {
|
|
2532
|
+
// A change of colour SOURCE, which used to mean discarding the layer and building
|
|
2533
|
+
// another — and, because adding a 3D layer reframes, a camera jump to undo as well.
|
|
2534
|
+
// napari-js ≥ 0.14 lets the scalars be replaced in place — the setter bumps the
|
|
2535
|
+
// layer's dataVersion so the visual re-uploads — and the positions have not moved,
|
|
2536
|
+
// so there is nothing for the camera to reframe.
|
|
2537
|
+
this.spatialScalarKey3d = scalarKey;
|
|
2538
|
+
this.spatialPoints3d.values = valuesFor();
|
|
2539
|
+
}
|
|
2540
|
+
this.spatialPoints3d.colormap = colormap;
|
|
2541
|
+
this.spatialPoints3d.contrastLimits = contrastLimits;
|
|
2542
|
+
this.spatialPoints3d.size = size;
|
|
2543
|
+
}
|
|
2544
|
+
// Selection is a PER-POINT alpha, in the one layer.
|
|
2545
|
+
//
|
|
2546
|
+
// It used to be a second layer: with a single opacity for the whole cloud, the only way
|
|
2547
|
+
// to highlight a subset was to draw it again on top at full opacity while the parent
|
|
2548
|
+
// dropped to the muted level. That second layer had to be kept in step through every
|
|
2549
|
+
// colormap, window and size change, and the two then depth-sorted against each other as
|
|
2550
|
+
// separate draws. Per-point alphas and sizes give the same reading — muted cloud, bright
|
|
2551
|
+
// selection, slightly larger so a small one is findable inside 3.7M points — in one.
|
|
2552
|
+
const hasSelection = selection.count > 0 && selection.mask.length === obs.count;
|
|
2553
|
+
const cloud = this.spatialPoints3d;
|
|
2554
|
+
if (cloud) {
|
|
2555
|
+
cloud.opacity = view.opacity;
|
|
2556
|
+
if (!hasSelection) {
|
|
2557
|
+
cloud.alphas = null;
|
|
2558
|
+
cloud.sizes = null;
|
|
2559
|
+
}
|
|
2560
|
+
else {
|
|
2561
|
+
const alphas = new Float32Array(shownCount);
|
|
2562
|
+
const sizes = new Float32Array(shownCount);
|
|
2563
|
+
for (let k = 0; k < shownCount; k++) {
|
|
2564
|
+
const i = shown ? shown[k] : k;
|
|
2565
|
+
const picked = !!selection.mask[i];
|
|
2566
|
+
alphas[k] = picked ? 1 : DEFAULT_MUTED_OPACITY;
|
|
2567
|
+
sizes[k] = picked ? NapariVisualizerService.SPATIAL_SELECTED_SIZE_SCALE : 1;
|
|
2568
|
+
}
|
|
2569
|
+
cloud.alphas = alphas;
|
|
2570
|
+
cloud.sizes = sizes;
|
|
2571
|
+
}
|
|
2572
|
+
}
|
|
2573
|
+
// Last, so it also covers a layer this pass just created.
|
|
2574
|
+
if (this.spatialPoints3d)
|
|
2575
|
+
this.spatialPoints3d.visible = view.showPoints;
|
|
2576
|
+
viewer.requestRender();
|
|
2577
|
+
}
|
|
2578
|
+
/**
|
|
2579
|
+
* The **3D gene map**: the active gene's expression over the whole sectioned
|
|
2580
|
+
* specimen, as one raymarched volume.
|
|
2581
|
+
*
|
|
2582
|
+
* Two things it can be, and the panel's `Volume rendering` toggle picks which:
|
|
2583
|
+
*
|
|
2584
|
+
* - **sheets** — exactly the planes that were imaged, each carrying that
|
|
2585
|
+
* slide's own 2D gene map, with the gaps between sections empty. A stack of
|
|
2586
|
+
* measured fields, at their true z.
|
|
2587
|
+
* - **volume** — the same fields smoothed along z, so the planes between the
|
|
2588
|
+
* sections carry an interpolated value. An estimate, and drawn as a
|
|
2589
|
+
* translucent cloud for the same reason the density volumes are.
|
|
2590
|
+
*
|
|
2591
|
+
* One `VolumeLayer` rather than a textured quad per section: an `ImageLayer`
|
|
2592
|
+
* renders only at `ndisplay === 2`, so 53 sheets in the orbit view would need a
|
|
2593
|
+
* new layer type upstream — while a scalar volume whose z sampling already IS
|
|
2594
|
+
* the section spacing expresses the sheets exactly, and the same lattice then
|
|
2595
|
+
* gives the interpolated version for free.
|
|
2596
|
+
*
|
|
2597
|
+
* Estimated on the reference volume's own lattice (`densityGrid` at stride 1),
|
|
2598
|
+
* so the field lands voxel-for-voxel on the anatomy and needs no offset — a
|
|
2599
|
+
* `VolumeLayer` has no translate, and napari centres both boxes on the world
|
|
2600
|
+
* origin.
|
|
2601
|
+
*/
|
|
2602
|
+
async ensureGeneMapVolume(viewer, dataset, view, selection) {
|
|
2603
|
+
const gene = view.geneMap && view.colorBy?.kind === 'feature' ? view.colorBy.name : null;
|
|
2604
|
+
const port = this.spatialData;
|
|
2605
|
+
const smoothing = view.geneMapSmoothing > 0 ? view.geneMapSmoothing : 1;
|
|
2606
|
+
const clip = view.percentileClip ?? [0.01, 0.99];
|
|
2607
|
+
const obs = dataset.observations;
|
|
2608
|
+
// A volume built from ONE section would smear that slide through the whole
|
|
2609
|
+
// depth, so the section restriction only applies to the sheets.
|
|
2610
|
+
const interpolate = !!view.geneMapVolume;
|
|
2611
|
+
const sections = sectionsOf(obs);
|
|
2612
|
+
const section = !interpolate && view.geneMapSection != null && sections && sections.length > 0
|
|
2613
|
+
? sections[Math.max(0, Math.min(sections.length - 1, view.geneMapSection))]
|
|
2614
|
+
: null;
|
|
2615
|
+
const fieldKey = gene
|
|
2616
|
+
? [
|
|
2617
|
+
dataset.id, gene, smoothing, section ?? 'all', interpolate ? 'vol' : 'sheets',
|
|
2618
|
+
this.selectionRev(selection),
|
|
2619
|
+
].join('|')
|
|
2620
|
+
: null;
|
|
2621
|
+
const key = fieldKey
|
|
2622
|
+
? [
|
|
2623
|
+
fieldKey, clip.join(','), view.logScale ? 'log' : 'lin', view.geneMapOpacity,
|
|
2624
|
+
this.continuousColormapKey(view),
|
|
2625
|
+
].join('|')
|
|
2626
|
+
: null;
|
|
2627
|
+
if (key === this.geneMapVolumeKey)
|
|
2628
|
+
return;
|
|
2629
|
+
if (this.geneMapVolumeLayer) {
|
|
2630
|
+
viewer.layers.remove(this.geneMapVolumeLayer);
|
|
2631
|
+
this.geneMapVolumeLayer = null;
|
|
2632
|
+
}
|
|
2633
|
+
this.geneMapVolumeKey = key;
|
|
2634
|
+
if (!key || !gene || !port) {
|
|
2635
|
+
this.geneMapVolumeField = null;
|
|
2636
|
+
this.geneMapVolumeFieldKey = null;
|
|
2637
|
+
return;
|
|
2638
|
+
}
|
|
2639
|
+
// Coarsened in-plane but NOT along z: the sheets need one plane per imaged
|
|
2640
|
+
// section, while the field they carry is smooth by construction and gains
|
|
2641
|
+
// nothing from the template's 40 µm detail. At full resolution the estimate is
|
|
2642
|
+
// a 5.7M-voxel pair of blurs on the main thread — seconds of frozen UI for a
|
|
2643
|
+
// checkbox; an eighth of the voxels is an eighth of the work.
|
|
2644
|
+
const grid = densityGrid(dataset, GENE_MAP_VOLUME_STRIDE, 128, 1);
|
|
2645
|
+
if (!grid)
|
|
2646
|
+
return;
|
|
2647
|
+
if (fieldKey !== this.geneMapVolumeFieldKey) {
|
|
2648
|
+
let values;
|
|
2649
|
+
try {
|
|
2650
|
+
values = await port.getFeatureVector(gene);
|
|
2651
|
+
}
|
|
2652
|
+
catch (err) {
|
|
2653
|
+
console.warn(`[napari-js] 3D gene map: "${gene}" unavailable`, err);
|
|
2654
|
+
this.geneMapVolumeKey = null;
|
|
2655
|
+
return;
|
|
2656
|
+
}
|
|
2657
|
+
if (this.viewer !== viewer || this.geneMapVolumeKey !== key)
|
|
2658
|
+
return;
|
|
2659
|
+
const inSelection = selection.count > 0 ? maskToIndices(selection.mask) : undefined;
|
|
2660
|
+
// In-plane bandwidth is the 2D map's, in this lattice's units, so a sheet
|
|
2661
|
+
// and the 2D view of the same section are the same field. Along z it is the
|
|
2662
|
+
// density path's 1.5 voxels — the smallest σ that bridges one section gap.
|
|
2663
|
+
// In-plane σ is a PHYSICAL bandwidth, anchored to the reference volume's own
|
|
2664
|
+
// voxel — the resolution the 2D map estimates at — so a sheet and the 2D
|
|
2665
|
+
// view of the same section are the same field whatever lattice this is
|
|
2666
|
+
// rasterised on. Along z it is the density path's 1.5 voxels: the smallest σ
|
|
2667
|
+
// that bridges one section gap.
|
|
2668
|
+
const inPlane = dataset.volume?.voxelSize ?? grid.voxelSize;
|
|
2669
|
+
this.geneMapVolumeField = expressionVolume(obs, grid, {
|
|
2670
|
+
sigma: [
|
|
2671
|
+
inPlane[0] * NapariVisualizerService.GENE_MAP_SIGMA * smoothing,
|
|
2672
|
+
inPlane[1] * NapariVisualizerService.GENE_MAP_SIGMA * smoothing,
|
|
2673
|
+
grid.voxelSize[2] * 1.5 * smoothing,
|
|
2674
|
+
],
|
|
2675
|
+
values,
|
|
2676
|
+
indices: section != null ? observationsInSection(obs, section) : inSelection,
|
|
2677
|
+
interpolate,
|
|
2678
|
+
});
|
|
2679
|
+
this.geneMapVolumeFieldKey = fieldKey;
|
|
2680
|
+
}
|
|
2681
|
+
const field = this.geneMapVolumeField;
|
|
2682
|
+
if (!field)
|
|
2683
|
+
return;
|
|
2684
|
+
const [lo, hi] = contrastWindow(field.mean, clip[0], clip[1]);
|
|
2685
|
+
const data = encodeExpressionVolume(field, [lo, hi], { log: view.logScale });
|
|
2686
|
+
const node = this.currentColormap;
|
|
2687
|
+
const lut = spatialContinuousLut(node?.data?.value, this.currentReverse, view.continuousColormap);
|
|
2688
|
+
this.geneMapVolumeLayer = viewer.addVolume(data, field.width, field.height, field.depth, {
|
|
2689
|
+
name: `gene map · ${gene}${interpolate ? ' · volume' : ''}`,
|
|
2690
|
+
colormap: colormapFromLut(`gene-map-${gene}`, lut),
|
|
2691
|
+
// The encoding already applied the window, so the layer must not apply a
|
|
2692
|
+
// second one: 0..255 is the whole of what it was given.
|
|
2693
|
+
contrastLimits: [0, 255],
|
|
2694
|
+
rendering: 'translucent',
|
|
2695
|
+
// Additive like the density volumes, and for the same reason: the sheets
|
|
2696
|
+
// have to read THROUGH each other and through the anatomy, which a
|
|
2697
|
+
// translucent blend would occlude one sheet at a time.
|
|
2698
|
+
blending: 'additive',
|
|
2699
|
+
opacity: view.geneMapOpacity,
|
|
2700
|
+
voxelSize: grid.voxelSize,
|
|
2701
|
+
});
|
|
2702
|
+
viewer.requestRender();
|
|
2703
|
+
}
|
|
2704
|
+
/**
|
|
2705
|
+
* Cluster density volumes: each cluster rasterised into a smooth scalar field and
|
|
2706
|
+
* raymarched alongside the cloud, tinted with the cluster's own legend colour.
|
|
2707
|
+
*
|
|
2708
|
+
* This is what makes a serially sectioned dataset readable as an anatomical
|
|
2709
|
+
* distribution. The cloud shows measured cells and nothing else — but at 200 µm
|
|
2710
|
+
* section spacing the eye cannot integrate a stack of discs into a shape, and
|
|
2711
|
+
* every gap reads as absence. A density field is a different object from a cell:
|
|
2712
|
+
* an estimate, defined between the imaged planes, drawn as a translucent cloud so
|
|
2713
|
+
* it cannot be mistaken for measurement. Individual cells are never interpolated —
|
|
2714
|
+
* consecutive sections sample different cells, so there is nothing to interpolate
|
|
2715
|
+
* along.
|
|
2716
|
+
*
|
|
2717
|
+
* One volume per cluster rather than one for everything: additive blending is what
|
|
2718
|
+
* makes two clusters' territories comparable, and a single blended field would
|
|
2719
|
+
* answer no question anyone asks of a taxonomy. Capped at
|
|
2720
|
+
* {@link DENSITY_MAX_CLUSTERS} by cell count.
|
|
2721
|
+
*
|
|
2722
|
+
* Keyed so it rebuilds only when the field would actually differ — the dataset,
|
|
2723
|
+
* the colour column, the bandwidth, or the selection.
|
|
2724
|
+
*/
|
|
2725
|
+
async ensureDensityVolumes(viewer, dataset, view, selection) {
|
|
2726
|
+
const on = !!view.densityVolume && !!dataset.observations.z;
|
|
2727
|
+
const smoothing = view.densitySmoothing > 0 ? view.densitySmoothing : 1;
|
|
2728
|
+
const column = view.colorBy?.kind === 'column' ? view.colorBy.name : null;
|
|
2729
|
+
// The selection enters the key by IDENTITY, not by count: two different ROIs
|
|
2730
|
+
// holding the same number of cells would otherwise look like the same key and
|
|
2731
|
+
// leave the previous ROI's fields on screen.
|
|
2732
|
+
const key = on
|
|
2733
|
+
? [dataset.id, column ?? 'all', smoothing, this.selectionRev(selection)].join('|')
|
|
2734
|
+
: null;
|
|
2735
|
+
if (key === this.densityKey)
|
|
2736
|
+
return;
|
|
2737
|
+
for (const layer of this.densityLayers)
|
|
2738
|
+
viewer.layers.remove(layer);
|
|
2739
|
+
this.densityLayers = [];
|
|
2740
|
+
this.densityKey = key;
|
|
2741
|
+
if (!key)
|
|
2742
|
+
return;
|
|
2743
|
+
const grid = densityGrid(dataset);
|
|
2744
|
+
if (!grid)
|
|
2745
|
+
return;
|
|
2746
|
+
// With no reference volume there is no offset yet, and a VolumeLayer has no
|
|
2747
|
+
// translate — napari centres its box on the world origin. So the POINTS move by
|
|
2748
|
+
// half the density box, exactly as they do for a reference volume, and the
|
|
2749
|
+
// cached geometry is invalidated because that offset just changed.
|
|
2750
|
+
if (!this.spatialVolume) {
|
|
2751
|
+
this.spatialOrigin3d = [
|
|
2752
|
+
-(grid.width * grid.voxelSize[0]) / 2,
|
|
2753
|
+
-(grid.height * grid.voxelSize[1]) / 2,
|
|
2754
|
+
-(grid.depth * grid.voxelSize[2]) / 2,
|
|
2755
|
+
];
|
|
2756
|
+
this.spatialLayerKey3d = null;
|
|
2757
|
+
}
|
|
2758
|
+
let groups;
|
|
2759
|
+
try {
|
|
2760
|
+
groups = await this.densityGroups(dataset, column, selection);
|
|
2761
|
+
}
|
|
2762
|
+
catch (err) {
|
|
2763
|
+
console.warn('[napari-js] density volumes: column unavailable', err);
|
|
2764
|
+
this.densityKey = null;
|
|
2765
|
+
return;
|
|
2766
|
+
}
|
|
2767
|
+
if (this.viewer !== viewer || this.densityKey !== key)
|
|
2768
|
+
return;
|
|
2769
|
+
const sigma = defaultSigma(grid, smoothing);
|
|
2770
|
+
// Additive blending SUMS, so a fixed per-layer opacity blows out to white as
|
|
2771
|
+
// soon as several broad clusters overlap — six subclasses at 0.55 each turned
|
|
2772
|
+
// the brain into one cyan mass. Splitting the budget keeps n fully overlapping
|
|
2773
|
+
// peaks inside the display's range, so overlap reads as overlap; a single
|
|
2774
|
+
// cluster still gets the full 0.55. It only mitigates: a translucent raymarch
|
|
2775
|
+
// integrates along the ray, so clusters that are ubiquitous rather than
|
|
2776
|
+
// regional (the largest subclasses are glia, which are everywhere) still pile
|
|
2777
|
+
// up, and one cluster at a time is the readable way to look at those.
|
|
2778
|
+
const opacity = Math.min(0.55, 0.9 / Math.max(1, groups.length));
|
|
2779
|
+
for (const group of groups) {
|
|
2780
|
+
const data = rasterizeDensity(dataset.observations, grid, { sigma, indices: group.indices });
|
|
2781
|
+
// A cluster with nothing on the grid draws no layer, rather than an empty box.
|
|
2782
|
+
if (!data)
|
|
2783
|
+
continue;
|
|
2784
|
+
if (this.viewer !== viewer || this.densityKey !== key)
|
|
2785
|
+
return;
|
|
2786
|
+
this.densityLayers.push((viewer.addVolume(data, grid.width, grid.height, grid.depth, {
|
|
2787
|
+
name: `density · ${group.name}`,
|
|
2788
|
+
colormap: this.channelTintColormap(group.color),
|
|
2789
|
+
// Translucent, not MIP: a cluster's interior is the readable part, and MIP
|
|
2790
|
+
// would flatten every cloud to its brightest shell.
|
|
2791
|
+
rendering: 'translucent',
|
|
2792
|
+
opacity,
|
|
2793
|
+
// Additive, so two clusters overlapping read as both being there instead
|
|
2794
|
+
// of the nearer one hiding the other.
|
|
2795
|
+
blending: 'additive',
|
|
2796
|
+
voxelSize: grid.voxelSize,
|
|
2797
|
+
})));
|
|
2798
|
+
}
|
|
2799
|
+
viewer.requestRender();
|
|
2800
|
+
}
|
|
2801
|
+
/**
|
|
2802
|
+
* Identity of the colour scale a continuous spatial layer will draw with, for a
|
|
2803
|
+
* cache key: the explicit choice, or else the display colormap and its reverse
|
|
2804
|
+
* flag, since that is what {@link spatialContinuousLut} falls back to.
|
|
2805
|
+
*
|
|
2806
|
+
* The gene maps cache their coloured output, so without this in the key a change
|
|
2807
|
+
* of colour scale left the field on screen in the previous colours — the markers
|
|
2808
|
+
* recoloured and the map under them did not.
|
|
2809
|
+
*/
|
|
2810
|
+
continuousColormapKey(view) {
|
|
2811
|
+
const node = this.currentColormap;
|
|
2812
|
+
return [
|
|
2813
|
+
colormapId(view.continuousColormap),
|
|
2814
|
+
colormapId(node?.data?.value),
|
|
2815
|
+
this.currentReverse ? 'rev' : '',
|
|
2816
|
+
].join(':');
|
|
2817
|
+
}
|
|
2818
|
+
/**
|
|
2819
|
+
* A revision number for a selection object.
|
|
2820
|
+
*
|
|
2821
|
+
* The store hands out a NEW mask object per change, so object identity is the
|
|
2822
|
+
* cheap and exact way to tell two selections apart — a fingerprint over 3.7M
|
|
2823
|
+
* mask bytes would be neither. Counting revisions keeps the cache key a short
|
|
2824
|
+
* string.
|
|
2825
|
+
*/
|
|
2826
|
+
selectionRev(selection) {
|
|
2827
|
+
if (selection !== this.lastSelectionSeen) {
|
|
2828
|
+
this.lastSelectionSeen = selection;
|
|
2829
|
+
this.selectionRevision++;
|
|
2830
|
+
}
|
|
2831
|
+
return this.selectionRevision;
|
|
2832
|
+
}
|
|
2833
|
+
/**
|
|
2834
|
+
* The clusters to rasterise: the categories of the active categorical colouring,
|
|
2835
|
+
* biggest first and capped, each with its legend colour.
|
|
2836
|
+
*
|
|
2837
|
+
* Restricted to the current selection when there is one, so "select a region,
|
|
2838
|
+
* check the box" answers which clusters live there. With no categorical colouring
|
|
2839
|
+
* there is one group — total cell density, which is a real question on its own
|
|
2840
|
+
* ("where is the tissue dense?") and the honest thing to show when the view is
|
|
2841
|
+
* not encoding a taxonomy.
|
|
2842
|
+
*/
|
|
2843
|
+
async densityGroups(dataset, column, selection) {
|
|
2844
|
+
const n = dataset.observations.count;
|
|
2845
|
+
const inSelection = selection.count > 0 ? selection.mask : null;
|
|
2846
|
+
const port = this.spatialData;
|
|
2847
|
+
const meta = column ? findColumnMeta(dataset, column) : undefined;
|
|
2848
|
+
if (!port || !column || !meta || meta.kind !== 'categorical') {
|
|
2849
|
+
const indices = inSelection ? maskToIndices(inSelection) : undefined;
|
|
2850
|
+
const [r, g, b] = NapariVisualizerService.SPATIAL_NEUTRAL_COLOR;
|
|
2851
|
+
const hex = `#${[r, g, b].map((c) => Math.round(c * 255).toString(16).padStart(2, '0')).join('')}`;
|
|
2852
|
+
return [{ name: inSelection ? 'selected cells' : 'all cells', color: hex, indices }];
|
|
2853
|
+
}
|
|
2854
|
+
const loaded = await port.getColumn(column);
|
|
2855
|
+
if (!isCategoricalColumn(loaded))
|
|
2856
|
+
return [];
|
|
2857
|
+
const colors = resolveCategoryColors(loaded.meta);
|
|
2858
|
+
const counts = new Uint32Array(loaded.meta.categories.length);
|
|
2859
|
+
for (let i = 0; i < n; i++) {
|
|
2860
|
+
if (inSelection && !inSelection[i])
|
|
2861
|
+
continue;
|
|
2862
|
+
const code = loaded.codes[i];
|
|
2863
|
+
if (code !== NO_CATEGORY && code < counts.length)
|
|
2864
|
+
counts[code]++;
|
|
2865
|
+
}
|
|
2866
|
+
const ranked = Array.from(counts, (count, code) => ({ code, count }))
|
|
2867
|
+
.filter((c) => c.count > 0)
|
|
2868
|
+
.sort((a, b) => b.count - a.count)
|
|
2869
|
+
.slice(0, NapariVisualizerService.DENSITY_MAX_CLUSTERS);
|
|
2870
|
+
if (counts.filter((c) => c > 0).length > ranked.length) {
|
|
2871
|
+
console.info(`[napari-js] ${column}: drawing the ${ranked.length} largest clusters as density ` +
|
|
2872
|
+
'volumes; more than that stop being separable by eye');
|
|
2873
|
+
}
|
|
2874
|
+
return ranked.map(({ code }) => {
|
|
2875
|
+
const indices = new Uint32Array(counts[code]);
|
|
2876
|
+
let k = 0;
|
|
2877
|
+
for (let i = 0; i < n; i++) {
|
|
2878
|
+
if (inSelection && !inSelection[i])
|
|
2879
|
+
continue;
|
|
2880
|
+
if (loaded.codes[i] === code)
|
|
2881
|
+
indices[k++] = i;
|
|
2882
|
+
}
|
|
2883
|
+
return {
|
|
2884
|
+
name: loaded.meta.categories[code],
|
|
2885
|
+
color: colors[code] ?? '#888888',
|
|
2886
|
+
indices: indices.subarray(0, k),
|
|
2887
|
+
};
|
|
2888
|
+
});
|
|
2889
|
+
}
|
|
2890
|
+
/**
|
|
2891
|
+
* Add (or keep) the dataset's reference volume, and derive the offset that sits the
|
|
2892
|
+
* observations inside it.
|
|
2893
|
+
*
|
|
2894
|
+
* `VolumeLayer` has no translate: napari-js maps the volume's unit cube to a world box
|
|
2895
|
+
* **centred on the origin**, sized `dims x voxelSize`. The observations, by contract, are in
|
|
2896
|
+
* the volume's own frame with its near corner at the coordinate origin. So the two only line
|
|
2897
|
+
* up if the POINTS move — by half the box — which is what {@link spatialOrigin3d} is.
|
|
2898
|
+
*
|
|
2899
|
+
* A failed or absent volume is not fatal: the cloud renders on its own, at its own
|
|
2900
|
+
* coordinates, and the camera frames the points instead.
|
|
2901
|
+
*/
|
|
2902
|
+
async ensureSpatialVolume(viewer, dataset, view) {
|
|
2903
|
+
const meta = dataset.volume;
|
|
2904
|
+
const port = this.spatialData;
|
|
2905
|
+
const key = meta ? `${dataset.id}:${meta.width}x${meta.height}x${meta.depth}` : null;
|
|
2906
|
+
if (key && key === this.spatialVolumeKey)
|
|
2907
|
+
return;
|
|
2908
|
+
if (this.spatialVolume) {
|
|
2909
|
+
viewer.layers.remove(this.spatialVolume);
|
|
2910
|
+
this.spatialVolume = null;
|
|
2911
|
+
this.spatialVolumeKey = null;
|
|
2912
|
+
}
|
|
2913
|
+
this.spatialOrigin3d = [0, 0, 0];
|
|
2914
|
+
if (!meta || !port?.getVolume)
|
|
2915
|
+
return;
|
|
2916
|
+
let voxels;
|
|
2917
|
+
try {
|
|
2918
|
+
voxels = await port.getVolume();
|
|
2919
|
+
}
|
|
2920
|
+
catch (err) {
|
|
2921
|
+
console.warn('[napari-js] reference volume unavailable — drawing the cloud alone', err);
|
|
2922
|
+
return;
|
|
2923
|
+
}
|
|
2924
|
+
if (this.viewer !== viewer)
|
|
2925
|
+
return;
|
|
2926
|
+
const [vx, vy, vz] = meta.voxelSize;
|
|
2927
|
+
this.spatialVolumeKey = key;
|
|
2928
|
+
this.spatialVolume = (viewer.addVolume(voxels, meta.width, meta.height, meta.depth, {
|
|
2929
|
+
name: 'reference volume',
|
|
2930
|
+
colormap: 'gray',
|
|
2931
|
+
// MIP would draw the brightest voxel along each ray, which for an averaged
|
|
2932
|
+
// template means a flat white shell that hides the cloud. Translucent lets
|
|
2933
|
+
// the points read through the tissue, which is the entire point of drawing
|
|
2934
|
+
// them together.
|
|
2935
|
+
rendering: 'translucent',
|
|
2936
|
+
opacity: view.volumeOpacity,
|
|
2937
|
+
voxelSize: [vx, vy, vz],
|
|
2938
|
+
}));
|
|
2939
|
+
// Half the box, negated: the observations' origin is the box's near corner,
|
|
2940
|
+
// and the box is centred on the world origin.
|
|
2941
|
+
this.spatialOrigin3d = [
|
|
2942
|
+
-(meta.width * vx) / 2,
|
|
2943
|
+
-(meta.height * vy) / 2,
|
|
2944
|
+
-(meta.depth * vz) / 2,
|
|
2945
|
+
];
|
|
2946
|
+
// Force a geometry rebuild: the offset changed, so cached positions are stale.
|
|
2947
|
+
this.spatialLayerKey3d = null;
|
|
2948
|
+
}
|
|
2949
|
+
removeSpatial3dLayers(viewer) {
|
|
2950
|
+
for (const layer of [
|
|
2951
|
+
this.spatialPoints3d, this.spatialVolume,
|
|
2952
|
+
this.geneMapVolumeLayer, ...this.densityLayers,
|
|
2953
|
+
]) {
|
|
2954
|
+
if (layer)
|
|
2955
|
+
viewer.layers.remove(layer);
|
|
2956
|
+
}
|
|
2957
|
+
this.geneMapVolumeLayer = null;
|
|
2958
|
+
this.geneMapVolumeKey = null;
|
|
2959
|
+
this.geneMapVolumeField = null;
|
|
2960
|
+
this.geneMapVolumeFieldKey = null;
|
|
2961
|
+
this.densityLayers = [];
|
|
2962
|
+
this.densityKey = null;
|
|
2963
|
+
// The scene is gone, so the next 3D layer should frame itself again. That used to be
|
|
2964
|
+
// `spatialFramed = null` next to a hand-rolled save/restore; the renderer owns the
|
|
2965
|
+
// policy now, and this is the same statement addressed to it.
|
|
2966
|
+
viewer.resetFit3D();
|
|
2967
|
+
this.spatial2dFramed = null;
|
|
2968
|
+
this.spatialVolume = null;
|
|
2969
|
+
this.spatialVolumeKey = null;
|
|
2970
|
+
this.spatialOrigin3d = [0, 0, 0];
|
|
2971
|
+
this.spatialPoints3d = null;
|
|
2972
|
+
this.spatialLayerKey3d = null;
|
|
2973
|
+
this.spatialScalarKey3d = null;
|
|
2974
|
+
this.spatialPositions3d = null;
|
|
2975
|
+
this.spatialDrawn3d = null;
|
|
2976
|
+
}
|
|
2977
|
+
/** A one-colour colormap, for the "nothing to colour by" state. */
|
|
2978
|
+
spatialFlatColormap() {
|
|
2979
|
+
const [r, g, b] = NapariVisualizerService.SPATIAL_NEUTRAL_COLOR;
|
|
2980
|
+
const rgb = [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
|
|
2981
|
+
// Two identical stops: colormapFromLut needs at least two, and equal ends
|
|
2982
|
+
// make every value resolve to the same colour.
|
|
2983
|
+
return colormapFromLut('spatial-flat', [rgb, rgb]);
|
|
2984
|
+
}
|
|
2985
|
+
/**
|
|
2986
|
+
* The per-point scalar + colormap + window that colour the 3D cloud.
|
|
2987
|
+
*
|
|
2988
|
+
* Continuous data is the natural fit: values go straight through the active colormap with the
|
|
2989
|
+
* same percentile window the 2D path uses. Categorical data has to be smuggled through the same
|
|
2990
|
+
* scalar channel — see {@link SPATIAL_3D_MAX_CATEGORIES}. Codes map to LUT blocks, and
|
|
2991
|
+
* `contrastLimits` of `[-0.5, K - 0.5]` puts code `i` at the centre of block `i`, which is what
|
|
2992
|
+
* makes the round-trip exact instead of approximately right.
|
|
2993
|
+
*/
|
|
2994
|
+
async spatialScalar3d(dataset, view) {
|
|
2995
|
+
const port = this.spatialData;
|
|
2996
|
+
const colorBy = view.colorBy;
|
|
2997
|
+
if (!port || !colorBy)
|
|
2998
|
+
return null;
|
|
2999
|
+
if (colorBy.kind === 'column') {
|
|
3000
|
+
const column = await port.getColumn(colorBy.name);
|
|
3001
|
+
if (isCategoricalColumn(column)) {
|
|
3002
|
+
return this.encodeSpatial3dCategorical(column.codes, resolveCategoryColors(column.meta));
|
|
3003
|
+
}
|
|
3004
|
+
return this.encodeSpatial3dContinuous(column.values, view, view.logScale);
|
|
3005
|
+
}
|
|
3006
|
+
const values = await port.getFeatureVector(colorBy.name);
|
|
3007
|
+
return this.encodeSpatial3dContinuous(values, view, view.logScale);
|
|
3008
|
+
}
|
|
3009
|
+
/** Category codes → a stepped LUT, exact for up to {@link SPATIAL_3D_MAX_CATEGORIES}. */
|
|
3010
|
+
encodeSpatial3dCategorical(codes, colors) {
|
|
3011
|
+
// Slot 0 is reserved for "no category", so the palette occupies 1..K and the
|
|
3012
|
+
// block count is one more than the category count — which is why the published
|
|
3013
|
+
// ceiling is 95 categories rather than the LUT's 96 distinguishable blocks.
|
|
3014
|
+
if (colors.length > SPATIAL_3D_MAX_CATEGORIES) {
|
|
3015
|
+
console.warn(`[napari-js] ${colors.length} categories exceeds the ${SPATIAL_3D_MAX_CATEGORIES} the 3D `
|
|
3016
|
+
+ "layer's 256-entry LUT can hold distinctly; drawing flat instead of with wrong colours");
|
|
3017
|
+
return null;
|
|
3018
|
+
}
|
|
3019
|
+
const k = colors.length + 1;
|
|
3020
|
+
const palette = [
|
|
3021
|
+
MISSING_COLOR,
|
|
3022
|
+
...colors.map(parseHex),
|
|
3023
|
+
];
|
|
3024
|
+
const lut = new Array(LUT_SIZE);
|
|
3025
|
+
for (let j = 0; j < LUT_SIZE; j++) {
|
|
3026
|
+
lut[j] = palette[Math.min(k - 1, Math.floor((j * k) / LUT_SIZE))];
|
|
3027
|
+
}
|
|
3028
|
+
const values = new Float32Array(codes.length);
|
|
3029
|
+
for (let i = 0; i < codes.length; i++) {
|
|
3030
|
+
values[i] = codes[i] === NO_CATEGORY ? 0 : codes[i] + 1;
|
|
3031
|
+
}
|
|
3032
|
+
return {
|
|
3033
|
+
values,
|
|
3034
|
+
colormap: colormapFromLut('spatial-categories', lut),
|
|
3035
|
+
contrastLimits: [-0.5, k - 0.5],
|
|
3036
|
+
};
|
|
3037
|
+
}
|
|
3038
|
+
/** Continuous values → the active colormap over a percentile-clipped window. */
|
|
3039
|
+
encodeSpatial3dContinuous(source, view, log) {
|
|
3040
|
+
const node = this.currentColormap;
|
|
3041
|
+
const lut = spatialContinuousLut(node?.data?.value, this.currentReverse, view.continuousColormap);
|
|
3042
|
+
const [lo, hi] = view.percentileClip ?? [0.01, 0.99];
|
|
3043
|
+
let values = source;
|
|
3044
|
+
if (log) {
|
|
3045
|
+
values = new Float32Array(source.length);
|
|
3046
|
+
for (let i = 0; i < source.length; i++)
|
|
3047
|
+
values[i] = Math.log1p(Math.max(0, source[i]));
|
|
3048
|
+
}
|
|
3049
|
+
const [min, max] = contrastWindow(values, lo, hi);
|
|
3050
|
+
return {
|
|
3051
|
+
values,
|
|
3052
|
+
colormap: colormapFromLut('spatial-continuous', lut),
|
|
3053
|
+
// A degenerate window would divide by zero in the shader's normalisation.
|
|
3054
|
+
contrastLimits: max > min ? [min, max] : [min, min + 1],
|
|
3055
|
+
};
|
|
3056
|
+
}
|
|
3057
|
+
/**
|
|
3058
|
+
* Per-observation colours for the current view state, or a single flat colour when nothing is
|
|
3059
|
+
* selected to colour by. Categorical columns use the column's own palette; continuous columns
|
|
3060
|
+
* and gene vectors go through the active colormap with a percentile-clipped window.
|
|
3061
|
+
*/
|
|
3062
|
+
async spatialFaceColors(dataset, view, selection) {
|
|
3063
|
+
const port = this.spatialData;
|
|
3064
|
+
const colorBy = view.colorBy;
|
|
3065
|
+
// Everything NOT selected is muted; with nothing selected, nothing is muted
|
|
3066
|
+
// and the whole tissue reads normally (the CosMx highlight-vs-mute rule).
|
|
3067
|
+
const muted = mutedFromSelection(selection);
|
|
3068
|
+
if (!port || !colorBy) {
|
|
3069
|
+
const [r, g, b] = NapariVisualizerService.SPATIAL_NEUTRAL_COLOR;
|
|
3070
|
+
// Genuinely uniform: one broadcast tuple, so a flat 84k-observation view
|
|
3071
|
+
// does not allocate 84k of them.
|
|
3072
|
+
if (!muted && view.opacity >= 1)
|
|
3073
|
+
return NapariVisualizerService.SPATIAL_NEUTRAL_COLOR;
|
|
3074
|
+
// Not uniform — the opacity control or a selection varies the alpha, so it
|
|
3075
|
+
// has to be per-point. Returning the constant tuple here is what made the
|
|
3076
|
+
// Opacity slider do nothing in the default state, which is the state anyone
|
|
3077
|
+
// lands in before picking a colour source.
|
|
3078
|
+
const hex = `#${[r, g, b].map((c) => Math.round(c * 255).toString(16).padStart(2, '0')).join('')}`;
|
|
3079
|
+
return toRgbaTuples(encodeCategorical(new Uint16Array(dataset.observations.count), {
|
|
3080
|
+
colors: [hex],
|
|
3081
|
+
opacity: view.opacity,
|
|
3082
|
+
muted,
|
|
3083
|
+
}));
|
|
3084
|
+
}
|
|
3085
|
+
if (colorBy.kind === 'column') {
|
|
3086
|
+
const column = await port.getColumn(colorBy.name);
|
|
3087
|
+
if (isCategoricalColumn(column)) {
|
|
3088
|
+
return toRgbaTuples(encodeCategorical(column.codes, {
|
|
3089
|
+
colors: resolveCategoryColors(column.meta),
|
|
3090
|
+
opacity: view.opacity,
|
|
3091
|
+
muted,
|
|
3092
|
+
}));
|
|
3093
|
+
}
|
|
3094
|
+
// A continuous column may carry its own log hint (counts); the view's
|
|
3095
|
+
// toggle wins once the user has set it.
|
|
3096
|
+
return toRgbaTuples(this.encodeSpatialContinuous(column.values, view, view.logScale, muted));
|
|
3097
|
+
}
|
|
3098
|
+
const values = await port.getFeatureVector(colorBy.name);
|
|
3099
|
+
return toRgbaTuples(this.encodeSpatialContinuous(values, view, view.logScale, muted));
|
|
3100
|
+
}
|
|
3101
|
+
/** Continuous values → RGBA through the active colormap and a clipped window. */
|
|
3102
|
+
encodeSpatialContinuous(values, view, log, muted = null) {
|
|
3103
|
+
const node = this.currentColormap;
|
|
3104
|
+
const lut = spatialContinuousLut(node?.data?.value, this.currentReverse, view.continuousColormap);
|
|
3105
|
+
const [lo, hi] = view.percentileClip ?? [0.01, 0.99];
|
|
3106
|
+
const [min, max] = contrastWindow(values, lo, hi);
|
|
3107
|
+
return encodeContinuous(values, { lut, min, max, log, opacity: view.opacity, muted });
|
|
3108
|
+
}
|
|
1263
3109
|
/**
|
|
1264
3110
|
* Mount the NAPARI_SCATTER3D 3D scatter: the downsampled voxel grid as a 3D point cloud colored
|
|
1265
3111
|
* by intensity (napari-js analog of Plotly's voxel scatter3d). Assembles a coarse volume, then
|
|
@@ -1668,6 +3514,25 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1668
3514
|
this.surfaceWindow = null;
|
|
1669
3515
|
this.scatterRegionSub?.unsubscribe();
|
|
1670
3516
|
this.scatterRegionSub = null;
|
|
3517
|
+
this.spatialSub?.unsubscribe();
|
|
3518
|
+
this.spatialSub = null;
|
|
3519
|
+
this.removeSpatialHover();
|
|
3520
|
+
this.hoverSource = null;
|
|
3521
|
+
this.hoverSourceKey = null;
|
|
3522
|
+
this.spatialPoints = null;
|
|
3523
|
+
this.spatialLayerKey = null;
|
|
3524
|
+
this.spatialPoints3d = null;
|
|
3525
|
+
this.spatialLayerKey3d = null;
|
|
3526
|
+
this.spatialScalarKey3d = null;
|
|
3527
|
+
this.spatialVolume = null;
|
|
3528
|
+
this.spatialVolumeKey = null;
|
|
3529
|
+
this.spatialOrigin3d = [0, 0, 0];
|
|
3530
|
+
this.spatialScaleBarKey = null;
|
|
3531
|
+
// Drop the cached interleaved coordinates too: holding 3.7M x 3 floats after
|
|
3532
|
+
// a teardown is ~45MB of retained heap for a scene that no longer exists.
|
|
3533
|
+
this.spatialPositions3d = null;
|
|
3534
|
+
// Invalidate any colour fetch still in flight so it can't attach to the next scene.
|
|
3535
|
+
this.spatialRebuildToken++;
|
|
1671
3536
|
this.scatter2dPoints = null;
|
|
1672
3537
|
this.scatter3dLayer = null;
|
|
1673
3538
|
this.axesLayer = null;
|
|
@@ -1733,6 +3598,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1733
3598
|
v.dims.z = zIndex;
|
|
1734
3599
|
if (this.descriptor)
|
|
1735
3600
|
void this.refreshHistogramSamples(zIndex, this.descriptor);
|
|
3601
|
+
this.redrawSpatialMarkers();
|
|
1736
3602
|
this.scheduleReadback();
|
|
1737
3603
|
return;
|
|
1738
3604
|
}
|
|
@@ -1742,8 +3608,14 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1742
3608
|
const req = ++this.sliceReq;
|
|
1743
3609
|
void this.renderImage(zIndex, req)
|
|
1744
3610
|
.then(() => {
|
|
1745
|
-
if (req
|
|
1746
|
-
|
|
3611
|
+
if (req !== this.sliceReq)
|
|
3612
|
+
return;
|
|
3613
|
+
// AFTER the image, never before: the render clears the layer list, so
|
|
3614
|
+
// markers drawn first are wiped by the very image meant to sit under them.
|
|
3615
|
+
// Over a volume-backed dataset the plane also decides which observations
|
|
3616
|
+
// are drawn at all, so this is what moves the cells with the section.
|
|
3617
|
+
this.redrawSpatialMarkers();
|
|
3618
|
+
this.scheduleReadback();
|
|
1747
3619
|
})
|
|
1748
3620
|
.catch((err) => console.error('[napari-js] setZIndex slice failed:', err));
|
|
1749
3621
|
}
|
|
@@ -1829,6 +3701,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1829
3701
|
PLOT_TYPE_DESCRIPTORS[PlotType.NAPARI_SCATTER3D],
|
|
1830
3702
|
PLOT_TYPE_DESCRIPTORS[PlotType.NAPARI_VOLUME],
|
|
1831
3703
|
PLOT_TYPE_DESCRIPTORS[PlotType.NAPARI_ISOSURFACE],
|
|
3704
|
+
// Gated by `requiresSpatialData`, so the selector hides it until a dataset is published.
|
|
3705
|
+
PLOT_TYPE_DESCRIPTORS[PlotType.SPATIAL_OMICS],
|
|
1832
3706
|
];
|
|
1833
3707
|
}
|
|
1834
3708
|
/** The napari 3D decimate factor (1 = full … 8 = ⅛). Read by the toolbar to init the control. */
|
|
@@ -2293,7 +4167,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
2293
4167
|
unsubscribe() {
|
|
2294
4168
|
this.reset();
|
|
2295
4169
|
}
|
|
2296
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: NapariVisualizerService, deps: [{ token: TILE_ACCESS_PORT }, { token: i1.VisualizerStore }, { token: i2.RegionStore }, { token: i3.WandToolService }, { token: i4.BrushToolService }, { token: i5.VertexEraserToolService }, { token: i6.ZoomToBoxToolService }, { token: i7.SamToolService }, { token: i8.SamPointToolService }, { token: i9.CellSegmentToolService }, { token: CELL_SEGMENTER, optional: true }, { token: i10.SimpleSliceAccessService }, { token: VIZ_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4170
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: NapariVisualizerService, deps: [{ token: TILE_ACCESS_PORT }, { token: i1.VisualizerStore }, { token: i2.RegionStore }, { token: i3.WandToolService }, { token: i4.BrushToolService }, { token: i5.VertexEraserToolService }, { token: i6.ZoomToBoxToolService }, { token: i7.SamToolService }, { token: i8.SamPointToolService }, { token: i9.CellSegmentToolService }, { token: CELL_SEGMENTER, optional: true }, { token: i10.SimpleSliceAccessService }, { token: VIZ_CONFIG }, { token: SPATIAL_DATA_PORT, optional: true }, { token: i11.SpatialSelectionStore }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2297
4171
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: NapariVisualizerService, providedIn: 'root' }); }
|
|
2298
4172
|
}
|
|
2299
4173
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: NapariVisualizerService, decorators: [{
|
|
@@ -2310,5 +4184,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
2310
4184
|
}] }, { type: i10.SimpleSliceAccessService }, { type: undefined, decorators: [{
|
|
2311
4185
|
type: Inject,
|
|
2312
4186
|
args: [VIZ_CONFIG]
|
|
2313
|
-
}] }
|
|
2314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQWMsZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLHNCQUFzQixHQUN2QixNQUFNLFdBQVcsQ0FBQztBQWdCbkIsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUNMLFFBQVEsRUFFUixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSwyQkFBMkIsQ0FBQztBQVNuQyxPQUFPLEVBRUwsYUFBYSxFQUNiLGNBQWMsR0FDZixNQUFNLHVDQUF1QyxDQUFDO0FBSS9DLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQWtCLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFF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LENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDOzhHQXh3RVUsdUJBQXVCLGtCQXNJeEIsZ0JBQWdCLHdUQVVKLGNBQWMsc0VBRTFCLFVBQVU7a0hBbEpULHVCQUF1QixjQURWLE1BQU07OzJGQUNuQix1QkFBdUI7a0JBRG5DLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkF1STdCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFVdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjOzswQkFFakMsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHtcbiAgVmlld2VyLFxuICBoaXN0b2dyYW1TY2FsYXIsXG4gIGNvbG9ybWFwRnJvbUx1dCxcbiAgdGludENvbG9ybWFwLFxuICByZXZlcnNlQ29sb3JtYXAsXG4gIGhlaWdodEZpZWxkLFxuICBNdWx0aUNoYW5uZWxJbWFnZVZpZXcsXG4gIE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF4ZXNMYXllcixcbiAgU3VyZmFjZUxheWVyLFxuICBQb2ludHNMYXllcixcbiAgUG9pbnRzM0RMYXllcixcbiAgVGlsZWRTb3VyY2UsXG4gIFRpbGVLZXksXG4gIFBpeGVsQ2h1bmssXG4gIENoYW5uZWxWaWV3LFxuICBWb2x1bWVDaGFubmVsLFxuICBDb2xvcm1hcCxcbn0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbFN0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBMT1RfVFlQRV9ERVNDUklQVE9SUyxcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVN1cmZhY2UsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNOYXBhcmlTY2F0dGVyM2QsXG4gIE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIElWaXN1YWxpemVyLFxuICBQaXhlbERhdGEsXG4gIEludGVuc2l0eVByb2ZpbGUsXG4gIElJc29zdXJmYWNlQ29udHJvbHMsXG4gIElJbnRlbnNpdHlDb250cm9scyxcbiAgSVN1cmZhY2UzZENvbnRyb2xzLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQge1xuICBWaWV3ZXJDYXBhYmlsaXRpZXMsXG4gIFZpZXdlckZlYXR1cmUsXG4gIGNhcGFiaWxpdGllc09mLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IENvbG9ybWFwTm9kZSwgSVdhbmRPcHRpb25zLCBJQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgVElMRV9BQ0NFU1NfUE9SVCwgVGlsZUFjY2Vzc1BvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBCYXNlU3RvcmVWaXN1YWxpemVyIH0gZnJvbSAnLi4vYmFzZS1zdG9yZS12aXN1YWxpemVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlTY2FsZUJhciwgZm9ybWF0VW0gfSBmcm9tICcuL25hcGFyaS1zY2FsZS1iYXInO1xuaW1wb3J0IHsgTmFwYXJpUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vbmFwYXJpLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE5hcGFyaUF4ZXNMYWJlbHMsIEF4aXNMYWJlbFNwZWMgfSBmcm9tICcuL25hcGFyaS1heGVzLWxhYmVscyc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7XG4gIElDb29yZGluYXRlVHJhbnNmb3JtLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29vcmRpbmF0ZS10cmFuc2Zvcm0uY29udHJhY3QnO1xuaW1wb3J0IHsgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QsIENhY2hlZEltYWdlRGF0YSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBXYW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gIFZlcnRleEVyYXNlclRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gIFpvb21Ub0JveFRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcblxuLyoqIElDb29yZGluYXRlVHJhbnNmb3JtIG92ZXIgdGhlIG5hcGFyaSBjYW1lcmE6IHBvaW50ZXIgY2xpZW50IGNvb3JkcyDihpQgaW1hZ2Uvd29ybGQgY29vcmRzLiAqL1xuY2xhc3MgTmFwYXJpQ29vcmRpbmF0ZVRyYW5zZm9ybSBpbXBsZW1lbnRzIElDb29yZGluYXRlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IHtcbiAgICAgIGNhbnZhc1RvV29ybGQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgcmVhZG9ubHkgY2FtZXJhOiB7IHpvb206IG51bWJlciB9O1xuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkeTogKCkgPT4gYm9vbGVhbixcbiAgKSB7fVxuICBjbGllbnRUb0RhdGEoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG4gIGRhdGFMZW5ndGhUb1NjcmVlbihkYXRhTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRhTGVuZ3RoICogdGhpcy52aWV3ZXIuY2FtZXJhLnpvb207IC8vIENTUyBweCBwZXIgd29ybGQgdW5pdFxuICB9XG4gIGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxufVxuXG4vKiogT3BhcXVlIGhhbmRsZSBmcm9tIHtAbGluayBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5sb2FkfSwgcGFzc2VkIGJhY2sgdG8gcGxvdCgpLiAqL1xuaW50ZXJmYWNlIE5hcGFyaUxvYWRlZCB7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbztcbiAgejogbnVtYmVyO1xuICAvKiogTXVzdCBtYXRjaCBgSUltYWdlSW5mby5maWxlTmFtZWAg4oCUIHRoZSByZW5kZXIgb3JjaGVzdHJhdG9yIGRyb3BzIHRoZSByZXN1bHQgaWYgdGhlXG4gICAqICBoYW5kbGUncyBgZmlsZW5hbWVgIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBpbWFnZSAoZ3VhcmRzIGFnYWluc3Qgc3RhbGUgY2xpY2tzKS4gKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgVk9MVU1FX01BWF9TTElDRSA9IDEwMjQ7IC8vIFwiRnVsbFwiIGluLXBsYW5lIGNhcDsgdGhlIGRlZmF1bHQgwrwgbG9hZCB1c2VzIDI1NlxuLyoqIFJlZmVyZW5jZSBpbi1wbGFuZSB3b3JsZCBzaXplIChsb25nIHNpZGUpIGZvciB0aGUgdm9sdW1lL2F4ZXMgYm94LCBpbiBhcmJpdHJhcnkgd29ybGQgdW5pdHMuXG4gKiAgVGhlIGJveCBpcyBhbmNob3JlZCB0byB0aGlzIHJlZmVyZW5jZSByZWdhcmRsZXNzIG9mIHRoZSBjaG9zZW4gZGVjaW1hdGUgZmFjdG9yLCBzbyBjaGFuZ2luZyB0aGVcbiAqICByZXNvbHV0aW9uIGNoYW5nZXMgREVUQUlMLCBub3QgdGhlIHZvbHVtZSdzIHByb3BvcnRpb25zIChaIG5vIGxvbmdlciBhcHBlYXJzIHRvIHNocmluayB3aGVuIHRoZVxuICogIGluLXBsYW5lIHNhbXBsaW5nIGdyb3dzKS4gU2V0IHRvIHRoZSBERUZBVUxUIGRlY2ltYXRlJ3MgaW4tcGxhbmUgY2FwIHNvIHRoZSBkZWZhdWx0IHZpZXcgaXNcbiAqICB1bmNoYW5nZWQ7IGhpZ2hlci9sb3dlciByZXNvbHV0aW9ucyBrZWVwIHRoYXQgc2FtZSBzaGFwZS4gU2VlIHtAbGluayBtb3VudFZvbHVtZX0uICovXG5jb25zdCBWT0xVTUVfV09STERfSU5QTEFORV9SRUYgPSBWT0xVTUVfTUFYX1NMSUNFIC8gTkFQQVJJX0RFRkFVTFRfREVDSU1BVEU7XG4vKiogTWF4IGNvbmN1cnJlbnQgc2xpY2UgZmV0Y2hlcyB3aGVuIGFzc2VtYmxpbmcgYSB2b2x1bWUg4oCUIGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgYnVzeVxuICogIHdpdGhvdXQgZmxvb2RpbmcgaXQgKGJyb3dzZXJzIGNhcCB+Ni9ob3N0KSBvbiBhIGRlZXAgc3RhY2suICovXG5jb25zdCBWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA4O1xuXG4vKiogVm9sdW1lL2lzb3N1cmZhY2Ugc2FtcGxpbmcgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWAgKDEgPSBGdWxsIDEwMjQsIDIgPSDCvSA1MTIsIDQgPSDCvCAyNTZcbiAqICBkZWZhdWx0LCA4ID0g4oWbIDEyOCk6IHRoZSBpbi1wbGFuZSBjYXAgaGFsdmVzIGVhY2ggc3RlcDsgc2xpY2VzIHN0YXkgdW4tc3Vic2FtcGxlZCB1bnRpbCDihZssIHRoZW5cbiAqICBzdWJzYW1wbGUuICovXG5mdW5jdGlvbiB2b2x1bWVSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heFNsaWNlOiBudW1iZXI7IHNsaWNlU3RlcDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4ge1xuICAgIG1heFNsaWNlOiBNYXRoLm1heCg4LCBNYXRoLnJvdW5kKFZPTFVNRV9NQVhfU0xJQ0UgLyBzKSksXG4gICAgc2xpY2VTdGVwOiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMgLyA0KSksXG4gIH07XG59XG4vKiogRnVsbHktbm9ybWFsaXplZCBpbnRlbnNpdHkgaGVpZ2h0IGFzIGEgZnJhY3Rpb24gb2YgdGhlIGluLXBsYW5lIGV4dGVudCDigJQgbWF0Y2hlcyB0aGUgUGxvdGx5XG4gKiAgU1VSRkFDRSB6LWFzcGVjdCAofjAuNCkgc28gdGhlIHJlbGllZiBpc24ndCBleGFnZ2VyYXRlZC4gKi9cbmNvbnN0IFNVUkZBQ0VfWl9BU1BFQ1QgPSAwLjQ7XG4vKiogXCJGdWxsXCIgbWVzaCBncmlkIGNhcDsgdGhlIGRlY2ltYXRlIGZhY3RvciBkaXZpZGVzIGl0IChkZWZhdWx0IMK8IOKGkiAyMjAsIMK9IOKGkiA0NDAsIEZ1bGwg4oaSIDg4MCkuICovXG5jb25zdCBTVVJGQUNFX01BWF9HUklEID0gODgwO1xuLyoqIENvZWZmaWNpZW50IHNjYWxpbmcgdGhlIHB5cmFtaWQgdGlsZSBidWRnZXQgd2l0aCB0aGUgdGFyZ2V0IHJlc29sdXRpb24g4oCUIGEgaGlnaGVyIHRhcmdldCBwdWxscyBhXG4gKiAgZmluZXIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCArIHZvbHVtZSBhc3NlbWJseS4gKi9cbmNvbnN0IFNUSVRDSF9CVURHRVRfQ09FRkYgPSAxNjtcbi8qKiBTdXJmYWNlIG1lc2ggdGFyZ2V0IGdyaWQgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWA6IHRoZSBncmlkIGNhcCBzaHJpbmtzIGJ5IGBzY2FsZWAgKGV2ZXJ5XG4gKiAgc2xpY2UgaXMga2VwdCDigJQgdGhlIHotc2xpZGVyIG5lZWRzIHRoZW0gYWxsKS4gVGhlIHNvdXJjZSBpcyBmZXRjaGVkIGF0IGEgbWF0Y2hpbmcgcmVzb2x1dGlvbi4gKi9cbmZ1bmN0aW9uIHN1cmZhY2VSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heEdyaWQ6IG51bWJlciB9IHtcbiAgY29uc3QgcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgcmV0dXJuIHsgbWF4R3JpZDogTWF0aC5tYXgoMTYsIE1hdGgucm91bmQoU1VSRkFDRV9NQVhfR1JJRCAvIHMpKSB9O1xufVxuXG4vKiogM0Qgc2NhdHRlcjogaW4tcGxhbmUgY2FwIGZvciB0aGUgYXNzZW1ibGVkIHZveGVsIGdyaWQsIGFuZCB0aGUgbWF4IG51bWJlciBvZiBwb2ludHMgZW1pdHRlZFxuICogICh0aGUgZ3JpZCBpcyBmbGF0LXN0cmlkZWQgZG93biB0byB0aGlzKSDigJQga2VlcHMgdGhlIGJpbGxib2FyZCBjb3VudCBpbnRlcmFjdGl2ZS4gKi9cbmNvbnN0IFNDQVRURVIzRF9NQVhfWFkgPSA2NDtcbmNvbnN0IFNDQVRURVIzRF9NQVhfUE9JTlRTID0gMTUwMDAwO1xuXG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7IC8vIHNlcnZlciB0aWxlIGVkZ2UgKG1hdGNoZXMgdGhlIE9TRCBiYWNrZW5kKVxuLyoqIE1heCB0aWxlcyBzdGl0Y2hlZCBmb3Igb25lIGRpc3BsYXllZCBzbGljZSAoNTEycHggdGlsZXMg4oaSIHVwIHRvIH42MTQ0wrIgYXQgZnVsbCByZXMpLiBCZXlvbmRcbiAqICB0aGlzIHdlIHN0ZXAgdG8gYSBjb2Fyc2VyIHB5cmFtaWQgbGV2ZWwgc28gYSBsYXJnZSBpbWFnZSBzdGF5cyB0cmFjdGFibGUuICovXG5jb25zdCBNQVhfU1RJVENIX1RJTEVTID0gMTQ0O1xuLyoqIFdlYkdQVSBkZWZhdWx0IGBtYXhUZXh0dXJlRGltZW5zaW9uMkRgIOKAlCBhIHN0aXRjaGVkIHNsaWNlJ3MgbG9uZ2VzdCBzaWRlIG11c3QgZml0IGEgdGV4dHVyZS4gKi9cbmNvbnN0IE1BWF9URVhUVVJFX0RJTSA9IDgxOTI7XG4vKiogQ29uY3VycmVudCB0aWxlIHJlcXVlc3RzIHBlciBzdGl0Y2hlZCBzbGljZS4gRmlyaW5nIGEgd2hvbGUgZ3JpZCBhdCBvbmNlIChodW5kcmVkcyBvZiByZXF1ZXN0c1xuICogIGZvciBhIGxhcmdlIGxldmVsKSBvdmVyd2hlbG1lZCB0aGUgdGlsZSBzZXJ2ZXIgKDUwNHMpOyBhIHNtYWxsIHBvb2wga2VlcHMgdGhlIHBpcGUgZnVsbCB3aXRob3V0XG4gKiAgZmxvb2RpbmcgaXQg4oCUIGFuZCBzbGljZS1sZXZlbCB3b3JrZXJzIGFscmVhZHkgcnVuIHNldmVyYWwgc3RpdGNoZXMgaW4gcGFyYWxsZWwgb24gdG9wIG9mIHRoaXMuICovXG5jb25zdCBUSUxFX0ZFVENIX0NPTkNVUlJFTkNZID0gNjtcbi8qKiBIb3cgbG9uZyB0byBwb2xsIGAvdGlsZXMvaW5mb2AgKDIwMiB3aGlsZSB0aGUgc2VydmVyIGNhY2hlcyB0aGUgc291cmNlKSBiZWZvcmUgZmFsbGluZyBiYWNrIHRvXG4gKiAgYSBzaW5nbGUgdGlsZS4gR2VuZXJvdXMgbGlrZSB0aGUgT1NEIGJhY2tlbmQg4oCUIGEgY29sZCB3aG9sZS1zbGlkZSBjYW4gdGFrZSBtaW51dGVzIHRvIGNhY2hlLiAqL1xuY29uc3QgREVTQ1JJUFRPUl9USU1FT1VUX01TID0gMTIwMDAwO1xuXG4vKiogRGVmYXVsdCBwZXItY2hhbm5lbCB0aW50cyAoRmlqaS1zdHlsZSkgd2hlbiB0aGUgc3RvcmUvZGVzY3JpcHRvciBvZmZlcnMgbm8gY29sb3VyLiAqL1xuY29uc3QgREVGQVVMVF9USU5UUyA9IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnLCAnI2ZmZmYwMCcsICcjZmYwMGZmJywgJyMwMGZmZmYnLCAnI2ZmZmZmZiddO1xuXG4vKiogRGVmYXVsdCB0aW50IGZvciBhIGNoYW5uZWwgaW5kZXgsIGN5Y2xpbmcgdGhlIEZpamkgcGFsZXR0ZS4gKi9cbmZ1bmN0aW9uIHRpbnRGb3IoY2hhbm5lbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIERFRkFVTFRfVElOVFNbY2hhbm5lbCAlIERFRkFVTFRfVElOVFMubGVuZ3RoXTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AgKHJlcyAwID0gZnVsbCByZXNvbHV0aW9uKS4gKi9cbmludGVyZmFjZSBUaWxlTGV2ZWwge1xuICByZXM6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBTdWJzZXQgb2YgdGhlIGAvdGlsZXMvaW5mb2AgZGVzY3JpcHRvciB0aGlzIGJhY2tlbmQgcmVhZHMgKHRpbGUgZ3JpZCwgY2hhbm5lbHMsIHNjYWxlKS4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgdGhlcmUuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY29sb3I/OiBzdHJpbmc7XG4gICAgYml0RGVwdGg/OiBudW1iZXI7XG4gICAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgICBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIG1wcFg/OiBudW1iZXI7XG4gIG1wcFk/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBXZWJHUFUgaW1hZ2UgYmFja2VuZCBidWlsdCBvbiB0aGUgcHVibGlzaGVkIGBuYXBhcmktanNgIGxpYnJhcnkg4oCUIHRoZSBQT0MgZW5naW5lIGZvclxuICogaml0LXVpIzEwMiAoYSBicm93c2VyLWJhc2VkIG5hcGFyaSBzaGlwcGVkIGFzIGEgSlMgbGlicmFyeSwgc3dhcHBpbmcgaW1hZ2UgcGxvdHRpbmcgd2l0aFxuICogT3BlblNlYWRyYWdvbiBhbmQgM0Qgc2xpY2luZy9pc29zdXJmYWNlcyB3aXRoIFBsb3RseSkuXG4gKlxuICogUmVuZGVyIHN0cmF0ZWd5OiByYXRoZXIgdGhhbiByZS1pbXBsZW1lbnQgdGhlIHNlcnZlcidzIHRpbGUvcHlyYW1pZCBwcm90b2NvbCAod2hpY2ggT1NEXG4gKiBhbHJlYWR5IGhhbmRsZXMpLCB0aGlzIGJhY2tlbmQgcmVuZGVycyB0aGUgKipjb21wbGV0ZSBwZXItc2xpY2UgaW1hZ2UgVVJMcyB0aGUgYXBwIGFscmVhZHlcbiAqIHByb2R1Y2VzKiogKGBJSW1hZ2VJbmZvLnVybHNgKSDigJQgYHVybHNbel1gIGZvciB0aGUgMkQgaW1hZ2UsIGFuZCB0aGUgZnVsbCBgdXJsc2Agc3RhY2tcbiAqIGFzc2VtYmxlZCBpbnRvIGEgZG93bnNhbXBsZWQgdm9sdW1lIGZvciB0aGUgM0QgdHlwZXMuIFJlZ2lvbiBzdGF0ZSBhbmQgZGlzcGxheSBvcHRpb25zXG4gKiBkZWxlZ2F0ZSB0byB0aGUgc2hhcmVkIHtAbGluayBSZWdpb25TdG9yZX0gLyB7QGxpbmsgVmlzdWFsaXplclN0b3JlfSwgZXhhY3RseSBhcyBPU0QgZG9lcy5cbiAqXG4gKiBGb2xsb3ctdXBzIChqaXQtdWkjMTAyKTogbmF0aXZlLXJlc29sdXRpb24gcHlyYW1pZGFsIHRpbGluZywgb24tY2FudmFzIHRvb2xzLCByZWdpb25cbiAqIG92ZXJsYXkgcmVuZGVyaW5nLCBwZXItY2hhbm5lbCBoaXN0b2dyYW1zLCBUSUZGIGV4cG9ydC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSBleHRlbmRzIEJhc2VTdG9yZVZpc3VhbGl6ZXIgaW1wbGVtZW50cyBJVmlzdWFsaXplciB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1xuICAgIFZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5LFxuICAgIFZpZXdlckZlYXR1cmUuU3RhY2tTbGlkZXIsXG4gICAgVmlld2VyRmVhdHVyZS5QaXhlbFJlYWRiYWNrLFxuICAgIFZpZXdlckZlYXR1cmUuU3VyZmFjZTNELFxuICAgIFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZSxcbiAgXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcblxuICBwcml2YXRlIHZpZXdlcjogVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGVkOiBOYXBhcmlMb2FkZWQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyBvd25pbmcgdGhlIDNEIHZvbHVtZSBsYXllcnMgKG9uZSBhZGRpdGl2ZSB0aW50ZWQgbGF5ZXIgcGVyIGNoYW5uZWxcbiAgICogIGZvciBtdWx0aWNoYW5uZWwsIG9yIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiBOdWxsIGluIDJELiAqL1xuICBwcml2YXRlIHZvbHVtZVZpZXc6IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdm9sdW1lIGlzIGNvbXBvc2l0ZWQgZnJvbSBwZXItY2hhbm5lbCBsYXllcnMgKHZzIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiAqL1xuICBwcml2YXRlIHZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGhlaWdodC1maWVsZCBzdXJmYWNlIG1lc2ggKE5BUEFSSV9TVVJGQUNFIHBsb3QgdHlwZTsgbnVsbCBvdGhlcndpc2UpLiBCdWlsdCBmcm9tIGFcbiAgICogIHNpbmdsZSBncmF5c2NhbGUgc2xpY2UgYnkge0BsaW5rIGJ1aWxkU3VyZmFjZX0gdmlhIG5hcGFyaS1qcydzIGBoZWlnaHRGaWVsZGAgKyBgYWRkU3VyZmFjZWAuICovXG4gIHByaXZhdGUgc3VyZmFjZUxheWVyOiBTdXJmYWNlTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoaWNoIGJhbmQgdGhlIHN1cmZhY2Ugc2FtcGxlcyAoYSBjaGFubmVsIGluZGV4IGZvciBtdWx0aWNoYW5uZWwsIGVsc2UgdGhlIGNvbXBvc2l0ZSkuICovXG4gIHByaXZhdGUgc3VyZmFjZUNoYW5uZWw6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgbW91bnRlZCBTdXJmYWNlIGZvbGxvd3Mgb25lIGJhbmQgb2YgYSBtdWx0aWNoYW5uZWwgaW1hZ2UuICovXG4gIHByaXZhdGUgc3VyZmFjZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogUHJlLWxvYWRlZCBwZXItc2xpY2UgbHVtaW5hbmNlIHBsYW5lcyAoYWxyZWFkeSBkZWNpbWF0ZWQgdG8gdGhlIHN1cmZhY2UgZ3JpZCksIGtleWVkIGJ5IHosXG4gICAqICBzbyB0aGUgc3RhY2sgc2xpZGVyIHJlYnVpbGRzIHRoZSBzdXJmYWNlIGluc3RhbnRseS4gRmlsbGVkIGJ5IHtAbGluayBwcmVsb2FkU3VyZmFjZVBsYW5lc30uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VyZmFjZVBsYW5lcyA9IG5ldyBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICA+KCk7XG4gIC8qKiBJbi1wbGFuZSBncmlkIGNhcCBmb3IgdGhlIGFjdGl2ZSBzdXJmYWNlIGxvYWQgKGZ1bGwgZ3JpZCDDtyB0aGUgZGVjaW1hdGUgZmFjdG9yKS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlTWF4R3JpZCA9IFNVUkZBQ0VfTUFYX0dSSUQ7XG4gIC8qKiBDb250cmFzdCB3aW5kb3cgW21pbixtYXhdIHRoZSBjdXJyZW50IHN1cmZhY2UgbWVzaCB3YXMgYnVpbHQgd2l0aC4gQSBjaGFuZ2UgcmVzaGFwZXMgdGhlXG4gICAqICBtZXNoIChwaXhlbCBoZWlnaHQgPSBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGl0IHRyaWdnZXJzIGEgZ2VvbWV0cnkgcmVidWlsZC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlV2luZG93OiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQZXJzaXN0ZWQgd2lyZWZyYW1lIGNob2ljZSBmb3IgdGhlIHN1cmZhY2UgKHJlLWFwcGxpZWQgd2hlbiBhIG5ldyBzdXJmYWNlIG1vdW50cykuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpcmVmcmFtZSA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIDJEIHNjYXR0ZXIgcG9pbnRzIChyZWdpb24gY2VudHJvaWRzKSArIGl0cyByZWdpb24tY2hhbmdlIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyMmRQb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhdHRlclJlZ2lvblN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBuYXBhcmktanMgM0Qgc2NhdHRlciAodm94ZWwgcG9pbnQgY2xvdWQpLiAqL1xuICBwcml2YXRlIHNjYXR0ZXIzZExheWVyOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBNb25vdG9uaWMgbG9hZCBnZW5lcmF0aW9uLiBCdW1wZWQgYnkge0BsaW5rIHJlc2V0fSBhbmQge0BsaW5rIGNhbmNlbExvYWRpbmd9OyB0aGUgZnJhbWUtbG9hZGluZ1xuICAgKiAgbG9vcHMgKHZvbHVtZSBhc3NlbWJseSwgc3VyZmFjZSBwcmVsb2FkKSBjYXB0dXJlIGl0IGFuZCBiYWlsIHdoZW4gaXQgY2hhbmdlcywgc28gYSBDYW5jZWwgKG9yIGFcbiAgICogIG5ldyBwbG90KSBhY3R1YWxseSBzdG9wcyBmZXRjaGluZyBmcmFtZXMgaW5zdGVhZCBvZiBydW5uaW5nIHRvIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgbG9hZFRva2VuID0gMDtcbiAgLyoqIERlY2ltYXRlIGZhY3RvciBmb3IgdGhlIG5hcGFyaSAzRCB0eXBlcyAoMSA9IEZ1bGwsIDIgPSDCvSBkZWZhdWx0LCA0ID0gwrwsIDggPSDihZspLiBBcHBsaWVkIHdoZW4gYVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZSAocmUpbG9hZHM7IGNoYW5naW5nIGl0IG5lZWRzIGEgcmUtcGxvdCAoaXQgY2hhbmdlcyBmZXRjaGVkIGRhdGEpLiAqL1xuICBwcml2YXRlIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuICAvKiogM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZSB2aWV3IChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGF5ZXI6IEF4ZXNMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogRE9NIFgvWS9aICsgc2NhbGUgbGFiZWxzIHRyYWNraW5nIHRoZSAzRCBheGVzIGdpem1vIChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGFiZWxzOiBOYXBhcmlBeGVzTGFiZWxzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEcmFnZ2FibGUgWi1oZWlnaHQgZ3JpcCBvdmVyIHRoZSB2b2x1bWUgKG51bGwgdW5sZXNzIGEgdm9sdW1lL2lzb3N1cmZhY2UgaXMgbW91bnRlZCkuICovXG4gIHByaXZhdGUgekhhbmRsZTogTmFwYXJpVm9sdW1lWkhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAvKiogVXNlciBaLWhlaWdodCBmYWN0b3IgZm9yIHRoZSB2b2x1bWUgKDEgPSB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyk7IGRyaXZlbiBieSB0aGVcbiAgICogIGluLXZpZXcgZHJhZyBoYW5kbGUuIFJlc2V0IHBlciBtb3VudC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVaU2NhbGUgPSAxO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBgdm9sdW1lWlNjYWxlID0gMWAgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGVcbiAgICogIHRoZSBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVXb3JsZEJhc2U6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvbHVtZVNhbXBsZWREZXB0aCA9IDE7XG4gIC8qKiBQZXJzaXN0ZWQgYXhlcyBvbi9vZmYgY2hvaWNlLCByZS1hcHBsaWVkIHdoZW4gYSBuZXcgdm9sdW1lIG1vdW50cy4gRGVmYXVsdHMgb24uICovXG4gIHByaXZhdGUgYXhlc1Zpc2libGUgPSB0cnVlO1xuICBwcml2YXRlIHZvbHVtZURpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZUNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgaW1hZ2VXID0gMDtcbiAgcHJpdmF0ZSBpbWFnZUggPSAwO1xuICAvKiogTW9ub3RvbmljIHNsaWNlLXJlcXVlc3QgaWQgc28gYSBzbG93IG91dC1vZi1vcmRlciBzbGljZSBmZXRjaCBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLiAqL1xuICBwcml2YXRlIHNsaWNlUmVxID0gMDtcbiAgLyoqIENhY2hlZCBgL3RpbGVzL2luZm9gIHB5cmFtaWQgZGVzY3JpcHRvciArIHRoZSBpbmZvQjY0IGl0IHdhcyBmZXRjaGVkIGZvci4gKi9cbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3JLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgMkQgaW1hZ2UgaXMgY29tcG9zaXRlZCAoZHJpdmVzIGhpc3RvZ3JhbSArIHN0YXRlIGFwcGxpY2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZU1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJyA9ICdyZ2InO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyB0aGF0IG93bnMgdGhlIHBlci1jaGFubmVsIGxheWVyIHNldCAoYnVpbGQgKyBsaXZlIGRpc3BsYXlcbiAgICogIHVwZGF0ZXMpIGZvciB0aGUgY3VycmVudCB7QGxpbmsgaW1hZ2VNb2RlfS4gUmVidWlsdCBvbiBlYWNoIChyZSlyZW5kZXIuICovXG4gIHByaXZhdGUgY2hhbm5lbFZpZXc6IE11bHRpQ2hhbm5lbEltYWdlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogTGl2ZSBzdWJzY3JpcHRpb24gYXBwbHlpbmcgY2hhbm5lbC1zdGF0ZSAvIGNvbG9ybWFwIGNoYW5nZXMgdG8gdGhlIGxheWVycy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBncmF5c2NhbGUgY29sb3JtYXAgc2VsZWN0aW9uIGZyb20gdGhlIHN0b3JlIChhcHBsaWVkIHRvIHRoZSBzaW5nbGUgZ3JheSBsYXllcikuICovXG4gIHByaXZhdGUgY3VycmVudENvbG9ybWFwOiBDb2xvcm1hcE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UmV2ZXJzZSA9IGZhbHNlO1xuICAvKiogTGF0ZXN0IGludmVydCB0b2dnbGUgZnJvbSB0aGUgc3RvcmUgKGZsaXBzIGludGVuc2l0eSBiZWZvcmUgdGhlIGNvbG9ybWFwLCBsaWtlIE9TRCkuICovXG4gIHByaXZhdGUgaW52ZXJ0RW5hYmxlZCA9IGZhbHNlO1xuICAvKiogUGh5c2ljYWwgc2NhbGUgYmFyIG92ZXJsYXkgZm9yIHRoZSAyRCBpbWFnZSAobnVsbCB3aGVuIDNEIG9yIHRoZSBpbWFnZSBoYXMgbm8gwrVtL3BpeGVsKS4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcjogTmFwYXJpU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgdW50aWwgYSAyRCBpbWFnZSBpcyBwbG90dGVkKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25PdmVybGF5OiBOYXBhcmlSZWdpb25PdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQaXhlbC10b29sIHBsdW1iaW5nOiB0aGUgcGxvdCBkaXYgaWQsIGNvb3JkIHRyYW5zZm9ybSwgYW5kIGJvdW5kIHRvb2wgaG9zdHMuICovXG4gIHByaXZhdGUgcGxvdERpdklkID0gJyc7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3Q6IFdhbmRUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVyYXNlckhvc3Q6IFZlcnRleEVyYXNlclRvb2xIb3N0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWaXNpYmxlIHdvcmxkIHJlY3QgY2FwdHVyZWQgQVQgdGhlIGxhc3QgcmVhZGJhY2sg4oCUIG11c3QgcGFpciB3aXRoIGBsYXN0UGl4ZWxzYCBzbyB0aGUgcGl4ZWxcbiAgICogIHRvb2xzJyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZSBtYXRyaXgncyBjYW1lcmEgKHVzaW5nIHRoZSBsaXZlIHJlY3QgYWZ0ZXIgYSBwYW4vem9vbSB3b3VsZFxuICAgKiAgbWlzLXNjYWxlIHRoZSByZWdpb24pLiAqL1xuICBwcml2YXRlIGxhc3RQaXhlbHNSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKSB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzLCB0aGUgZGVmYXVsdCkuICovXG4gIHByaXZhdGUgaW1hZ2VTbW9vdGhpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hlbiB0aGUgMkQgaW1hZ2UgaXMgcmVuZGVyZWQgdmlhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZXMgKGRlc2NyaXB0b3IgYXZhaWxhYmxlKS4gKi9cbiAgcHJpdmF0ZSB0aWxlZCA9IGZhbHNlO1xuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIHRpbWVyICsgY2FtZXJhLWNoYW5nZSB1bnN1YnNjcmliZSAoa2VlcCBsYXN0UGl4ZWxzIGN1cnJlbnQgZm9yIHRvb2xzKS4gKi9cbiAgcHJpdmF0ZSByZWFkYmFja1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYVJlYWRiYWNrT2ZmOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqIENvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIChrZXllZCBieSBjaGFubmVsIGluZGV4KSBmb3IgdGhlIGhpc3RvZ3JhbSBpbiB0aWxlZCBtb2RlLFxuICAgKiAgd2hlcmUgdGhlIGxheWVycyBoYXZlIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscy4gUmVmcmVzaGVkIG9uIHBsb3QgKyBzbGljZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdFNhbXBsZXMgPSBuZXcgTWFwPG51bWJlciwgVWludDhBcnJheT4oKTtcbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtcyBmcm9tIGAvaGlzdG9ncmFtYCwga2V5ZWQgYCR7en18JHtjaGFubmVsfWAgKD44LWJpdCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSByZWFkb25seSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJhc2VyVG9vbDogVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCArIGNhY2hlIHRoZSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIChgR0VUIC90aWxlcy9pbmZvYCk6IHRoZSBSRUFMIHBlci1sZXZlbCB0aWxlIGdyaWQsXG4gICAqIHRpbGUgc2l6ZSwgY2hhbm5lbCBtZXRhZGF0YSBhbmQgcGh5c2ljYWwgcGl4ZWwgc2l6ZS4gVGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZVxuICAgKiBpcyBzdGlsbCBjYWNoaW5nLCBzbyB3ZSBwb2xsIGJyaWVmbHkuIENhY2hlZCBwZXIgYGluZm9CNjRgOyByZXR1cm5zIG51bGwgaWYgaXQgbmV2ZXIgYmVjb21lc1xuICAgKiByZWFkeSAoY2FsbGVycyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUtdGlsZSBmZXRjaCkuIFRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgZ3JpZCDigJQgZ3Vlc3NpbmdcbiAgICogbGV2ZWwgZGltcyBmcm9tIGB0cnVlSW1hZ2VTaXplYCBvdmVyc2hvb3RzIHRoZSByZWFsIGdyaWQgYW5kIHRoZSBzZXJ2ZXIgNDAwcyBvdXQtb2YtcmFuZ2UgdGlsZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlc2NyaXB0b3IoKTogUHJvbWlzZTxUaWxlRGVzY3JpcHRvciB8IG51bGw+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAobm8gdGlsZSBzZXJ2ZXIg4oCUIGUuZy4gYSBudW1iZXJlZCBpbWFnZVxuICAgIC8vIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsIGVhY2ggc2xpY2UgYSBkaWZmZXJlbnQgZmlsZSk6IHRoZXJlIGlzIG5vXG4gICAgLy8gc2luZ2xlIHNlcnZlci10aWxlZCBweXJhbWlkIHRvIGRlc2NyaWJlLiBSZXR1cm5pbmcgbnVsbCByb3V0ZXMgZXZlcnlcbiAgICAvLyBjYWxsZXIgKDJEIGltYWdlLCB2b2x1bWUsIHN1cmZhY2UpIHRvIHRoZWlyIHN0aXRjaGVkL3NpbmdsZS1mZXRjaFxuICAgIC8vIGZhbGxiYWNrLCB3aGljaCDigJQgdmlhIGZldGNoU2xpY2UncyBvd24gU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIGJyYW5jaCDigJRcbiAgICAvLyBjb3JyZWN0bHkgZmV0Y2hlcyBlYWNoIHNsaWNlJ3Mgb3duIFVSTCBpbnN0ZWFkIG9mIG9uZSBmaXhlZCBmaWxlJ3MgdGlsZVxuICAgIC8vIHB5cmFtaWQuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUodGhpcy5sb2FkZWQ/LmltYWdlSW5mbykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmRlc2NyaXB0b3JLZXkgPT09IGluZm9CNjQpIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgREVTQ1JJUFRPUl9USU1FT1VUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3AuanNvbigpKSBhcyBUaWxlRGVzY3JpcHRvcjtcbiAgICAgICAgICBpZiAoYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGJvZHk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3JLZXkgPSBpbmZvQjY0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgZW1wdHkgYm9keSDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRpbGVzL2luZm8gbm90IHJlYWR5OyBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlLXRpbGUgZmV0Y2gnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMjAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgQ09NUExFVEUgcmVuZGVyZWQgc2xpY2UgYXMgYW4gYEltYWdlQml0bWFwYCBieSBzdGl0Y2hpbmcgdGhlIHNlcnZlcidzIFJFQUwgdGlsZSBncmlkXG4gICAqIChmcm9tIGAvdGlsZXMvaW5mb2ApIOKAlCBub3QganVzdCB0aGUgdG9wLWxlZnQgdGlsZSwgd2hpY2ggb25seSBldmVyIHNob3dlZCBhIGxhcmdlIGltYWdlJ3NcbiAgICogY29ybmVyLiBQaWNrcyB0aGUgZmluZXN0IHB5cmFtaWQgbGV2ZWwgd2hvc2UgZ3JpZCBmaXRzIGBidWRnZXRUaWxlc2AgYW5kIHdob3NlIGxvbmdlc3Qgc2lkZSBpc1xuICAgKiB3aXRoaW4gdGhlIEdQVSB0ZXh0dXJlIGxpbWl0LCBmZXRjaGVzIHRoYXQgZ3JpZCBjb25jdXJyZW50bHksIGFuZCBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMuXG4gICAqXG4gICAqIGBjaGFubmVsYCBzZWxlY3RzIGEgc2luZ2xlIGJhbmQgYXMgZ3JheXNjYWxlIChyZWFsIGxldmVscyBvbmx5KTsgb21pdCBmb3IgdGhlIHNlcnZlciBjb21wb3NpdGUuXG4gICAqIGBidWRnZXRUaWxlc2AgY2FwcyB0aGUgZ3JpZDogdGhlIDJEIHZpZXcgdXNlcyB0aGUgZnVsbCBidWRnZXQgZm9yIGRldGFpbDsgdGhlIDNEIHZvbHVtZSBwYXNzZXNcbiAgICogMSBmb3IgYSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBzbGljZSAoaXQgZG93bnNhbXBsZXMgdG8ge0BsaW5rIFZPTFVNRV9NQVhfU0xJQ0V9KS4gRmFsbHMgYmFja1xuICAgKiB0byBhIHNpbmdsZSBgY29sPTAscm93PTBgIHRpbGUgd2hlbiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSAoc21hbGwvc2ltcGxlIGltYWdlcywgdm9sdW1lcykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU2xpY2UoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM6IG51bWJlciA9IE1BWF9TVElUQ0hfVElMRVMsXG4gICAgLyoqIFdoZW4gYSBzcGVjaWZpYyBjaGFubmVsIGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiBgYnVkZ2V0VGlsZXNgLCBkcm9wIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiAgQ09NUE9TSVRFIG92ZXJ2aWV3IGluc3RlYWQgb2Ygc3RpdGNoaW5nIHRoZSBodWdlIHBlci1jaGFubmVsIGxldmVsLiBPbmx5IHNhZmUgd2hlbiB0aGUgY2FsbGVyXG4gICAgICogIHdhbnRzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSAodGhlIHN1cmZhY2UgaGVpZ2h0KTogZm9yIGEgbXVsdGljaGFubmVsIFZPTFVNRSBldmVyeSBjaGFubmVsXG4gICAgICogIHdvdWxkIHRoZW4gZmV0Y2ggdGhlIHNhbWUgY29tcG9zaXRlIGFuZCB0aGUgY2hhbm5lbHMgd291bGQgY29sbGFwc2UgaW50byBvbmUsIHNvIHZvbHVtZVxuICAgICAqICBhc3NlbWJseSBsZWF2ZXMgdGhpcyBgZmFsc2VgIHRvIGtlZXAgZWFjaCBiYW5kIGRpc3RpbmN0LiAqL1xuICAgIGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxJbWFnZUJpdG1hcD4ge1xuICAgIC8vIFNlbGYtY29udGFpbmVkIG11bHRpLXNsaWNlIHN0YWNrICh0aWxlZDpmYWxzZSk6IGB6YCBpbmRleGVzIGEgY29tcGxldGVseVxuICAgIC8vIGRpZmZlcmVudCBmaWxlJ3Mgb3duIHByZXZpZXcgVVJMLCBub3QgYW4gaW50ZXJuYWwgc2xpY2Ugb2Ygb25lIHNlcnZlci1cbiAgICAvLyB0aWxlZCBmaWxlIOKAlCByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChzaGFyZWRcbiAgICAvLyB3aXRoIE9TRDsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIGJhcmUgZmV0Y2goKSkgaW5zdGVhZCBvZlxuICAgIC8vIGJ1aWxkaW5nIGEgL3RpbGU/aW5mbz0uLi4mej0gcmVxdWVzdCBhZ2FpbnN0IHdoaWNoZXZlciBzaW5nbGUgZmlsZVxuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCgpIHBvaW50cyBhdCAod2hpY2ggd291bGQgNDAwL21pc21hdGNoIGZvciBhbnkgelxuICAgIC8vIGJleW9uZCB0aGF0IG9uZSBmaWxlJ3Mgb3duIGV4dGVudCkuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykpIHtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHZvbHVtZTogZmV0Y2ggdGhlIHJlcXVlc3RlZCBjaGFubmVsJ3MgT1dOIHBsYW5lXG4gICAgICAvLyAoY2hhbm5lbFVybHNbel1bY2hhbm5lbF0pIHNvIGVhY2ggYmFuZCBzdGF5cyBkaXN0aW5jdCDigJQgdGhlIGNsaWVudC1zaWRlXG4gICAgICAvLyBhbmFsb2cgb2YgdGhlIHNlcnZlcidzIHBlci1jaGFubmVsIC90aWxlP2NoYW5uZWw9Yy4gRWxzZSB0aGUgei1hbmNob3IgVVJMLlxuICAgICAgY29uc3QgY2hVcmxzID0gKGluZm8gYXMgSUltYWdlSW5mbykuY2hhbm5lbFVybHM7XG4gICAgICBjb25zdCB1cmwgPSBjaGFubmVsICE9IG51bGwgJiYgY2hVcmxzPy5bel0/LltjaGFubmVsXSAhPSBudWxsXG4gICAgICAgID8gY2hVcmxzW3pdW2NoYW5uZWxdXG4gICAgICAgIDogdGhpcy5zaW1wbGVTdGFjay51cmxGb3IoaW5mbyBhcyBJSW1hZ2VJbmZvLCB6KTtcbiAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIG5vIFVSTCBmb3Igc2xpY2UgJHt6fWApO1xuICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0JpdG1hcCh1cmwpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gbm8gc2VsZWN0ZWQgaW1hZ2UgaW5mbyAoZ2V0U2VsZWN0ZWRJbmZvQjY0IG51bGwpJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG5cbiAgICAvLyBUaGUgcmVxdWVzdGVkIGJhbmQ7IG1heSBiZSBkcm9wcGVkIHRvIHRoZSBjb21wb3NpdGUgKHVuZGVmaW5lZCkgYmVsb3cgd2hlbiB0aGUgY2hhbm5lbCBoYXMgbm9cbiAgICAvLyBweXJhbWlkIGxldmVsIHNtYWxsIGVub3VnaCB0byBzdGl0Y2ggd2l0aGluIGJ1ZGdldC5cbiAgICBsZXQgZWZmZWN0aXZlQ2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgY29uc3QgZmV0Y2hUaWxlID0gYXN5bmMgKFxuICAgICAgcmVzOiBudW1iZXIsXG4gICAgICBjb2w6IG51bWJlcixcbiAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgdDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+ID0+IHtcbiAgICAgIGNvbnN0IGNoID0gZWZmZWN0aXZlQ2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtlZmZlY3RpdmVDaGFubmVsfWA7XG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2NvbH0mcm93PSR7cm93fSZ6PSR7en0mdGlsZVNpemU9JHt0fSR7Y2h9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHNsaWNlIGZldGNoIGZhaWxlZDogJHtyZXNwLnN0YXR1c30gKCR7Y29sfS8ke3Jvd30gcmVzICR7cmVzfSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgfTtcblxuICAgIC8vIE5vIGRlc2NyaXB0b3Ig4oaSIHNpbmdsZSB0b3AtbGVmdCB0aWxlIChsZWdhY3kgZmFsbGJhY2s7IGNvcnJlY3QgZm9yIHNtYWxsL3NpbXBsZSBpbWFnZXMpLlxuICAgIGlmICghZGVzYyB8fCAhZGVzYy5sZXZlbHM/Lmxlbmd0aCkgcmV0dXJuIGZldGNoVGlsZSgwLCAwLCAwLCBUSUxFX1NJWkUpO1xuXG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IE9OTFkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHMgKHRoZSBmcm9udCBvZiBgbGV2ZWxzYCk7IHRoZSBzZXJ2ZXJcbiAgICAvLyBjb21wb3NpdGUgZXhpc3RzIGF0IGV2ZXJ5IGxldmVsLCBpbmNsdWRpbmcgdGhlIHNtYWxsIG92ZXJ2aWV3cy5cbiAgICBjb25zdCBwZXJDaGFubmVsTGV2ZWxzID0gZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsID8gZGVzYy5sZXZlbHMgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBwZXJDaGFubmVsTGV2ZWxzKSk7XG5cbiAgICAvLyBGaW5lc3QgbGV2ZWwgd2hvc2Ugc3RpdGNoZWQgZ3JpZCBmaXRzIEJPVEggdGhlIHRpbGUgYnVkZ2V0IGFuZCB0aGUgR1BVIHRleHR1cmUgbGltaXQ7IGlmIG5vbmVcbiAgICAvLyBmaXRzLCB0aGUgY29hcnNlc3QgYXZhaWxhYmxlIChmaXRzPWZhbHNlKS5cbiAgICBjb25zdCB0aWxlc0ZvciA9IChsdmw6IFRpbGVMZXZlbCk6IG51bWJlciA9PlxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpKSAqIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwuaGVpZ2h0IC8gdCkpO1xuICAgIGNvbnN0IHBpY2sgPSAobGV2ZWxzOiBUaWxlTGV2ZWxbXSk6IHsgbHZsOiBUaWxlTGV2ZWw7IGZpdHM6IGJvb2xlYW4gfSA9PiB7XG4gICAgICBsZXQgYyA9IGxldmVsc1swXTtcbiAgICAgIGZvciAoY29uc3QgbHZsIG9mIGxldmVscykge1xuICAgICAgICBjID0gbHZsO1xuICAgICAgICBpZiAodGlsZXNGb3IobHZsKSA8PSBidWRnZXRUaWxlcyAmJiBNYXRoLm1heChsdmwud2lkdGgsIGx2bC5oZWlnaHQpIDw9IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgICAgIHJldHVybiB7IGx2bCwgZml0czogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBsdmw6IGMsIGZpdHM6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCBzZWwgPSBwaWNrKHVzYWJsZSk7XG4gICAgLy8gQSBzcGVjaWZpYyBjaGFubmVsIG9ubHkgaGFzIHRpbGVzIGF0IHRoZSAoZmV3LCBsYXJnZSkgcmVhbCBsZXZlbHMuIFdoZW4gbm9uZSBvZiB0aGVtIGZpdCB0aGVcbiAgICAvLyBidWRnZXQg4oCUIGUuZy4gdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXMgc3RpbGwgMTQ5ODLDlzE4NjcwIOKGkiB+MTEwMCBmdWxsLXJlcyB0aWxlcyDigJQgc3RpdGNoaW5nXG4gICAgLy8gaXQgcGVyIHNsaWNlIGZsb29kcyB0aGUgc2VydmVyICg1MDRzKSBhbmQgc3RhbGxzIHRoZSBsb2FkLiBUaGUgY29tcG9zaXRlIHB5cmFtaWQgaGFzIHNtYWxsXG4gICAgLy8gb3ZlcnZpZXcgbGV2ZWxzLCBzbyBmZXRjaCB0aGUgY29tcG9zaXRlIGluc3RlYWQgYW5kIGRlcml2ZSBsdW1pbmFuY2UgZnJvbSBpdC4gRXZlcnkgY2FsbGVyIGhlcmVcbiAgICAvLyAoc3VyZmFjZSBoZWlnaHQsIHZvbHVtZSBhc3NlbWJseSwgcmVhZGJhY2spIGRvd25zY2FsZXMgdGhlIHBsYW5lIGFueXdheSwgc28gYSBjb21wb3NpdGUtZGVyaXZlZFxuICAgIC8vIHBsYW5lIGlzIHRoZSByaWdodCB0cmFkZSBmb3Igb25lIHRoYXQgYWN0dWFsbHkgbG9hZHMuIE9ubHkga2lja3MgaW4gd2hlbiB0aGUgY2hhbm5lbCBjYW4ndCBmaXQuXG4gICAgaWYgKGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgJiYgIXNlbC5maXRzICYmIGNoYW5uZWwgIT0gbnVsbCAmJiBkZXNjLmxldmVscy5sZW5ndGggPiBwZXJDaGFubmVsTGV2ZWxzKSB7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBwaWNrKGRlc2MubGV2ZWxzKTtcbiAgICAgIGlmIChjb21wb3NpdGUuZml0cyB8fCB0aWxlc0Zvcihjb21wb3NpdGUubHZsKSA8IHRpbGVzRm9yKHNlbC5sdmwpKSB7XG4gICAgICAgIGVmZmVjdGl2ZUNoYW5uZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNlbCA9IGNvbXBvc2l0ZTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbbmFwYXJpLWpzXSBjaGFubmVsICR7Y2hhbm5lbH0gaGFzIG5vIHB5cmFtaWQgbGV2ZWwgd2l0aGluIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlIGAgK1xuICAgICAgICAgICAgYGJ1ZGdldDsgdXNpbmcgdGhlIGNvbXBvc2l0ZSBvdmVydmlldyAocmVzICR7c2VsLmx2bC5yZXN9LCAke3NlbC5sdmwud2lkdGh9w5dgICtcbiAgICAgICAgICAgIGAke3NlbC5sdmwuaGVpZ2h0fSkgZm9yIHRoaXMgcGxhbmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2hvc2VuID0gc2VsLmx2bDtcbiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi53aWR0aCAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi5oZWlnaHQgLyB0KSk7XG4gICAgaWYgKCFzZWwuZml0cyAmJiBidWRnZXRUaWxlcyA9PT0gTUFYX1NUSVRDSF9USUxFUykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gZnVsbCByZXNvbHV0aW9uIGV4Y2VlZHMgdGhlICR7YnVkZ2V0VGlsZXN9LXRpbGUvJHtNQVhfVEVYVFVSRV9ESU19cHggYnVkZ2V0OyBgICtcbiAgICAgICAgICBgZGlzcGxheWluZyBvdmVydmlldyBsZXZlbCByZXMgJHtjaG9zZW4ucmVzfSAoJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9KS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29scyA9PT0gMSAmJiByb3dzID09PSAxKSByZXR1cm4gZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIDAsIDAsIHQpO1xuXG4gICAgLy8gU3RpdGNoIGludG8gb25lIGxldmVsLXNpemVkIGNhbnZhcy4gRmV0Y2ggdGhlIGdyaWQgd2l0aCBCT1VOREVEIGNvbmN1cnJlbmN5OiBmaXJpbmcgZXZlcnkgdGlsZVxuICAgIC8vIGF0IG9uY2UgKGEgYmlnIGdyaWQgPSBodW5kcmVkcyBvZiByZXF1ZXN0cykgb3ZlcndoZWxtZWQgdGhlIHRpbGUgc2VydmVyICg1MDRzKS4gRWRnZSB0aWxlcyBhcmVcbiAgICAvLyBuYXJyb3dlci9zaG9ydGVyOyBkcmF3SW1hZ2UgcGxhY2VzIGVhY2ggYXQgaXRzIGdyaWQgb2Zmc2V0IHNvIHBhcnRpYWwgdGlsZXMgbGluZSB1cC5cbiAgICBjb25zdCBjb29yZHM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaCh7IGNvbCwgcm93IH0pO1xuICAgIH1cbiAgICBjb25zdCB0aWxlczogQXJyYXk8eyBjb2w6IG51bWJlcjsgcm93OiBudW1iZXI7IGJtcDogSW1hZ2VCaXRtYXAgfT4gPSBbXTtcbiAgICBjb25zdCBzdGl0Y2hXb3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGpvYiA9IGNvb3Jkcy5zaGlmdCgpO1xuICAgICAgICBpZiAoIWpvYikgcmV0dXJuO1xuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGUoY2hvc2VuLnJlcywgam9iLmNvbCwgam9iLnJvdywgdCk7XG4gICAgICAgIHRpbGVzLnB1c2goeyBjb2w6IGpvYi5jb2wsIHJvdzogam9iLnJvdywgYm1wIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihUSUxFX0ZFVENIX0NPTkNVUlJFTkNZLCBjb29yZHMubGVuZ3RoKSB9LCAoKSA9PiBzdGl0Y2hXb3JrZXIoKSksXG4gICAgKTtcblxuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IGNob3Nlbi53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBjaG9zZW4uaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2Ugc3RpdGNoOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgZm9yIChjb25zdCB7IGNvbCwgcm93LCBibXAgfSBvZiB0aWxlcykge1xuICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBTYWZldHkgbmV0OiBpZiB0aGUgY2hvc2VuIGxldmVsIHN0aWxsIGV4Y2VlZHMgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0IChlLmcuIGEgbXVsdGljaGFubmVsXG4gICAgLy8gaW1hZ2Ugd2hvc2UgY29hcnNlc3QgUkVBTCBsZXZlbCBpcyBodWdlIOKAlCBvdmVydmlldyBsZXZlbHMgYXJlIGNvbXBvc2l0ZS1vbmx5KSwgZG93bnNjYWxlIHRoZVxuICAgIC8vIHN0aXRjaGVkIGNhbnZhcyB0byBmaXQgc28gdGhlIFdlYkdQVSB0ZXh0dXJlIHVwbG9hZCBjYW4ndCBmYWlsLlxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIGlmIChsb25nZXN0ID4gTUFYX1RFWFRVUkVfRElNKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1BWF9URVhUVVJFX0RJTSAvIGxvbmdlc3Q7XG4gICAgICBjb25zdCBvdXRXID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihjaG9zZW4ud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3Qgb3V0SCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSBzdGl0Y2hlZCBsZXZlbCAke2Nob3Nlbi53aWR0aH3DlyR7Y2hvc2VuLmhlaWdodH0gZXhjZWVkcyB0aGUgYCArXG4gICAgICAgICAgYCR7TUFYX1RFWFRVUkVfRElNfXB4IHRleHR1cmUgbGltaXQ7IGRvd25zY2FsaW5nIHRvICR7b3V0V33DlyR7b3V0SH0uYCxcbiAgICAgICk7XG4gICAgICBsZXQgb3V0OiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvdXQgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG91dFcsIG91dEgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIG91dC53aWR0aCA9IG91dFc7XG4gICAgICAgIG91dC5oZWlnaHQgPSBvdXRIO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2N0eCA9IG91dC5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghb2N0eCkgdGhyb3cgbmV3IEVycm9yKCdbbmFwYXJpLWpzXSBzbGljZSBkb3duc2NhbGU6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAgIG9jdHguZHJhd0ltYWdlKGNhbnZhcyBhcyB1bmtub3duIGFzIENhbnZhc0ltYWdlU291cmNlLCAwLCAwLCBvdXRXLCBvdXRIKTtcbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChvdXQgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChjYW52YXMgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlcjogbG9hZCAvIHJlbmRlciAvIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE5hcGFyaUxvYWRlZD4ge1xuICAgIC8vIEtlZXBzIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSdzIGJsb2IgY2FjaGUgaW4gc3luYyBldmVuIHdoZW4gdGhlIHVzZXJcbiAgICAvLyBzd2l0Y2hlcyBiYWNrZW5kcyAoZS5nLiBPU0QgSW1hZ2Ug4oaSIG5hcGFyaSBWb2x1bWUpIG9uIHRoZSBzYW1lIGZpbGUg4oCUXG4gICAgLy8gd2hpY2hldmVyIGJhY2tlbmQgbG9hZHMgYSBnZW51aW5lbHkgZGlmZmVyZW50IGZpbGUgZmlyc3QgZXZpY3RzIGl0LlxuICAgIHRoaXMuc2ltcGxlU3RhY2subm90ZUFjdGl2ZUZpbGUoaW1hZ2VJbmZvLmZpbGVOYW1lKTtcbiAgICB0aGlzLmxvYWRlZCA9IHsgaW1hZ2VJbmZvLCB6OiB6SW5kZXgsIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIF9pblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW25hcGFyaS1qc10gcGxvdCB0YXJnZXQgIyR7cGxvdERpdn0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIHRoaXMucGxvdERpdklkID0gcGxvdERpdjtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0ID8gYCR7c2NyZWVuSGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICBob3N0LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG5cbiAgICBjb25zdCBpbmZvID0gKGltYWdlTG9hZGVkIGFzIE5hcGFyaUxvYWRlZCk/LmltYWdlSW5mbyA/PyBpbWFnZUluZm87XG4gICAgY29uc3QgeiA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy56ID8/IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgdmlld2VyID0gbmV3IFZpZXdlcih7IGNhbnZhcywgYmFja2dyb3VuZDogeyByOiAwLjA3LCBnOiAwLjA3LCBiOiAwLjA5LCBhOiAxIH0gfSk7XG4gICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjtcbiAgICAgIGF3YWl0IHZpZXdlci5yZWFkeTtcblxuICAgICAgaWYgKGlzTmFwYXJpU2NhdHRlcihwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNjYXR0ZXIodmlld2VyLCB6KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTY2F0dGVyM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTY2F0dGVyM2Qodmlld2VyLCBpbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTdXJmYWNlKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3VyZmFjZSh2aWV3ZXIpO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaTNkKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50Vm9sdW1lKHZpZXdlciwgaW5mbywgcGxvdFR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAgICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG5ldyBOYXBhcmlSZWdpb25PdmVybGF5KGhvc3QsIHZpZXdlciwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgICAgIHRoaXMuYnVpbGRUb29sSG9zdHMoKTtcbiAgICAgICAgLy8gS2VlcCB0aGUgcGl4ZWwtdG9vbCByZWFkYmFjayAobGFzdFBpeGVscykgY3VycmVudCBhcyB0aGUgdmlldyBwYW5zL3pvb21zIGFuZCB0aWxlZFxuICAgICAgICAvLyBsZXZlbHMgbG9hZCwgc28gd2FuZC9icnVzaC9TQU0gc2FtcGxlIHRoZSBhY3R1YWxseS1kaXNwbGF5ZWQgaW1hZ2UgKGppdC11aSMxMDIpLlxuICAgICAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gdmlld2VyLmNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4gdGhpcy5hcm1SZWFkYmFjaygpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBwbG90IGZhaWxlZDonLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBDaGFubmVsczogcGVyLWNoYW5uZWwgY29tcG9zaXRlLCBMVVQsIG5hdGl2ZSBoaXN0b2dyYW1zIChqaXQtdWkjMTAyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhlIGdyYXlzY2FsZSBkaXNwbGF5IGNvbG9ybWFwIGZyb20gdGhlIHN0b3JlIHNlbGVjdGlvbiAoK3JldmVyc2UpLCBkZWZhdWx0aW5nIHRvIGdyYXkuXG4gICAqICBNYXBzIHRoZSBqaXQtdWkgc3RvcmUgY29sb3JtYXAgbm9kZSB0byBhIG5hcGFyaSBgQ29sb3JtYXBgIHZpYSB0aGUgbGlicmFyeSdzIExVVCBmYWN0b3J5O1xuICAgKiAgdGhlIG11bHRpY2hhbm5lbCB0aW50IHJhbXBzIGFyZSBidWlsdCBpbnNpZGUge0BsaW5rIE11bHRpQ2hhbm5lbEltYWdlVmlld30gZnJvbSBlYWNoXG4gICAqICBjaGFubmVsJ3MgaGV4IGNvbG91ci4gKi9cbiAgcHJpdmF0ZSBncmF5c2NhbGVDb2xvcm1hcCgpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbCk/LmRhdGE/LnZhbHVlO1xuICAgIGNvbnN0IGx1dCA9IHZhbHVlICE9IG51bGwgPyBidWlsZENvbG9ybWFwTHV0KHZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlKSA6IG51bGw7XG4gICAgaWYgKGx1dCkgcmV0dXJuIGNvbG9ybWFwRnJvbUx1dCgnZ3JheS1jbWFwJywgbHV0KTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmV2ZXJzZVxuICAgICAgPyBjb2xvcm1hcEZyb21MdXQoJ2dyYXktcmV2JywgW1syNTUsIDI1NSwgMjU1XSwgWzAsIDAsIDBdXSBhcyBSZ2JbXSlcbiAgICAgIDogJ2dyYXknO1xuICB9XG5cbiAgLyoqIEZldGNoIGEgc3RpdGNoZWQgc2xpY2UgYW5kIHJlYWQgaXQgYmFjayBhcyBhIHNpbmdsZS1jaGFubmVsIHVpbnQ4IHBsYW5lLiBgY2hhbm5lbGAgc2VsZWN0cyBhXG4gICAqICBiYW5kIChtdWx0aWNoYW5uZWwpOyBvbWl0IGl0IGZvciB0aGUgZ3JheXNjYWxlIGNvbXBvc2l0ZSAoYWxsIG92ZXJ2aWV3IGxldmVscyBhdmFpbGFibGUsIHNvIGFcbiAgICogIGxhcmdlIGltYWdlIHBpY2tzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ2hhbm5lbERhdGEoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYm1wID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHosIGNoYW5uZWwsIGJ1ZGdldFRpbGVzKTtcbiAgICByZXR1cm4gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShibXApO1xuICB9XG5cbiAgLyoqIERlY29kZSBhbiBgSW1hZ2VCaXRtYXBgIChzZXJ2ZXIgYmFuZHMgYXJlIGdyYXlzY2FsZSwgUj1HPUIpIHRvIGEgc2luZ2xlLWNoYW5uZWwgdWludDggcGxhbmUuXG4gICAqICBgbWF4U2lkZWAgY2FwcyB0aGUgbG9uZ2VzdCBzaWRlIChkb3duc2NhbGluZyBvbiB0aGUgY2FudmFzIGRyYXcpIOKAlCB1c2VkIHRvIGtlZXAgcHJlLWxvYWRlZFxuICAgKiAgc3VyZmFjZSBzbGljZSBwbGFuZXMgc21hbGwuICovXG4gIHByaXZhdGUgYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgYm1wOiBJbWFnZUJpdG1hcCxcbiAgICBtYXhTaWRlPzogbnVtYmVyLFxuICApOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHNjYWxlID0gbWF4U2lkZSA/IE1hdGgubWluKDEsIG1heFNpZGUgLyBNYXRoLm1heChibXAud2lkdGgsIGJtcC5oZWlnaHQsIDEpKSA6IDE7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoYm1wLndpZHRoICogc2NhbGUpKTtcbiAgICBjb25zdCBoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChibXAuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXModywgaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgY2FudmFzLndpZHRoID0gdztcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gY2hhbm5lbCByZWFkYmFjazogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuICAgIC8vIFNjYWxlIHRoZSBXSE9MRSBiaXRtYXAgaW50byB0aGUgKHBvc3NpYmx5IHNtYWxsZXIpIHRhcmdldCBjYW52YXMg4oCUIGRyYXdpbmcgYXQgbmF0dXJhbCBzaXplXG4gICAgLy8gd291bGQgY3JvcCB0byB0aGUgdG9wLWxlZnQgd8OXaCBjb3JuZXIgd2hlbiBkb3duc2NhbGluZyBhIGxhcmdlIHNsaWNlIChtYXhTaWRlIDwgYm1wIHNpemUpLlxuICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCAwLCAwLCB3LCBoKTtcbiAgICBibXAuY2xvc2U/LigpO1xuICAgIGNvbnN0IHJnYmEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHcgKiBoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcgKiBoOyBpKyspIGRhdGFbaV0gPSByZ2JhW2kgKiA0XTtcbiAgICByZXR1cm4geyBkYXRhLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSAyRCBpbWFnZSBmb3Igc2xpY2UgYHpgLiBXaXRoIGEgc2VydmVyIHB5cmFtaWQgZGVzY3JpcHRvciB3ZSB1c2UgYSBweXJhbWlkYWxcbiAgICoge0BsaW5rIFRpbGVkU291cmNlfSBwZXIgbGF5ZXIgc28gdGhlIHZpZXcgcmVmaW5lcyB0byBoaWdoZXIgcmVzb2x1dGlvbiBvbiB6b29tIChsaWtlIE9TRCkgYW5kXG4gICAqIHNpdHMgbmF0dXJhbGx5IGluIGZ1bGwtcmVzb2x1dGlvbiBjb29yZGluYXRlczsgd2l0aG91dCBvbmUgd2UgZmFsbCBiYWNrIHRvIHRoZSBzaW5nbGUtbGV2ZWxcbiAgICogc3RpdGNoLiBUaHJlZSBkaXNwbGF5IG1vZGVzIGVpdGhlciB3YXk6IG11bHRpY2hhbm5lbCBhZGRpdGl2ZSB0aW50LCBncmF5c2NhbGUgY29sb3JtYXAsIFJHQi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2UoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgaWYgKGRlc2MgJiYgZGVzYy5sZXZlbHM/Lmxlbmd0aCkge1xuICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2VUaWxlZCh6LCBkZXNjKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVuZGVySW1hZ2VTdGl0Y2hlZCh6LCB0b2tlbik7XG4gIH1cblxuICAvKiogU2luZ2xlLWxldmVsIHN0aXRjaCBmYWxsYmFjayAobm8gZGVzY3JpcHRvcik6IHRoZSBwcmUtdGlsaW5nIHBhdGguICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2VTdGl0Y2hlZCh6OiBudW1iZXIsIHRva2VuPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYz8uY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgY2hhbm5lbENvdW50ID4gMTtcblxuICAgIC8vIDEpIEZldGNoIGFsbCBwaXhlbCBkYXRhIEJFRk9SRSB0b3VjaGluZyB0aGUgdmlld2VyLCBzbyBhIHN1cGVyc2VkZWQgc2NydWIgY2FuIGJhaWwgd2l0aG91dFxuICAgIC8vICAgIGhhdmluZyB0b3JuIGRvd24gdGhlIHZpc2libGUgbGF5ZXJzIChhdm9pZHMgZmxpY2tlciAvIG91dC1vZi1vcmRlciBsYXllciBzdGF0ZSkuXG4gICAgbGV0IG1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJztcbiAgICBsZXQgcGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gICAgbGV0IGJpdG1hcDogSW1hZ2VCaXRtYXAgfCBudWxsID0gbnVsbDtcbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICBtb2RlID0gJ211bHRpY2hhbm5lbCc7XG4gICAgICBwbGFuZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hhbm5lbENvdW50IH0sIChfLCBjKSA9PiB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeiwgYykpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgbW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgLy8gQ29tcG9zaXRlIGZldGNoIChubyBjaGFubmVsKSDihpIgYWxsIG92ZXJ2aWV3IGxldmVscyB1c2FibGUsIHNvIGEgbGFyZ2UgZ3JheXNjYWxlIGltYWdlXG4gICAgICAvLyBzZWxlY3RzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIGluc3RlYWQgb2YgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwgKHRleHR1cmUgbGltaXQpLlxuICAgICAgcGxhbmVzID0gW2F3YWl0IHRoaXMuZmV0Y2hDaGFubmVsRGF0YSh6KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGUgPSAncmdiJztcbiAgICAgIGJpdG1hcCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6KTtcbiAgICB9XG5cbiAgICAvLyAyKSBDb21taXQg4oCUIHVubGVzcyBhIG5ld2VyIHNjcnViIHN1cGVyc2VkZWQgdXMgb3IgdGhlIHZpZXdlciB3YXMgdG9ybiBkb3duLlxuICAgIGlmICgodG9rZW4gIT0gbnVsbCAmJiB0b2tlbiAhPT0gdGhpcy5zbGljZVJlcSkgfHwgdGhpcy52aWV3ZXIgIT09IHYpIHtcbiAgICAgIGJpdG1hcD8uY2xvc2U/LigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBkaXNwbGF5ZWQgdGV4dHVyZSBtYXkgYmUgYSBkb3duc2NhbGVkIHB5cmFtaWQgbGV2ZWw7IHNjYWxlIHRoZSBsYXllciBpbnRvIEZVTEwtUkVTT0xVVElPTlxuICAgIC8vIHdvcmxkIGNvb3JkaW5hdGVzIChsZXZlbC0wIHBpeGVscykgc28gdGhlIGNhbWVyYSwgcmVhZGJhY2sgYW5kIOKAlCBjcml0aWNhbGx5IOKAlCBwcmUtc2F2ZWRcbiAgICAvLyByZWdpb25zIChzdG9yZWQgaW4gZnVsbC1yZXMgY29vcmRzLCBlLmcuIG5kcGkpIGFsbCBsaW5lIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGV2ZWwgaXMgc2hvd24uXG4gICAgLy8gVGhpcyBtaXJyb3JzIE9TRCwgd2hvc2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgYWx3YXlzIGxldmVsIDAuXG4gICAgY29uc3QgdGV4VyA9IG1vZGUgPT09ICdyZ2InID8gKGJpdG1hcCBhcyBJbWFnZUJpdG1hcCkud2lkdGggOiBwbGFuZXNbMF0/LndpZHRoID8/IDA7XG4gICAgY29uc3QgdGV4SCA9IG1vZGUgPT09ICdyZ2InID8gKGJpdG1hcCBhcyBJbWFnZUJpdG1hcCkuaGVpZ2h0IDogcGxhbmVzWzBdPy5oZWlnaHQgPz8gMDtcbiAgICBjb25zdCBmdWxsVyA9IGRlc2M/LndpZHRoIHx8IHRleFcgfHwgMTtcbiAgICBjb25zdCBmdWxsSCA9IGRlc2M/LmhlaWdodCB8fCB0ZXhIIHx8IDE7XG4gICAgY29uc3Qgc2NhbGU6IFtudW1iZXIsIG51bWJlcl0gPSBbdGV4VyA/IGZ1bGxXIC8gdGV4VyA6IDEsIHRleEggPyBmdWxsSCAvIHRleEggOiAxXTtcblxuICAgIHRoaXMuaW1hZ2VNb2RlID0gbW9kZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uOiAnbGluZWFyJyB8ICduZWFyZXN0JyA9IHRoaXMuaW1hZ2VTbW9vdGhpbmcgPyAnbGluZWFyJyA6ICduZWFyZXN0JztcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbmV3IE11bHRpQ2hhbm5lbEltYWdlVmlldyh2KTtcbiAgICBpZiAobW9kZSA9PT0gJ211bHRpY2hhbm5lbCcpIHtcbiAgICAgIGNvbnN0IHZpZXdzOiBDaGFubmVsVmlld1tdID0gcGxhbmVzLm1hcCgoZCwgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYz8uY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGQud2lkdGgsIGhlaWdodDogZC5oZWlnaHQsIGNoYW5uZWxzOiAxLCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogZC5kYXRhIH0sXG4gICAgICAgICAgdGludDogY29sb3IsXG4gICAgICAgICAgbmFtZTogc3Q/Lm5hbWUgPz8gYGNoJHtjfWAsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICBzY2FsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ211bHRpY2hhbm5lbCcsIHZpZXdzLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnZ3JheXNjYWxlJykge1xuICAgICAgY29uc3QgZCA9IHBsYW5lc1swXTtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoXG4gICAgICAgICdncmF5c2NhbGUnLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHsgaW50ZXJwb2xhdGlvbiB9LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogYml0bWFwIGFzIEltYWdlQml0bWFwLCBzY2FsZSB9XSwgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGZ1bGxXO1xuICAgIHRoaXMuaW1hZ2VIID0gZnVsbEg7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSAyRCBpbWFnZSB3aXRoIHB5cmFtaWRhbCB7QGxpbmsgVGlsZWRTb3VyY2V9cyDigJQgdGhlIHZpZXcgcmVmaW5lcyB0byBoaWdoZXIgcmVzb2x1dGlvblxuICAgKiBhcyB5b3Ugem9vbSBpbiAodGhlIHZpc3VhbCBmZXRjaGVzIHRoZSBsZXZlbCB3aG9zZSB0ZXhlbHMg4omIIHNjcmVlbiBwaXhlbHMpIGFuZCBzaXRzIGluIGZ1bGwtcmVzXG4gICAqIGNvb3JkaW5hdGVzIHNvIHJlZ2lvbnMgYWxpZ24uIFNhbWUgdGhyZWUgbW9kZXMgYXMgdGhlIHN0aXRjaCBwYXRoLiBQZXItY2hhbm5lbCBsYXllcnMgdXNlIHRoZVxuICAgKiBSRUFMIHB5cmFtaWQgbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBvbmx5IGV4aXN0IHRoZXJlKTsgdGhlIGNvbXBvc2l0ZSB1c2VzIGFsbCBsZXZlbHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlVGlsZWQoejogbnVtYmVyLCBkZXNjOiBUaWxlRGVzY3JpcHRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYy5jaGFubmVscyA/PyAoc3RhdGVzLmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2MubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG5cbiAgICB0aGlzLnRpbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbmV3IE11bHRpQ2hhbm5lbEltYWdlVmlldyh2KTtcblxuICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ211bHRpY2hhbm5lbCc7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYy5jaGFubmVsSW5mbz8uW2NdPy5jb2xvciA/PyB0aW50Rm9yKGMpO1xuICAgICAgICB2aWV3cy5wdXNoKHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCBjLCAxKSxcbiAgICAgICAgICB0aW50OiBjb2xvcixcbiAgICAgICAgICBuYW1lOiBzdD8ubmFtZSA/PyBgY2gke2N9YCxcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbMF07XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcihcbiAgICAgICAgJ2dyYXlzY2FsZScsXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCB1bmRlZmluZWQsIDEpLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ3JnYic7XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcigncmdiJywgW3sgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCA0KSB9XSwge1xuICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaW1hZ2VXID0gZGVzYy53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGRlc2MuaGVpZ2h0O1xuICAgIC8vIEF3YWl0IG9uIHRoZSBpbml0aWFsIHJlbmRlciBzbyBnZXRIaXN0b2dyYW0vYXV0b0NvbnRyYXN0IGhhdmUgZGF0YSBpbW1lZGlhdGVseTsgc2xpY2UgY2hhbmdlc1xuICAgIC8vIHJlZnJlc2ggZmlyZS1hbmQtZm9yZ2V0ICh0aGUgaGlzdG9ncmFtIHBhbmUgcmV0cmllcykuXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6LCBkZXNjKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZSBiYWNrZWQgYnkgdGhlIHNlcnZlciBgL3RpbGVgIGVuZHBvaW50LiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmRcbiAgICogIChncmF5c2NhbGUgbHVtaW5hbmNlLCByZWFsIGxldmVscyBvbmx5KTsgb21pdCBpdCBmb3IgdGhlIGNvbXBvc2l0ZSAoUkdCQSwgYWxsIGxldmVscykuICovXG4gIHByaXZhdGUgYnVpbGRUaWxlZFNvdXJjZShcbiAgICBkZXNjOiBUaWxlRGVzY3JpcHRvcixcbiAgICBjaGFubmVsOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY2hhbm5lbHM6IDEgfCA0LFxuICApOiBUaWxlZFNvdXJjZSB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCkgPz8gJyc7XG4gICAgLy8gUGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSBhdCBSRUFMIEJpby1Gb3JtYXRzIGxldmVsczsgdGhlIGNvbXBvc2l0ZSBleGlzdHMgYXQgYWxsIGxldmVscy5cbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsXG4gICAgICAgID8gZGVzYy5sZXZlbHNcbiAgICAgICAgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBkZXNjLnJlYWxMZXZlbHMgPz8gZGVzYy5sZXZlbHMubGVuZ3RoKSk7XG4gICAgY29uc3QgbGV2ZWxTY2FsZXMgPSB1c2FibGUubWFwKChsKSA9PiBkZXNjLndpZHRoIC8gTWF0aC5tYXgoMSwgbC53aWR0aCkpOyAvLyBsZXZlbC0wIHB4IHBlciBsZXZlbCBweFxuICAgIGNvbnN0IHRpbGVTaXplID0gZGVzYy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgY29uc3QgY2ggPSBjaGFubmVsID09IG51bGwgPyAnJyA6IGAmY2hhbm5lbD0ke2NoYW5uZWx9YDtcbiAgICBjb25zdCBhcGkgPSB0aGlzLmFwaTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3RpbGVkJyxcbiAgICAgIHdpZHRoOiBkZXNjLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkZXNjLmhlaWdodCxcbiAgICAgIHRpbGVTaXplLFxuICAgICAgbGV2ZWxzOiB1c2FibGUubGVuZ3RoLFxuICAgICAgbGV2ZWxTY2FsZXMsXG4gICAgICBkZXB0aDogTWF0aC5tYXgoMSwgZGVzYy56IHx8IDEpLFxuICAgICAgY2hhbm5lbHMsXG4gICAgICBkdHlwZTogJ3VpbnQ4JyxcbiAgICAgIGZldGNoVGlsZTogYXN5bmMgKGtleTogVGlsZUtleSk6IFByb21pc2U8UGl4ZWxDaHVuaz4gPT4ge1xuICAgICAgICBjb25zdCByZXMgPSB1c2FibGVba2V5LmxldmVsXT8ucmVzID8/IGtleS5sZXZlbDtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7YXBpfXRpbGU/aW5mbz0ke2luZm9CNjR9JnJlcz0ke3Jlc30mY29sPSR7a2V5LmNvbH0mcm93PSR7a2V5LnJvd30mej0ke2tleS56fSZ0aWxlU2l6ZT0ke3RpbGVTaXplfSR7Y2h9YDtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW25hcGFyaS1qc10gdGlsZSAke2tleS5sZXZlbH0vJHtrZXkuY29sfS8ke2tleS5yb3d9IOKGkiAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJtcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKTtcbiAgICAgICAgaWYgKGNoYW5uZWxzID09PSA0KSByZXR1cm4geyB3aWR0aDogYm1wLndpZHRoLCBoZWlnaHQ6IGJtcC5oZWlnaHQsIGRhdGE6IGJtcCB9O1xuICAgICAgICByZXR1cm4gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShibXApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIChSZSlmZXRjaCBhIGNvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIGZvciB0aGUgaGlzdG9ncmFtICh0aWxlZCBtb2RlIGhhcyBubyBmdWxsXG4gICAqICBpbi1tZW1vcnkgcGl4ZWxzKS4gT25lIGNoZWFwIG92ZXJ2aWV3IHRpbGUgcGVyIGNoYW5uZWw7IGNhY2hlZCBieSBjaGFubmVsIGluZGV4LiAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAncmdiJykgcmV0dXJuOyAvLyBSR0IgdXNlcyB0aGUgZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIChyZ2JIaXN0b2dyYW0pXG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnID8gZGVzYy5jaGFubmVscyA/PyAxIDogMTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJyA/IGMgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeiwgY2gsIDEpOyAvLyBidWRnZXQgMSDihpIgY29hcnNlc3Qgc2luZ2xlIHRpbGVcbiAgICAgICAgdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgZC5kYXRhKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBsZWF2ZSB0aGlzIGNoYW5uZWwncyBzYW1wbGUgdW5zZXQgKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIGNoYW5uZWwgc3RhdGVzICsgZ3JheXNjYWxlIGNvbG9ybWFwIOKGkiBsaXZlLWFwcGx5IHRvIHRoZSByZW5kZXJlZCBsYXllcnMgKG5vXG4gICAqICByZS1mZXRjaDsgb25seSB6IGNoYW5nZXMgcmUtZmV0Y2gpLiBSZXBsYWNlcyBhbnkgcHJpb3Igc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NoYW5uZWxzLCBjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0XSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICB0aGlzLmFwcGx5RGlzcGxheVN0YXRlKGNoYW5uZWxzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdGhlIHN0b3JlIGNvbG9ybWFwICgrcmV2ZXJzZSksIGludmVydCwgYW5kIGNoYW5uZWwgc3RhdGUg4oaSIHRoZSB2b2x1bWUvaXNvc3VyZmFjZVxuICAgKiAgdHJhbnNmZXIgZnVuY3Rpb246IGNvbG91ciAoY2hhbm5lbCB0aW50IG9yIHNlbGVjdGVkIGNvbG9ybWFwKSwgdGhlIGludGVuc2l0eSAqKndpbmRvd1xuICAgKiAgKG1pbi9tYXgg4oaSIGNvbnRyYXN0TGltaXRzKSoqIGFuZCAqKmdhbW1hKiosIG1pcnJvcmluZyB0aGUgZ3JheXNjYWxlIGltYWdlJ3MgZGlzcGxheSBjb250cm9sc1xuICAgKiAgc28gdGhlIGhpc3RvZ3JhbSBwYW5lIGRyaXZlcyB0aGUgM0QgcmVuZGVyLiBSZXBsYWNlcyBhbnkgcHJpb3Igc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy52b2x1bWVWaWV3O1xuICAgICAgaWYgKCF2aWV3KSByZXR1cm47XG4gICAgICBpZiAodGhpcy52b2x1bWVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgLy8gRWFjaCBjaGFubmVsJ3MgbGF5ZXIgaXMgdGludGVkIGJ5IGl0cyBjb2xvdXIgYW5kIGdldHMgaXRzIG93biB3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eS5cbiAgICAgICAgdmlldy5sYXllcnMuZm9yRWFjaCgoXywgYykgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKGMsIHtcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/ICcjZmZmZmZmJyksXG4gICAgICAgICAgICAuLi4oc3RcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgZ2FtbWE6IHN0LmdhbW1hLFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgIC4uLihzdCA/IHsgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSwgZ2FtbWE6IHN0LmdhbW1hIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEEgY2hhbm5lbCdzIHRpbnQgY29sb3JtYXAgKGJsYWNr4oaSY29sb3VyKSB3aXRoIHJldmVyc2Utc2NhbGUgLyBpbnZlcnQgYXBwbGllZCBieSBmbGlwcGluZy4gKi9cbiAgcHJpdmF0ZSBjaGFubmVsVGludENvbG9ybWFwKGNvbG9yOiBzdHJpbmcpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgbGV0IGNtYXA6IENvbG9ybWFwIHwgc3RyaW5nID0gdGludENvbG9ybWFwKGNvbG9yKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UmV2ZXJzZSkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICBpZiAodGhpcy5pbnZlcnRFbmFibGVkKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIHJldHVybiBjbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbG91ciBtYXAgZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZS4gQSByZWFsIGNvbG9ybWFwIHNlbGVjdGlvbiAodmlyaWRpcy9tYWdtYS/igKYpIHdpbnM7XG4gICAqIG90aGVyd2lzZSB0aGUgY2hhbm5lbCdzIGNvbG91ciB0aW50cyBpdCAoc28gdGhlIGNoYW5uZWwtZGlhbG9nIGNvbG91ciBzd2F0Y2ggcmVjb2xvcnMgdGhlIDNEXG4gICAqIHJlbmRlcikuIFJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXAg4oCUIHRoZSBgVm9sdW1lTGF5ZXJgIGhhcyBubyBwZXItbGF5ZXJcbiAgICogaW52ZXJ0LCBzbyBib3RoIGFyZSBlbXVsYXRlZCBieSByZXZlcnNpbmcgdGhlIGNvbG9ybWFwLlxuICAgKi9cbiAgcHJpdmF0ZSB2b2x1bWVDb2xvcm1hcChzdDogSUNoYW5uZWxTdGF0ZSB8IHVuZGVmaW5lZCk6IENvbG9ybWFwIHwgc3RyaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBsYWJlbD86IHN0cmluZzsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgLy8gQSBjb2xvcmVkIGNvbG9ybWFwICh2aXJpZGlzL21hZ21hL+KApikgZHJpdmVzIHRoZSB2b2x1bWU7IHRoZSBkZWZhdWx0IGdyYXlzY2FsZSBmYW1pbHlcbiAgICAvLyAoZ3JheSAvIEdyZXlzIC8gR3JleXMgSW52KSB5aWVsZHMgdG8gdGhlIGNoYW5uZWwncyBjb2xvdXIgc28gdGhlIGRpYWxvZyBjb2xvdXIgc3dhdGNoXG4gICAgLy8gcmVjb2xvcnMgdGhlIDNEIHJlbmRlci5cbiAgICBjb25zdCBsYWJlbCA9IChub2RlPy5sYWJlbCA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBncmF5RmFtaWx5ID0gbGFiZWwgPT09ICcnIHx8IGxhYmVsLmluY2x1ZGVzKCdncmV5JykgfHwgbGFiZWwuaW5jbHVkZXMoJ2dyYXknKTtcbiAgICBjb25zdCB2YWx1ZSA9IG5vZGU/LmRhdGE/LnZhbHVlO1xuICAgIGNvbnN0IGx1dCA9ICFncmF5RmFtaWx5ICYmIHZhbHVlICE9IG51bGwgPyBidWlsZENvbG9ybWFwTHV0KHZhbHVlLCBmYWxzZSkgOiBudWxsO1xuICAgIGxldCBjbWFwOiBDb2xvcm1hcCB8IHN0cmluZyA9IGx1dFxuICAgICAgPyBjb2xvcm1hcEZyb21MdXQoJ3ZvbC1jbWFwJywgbHV0KVxuICAgICAgOiB0aW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/ICcjZmZmZmZmJyk7XG4gICAgLy8gUmV2ZXJzZS1zY2FsZSBhbmQgaW52ZXJ0IGVhY2ggZmxpcCB0aGUgcmFtcCAodGhlIFZvbHVtZUxheWVyIGhhcyBubyBwZXItbGF5ZXIgaW52ZXJ0KS5cbiAgICBpZiAodGhpcy5jdXJyZW50UmV2ZXJzZSkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICBpZiAodGhpcy5pbnZlcnRFbmFibGVkKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIHJldHVybiBjbWFwO1xuICB9XG5cbiAgLyoqIEFwcGx5IHRoZSBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIC8gY29sb3JtYXAgdG8gdGhlIGxpdmUgbGF5ZXJzIChubyByZS1mZXRjaCksIGRlbGVnYXRpbmcgdGhlXG4gICAqICBwZXItY2hhbm5lbCBsYXllciBtdXRhdGlvbnMgdG8gdGhlIHtAbGluayBNdWx0aUNoYW5uZWxJbWFnZVZpZXd9LiAqL1xuICBwcml2YXRlIGFwcGx5RGlzcGxheVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5jaGFubmVsVmlldztcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8ICF2aWV3KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJykge1xuICAgICAgdmlldy5sYXllcnMuZm9yRWFjaCgoXywgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICBpZiAoIXN0KSByZXR1cm47XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbChjLCB7XG4gICAgICAgICAgdGludDogc3QuY29sb3IsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0sXG4gICAgICAgICAgZ2FtbWE6IHN0LmdhbW1hLFxuICAgICAgICAgIHZpc2libGU6IHN0LnZpc2libGUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoMCwge1xuICAgICAgICBjb2xvcm1hcDogdGhpcy5ncmF5c2NhbGVDb2xvcm1hcCgpLFxuICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogc3QuZ2FtbWEgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiAoUmUpaW5zdGFsbCB0aGUgcGh5c2ljYWwgc2NhbGUgYmFyIG92ZXIgdGhlIDJEIGltYWdlLCBzaXplZCBmcm9tIHRoZSBpbWFnZSdzIMK1bS9waXhlbFxuICAgKiAgKGAvdGlsZXMvaW5mb2AgbXBwWCwgZmFsbGluZyBiYWNrIHRvIHRoZSBpbWFnZSBtZXRhZGF0YSkuIE5vLW9wIHdpdGhvdXQgYSBwaHlzaWNhbCBzaXplLiAqL1xuICBwcml2YXRlIGluc3RhbGxTY2FsZUJhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy5tcHBYIHx8IDA7XG4gICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuaG9zdCAmJiBtcHBYID4gMCkge1xuICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBOYXBhcmlTY2FsZUJhcih0aGlzLmhvc3QsIHRoaXMudmlld2VyLmNhbWVyYSwgbXBwWCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENvbnZlcnQgYSBuYXBhcmktanMgYEhpc3RvZ3JhbWAgKGJpbiBjb3VudCArIG1pbi9tYXgpIHRvIHRoZSBwYW5lJ3MgYElIaXN0b2dyYW1gIChiaW4gZWRnZXMpLiAqL1xuICBwcml2YXRlIHRvSUhpc3RvZ3JhbShoOiB7IGNvdW50czogVWludDMyQXJyYXk7IGJpbnM6IG51bWJlcjsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0pOiBJSGlzdG9ncmFtIHtcbiAgICBjb25zdCBzcGFuID0gaC5tYXggLSBoLm1pbiB8fCAxO1xuICAgIGNvbnN0IGJpbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBoLmJpbnMgfSwgKF8sIGkpID0+IGgubWluICsgKGkgKiBzcGFuKSAvIGguYmlucyk7XG4gICAgY29uc3QgY291bnRzID0gQXJyYXkuZnJvbShoLmNvdW50cyk7XG4gICAgcmV0dXJuIHsgYmlucywgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgM0Qgdm9sdW1lL2lzb3N1cmZhY2UuIEEgbXVsdGljaGFubmVsIGltYWdlIGJlY29tZXMgb25lIGFkZGl0aXZlLCB0aW50ZWRcbiAgICoge0BsaW5rIFZvbHVtZUxheWVyfSBwZXIgY2hhbm5lbCAoc28gZWFjaCBjaGFubmVsJ3MgY29sb3VyIGNvbXBvc2l0ZXMgaW50byB0aGUgcmVuZGVyKTsgYVxuICAgKiBncmF5c2NhbGUvY29tcG9zaXRlIGltYWdlIHVzZXMgYSBzaW5nbGUgdm9sdW1lLiBBZGRzIHRoZSBheGVzIGdpem1vICsgbGFiZWxzIGFuZCB3aXJlcyB0aGVcbiAgICogZGlzcGxheS1zdGF0ZSBzdWJzY3JpcHRpb24uIFRoZSBjYWxsZXIgb3ducyBgdmlld2VyLnJlYWR5YC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgYmVmb3JlIHJlbmRlcmluZyBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXNcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoU2xpY2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSB0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pICYmICEhaW5mbz8uY2hhbm5lbFVybHM/Lmxlbmd0aFxuICAgICAgJiYgKGluZm8/LmltYWdlTWV0YT8uWzBdPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHNpbXBsZU1jID8gaW5mbyEuaW1hZ2VNZXRhIVswXS5jaGFubmVsQ291bnQgOiAoZGVzYz8uY2hhbm5lbHMgPz8gMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDEpO1xuICAgIGNvbnN0IHJlcyA9IHZvbHVtZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHJlbmRlcmluZzogJ2lzbycgfCAnbWlwJyA9IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSkgPyAnaXNvJyA6ICdtaXAnO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcblxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICB0aGlzLmltYWdlTW9kZSA9IG11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZSc7XG4gICAgY29uc3QgdmlldyA9IG5ldyBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3KHZpZXdlcik7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gdmlldztcblxuICAgIC8vIEFzc2VtYmxlIHBlci1jaGFubmVsIHNjYWxhciB2b2x1bWVzIGZyb20gdGhlIHNlcnZlciB0aWxlcyAoaml0LXNwZWNpZmljKTsgdGhlIG5hcGFyaS1qcyB2aWV3XG4gICAgLy8gb3ducyB0aGUgbGF5ZXIgb3JjaGVzdHJhdGlvbiAob25lIGFkZGl0aXZlIHRpbnRlZCB2b2x1bWUgcGVyIGNoYW5uZWwsIG9yIGEgc2luZ2xlIGdyYXlzY2FsZVxuICAgIC8vIHZvbHVtZSkuIFRoZSBhZGFwdGVyIGNvbXB1dGVzIGVhY2ggY2hhbm5lbCdzIGNvbG9ybWFwIChpbmNsLiBpbnZlcnQvcmV2ZXJzZSBmbGlwcykuXG4gICAgbGV0IGRpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNoYW5uZWxzOiBWb2x1bWVDaGFubmVsW10gPSBbXTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgICAgICBjb25zdCB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHJlcywgYyk7XG4gICAgICAgICAgaWYgKCF2b2wpIGNvbnRpbnVlO1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoYywgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuY2hhbm5lbFRpbnRDb2xvcm1hcChjb2xvciksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCByZXMpO1xuICAgICAgICBpZiAodm9sKSB7XG4gICAgICAgICAgZGltcyA9IHZvbDtcbiAgICAgICAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCB2b2wuZGF0YSk7XG4gICAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbMF07XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cblxuICAgIGlmICghZGltcyB8fCAhY2hhbm5lbHMubGVuZ3RoIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlclxuXG4gICAgLy8gUmVzb2x1dGlvbi1pbnZhcmlhbnQgd29ybGQgYm94LiBTaXppbmcgdGhlIGJveCBieSB0aGUgc2FtcGxlZCB2b3hlbCBjb3VudHMgbWFkZSBoaWdoZXJcbiAgICAvLyBpbi1wbGFuZSByZXNvbHV0aW9uIGdyb3cgWC9ZIHdoaWxlIHRoZSBkZXB0aCBzdGF5ZWQgdGhlIChjb25zdGFudCkgc2xpY2UgY291bnQg4oCUIHNvIFogYXBwZWFyZWRcbiAgICAvLyB0byBzaHJpbmsgYXQgaGlnaGVyIHJlc29sdXRpb24uIEluc3RlYWQgYW5jaG9yIHRoZSBpbi1wbGFuZSBsb25nIHNpZGUgdG8gYSBmaXhlZCByZWZlcmVuY2UgYW5kXG4gICAgLy8gbGV0IFogc3BhbiB0aGUgZnVsbCBzbGljZSBjb3VudDsgdGhlIGJveCBzaGFwZSBpcyB0aGVuIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuIFRoZVxuICAgIC8vIHBlci1heGlzIGB2b3hlbFNpemVgIChuYXBhcmkgYHNjYWxlYCkgbWFwcyB0aGUgc2FtcGxlZCBncmlkIG9udG8gdGhhdCBmaXhlZCB3b3JsZCBib3guXG4gICAgY29uc3QgZnVsbFcgPSB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IGRpbXMud2lkdGg7XG4gICAgY29uc3QgZnVsbEggPSB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyBkaW1zLmhlaWdodDtcbiAgICBjb25zdCBmdWxsRCA9XG4gICAgICB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXMuZGVwdGg7XG4gICAgY29uc3QgZnVsbExvbmcgPSBNYXRoLm1heCgxLCBmdWxsVywgZnVsbEgpO1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgd2lkdGg6IChmdWxsVyAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgIGhlaWdodDogKGZ1bGxIICogVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGKSAvIGZ1bGxMb25nLFxuICAgICAgZGVwdGg6IGZ1bGxELFxuICAgIH07XG4gICAgLy8gQmFzZSBib3ggKFotc2NhbGUgPSAxKSArIHRoZSBzYW1wbGVkIGRlcHRoIGRyaXZlIHRoZSBsaXZlIFotaGVpZ2h0IGhhbmRsZSBiZWxvdzsgdGhlIHBlcnNpc3RlZFxuICAgIC8vIGB2b2x1bWVaU2NhbGVgICh1c2VyIGRyYWcpIGFwcGxpZXMgb24gdG9wIHNvIGNoYW5naW5nIHJlc29sdXRpb24ga2VlcHMgdGhlIGNob3NlbiBoZWlnaHQuXG4gICAgdGhpcy52b2x1bWVXb3JsZEJhc2UgPSB3b3JsZDtcbiAgICB0aGlzLnZvbHVtZVNhbXBsZWREZXB0aCA9IE1hdGgubWF4KDEsIGRpbXMuZGVwdGgpO1xuICAgIGNvbnN0IHdvcmxkWiA9IHdvcmxkLmRlcHRoICogdGhpcy52b2x1bWVaU2NhbGU7XG4gICAgY29uc3Qgdm94ZWxTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICB3b3JsZC53aWR0aCAvIGRpbXMud2lkdGgsXG4gICAgICB3b3JsZC5oZWlnaHQgLyBkaW1zLmhlaWdodCxcbiAgICAgIHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBjaCBvZiBjaGFubmVscykgY2gudm94ZWxTaXplID0gdm94ZWxTaXplO1xuXG4gICAgdmlldy5yZW5kZXIobXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJywgY2hhbm5lbHMsIHsgcmVuZGVyaW5nIH0pO1xuICAgIHRoaXMuaW1hZ2VXID0gZGltcy53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGRpbXMuaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IGRpbXM7XG5cbiAgICAvLyAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyArIGxhYmVscywgc2hhcmluZyB0aGUgdm9sdW1lJ3Mgd29ybGQgYm94IHNvIHRoZSBnaXptbyB0cmFja3NcbiAgICAvLyB0aGUgcmVuZGVyZWQgcHJvcG9ydGlvbnMuIFBoeXNpY2FsIHNjYWxlIHRleHQgc3RpbGwgY29tZXMgZnJvbSB0aGUgRlVMTCBpbWFnZSBleHRlbnQuXG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy5tcHBYIHx8IDA7XG4gICAgdGhpcy5heGVzTGF5ZXIgPSB2aWV3ZXIuYWRkQXhlcyh3b3JsZC53aWR0aCwgd29ybGQuaGVpZ2h0LCB3b3JsZFosIHsgdmlzaWJsZTogdGhpcy5heGVzVmlzaWJsZSB9KTtcbiAgICBpZiAodGhpcy5ob3N0KSB7XG4gICAgICB0aGlzLmF4ZXNMYWJlbHMgPSBuZXcgTmFwYXJpQXhlc0xhYmVscyhcbiAgICAgICAgdGhpcy5ob3N0LFxuICAgICAgICB2aWV3ZXIuY2FtZXJhM2QsXG4gICAgICAgIHRoaXMuYnVpbGRBeGVzTGFiZWxzKHsgd2lkdGg6IHdvcmxkLndpZHRoLCBoZWlnaHQ6IHdvcmxkLmhlaWdodCwgZGVwdGg6IHdvcmxkWiB9LCBtcHBYKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmF4ZXNMYWJlbHMuc2V0VmlzaWJsZSh0aGlzLmF4ZXNWaXNpYmxlKTtcbiAgICAgIC8vIEluLXZpZXcgZHJhZyBoYW5kbGUgYXQgdGhlIFRPUCBFTkQgT0YgVEhFIFogQVhJUyAodGhlIGJveCdzIG1pbi1YWSBjb3JuZXIsIHdoZXJlIHRoZSBibHVlXG4gICAgICAvLyBcIlpcIiBheGlzICsgbGFiZWwgbGl2ZSksIHNvIGl0IHJlYWRzIGFzIHRoZSBaLWhlaWdodCBjb250cm9sLiBGbG9hdGVkIGEgbGl0dGxlIHBhc3QgdGhlIGF4aXNcbiAgICAgIC8vIHRpcCAow5cxLjEyKSBzbyB0aGUgZ3JpcCBjbGVhcnMgdGhlIFwiWiDCtyDigKZcIiBsYWJlbC4gRHJhZyDihpUgdG8gcmVzdHJldGNoIFogbGl2ZS5cbiAgICAgIHRoaXMuekhhbmRsZSA9IG5ldyBOYXBhcmlWb2x1bWVaSGFuZGxlKHRoaXMuaG9zdCwgdmlld2VyLmNhbWVyYTNkLCB7XG4gICAgICAgIHRvcEFuY2hvcjogKCkgPT4gW1xuICAgICAgICAgIC10aGlzLnZvbHVtZVdvcmxkQmFzZSEud2lkdGggLyAyLFxuICAgICAgICAgIC10aGlzLnZvbHVtZVdvcmxkQmFzZSEuaGVpZ2h0IC8gMixcbiAgICAgICAgICAoKHRoaXMudm9sdW1lV29ybGRCYXNlIS5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlKSAvIDIpICogMS4xMixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0U2NhbGU6ICgpID0+IHRoaXMudm9sdW1lWlNjYWxlLFxuICAgICAgICBzZXRTY2FsZTogKHMpID0+IHRoaXMuc2V0Vm9sdW1lWlNjYWxlKHMpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaWJlVm9sdW1lRGlzcGxheVN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdHJldGNoIHRoZSB2b2x1bWUncyBaIGhlaWdodCBsaXZlIChkcml2ZW4gYnkgdGhlIGluLXZpZXcge0BsaW5rIE5hcGFyaVZvbHVtZVpIYW5kbGV9KS4gT25seVxuICAgKiB0aGUgcGVyLWF4aXMgYHZveGVsU2l6ZWAgLyBheGVzIGRlcHRoIGNoYW5nZSDigJQgdGhlIHZveGVsIHRleHR1cmVzIGFyZSB1bnRvdWNoZWQg4oCUIHNvIGRyYWdnaW5nIGlzXG4gICAqIHNtb290aC4gYGZhY3RvcmAgaXMgcmVsYXRpdmUgdG8gdGhlIHZvbHVtZSdzIG5hdHVyYWwgcHJvcG9ydGlvbnMgKDEpLiBQZXJzaXN0cyBhY3Jvc3MgcmUtbW91bnRzXG4gICAqIChyZXNvbHV0aW9uIGNoYW5nZXMpIHNvIHRoZSBjaG9zZW4gaGVpZ2h0IHN0aWNrcy5cbiAgICovXG4gIHByaXZhdGUgc2V0Vm9sdW1lWlNjYWxlKGZhY3RvcjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy52b2x1bWVaU2NhbGUgPSBNYXRoLm1pbigxMCwgTWF0aC5tYXgoMC4xLCBmYWN0b3IpKTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy52b2x1bWVXb3JsZEJhc2U7XG4gICAgaWYgKCFiYXNlIHx8ICF0aGlzLnZvbHVtZVZpZXcpIHJldHVybjtcbiAgICBjb25zdCB3b3JsZFogPSBiYXNlLmRlcHRoICogdGhpcy52b2x1bWVaU2NhbGU7XG4gICAgY29uc3QgdnNaID0gd29ybGRaIC8gdGhpcy52b2x1bWVTYW1wbGVkRGVwdGg7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLnZvbHVtZVZpZXcubGF5ZXJzKSB7XG4gICAgICBjb25zdCBbc3gsIHN5XSA9IGxheWVyLnZveGVsU2l6ZTtcbiAgICAgIGxheWVyLnZveGVsU2l6ZSA9IFtzeCwgc3ksIHZzWl07XG4gICAgfVxuICAgIGlmICh0aGlzLmF4ZXNMYXllcikgdGhpcy5heGVzTGF5ZXIuZGVwdGggPSB3b3JsZFo7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy5tcHBYIHx8IDA7XG4gICAgdGhpcy5heGVzTGFiZWxzPy51cGRhdGVBbmNob3JzKFxuICAgICAgdGhpcy5idWlsZEF4ZXNMYWJlbHMoeyB3aWR0aDogYmFzZS53aWR0aCwgaGVpZ2h0OiBiYXNlLmhlaWdodCwgZGVwdGg6IHdvcmxkWiB9LCBtcHBYKSxcbiAgICApO1xuICAgIHRoaXMuekhhbmRsZT8ucmVwb3NpdGlvbigpO1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIFgvWS9aIGF4aXMtZW5kIGxhYmVsIHNwZWNzIGZvciB0aGUgM0QgZ2l6bW8uIEFuY2hvcnMgYXJlIGluIHRoZSB2b2x1bWUncyBjZW50cmVkXG4gICAqICB3b3JsZCBib3ggKG1hdGNoaW5nIHRoZSBBeGVzTGF5ZXIgZ2VvbWV0cnkpOyB0aGUgc2NhbGUgdGV4dCByZWZsZWN0cyB0aGUgRlVMTCBpbWFnZSBleHRlbnQg4oCUXG4gICAqICBwaHlzaWNhbCDCtW0gd2hlbiDCtW0vcGl4ZWwgaXMga25vd24sIGVsc2UgcGl4ZWwgKFgvWSkgLyBzbGljZSAoWikgY291bnRzLiAqL1xuICBwcml2YXRlIGJ1aWxkQXhlc0xhYmVscyhcbiAgICB2b2w6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSxcbiAgICBtcHBYOiBudW1iZXIsXG4gICk6IEF4aXNMYWJlbFNwZWNbXSB7XG4gICAgY29uc3QgaHggPSB2b2wud2lkdGggLyAyO1xuICAgIGNvbnN0IGh5ID0gdm9sLmhlaWdodCAvIDI7XG4gICAgY29uc3QgaHogPSB2b2wuZGVwdGggLyAyO1xuICAgIGNvbnN0IGRlc2NXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB2b2wud2lkdGg7XG4gICAgY29uc3QgZGVzY0ggPSB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyB2b2wuaGVpZ2h0O1xuICAgIGNvbnN0IHNsaWNlcyA9XG4gICAgICB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IHZvbC5kZXB0aDtcbiAgICBjb25zdCBsZW4gPSAocHg6IG51bWJlcik6IHN0cmluZyA9PiAobXBwWCA+IDAgPyBmb3JtYXRVbShweCAqIG1wcFgpIDogYCR7cHh9IHB4YCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgYW5jaG9yOiBbaHgsIC1oeSwgLWh6XSwgdGV4dDogYFggwrcgJHtsZW4oZGVzY1cpfWAsIGNvbG9yOiAnI2VkNDU0NScgfSxcbiAgICAgIHsgYW5jaG9yOiBbLWh4LCBoeSwgLWh6XSwgdGV4dDogYFkgwrcgJHtsZW4oZGVzY0gpfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICAgIHsgYW5jaG9yOiBbLWh4LCAtaHksIGh6XSwgdGV4dDogYFogwrcgJHtzbGljZXN9IHB4YCwgY29sb3I6ICcjNjY4Y2ZmJyB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgYSBkb3duc2FtcGxlZCB1aW50OCB2b2x1bWUgKGx1bWluYW5jZSkgZnJvbSB0aGUgcGVyLXNsaWNlIHRpbGUgZW5kcG9pbnQuIFNsaWNlcyBhcmVcbiAgICogZmV0Y2hlZCB3aXRoIGJvdW5kZWQgY29uY3VycmVuY3kgKGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgZnVsbCB3aXRob3V0IGZsb29kaW5nIGl0IG9uIGEgZGVlcFxuICAgKiBzdGFjaykgYW5kIHJlYWQgaW50byB0aGUgdm9sdW1lIGFzIGVhY2ggYXJyaXZlcywgZHJpdmluZyB7QGxpbmsgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkfSBzbyB0aGVcbiAgICogaG9zdCBzaG93cyBhIGRldGVybWluYXRlIHByb2dyZXNzIGJhciBpbnN0ZWFkIG9mIGEgYmFyZSBzcGlubmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlbWJsZVZvbHVtZShcbiAgICBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IHsgbWF4U2xpY2U/OiBudW1iZXI7IHNsaWNlU3RlcD86IG51bWJlciB9ID0ge30sXG4gICAgY2hhbm5lbD86IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXMgd2hpbGUgd2UgZmV0Y2hcbiAgICBjb25zdCBmdWxsRGVwdGggPSBpbmZvPy5pbWFnZU1ldGE/LlswXT8ueiB8fCBpbmZvPy51cmxzPy5sZW5ndGggfHwgMTtcbiAgICBpZiAoZnVsbERlcHRoIDwgMSkge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBubyBzbGljZXMgdG8gYXNzZW1ibGUgYSB2b2x1bWUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihvcHRzLnNsaWNlU3RlcCA/PyAxKSk7XG4gICAgY29uc3QgbWF4U2xpY2UgPSBvcHRzLm1heFNsaWNlID8/IFZPTFVNRV9NQVhfU0xJQ0U7XG4gICAgLy8gU291cmNlLXNsaWNlIGluZGljZXMgc2FtcGxlZCBpbnRvIHRoZSB2b2x1bWUgKGV2ZXJ5IGBzdGVwYHRoIHBsYW5lIOKGkiBsb3ctcmVzIGlzIGZhc3RlcikuXG4gICAgY29uc3QgekluZGljZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgeiA9IDA7IHogPCBmdWxsRGVwdGg7IHogKz0gc3RlcCkgekluZGljZXMucHVzaCh6KTtcbiAgICBjb25zdCBkZXB0aCA9IHpJbmRpY2VzLmxlbmd0aDtcblxuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIGVhY2ggc2xpY2UgYXQgYSBweXJhbWlkIGxldmVsIG1hdGNoaW5nIGBtYXhTbGljZWAgKGJ1ZGdldCBzY2FsZXMgd2l0aCB0aGUgZGVjaW1hdGVcbiAgICAgIC8vIGZhY3RvciksIHNvIGEgaGlnaGVyIGZhY3RvciBwdWxscyBhIGZpbmVyIGxldmVsIOKGkiBtb3JlIHJlYWwgaW4tcGxhbmUgZGV0YWlsOyB0aGVuIGRvd25zYW1wbGVcbiAgICAgIC8vIHRvIGBtYXhTbGljZWAuIGBjaGFubmVsYCBzZWxlY3RzIGEgYmFuZCAobXVsdGljaGFubmVsIHZvbHVtZSk7IG9taXQgZm9yIHRoZSBncmF5c2NhbGVcbiAgICAgIC8vIGNvbXBvc2l0ZS4gVGhlIGNhbGxlciBvd25zIHRoZSBzdGFja0xvYWRpbmcgZmxhZyAobXVsdGljaGFubmVsIGFzc2VtYmxlcyBjaGFubmVscyBpbiB0dXJuKS5cbiAgICAgIGNvbnN0IGJ1ZGdldCA9IHRoaXMudGlsZUJ1ZGdldEZvcihtYXhTbGljZSk7XG4gICAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6SW5kaWNlc1swXSwgY2hhbm5lbCwgYnVkZ2V0KTtcbiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgbWF4U2xpY2UgLyBNYXRoLm1heChmaXJzdC53aWR0aCwgZmlyc3QuaGVpZ2h0LCAxKSk7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZmlyc3Qud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChmaXJzdC5oZWlnaHQgKiBzY2FsZSkpO1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogZGVwdGgpO1xuXG4gICAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgfVxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgICAgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgICAgfCBudWxsO1xuICAgICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignbmFwYXJpLWpzIHZvbHVtZSBhc3NlbWJseTogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuXG4gICAgICAvLyBSZWFkIG9uZSBmZXRjaGVkIHNsaWNlIGJpdG1hcCBpbnRvIHRoZSB2b2x1bWUgcGxhbmUgYHpgIChsdW1pbmFuY2UpLiBTeW5jaHJvbm91cyBiZXR3ZWVuXG4gICAgICAvLyBhd2FpdHMsIHNvIHRoZSBzaGFyZWQgMkQgY29udGV4dCBpcyBzYWZlIHRvIHJldXNlIGFjcm9zcyB0aGUgY29uY3VycmVudCBmZXRjaCB3b3JrZXJzLlxuICAgICAgbGV0IGRvbmUgPSAwO1xuICAgICAgY29uc3QgcmVhZFNsaWNlID0gKHo6IG51bWJlciwgYm1wOiBJbWFnZUJpdG1hcCk6IHZvaWQgPT4ge1xuICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKGJtcCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpLmRhdGE7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB6ICogd2lkdGggKiBoZWlnaHQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7IGkrKykge1xuICAgICAgICAgIGRhdGFbYmFzZSArIGldID1cbiAgICAgICAgICAgIChyZ2JhW2kgKiA0XSAqIDAuMjk5ICsgcmdiYVtpICogNCArIDFdICogMC41ODcgKyByZ2JhW2kgKiA0ICsgMl0gKiAwLjExNCkgfCAwO1xuICAgICAgICB9XG4gICAgICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgICAgIGRvbmUrKztcbiAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChkb25lIC8gZGVwdGgpICogMTAwKSk7XG4gICAgICB9O1xuXG4gICAgICByZWFkU2xpY2UoMCwgZmlyc3QpO1xuXG4gICAgICAvLyBSZW1haW5pbmcgcGxhbmVzIHZpYSBhIHNtYWxsIHBvb2wgb2Ygd29ya2VycyBkcmFpbmluZyBhIHNoYXJlZCBxdWV1ZS4gRWFjaCBwbGFuZSBgcGBcbiAgICAgIC8vIG1hcHMgdG8gc291cmNlIHNsaWNlIGB6SW5kaWNlc1twXWAgKHN1YnNhbXBsZWQgZm9yIGxvdy1yZXMpLlxuICAgICAgY29uc3QgcGVuZGluZzogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IHAgPSAxOyBwIDwgZGVwdGg7IHArKykgcGVuZGluZy5wdXNoKHApO1xuICAgICAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgY29uc3QgcCA9IHBlbmRpbmcuc2hpZnQoKTtcbiAgICAgICAgICBpZiAocCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICAgIHJlYWRTbGljZShwLCBhd2FpdCB0aGlzLmZldGNoU2xpY2UoekluZGljZXNbcF0sIGNoYW5uZWwsIGJ1ZGdldCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgcG9vbFNpemUgPSBNYXRoLm1pbihWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1ksIE1hdGgubWF4KDEsIGRlcHRoIC0gMSkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9vbFNpemUgfSwgKCkgPT4gd29ya2VyKCkpKTtcblxuICAgICAgaWYgKHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuIG51bGw7IC8vIGNhbmNlbGxlZCDihpIgZG9uJ3QgcmVuZGVyIGEgcGFydGlhbCB2b2x1bWVcbiAgICAgIHJldHVybiB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBOQVBBUklfU0NBVFRFUiAyRCBzY2F0dGVyOiB0aGUgc2xpY2UgaW1hZ2Ugd2l0aCBhIHBvaW50cyBsYXllciBhdCBlYWNoIHJlZ2lvbidzXG4gICAqIGNlbnRyb2lkIChuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSdzIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyKS4gUmVidWlsZHMgdGhlIHBvaW50cyBsaXZlIGFzXG4gICAqIHJlZ2lvbnMgY2hhbmdlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNjYXR0ZXIodmlld2VyOiBWaWV3ZXIsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2Uoeik7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLmluc3RhbGxTY2FsZUJhcigpO1xuICAgIHRoaXMucmVidWlsZFNjYXR0ZXJQb2ludHMoKTtcbiAgICB0aGlzLnNjYXR0ZXJSZWdpb25TdWIgPSB0aGlzLnJlZ2lvblN0b3JlXG4gICAgICAuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlYnVpbGRTY2F0dGVyUG9pbnRzKCkpO1xuICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgMkQgc2NhdHRlcidzIHBvaW50IGxheWVyIGF0IHRoZSBjdXJyZW50IHJlZ2lvbiBjZW50cm9pZHMuICovXG4gIHByaXZhdGUgcmVidWlsZFNjYXR0ZXJQb2ludHMoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLnNjYXR0ZXIyZFBvaW50cykge1xuICAgICAgdi5sYXllcnMucmVtb3ZlKHRoaXMuc2NhdHRlcjJkUG9pbnRzKTtcbiAgICAgIHRoaXMuc2NhdHRlcjJkUG9pbnRzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gdGhpcy5yZWdpb25DZW50cm9pZHMoKTtcbiAgICBpZiAoY2VudHJvaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuc2NhdHRlcjJkUG9pbnRzID0gdi5hZGRQb2ludHMoY2VudHJvaWRzLCB7XG4gICAgICBzaXplOiAxMixcbiAgICAgIGZhY2VDb2xvcjogWzEsIDAuODUsIDAuMiwgMV0sXG4gICAgICBib3JkZXJDb2xvcjogWzAsIDAsIDAsIDFdLFxuICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaW9uIGNlbnRyb2lkcyBhcyBmbGF0IGBbeCwgeSwg4oCmXWAgZGF0YSBjb29yZHMgKHJlY3RhbmdsZSAvIHBvbHlnb24gLyBtdWx0aXBvbHlnb24pLiAqL1xuICBwcml2YXRlIHJlZ2lvbkNlbnRyb2lkcygpOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IG91dDogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBwb2x5Q2VudHJvaWQgPSAoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10pOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG4gPSB4cy5sZW5ndGg7XG4gICAgICBpZiAobiA9PT0gMCkgcmV0dXJuO1xuICAgICAgbGV0IGN4ID0gMDtcbiAgICAgIGxldCBjeSA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjeCArPSB4c1tpXTtcbiAgICAgICAgY3kgKz0geXNbaV07XG4gICAgICB9XG4gICAgICBvdXQucHVzaChjeCAvIG4sIGN5IC8gbik7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkpIHtcbiAgICAgIGNvbnN0IGIgPSByLmJvdW5kcyBhc1xuICAgICAgICB8IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cbiAgICAgICAgfCB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXSB9XG4gICAgICAgIHwgeyBwb2x5Z29uczogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVtdIH1cbiAgICAgICAgfCBudWxsXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFiKSBjb250aW51ZTtcbiAgICAgIGlmICgnd2lkdGgnIGluIGIgJiYgJ3gnIGluIGIpIHtcbiAgICAgICAgb3V0LnB1c2goYi54ICsgYi53aWR0aCAvIDIsIGIueSArIGIuaGVpZ2h0IC8gMik7XG4gICAgICB9IGVsc2UgaWYgKCd4cG9pbnRzJyBpbiBiKSB7XG4gICAgICAgIHBvbHlDZW50cm9pZChiLnhwb2ludHMsIGIueXBvaW50cyk7XG4gICAgICB9IGVsc2UgaWYgKCdwb2x5Z29ucycgaW4gYikge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgYi5wb2x5Z29ucykgcG9seUNlbnRyb2lkKHAueHBvaW50cywgcC55cG9pbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkob3V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIzRCAzRCBzY2F0dGVyOiB0aGUgZG93bnNhbXBsZWQgdm94ZWwgZ3JpZCBhcyBhIDNEIHBvaW50IGNsb3VkIGNvbG9yZWRcbiAgICogYnkgaW50ZW5zaXR5IChuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSdzIHZveGVsIHNjYXR0ZXIzZCkuIEFzc2VtYmxlcyBhIGNvYXJzZSB2b2x1bWUsIHRoZW5cbiAgICogZW1pdHMgYSBmbGF0LXN0cmlkZWQgc2FtcGxlIG9mIHZveGVscyAoY2FwcGVkIGF0IHtAbGluayBTQ0FUVEVSM0RfTUFYX1BPSU5UU30pIHZpYSBgYWRkUG9pbnRzM0RgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNjYXR0ZXIzZCh2aWV3ZXI6IFZpZXdlciwgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIGxldCB2b2w6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHtcbiAgICAgICAgbWF4U2xpY2U6IE1hdGgubWluKHJlcy5tYXhTbGljZSwgU0NBVFRFUjNEX01BWF9YWSksXG4gICAgICAgIHNsaWNlU3RlcDogcmVzLnNsaWNlU3RlcCxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgICBpZiAoIXZvbCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB2b2w7XG4gICAgY29uc3QgelNjYWxlID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgLyBNYXRoLm1heCgxLCBkZXB0aCk7IC8vIOKJiCBjdWJpYyBhc3BlY3RcbiAgICBjb25zdCB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogZGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gU0NBVFRFUjNEX01BWF9QT0lOVFMpKTtcbiAgICBjb25zdCBwb3M6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdmFsOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICBjb25zdCB4ID0gaSAlIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHdpZHRoKSAlIGhlaWdodDtcbiAgICAgIGNvbnN0IHppID0gTWF0aC5mbG9vcihpIC8gKHdpZHRoICogaGVpZ2h0KSk7XG4gICAgICBwb3MucHVzaCh4LCB5LCB6aSAqIHpTY2FsZSk7XG4gICAgICB2YWwucHVzaChkYXRhW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKVswXTtcbiAgICB0aGlzLnNjYXR0ZXIzZExheWVyID0gdmlld2VyLmFkZFBvaW50czNEKG5ldyBGbG9hdDMyQXJyYXkocG9zKSwgbmV3IEZsb2F0MzJBcnJheSh2YWwpLCB7XG4gICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgc2l6ZTogMyxcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlVyA9IHdpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IHsgd2lkdGgsIGhlaWdodCwgZGVwdGggfTtcbiAgICAvLyBGZWVkIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIGZyb20gdGhlIGFzc2VtYmxlZCB2b2x1bWUgKGtleSAwKS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgZGF0YSk7XG4gICAgdGhpcy5zdWJzY3JpYmVTY2F0dGVyM2REaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiBTdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIDNEIHNjYXR0ZXIncyBjb2xvcm1hcCArIGNvbnRyYXN0LiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVNjYXR0ZXIzZERpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMuc2NhdHRlcjNkTGF5ZXI7XG4gICAgICBpZiAoIWxheWVyKSByZXR1cm47XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgbGF5ZXIuY29sb3JtYXAgPSB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KTtcbiAgICAgIGlmIChzdCkgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbc3QubWluLCBzdC5tYXhdO1xuICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NVUkZBQ0UgaGVpZ2h0LWZpZWxkIHN1cmZhY2UuIEEgaGVpZ2h0IGZpZWxkIGlzIHNpbmdsZS1zY2FsYXIsIHNvIGZvciBhXG4gICAqIG11bHRpY2hhbm5lbCBpbWFnZSB0aGUgc3VyZmFjZSBmb2xsb3dzIE9ORSBiYW5kIOKAlCB0aGUgZmlyc3QgdmlzaWJsZSBjaGFubmVsIChmYWxsYmFjayAwKSDigJRcbiAgICogY29sb3VyZWQgYnkgdGhhdCBjaGFubmVsJ3Mgd2luZG93L2NvbG9ybWFwIChsaWtlIHRoZSBQbG90bHkgU1VSRkFDRSwgd2hpY2ggaXMgZ3JheXNjYWxlLW9ubHkpLlxuICAgKiBQcmUtbG9hZHMgZXZlcnkgc2xpY2UncyBoZWlnaHQgZGF0YSB3aXRoIGEgcHJvZ3Jlc3MgYmFyIChhcyB0aGUgdm9sdW1lIGRvZXMpIHNvIHRoZSBzdGFja1xuICAgKiBzbGlkZXIgcmUtc2xpY2VzIGluc3RhbnRseSwgdGhlbiBidWlsZHMgdGhlIG1lc2ggZm9yIHRoZSBjdXJyZW50IHNsaWNlLiBBbGwgbWVzaCArIEdQVSB3b3JrXG4gICAqIGxpdmVzIGluIG5hcGFyaS1qcyAoYGhlaWdodEZpZWxkYCArIGBWaWV3ZXIuYWRkU3VyZmFjZWApOyB0aGlzIGJhY2tlbmQgc3VwcGxpZXMgc2NhbGFyIHNsaWNlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTdXJmYWNlKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsICh0aWxlZDpmYWxzZSArIGNoYW5uZWxVcmxzKSBoYXMgbm8gZGVzY3JpcHRvciDigJQgZGV0ZWN0XG4gICAgLy8gaXQgZnJvbSBpbWFnZU1ldGEgc28gdGhlIFN1cmZhY2Ugc3RpbGwgZm9sbG93cyBvbmUgYmFuZC5cbiAgICBjb25zdCBzaW1wbGVNYyA9IHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykgJiYgISFpbmZvPy5jaGFubmVsVXJscz8ubGVuZ3RoXG4gICAgICAmJiAoaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDE7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIChkZXNjPy5jaGFubmVscyA/PyAxKSA+IDEpO1xuICAgIHRoaXMuc3VyZmFjZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICAvLyBBIGhlaWdodCBmaWVsZCBpcyBzaW5nbGUtc2NhbGFyIOKGkiBmb2xsb3cgdGhlIHBhbmUtU0VMRUNURUQgY2hhbm5lbC5cbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gbXVsdGljaGFubmVsID8gdGhpcy5zdG9yZS5jdXJyZW50U2VsZWN0ZWRDaGFubmVsKCkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdXJmYWNlTWF4R3JpZCA9IHN1cmZhY2VSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKS5tYXhHcmlkO1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLnByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcik7XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkU3VyZmFjZSh2aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgIHRoaXMuaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcik7XG4gICAgLy8gU3Vic2NyaWJlIGFmdGVyIHRoZSBmaXJzdCBidWlsZCBzbyBkaXNwbGF5LXN0YXRlIGVkaXRzIHRhcmdldCBhIGxpdmUgbGF5ZXIuXG4gICAgdGhpcy5zdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk7XG4gIH1cblxuICAvKiogQWRkIHRoZSAzRCBheGVzIGdpem1vICsgRE9NIGxhYmVscyBhcm91bmQgdGhlIChvcmlnaW4tY2VudGVyZWQpIHN1cmZhY2UgbWVzaCwgbWF0Y2hpbmcgdGhlXG4gICAqICB2b2x1bWUvaXNvc3VyZmFjZS4gSW5zdGFsbGVkIG9uY2UgcGVyIG1vdW50OyB0aGUgYm94IHRyYWNrcyB0aGUgbWVzaCBib3VuZHMsIFgvWSBzaG93IHRoZVxuICAgKiAgcGh5c2ljYWwgKG9yIHBpeGVsKSBleHRlbnQsIGFuZCBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuICovXG4gIHByaXZhdGUgaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN1cmZhY2VMYXllcikgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSB0aGlzLnN1cmZhY2VMYXllci5ib3VuZHMoKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5tYXgoMSwgYi5tYXhbMF0gLSBiLm1pblswXSk7XG4gICAgY29uc3QgYm94SCA9IE1hdGgubWF4KDEsIGIubWF4WzFdIC0gYi5taW5bMV0pO1xuICAgIGNvbnN0IGJveEQgPSBNYXRoLm1heCgxLCBiLm1heFsyXSAtIGIubWluWzJdKTtcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF0/Lm1wcFggfHwgMDtcbiAgICBjb25zdCB2b3hlbCA9IG1wcFggPiAwID8gKG1wcFggKiAodGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVykpIC8gTWF0aC5tYXgoMSwgdGhpcy5pbWFnZVcpIDogMTtcbiAgICB0aGlzLmF4ZXNMYXllciA9IHZpZXdlci5hZGRBeGVzKGJveFcsIGJveEgsIGJveEQsIHtcbiAgICAgIHZveGVsU2l6ZTogW3ZveGVsLCB2b3hlbCwgMV0sXG4gICAgICB2aXNpYmxlOiB0aGlzLmF4ZXNWaXNpYmxlLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMuYXhlc0xhYmVscyA9IG5ldyBOYXBhcmlBeGVzTGFiZWxzKFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIHZpZXdlci5jYW1lcmEzZCxcbiAgICAgICAgdGhpcy5idWlsZFN1cmZhY2VBeGVzTGFiZWxzKGJveFcsIGJveEgsIGJveEQsIG1wcFgpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXhlc0xhYmVscy5zZXRWaXNpYmxlKHRoaXMuYXhlc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBYL1kvWiBlbmQtbGFiZWxzIGZvciB0aGUgc3VyZmFjZSBnaXptbzogWC9ZIGFyZSB0aGUgcGh5c2ljYWwgKMK1bSkgb3IgcGl4ZWwgZXh0ZW50IG9mIHRoZSBGVUxMXG4gICAqICBpbWFnZTsgWiBpcyB0aGUgaW50ZW5zaXR5L2hlaWdodCBheGlzLiBBbmNob3JzIGFyZSBpbiB0aGUgY2VudGVyZWQgYm94IChtYXRjaGluZyBBeGVzTGF5ZXIpLiAqL1xuICBwcml2YXRlIGJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoXG4gICAgYm94VzogbnVtYmVyLFxuICAgIGJveEg6IG51bWJlcixcbiAgICBib3hEOiBudW1iZXIsXG4gICAgbXBwWDogbnVtYmVyLFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gYm94VyAvIDI7XG4gICAgY29uc3QgaHkgPSBib3hIIC8gMjtcbiAgICBjb25zdCBoeiA9IGJveEQgLyAyO1xuICAgIGNvbnN0IGRlc2NXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVztcbiAgICBjb25zdCBkZXNjSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IHRoaXMuaW1hZ2VIO1xuICAgIGNvbnN0IGxlbiA9IChweDogbnVtYmVyKTogc3RyaW5nID0+IChtcHBYID4gMCA/IGZvcm1hdFVtKHB4ICogbXBwWCkgOiBgJHtweH0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihkZXNjVyl9YCwgY29sb3I6ICcjZWQ0NTQ1JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihkZXNjSCl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIC1oeSwgaHpdLCB0ZXh0OiAnWiDCtyBpbnRlbnNpdHknLCBjb2xvcjogJyM2NjhjZmYnIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtZmV0Y2ggZXZlcnkgc3RhY2sgc2xpY2UncyBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byB0aGUgc3VyZmFjZSBncmlkKSBpbnRvXG4gICAqIHtAbGluayBzdXJmYWNlUGxhbmVzfSwgZHJpdmluZyB7QGxpbmsgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkfSDigJQgdGhlIHNhbWUgbG9hZC13aXRoLXByb2dyZXNzIFVYXG4gICAqIGFzIHRoZSB2b2x1bWUsIGJ1dCBrZWVwaW5nIG9uZSAyRCBwbGFuZSBwZXIgc2xpY2UgcmF0aGVyIHRoYW4gcGFja2luZyBhIDNEIHZvbHVtZS4gQm91bmRlZFxuICAgKiBjb25jdXJyZW5jeSBrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGJ1c3kgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXAgc3RhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXMgd2hpbGUgd2UgZmV0Y2hcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXB0aCA9IGluZm8/LmltYWdlTWV0YT8uWzBdPy56IHx8IGluZm8/LnVybHM/Lmxlbmd0aCB8fCAxO1xuICAgIGNvbnN0IHsgbWF4R3JpZCB9ID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IGRlcHRoOyB6KyspIHBlbmRpbmcucHVzaCh6KTtcbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHogPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHogPT09IHVuZGVmaW5lZCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIGF3YWl0IHRoaXMuZmV0Y2hTdXJmYWNlUGxhbmUoeiwgbWF4R3JpZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlICR7en0gcHJlbG9hZCBmYWlsZWRgLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb25lKys7XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChkb25lIC8gZGVwdGgpICogMTAwKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBwb29sID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9vbCB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBzbGljZSBgemAgYXMgYSBzaW5nbGUgV0hPTEUtaW1hZ2UgbHVtaW5hbmNlIHBsYW5lIChkZWNpbWF0ZWQgdG8gYG1heEdyaWRgKS4gUHJlZmVycyB0aGVcbiAgICogYXBwJ3MgY29tcGxldGUgcGVyLXNsaWNlIGltYWdlIChgc21hbGxVcmxzYC9gdXJsc2AsIGV4YWN0bHkgbGlrZSB0aGUgUGxvdGx5IHN1cmZhY2UpIHNvIHRoZVxuICAgKiBzdXJmYWNlIGFsd2F5cyBjb3ZlcnMgdGhlIEZVTEwgc2xpY2Ug4oCUIHRoZSB0aWxlLXB5cmFtaWQgYGZldGNoU2xpY2VgIHBhdGggd291bGQgZmFsbCBiYWNrIHRvIGFcbiAgICogc2luZ2xlIHRvcC1sZWZ0IHRpbGUgKGEgY29ybmVyKSBmb3Igc2VsZi1jb250YWluZWQgLyBub24tYC90aWxlcy9pbmZvYCBpbWFnZXMuIEZhbGxzIGJhY2sgdG9cbiAgICogc3RpdGNoaW5nIHRoZSB0aWxlIGdyaWQgb25seSB3aGVuIG5vIGNvbXBsZXRlLWltYWdlIFVSTCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICAvKiogVGlsZSBidWRnZXQgdG8gc3RpdGNoIGEgd2hvbGUgc2xpY2UgYXQgfmB0YXJnZXRQeGAgcmVzb2x1dGlvbiBmcm9tIHRoZSBweXJhbWlkOiBhIGhpZ2hlciB0YXJnZXRcbiAgICogIHB1bGxzIGEgRklORVIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCBhbmQgdGhlIHZvbHVtZVxuICAgKiAgYXNzZW1ibHkgc28gYm90aCBzY2FsZSB0aGVpciBpbi1wbGFuZSByZXNvbHV0aW9uIHdpdGggdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB0aWxlQnVkZ2V0Rm9yKHRhcmdldFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5kZXNjcmlwdG9yPy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgTUFYX1NUSVRDSF9USUxFUyxcbiAgICAgIE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHRhcmdldFB4IC8gdGlsZVNpemUpICoqIDIgKiBTVElUQ0hfQlVER0VUX0NPRUZGKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdXJmYWNlUGxhbmUoXG4gICAgejogbnVtYmVyLFxuICAgIG1heEdyaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgbGV0IHBsYW5lOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFByZWZlcnJlZDogc3RpdGNoIHRoZSBXSE9MRSBzbGljZSBmcm9tIHRoZSBzZXJ2ZXIgcHlyYW1pZCBhdCBhIHJlc29sdXRpb24gZHJpdmVuIGJ5IHRoZVxuICAgIC8vIGRlY2ltYXRlIGZhY3RvciDigJQgYSBoaWdoZXIgdGFyZ2V0IGdyaWQgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gV2l0aCBhXG4gICAgLy8gZGVzY3JpcHRvciwgZmV0Y2hTbGljZSBzdGl0Y2hlcyB0aGUgd2hvbGUgY2hvc2VuIGxldmVsIChuZXZlciBhIGNvcm5lciksIHRoZW4gd2UgZG93bnNjYWxlIHRvXG4gICAgLy8gdGhlIGdyaWQuIFRoaXMgaXMgd2hhdCBtYWtlcyBcIkZ1bGxcIiBhY3R1YWxseSBoaWdoZXItcmVzIHRoYW4gXCLCvVwiLCBub3QganVzdCBhIGZpeGVkIHByZXZpZXcuXG4gICAgaWYgKGRlc2M/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCk7XG4gICAgICAvLyBUaGUgc3VyZmFjZSBpcyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUsIHNvIHRoZSBjb21wb3NpdGUgZmFsbGJhY2sgaXMgYWNjZXB0YWJsZSB3aGVuIHRoZVxuICAgICAgLy8gY2hhbm5lbCBoYXMgbm8gc21hbGwgcHlyYW1pZCBsZXZlbCAoa2VlcHMgaXQgZmFzdCk7IGEgbXVsdGljaGFubmVsIFZPTFVNRSBtdXN0IG5vdCBkbyB0aGlzLlxuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgYnVkZ2V0LCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgKG5vIHB5cmFtaWQpOiB0aGUgYXBwJ3MgQ09NUExFVEUgcGVyLXNsaWNlIGltYWdlICh1cmxzW3pdLCBub3QgdGhlIHNtYWxsIGJsdXJyeVxuICAgIC8vIHRodW1ibmFpbCkg4oCUIHdob2xlIHNsaWNlLCBhdm9pZHMgYSBjb3JuZXIgdGlsZS4gQ2FwcGVkIGF0IHRoZSBpbWFnZSdzIG93biByZXNvbHV0aW9uLlxuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIGNvbnN0IHVybCA9IGluZm8/LnVybHM/Llt6XSA/PyBpbmZvPy5zbWFsbFVybHM/Llt6XTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgICBpZiAocmVzcC5vaykge1xuICAgICAgICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKSwgbWF4R3JpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2UgdXJsIGZldGNoIGZhaWxlZCBmb3Igej0ke3p9YCwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExhc3QgcmVzb3J0IChubyBweXJhbWlkIGFuZCBubyBjb21wbGV0ZSBpbWFnZSk6IGEgc2luZ2xlIHRpbGUuXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgdGhpcy50aWxlQnVkZ2V0Rm9yKG1heEdyaWQpLCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwbGFuZTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hhbm5lbCBzdGF0ZSBkcml2aW5nIHRoZSBzdXJmYWNlOiB0aGUgY2hvc2VuIGJhbmQgZm9yIG11bHRpY2hhbm5lbCAobWF0Y2hlZCBieSBpbmRleCksXG4gICAqICBlbHNlIHRoZSBzaW5nbGUgZ3JheXNjYWxlIGNoYW5uZWwuICovXG4gIHByaXZhdGUgc3VyZmFjZVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiBJQ2hhbm5lbFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5zdXJmYWNlQ2hhbm5lbCA9PSBudWxsKSByZXR1cm4gY2hhbm5lbHNbMF07XG4gICAgcmV0dXJuIGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpID8/IGNoYW5uZWxzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIChSZSlidWlsZCB0aGUgc3VyZmFjZSBtZXNoIGZvciBzbGljZSBgemAgZnJvbSB0aGUgcHJlLWxvYWRlZCBwbGFuZSBjYWNoZSAoaW5zdGFudCDigJQgdGhpcyBpc1xuICAgKiB3aGF0IHRoZSBzdGFjayBzbGlkZXIgY2FsbHMpOyBhIHNsaWNlIG1pc3NpbmcgZnJvbSB0aGUgY2FjaGUgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuIG5hcGFyaS1qcydzXG4gICAqIHB1cmUgYGhlaWdodEZpZWxkYCBidWlsZHMgdGhlIHRyaWFuZ2xlIGdyaWQgKHogPSBub3JtYWxpemVkIGludGVuc2l0eSksIHRoZW4gYGFkZFN1cmZhY2VgXG4gICAqIHJlbmRlcnMgaXQuIFRoZSBzbGljZSBwbGFuZSBhbHNvIGZlZWRzIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIChrZXkgMCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3VyZmFjZSh2aWV3ZXI6IFZpZXdlciwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBsYW5lID0gdGhpcy5zdXJmYWNlUGxhbmVzLmdldCh6KTtcbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBsYW5lID0gYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCB0aGlzLnN1cmZhY2VNYXhHcmlkKTtcbiAgICAgICAgdGhpcy5zdXJmYWNlUGxhbmVzLnNldCh6LCBwbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSBzbGljZSBmZXRjaCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwbGFuZSB8fCBwbGFuZS53aWR0aCA8IDIgfHwgcGxhbmUuaGVpZ2h0IDwgMiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSk7XG4gICAgY29uc3Qgd2luOiBbbnVtYmVyLCBudW1iZXJdID0gW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IHdpbjtcbiAgICAvLyBIZWlnaHQgQU5EIGNvbG91ciBhcmUgbm9ybWFsaXplZCBieSB0aGUgc2FtZSBjb250cmFzdCB3aW5kb3csIHNvIGNoYW5naW5nIG1pbi9tYXggcmVzaGFwZXMgdGhlXG4gICAgLy8gc3VyZmFjZSAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSkuIENlbnRlciBpdCBmb3IgdGhlIGF4ZXMgZ2l6bW8uIFRoZVxuICAgIC8vIHBsYW5lIGlzIGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBncmlkIGNhcCDihpIgc3RyaWRlIDEuXG4gICAgY29uc3QgelNjYWxlID0gU1VSRkFDRV9aX0FTUEVDVCAqIE1hdGgubWF4KHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQpO1xuICAgIGNvbnN0IHsgdmVydGljZXMsIGZhY2VzLCB2YWx1ZXMgfSA9IGhlaWdodEZpZWxkKHBsYW5lLmRhdGEsIHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQsIHtcbiAgICAgIHpTY2FsZSxcbiAgICAgIHpMaW1pdHM6IHdpbixcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFByZXNlcnZlIHRoZSBvcmJpdCBjYW1lcmEgYWNyb3NzIGEgcmUtc2xpY2UgLyB3aW5kb3cgcmVidWlsZCDigJQgb25seSB0aGUgZmlyc3QgbW91bnQgZnJhbWVzLCBzb1xuICAgIC8vIHN0ZXBwaW5nIHRoZSBzdGFjayBvciBjaGFuZ2luZyB0aGUgd2luZG93IGtlZXBzIHRoZSBjdXJyZW50IHpvb20vcGFuL29yaWVudGF0aW9uLlxuICAgIGNvbnN0IGNhbSA9IHZpZXdlci5jYW1lcmEzZDtcbiAgICBjb25zdCBwcmVzZXJ2ZUNhbWVyYSA9IHRoaXMuc3VyZmFjZUxheWVyICE9IG51bGw7XG4gICAgY29uc3Qgc2F2ZWRUYXJnZXQgPSBjYW0udGFyZ2V0O1xuICAgIGNvbnN0IHNhdmVkRGlzdGFuY2UgPSBjYW0uZGlzdGFuY2U7XG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnN1cmZhY2VMYXllcik7XG4gICAgICB0aGlzLnN1cmZhY2VMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gdmlld2VyLmFkZFN1cmZhY2UodmVydGljZXMsIGZhY2VzLCB2YWx1ZXMsIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiB3aW4sXG4gICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICB3aXJlZnJhbWU6IHRoaXMuc3VyZmFjZVdpcmVmcmFtZSxcbiAgICB9KTtcbiAgICBpZiAocHJlc2VydmVDYW1lcmEpIHtcbiAgICAgIGNhbS50YXJnZXQgPSBzYXZlZFRhcmdldDtcbiAgICAgIGNhbS5kaXN0YW5jZSA9IHNhdmVkRGlzdGFuY2U7XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZVcgPSBwbGFuZS53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IHBsYW5lLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoOiBwbGFuZS53aWR0aCwgaGVpZ2h0OiBwbGFuZS5oZWlnaHQsIGRlcHRoOiBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHpTY2FsZSkpIH07XG4gICAgLy8gUmV1c2UgdGhlIHZvbHVtZSBpbnRlbnNpdHktaGlzdG9ncmFtIHBhdGg6IHRoZSBzbGljZSdzIHNjYWxhciBwbGFuZSBpcyB0aGUgaGlzdG9ncmFtIHNvdXJjZS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgcGxhbmUuZGF0YSk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIHN1cmZhY2UsIHNvIGhpc3RvZ3JhbVxuICAgKiAgJiBjaGFubmVsLWRpYWxvZyBlZGl0cyB1cGRhdGUgaXQgbGl2ZSB3aXRob3V0IGEgcmUtZmV0Y2guICoqbWluL21heCByZXNoYXBlcyB0aGUgc3VyZmFjZSdzXG4gICAqICBoZWlnaHQqKiAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGEgd2luZG93IGNoYW5nZSByZWJ1aWxkcyB0aGVcbiAgICogIG1lc2ggZ2VvbWV0cnkgKGZyb20gdGhlIGNhY2hlZCBzbGljZSk7IGNvbG91ci1vbmx5IGVkaXRzIChjb2xvcm1hcC9MVVQsIGdhbW1hLCByZXZlcnNlLCBpbnZlcnQpXG4gICAqICBqdXN0IHVwZGF0ZSB0aGUgbGF5ZXIncyB1bmlmb3Jtcy4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFNlbGVjdGVkQ2hhbm5lbCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzLCBzZWxlY3RlZF0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN1cmZhY2VMYXllcjtcbiAgICAgIGlmICghbGF5ZXIgfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAvLyBTZWxlY3RlZCBjaGFubmVsIGNoYW5nZWQgKG11bHRpY2hhbm5lbCk6IHJlLWZldGNoIFRIQVQgYmFuZCdzIHBsYW5lcyBhbmRcbiAgICAgIC8vIHJlYnVpbGQgdGhlIGhlaWdodC1maWVsZCBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuXG4gICAgICBpZiAodGhpcy5zdXJmYWNlTXVsdGljaGFubmVsICYmIHNlbGVjdGVkICE9PSB0aGlzLnN1cmZhY2VDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc3VyZmFjZUNoYW5uZWwgPSBzZWxlY3RlZDtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJlbG9hZFN1cmZhY2VQbGFuZXModGhpcy52aWV3ZXIhKTtcbiAgICAgICAgICBpZiAodGhpcy52aWV3ZXIpIGF3YWl0IHRoaXMuYnVpbGRTdXJmYWNlKHRoaXMudmlld2VyLCB0aGlzLmxvYWRlZD8ueiA/PyAwKTtcbiAgICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIGNoYW5uZWwgc3dpdGNoIGZhaWxlZDonLCBlcnIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3QgPSB0aGlzLnN1cmZhY2VTdGF0ZShjaGFubmVscyk7XG4gICAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgICBjb25zdCB3aW5kb3dDaGFuZ2VkID1cbiAgICAgICAgIXRoaXMuc3VyZmFjZVdpbmRvdyB8fCB3aW5bMF0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1swXSB8fCB3aW5bMV0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1sxXTtcbiAgICAgIGlmICh3aW5kb3dDaGFuZ2VkKSB7XG4gICAgICAgIC8vIEhlaWdodCBmb2xsb3dzIHRoZSBjb250cmFzdCB3aW5kb3cg4oaSIHJlYnVpbGQgdGhlIG1lc2ggZm9yIHRoZSBuZXcgW21pbixtYXhdIChjYW1lcmEga2VwdCkuXG4gICAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApLmNhdGNoKChlcnIpID0+XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSB3aW5kb3cgcmVidWlsZCBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ29sb3VyLW9ubHkgY2hhbmdlOiB1cGRhdGUgdW5pZm9ybXMgaW4gcGxhY2UsIG5vIGdlb21ldHJ5IHJlYnVpbGQuXG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSB7XG4gICAgICAgIGxheWVyLmNvbnRyYXN0TGltaXRzID0gd2luO1xuICAgICAgICBsYXllci5nYW1tYSA9IHN0LmdhbW1hO1xuICAgICAgfVxuICAgICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXRDYW1lcmFTb29uKCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmNhbnZhcyAmJiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2VyLmNhbWVyYS5maXQoXG4gICAgICAgICAgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5pbWFnZUgsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0IHx8IHRoaXMuaW1hZ2VILFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHJlcXVlc3RBbmltYXRpb25GcmFtZShydW4pO1xuICAgIGVsc2UgcnVuKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljOyBob3N0IHJlLWRyaXZlcyBwbG90KCkgZnJvbSBpdHMgaW1hZ2Ugc3RyZWFtLiAqL1xuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIG5vLW9wICovXG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRUb2tlbisrOyAvLyBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgZnJhbWUgbG9hZGluZyBmcm9tIHRoZSBwcmV2aW91cyBwbG90XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheT8uZGVzdHJveSgpO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG51bGw7XG4gICAgdGhpcy5heGVzTGFiZWxzPy5kZXN0cm95KCk7XG4gICAgdGhpcy5heGVzTGFiZWxzID0gbnVsbDtcbiAgICB0aGlzLnpIYW5kbGU/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnpIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQaXhlbHNSZWN0ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgICB0aGlzLnRpbGVkID0gZmFsc2U7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gbnVsbDtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyMmRQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc2NhdHRlcjNkTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuYXhlc0xheWVyID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgfVxuXG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyBheGlzIHJlc2V0LiAqL1xuICByZXNldEF4ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF1dG9zY2FsZS4gKi9cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQkLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ZXIpIHRoaXMudmlld2VyLmNhbWVyYS56b29tID0gdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gKiAxLjM7XG4gIH1cblxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAvIDEuMztcbiAgfVxuXG4gIHNldERyYWdNb2RlKF9tb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIC8vIE5vLW9wOiBwYW4gYW5kIHpvb20gYXJlIGFsd2F5cyB0aGUgbmFwYXJpIGNhbWVyYSdzIGRlZmF1bHQgZ2VzdHVyZXMsIGFuZCBwYW4vem9vbSBnYXRpbmcgZm9yXG4gICAgLy8gZHJhd2luZyBpcyBvd25lZCBieSB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIChzZXRDb250cm9sc0VuYWJsZWQpLiBUb2dnbGluZyBjb250cm9scyBoZXJlXG4gICAgLy8gd291bGQgZmlnaHQgdGhhdCDigJQgdGhlIGhvc3QgY2FsbHMgc2V0RHJhZ01vZGUoZmFsc2UpIGFsb25nc2lkZSBvdmVybGF5LnNldE1vZGUoPHRvb2w+KS5cbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUoX3Zpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBuYXBhcmktanMgaGFzIG5vIG1pbmltYXA7IG5vLW9wICovXG4gIH1cblxuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VTbW9vdGhpbmcgPSBlbmFibGVkO1xuICAgIC8vIEFwcGx5IGxpdmUgdG8gdGhlIHJlbmRlcmVkIGltYWdlIGxheWVyczsgYmFrZWQgaW50byB0aGUgbmV4dCByZW5kZXIgdG9vLlxuICAgIHRoaXMuY2hhbm5lbFZpZXc/LnNldEludGVycG9sYXRpb24oZW5hYmxlZCA/ICdsaW5lYXInIDogJ25lYXJlc3QnKTtcbiAgfVxuXG4gIHNldFNob3dTdGFjayhfc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogc3RhY2sgbmF2aWdhdGVkIHZpYSBzZXRaSW5kZXggKi9cbiAgfVxuXG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvYWRlZCkgdGhpcy5sb2FkZWQueiA9IHpJbmRleDtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgLy8gU3VyZmFjZTogb25lIHNsaWNlIOKGkiBvbmUgbWVzaCwgc28gcmUtYnVpbGQgdGhlIGhlaWdodCBmaWVsZCBmb3IgdGhlIG5ldyBzbGljZS5cbiAgICBpZiAodGhpcy5zdXJmYWNlTGF5ZXIpIHtcbiAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodiwgekluZGV4KS5jYXRjaCgoZXJyKSA9PlxuICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzZXRaSW5kZXggc3VyZmFjZSBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFZvbHVtZSAvIGlzb3N1cmZhY2U6IHN0ZXAgdGhlIHZvbHVtZSdzIHogcGxhbmUgaW4gcGxhY2UuXG4gICAgaWYgKHRoaXMudm9sdW1lVmlldykge1xuICAgICAgdi5kaW1zLnogPSB6SW5kZXg7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGlsZWQgMkQgaW1hZ2U6IGp1c3QgbW92ZSB0aGUgZGltcyBwbGFuZSDigJQgdGhlIHRpbGVkIHZpc3VhbCBmZXRjaGVzIHRoZSBuZXcgc2xpY2UncyB0aWxlc1xuICAgIC8vIChjYWNoZWQgcGVyIHopLCBubyBsYXllciByZWJ1aWxkLiBSZWZyZXNoIHRoZSBjb2Fyc2UgaGlzdG9ncmFtIHNhbXBsZSBmb3IgdGhlIG5ldyBzbGljZS5cbiAgICBpZiAodGhpcy50aWxlZCkge1xuICAgICAgdi5kaW1zLnogPSB6SW5kZXg7XG4gICAgICBpZiAodGhpcy5kZXNjcmlwdG9yKSB2b2lkIHRoaXMucmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoekluZGV4LCB0aGlzLmRlc2NyaXB0b3IpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIDJEIGltYWdlIChzdGl0Y2ggZmFsbGJhY2spOiByZS1yZW5kZXIgdGhlIHNsaWNlIChyZS1mZXRjaGVzIHBlci1jaGFubmVsIC8gY29tcG9zaXRlKS4gQnJhbmNoXG4gICAgLy8gb2YgYSB2b2x1bWUgbGF5ZXIgKG5vdCBjdXJyZW50UGxvdFR5cGUsIHdoaWNoIGNvdWxkIGJlIHN0YWxlIGFuZCBzaWxlbnRseSBuby1vcCB0aGUgc3dhcCkuXG4gICAgLy8gVGhlIHRva2VuIGxldHMgcmVuZGVySW1hZ2UgZHJvcCBhIHN1cGVyc2VkZWQgc2NydWIgc28gYSBzbG93IG9sZGVyIHNsaWNlIGNhbid0IGNsb2JiZXIgYSBuZXdlciBvbmUuXG4gICAgY29uc3QgcmVxID0gKyt0aGlzLnNsaWNlUmVxO1xuICAgIHZvaWQgdGhpcy5yZW5kZXJJbWFnZSh6SW5kZXgsIHJlcSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHJlcSA9PT0gdGhpcy5zbGljZVJlcSkgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzbGljZSBmYWlsZWQ6JywgZXJyKSk7XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmc6IGJ1bXAgdGhlIGxvYWQgZ2VuZXJhdGlvbiBzbyB0aGUgdm9sdW1lLWFzc2VtYmx5IC8gc3VyZmFjZVxuICAgKiAgcHJlbG9hZCB3b3JrZXJzIHN0b3AgZmV0Y2hpbmcgbW9yZSBmcmFtZXMsIGFuZCBjbGVhciB0aGUgbG9hZGluZyBmbGFnICsgcHJvZ3Jlc3MuICovXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkVG9rZW4rKztcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgfVxuXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDAgPyB7IHdpZHRoOiB0aGlzLmltYWdlVywgaGVpZ2h0OiB0aGlzLmltYWdlSCB9IDogbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFBpeGVscztcbiAgfVxuXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgaWYgKCF2IHx8ICFzaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByID0gdi52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIHIueCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIHIueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGg6IE1hdGgubWluKHNpemUud2lkdGgsIHIueCArIHIud2lkdGgpIC0geCxcbiAgICAgIGhlaWdodDogTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KSAtIHksXG4gICAgfTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIC8qKiBNYXAgYSBQbG90bHktc3R5bGUgM0QgZHJhZyBtb2RlIG9udG8gbmFwYXJpLWpzJ3MgY2FtZXJhIGRyYWcgbW9kZS4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCBtID0gbW9kZSA9PT0gJ3BhbicgPyAncGFuJyA6IG1vZGUgPT09ICd6b29tJyA/ICd6b29tJyA6ICdyb3RhdGUnOyAvLyBvcmJpdC90dXJudGFibGUg4oaSIHJvdGF0ZVxuICAgIHRoaXMudmlld2VyLnNldENhbWVyYURyYWdNb2RlKG0pO1xuICB9XG5cbiAgLyoqIFJlLWZyYW1lIHRoZSAzRCBjYW1lcmEgb24gdGhlIGN1cnJlbnQgM0QgbGF5ZXIuIEEgc3VyZmFjZSBtZXNoIHNpdHMgaW4gdGhlIHBvc2l0aXZlIG9jdGFudFxuICAgKiAgKG5vdCBjZW50cmVkKSwgc28gZnJhbWUgaXQgYnkgaXRzIG93biBib3VuZHM7IGEgdm9sdW1lL2lzb3N1cmZhY2UgdXNlcyBpdHMgY2VudHJlZCBib3guICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbWVzaExheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXIgPz8gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICBpZiAobWVzaExheWVyKSB7XG4gICAgICBjb25zdCBiID0gbWVzaExheWVyLmJvdW5kcygpO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QudGFyZ2V0ID0gYi5jZW50ZXI7XG4gICAgICB0aGlzLnZpZXdlci5jYW1lcmEzZC5kaXN0YW5jZSA9IE1hdGgubWF4KGIucmFkaXVzICogMi41LCAxZS0zKTtcbiAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IHRoaXMudm9sdW1lRGltcztcbiAgICBpZiAoZCkgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZnJhbWUoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gVGhlIFdlYkdQVSBuYXBhcmktanMgb3B0aW9ucywgb2ZmZXJlZCBhbG9uZ3NpZGUgKG5vdCByZXBsYWNpbmcpIHRoZSBPU0QvUGxvdGx5IHR5cGVzLlxuICAgIHJldHVybiBbXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lNQUdFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU1VSRkFDRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfVk9MVU1FXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdISxcbiAgICBdO1xuICB9XG5cbiAgLyoqIFRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yICgxID0gZnVsbCDigKYgOCA9IOKFmykuIFJlYWQgYnkgdGhlIHRvb2xiYXIgdG8gaW5pdCB0aGUgY29udHJvbC4gKi9cbiAgZ2V0UmVzb2x1dGlvblNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblNjYWxlO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZGVjaW1hdGUgZmFjdG9yIGZvciB0aGUgbmFwYXJpIDNEIHR5cGVzLiBUYWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgKHJlKWxvYWQg4oCUIHRoZSBob3N0XG4gICAqICByZS1wbG90cyBhZnRlciBjYWxsaW5nIHRoaXMsIHNpbmNlIGRlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YS4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc29sdXRpb25TY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBQbG90bHkgb3ducyB0aGUgaW50ZW5zaXR5IGluc2V0ICovXG4gIH1cblxuICAvKiogUmVhZCB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSBpbnRvIGBsYXN0UGl4ZWxzYCAodGhlIHBpeGVsLXRvb2xzJyBzb3VyY2UpICsgZW1pdCB0aGUgY2xhbXBlZFxuICAgKiAgdmlzaWJsZSByZWdpb24uIEEgZnJlc2ggUGl4ZWxEYXRhIG9iamVjdCBtZWFucyBjYWNoZWRJbWFnZURhdGEoKSByZWJ1aWxkcyBhdXRvbWF0aWNhbGx5LiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHggPSBhd2FpdCB2LnJlYWREaXNwbGF5ZWRQaXhlbHMoKTtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdikgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IHYudmlzaWJsZVdvcmxkUmVjdCgpOyAvLyBjYXB0dXJlIFdJVEggdGhlIHBpeGVscyAoc2FtZSBjYW1lcmEpXG4gICAgICB0aGlzLmxhc3RQaXhlbHMgPSBweDtcbiAgICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSByZWN0O1xuICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgICAgaWYgKHNpemUgJiYgcmVjdCkge1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLmhlaWdodCwgcmVjdC55KSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS53aWR0aCAtIHgsIHJlY3Qud2lkdGgpKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlICovXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpKTtcbiAgICBlbHNlIHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCksIDApO1xuICB9XG5cbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayDigJQgYXJtZWQgb24gY2FtZXJhIGNoYW5nZXMgc28gYGxhc3RQaXhlbHNgIHRyYWNrcyB0aGUgY3VycmVudCB2aWV3IGFmdGVyIGFcbiAgICogIHBhbi96b29tIHNldHRsZXMgKGFuZCBhZnRlciB0aWxlZCBsZXZlbHMgZmluaXNoIGxvYWRpbmcpLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIHByaXZhdGUgYXJtUmVhZGJhY2soZGVsYXlNcyA9IDI1MCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgfSwgZGVsYXlNcyk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gdGhlIE9TRCBiYWNrZW5kKS5cblxuICAvLyDilIDilIAgUGl4ZWwgdG9vbHM6IHJldXNlIHRoZSBzaGFyZWQsIGJhY2tlbmQtYWdub3N0aWMgdG9vbCBzZXJ2aWNlcyB3aXRoIGEgbmFwYXJpIGhvc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1aWxkIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSArIHRvb2wgaG9zdHMgZm9yIHRoZSBjdXJyZW50IHZpZXdlciAoY2FsbGVkIGZyb20gcGxvdCgpKS4gVGhlXG4gICAqICBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0IHBvaW50ZXJcbiAgICogIGNvb3JkcyB2aWEgdGhlIG5hcGFyaSBjYW1lcmEsIGV4YWN0bHkgbWlycm9yaW5nIHRoZSBPU0QgaG9zdC4gKi9cbiAgcHJpdmF0ZSBidWlsZFRvb2xIb3N0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdGhpcy52aWV3ZXIsXG4gICAgICAoKSA9PiAhIXRoaXMudmlld2VyICYmIHRoaXMuaW1hZ2VXID4gMCxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnJlZ2lvblN0b3JlO1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiByZWdpb25zLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyKSA9PiByZWdpb25zLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5ob3N0LFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmxvYWRlZD8uZmlsZW5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25zLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKT8ucmF0aW9zWzBdID8/IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXZJZCxcbiAgICAgIHBpeGVsVG9EYXRhOiAocHgsIHB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIXRoaXMudmlld2VyIHx8ICFyZWN0KSByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQocmVjdC5sZWZ0ICsgcHgsIHJlY3QudG9wICsgcHkpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgICB9LFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHMpID0+IHRoaXMuYXBwbHlab29tVG9Cb3goY29vcmRzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFpvb20vcGFuIHRoZSBjYW1lcmEgdG8gZml0IGEgZGF0YS1zcGFjZSByZWN0YW5nbGUgYFt4TWluLCB4TWF4LCB5TWF4LCB5TWluXWAuICovXG4gIHByaXZhdGUgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdiB8fCAhdGhpcy5jYW52YXMgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFt4TWluLCB4TWF4LCB5QSwgeUJdID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbih4TWluLCB4TWF4KTtcbiAgICBjb25zdCB4MSA9IE1hdGgubWF4KHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHkwID0gTWF0aC5taW4oeUEsIHlCKTtcbiAgICBjb25zdCB5MSA9IE1hdGgubWF4KHlBLCB5Qik7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIHgxIC0geDApO1xuICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCB5MSAtIHkwKTtcbiAgICBjb25zdCB2dyA9IHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgaDtcbiAgICB2LmNhbWVyYS5jZW50ZXIgPSBbKHgwICsgeDEpIC8gMiwgKHkwICsgeTEpIC8gMl07XG4gICAgdi5jYW1lcmEuem9vbSA9IE1hdGgubWluKHZ3IC8gdywgdmggLyBoKTtcbiAgICB2LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBDYWNoZWRJbWFnZURhdGEgZnJvbSB0aGUgbW9zdCByZWNlbnQgcmVhZGJhY2sgKFJHQkEgZGV2aWNlIHBpeGVscyDihpIgW3ldW3hdPVtyLGcsYl0pLFxuICAgKiAgd2l0aCByYXRpb3Mvb3JpZ2luIG1hcHBpbmcgaW1hZ2UgY29vcmRzIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmxhc3RQaXhlbHM7XG4gICAgaWYgKCFweCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICBjb25zdCBkYXRhID0gcHguZGF0YTtcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW11bXSA9IG5ldyBBcnJheShoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgY29uc3Qgcm93OiBudW1iZXJbXVtdID0gbmV3IEFycmF5KHcpO1xuICAgICAgY29uc3QgYmFzZSA9IHkgKiB3ICogNDtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgIGNvbnN0IG8gPSBiYXNlICsgeCAqIDQ7XG4gICAgICAgIHJvd1t4XSA9IFtkYXRhW29dLCBkYXRhW28gKyAxXSwgZGF0YVtvICsgMl1dO1xuICAgICAgfVxuICAgICAgbWF0cml4W3ldID0gcm93O1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdGhpcy52aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENvbnRyb2wgZ2F0aW5nOiBhIHRvb2wgdGhhdCBBQ1RJVkFURVMgZGlzYWJsZXMgdGhlIGNhbWVyYSBjb250cm9sczsgZGVhY3RpdmF0aW9uIGlzIGEgbm8tb3BcbiAgLy8gYmVjYXVzZSB0aGUgaG9zdCBhbHdheXMgY2FsbHMgdGhlIHJlZ2lvbiBvdmVybGF5J3Mgc2V0TW9kZSBGSVJTVCBpbiBlYWNoIHRvZ2dsZSAod2hpY2ggc2V0c1xuICAvLyB0aGUgYmFzZWxpbmUgZW5hYmxlZC9kaXNhYmxlZCksIHNvIHJlLWVuYWJsaW5nIGhlcmUgd291bGQgZmlnaHQgYSBmcmVzaGx5LWFjdGl2YXRlZCBkcmF3IG1vZGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjsgLy8gbm8gcGxvdCB5ZXQg4oaSIG5vdGhpbmcgdG8gZHJpdmVcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucygob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuICBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgaWYgKHRoaXMud2FuZEhvc3QpIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5zaXplICE9IG51bGwpIHRoaXMuYnJ1c2hUb29sLnNldFNpemUob3B0aW9ucy5zaXplKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG4iXX0=
|
|
4187
|
+
}] }, { type: undefined, decorators: [{
|
|
4188
|
+
type: Optional
|
|
4189
|
+
}, {
|
|
4190
|
+
type: Inject,
|
|
4191
|
+
args: [SPATIAL_DATA_PORT]
|
|
4192
|
+
}] }, { type: i11.SpatialSelectionStore }] });
|
|
4193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ08sZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQzVFLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixzQkFBc0IsR0FDdkIsTUFBTSxXQUFXLENBQUM7QUFnQm5CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFDMkMsY0FBYyxFQUFFLG1CQUFtQixHQUNwRixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFDTCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUNwRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFDbkYseUJBQXlCLEVBQUUsb0JBQW9CLEdBQ2hELE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEw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QUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUyxDQUFDLDJCQUEyQjtZQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkQsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyRixDQUFDO0lBQ0Qs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QWhwSVUsdUJBQXVCLGtCQXFPeEIsZ0JBQWdCLHdUQVVKLGNBQWMsc0VBRTFCLFVBQVUsYUFHRSxpQkFBaUI7a0hBcFA1Qix1QkFBdUIsY0FEVixNQUFNOzsyRkFDbkIsdUJBQXVCO2tCQURuQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBc083QixNQUFNOzJCQUFDLGdCQUFnQjs7MEJBVXZCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsY0FBYzs7MEJBRWpDLE1BQU07MkJBQUMsVUFBVTs7MEJBR2pCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZyb20sIG9mLCBmaXJzdFZhbHVlRnJvbSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHtcbiAgVmlld2VyLFxuICBoaXN0b2dyYW1TY2FsYXIsXG4gIGNvbG9ybWFwRnJvbUx1dCxcbiAgdGludENvbG9ybWFwLFxuICByZXZlcnNlQ29sb3JtYXAsXG4gIGhlaWdodEZpZWxkLFxuICBMVVRfU0laRSxcbiAgTXVsdGlDaGFubmVsSW1hZ2VWaWV3LFxuICBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3LFxufSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUge1xuICBBeGVzTGF5ZXIsXG4gIEltYWdlTGF5ZXIsXG4gIFN1cmZhY2VMYXllcixcbiAgVm9sdW1lTGF5ZXIsXG4gIFBvaW50c0xheWVyLFxuICBQb2ludHMzRExheWVyLFxuICBUaWxlZFNvdXJjZSxcbiAgVGlsZUtleSxcbiAgUGl4ZWxDaHVuayxcbiAgQ2hhbm5lbFZpZXcsXG4gIFZvbHVtZUNoYW5uZWwsXG4gIENvbG9ybWFwLFxuICBQcm9qZWN0ZWRQb2ludHMsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBuZWFyZXN0UHJvamVjdGVkSW5kZXgsIFNjcmVlbkluZGV4LCBTQ1JFRU5fSU5ERVhfTUlOX1BPSU5UUyB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgYnVpbGRDb2xvcm1hcEx1dCwgUmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxDb2x1bW4sIFNwYXRpYWxEYXRhc2V0LCBTcGF0aWFsSW1hZ2VSZWYsIGZpbmRDb2x1bW5NZXRhLCBpc0NhdGVnb3JpY2FsQ29sdW1uLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBjb250cmFzdFdpbmRvdywgZW5jb2RlQ2F0ZWdvcmljYWwsIGVuY29kZUNvbnRpbnVvdXMsIG1hcmtlckRpYW1ldGVycyxcbiAgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzLCB0b1JnYmFUdXBsZXMsIHBhcnNlSGV4LCBNSVNTSU5HX0NPTE9SLCBERUZBVUxUX01VVEVEX09QQUNJVFksXG4gIFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVMsIHNwYXRpYWxDb250aW51b3VzTHV0LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgTk9fQ0FURUdPUlkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxPYnNlcnZhdGlvbnMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiwgbWFza1RvSW5kaWNlcywgbXV0ZWRGcm9tU2VsZWN0aW9uLCBzYW1lU2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IGZyYW1lUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWZyYW1pbmcnO1xuaW1wb3J0IHsgUElYRUxfV09STERfUVVBTlRVTSwgd29ybGRRdWFudHVtRm9yRXh0ZW50IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC93b3JsZC1ncmlkJztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2xpY2UsIHZvbHVtZUltYWdlUmVmIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXZvbHVtZS1pbWFnZSc7XG5pbXBvcnQgeyBkZWZhdWx0U2lnbWEsIGRlbnNpdHlHcmlkLCByYXN0ZXJpemVEZW5zaXR5IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWRlbnNpdHknO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TZWN0aW9uLCBzZWN0aW9uc09mIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zJztcbmltcG9ydCB7IHR5cGUgSG92ZXJTb3VyY2UsIGhvdmVyVGV4dCwgbmVhcmVzdE9ic2VydmF0aW9uIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWhvdmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUb29sdGlwIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10b29sdGlwJztcbmltcG9ydCB7IE5BUEFSSV9XSEVFTF9aT09NX1NQRUVEIH0gZnJvbSAnLi9uYXBhcmktem9vbSc7XG5cbi8qKlxuICogQSBzaG9ydCwgc3RhYmxlIGlkIGZvciBhIGNvbG9ybWFwIHZhbHVlLCBmb3IgY2FjaGUga2V5cy5cbiAqXG4gKiBIYWxmIHRoZSBsaWJyYXJ5J3MgY29sb3JtYXBzIGFyZSBOQU1FUyBhbmQgaGFsZiBhcmUgaW5saW5lIGBbc3RvcCwgY29sb3VyXWBcbiAqIGFycmF5cyBvZiAyNTYgZW50cmllcy4gU3RyaW5naWZ5aW5nIHRoZSBhcnJheSBraW5kIHdvdWxkIHB1dCA2IEtCIGluIGEga2V5IHRoYXRcbiAqIGlzIHJlYnVpbHQgYW5kIGNvbXBhcmVkIG9uIGV2ZXJ5IHZpZXcgY2hhbmdlOyBoYXNoaW5nIGl0IGtlZXBzIHRoZSBrZXkgc21hbGwsXG4gKiBhbmQgaXQgb25seSBoYXMgdG8gZGlzdGluZ3Vpc2ggb25lIGNvbG9ybWFwIGZyb20gYW5vdGhlci5cbiAqL1xuZnVuY3Rpb24gY29sb3JtYXBJZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiAnPyc7XG4gIC8vIEZOVi0xYSBvdmVyIHRoZSBzdG9wcy4gQSBjb2xsaXNpb24gd291bGQgbGVhdmUgYSBzdGFsZSBjb2xvdXJpbmcgb24gc2NyZWVuLFxuICAvLyBub3QgY29ycnVwdCBhbnl0aGluZywgYW5kIDMyIGJpdHMgb3ZlciBhIGZldyBodW5kcmVkIGNvbG9ybWFwcyB3aWxsIG5vdC5cbiAgbGV0IGhhc2ggPSAweDgxMWM5ZGM1O1xuICBjb25zdCB0ZXh0ID0gdmFsdWUubWFwKChzdG9wKSA9PiBTdHJpbmcoc3RvcCkpLmpvaW4oJywnKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaGFzaCBePSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IE1hdGguaW11bChoYXNoLCAweDAxMDAwMTkzKTtcbiAgfVxuICByZXR1cm4gYCMkeyhoYXNoID4+PiAwKS50b1N0cmluZygzNil9YDtcbn1cblxuLyoqXG4gKiBJbi1wbGFuZSBjb2Fyc2VuaW5nIG9mIHRoZSAzRCBnZW5lIG1hcCdzIGxhdHRpY2UsIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2VcbiAqIHZvbHVtZS4gVGhlIGZpZWxkIGlzIHNtb290aCwgc28gaXRzIGRldGFpbCBpcyBzZXQgYnkgdGhlIGtlcm5lbCByYXRoZXIgdGhhbiB0aGVcbiAqIHJhc3RlciDigJQgYW5kIHRoZSBlc3RpbWF0ZSBpcyBhIHBhaXIgb2Ygc2VwYXJhYmxlIGJsdXJzIG9uIHRoZSBtYWluIHRocmVhZCwgd2hpY2hcbiAqIGF0IHRoZSB0ZW1wbGF0ZSdzIGZ1bGwgcmVzb2x1dGlvbiBtZWFucyBzZWNvbmRzIG9mIGZyb3plbiBVSSBwZXIgdG9nZ2xlLlxuICovXG5jb25zdCBHRU5FX01BUF9WT0xVTUVfU1RSSURFID0gMjtcbmltcG9ydCB7XG4gIHR5cGUgRXhwcmVzc2lvbkZpZWxkLCB0eXBlIEV4cHJlc3Npb25Wb2x1bWVGaWVsZCwgY29sb3JFeHByZXNzaW9uRmllbGQsXG4gIGVuY29kZUV4cHJlc3Npb25Wb2x1bWUsIGV4cHJlc3Npb25GaWVsZCwgZXhwcmVzc2lvblZvbHVtZSxcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBQbG90VHlwZSxcbiAgUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlTdXJmYWNlLFxuICBpc05hcGFyaVNjYXR0ZXIsXG4gIGlzTmFwYXJpU2NhdHRlcjNkLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbiAgTkFQQVJJX0RFRkFVTFRfREVDSU1BVEUsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHtcbiAgSVZpc3VhbGl6ZXIsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFZpZXdlckNhcGFiaWxpdGllcyxcbiAgVmlld2VyRmVhdHVyZSxcbiAgY2FwYWJpbGl0aWVzT2YsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgQ29sb3JtYXBOb2RlLCBJV2FuZE9wdGlvbnMsIElCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBWSVpfQ09ORklHLCBWaXpDb25maWcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBUSUxFX0FDQ0VTU19QT1JULCBUaWxlQWNjZXNzUG9ydCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IEJhc2VTdG9yZVZpc3VhbGl6ZXIgfSBmcm9tICcuLi9iYXNlLXN0b3JlLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2ltcGxlLXNsaWNlLWFjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVNjYWxlQmFyLCBTY2FsZUJhckNhbWVyYSwgZm9ybWF0VW0gfSBmcm9tICcuL25hcGFyaS1zY2FsZS1iYXInO1xuaW1wb3J0IHsgTmFwYXJpUmVnaW9uT3ZlcmxheSwgT3ZlcmxheVZpZXdlciB9IGZyb20gJy4vbmFwYXJpLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE5hcGFyaUF4ZXNMYWJlbHMsIEF4aXNMYWJlbFNwZWMgfSBmcm9tICcuL25hcGFyaS1heGVzLWxhYmVscyc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7XG4gIElDb29yZGluYXRlVHJhbnNmb3JtLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29vcmRpbmF0ZS10cmFuc2Zvcm0uY29udHJhY3QnO1xuaW1wb3J0IHsgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QsIENhY2hlZEltYWdlRGF0YSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBXYW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gIFZlcnRleEVyYXNlclRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gIFpvb21Ub0JveFRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcblxuLyoqIElDb29yZGluYXRlVHJhbnNmb3JtIG92ZXIgdGhlIG5hcGFyaSBjYW1lcmE6IHBvaW50ZXIgY2xpZW50IGNvb3JkcyDihpQgaW1hZ2Uvd29ybGQgY29vcmRzLiAqL1xuY2xhc3MgTmFwYXJpQ29vcmRpbmF0ZVRyYW5zZm9ybSBpbXBsZW1lbnRzIElDb29yZGluYXRlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IHtcbiAgICAgIGNhbnZhc1RvV29ybGQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgcmVhZG9ubHkgY2FtZXJhOiB7IHpvb206IG51bWJlciB9O1xuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkeTogKCkgPT4gYm9vbGVhbixcbiAgKSB7fVxuICBjbGllbnRUb0RhdGEoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG4gIGRhdGFMZW5ndGhUb1NjcmVlbihkYXRhTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRhTGVuZ3RoICogdGhpcy52aWV3ZXIuY2FtZXJhLnpvb207IC8vIENTUyBweCBwZXIgd29ybGQgdW5pdFxuICB9XG4gIGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxufVxuXG4vKiogT3BhcXVlIGhhbmRsZSBmcm9tIHtAbGluayBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5sb2FkfSwgcGFzc2VkIGJhY2sgdG8gcGxvdCgpLiAqL1xuaW50ZXJmYWNlIE5hcGFyaUxvYWRlZCB7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbztcbiAgejogbnVtYmVyO1xuICAvKiogTXVzdCBtYXRjaCBgSUltYWdlSW5mby5maWxlTmFtZWAg4oCUIHRoZSByZW5kZXIgb3JjaGVzdHJhdG9yIGRyb3BzIHRoZSByZXN1bHQgaWYgdGhlXG4gICAqICBoYW5kbGUncyBgZmlsZW5hbWVgIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBpbWFnZSAoZ3VhcmRzIGFnYWluc3Qgc3RhbGUgY2xpY2tzKS4gKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgVk9MVU1FX01BWF9TTElDRSA9IDEwMjQ7IC8vIFwiRnVsbFwiIGluLXBsYW5lIGNhcDsgdGhlIGRlZmF1bHQgwrwgbG9hZCB1c2VzIDI1NlxuLyoqIFJlZmVyZW5jZSBpbi1wbGFuZSB3b3JsZCBzaXplIChsb25nIHNpZGUpIGZvciB0aGUgdm9sdW1lL2F4ZXMgYm94LCBpbiBhcmJpdHJhcnkgd29ybGQgdW5pdHMuXG4gKiAgVGhlIGJveCBpcyBhbmNob3JlZCB0byB0aGlzIHJlZmVyZW5jZSByZWdhcmRsZXNzIG9mIHRoZSBjaG9zZW4gZGVjaW1hdGUgZmFjdG9yLCBzbyBjaGFuZ2luZyB0aGVcbiAqICByZXNvbHV0aW9uIGNoYW5nZXMgREVUQUlMLCBub3QgdGhlIHZvbHVtZSdzIHByb3BvcnRpb25zIChaIG5vIGxvbmdlciBhcHBlYXJzIHRvIHNocmluayB3aGVuIHRoZVxuICogIGluLXBsYW5lIHNhbXBsaW5nIGdyb3dzKS4gU2V0IHRvIHRoZSBERUZBVUxUIGRlY2ltYXRlJ3MgaW4tcGxhbmUgY2FwIHNvIHRoZSBkZWZhdWx0IHZpZXcgaXNcbiAqICB1bmNoYW5nZWQ7IGhpZ2hlci9sb3dlciByZXNvbHV0aW9ucyBrZWVwIHRoYXQgc2FtZSBzaGFwZS4gU2VlIHtAbGluayBtb3VudFZvbHVtZX0uICovXG5jb25zdCBWT0xVTUVfV09STERfSU5QTEFORV9SRUYgPSBWT0xVTUVfTUFYX1NMSUNFIC8gTkFQQVJJX0RFRkFVTFRfREVDSU1BVEU7XG4vKiogTWF4IGNvbmN1cnJlbnQgc2xpY2UgZmV0Y2hlcyB3aGVuIGFzc2VtYmxpbmcgYSB2b2x1bWUg4oCUIGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgYnVzeVxuICogIHdpdGhvdXQgZmxvb2RpbmcgaXQgKGJyb3dzZXJzIGNhcCB+Ni9ob3N0KSBvbiBhIGRlZXAgc3RhY2suICovXG5jb25zdCBWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA4O1xuXG4vKiogVm9sdW1lL2lzb3N1cmZhY2Ugc2FtcGxpbmcgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWAgKDEgPSBGdWxsIDEwMjQsIDIgPSDCvSA1MTIsIDQgPSDCvCAyNTZcbiAqICBkZWZhdWx0LCA4ID0g4oWbIDEyOCk6IHRoZSBpbi1wbGFuZSBjYXAgaGFsdmVzIGVhY2ggc3RlcDsgc2xpY2VzIHN0YXkgdW4tc3Vic2FtcGxlZCB1bnRpbCDihZssIHRoZW5cbiAqICBzdWJzYW1wbGUuICovXG5mdW5jdGlvbiB2b2x1bWVSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heFNsaWNlOiBudW1iZXI7IHNsaWNlU3RlcDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4ge1xuICAgIG1heFNsaWNlOiBNYXRoLm1heCg4LCBNYXRoLnJvdW5kKFZPTFVNRV9NQVhfU0xJQ0UgLyBzKSksXG4gICAgc2xpY2VTdGVwOiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMgLyA0KSksXG4gIH07XG59XG4vKiogRnVsbHktbm9ybWFsaXplZCBpbnRlbnNpdHkgaGVpZ2h0IGFzIGEgZnJhY3Rpb24gb2YgdGhlIGluLXBsYW5lIGV4dGVudCDigJQgbWF0Y2hlcyB0aGUgUGxvdGx5XG4gKiAgU1VSRkFDRSB6LWFzcGVjdCAofjAuNCkgc28gdGhlIHJlbGllZiBpc24ndCBleGFnZ2VyYXRlZC4gKi9cbmNvbnN0IFNVUkZBQ0VfWl9BU1BFQ1QgPSAwLjQ7XG4vKiogXCJGdWxsXCIgbWVzaCBncmlkIGNhcDsgdGhlIGRlY2ltYXRlIGZhY3RvciBkaXZpZGVzIGl0IChkZWZhdWx0IMK8IOKGkiAyMjAsIMK9IOKGkiA0NDAsIEZ1bGwg4oaSIDg4MCkuICovXG5jb25zdCBTVVJGQUNFX01BWF9HUklEID0gODgwO1xuLyoqIENvZWZmaWNpZW50IHNjYWxpbmcgdGhlIHB5cmFtaWQgdGlsZSBidWRnZXQgd2l0aCB0aGUgdGFyZ2V0IHJlc29sdXRpb24g4oCUIGEgaGlnaGVyIHRhcmdldCBwdWxscyBhXG4gKiAgZmluZXIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCArIHZvbHVtZSBhc3NlbWJseS4gKi9cbmNvbnN0IFNUSVRDSF9CVURHRVRfQ09FRkYgPSAxNjtcbi8qKiBTdXJmYWNlIG1lc2ggdGFyZ2V0IGdyaWQgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWA6IHRoZSBncmlkIGNhcCBzaHJpbmtzIGJ5IGBzY2FsZWAgKGV2ZXJ5XG4gKiAgc2xpY2UgaXMga2VwdCDigJQgdGhlIHotc2xpZGVyIG5lZWRzIHRoZW0gYWxsKS4gVGhlIHNvdXJjZSBpcyBmZXRjaGVkIGF0IGEgbWF0Y2hpbmcgcmVzb2x1dGlvbi4gKi9cbmZ1bmN0aW9uIHN1cmZhY2VSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heEdyaWQ6IG51bWJlciB9IHtcbiAgY29uc3QgcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgcmV0dXJuIHsgbWF4R3JpZDogTWF0aC5tYXgoMTYsIE1hdGgucm91bmQoU1VSRkFDRV9NQVhfR1JJRCAvIHMpKSB9O1xufVxuXG4vKiogM0Qgc2NhdHRlcjogaW4tcGxhbmUgY2FwIGZvciB0aGUgYXNzZW1ibGVkIHZveGVsIGdyaWQsIGFuZCB0aGUgbWF4IG51bWJlciBvZiBwb2ludHMgZW1pdHRlZFxuICogICh0aGUgZ3JpZCBpcyBmbGF0LXN0cmlkZWQgZG93biB0byB0aGlzKSDigJQga2VlcHMgdGhlIGJpbGxib2FyZCBjb3VudCBpbnRlcmFjdGl2ZS4gKi9cbmNvbnN0IFNDQVRURVIzRF9NQVhfWFkgPSA2NDtcbmNvbnN0IFNDQVRURVIzRF9NQVhfUE9JTlRTID0gMTUwMDAwO1xuXG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7IC8vIHNlcnZlciB0aWxlIGVkZ2UgKG1hdGNoZXMgdGhlIE9TRCBiYWNrZW5kKVxuLyoqIE1heCB0aWxlcyBzdGl0Y2hlZCBmb3Igb25lIGRpc3BsYXllZCBzbGljZSAoNTEycHggdGlsZXMg4oaSIHVwIHRvIH42MTQ0wrIgYXQgZnVsbCByZXMpLiBCZXlvbmRcbiAqICB0aGlzIHdlIHN0ZXAgdG8gYSBjb2Fyc2VyIHB5cmFtaWQgbGV2ZWwgc28gYSBsYXJnZSBpbWFnZSBzdGF5cyB0cmFjdGFibGUuICovXG5jb25zdCBNQVhfU1RJVENIX1RJTEVTID0gMTQ0O1xuLyoqIFdlYkdQVSBkZWZhdWx0IGBtYXhUZXh0dXJlRGltZW5zaW9uMkRgIOKAlCBhIHN0aXRjaGVkIHNsaWNlJ3MgbG9uZ2VzdCBzaWRlIG11c3QgZml0IGEgdGV4dHVyZS4gKi9cbmNvbnN0IE1BWF9URVhUVVJFX0RJTSA9IDgxOTI7XG4vKiogQ29uY3VycmVudCB0aWxlIHJlcXVlc3RzIHBlciBzdGl0Y2hlZCBzbGljZS4gRmlyaW5nIGEgd2hvbGUgZ3JpZCBhdCBvbmNlIChodW5kcmVkcyBvZiByZXF1ZXN0c1xuICogIGZvciBhIGxhcmdlIGxldmVsKSBvdmVyd2hlbG1lZCB0aGUgdGlsZSBzZXJ2ZXIgKDUwNHMpOyBhIHNtYWxsIHBvb2wga2VlcHMgdGhlIHBpcGUgZnVsbCB3aXRob3V0XG4gKiAgZmxvb2RpbmcgaXQg4oCUIGFuZCBzbGljZS1sZXZlbCB3b3JrZXJzIGFscmVhZHkgcnVuIHNldmVyYWwgc3RpdGNoZXMgaW4gcGFyYWxsZWwgb24gdG9wIG9mIHRoaXMuICovXG5jb25zdCBUSUxFX0ZFVENIX0NPTkNVUlJFTkNZID0gNjtcbi8qKiBIb3cgbG9uZyB0byBwb2xsIGAvdGlsZXMvaW5mb2AgKDIwMiB3aGlsZSB0aGUgc2VydmVyIGNhY2hlcyB0aGUgc291cmNlKSBiZWZvcmUgZmFsbGluZyBiYWNrIHRvXG4gKiAgYSBzaW5nbGUgdGlsZS4gR2VuZXJvdXMgbGlrZSB0aGUgT1NEIGJhY2tlbmQg4oCUIGEgY29sZCB3aG9sZS1zbGlkZSBjYW4gdGFrZSBtaW51dGVzIHRvIGNhY2hlLiAqL1xuY29uc3QgREVTQ1JJUFRPUl9USU1FT1VUX01TID0gMTIwMDAwO1xuXG4vKiogRGVmYXVsdCBwZXItY2hhbm5lbCB0aW50cyAoRmlqaS1zdHlsZSkgd2hlbiB0aGUgc3RvcmUvZGVzY3JpcHRvciBvZmZlcnMgbm8gY29sb3VyLiAqL1xuY29uc3QgREVGQVVMVF9USU5UUyA9IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnLCAnI2ZmZmYwMCcsICcjZmYwMGZmJywgJyMwMGZmZmYnLCAnI2ZmZmZmZiddO1xuXG4vKiogRGVmYXVsdCB0aW50IGZvciBhIGNoYW5uZWwgaW5kZXgsIGN5Y2xpbmcgdGhlIEZpamkgcGFsZXR0ZS4gKi9cbmZ1bmN0aW9uIHRpbnRGb3IoY2hhbm5lbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIERFRkFVTFRfVElOVFNbY2hhbm5lbCAlIERFRkFVTFRfVElOVFMubGVuZ3RoXTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AgKHJlcyAwID0gZnVsbCByZXNvbHV0aW9uKS4gKi9cbmludGVyZmFjZSBUaWxlTGV2ZWwge1xuICByZXM6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBTdWJzZXQgb2YgdGhlIGAvdGlsZXMvaW5mb2AgZGVzY3JpcHRvciB0aGlzIGJhY2tlbmQgcmVhZHMgKHRpbGUgZ3JpZCwgY2hhbm5lbHMsIHNjYWxlKS4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgdGhlcmUuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY29sb3I/OiBzdHJpbmc7XG4gICAgYml0RGVwdGg/OiBudW1iZXI7XG4gICAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgICBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIG1wcFg/OiBudW1iZXI7XG4gIG1wcFk/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBXZWJHUFUgaW1hZ2UgYmFja2VuZCBidWlsdCBvbiB0aGUgcHVibGlzaGVkIGBuYXBhcmktanNgIGxpYnJhcnkg4oCUIHRoZSBQT0MgZW5naW5lIGZvclxuICogaml0LXVpIzEwMiAoYSBicm93c2VyLWJhc2VkIG5hcGFyaSBzaGlwcGVkIGFzIGEgSlMgbGlicmFyeSwgc3dhcHBpbmcgaW1hZ2UgcGxvdHRpbmcgd2l0aFxuICogT3BlblNlYWRyYWdvbiBhbmQgM0Qgc2xpY2luZy9pc29zdXJmYWNlcyB3aXRoIFBsb3RseSkuXG4gKlxuICogUmVuZGVyIHN0cmF0ZWd5OiByYXRoZXIgdGhhbiByZS1pbXBsZW1lbnQgdGhlIHNlcnZlcidzIHRpbGUvcHlyYW1pZCBwcm90b2NvbCAod2hpY2ggT1NEXG4gKiBhbHJlYWR5IGhhbmRsZXMpLCB0aGlzIGJhY2tlbmQgcmVuZGVycyB0aGUgKipjb21wbGV0ZSBwZXItc2xpY2UgaW1hZ2UgVVJMcyB0aGUgYXBwIGFscmVhZHlcbiAqIHByb2R1Y2VzKiogKGBJSW1hZ2VJbmZvLnVybHNgKSDigJQgYHVybHNbel1gIGZvciB0aGUgMkQgaW1hZ2UsIGFuZCB0aGUgZnVsbCBgdXJsc2Agc3RhY2tcbiAqIGFzc2VtYmxlZCBpbnRvIGEgZG93bnNhbXBsZWQgdm9sdW1lIGZvciB0aGUgM0QgdHlwZXMuIFJlZ2lvbiBzdGF0ZSBhbmQgZGlzcGxheSBvcHRpb25zXG4gKiBkZWxlZ2F0ZSB0byB0aGUgc2hhcmVkIHtAbGluayBSZWdpb25TdG9yZX0gLyB7QGxpbmsgVmlzdWFsaXplclN0b3JlfSwgZXhhY3RseSBhcyBPU0QgZG9lcy5cbiAqXG4gKiBGb2xsb3ctdXBzIChqaXQtdWkjMTAyKTogbmF0aXZlLXJlc29sdXRpb24gcHlyYW1pZGFsIHRpbGluZywgb24tY2FudmFzIHRvb2xzLCByZWdpb25cbiAqIG92ZXJsYXkgcmVuZGVyaW5nLCBwZXItY2hhbm5lbCBoaXN0b2dyYW1zLCBUSUZGIGV4cG9ydC5cbiAqL1xuLyoqXG4gKiBXaGF0IHRoZSAzRCBwb2ludHMgbGF5ZXIgbmVlZHMgdG8gY29sb3VyIGEgY2xvdWQ6IG9uZSBzY2FsYXIgcGVyIHBvaW50LCBhIGNvbG9ybWFwLCBhbmQgdGhlXG4gKiB3aW5kb3cgdGhhdCBtYXBzIHNjYWxhcnMgb250byBpdC4gQ2F0ZWdvcmljYWwgYW5kIGNvbnRpbnVvdXMgY29sb3VyaW5ncyBib3RoIHJlZHVjZSB0byB0aGlzLFxuICogYmVjYXVzZSB0aGUgbGF5ZXIgb2ZmZXJzIG5vIHBlci1wb2ludCBjb2xvdXIgY2hhbm5lbC5cbiAqL1xuaW50ZXJmYWNlIFNwYXRpYWwzZEVuY29kaW5nIHtcbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gIGNvbG9ybWFwOiBDb2xvcm1hcDtcbiAgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UgZXh0ZW5kcyBCYXNlU3RvcmVWaXN1YWxpemVyIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc09mKFtcbiAgICBWaWV3ZXJGZWF0dXJlLkltYWdlRGlzcGxheSxcbiAgICBWaWV3ZXJGZWF0dXJlLlN0YWNrU2xpZGVyLFxuICAgIFZpZXdlckZlYXR1cmUuUGl4ZWxSZWFkYmFjayxcbiAgICBWaWV3ZXJGZWF0dXJlLlN1cmZhY2UzRCxcbiAgICBWaWV3ZXJGZWF0dXJlLklzb3N1cmZhY2UsXG4gIF0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSB2aWV3ZXI6IFZpZXdlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3N0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvYWRlZDogTmFwYXJpTG9hZGVkIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFBpeGVsczogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFBsb3RUeXBlOiBQbG90VHlwZSA9IFBsb3RUeXBlLk5BUEFSSV9JTUFHRTtcbiAgLyoqIG5hcGFyaS1qcyBoaWdoLWxldmVsIHZpZXcgb3duaW5nIHRoZSAzRCB2b2x1bWUgbGF5ZXJzIChvbmUgYWRkaXRpdmUgdGludGVkIGxheWVyIHBlciBjaGFubmVsXG4gICAqICBmb3IgbXVsdGljaGFubmVsLCBvciBhIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lKS4gTnVsbCBpbiAyRC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVWaWV3OiBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHZvbHVtZSBpcyBjb21wb3NpdGVkIGZyb20gcGVyLWNoYW5uZWwgbGF5ZXJzICh2cyBhIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lKS4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaS1qcyBoZWlnaHQtZmllbGQgc3VyZmFjZSBtZXNoIChOQVBBUklfU1VSRkFDRSBwbG90IHR5cGU7IG51bGwgb3RoZXJ3aXNlKS4gQnVpbHQgZnJvbSBhXG4gICAqICBzaW5nbGUgZ3JheXNjYWxlIHNsaWNlIGJ5IHtAbGluayBidWlsZFN1cmZhY2V9IHZpYSBuYXBhcmktanMncyBgaGVpZ2h0RmllbGRgICsgYGFkZFN1cmZhY2VgLiAqL1xuICBwcml2YXRlIHN1cmZhY2VMYXllcjogU3VyZmFjZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGljaCBiYW5kIHRoZSBzdXJmYWNlIHNhbXBsZXMgKGEgY2hhbm5lbCBpbmRleCBmb3IgbXVsdGljaGFubmVsLCBlbHNlIHRoZSBjb21wb3NpdGUpLiAqL1xuICBwcml2YXRlIHN1cmZhY2VDaGFubmVsOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIG1vdW50ZWQgU3VyZmFjZSBmb2xsb3dzIG9uZSBiYW5kIG9mIGEgbXVsdGljaGFubmVsIGltYWdlLiAqL1xuICBwcml2YXRlIHN1cmZhY2VNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgLyoqIFByZS1sb2FkZWQgcGVyLXNsaWNlIGx1bWluYW5jZSBwbGFuZXMgKGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBzdXJmYWNlIGdyaWQpLCBrZXllZCBieSB6LFxuICAgKiAgc28gdGhlIHN0YWNrIHNsaWRlciByZWJ1aWxkcyB0aGUgc3VyZmFjZSBpbnN0YW50bHkuIEZpbGxlZCBieSB7QGxpbmsgcHJlbG9hZFN1cmZhY2VQbGFuZXN9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cmZhY2VQbGFuZXMgPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cbiAgPigpO1xuICAvKiogSW4tcGxhbmUgZ3JpZCBjYXAgZm9yIHRoZSBhY3RpdmUgc3VyZmFjZSBsb2FkIChmdWxsIGdyaWQgw7cgdGhlIGRlY2ltYXRlIGZhY3RvcikuICovXG4gIHByaXZhdGUgc3VyZmFjZU1heEdyaWQgPSBTVVJGQUNFX01BWF9HUklEO1xuICAvKiogQ29udHJhc3Qgd2luZG93IFttaW4sbWF4XSB0aGUgY3VycmVudCBzdXJmYWNlIG1lc2ggd2FzIGJ1aWx0IHdpdGguIEEgY2hhbmdlIHJlc2hhcGVzIHRoZVxuICAgKiAgbWVzaCAocGl4ZWwgaGVpZ2h0ID0gaW50ZW5zaXR5IHdpdGhpbiBbbWluLG1heF0pLCBzbyBpdCB0cmlnZ2VycyBhIGdlb21ldHJ5IHJlYnVpbGQuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpbmRvdzogW251bWJlciwgbnVtYmVyXSB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyc2lzdGVkIHdpcmVmcmFtZSBjaG9pY2UgZm9yIHRoZSBzdXJmYWNlIChyZS1hcHBsaWVkIHdoZW4gYSBuZXcgc3VyZmFjZSBtb3VudHMpLiAqL1xuICBwcml2YXRlIHN1cmZhY2VXaXJlZnJhbWUgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaS1qcyAyRCBzY2F0dGVyIHBvaW50cyAocmVnaW9uIGNlbnRyb2lkcykgKyBpdHMgcmVnaW9uLWNoYW5nZSBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc2NhdHRlcjJkUG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYXR0ZXJSZWdpb25TdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAvKiogbmFwYXJpLWpzIDNEIHNjYXR0ZXIgKHZveGVsIHBvaW50IGNsb3VkKS4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyM2RMYXllcjogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogU3BhdGlhbC1vbWljcyBvYnNlcnZhdGlvbiBtYXJrZXJzICsgdGhlIGRhdGFzZXQvdmlldyBzdWJzY3JpcHRpb24gZHJpdmluZyB0aGVtLiAqL1xuICBwcml2YXRlIHNwYXRpYWxQb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgM0QgcG9pbnQgY2xvdWQuIE9uZSBsYXllcjogc2VsZWN0aW9uIGlzIGEgcGVyLXBvaW50IGFscGhhIG9uIGl0LCBub3QgYSBzZWNvbmQuICovXG4gIHByaXZhdGUgc3BhdGlhbFBvaW50czNkOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3BhdGlhbExheWVyS2V5M2Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogSW50ZXJsZWF2ZWQgeCx5LHosIGNhY2hlZCBzbyBhIGNvbG91ciBjaGFuZ2UgZG9lcyBub3QgcmUtd2FsayAzLjdNIG9ic2VydmF0aW9ucy4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9zaXRpb25zM2Q6IEZsb2F0MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogSWRlbnRpdHkgb2YgdGhlIHNjYWxhcnMgY3VycmVudGx5IHVwbG9hZGVkIOKAlCBzZWUge0BsaW5rIHJlYnVpbGRTcGF0aWFsUG9pbnRzM2R9LiAqL1xuICBwcml2YXRlIHNwYXRpYWxTY2FsYXJLZXkzZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgYW5hdG9taWNhbCB2b2x1bWUgdGhlIGNsb3VkIHNpdHMgaW5zaWRlLCB3aGVuIHRoZSBkYXRhc2V0IGhhcyBvbmUuICovXG4gIHByaXZhdGUgc3BhdGlhbFZvbHVtZTogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsVm9sdW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFBlci1jbHVzdGVyIGRlbnNpdHkgdm9sdW1lcyBkcmF3biBhbG9uZ3NpZGUgdGhlIGNsb3VkLCBhbmQgd2hhdCB0aGV5IHdlcmVcbiAgICogIGJ1aWx0IGZyb20g4oCUIHJhc3RlcmlzaW5nIGlzIHNlY29uZHMgb2Ygd29yaywgc28gaXQgbXVzdCBub3QgcmVwZWF0IGZvciBhXG4gICAqICBjaGFuZ2UgdGhhdCBjYW5ub3QgYWZmZWN0IHRoZSBmaWVsZC4gKi9cbiAgcHJpdmF0ZSBkZW5zaXR5TGF5ZXJzOiBWb2x1bWVMYXllcltdID0gW107XG4gIHByaXZhdGUgZGVuc2l0eUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTZWxlY3Rpb24gaWRlbnRpdHksIGFzIGEgbnVtYmVyIHRoZSBkZW5zaXR5IGtleSBjYW4gY2FycnkuICovXG4gIHByaXZhdGUgbGFzdFNlbGVjdGlvblNlZW46IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2aXNpb24gPSAwO1xuICAvKiogVGhlIGdlbmUgbWFwOiBpdHMgbGF5ZXIsIHRoZSBmaWVsZCBpdCB3YXMgZXN0aW1hdGVkIGZyb20sIGFuZCB0aGUgaW5wdXRzIGVhY2hcbiAgICogIHdhcyBidWlsdCBmb3Ig4oCUIHRoZSBmaWVsZCBpcyB0aGUgZXhwZW5zaXZlIGhhbGYgYW5kIHN1cnZpdmVzIGEgcmVjb2xvdXIuICovXG4gIHByaXZhdGUgZ2VuZU1hcExheWVyOiBJbWFnZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEZpZWxkOiBFeHByZXNzaW9uRmllbGQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwRmllbGRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIDNEIGdlbmUgbWFwOiBpdHMgdm9sdW1lIGxheWVyLCB0aGUgZmllbGQgYmVoaW5kIGl0LCBhbmQgdGhlIGlucHV0cyBlYWNoXG4gICAqICB3YXMgYnVpbHQgZm9yIOKAlCBzYW1lIHR3byBjbG9ja3MgYXMgdGhlIDJEIG1hcC4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lTGF5ZXI6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcFZvbHVtZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcFZvbHVtZUZpZWxkOiBFeHByZXNzaW9uVm9sdW1lRmllbGQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lRmllbGRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogT2Zmc2V0IGFwcGxpZWQgdG8gb2JzZXJ2YXRpb24gY29vcmRpbmF0ZXMgdG8gc2l0IHRoZW0gaW4gdGhlIHZvbHVtZSdzIGJveC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsT3JpZ2luM2Q6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFswLCAwLCAwXTtcbiAgLyoqIEN1cnNvciB0b29sdGlwIGZvciB0aGUgc3BhdGlhbCB2aWV3cywgYW5kIGV2ZXJ5dGhpbmcgaXQgbmVlZHM6IHdoYXQgdGhlXG4gICAqICBjbG91ZCBpcyBjb2xvdXJlZCBieSwgYW5kIHdoZXJlIGVhY2ggZHJhd24gb2JzZXJ2YXRpb24gaXMuICovXG4gIHByaXZhdGUgc3BhdGlhbFRvb2x0aXA6IE5hcGFyaVNwYXRpYWxUb29sdGlwIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJTb3VyY2U6IEhvdmVyU291cmNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJTb3VyY2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2VxdWVuY2VzIHRoZSBhc3luYyByZXNvbHV0aW9ucy4gVGhlIEtFWSBpcyBvbmx5IGNvbW1pdHRlZCBvbmNlIG9uZSBsYW5kcyxcbiAgICogIHNvIGEgc3VwZXJzZWRlZCBmZXRjaCBjYW5ub3QgbGVhdmUgdGhlIGNhY2hlIGNsYWltaW5nIHRvIGhvbGQgYSBzb3VyY2UgaXRcbiAgICogIG5ldmVyIHN0b3JlZC4gKi9cbiAgcHJpdmF0ZSBob3ZlclNvdXJjZVRva2VuID0gMDtcbiAgLyoqIERyYXduIG9ic2VydmF0aW9ucycgcG9zaXRpb25zIGZvciBoaXQtdGVzdGluZywgaW5kZXhlZCBCWSBPQlNFUlZBVElPTiB3aXRoXG4gICAqICBOYU4gZm9yIGFueXRoaW5nIG5vdCBkcmF3bi4gU2NyZWVuIHBpeGVscyBpbiAzRCAodGhlIGNhbWVyYSBtb3ZlcyB0aGVtLCBzb1xuICAgKiAgdGhleSBhcmUgcmVidWlsdCB3aGVuIGl0IGRvZXMpIGFuZCBXT1JMRCB1bml0cyBpbiAyRCAod2hlcmUgdGhlIGNhbWVyYSBvbmx5XG4gICAqICBzY2FsZXMsIHNvIHRoZSBwb2ludGVyIGlzIGNvbnZlcnRlZCBpbnN0ZWFkIG9mIDM3NGsgcG9pbnRzKS4gKi9cbiAgcHJpdmF0ZSBob3ZlclBvc2l0aW9uczogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJQb3NpdGlvbnNSZXYgPSAtMTtcblxuICAvKipcbiAgICogU2NyZWVuLXNwYWNlIGJ1Y2tldCBpbmRleCBvdmVyIHRoZSAzRCBwcm9qZWN0aW9uLCBidWlsdCBvbiB0aGUgZmlyc3QgaG92ZXIgYWZ0ZXIgdGhlXG4gICAqIHNjZW5lIG1vdmVkIHJhdGhlciB0aGFuIHdoZW4gaXQgbW92ZXMuXG4gICAqXG4gICAqIExhemlseSwgYW5kIHRoYXQgaXMgdGhlIHdob2xlIGRlc2lnbjogYW4gb3JiaXQgZHJhZyBjaGFuZ2VzIHRoZSBjYW1lcmEgZXZlcnkgZnJhbWUsIHNvXG4gICAqIGJ1aWxkaW5nIGVhZ2VybHkgd291bGQgc3BlbmQgdGVucyBvZiBtaWxsaXNlY29uZHMgYSBmcmFtZSBpbmRleGluZyBmb3IgcGlja3Mgbm9ib2R5IGlzXG4gICAqIG1ha2luZy4gRGVmZXJyZWQsIGl0IGlzIGJ1aWx0IG9uY2Ugd2hlbiB0aGUgZHJhZyBzdG9wcyBhbmQgdGhlIHBvaW50ZXIgbmV4dCBtb3ZlcyDigJRcbiAgICogbWVhc3VyZWQgdXBzdHJlYW0gYXQgMy43TSBwb2ludHMsIHRoYXQgdHVybnMgYSAxMi42IG1zIHNjYW4gcGVyIHBvaW50ZXJtb3ZlIGludG9cbiAgICogMC4wNjYgbXMuXG4gICAqL1xuICBwcml2YXRlIGhvdmVySW5kZXg6IFNjcmVlbkluZGV4IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgd2hlbmV2ZXIgdGhlIGNhY2hlZCBwb3NpdGlvbnMgZ28gc3RhbGU6IGEgbWFya2VyIHJlYnVpbGQsIG9yIOKAlCBpbiAzRFxuICAgKiAgb25seSwgd2hlcmUgdGhlIHByb2plY3Rpb24gZGVwZW5kcyBvbiBpdCDigJQgYSBjYW1lcmEgbW92ZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2NlbmVSZXYgPSAwO1xuICBwcml2YXRlIGhvdmVyUG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyRnJhbWUgPSAwO1xuICBwcml2YXRlIGhvdmVyT2ZmOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICAvKiogT2JzZXJ2YXRpb24gaW5kaWNlcyB0aGUgY2FjaGVkIDNEIHBvc2l0aW9ucyBiZWxvbmcgdG8sIGluIHRoZSBzYW1lIG9yZGVyO1xuICAgKiAgbnVsbCB3aGVuIGV2ZXJ5IG9ic2VydmF0aW9uIGlzIGRyYXduLiBXaXRob3V0IGl0IGEgcHJvamVjdGlvbiBidWlsdCBmcm9tIHRoZVxuICAgKiAgcG9zaXRpb25zIGlzIGluZGV4ZWQgYnkgRFJBV04gb3JkZXIgYW5kIHNpbGVudGx5IGF0dHJpYnV0ZXMgZWFjaCBwb2ludCB0b1xuICAgKiAgdGhlIHdyb25nIG9ic2VydmF0aW9uIGFzIHNvb24gYXMgYSBzZWN0aW9uIGlzIGlzb2xhdGVkLiAqL1xuICBwcml2YXRlIHNwYXRpYWxEcmF3bjNkOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBSZXVzZWQgcHJvamVjdGlvbiBidWZmZXJzIOKAlCBzZWUge0BsaW5rIGdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9ufS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUHJvamVjdGlvbjNkOiBQcm9qZWN0ZWRQb2ludHMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqIFBlci1vYnNlcnZhdGlvbiBkZXB0aCBmcm9tIHRoZSBsYXN0IHByb2plY3Rpb24sIGZvciB0aGUgZGVwdGgtYXdhcmUgaG92ZXIgcGljay4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRGVwdGhzM2Q6IEZsb2F0MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlICh2aWV3ZXIsIGRhdGFzZXQpIHdob3NlIDNEIHNjZW5lIGhhcyBhbHJlYWR5IGhhZCBpdHMgb3BlbmluZyBmcmFtaW5nLiAqL1xuICAvKiogV2hvc2UgMkQgb2JzZXJ2YXRpb25zIHRoZSBjYW1lcmEgaGFzIGJlZW4gZnJhbWVkIG9uIOKAlCBzZWUge0BsaW5rIGZyYW1lU3BhdGlhbFBvaW50c09uY2V9LiAqL1xuICBwcml2YXRlIHNwYXRpYWwyZEZyYW1lZDogeyB2aWV3ZXI6IFZpZXdlcjsgZGF0YXNldElkOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogRGF0YXNldCB0aGUgM0Qgc2NhbGUgYmFyIHdhcyBidWlsdCBmb3IuICovXG4gIHByaXZhdGUgc3BhdGlhbFNjYWxlQmFyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCAoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKSB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gc2F3LCBzbyBhIHNsaWNlXG4gICAqICBjaGFuZ2UgY2FuIHJlYnVpbGQgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUuICovXG4gIHByaXZhdGUgc3BhdGlhbExhdGVzdDogW1NwYXRpYWxEYXRhc2V0IHwgbnVsbCwgU3BhdGlhbFZpZXdTdGF0ZSwgU3BhdGlhbFNlbGVjdGlvbk1hc2tdIHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgLyoqIFdoaWNoIGRhdGFzZXQgdGhlIGN1cnJlbnQgbWFya2VyIGxheWVyIHdhcyBidWlsdCBmb3IsIHNvIGEgZGlzcGxheS1vbmx5XG4gICAqICBjaGFuZ2UgKHNpemUsIGNvbG91ciwgb3BhY2l0eSwgc2VsZWN0aW9uKSBjYW4gdXBkYXRlIGl0IGluIHBsYWNlLiAqL1xuICBwcml2YXRlIHNwYXRpYWxMYXllcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBNb25vdG9uaWMgZ3VhcmQgZm9yIHRoZSBhc3luYyBjb2xvdXIgcmVidWlsZDogZmV0Y2hpbmcgYSBnZW5lIHZlY3RvciBpcyBhXG4gICAqICByb3VuZC10cmlwLCBzbyBhIGZhc3Qgc2VxdWVuY2Ugb2YgY29sb3VyLWJ5IGNoYW5nZXMgY2FuIHJlc29sdmUgb3V0IG9mXG4gICAqICBvcmRlci4gT25seSB0aGUgbmV3ZXN0IHJlYnVpbGQgaXMgYWxsb3dlZCB0byB0b3VjaCB0aGUgbGF5ZXIuICovXG4gIHByaXZhdGUgc3BhdGlhbFJlYnVpbGRUb2tlbiA9IDA7XG4gIC8qKiBNb25vdG9uaWMgbG9hZCBnZW5lcmF0aW9uLiBCdW1wZWQgYnkge0BsaW5rIHJlc2V0fSBhbmQge0BsaW5rIGNhbmNlbExvYWRpbmd9OyB0aGUgZnJhbWUtbG9hZGluZ1xuICAgKiAgbG9vcHMgKHZvbHVtZSBhc3NlbWJseSwgc3VyZmFjZSBwcmVsb2FkKSBjYXB0dXJlIGl0IGFuZCBiYWlsIHdoZW4gaXQgY2hhbmdlcywgc28gYSBDYW5jZWwgKG9yIGFcbiAgICogIG5ldyBwbG90KSBhY3R1YWxseSBzdG9wcyBmZXRjaGluZyBmcmFtZXMgaW5zdGVhZCBvZiBydW5uaW5nIHRvIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgbG9hZFRva2VuID0gMDtcbiAgLyoqIERlY2ltYXRlIGZhY3RvciBmb3IgdGhlIG5hcGFyaSAzRCB0eXBlcyAoMSA9IEZ1bGwsIDIgPSDCvSBkZWZhdWx0LCA0ID0gwrwsIDggPSDihZspLiBBcHBsaWVkIHdoZW4gYVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZSAocmUpbG9hZHM7IGNoYW5naW5nIGl0IG5lZWRzIGEgcmUtcGxvdCAoaXQgY2hhbmdlcyBmZXRjaGVkIGRhdGEpLiAqL1xuICBwcml2YXRlIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuICAvKiogM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZSB2aWV3IChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGF5ZXI6IEF4ZXNMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogRE9NIFgvWS9aICsgc2NhbGUgbGFiZWxzIHRyYWNraW5nIHRoZSAzRCBheGVzIGdpem1vIChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGFiZWxzOiBOYXBhcmlBeGVzTGFiZWxzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEcmFnZ2FibGUgWi1oZWlnaHQgZ3JpcCBvdmVyIHRoZSB2b2x1bWUgKG51bGwgdW5sZXNzIGEgdm9sdW1lL2lzb3N1cmZhY2UgaXMgbW91bnRlZCkuICovXG4gIHByaXZhdGUgekhhbmRsZTogTmFwYXJpVm9sdW1lWkhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAvKiogVXNlciBaLWhlaWdodCBmYWN0b3IgZm9yIHRoZSB2b2x1bWUgKDEgPSB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyk7IGRyaXZlbiBieSB0aGVcbiAgICogIGluLXZpZXcgZHJhZyBoYW5kbGUuIFJlc2V0IHBlciBtb3VudC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVaU2NhbGUgPSAxO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBgdm9sdW1lWlNjYWxlID0gMWAgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGVcbiAgICogIHRoZSBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVXb3JsZEJhc2U6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvbHVtZVNhbXBsZWREZXB0aCA9IDE7XG4gIC8qKiBQZXJzaXN0ZWQgYXhlcyBvbi9vZmYgY2hvaWNlLCByZS1hcHBsaWVkIHdoZW4gYSBuZXcgdm9sdW1lIG1vdW50cy4gRGVmYXVsdHMgb24uICovXG4gIHByaXZhdGUgYXhlc1Zpc2libGUgPSB0cnVlO1xuICBwcml2YXRlIHZvbHVtZURpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZUNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgaW1hZ2VXID0gMDtcbiAgcHJpdmF0ZSBpbWFnZUggPSAwO1xuICAvKiogTW9ub3RvbmljIHNsaWNlLXJlcXVlc3QgaWQgc28gYSBzbG93IG91dC1vZi1vcmRlciBzbGljZSBmZXRjaCBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLiAqL1xuICBwcml2YXRlIHNsaWNlUmVxID0gMDtcbiAgLyoqIENhY2hlZCBgL3RpbGVzL2luZm9gIHB5cmFtaWQgZGVzY3JpcHRvciArIHRoZSBpbmZvQjY0IGl0IHdhcyBmZXRjaGVkIGZvci4gKi9cbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3JLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgMkQgaW1hZ2UgaXMgY29tcG9zaXRlZCAoZHJpdmVzIGhpc3RvZ3JhbSArIHN0YXRlIGFwcGxpY2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZU1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJyA9ICdyZ2InO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyB0aGF0IG93bnMgdGhlIHBlci1jaGFubmVsIGxheWVyIHNldCAoYnVpbGQgKyBsaXZlIGRpc3BsYXlcbiAgICogIHVwZGF0ZXMpIGZvciB0aGUgY3VycmVudCB7QGxpbmsgaW1hZ2VNb2RlfS4gUmVidWlsdCBvbiBlYWNoIChyZSlyZW5kZXIuICovXG4gIHByaXZhdGUgY2hhbm5lbFZpZXc6IE11bHRpQ2hhbm5lbEltYWdlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogTGl2ZSBzdWJzY3JpcHRpb24gYXBwbHlpbmcgY2hhbm5lbC1zdGF0ZSAvIGNvbG9ybWFwIGNoYW5nZXMgdG8gdGhlIGxheWVycy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBncmF5c2NhbGUgY29sb3JtYXAgc2VsZWN0aW9uIGZyb20gdGhlIHN0b3JlIChhcHBsaWVkIHRvIHRoZSBzaW5nbGUgZ3JheSBsYXllcikuICovXG4gIHByaXZhdGUgY3VycmVudENvbG9ybWFwOiBDb2xvcm1hcE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UmV2ZXJzZSA9IGZhbHNlO1xuICAvKiogTGF0ZXN0IGludmVydCB0b2dnbGUgZnJvbSB0aGUgc3RvcmUgKGZsaXBzIGludGVuc2l0eSBiZWZvcmUgdGhlIGNvbG9ybWFwLCBsaWtlIE9TRCkuICovXG4gIHByaXZhdGUgaW52ZXJ0RW5hYmxlZCA9IGZhbHNlO1xuICAvKiogUGh5c2ljYWwgc2NhbGUgYmFyIG92ZXJsYXkgZm9yIHRoZSAyRCBpbWFnZSAobnVsbCB3aGVuIDNEIG9yIHRoZSBpbWFnZSBoYXMgbm8gwrVtL3BpeGVsKS4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcjogTmFwYXJpU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgdW50aWwgYSAyRCBpbWFnZSBpcyBwbG90dGVkKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25PdmVybGF5OiBOYXBhcmlSZWdpb25PdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQaXhlbC10b29sIHBsdW1iaW5nOiB0aGUgcGxvdCBkaXYgaWQsIGNvb3JkIHRyYW5zZm9ybSwgYW5kIGJvdW5kIHRvb2wgaG9zdHMuICovXG4gIHByaXZhdGUgcGxvdERpdklkID0gJyc7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3Q6IFdhbmRUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVyYXNlckhvc3Q6IFZlcnRleEVyYXNlclRvb2xIb3N0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWaXNpYmxlIHdvcmxkIHJlY3QgY2FwdHVyZWQgQVQgdGhlIGxhc3QgcmVhZGJhY2sg4oCUIG11c3QgcGFpciB3aXRoIGBsYXN0UGl4ZWxzYCBzbyB0aGUgcGl4ZWxcbiAgICogIHRvb2xzJyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZSBtYXRyaXgncyBjYW1lcmEgKHVzaW5nIHRoZSBsaXZlIHJlY3QgYWZ0ZXIgYSBwYW4vem9vbSB3b3VsZFxuICAgKiAgbWlzLXNjYWxlIHRoZSByZWdpb24pLiAqL1xuICBwcml2YXRlIGxhc3RQaXhlbHNSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKSB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzLCB0aGUgZGVmYXVsdCkuICovXG4gIHByaXZhdGUgaW1hZ2VTbW9vdGhpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hlbiB0aGUgMkQgaW1hZ2UgaXMgcmVuZGVyZWQgdmlhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZXMgKGRlc2NyaXB0b3IgYXZhaWxhYmxlKS4gKi9cbiAgcHJpdmF0ZSB0aWxlZCA9IGZhbHNlO1xuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIHRpbWVyICsgY2FtZXJhLWNoYW5nZSB1bnN1YnNjcmliZSAoa2VlcCBsYXN0UGl4ZWxzIGN1cnJlbnQgZm9yIHRvb2xzKS4gKi9cbiAgcHJpdmF0ZSByZWFkYmFja1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYVJlYWRiYWNrT2ZmOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqIENvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIChrZXllZCBieSBjaGFubmVsIGluZGV4KSBmb3IgdGhlIGhpc3RvZ3JhbSBpbiB0aWxlZCBtb2RlLFxuICAgKiAgd2hlcmUgdGhlIGxheWVycyBoYXZlIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscy4gUmVmcmVzaGVkIG9uIHBsb3QgKyBzbGljZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdFNhbXBsZXMgPSBuZXcgTWFwPG51bWJlciwgVWludDhBcnJheT4oKTtcbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtcyBmcm9tIGAvaGlzdG9ncmFtYCwga2V5ZWQgYCR7en18JHtjaGFubmVsfWAgKD44LWJpdCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSByZWFkb25seSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJhc2VyVG9vbDogVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBvbmx5IGEgaG9zdCB0aGF0IHNlcnZlcyBzcGF0aWFsLW9taWNzIGRhdGEgcHJvdmlkZXMgaXQsIGFuZFxuICAgIC8vIHdpdGhvdXQgaXQgdGhlIFNQQVRJQUxfT01JQ1MgcGxvdCB0eXBlIGlzIG5ldmVyIG9mZmVyZWQgYW55d2F5LlxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCArIGNhY2hlIHRoZSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIChgR0VUIC90aWxlcy9pbmZvYCk6IHRoZSBSRUFMIHBlci1sZXZlbCB0aWxlIGdyaWQsXG4gICAqIHRpbGUgc2l6ZSwgY2hhbm5lbCBtZXRhZGF0YSBhbmQgcGh5c2ljYWwgcGl4ZWwgc2l6ZS4gVGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZVxuICAgKiBpcyBzdGlsbCBjYWNoaW5nLCBzbyB3ZSBwb2xsIGJyaWVmbHkuIENhY2hlZCBwZXIgYGluZm9CNjRgOyByZXR1cm5zIG51bGwgaWYgaXQgbmV2ZXIgYmVjb21lc1xuICAgKiByZWFkeSAoY2FsbGVycyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUtdGlsZSBmZXRjaCkuIFRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgZ3JpZCDigJQgZ3Vlc3NpbmdcbiAgICogbGV2ZWwgZGltcyBmcm9tIGB0cnVlSW1hZ2VTaXplYCBvdmVyc2hvb3RzIHRoZSByZWFsIGdyaWQgYW5kIHRoZSBzZXJ2ZXIgNDAwcyBvdXQtb2YtcmFuZ2UgdGlsZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlc2NyaXB0b3IoKTogUHJvbWlzZTxUaWxlRGVzY3JpcHRvciB8IG51bGw+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAobm8gdGlsZSBzZXJ2ZXIg4oCUIGUuZy4gYSBudW1iZXJlZCBpbWFnZVxuICAgIC8vIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsIGVhY2ggc2xpY2UgYSBkaWZmZXJlbnQgZmlsZSk6IHRoZXJlIGlzIG5vXG4gICAgLy8gc2luZ2xlIHNlcnZlci10aWxlZCBweXJhbWlkIHRvIGRlc2NyaWJlLiBSZXR1cm5pbmcgbnVsbCByb3V0ZXMgZXZlcnlcbiAgICAvLyBjYWxsZXIgKDJEIGltYWdlLCB2b2x1bWUsIHN1cmZhY2UpIHRvIHRoZWlyIHN0aXRjaGVkL3NpbmdsZS1mZXRjaFxuICAgIC8vIGZhbGxiYWNrLCB3aGljaCDigJQgdmlhIGZldGNoU2xpY2UncyBvd24gU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIGJyYW5jaCDigJRcbiAgICAvLyBjb3JyZWN0bHkgZmV0Y2hlcyBlYWNoIHNsaWNlJ3Mgb3duIFVSTCBpbnN0ZWFkIG9mIG9uZSBmaXhlZCBmaWxlJ3MgdGlsZVxuICAgIC8vIHB5cmFtaWQuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUodGhpcy5sb2FkZWQ/LmltYWdlSW5mbykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmRlc2NyaXB0b3JLZXkgPT09IGluZm9CNjQpIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgREVTQ1JJUFRPUl9USU1FT1VUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3AuanNvbigpKSBhcyBUaWxlRGVzY3JpcHRvcjtcbiAgICAgICAgICBpZiAoYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGJvZHk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3JLZXkgPSBpbmZvQjY0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgZW1wdHkgYm9keSDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRpbGVzL2luZm8gbm90IHJlYWR5OyBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlLXRpbGUgZmV0Y2gnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMjAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgQ09NUExFVEUgcmVuZGVyZWQgc2xpY2UgYXMgYW4gYEltYWdlQml0bWFwYCBieSBzdGl0Y2hpbmcgdGhlIHNlcnZlcidzIFJFQUwgdGlsZSBncmlkXG4gICAqIChmcm9tIGAvdGlsZXMvaW5mb2ApIOKAlCBub3QganVzdCB0aGUgdG9wLWxlZnQgdGlsZSwgd2hpY2ggb25seSBldmVyIHNob3dlZCBhIGxhcmdlIGltYWdlJ3NcbiAgICogY29ybmVyLiBQaWNrcyB0aGUgZmluZXN0IHB5cmFtaWQgbGV2ZWwgd2hvc2UgZ3JpZCBmaXRzIGBidWRnZXRUaWxlc2AgYW5kIHdob3NlIGxvbmdlc3Qgc2lkZSBpc1xuICAgKiB3aXRoaW4gdGhlIEdQVSB0ZXh0dXJlIGxpbWl0LCBmZXRjaGVzIHRoYXQgZ3JpZCBjb25jdXJyZW50bHksIGFuZCBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMuXG4gICAqXG4gICAqIGBjaGFubmVsYCBzZWxlY3RzIGEgc2luZ2xlIGJhbmQgYXMgZ3JheXNjYWxlIChyZWFsIGxldmVscyBvbmx5KTsgb21pdCBmb3IgdGhlIHNlcnZlciBjb21wb3NpdGUuXG4gICAqIGBidWRnZXRUaWxlc2AgY2FwcyB0aGUgZ3JpZDogdGhlIDJEIHZpZXcgdXNlcyB0aGUgZnVsbCBidWRnZXQgZm9yIGRldGFpbDsgdGhlIDNEIHZvbHVtZSBwYXNzZXNcbiAgICogMSBmb3IgYSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBzbGljZSAoaXQgZG93bnNhbXBsZXMgdG8ge0BsaW5rIFZPTFVNRV9NQVhfU0xJQ0V9KS4gRmFsbHMgYmFja1xuICAgKiB0byBhIHNpbmdsZSBgY29sPTAscm93PTBgIHRpbGUgd2hlbiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSAoc21hbGwvc2ltcGxlIGltYWdlcywgdm9sdW1lcykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU2xpY2UoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM6IG51bWJlciA9IE1BWF9TVElUQ0hfVElMRVMsXG4gICAgLyoqIFdoZW4gYSBzcGVjaWZpYyBjaGFubmVsIGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiBgYnVkZ2V0VGlsZXNgLCBkcm9wIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiAgQ09NUE9TSVRFIG92ZXJ2aWV3IGluc3RlYWQgb2Ygc3RpdGNoaW5nIHRoZSBodWdlIHBlci1jaGFubmVsIGxldmVsLiBPbmx5IHNhZmUgd2hlbiB0aGUgY2FsbGVyXG4gICAgICogIHdhbnRzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSAodGhlIHN1cmZhY2UgaGVpZ2h0KTogZm9yIGEgbXVsdGljaGFubmVsIFZPTFVNRSBldmVyeSBjaGFubmVsXG4gICAgICogIHdvdWxkIHRoZW4gZmV0Y2ggdGhlIHNhbWUgY29tcG9zaXRlIGFuZCB0aGUgY2hhbm5lbHMgd291bGQgY29sbGFwc2UgaW50byBvbmUsIHNvIHZvbHVtZVxuICAgICAqICBhc3NlbWJseSBsZWF2ZXMgdGhpcyBgZmFsc2VgIHRvIGtlZXAgZWFjaCBiYW5kIGRpc3RpbmN0LiAqL1xuICAgIGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxJbWFnZUJpdG1hcD4ge1xuICAgIC8vIFNlbGYtY29udGFpbmVkIG11bHRpLXNsaWNlIHN0YWNrICh0aWxlZDpmYWxzZSk6IGB6YCBpbmRleGVzIGEgY29tcGxldGVseVxuICAgIC8vIGRpZmZlcmVudCBmaWxlJ3Mgb3duIHByZXZpZXcgVVJMLCBub3QgYW4gaW50ZXJuYWwgc2xpY2Ugb2Ygb25lIHNlcnZlci1cbiAgICAvLyB0aWxlZCBmaWxlIOKAlCByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChzaGFyZWRcbiAgICAvLyB3aXRoIE9TRDsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIGJhcmUgZmV0Y2goKSkgaW5zdGVhZCBvZlxuICAgIC8vIGJ1aWxkaW5nIGEgL3RpbGU/aW5mbz0uLi4mej0gcmVxdWVzdCBhZ2FpbnN0IHdoaWNoZXZlciBzaW5nbGUgZmlsZVxuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCgpIHBvaW50cyBhdCAod2hpY2ggd291bGQgNDAwL21pc21hdGNoIGZvciBhbnkgelxuICAgIC8vIGJleW9uZCB0aGF0IG9uZSBmaWxlJ3Mgb3duIGV4dGVudCkuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykpIHtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHZvbHVtZTogZmV0Y2ggdGhlIHJlcXVlc3RlZCBjaGFubmVsJ3MgT1dOIHBsYW5lXG4gICAgICAvLyAoY2hhbm5lbFVybHNbel1bY2hhbm5lbF0pIHNvIGVhY2ggYmFuZCBzdGF5cyBkaXN0aW5jdCDigJQgdGhlIGNsaWVudC1zaWRlXG4gICAgICAvLyBhbmFsb2cgb2YgdGhlIHNlcnZlcidzIHBlci1jaGFubmVsIC90aWxlP2NoYW5uZWw9Yy4gRWxzZSB0aGUgei1hbmNob3IgVVJMLlxuICAgICAgY29uc3QgY2hVcmxzID0gKGluZm8gYXMgSUltYWdlSW5mbykuY2hhbm5lbFVybHM7XG4gICAgICBjb25zdCB1cmwgPSBjaGFubmVsICE9IG51bGwgJiYgY2hVcmxzPy5bel0/LltjaGFubmVsXSAhPSBudWxsXG4gICAgICAgID8gY2hVcmxzW3pdW2NoYW5uZWxdXG4gICAgICAgIDogdGhpcy5zaW1wbGVTdGFjay51cmxGb3IoaW5mbyBhcyBJSW1hZ2VJbmZvLCB6KTtcbiAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIG5vIFVSTCBmb3Igc2xpY2UgJHt6fWApO1xuICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0JpdG1hcCh1cmwpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gbm8gc2VsZWN0ZWQgaW1hZ2UgaW5mbyAoZ2V0U2VsZWN0ZWRJbmZvQjY0IG51bGwpJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG5cbiAgICAvLyBUaGUgcmVxdWVzdGVkIGJhbmQ7IG1heSBiZSBkcm9wcGVkIHRvIHRoZSBjb21wb3NpdGUgKHVuZGVmaW5lZCkgYmVsb3cgd2hlbiB0aGUgY2hhbm5lbCBoYXMgbm9cbiAgICAvLyBweXJhbWlkIGxldmVsIHNtYWxsIGVub3VnaCB0byBzdGl0Y2ggd2l0aGluIGJ1ZGdldC5cbiAgICBsZXQgZWZmZWN0aXZlQ2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgY29uc3QgZmV0Y2hUaWxlID0gYXN5bmMgKFxuICAgICAgcmVzOiBudW1iZXIsXG4gICAgICBjb2w6IG51bWJlcixcbiAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgdDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+ID0+IHtcbiAgICAgIGNvbnN0IGNoID0gZWZmZWN0aXZlQ2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtlZmZlY3RpdmVDaGFubmVsfWA7XG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2NvbH0mcm93PSR7cm93fSZ6PSR7en0mdGlsZVNpemU9JHt0fSR7Y2h9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHNsaWNlIGZldGNoIGZhaWxlZDogJHtyZXNwLnN0YXR1c30gKCR7Y29sfS8ke3Jvd30gcmVzICR7cmVzfSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgfTtcblxuICAgIC8vIE5vIGRlc2NyaXB0b3Ig4oaSIHNpbmdsZSB0b3AtbGVmdCB0aWxlIChsZWdhY3kgZmFsbGJhY2s7IGNvcnJlY3QgZm9yIHNtYWxsL3NpbXBsZSBpbWFnZXMpLlxuICAgIGlmICghZGVzYyB8fCAhZGVzYy5sZXZlbHM/Lmxlbmd0aCkgcmV0dXJuIGZldGNoVGlsZSgwLCAwLCAwLCBUSUxFX1NJWkUpO1xuXG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IE9OTFkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHMgKHRoZSBmcm9udCBvZiBgbGV2ZWxzYCk7IHRoZSBzZXJ2ZXJcbiAgICAvLyBjb21wb3NpdGUgZXhpc3RzIGF0IGV2ZXJ5IGxldmVsLCBpbmNsdWRpbmcgdGhlIHNtYWxsIG92ZXJ2aWV3cy5cbiAgICBjb25zdCBwZXJDaGFubmVsTGV2ZWxzID0gZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsID8gZGVzYy5sZXZlbHMgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBwZXJDaGFubmVsTGV2ZWxzKSk7XG5cbiAgICAvLyBGaW5lc3QgbGV2ZWwgd2hvc2Ugc3RpdGNoZWQgZ3JpZCBmaXRzIEJPVEggdGhlIHRpbGUgYnVkZ2V0IGFuZCB0aGUgR1BVIHRleHR1cmUgbGltaXQ7IGlmIG5vbmVcbiAgICAvLyBmaXRzLCB0aGUgY29hcnNlc3QgYXZhaWxhYmxlIChmaXRzPWZhbHNlKS5cbiAgICBjb25zdCB0aWxlc0ZvciA9IChsdmw6IFRpbGVMZXZlbCk6IG51bWJlciA9PlxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpKSAqIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwuaGVpZ2h0IC8gdCkpO1xuICAgIGNvbnN0IHBpY2sgPSAobGV2ZWxzOiBUaWxlTGV2ZWxbXSk6IHsgbHZsOiBUaWxlTGV2ZWw7IGZpdHM6IGJvb2xlYW4gfSA9PiB7XG4gICAgICBsZXQgYyA9IGxldmVsc1swXTtcbiAgICAgIGZvciAoY29uc3QgbHZsIG9mIGxldmVscykge1xuICAgICAgICBjID0gbHZsO1xuICAgICAgICBpZiAodGlsZXNGb3IobHZsKSA8PSBidWRnZXRUaWxlcyAmJiBNYXRoLm1heChsdmwud2lkdGgsIGx2bC5oZWlnaHQpIDw9IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgICAgIHJldHVybiB7IGx2bCwgZml0czogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBsdmw6IGMsIGZpdHM6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCBzZWwgPSBwaWNrKHVzYWJsZSk7XG4gICAgLy8gQSBzcGVjaWZpYyBjaGFubmVsIG9ubHkgaGFzIHRpbGVzIGF0IHRoZSAoZmV3LCBsYXJnZSkgcmVhbCBsZXZlbHMuIFdoZW4gbm9uZSBvZiB0aGVtIGZpdCB0aGVcbiAgICAvLyBidWRnZXQg4oCUIGUuZy4gdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXMgc3RpbGwgMTQ5ODLDlzE4NjcwIOKGkiB+MTEwMCBmdWxsLXJlcyB0aWxlcyDigJQgc3RpdGNoaW5nXG4gICAgLy8gaXQgcGVyIHNsaWNlIGZsb29kcyB0aGUgc2VydmVyICg1MDRzKSBhbmQgc3RhbGxzIHRoZSBsb2FkLiBUaGUgY29tcG9zaXRlIHB5cmFtaWQgaGFzIHNtYWxsXG4gICAgLy8gb3ZlcnZpZXcgbGV2ZWxzLCBzbyBmZXRjaCB0aGUgY29tcG9zaXRlIGluc3RlYWQgYW5kIGRlcml2ZSBsdW1pbmFuY2UgZnJvbSBpdC4gRXZlcnkgY2FsbGVyIGhlcmVcbiAgICAvLyAoc3VyZmFjZSBoZWlnaHQsIHZvbHVtZSBhc3NlbWJseSwgcmVhZGJhY2spIGRvd25zY2FsZXMgdGhlIHBsYW5lIGFueXdheSwgc28gYSBjb21wb3NpdGUtZGVyaXZlZFxuICAgIC8vIHBsYW5lIGlzIHRoZSByaWdodCB0cmFkZSBmb3Igb25lIHRoYXQgYWN0dWFsbHkgbG9hZHMuIE9ubHkga2lja3MgaW4gd2hlbiB0aGUgY2hhbm5lbCBjYW4ndCBmaXQuXG4gICAgaWYgKGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgJiYgIXNlbC5maXRzICYmIGNoYW5uZWwgIT0gbnVsbCAmJiBkZXNjLmxldmVscy5sZW5ndGggPiBwZXJDaGFubmVsTGV2ZWxzKSB7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBwaWNrKGRlc2MubGV2ZWxzKTtcbiAgICAgIGlmIChjb21wb3NpdGUuZml0cyB8fCB0aWxlc0Zvcihjb21wb3NpdGUubHZsKSA8IHRpbGVzRm9yKHNlbC5sdmwpKSB7XG4gICAgICAgIGVmZmVjdGl2ZUNoYW5uZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNlbCA9IGNvbXBvc2l0ZTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbbmFwYXJpLWpzXSBjaGFubmVsICR7Y2hhbm5lbH0gaGFzIG5vIHB5cmFtaWQgbGV2ZWwgd2l0aGluIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlIGAgK1xuICAgICAgICAgICAgYGJ1ZGdldDsgdXNpbmcgdGhlIGNvbXBvc2l0ZSBvdmVydmlldyAocmVzICR7c2VsLmx2bC5yZXN9LCAke3NlbC5sdmwud2lkdGh9w5dgICtcbiAgICAgICAgICAgIGAke3NlbC5sdmwuaGVpZ2h0fSkgZm9yIHRoaXMgcGxhbmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2hvc2VuID0gc2VsLmx2bDtcbiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi53aWR0aCAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi5oZWlnaHQgLyB0KSk7XG4gICAgaWYgKCFzZWwuZml0cyAmJiBidWRnZXRUaWxlcyA9PT0gTUFYX1NUSVRDSF9USUxFUykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gZnVsbCByZXNvbHV0aW9uIGV4Y2VlZHMgdGhlICR7YnVkZ2V0VGlsZXN9LXRpbGUvJHtNQVhfVEVYVFVSRV9ESU19cHggYnVkZ2V0OyBgICtcbiAgICAgICAgICBgZGlzcGxheWluZyBvdmVydmlldyBsZXZlbCByZXMgJHtjaG9zZW4ucmVzfSAoJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9KS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29scyA9PT0gMSAmJiByb3dzID09PSAxKSByZXR1cm4gZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIDAsIDAsIHQpO1xuXG4gICAgLy8gU3RpdGNoIGludG8gb25lIGxldmVsLXNpemVkIGNhbnZhcy4gRmV0Y2ggdGhlIGdyaWQgd2l0aCBCT1VOREVEIGNvbmN1cnJlbmN5OiBmaXJpbmcgZXZlcnkgdGlsZVxuICAgIC8vIGF0IG9uY2UgKGEgYmlnIGdyaWQgPSBodW5kcmVkcyBvZiByZXF1ZXN0cykgb3ZlcndoZWxtZWQgdGhlIHRpbGUgc2VydmVyICg1MDRzKS4gRWRnZSB0aWxlcyBhcmVcbiAgICAvLyBuYXJyb3dlci9zaG9ydGVyOyBkcmF3SW1hZ2UgcGxhY2VzIGVhY2ggYXQgaXRzIGdyaWQgb2Zmc2V0IHNvIHBhcnRpYWwgdGlsZXMgbGluZSB1cC5cbiAgICBjb25zdCBjb29yZHM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaCh7IGNvbCwgcm93IH0pO1xuICAgIH1cbiAgICBjb25zdCB0aWxlczogQXJyYXk8eyBjb2w6IG51bWJlcjsgcm93OiBudW1iZXI7IGJtcDogSW1hZ2VCaXRtYXAgfT4gPSBbXTtcbiAgICBjb25zdCBzdGl0Y2hXb3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGpvYiA9IGNvb3Jkcy5zaGlmdCgpO1xuICAgICAgICBpZiAoIWpvYikgcmV0dXJuO1xuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGUoY2hvc2VuLnJlcywgam9iLmNvbCwgam9iLnJvdywgdCk7XG4gICAgICAgIHRpbGVzLnB1c2goeyBjb2w6IGpvYi5jb2wsIHJvdzogam9iLnJvdywgYm1wIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihUSUxFX0ZFVENIX0NPTkNVUlJFTkNZLCBjb29yZHMubGVuZ3RoKSB9LCAoKSA9PiBzdGl0Y2hXb3JrZXIoKSksXG4gICAgKTtcblxuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IGNob3Nlbi53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBjaG9zZW4uaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2Ugc3RpdGNoOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgZm9yIChjb25zdCB7IGNvbCwgcm93LCBibXAgfSBvZiB0aWxlcykge1xuICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBTYWZldHkgbmV0OiBpZiB0aGUgY2hvc2VuIGxldmVsIHN0aWxsIGV4Y2VlZHMgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0IChlLmcuIGEgbXVsdGljaGFubmVsXG4gICAgLy8gaW1hZ2Ugd2hvc2UgY29hcnNlc3QgUkVBTCBsZXZlbCBpcyBodWdlIOKAlCBvdmVydmlldyBsZXZlbHMgYXJlIGNvbXBvc2l0ZS1vbmx5KSwgZG93bnNjYWxlIHRoZVxuICAgIC8vIHN0aXRjaGVkIGNhbnZhcyB0byBmaXQgc28gdGhlIFdlYkdQVSB0ZXh0dXJlIHVwbG9hZCBjYW4ndCBmYWlsLlxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIGlmIChsb25nZXN0ID4gTUFYX1RFWFRVUkVfRElNKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1BWF9URVhUVVJFX0RJTSAvIGxvbmdlc3Q7XG4gICAgICBjb25zdCBvdXRXID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihjaG9zZW4ud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3Qgb3V0SCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSBzdGl0Y2hlZCBsZXZlbCAke2Nob3Nlbi53aWR0aH3DlyR7Y2hvc2VuLmhlaWdodH0gZXhjZWVkcyB0aGUgYCArXG4gICAgICAgICAgYCR7TUFYX1RFWFRVUkVfRElNfXB4IHRleHR1cmUgbGltaXQ7IGRvd25zY2FsaW5nIHRvICR7b3V0V33DlyR7b3V0SH0uYCxcbiAgICAgICk7XG4gICAgICBsZXQgb3V0OiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvdXQgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG91dFcsIG91dEgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIG91dC53aWR0aCA9IG91dFc7XG4gICAgICAgIG91dC5oZWlnaHQgPSBvdXRIO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2N0eCA9IG91dC5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghb2N0eCkgdGhyb3cgbmV3IEVycm9yKCdbbmFwYXJpLWpzXSBzbGljZSBkb3duc2NhbGU6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAgIG9jdHguZHJhd0ltYWdlKGNhbnZhcyBhcyB1bmtub3duIGFzIENhbnZhc0ltYWdlU291cmNlLCAwLCAwLCBvdXRXLCBvdXRIKTtcbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChvdXQgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChjYW52YXMgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlcjogbG9hZCAvIHJlbmRlciAvIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE5hcGFyaUxvYWRlZD4ge1xuICAgIC8vIEtlZXBzIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSdzIGJsb2IgY2FjaGUgaW4gc3luYyBldmVuIHdoZW4gdGhlIHVzZXJcbiAgICAvLyBzd2l0Y2hlcyBiYWNrZW5kcyAoZS5nLiBPU0QgSW1hZ2Ug4oaSIG5hcGFyaSBWb2x1bWUpIG9uIHRoZSBzYW1lIGZpbGUg4oCUXG4gICAgLy8gd2hpY2hldmVyIGJhY2tlbmQgbG9hZHMgYSBnZW51aW5lbHkgZGlmZmVyZW50IGZpbGUgZmlyc3QgZXZpY3RzIGl0LlxuICAgIHRoaXMuc2ltcGxlU3RhY2subm90ZUFjdGl2ZUZpbGUoaW1hZ2VJbmZvLmZpbGVOYW1lKTtcbiAgICB0aGlzLmxvYWRlZCA9IHsgaW1hZ2VJbmZvLCB6OiB6SW5kZXgsIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIF9pblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW25hcGFyaS1qc10gcGxvdCB0YXJnZXQgIyR7cGxvdERpdn0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIHRoaXMucGxvdERpdklkID0gcGxvdERpdjtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0ID8gYCR7c2NyZWVuSGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICBob3N0LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG5cbiAgICBjb25zdCBpbmZvID0gKGltYWdlTG9hZGVkIGFzIE5hcGFyaUxvYWRlZCk/LmltYWdlSW5mbyA/PyBpbWFnZUluZm87XG4gICAgY29uc3QgeiA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy56ID8/IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgdmlld2VyID0gbmV3IFZpZXdlcih7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgYmFja2dyb3VuZDogeyByOiAwLjA3LCBnOiAwLjA3LCBiOiAwLjA5LCBhOiAxIH0sXG4gICAgICAgIC8vIFNldCBoZXJlIHJhdGhlciB0aGFuIGxlZnQgdG8gbmFwYXJpLWpzJ3Mgb3duIGRlZmF1bHQgc28gdGhlIGdlbnRsZXJcbiAgICAgICAgLy8gc3RlcCBhcHBsaWVzIHdpdGggdGhlIHZlcnNpb24gY3VycmVudGx5IGluc3RhbGxlZC4gQ2hvc2VuIHRvIG1hdGNoIHRoZVxuICAgICAgICAvLyBPU0QgYmFja2VuZCdzIHN0ZXAgKHNlZSBPU0RfWk9PTV9QRVJfU0NST0xMKTogdGhlIHdoZWVsIHNob3VsZCBmZWVsIHRoZVxuICAgICAgICAvLyBzYW1lIG9uIGFuIGltYWdlIHdoaWNoZXZlciByZW5kZXJlciBpcyBkcmF3aW5nIGl0LiBUaGUgc3RlcCBhcHBsaWVzIHBlclxuICAgICAgICAvLyBzY3JvbGwgRVZFTlQsIGFuZCBhIHRyYWNrcGFkIHNlbmRzIGEgYnVyc3Qgb2YgdGhlbSBwZXIgc3dpcGUsIHNvIGEgc3RlcFxuICAgICAgICAvLyB0dW5lZCB0byBhIG1vdXNlIG5vdGNoIHJ1bnMgYXdheSB1bmRlciBhIHRyYWNrcGFkLlxuICAgICAgICB3aGVlbFpvb21TcGVlZDogTkFQQVJJX1dIRUVMX1pPT01fU1BFRUQsXG4gICAgICAgIC8vIFRoZSBGSVJTVCAzRCBsYXllciBvZiBhIHNjZW5lIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhOyBldmVyeSBsYXRlciBvbmUgbGVhdmVzIHRoZVxuICAgICAgICAvLyBwb3NlIGFsb25lLiBBIHNwYXRpYWwgc2NlbmUgaXMgYnVpbHQgZnJvbSBzZXZlcmFsIGxheWVycyBhbmQgcmVidWlsdCBjb25zdGFudGx5IOKAlFxuICAgICAgICAvLyByZWNvbG91cmluZyBieSBhIGNsYXNzLCBwaWNraW5nIGEgZ2VuZSwgc3RlcHBpbmcgYSBzZWN0aW9uIOKAlCBhbmQgd2l0aCBuYXBhcmktanMnc1xuICAgICAgICAvLyBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGZyYW1pbmcgZWFjaCBvZiB0aG9zZSB0aHJldyBhd2F5IGFuIG9yYml0IHRoZSB1c2VyIGhhZCBzZXQuXG4gICAgICAgIC8vIFRoZSBwb3NlIGl0IHNuYXBwZWQgYmFjayB0byBkZXBlbmRlZCBvbiBXSElDSCBsYXllciB3YXMgcmVidWlsdCwgc28gaXNvbGF0aW5nIG9uZVxuICAgICAgICAvLyBzZWN0aW9uIHpvb21lZCB0byB0aGF0IHNlY3Rpb24ncyBib3VuZHMuIGByZXNldEZpdDNEKClgIG9uIGEgZGF0YXNldCBjaGFuZ2UgaXMgd2hhdFxuICAgICAgICAvLyBsZXRzIHRoZSBuZXh0IHNjZW5lIGZyYW1lIGl0c2VsZi5cbiAgICAgICAgZml0M2Q6ICdvbmNlJyxcbiAgICAgICAgLy8gSW4gdGhlIHNwYXRpYWwgbW9kZXMgYSBwbGFpbiBjbGljayBTRUxFQ1RTIHRoZSBjbGFzcyB1bmRlciB0aGUgY3Vyc29yLFxuICAgICAgICAvLyBzbyBuYXBhcmkncyBPU0Qtc3R5bGUgY2xpY2stdG8tem9vbSBpcyB0dXJuZWQgb2ZmIHRoZXJlOiBvdGhlcndpc2Ugb25lXG4gICAgICAgIC8vIGNsaWNrIHdvdWxkIGJvdGggc2VsZWN0IGEgY2xhc3MgYW5kIHpvb20gMnggYWJvdXQgdGhlIGN1cnNvciwgYW5kIHRoZVxuICAgICAgICAvLyB6b29tIHdvdWxkIHRoZW4gaGFsdmUgdGhlIHBpeGVsIHJhZGl1cyB0aGUgbmV4dCBjbGljayBoaXQtdGVzdHMgd2l0aC5cbiAgICAgICAgLy8gWm9vbWluZyBpcyBzdGlsbCBvbiB0aGUgd2hlZWwsIHRoZSB6b29tIGJ1dHRvbnMgYW5kIHRoZSB6b29tLWJveCB0b29sLlxuICAgICAgICAuLi4oaXNTcGF0aWFsT21pY3MocGxvdFR5cGUpIHx8IGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpXG4gICAgICAgICAgPyB7IGNsaWNrWm9vbUZhY3RvcjogMCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xuICAgICAgYXdhaXQgdmlld2VyLnJlYWR5O1xuXG4gICAgICBpZiAoaXNTcGF0aWFsT21pY3MzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNwYXRpYWxPbWljczNkKHZpZXdlciwgaG9zdCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3BhdGlhbE9taWNzKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3BhdGlhbE9taWNzKHZpZXdlciwgaG9zdCwgeik7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU2NhdHRlcihwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNjYXR0ZXIodmlld2VyLCBob3N0LCB6KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTY2F0dGVyM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTY2F0dGVyM2Qodmlld2VyLCBpbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTdXJmYWNlKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3VyZmFjZSh2aWV3ZXIpO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaTNkKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50Vm9sdW1lKHZpZXdlciwgaW5mbywgcGxvdFR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAgICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBwbG90IGZhaWxlZDonLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBDaGFubmVsczogcGVyLWNoYW5uZWwgY29tcG9zaXRlLCBMVVQsIG5hdGl2ZSBoaXN0b2dyYW1zIChqaXQtdWkjMTAyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhlIGdyYXlzY2FsZSBkaXNwbGF5IGNvbG9ybWFwIGZyb20gdGhlIHN0b3JlIHNlbGVjdGlvbiAoK3JldmVyc2UpLCBkZWZhdWx0aW5nIHRvIGdyYXkuXG4gICAqICBNYXBzIHRoZSBqaXQtdWkgc3RvcmUgY29sb3JtYXAgbm9kZSB0byBhIG5hcGFyaSBgQ29sb3JtYXBgIHZpYSB0aGUgbGlicmFyeSdzIExVVCBmYWN0b3J5O1xuICAgKiAgdGhlIG11bHRpY2hhbm5lbCB0aW50IHJhbXBzIGFyZSBidWlsdCBpbnNpZGUge0BsaW5rIE11bHRpQ2hhbm5lbEltYWdlVmlld30gZnJvbSBlYWNoXG4gICAqICBjaGFubmVsJ3MgaGV4IGNvbG91ci4gKi9cbiAgcHJpdmF0ZSBncmF5c2NhbGVDb2xvcm1hcCgpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbCk/LmRhdGE/LnZhbHVlO1xuICAgIGNvbnN0IGx1dCA9IHZhbHVlICE9IG51bGwgPyBidWlsZENvbG9ybWFwTHV0KHZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlKSA6IG51bGw7XG4gICAgaWYgKGx1dCkgcmV0dXJuIGNvbG9ybWFwRnJvbUx1dCgnZ3JheS1jbWFwJywgbHV0KTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmV2ZXJzZVxuICAgICAgPyBjb2xvcm1hcEZyb21MdXQoJ2dyYXktcmV2JywgW1syNTUsIDI1NSwgMjU1XSwgWzAsIDAsIDBdXSBhcyBSZ2JbXSlcbiAgICAgIDogJ2dyYXknO1xuICB9XG5cbiAgLyoqIEZldGNoIGEgc3RpdGNoZWQgc2xpY2UgYW5kIHJlYWQgaXQgYmFjayBhcyBhIHNpbmdsZS1jaGFubmVsIHVpbnQ4IHBsYW5lLiBgY2hhbm5lbGAgc2VsZWN0cyBhXG4gICAqICBiYW5kIChtdWx0aWNoYW5uZWwpOyBvbWl0IGl0IGZvciB0aGUgZ3JheXNjYWxlIGNvbXBvc2l0ZSAoYWxsIG92ZXJ2aWV3IGxldmVscyBhdmFpbGFibGUsIHNvIGFcbiAgICogIGxhcmdlIGltYWdlIHBpY2tzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ2hhbm5lbERhdGEoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYm1wID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHosIGNoYW5uZWwsIGJ1ZGdldFRpbGVzKTtcbiAgICByZXR1cm4gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShibXApO1xuICB9XG5cbiAgLyoqIERlY29kZSBhbiBgSW1hZ2VCaXRtYXBgIChzZXJ2ZXIgYmFuZHMgYXJlIGdyYXlzY2FsZSwgUj1HPUIpIHRvIGEgc2luZ2xlLWNoYW5uZWwgdWludDggcGxhbmUuXG4gICAqICBgbWF4U2lkZWAgY2FwcyB0aGUgbG9uZ2VzdCBzaWRlIChkb3duc2NhbGluZyBvbiB0aGUgY2FudmFzIGRyYXcpIOKAlCB1c2VkIHRvIGtlZXAgcHJlLWxvYWRlZFxuICAgKiAgc3VyZmFjZSBzbGljZSBwbGFuZXMgc21hbGwuICovXG4gIHByaXZhdGUgYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgYm1wOiBJbWFnZUJpdG1hcCxcbiAgICBtYXhTaWRlPzogbnVtYmVyLFxuICApOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHNjYWxlID0gbWF4U2lkZSA/IE1hdGgubWluKDEsIG1heFNpZGUgLyBNYXRoLm1heChibXAud2lkdGgsIGJtcC5oZWlnaHQsIDEpKSA6IDE7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoYm1wLndpZHRoICogc2NhbGUpKTtcbiAgICBjb25zdCBoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChibXAuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXModywgaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgY2FudmFzLndpZHRoID0gdztcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gY2hhbm5lbCByZWFkYmFjazogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuICAgIC8vIFNjYWxlIHRoZSBXSE9MRSBiaXRtYXAgaW50byB0aGUgKHBvc3NpYmx5IHNtYWxsZXIpIHRhcmdldCBjYW52YXMg4oCUIGRyYXdpbmcgYXQgbmF0dXJhbCBzaXplXG4gICAgLy8gd291bGQgY3JvcCB0byB0aGUgdG9wLWxlZnQgd8OXaCBjb3JuZXIgd2hlbiBkb3duc2NhbGluZyBhIGxhcmdlIHNsaWNlIChtYXhTaWRlIDwgYm1wIHNpemUpLlxuICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCAwLCAwLCB3LCBoKTtcbiAgICBibXAuY2xvc2U/LigpO1xuICAgIGNvbnN0IHJnYmEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHcgKiBoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcgKiBoOyBpKyspIGRhdGFbaV0gPSByZ2JhW2kgKiA0XTtcbiAgICByZXR1cm4geyBkYXRhLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSAyRCBpbWFnZSBmb3Igc2xpY2UgYHpgLiBXaXRoIGEgc2VydmVyIHB5cmFtaWQgZGVzY3JpcHRvciB3ZSB1c2UgYSBweXJhbWlkYWxcbiAgICoge0BsaW5rIFRpbGVkU291cmNlfSBwZXIgbGF5ZXIgc28gdGhlIHZpZXcgcmVmaW5lcyB0byBoaWdoZXIgcmVzb2x1dGlvbiBvbiB6b29tIChsaWtlIE9TRCkgYW5kXG4gICAqIHNpdHMgbmF0dXJhbGx5IGluIGZ1bGwtcmVzb2x1dGlvbiBjb29yZGluYXRlczsgd2l0aG91dCBvbmUgd2UgZmFsbCBiYWNrIHRvIHRoZSBzaW5nbGUtbGV2ZWxcbiAgICogc3RpdGNoLiBUaHJlZSBkaXNwbGF5IG1vZGVzIGVpdGhlciB3YXk6IG11bHRpY2hhbm5lbCBhZGRpdGl2ZSB0aW50LCBncmF5c2NhbGUgY29sb3JtYXAsIFJHQi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2UoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgaWYgKGRlc2MgJiYgZGVzYy5sZXZlbHM/Lmxlbmd0aCkge1xuICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2VUaWxlZCh6LCBkZXNjKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVuZGVySW1hZ2VTdGl0Y2hlZCh6LCB0b2tlbik7XG4gIH1cblxuICAvKiogU2luZ2xlLWxldmVsIHN0aXRjaCBmYWxsYmFjayAobm8gZGVzY3JpcHRvcik6IHRoZSBwcmUtdGlsaW5nIHBhdGguICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2VTdGl0Y2hlZCh6OiBudW1iZXIsIHRva2VuPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYz8uY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgY2hhbm5lbENvdW50ID4gMTtcblxuICAgIC8vIDEpIEZldGNoIGFsbCBwaXhlbCBkYXRhIEJFRk9SRSB0b3VjaGluZyB0aGUgdmlld2VyLCBzbyBhIHN1cGVyc2VkZWQgc2NydWIgY2FuIGJhaWwgd2l0aG91dFxuICAgIC8vICAgIGhhdmluZyB0b3JuIGRvd24gdGhlIHZpc2libGUgbGF5ZXJzIChhdm9pZHMgZmxpY2tlciAvIG91dC1vZi1vcmRlciBsYXllciBzdGF0ZSkuXG4gICAgbGV0IG1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJztcbiAgICBsZXQgcGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gICAgbGV0IGJpdG1hcDogSW1hZ2VCaXRtYXAgfCBudWxsID0gbnVsbDtcbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICBtb2RlID0gJ211bHRpY2hhbm5lbCc7XG4gICAgICBwbGFuZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hhbm5lbENvdW50IH0sIChfLCBjKSA9PiB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeiwgYykpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgbW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgLy8gQ29tcG9zaXRlIGZldGNoIChubyBjaGFubmVsKSDihpIgYWxsIG92ZXJ2aWV3IGxldmVscyB1c2FibGUsIHNvIGEgbGFyZ2UgZ3JheXNjYWxlIGltYWdlXG4gICAgICAvLyBzZWxlY3RzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIGluc3RlYWQgb2YgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwgKHRleHR1cmUgbGltaXQpLlxuICAgICAgcGxhbmVzID0gW2F3YWl0IHRoaXMuZmV0Y2hDaGFubmVsRGF0YSh6KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGUgPSAncmdiJztcbiAgICAgIGJpdG1hcCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6KTtcbiAgICB9XG5cbiAgICAvLyAyKSBDb21taXQg4oCUIHVubGVzcyBhIG5ld2VyIHNjcnViIHN1cGVyc2VkZWQgdXMgb3IgdGhlIHZpZXdlciB3YXMgdG9ybiBkb3duLlxuICAgIGlmICgodG9rZW4gIT0gbnVsbCAmJiB0b2tlbiAhPT0gdGhpcy5zbGljZVJlcSkgfHwgdGhpcy52aWV3ZXIgIT09IHYpIHtcbiAgICAgIGJpdG1hcD8uY2xvc2U/LigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBkaXNwbGF5ZWQgdGV4dHVyZSBtYXkgYmUgYSBkb3duc2NhbGVkIHB5cmFtaWQgbGV2ZWw7IHNjYWxlIHRoZSBsYXllciBpbnRvIEZVTEwtUkVTT0xVVElPTlxuICAgIC8vIHdvcmxkIGNvb3JkaW5hdGVzIChsZXZlbC0wIHBpeGVscykgc28gdGhlIGNhbWVyYSwgcmVhZGJhY2sgYW5kIOKAlCBjcml0aWNhbGx5IOKAlCBwcmUtc2F2ZWRcbiAgICAvLyByZWdpb25zIChzdG9yZWQgaW4gZnVsbC1yZXMgY29vcmRzLCBlLmcuIG5kcGkpIGFsbCBsaW5lIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGV2ZWwgaXMgc2hvd24uXG4gICAgLy8gVGhpcyBtaXJyb3JzIE9TRCwgd2hvc2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgYWx3YXlzIGxldmVsIDAuXG4gICAgY29uc3QgdGV4VyA9IG1vZGUgPT09ICdyZ2InID8gKGJpdG1hcCBhcyBJbWFnZUJpdG1hcCkud2lkdGggOiBwbGFuZXNbMF0/LndpZHRoID8/IDA7XG4gICAgY29uc3QgdGV4SCA9IG1vZGUgPT09ICdyZ2InID8gKGJpdG1hcCBhcyBJbWFnZUJpdG1hcCkuaGVpZ2h0IDogcGxhbmVzWzBdPy5oZWlnaHQgPz8gMDtcbiAgICBjb25zdCBmdWxsVyA9IGRlc2M/LndpZHRoIHx8IHRleFcgfHwgMTtcbiAgICBjb25zdCBmdWxsSCA9IGRlc2M/LmhlaWdodCB8fCB0ZXhIIHx8IDE7XG4gICAgY29uc3Qgc2NhbGU6IFtudW1iZXIsIG51bWJlcl0gPSBbdGV4VyA/IGZ1bGxXIC8gdGV4VyA6IDEsIHRleEggPyBmdWxsSCAvIHRleEggOiAxXTtcblxuICAgIHRoaXMuaW1hZ2VNb2RlID0gbW9kZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uOiAnbGluZWFyJyB8ICduZWFyZXN0JyA9IHRoaXMuaW1hZ2VTbW9vdGhpbmcgPyAnbGluZWFyJyA6ICduZWFyZXN0JztcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbmV3IE11bHRpQ2hhbm5lbEltYWdlVmlldyh2KTtcbiAgICBpZiAobW9kZSA9PT0gJ211bHRpY2hhbm5lbCcpIHtcbiAgICAgIGNvbnN0IHZpZXdzOiBDaGFubmVsVmlld1tdID0gcGxhbmVzLm1hcCgoZCwgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYz8uY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGQud2lkdGgsIGhlaWdodDogZC5oZWlnaHQsIGNoYW5uZWxzOiAxLCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogZC5kYXRhIH0sXG4gICAgICAgICAgdGludDogY29sb3IsXG4gICAgICAgICAgbmFtZTogc3Q/Lm5hbWUgPz8gYGNoJHtjfWAsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICBzY2FsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ211bHRpY2hhbm5lbCcsIHZpZXdzLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnZ3JheXNjYWxlJykge1xuICAgICAgY29uc3QgZCA9IHBsYW5lc1swXTtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoXG4gICAgICAgICdncmF5c2NhbGUnLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHsgaW50ZXJwb2xhdGlvbiB9LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogYml0bWFwIGFzIEltYWdlQml0bWFwLCBzY2FsZSB9XSwgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGZ1bGxXO1xuICAgIHRoaXMuaW1hZ2VIID0gZnVsbEg7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSAyRCBpbWFnZSB3aXRoIHB5cmFtaWRhbCB7QGxpbmsgVGlsZWRTb3VyY2V9cyDigJQgdGhlIHZpZXcgcmVmaW5lcyB0byBoaWdoZXIgcmVzb2x1dGlvblxuICAgKiBhcyB5b3Ugem9vbSBpbiAodGhlIHZpc3VhbCBmZXRjaGVzIHRoZSBsZXZlbCB3aG9zZSB0ZXhlbHMg4omIIHNjcmVlbiBwaXhlbHMpIGFuZCBzaXRzIGluIGZ1bGwtcmVzXG4gICAqIGNvb3JkaW5hdGVzIHNvIHJlZ2lvbnMgYWxpZ24uIFNhbWUgdGhyZWUgbW9kZXMgYXMgdGhlIHN0aXRjaCBwYXRoLiBQZXItY2hhbm5lbCBsYXllcnMgdXNlIHRoZVxuICAgKiBSRUFMIHB5cmFtaWQgbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBvbmx5IGV4aXN0IHRoZXJlKTsgdGhlIGNvbXBvc2l0ZSB1c2VzIGFsbCBsZXZlbHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlVGlsZWQoejogbnVtYmVyLCBkZXNjOiBUaWxlRGVzY3JpcHRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYy5jaGFubmVscyA/PyAoc3RhdGVzLmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2MubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG5cbiAgICB0aGlzLnRpbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbmV3IE11bHRpQ2hhbm5lbEltYWdlVmlldyh2KTtcblxuICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ211bHRpY2hhbm5lbCc7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYy5jaGFubmVsSW5mbz8uW2NdPy5jb2xvciA/PyB0aW50Rm9yKGMpO1xuICAgICAgICB2aWV3cy5wdXNoKHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCBjLCAxKSxcbiAgICAgICAgICB0aW50OiBjb2xvcixcbiAgICAgICAgICBuYW1lOiBzdD8ubmFtZSA/PyBgY2gke2N9YCxcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbMF07XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcihcbiAgICAgICAgJ2dyYXlzY2FsZScsXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCB1bmRlZmluZWQsIDEpLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ3JnYic7XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcigncmdiJywgW3sgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCA0KSB9XSwge1xuICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaW1hZ2VXID0gZGVzYy53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGRlc2MuaGVpZ2h0O1xuICAgIC8vIEF3YWl0IG9uIHRoZSBpbml0aWFsIHJlbmRlciBzbyBnZXRIaXN0b2dyYW0vYXV0b0NvbnRyYXN0IGhhdmUgZGF0YSBpbW1lZGlhdGVseTsgc2xpY2UgY2hhbmdlc1xuICAgIC8vIHJlZnJlc2ggZmlyZS1hbmQtZm9yZ2V0ICh0aGUgaGlzdG9ncmFtIHBhbmUgcmV0cmllcykuXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6LCBkZXNjKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZSBiYWNrZWQgYnkgdGhlIHNlcnZlciBgL3RpbGVgIGVuZHBvaW50LiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmRcbiAgICogIChncmF5c2NhbGUgbHVtaW5hbmNlLCByZWFsIGxldmVscyBvbmx5KTsgb21pdCBpdCBmb3IgdGhlIGNvbXBvc2l0ZSAoUkdCQSwgYWxsIGxldmVscykuICovXG4gIHByaXZhdGUgYnVpbGRUaWxlZFNvdXJjZShcbiAgICBkZXNjOiBUaWxlRGVzY3JpcHRvcixcbiAgICBjaGFubmVsOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY2hhbm5lbHM6IDEgfCA0LFxuICApOiBUaWxlZFNvdXJjZSB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCkgPz8gJyc7XG4gICAgLy8gUGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSBhdCBSRUFMIEJpby1Gb3JtYXRzIGxldmVsczsgdGhlIGNvbXBvc2l0ZSBleGlzdHMgYXQgYWxsIGxldmVscy5cbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsXG4gICAgICAgID8gZGVzYy5sZXZlbHNcbiAgICAgICAgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBkZXNjLnJlYWxMZXZlbHMgPz8gZGVzYy5sZXZlbHMubGVuZ3RoKSk7XG4gICAgY29uc3QgbGV2ZWxTY2FsZXMgPSB1c2FibGUubWFwKChsKSA9PiBkZXNjLndpZHRoIC8gTWF0aC5tYXgoMSwgbC53aWR0aCkpOyAvLyBsZXZlbC0wIHB4IHBlciBsZXZlbCBweFxuICAgIGNvbnN0IHRpbGVTaXplID0gZGVzYy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgY29uc3QgY2ggPSBjaGFubmVsID09IG51bGwgPyAnJyA6IGAmY2hhbm5lbD0ke2NoYW5uZWx9YDtcbiAgICBjb25zdCBhcGkgPSB0aGlzLmFwaTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3RpbGVkJyxcbiAgICAgIHdpZHRoOiBkZXNjLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkZXNjLmhlaWdodCxcbiAgICAgIHRpbGVTaXplLFxuICAgICAgbGV2ZWxzOiB1c2FibGUubGVuZ3RoLFxuICAgICAgbGV2ZWxTY2FsZXMsXG4gICAgICBkZXB0aDogTWF0aC5tYXgoMSwgZGVzYy56IHx8IDEpLFxuICAgICAgY2hhbm5lbHMsXG4gICAgICBkdHlwZTogJ3VpbnQ4JyxcbiAgICAgIGZldGNoVGlsZTogYXN5bmMgKGtleTogVGlsZUtleSk6IFByb21pc2U8UGl4ZWxDaHVuaz4gPT4ge1xuICAgICAgICBjb25zdCByZXMgPSB1c2FibGVba2V5LmxldmVsXT8ucmVzID8/IGtleS5sZXZlbDtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7YXBpfXRpbGU/aW5mbz0ke2luZm9CNjR9JnJlcz0ke3Jlc30mY29sPSR7a2V5LmNvbH0mcm93PSR7a2V5LnJvd30mej0ke2tleS56fSZ0aWxlU2l6ZT0ke3RpbGVTaXplfSR7Y2h9YDtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW25hcGFyaS1qc10gdGlsZSAke2tleS5sZXZlbH0vJHtrZXkuY29sfS8ke2tleS5yb3d9IOKGkiAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJtcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKTtcbiAgICAgICAgaWYgKGNoYW5uZWxzID09PSA0KSByZXR1cm4geyB3aWR0aDogYm1wLndpZHRoLCBoZWlnaHQ6IGJtcC5oZWlnaHQsIGRhdGE6IGJtcCB9O1xuICAgICAgICByZXR1cm4gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShibXApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIChSZSlmZXRjaCBhIGNvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIGZvciB0aGUgaGlzdG9ncmFtICh0aWxlZCBtb2RlIGhhcyBubyBmdWxsXG4gICAqICBpbi1tZW1vcnkgcGl4ZWxzKS4gT25lIGNoZWFwIG92ZXJ2aWV3IHRpbGUgcGVyIGNoYW5uZWw7IGNhY2hlZCBieSBjaGFubmVsIGluZGV4LiAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAncmdiJykgcmV0dXJuOyAvLyBSR0IgdXNlcyB0aGUgZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIChyZ2JIaXN0b2dyYW0pXG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnID8gZGVzYy5jaGFubmVscyA/PyAxIDogMTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJyA/IGMgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeiwgY2gsIDEpOyAvLyBidWRnZXQgMSDihpIgY29hcnNlc3Qgc2luZ2xlIHRpbGVcbiAgICAgICAgdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgZC5kYXRhKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBsZWF2ZSB0aGlzIGNoYW5uZWwncyBzYW1wbGUgdW5zZXQgKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIGNoYW5uZWwgc3RhdGVzICsgZ3JheXNjYWxlIGNvbG9ybWFwIOKGkiBsaXZlLWFwcGx5IHRvIHRoZSByZW5kZXJlZCBsYXllcnMgKG5vXG4gICAqICByZS1mZXRjaDsgb25seSB6IGNoYW5nZXMgcmUtZmV0Y2gpLiBSZXBsYWNlcyBhbnkgcHJpb3Igc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NoYW5uZWxzLCBjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0XSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICB0aGlzLmFwcGx5RGlzcGxheVN0YXRlKGNoYW5uZWxzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdGhlIHN0b3JlIGNvbG9ybWFwICgrcmV2ZXJzZSksIGludmVydCwgYW5kIGNoYW5uZWwgc3RhdGUg4oaSIHRoZSB2b2x1bWUvaXNvc3VyZmFjZVxuICAgKiAgdHJhbnNmZXIgZnVuY3Rpb246IGNvbG91ciAoY2hhbm5lbCB0aW50IG9yIHNlbGVjdGVkIGNvbG9ybWFwKSwgdGhlIGludGVuc2l0eSAqKndpbmRvd1xuICAgKiAgKG1pbi9tYXgg4oaSIGNvbnRyYXN0TGltaXRzKSoqIGFuZCAqKmdhbW1hKiosIG1pcnJvcmluZyB0aGUgZ3JheXNjYWxlIGltYWdlJ3MgZGlzcGxheSBjb250cm9sc1xuICAgKiAgc28gdGhlIGhpc3RvZ3JhbSBwYW5lIGRyaXZlcyB0aGUgM0QgcmVuZGVyLiBSZXBsYWNlcyBhbnkgcHJpb3Igc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy52b2x1bWVWaWV3O1xuICAgICAgaWYgKCF2aWV3KSByZXR1cm47XG4gICAgICBpZiAodGhpcy52b2x1bWVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgLy8gRWFjaCBjaGFubmVsJ3MgbGF5ZXIgaXMgdGludGVkIGJ5IGl0cyBjb2xvdXIgYW5kIGdldHMgaXRzIG93biB3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eS5cbiAgICAgICAgdmlldy5sYXllcnMuZm9yRWFjaCgoXywgYykgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKGMsIHtcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/ICcjZmZmZmZmJyksXG4gICAgICAgICAgICAuLi4oc3RcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgZ2FtbWE6IHN0LmdhbW1hLFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgIC4uLihzdCA/IHsgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSwgZ2FtbWE6IHN0LmdhbW1hIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEEgY2hhbm5lbCdzIHRpbnQgY29sb3JtYXAgKGJsYWNr4oaSY29sb3VyKSB3aXRoIHJldmVyc2Utc2NhbGUgLyBpbnZlcnQgYXBwbGllZCBieSBmbGlwcGluZy4gKi9cbiAgcHJpdmF0ZSBjaGFubmVsVGludENvbG9ybWFwKGNvbG9yOiBzdHJpbmcpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgbGV0IGNtYXA6IENvbG9ybWFwIHwgc3RyaW5nID0gdGludENvbG9ybWFwKGNvbG9yKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UmV2ZXJzZSkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICBpZiAodGhpcy5pbnZlcnRFbmFibGVkKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIHJldHVybiBjbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbG91ciBtYXAgZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZS4gQSByZWFsIGNvbG9ybWFwIHNlbGVjdGlvbiAodmlyaWRpcy9tYWdtYS/igKYpIHdpbnM7XG4gICAqIG90aGVyd2lzZSB0aGUgY2hhbm5lbCdzIGNvbG91ciB0aW50cyBpdCAoc28gdGhlIGNoYW5uZWwtZGlhbG9nIGNvbG91ciBzd2F0Y2ggcmVjb2xvcnMgdGhlIDNEXG4gICAqIHJlbmRlcikuIFJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXAg4oCUIHRoZSBgVm9sdW1lTGF5ZXJgIGhhcyBubyBwZXItbGF5ZXJcbiAgICogaW52ZXJ0LCBzbyBib3RoIGFyZSBlbXVsYXRlZCBieSByZXZlcnNpbmcgdGhlIGNvbG9ybWFwLlxuICAgKi9cbiAgcHJpdmF0ZSB2b2x1bWVDb2xvcm1hcChzdDogSUNoYW5uZWxTdGF0ZSB8IHVuZGVmaW5lZCk6IENvbG9ybWFwIHwgc3RyaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBsYWJlbD86IHN0cmluZzsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgLy8gQSBjb2xvcmVkIGNvbG9ybWFwICh2aXJpZGlzL21hZ21hL+KApikgZHJpdmVzIHRoZSB2b2x1bWU7IHRoZSBkZWZhdWx0IGdyYXlzY2FsZSBmYW1pbHlcbiAgICAvLyAoZ3JheSAvIEdyZXlzIC8gR3JleXMgSW52KSB5aWVsZHMgdG8gdGhlIGNoYW5uZWwncyBjb2xvdXIgc28gdGhlIGRpYWxvZyBjb2xvdXIgc3dhdGNoXG4gICAgLy8gcmVjb2xvcnMgdGhlIDNEIHJlbmRlci5cbiAgICBjb25zdCBsYWJlbCA9IChub2RlPy5sYWJlbCA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBncmF5RmFtaWx5ID0gbGFiZWwgPT09ICcnIHx8IGxhYmVsLmluY2x1ZGVzKCdncmV5JykgfHwgbGFiZWwuaW5jbHVkZXMoJ2dyYXknKTtcbiAgICBjb25zdCB2YWx1ZSA9IG5vZGU/LmRhdGE/LnZhbHVlO1xuICAgIGNvbnN0IGx1dCA9ICFncmF5RmFtaWx5ICYmIHZhbHVlICE9IG51bGwgPyBidWlsZENvbG9ybWFwTHV0KHZhbHVlLCBmYWxzZSkgOiBudWxsO1xuICAgIGxldCBjbWFwOiBDb2xvcm1hcCB8IHN0cmluZyA9IGx1dFxuICAgICAgPyBjb2xvcm1hcEZyb21MdXQoJ3ZvbC1jbWFwJywgbHV0KVxuICAgICAgOiB0aW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/ICcjZmZmZmZmJyk7XG4gICAgLy8gUmV2ZXJzZS1zY2FsZSBhbmQgaW52ZXJ0IGVhY2ggZmxpcCB0aGUgcmFtcCAodGhlIFZvbHVtZUxheWVyIGhhcyBubyBwZXItbGF5ZXIgaW52ZXJ0KS5cbiAgICBpZiAodGhpcy5jdXJyZW50UmV2ZXJzZSkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICBpZiAodGhpcy5pbnZlcnRFbmFibGVkKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIHJldHVybiBjbWFwO1xuICB9XG5cbiAgLyoqIEFwcGx5IHRoZSBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIC8gY29sb3JtYXAgdG8gdGhlIGxpdmUgbGF5ZXJzIChubyByZS1mZXRjaCksIGRlbGVnYXRpbmcgdGhlXG4gICAqICBwZXItY2hhbm5lbCBsYXllciBtdXRhdGlvbnMgdG8gdGhlIHtAbGluayBNdWx0aUNoYW5uZWxJbWFnZVZpZXd9LiAqL1xuICBwcml2YXRlIGFwcGx5RGlzcGxheVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5jaGFubmVsVmlldztcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8ICF2aWV3KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJykge1xuICAgICAgdmlldy5sYXllcnMuZm9yRWFjaCgoXywgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICBpZiAoIXN0KSByZXR1cm47XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbChjLCB7XG4gICAgICAgICAgdGludDogc3QuY29sb3IsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0sXG4gICAgICAgICAgZ2FtbWE6IHN0LmdhbW1hLFxuICAgICAgICAgIHZpc2libGU6IHN0LnZpc2libGUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoMCwge1xuICAgICAgICBjb2xvcm1hcDogdGhpcy5ncmF5c2NhbGVDb2xvcm1hcCgpLFxuICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogc3QuZ2FtbWEgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiAoUmUpaW5zdGFsbCB0aGUgcGh5c2ljYWwgc2NhbGUgYmFyIG92ZXIgdGhlIDJEIGltYWdlLCBzaXplZCBmcm9tIHRoZSBpbWFnZSdzIMK1bS9waXhlbFxuICAgKiAgKGAvdGlsZXMvaW5mb2AgbXBwWCwgZmFsbGluZyBiYWNrIHRvIHRoZSBpbWFnZSBtZXRhZGF0YSkuIE5vLW9wIHdpdGhvdXQgYSBwaHlzaWNhbCBzaXplLiAqL1xuICBwcml2YXRlIGluc3RhbGxTY2FsZUJhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy5tcHBYIHx8IDA7XG4gICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuaG9zdCAmJiBtcHBYID4gMCkge1xuICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBOYXBhcmlTY2FsZUJhcih0aGlzLmhvc3QsIHRoaXMudmlld2VyLmNhbWVyYSwgbXBwWCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENvbnZlcnQgYSBuYXBhcmktanMgYEhpc3RvZ3JhbWAgKGJpbiBjb3VudCArIG1pbi9tYXgpIHRvIHRoZSBwYW5lJ3MgYElIaXN0b2dyYW1gIChiaW4gZWRnZXMpLiAqL1xuICBwcml2YXRlIHRvSUhpc3RvZ3JhbShoOiB7IGNvdW50czogVWludDMyQXJyYXk7IGJpbnM6IG51bWJlcjsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0pOiBJSGlzdG9ncmFtIHtcbiAgICBjb25zdCBzcGFuID0gaC5tYXggLSBoLm1pbiB8fCAxO1xuICAgIGNvbnN0IGJpbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBoLmJpbnMgfSwgKF8sIGkpID0+IGgubWluICsgKGkgKiBzcGFuKSAvIGguYmlucyk7XG4gICAgY29uc3QgY291bnRzID0gQXJyYXkuZnJvbShoLmNvdW50cyk7XG4gICAgcmV0dXJuIHsgYmlucywgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgM0Qgdm9sdW1lL2lzb3N1cmZhY2UuIEEgbXVsdGljaGFubmVsIGltYWdlIGJlY29tZXMgb25lIGFkZGl0aXZlLCB0aW50ZWRcbiAgICoge0BsaW5rIFZvbHVtZUxheWVyfSBwZXIgY2hhbm5lbCAoc28gZWFjaCBjaGFubmVsJ3MgY29sb3VyIGNvbXBvc2l0ZXMgaW50byB0aGUgcmVuZGVyKTsgYVxuICAgKiBncmF5c2NhbGUvY29tcG9zaXRlIGltYWdlIHVzZXMgYSBzaW5nbGUgdm9sdW1lLiBBZGRzIHRoZSBheGVzIGdpem1vICsgbGFiZWxzIGFuZCB3aXJlcyB0aGVcbiAgICogZGlzcGxheS1zdGF0ZSBzdWJzY3JpcHRpb24uIFRoZSBjYWxsZXIgb3ducyBgdmlld2VyLnJlYWR5YC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgYmVmb3JlIHJlbmRlcmluZyBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXNcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoU2xpY2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSB0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pICYmICEhaW5mbz8uY2hhbm5lbFVybHM/Lmxlbmd0aFxuICAgICAgJiYgKGluZm8/LmltYWdlTWV0YT8uWzBdPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHNpbXBsZU1jID8gaW5mbyEuaW1hZ2VNZXRhIVswXS5jaGFubmVsQ291bnQgOiAoZGVzYz8uY2hhbm5lbHMgPz8gMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDEpO1xuICAgIGNvbnN0IHJlcyA9IHZvbHVtZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHJlbmRlcmluZzogJ2lzbycgfCAnbWlwJyA9IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSkgPyAnaXNvJyA6ICdtaXAnO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcblxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICB0aGlzLmltYWdlTW9kZSA9IHRoaXMudm9sdW1lTXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJztcbiAgICBjb25zdCB2aWV3ID0gbmV3IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcodmlld2VyKTtcbiAgICB0aGlzLnZvbHVtZVZpZXcgPSB2aWV3O1xuXG4gICAgLy8gQXNzZW1ibGUgcGVyLWNoYW5uZWwgc2NhbGFyIHZvbHVtZXMgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChqaXQtc3BlY2lmaWMpOyB0aGUgbmFwYXJpLWpzIHZpZXdcbiAgICAvLyBvd25zIHRoZSBsYXllciBvcmNoZXN0cmF0aW9uIChvbmUgYWRkaXRpdmUgdGludGVkIHZvbHVtZSBwZXIgY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlXG4gICAgLy8gdm9sdW1lKS4gVGhlIGFkYXB0ZXIgY29tcHV0ZXMgZWFjaCBjaGFubmVsJ3MgY29sb3JtYXAgKGluY2wuIGludmVydC9yZXZlcnNlIGZsaXBzKS5cbiAgICBsZXQgZGltczogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY2hhbm5lbHM6IFZvbHVtZUNoYW5uZWxbXSA9IFtdO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgcmVzLCBjKTtcbiAgICAgICAgICBpZiAoIXZvbCkgY29udGludWU7XG4gICAgICAgICAgZGltcyA9IHZvbDtcbiAgICAgICAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldChjLCB2b2wuZGF0YSk7XG4gICAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYz8uY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgICBjaGFubmVscy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHZvbC5kYXRhLFxuICAgICAgICAgICAgd2lkdGg6IHZvbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdm9sLmhlaWdodCxcbiAgICAgICAgICAgIGRlcHRoOiB2b2wuZGVwdGgsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKGNvbG9yKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHJlcyk7XG4gICAgICAgIGlmICh2b2wpIHtcbiAgICAgICAgICBkaW1zID0gdm9sO1xuICAgICAgICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KDAsIHZvbC5kYXRhKTtcbiAgICAgICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgICAgICBjaGFubmVscy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHZvbC5kYXRhLFxuICAgICAgICAgICAgd2lkdGg6IHZvbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdm9sLmhlaWdodCxcbiAgICAgICAgICAgIGRlcHRoOiB2b2wuZGVwdGgsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuXG4gICAgaWYgKCFkaW1zIHx8ICFjaGFubmVscy5sZW5ndGggfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47IC8vIGNhbmNlbGxlZCDihpIgZG9uJ3QgcmVuZGVyXG5cbiAgICAvLyBSZXNvbHV0aW9uLWludmFyaWFudCB3b3JsZCBib3guIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsIGNvdW50cyBtYWRlIGhpZ2hlclxuICAgIC8vIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGUgKGNvbnN0YW50KSBzbGljZSBjb3VudCDigJQgc28gWiBhcHBlYXJlZFxuICAgIC8vIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi4gSW5zdGVhZCBhbmNob3IgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmRcbiAgICAvLyBsZXQgWiBzcGFuIHRoZSBmdWxsIHNsaWNlIGNvdW50OyB0aGUgYm94IHNoYXBlIGlzIHRoZW4gaWRlbnRpY2FsIGF0IGV2ZXJ5IGRlY2ltYXRlIGZhY3Rvci4gVGhlXG4gICAgLy8gcGVyLWF4aXMgYHZveGVsU2l6ZWAgKG5hcGFyaSBgc2NhbGVgKSBtYXBzIHRoZSBzYW1wbGVkIGdyaWQgb250byB0aGF0IGZpeGVkIHdvcmxkIGJveC5cbiAgICAvLyBBIHN0YWNrIHRoYXQgZGVjbGFyZXMgaXRzIHBoeXNpY2FsIHNwYWNpbmcgb24gQUxMIFRIUkVFIGF4ZXMgZ2V0cyBpdHMgdHJ1ZVxuICAgIC8vIGV4dGVudCBhcyB0aGUgd29ybGQgYm94IOKAlCB0aGUgb25seSB3YXkgYW5pc290cm9weSBzdXJ2aXZlcywgYW5kIHdoYXQgbWFrZXMgYVxuICAgIC8vIHJlc2FtcGxlZCA0MCB4IDQwIHggMjAwIMK1bSB2b2x1bWUgcmVhZCBhcyBhIGJyYWluIGluc3RlYWQgb2YgYSBjdWJlLWFzcGVjdFxuICAgIC8vIGJyaWNrLiBJdCBuZWVkcyBub25lIG9mIHRoZSByZWZlcmVuY2UtYm94IGFyaXRobWV0aWM6IGEgcGh5c2ljYWwgYm94IGlzXG4gICAgLy8gYWxyZWFkeSBpbmRlcGVuZGVudCBvZiB0aGUgZGVjaW1hdGUgZmFjdG9yLlxuICAgIC8vXG4gICAgLy8gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoYXQgYXJpdGhtZXRpYy4gU2l6aW5nIHRoZSBib3ggYnkgdGhlIHNhbXBsZWQgdm94ZWxcbiAgICAvLyBjb3VudHMgbWFkZSBoaWdoZXIgaW4tcGxhbmUgcmVzb2x1dGlvbiBncm93IFgvWSB3aGlsZSB0aGUgZGVwdGggc3RheWVkIHRoZVxuICAgIC8vIChjb25zdGFudCkgc2xpY2UgY291bnQg4oCUIHNvIFogYXBwZWFyZWQgdG8gc2hyaW5rIGF0IGhpZ2hlciByZXNvbHV0aW9uLlxuICAgIC8vIEFuY2hvcmluZyB0aGUgaW4tcGxhbmUgbG9uZyBzaWRlIHRvIGEgZml4ZWQgcmVmZXJlbmNlIGFuZCBsZXR0aW5nIFogc3BhbiB0aGVcbiAgICAvLyBmdWxsIHNsaWNlIGNvdW50IG1ha2VzIHRoZSBib3ggc2hhcGUgaWRlbnRpY2FsIGF0IGV2ZXJ5IGRlY2ltYXRlIGZhY3Rvci5cbiAgICBjb25zdCBtZXRhID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBtcHBYWVo6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bGwgPVxuICAgICAgbWV0YT8ubXBwWCAmJiBtZXRhPy5tcHBZICYmIG1ldGE/Lm1wcFogPyBbbWV0YS5tcHBYLCBtZXRhLm1wcFksIG1ldGEubXBwWl0gOiBudWxsO1xuICAgIC8vIFRoZSBpbWFnZSdzIERFQ0xBUkVEIHBpeGVsIGRpbWVuc2lvbnMsIHdoaWNoIGlzIHdoYXQgbXBwIGlzIHBlcjogdGhlIHNhbXBsZWRcbiAgICAvLyBkaW1zIGFyZSBkZWNpbWF0ZWQsIHNvIHNpemluZyBhIHBoeXNpY2FsIGJveCBieSB0aGVtIHdvdWxkIG1ha2UgdGhlIHdvcmxkXG4gICAgLy8gYm94IGRlcGVuZCBvbiB0aGUgcmVzb2x1dGlvbiB0aGUgdXNlciBoYXBwZW5zIHRvIGJlIHZpZXdpbmcgYXQuXG4gICAgY29uc3QgZnVsbFcgPSB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcy53aWR0aDtcbiAgICBjb25zdCBmdWxsSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcy5oZWlnaHQ7XG4gICAgY29uc3QgZnVsbEQgPSBtZXRhPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXMuZGVwdGg7XG4gICAgbGV0IHdvcmxkOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH07XG4gICAgaWYgKG1wcFhZWikge1xuICAgICAgd29ybGQgPSB7XG4gICAgICAgIHdpZHRoOiBmdWxsVyAqIG1wcFhZWlswXSxcbiAgICAgICAgaGVpZ2h0OiBmdWxsSCAqIG1wcFhZWlsxXSxcbiAgICAgICAgZGVwdGg6IGZ1bGxEICogbXBwWFlaWzJdLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZnVsbExvbmcgPSBNYXRoLm1heCgxLCBmdWxsVywgZnVsbEgpO1xuICAgICAgd29ybGQgPSB7XG4gICAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICAgIGhlaWdodDogKGZ1bGxIICogVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGKSAvIGZ1bGxMb25nLFxuICAgICAgICBkZXB0aDogZnVsbEQsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBCYXNlIGJveCAoWi1zY2FsZSA9IDEpICsgdGhlIHNhbXBsZWQgZGVwdGggZHJpdmUgdGhlIGxpdmUgWi1oZWlnaHQgaGFuZGxlIGJlbG93OyB0aGUgcGVyc2lzdGVkXG4gICAgLy8gYHZvbHVtZVpTY2FsZWAgKHVzZXIgZHJhZykgYXBwbGllcyBvbiB0b3Agc28gY2hhbmdpbmcgcmVzb2x1dGlvbiBrZWVwcyB0aGUgY2hvc2VuIGhlaWdodC5cbiAgICB0aGlzLnZvbHVtZVdvcmxkQmFzZSA9IHdvcmxkO1xuICAgIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoID0gTWF0aC5tYXgoMSwgZGltcy5kZXB0aCk7XG4gICAgY29uc3Qgd29ybGRaID0gd29ybGQuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZTtcbiAgICBjb25zdCB2b3hlbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFtcbiAgICAgIHdvcmxkLndpZHRoIC8gZGltcy53aWR0aCxcbiAgICAgIHdvcmxkLmhlaWdodCAvIGRpbXMuaGVpZ2h0LFxuICAgICAgd29ybGRaIC8gdGhpcy52b2x1bWVTYW1wbGVkRGVwdGgsXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNoYW5uZWxzKSBjaC52b3hlbFNpemUgPSB2b3hlbFNpemU7XG5cbiAgICB2aWV3LnJlbmRlcih0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZScsIGNoYW5uZWxzLCB7IHJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmltYWdlVyA9IGRpbXMud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkaW1zLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMod29ybGQud2lkdGgsIHdvcmxkLmhlaWdodCwgd29ybGRaLCB7IHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkQXhlc0xhYmVscyh7IHdpZHRoOiB3b3JsZC53aWR0aCwgaGVpZ2h0OiB3b3JsZC5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgICAgLy8gXCJaXCIgYXhpcyArIGxhYmVsIGxpdmUpLCBzbyBpdCByZWFkcyBhcyB0aGUgWi1oZWlnaHQgY29udHJvbC4gRmxvYXRlZCBhIGxpdHRsZSBwYXN0IHRoZSBheGlzXG4gICAgICAvLyB0aXAgKMOXMS4xMikgc28gdGhlIGdyaXAgY2xlYXJzIHRoZSBcIlogwrcg4oCmXCIgbGFiZWwuIERyYWcg4oaVIHRvIHJlc3RyZXRjaCBaIGxpdmUuXG4gICAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZSh0aGlzLmhvc3QsIHZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgICB0b3BBbmNob3I6ICgpID0+IFtcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLndpZHRoIC8gMixcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICAgKCh0aGlzLnZvbHVtZVdvcmxkQmFzZSEuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFNjYWxlOiAoKSA9PiB0aGlzLnZvbHVtZVpTY2FsZSxcbiAgICAgICAgc2V0U2NhbGU6IChzKSA9PiB0aGlzLnNldFZvbHVtZVpTY2FsZShzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBwcml2YXRlIHNldFZvbHVtZVpTY2FsZShmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudm9sdW1lWlNjYWxlID0gTWF0aC5taW4oMTAsIE1hdGgubWF4KDAuMSwgZmFjdG9yKSk7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMudm9sdW1lV29ybGRCYXNlO1xuICAgIGlmICghYmFzZSB8fCAhdGhpcy52b2x1bWVWaWV3KSByZXR1cm47XG4gICAgY29uc3Qgd29ybGRaID0gYmFzZS5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHRoaXMuYXhlc0xheWVyLmRlcHRoID0gd29ybGRaO1xuICAgIHRoaXMuYXhlc0xhYmVscz8udXBkYXRlQW5jaG9ycyhcbiAgICAgIHRoaXMuYnVpbGRBeGVzTGFiZWxzKHsgd2lkdGg6IGJhc2Uud2lkdGgsIGhlaWdodDogYmFzZS5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSksXG4gICAgKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBYL1kvWiBheGlzLWVuZCBsYWJlbCBzcGVjcyBmb3IgdGhlIDNEIGdpem1vLiBBbmNob3JzIGFyZSBpbiB0aGUgdm9sdW1lJ3MgY2VudHJlZFxuICAgKiAgd29ybGQgYm94IChtYXRjaGluZyB0aGUgQXhlc0xheWVyIGdlb21ldHJ5KTsgdGhlIHNjYWxlIHRleHQgcmVmbGVjdHMgdGhlIEZVTEwgaW1hZ2UgZXh0ZW50IOKAlFxuICAgKiAgcGh5c2ljYWwgwrVtIHdoZW4gwrVtL3BpeGVsIGlzIGtub3duLCBlbHNlIHBpeGVsIChYL1kpIC8gc2xpY2UgKFopIGNvdW50cy4gKi9cbiAgcHJpdmF0ZSBidWlsZEF4ZXNMYWJlbHMoXG4gICAgdm9sOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0sXG4gICk6IEF4aXNMYWJlbFNwZWNbXSB7XG4gICAgY29uc3QgaHggPSB2b2wud2lkdGggLyAyO1xuICAgIGNvbnN0IGh5ID0gdm9sLmhlaWdodCAvIDI7XG4gICAgY29uc3QgaHogPSB2b2wuZGVwdGggLyAyO1xuICAgIC8vIE1lYXN1cmVkIGZyb20gdGhlIElNQUdFJ3Mgb3duIGV4dGVudCwgbmV2ZXIgZnJvbSB0aGUgd29ybGQgYm94OiB0aGUgYm94IGlzIGFcbiAgICAvLyBzaGFwZSAoYW5kIGZvciBhIHBoeXNpY2FsbHkgc2l6ZWQgdm9sdW1lIGl0IGlzIGFscmVhZHkgaW4gwrVtLCBzbyByZWFkaW5nIGFcbiAgICAvLyBwaXhlbCBjb3VudCBvZmYgaXQgYW5kIG11bHRpcGx5aW5nIGJ5IG1wcCB3b3VsZCBzY2FsZSB0aGUgbGFiZWwgdHdpY2UpLlxuICAgIGNvbnN0IHsgcHgsIG1wcCB9ID0gdGhpcy5pbWFnZUV4dGVudCgpO1xuICAgIGNvbnN0IGxlbiA9IChuOiBudW1iZXIsIHVtOiBudW1iZXIpOiBzdHJpbmcgPT4gKHVtID4gMCA/IGZvcm1hdFVtKG4gKiB1bSkgOiBgJHtufSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKHB4WzBdLCBtcHBbMF0pfWAsIGNvbG9yOiAnI2VkNDU0NScgfSxcbiAgICAgIHsgYW5jaG9yOiBbLWh4LCBoeSwgLWh6XSwgdGV4dDogYFkgwrcgJHtsZW4ocHhbMV0sIG1wcFsxXSl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgLy8gUGh5c2ljYWwgd2hlbiB0aGUgc3RhY2sgZGVjbGFyZXMgaXRzIHNsaWNlIHNwYWNpbmcgKGBtcHBaYCkg4oCUIGEgcmVzYW1wbGVkXG4gICAgICAvLyB2b2x1bWUga25vd3MgaG93IHRoaWNrIGl0IGlzOyBhIHBsYWluIHotc3RhY2sgY2FuIG9ubHkgc2F5IGhvdyBtYW55IHNsaWNlcy5cbiAgICAgIHsgYW5jaG9yOiBbLWh4LCAtaHksIGh6XSwgdGV4dDogYFogwrcgJHtsZW4ocHhbMl0sIG1wcFsyXSl9YCwgY29sb3I6ICcjNjY4Y2ZmJyB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGltYWdlJ3MgZGVjbGFyZWQgZXh0ZW50IGluIHBpeGVscy9zbGljZXMsIGFuZCBpdHMgcGh5c2ljYWwgc3BhY2luZyBwZXJcbiAgICogYXhpcyBpbiDCtW0gKDAgPSB1bmRlY2xhcmVkLCBhbmQgdGhlbiB0aGF0IGF4aXMgcmVhZHMgaW4gcGl4ZWxzKS5cbiAgICpcbiAgICogT25lIHBsYWNlLCBiZWNhdXNlIHRoZSB2b2x1bWUgd29ybGQgYm94IGFuZCB0aGUgYXhpcyBsYWJlbHMgaGF2ZSB0byBhZ3JlZVxuICAgKiBhYm91dCB3aGF0IHRoZSBpbWFnZSdzIHJlYWwgZGltZW5zaW9ucyBhcmUg4oCUIHRoZSBzYW1wbGVkIGdyaWQgaXMgZGVjaW1hdGVkIGFuZFxuICAgKiBzYXlzIG5vdGhpbmcgYWJvdXQgZWl0aGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUV4dGVudCgpOiB7IHB4OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IG1wcDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH0ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGRpbXMgPSB0aGlzLnZvbHVtZURpbXM7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCBtZXRhPy5tcHBYIHx8IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB4OiBbXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gbWV0YT8ueCA/PyBkaW1zPy53aWR0aCA/PyAxLFxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXM/LmhlaWdodCA/PyAxLFxuICAgICAgICBtZXRhPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXM/LmRlcHRoIHx8IDEsXG4gICAgICBdLFxuICAgICAgLy8gQSBkZXNjcmlwdG9yIHRoYXQgcmVwb3J0cyBvbmx5IG1wcFggaXMgc3F1YXJlLXBpeGVsIGJ5IGNvbnZlbnRpb24sIHdoaWNoIGlzXG4gICAgICAvLyB3aGF0IHRoZSAyRCBzY2FsZSBiYXIgYWxyZWFkeSBhc3N1bWVzIG9mIGl0LlxuICAgICAgbXBwOiBbbXBwWCwgdGhpcy5kZXNjcmlwdG9yPy5tcHBZIHx8IG1ldGE/Lm1wcFkgfHwgbXBwWCwgbWV0YT8ubXBwWiB8fCAwXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGEgZG93bnNhbXBsZWQgdWludDggdm9sdW1lIChsdW1pbmFuY2UpIGZyb20gdGhlIHBlci1zbGljZSB0aWxlIGVuZHBvaW50LiBTbGljZXMgYXJlXG4gICAqIGZldGNoZWQgd2l0aCBib3VuZGVkIGNvbmN1cnJlbmN5IChrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGZ1bGwgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXBcbiAgICogc3RhY2spIGFuZCByZWFkIGludG8gdGhlIHZvbHVtZSBhcyBlYWNoIGFycml2ZXMsIGRyaXZpbmcge0BsaW5rIHN0YWNrTG9hZGluZ1Byb2dyZXNzJH0gc28gdGhlXG4gICAqIGhvc3Qgc2hvd3MgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgaW5zdGVhZCBvZiBhIGJhcmUgc3Bpbm5lci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZW1ibGVWb2x1bWUoXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiB7IG1heFNsaWNlPzogbnVtYmVyOyBzbGljZVN0ZXA/OiBudW1iZXIgfSA9IHt9LFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzIHdoaWxlIHdlIGZldGNoXG4gICAgY29uc3QgZnVsbERlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgaWYgKGZ1bGxEZXB0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbm8gc2xpY2VzIHRvIGFzc2VtYmxlIGEgdm9sdW1lJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iob3B0cy5zbGljZVN0ZXAgPz8gMSkpO1xuICAgIGNvbnN0IG1heFNsaWNlID0gb3B0cy5tYXhTbGljZSA/PyBWT0xVTUVfTUFYX1NMSUNFO1xuICAgIC8vIFNvdXJjZS1zbGljZSBpbmRpY2VzIHNhbXBsZWQgaW50byB0aGUgdm9sdW1lIChldmVyeSBgc3RlcGB0aCBwbGFuZSDihpIgbG93LXJlcyBpcyBmYXN0ZXIpLlxuICAgIGNvbnN0IHpJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IHogPSAwOyB6IDwgZnVsbERlcHRoOyB6ICs9IHN0ZXApIHpJbmRpY2VzLnB1c2goeik7XG4gICAgY29uc3QgZGVwdGggPSB6SW5kaWNlcy5sZW5ndGg7XG5cbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBlYWNoIHNsaWNlIGF0IGEgcHlyYW1pZCBsZXZlbCBtYXRjaGluZyBgbWF4U2xpY2VgIChidWRnZXQgc2NhbGVzIHdpdGggdGhlIGRlY2ltYXRlXG4gICAgICAvLyBmYWN0b3IpLCBzbyBhIGhpZ2hlciBmYWN0b3IgcHVsbHMgYSBmaW5lciBsZXZlbCDihpIgbW9yZSByZWFsIGluLXBsYW5lIGRldGFpbDsgdGhlbiBkb3duc2FtcGxlXG4gICAgICAvLyB0byBgbWF4U2xpY2VgLiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmQgKG11bHRpY2hhbm5lbCB2b2x1bWUpOyBvbWl0IGZvciB0aGUgZ3JheXNjYWxlXG4gICAgICAvLyBjb21wb3NpdGUuIFRoZSBjYWxsZXIgb3ducyB0aGUgc3RhY2tMb2FkaW5nIGZsYWcgKG11bHRpY2hhbm5lbCBhc3NlbWJsZXMgY2hhbm5lbHMgaW4gdHVybikuXG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4U2xpY2UpO1xuICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoekluZGljZXNbMF0sIGNoYW5uZWwsIGJ1ZGdldCk7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIG1heFNsaWNlIC8gTWF0aC5tYXgoZmlyc3Qud2lkdGgsIGZpcnN0LmhlaWdodCwgMSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZpcnN0LndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZmlyc3QuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIGRlcHRoKTtcblxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ25hcGFyaS1qcyB2b2x1bWUgYXNzZW1ibHk6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcblxuICAgICAgLy8gUmVhZCBvbmUgZmV0Y2hlZCBzbGljZSBiaXRtYXAgaW50byB0aGUgdm9sdW1lIHBsYW5lIGB6YCAobHVtaW5hbmNlKS4gU3luY2hyb25vdXMgYmV0d2VlblxuICAgICAgLy8gYXdhaXRzLCBzbyB0aGUgc2hhcmVkIDJEIGNvbnRleHQgaXMgc2FmZSB0byByZXVzZSBhY3Jvc3MgdGhlIGNvbmN1cnJlbnQgZmV0Y2ggd29ya2Vycy5cbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHJlYWRTbGljZSA9ICh6OiBudW1iZXIsIGJtcDogSW1hZ2VCaXRtYXApOiB2b2lkID0+IHtcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgICAgICBjb25zdCBiYXNlID0geiAqIHdpZHRoICogaGVpZ2h0O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICBkYXRhW2Jhc2UgKyBpXSA9XG4gICAgICAgICAgICAocmdiYVtpICogNF0gKiAwLjI5OSArIHJnYmFbaSAqIDQgKyAxXSAqIDAuNTg3ICsgcmdiYVtpICogNCArIDJdICogMC4xMTQpIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICBkb25lKys7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoTWF0aC5yb3VuZCgoZG9uZSAvIGRlcHRoKSAqIDEwMCkpO1xuICAgICAgfTtcblxuICAgICAgcmVhZFNsaWNlKDAsIGZpcnN0KTtcblxuICAgICAgLy8gUmVtYWluaW5nIHBsYW5lcyB2aWEgYSBzbWFsbCBwb29sIG9mIHdvcmtlcnMgZHJhaW5pbmcgYSBzaGFyZWQgcXVldWUuIEVhY2ggcGxhbmUgYHBgXG4gICAgICAvLyBtYXBzIHRvIHNvdXJjZSBzbGljZSBgekluZGljZXNbcF1gIChzdWJzYW1wbGVkIGZvciBsb3ctcmVzKS5cbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBwID0gMTsgcCA8IGRlcHRoOyBwKyspIHBlbmRpbmcucHVzaChwKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHAgPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjtcbiAgICAgICAgICByZWFkU2xpY2UocCwgYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHpJbmRpY2VzW3BdLCBjaGFubmVsLCBidWRnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2xTaXplID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCAtIDEpKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHBvb2xTaXplIH0sICgpID0+IHdvcmtlcigpKSk7XG5cbiAgICAgIGlmICh0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybiBudWxsOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlciBhIHBhcnRpYWwgdm9sdW1lXG4gICAgICByZXR1cm4geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIgMkQgc2NhdHRlcjogdGhlIHNsaWNlIGltYWdlIHdpdGggYSBwb2ludHMgbGF5ZXIgYXQgZWFjaCByZWdpb24nc1xuICAgKiBjZW50cm9pZCAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyByZWdpb24tY2VudHJvaWQgc2NhdHRlcikuIFJlYnVpbGRzIHRoZSBwb2ludHMgbGl2ZSBhc1xuICAgKiByZWdpb25zIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgLy8gVGhpcyBtb2RlIHBsb3RzIFJFR0lPTiBjZW50cm9pZHMsIHNvIHdpdGhvdXQgdGhlIHJlZ2lvbiB0b29scyB0aGVyZSBpcyBub1xuICAgIC8vIHdheSB0byBwcm9kdWNlIGEgcG9pbnQg4oCUIGRyYXdpbmcgYSByZWdpb24gbm93IGFkZHMgb25lIGltbWVkaWF0ZWx5LlxuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLnJlYnVpbGRTY2F0dGVyUG9pbnRzKCk7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViID0gdGhpcy5yZWdpb25TdG9yZVxuICAgICAgLmdldFJlZ2lvblVwZGF0ZUV2ZW50KClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWJ1aWxkU2NhdHRlclBvaW50cygpKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDJEIHNjYXR0ZXIncyBwb2ludCBsYXllciBhdCB0aGUgY3VycmVudCByZWdpb24gY2VudHJvaWRzLiAqL1xuICBwcml2YXRlIHJlYnVpbGRTY2F0dGVyUG9pbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBpZiAodGhpcy5zY2F0dGVyMmRQb2ludHMpIHtcbiAgICAgIHYubGF5ZXJzLnJlbW92ZSh0aGlzLnNjYXR0ZXIyZFBvaW50cyk7XG4gICAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRoaXMucmVnaW9uQ2VudHJvaWRzKCk7XG4gICAgaWYgKGNlbnRyb2lkcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IHYuYWRkUG9pbnRzKGNlbnRyb2lkcywge1xuICAgICAgc2l6ZTogMTIsXG4gICAgICBmYWNlQ29sb3I6IFsxLCAwLjg1LCAwLjIsIDFdLFxuICAgICAgYm9yZGVyQ29sb3I6IFswLCAwLCAwLCAxXSxcbiAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lvbiBjZW50cm9pZHMgYXMgZmxhdCBgW3gsIHksIOKApl1gIGRhdGEgY29vcmRzIChyZWN0YW5nbGUgLyBwb2x5Z29uIC8gbXVsdGlwb2x5Z29uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25DZW50cm9pZHMoKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgcG9seUNlbnRyb2lkID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBuID0geHMubGVuZ3RoO1xuICAgICAgaWYgKG4gPT09IDApIHJldHVybjtcbiAgICAgIGxldCBjeCA9IDA7XG4gICAgICBsZXQgY3kgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY3ggKz0geHNbaV07XG4gICAgICAgIGN5ICs9IHlzW2ldO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goY3ggLyBuLCBjeSAvIG4pO1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSB7XG4gICAgICBjb25zdCBiID0gci5ib3VuZHMgYXNcbiAgICAgICAgfCB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9XG4gICAgICAgIHwgeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVxuICAgICAgICB8IHsgcG9seWdvbnM6IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH1bXSB9XG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYikgY29udGludWU7XG4gICAgICBpZiAoJ3dpZHRoJyBpbiBiICYmICd4JyBpbiBiKSB7XG4gICAgICAgIG91dC5wdXNoKGIueCArIGIud2lkdGggLyAyLCBiLnkgKyBiLmhlaWdodCAvIDIpO1xuICAgICAgfSBlbHNlIGlmICgneHBvaW50cycgaW4gYikge1xuICAgICAgICBwb2x5Q2VudHJvaWQoYi54cG9pbnRzLCBiLnlwb2ludHMpO1xuICAgICAgfSBlbHNlIGlmICgncG9seWdvbnMnIGluIGIpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHBvbHlDZW50cm9pZChwLnhwb2ludHMsIHAueXBvaW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KG91dCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGludGVyYWN0aW9uIHN0YWNrIGV2ZXJ5IDJEIG1vZGUgbmVlZHM6IHRoZSByZWdpb24gb3ZlcmxheSAoZHJhdy9zZWxlY3QvZWRpdCksIHRoZSBwaXhlbFxuICAgKiB0b29scyB0aGF0IHJlYWQgYmFjayBkaXNwbGF5ZWQgcGl4ZWxzICh3YW5kLCBicnVzaCwgdmVydGV4IGVyYXNlciwgem9vbS10by1ib3gsIFNBTS9jZWxscG9zZSksXG4gICAqIGFuZCBhIGNhbWVyYSBob29rIHRoYXQga2VlcHMgdGhhdCByZWFkYmFjayBjdXJyZW50IGFzIHRoZSB2aWV3IHBhbnMvem9vbXMgYW5kIHRpbGVkIGxldmVsc1xuICAgKiBsb2FkLlxuICAgKlxuICAgKiBFeHRyYWN0ZWQgYmVjYXVzZSBmb3JnZXR0aW5nIGl0IGlzIGludmlzaWJsZTogdGhlIHRvb2xiYXIgZ2F0ZXMgaXRzIHJlZ2lvbiBidXR0b25zIG9uIDJELXZzLTNEXG4gICAqIHJhdGhlciB0aGFuIG9uIHBsb3QgdHlwZSwgc28gYSAyRCBtb2RlIHRoYXQgc2tpcHMgdGhpcyBzaG93cyBldmVyeSB0b29sIGFuZCBzaWxlbnRseSBkb2VzXG4gICAqIG5vdGhpbmcuIFRoYXQgaXMgZXhhY3RseSB3aGF0IGhhcHBlbmVkIHRvIHRoZSBzcGF0aWFsIGFuZCByZWdpb24tY2VudHJvaWQgc2NhdHRlciBtb2Rlcy5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbmV3IE5hcGFyaVJlZ2lvbk92ZXJsYXkoaG9zdCwgdmlld2VyLCB0aGlzLnJlZ2lvblN0b3JlKTtcbiAgICB0aGlzLmJ1aWxkVG9vbEhvc3RzKCk7XG4gICAgdGhpcy5jYW1lcmFSZWFkYmFja09mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMuYXJtUmVhZGJhY2soKSk7XG4gIH1cblxuICAvLyDilIDilIAgU3BhdGlhbCBvbWljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogTWFya2VyIHJhZGl1cyAoaW1hZ2UgcHgpIGZvciBhIGRhdGFzZXQgdGhhdCBkZWNsYXJlcyBub25lIOKAlCBzZWdtZW50ZWQgY2VsbHMgb2Z0ZW4gZG9uJ3QuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTID0gNDtcbiAgLyoqIFNtYWxsZXN0IG1hcmtlciBESUFNRVRFUiwgaW4gc2xpY2UgcGl4ZWxzLCBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0LiBBIGNlbGwncyByZWFsXG4gICAqICBzaXplIGlzIGhvbm91cmVkIHdoZXJldmVyIGl0IHN1cnZpdmVzIHRoZSBncmlkOiB0aGUgQUJDIGF0bGFzIHNlcnZlcyA1IMK1bSByYWRpaSBvbiBhXG4gICAqICA0MCDCtW0vcHggdGVtcGxhdGUsIHNvIGRyYXdpbmcgdGhlbSB0byBzY2FsZSB3b3VsZCBwdXQgZXZlcnkgY2VsbCBhIGZpZnRoIG9mIGEgcGl4ZWwgd2lkZVxuICAgKiAgYW5kIHRoZSBzZWN0aW9uIHdvdWxkIGNvbWUgdXAgZW1wdHkuIFRoZSBwb2ludC1zaXplIGNvbnRyb2wgc2NhbGVzIHVwIGZyb20gdGhpcyBmbG9vci4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggPSAxLjU7XG4gIC8qKiBMb25nZXN0IHNpZGUgb2YgdGhlIGdlbmUtbWFwIHJhc3RlciwgaW4gZmllbGQgcGl4ZWxzLiBBIGdlbmUgbWFwIGlzIGEgc21vb3RoXG4gICAqICBmaWVsZCByZWFkIGFzIHRlcnJpdG9yeSwgc28gaXQgZ2FpbnMgbm90aGluZyBmcm9tIG1hdGNoaW5nIGEgMiBHcHggc2xpZGUnc1xuICAgKiAgcmVzb2x1dGlvbiDigJQgYW5kIHRoZSBlc3RpbWF0ZSBjb3N0cyBvbmUgcGFzcyBvdmVyIHRoaXMgbWFueSBwaXhlbHMuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdFTkVfTUFQX01BWF9TSURFID0gNTEyO1xuICAvKiogS2VybmVsIM+DIGluIGZpZWxkIHBpeGVscyBhdCBzbW9vdGhpbmcgMTogd2lkZSBlbm91Z2ggdG8gcmVhZCBiZXR3ZWVuIGNlbGxzLFxuICAgKiAgdGlnaHQgZW5vdWdoIHRvIGtlZXAgYSBudWNsZXVzLXNjYWxlIHN0cnVjdHVyZSBkaXN0aW5jdC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0VORV9NQVBfU0lHTUEgPSAyLjU7XG4gIC8qKiBDbHVzdGVycyBkcmF3biBhcyBkZW5zaXR5IHZvbHVtZXMgYXQgb25jZS4gUGFzdCBhIGhhbmRmdWwsIGFkZGl0aXZlIHRyYW5zbHVjZW50XG4gICAqICBjbG91ZHMgc3RvcCBiZWluZyBzZXBhcmFibGUgYnkgZXllIOKAlCBhbmQgZWFjaCBvbmUgaXMgYSBmdWxsIHJhc3RlcmlzYXRpb24uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFTlNJVFlfTUFYX0NMVVNURVJTID0gNjtcbiAgLyoqIENvbG91ciBmb3Igb2JzZXJ2YXRpb25zIHdoZW4gbm90aGluZyBpcyBzZWxlY3RlZCB0byBjb2xvdXIgYnk6IHZpc2libGUsIG5ldXRyYWwsIGFuZFxuICAgKiAgb2J2aW91c2x5IG5vdCBlbmNvZGluZyBhbnl0aGluZy4gKi9cbiAgLyoqIEhvdyBtdWNoIGxhcmdlciBhIHNlbGVjdGVkIG1hcmtlciBpcyBkcmF3biwgc28gYSBzbWFsbCBzZWxlY3Rpb24gaXMgZmluZGFibGUgaW5zaWRlIGFcbiAgICogIDMuN00tcG9pbnQgY2xvdWQgcmF0aGVyIHRoYW4gbWVyZWx5IGJyaWdodGVyLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgPSAxLjY7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9ORVVUUkFMX0NPTE9SOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9XG4gICAgWzAuMzUsIDAuNzIsIDAuOTUsIDAuOV07XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBTUEFUSUFMX09NSUNTIHZpZXc6IHRoZSB0aXNzdWUgaW1hZ2Ugd2l0aCBvbmUgbWFya2VyIHBlciBvYnNlcnZhdGlvbiwgY29sb3VyZWQgYnlcbiAgICogYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLiBUaGUgbWFya2VycyByZWJ1aWxkIHdoZW5ldmVyIHRoZSBkYXRhc2V0IG9yIHRoZSB2aWV3IHN0YXRlXG4gICAqIGNoYW5nZXMsIHNvIHN3aXRjaGluZyB0aGUgY29sb3VyLWJ5IGNvbHVtbiBkb2VzIG5vdCByZW1vdW50IHRoZSBzY2VuZS5cbiAgICpcbiAgICogU2V0cyB1cCB0aGUgZnVsbCAyRCBpbnRlcmFjdGlvbiBzdGFjayDigJQgcmVnaW9uIG92ZXJsYXksIHBpeGVsLXRvb2wgaG9zdHMsIHJlYWRiYWNrIGN1cnJlbmN5IOKAlFxuICAgKiBleGFjdGx5IGFzIHRoZSBwbGFpbiBpbWFnZSB2aWV3IGRvZXMuIFRoYXQgaXMgTk9UIG9wdGlvbmFsIGhlcmU6IHRoaXMgbW9kZSdzIHNlbGVjdGlvbiBpc1xuICAgKiBkcml2ZW4gYnkgZHJhd24gUk9Jcywgc28gd2l0aG91dCB0aGUgb3ZlcmxheSB0aGVyZSBpcyBubyB3YXkgdG8gbWFrZSBhIHNlbGVjdGlvbiBhdCBhbGwuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3BhdGlhbE9taWNzKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAvLyBPbmx5IGZpdCB0byB0aGUgaW1hZ2Ugd2hlbiB0aGlzIGRhdGFzZXQgYWN0dWFsbHkgaGFzIG9uZS4gT3RoZXJ3aXNlIHRoZXJlIGlzXG4gICAgLy8gbm90aGluZyB0byBmaXQsIGBpbWFnZVdgL2BpbWFnZUhgIHN0aWxsIGhvbGQgdGhlIExBU1QgaW1hZ2UncyBkaW1lbnNpb25zLCBhbmRcbiAgICAvLyB0aGlzIGZpdHMgdG8gdGhvc2Ug4oCUIGFuZCBiZWNhdXNlIGl0IGRlZmVycyB0byBhIGZyYW1lLCBpdCBsYW5kcyBBRlRFUiB0aGUgcG9pbnRzXG4gICAgLy8gYXJlIGFkZGVkIGFuZCBvdmVyd3JpdGVzIHRoZSBmcmFtaW5nIHRoZXkgc2V0LiBUaGF0IGlzIHdoYXQgbGVmdCBhbiBpbWFnZS1sZXNzXG4gICAgLy8gZGF0YXNldCBhcyBhIHRlbi1waXhlbCBzcGVjayBvZmYgdG8gb25lIHNpZGUuXG4gICAgaWYgKHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdPy5pbWFnZVJlZikgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLmluc3RhbGxTY2FsZUJhcigpO1xuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLmluc3RhbGxTcGF0aWFsSG92ZXIoaG9zdCk7XG4gICAgdGhpcy5zdWJzY3JpYmVTcGF0aWFsKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaW9uIGRyYXdpbmcgZm9yIHRoZSAzRCBjbG91ZC5cbiAgICpcbiAgICogUmV1c2VzIHtAbGluayBOYXBhcmlSZWdpb25PdmVybGF5fSB2ZXJiYXRpbSBieSBoYW5kaW5nIGl0IGEgU0NSRUVOLVNQQUNFIHZpZXdlcjogdGhlIGRyYXduXG4gICAqIHNoYXBlIGlzIGEgbGFzc28gaW4gY2FudmFzIHBpeGVscywgc28gXCJ3b3JsZFwiIGlzIHRoZSBjYW52YXMgYW5kIGJvdGggdHJhbnNmb3JtcyBhcmUgaWRlbnRpdHlcbiAgICogKGJhciB0aGUgY2xpZW504oaSY2FudmFzIG9mZnNldCkuIEV2ZXJ5IGV4aXN0aW5nIHRvb2wg4oCUIHJlY3RhbmdsZSwgcG9seWdvbiwgZnJlZWhhbmQg4oCUIHRoZXJlZm9yZVxuICAgKiB3b3JrcyBpbiAzRCB3aXRoIG5vIG5ldyBkcmF3aW5nIGNvZGUuXG4gICAqXG4gICAqIEEgc2NyZWVuLXNwYWNlIHNoYXBlIHN0b3BzIG1lYW5pbmcgYW55dGhpbmcgdGhlIG1vbWVudCB0aGUgY2FtZXJhIG1vdmVzLCBzbyBhbiBvcmJpdCBjbGVhcnNcbiAgICogdGhlIGRyYXduIHJlZ2lvbnMuIFRoZSBTRUxFQ1RJT04gaXQgcHJvZHVjZWQgaXMga2VwdDogdGhhdCBpcyB0aGUgZHVyYWJsZSBhcnRlZmFjdCwgYW5kIHRoZVxuICAgKiBoaWdobGlnaHRlZCBwb2ludHMgc3RheSBoaWdobGlnaHRlZCBmcm9tIGV2ZXJ5IGFuZ2xlLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsM2RJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjYW52YXNSZWN0ID0gKCkgPT4gdGhpcy5jYW52YXM/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNjcmVlblNwYWNlOiBPdmVybGF5Vmlld2VyID0ge1xuICAgICAgY2FudmFzVG9Xb3JsZDogKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSBjYW52YXNSZWN0KCk7XG4gICAgICAgIHJldHVybiByID8gW2NsaWVudFggLSByLmxlZnQsIGNsaWVudFkgLSByLnRvcF0gOiBbY2xpZW50WCwgY2xpZW50WV07XG4gICAgICB9LFxuICAgICAgLy8gQWxyZWFkeSBjYW52YXMgcGl4ZWxzLlxuICAgICAgd29ybGRUb0NhbnZhczogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbeCwgeV0sXG4gICAgICBzZXRDb250cm9sc0VuYWJsZWQ6IChlbmFibGVkOiBib29sZWFuKSA9PiB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGVuYWJsZWQpLFxuICAgICAgY2FtZXJhOiB2aWV3ZXIuY2FtZXJhM2QsXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCBzY3JlZW5TcGFjZSwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSB2aWV3ZXIuY2FtZXJhM2QuY2hhbmdlZC5jb25uZWN0KCgpID0+IHtcbiAgICAgIC8vIE9ubHkgd2hpbGUgbm90aGluZyBpcyBiZWluZyBkcmF3biDigJQgY2xlYXJpbmcgbWlkLWdlc3R1cmUgd291bGQgZGVsZXRlIHRoZVxuICAgICAgLy8gc2hhcGUgdW5kZXIgdGhlIHVzZXIncyBjdXJzb3IuXG4gICAgICBpZiAodGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkubGVuZ3RoID4gMCkgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBNb3ZlbWVudCwgaW4gc2NyZWVuIHBpeGVscywgdW5kZXIgd2hpY2ggYSBwcmVzcy1yZWxlYXNlIGlzIGEgQ0xJQ0sgYW5kIG5vdCBhXG4gICAqICBkcmFnLiBBbiBvcmJpdCBvciBhIHBhbiBzdGFydHMgdGhlIHNhbWUgd2F5LCBzbyB0aGUgdHdvIGhhdmUgdG8gYmUgdG9sZFxuICAgKiAgYXBhcnQgYnkgaG93IGZhciB0aGUgcG9pbnRlciB0cmF2ZWxsZWQuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMSUNLX1NMT1BfUFggPSA0O1xuICAvKiogTG9uZ2VzdCBwcmVzcy1yZWxlYXNlIHN0aWxsIHRyZWF0ZWQgYXMgYSBjbGljay4gQSBsb25nIHByZXNzIHdpdGggdGhlIG1vdXNlXG4gICAqICBoZWxkIHN0aWxsIGlzIG1vcmUgbGlrZWx5IGFuIGludGVycnVwdGVkIGRyYWcgdGhhbiBhIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xJQ0tfTUFYX01TID0gNjAwO1xuICAvKiogUG9pbnRlciBkaXN0YW5jZSwgaW4gc2NyZWVuIHBpeGVscywgdGhhdCBzdGlsbCBjb3VudHMgYXMgXCJvblwiIGEgbWFya2VyLlxuICAgKiAgR2VuZXJvdXMgcmVsYXRpdmUgdG8gYSAxLjVweCBkaXNjOiB0aGUgY3Vyc29yIGlzIGEgYmx1bnQgaW5zdHJ1bWVudCwgYW5kIGFcbiAgICogIHRvb2x0aXAgeW91IGhhdmUgdG8gaHVudCBmb3IgaXMgd29yc2UgdGhhbiBub25lLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIT1ZFUl9SQURJVVNfUFggPSAxMDtcblxuICAvKipcbiAgICogQ3Vyc29yIHRvb2x0aXAgZm9yIHRoZSBzcGF0aWFsIHZpZXdzOiBob3ZlciBhIG1hcmtlciwgcmVhZCBpdHMgY2xhc3MuXG4gICAqXG4gICAqIEEgMzQtZW50cnkgbGVnZW5kIGNhbm5vdCBiZSByZWFkIGJhY2sgZnJvbSBhIGRvdCDigJQgc2V2ZXJhbCBjbGFzc2VzIGdldFxuICAgKiBzaW1pbGFyIGNvbG91cnMsIGFuZCBtYXRjaGluZyBvbmUgdG8gYSBzd2F0Y2ggYnkgZXllIGlzIGV4YWN0bHkgdGhlIHRhc2sgdGhpc1xuICAgKiByZW1vdmVzLiBJdCByZXBvcnRzIHdoYXRldmVyIHRoZSBjbG91ZCBpcyBDVVJSRU5UTFkgY29sb3VyZWQgYnksIHNvIGl0IGFuZFxuICAgKiB0aGUgbGVnZW5kIGNhbiBuZXZlciBzYXkgZGlmZmVyZW50IHRoaW5ncy5cbiAgICpcbiAgICogTGlzdGVucyBvbiB0aGUgSE9TVCByYXRoZXIgdGhhbiB0aGUgY2FudmFzIHNvIGl0IGtlZXBzIHdvcmtpbmcgb3ZlciB0aGUgcmVnaW9uXG4gICAqIG92ZXJsYXkgKGFuIFNWRyBjb3ZlcmluZyB0aGUgY2FudmFzLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdyBldmVyeVxuICAgKiBtb3ZlKSwgYW5kIHRocm90dGxlcyB0byBvbmUgaGl0LXRlc3QgcGVyIGFuaW1hdGlvbiBmcmFtZTogYSBwb2ludGVybW92ZSBjYW5cbiAgICogZmlyZSBmYXIgbW9yZSBvZnRlbiB0aGFuIHRoYXQsIGFuZCBlYWNoIHRlc3QgaXMgYSBwYXNzIG92ZXIgdGhlIGNsb3VkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3BhdGlhbEhvdmVyKGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLnNwYXRpYWxUb29sdGlwID0gbmV3IE5hcGFyaVNwYXRpYWxUb29sdGlwKGhvc3QpO1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuaG92ZXJQb2ludGVyID0ge1xuICAgICAgICB4OiBlLmNsaWVudFggLSByZWN0LmxlZnQsXG4gICAgICAgIHk6IGUuY2xpZW50WSAtIHJlY3QudG9wLFxuICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5ob3ZlckZyYW1lKSByZXR1cm47XG4gICAgICB0aGlzLmhvdmVyRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmhvdmVyRnJhbWUgPSAwO1xuICAgICAgICB0aGlzLnVwZGF0ZUhvdmVyKGhvc3QpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkxlYXZlID0gKCkgPT4ge1xuICAgICAgdGhpcy5ob3ZlclBvaW50ZXIgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsVG9vbHRpcD8uaGlkZSgpO1xuICAgIH07XG5cbiAgICAvLyBBIGNsaWNrIG9uIGEgbWFya2VyIHNlbGVjdHMgaXRzIGNsYXNzLCBleGFjdGx5IGFzIGNsaWNraW5nIHRoYXQgY2xhc3MgaW4gdGhlXG4gICAgLy8gcGFuZWwncyBsZWdlbmQgZG9lcyDigJQgaW5jbHVkaW5nIGNsaWNraW5nIGFnYWluIHRvIGNsZWFyLCBzbyBhIGNsaWNrIGlzXG4gICAgLy8gYWx3YXlzIHJldmVyc2libGUuIFRyYWNrZWQgYXMgZG93bi91cCByYXRoZXIgdGhhbiBib3VuZCB0byBgY2xpY2tgIHNvIGEgRFJBR1xuICAgIC8vIChhbiBvcmJpdCBpbiAzRCwgYSBwYW4gaW4gMkQpIGNhbiBiZSB0b2xkIGFwYXJ0IGZyb20gYSBjbGljazogdGhlIGdlc3R1cmVcbiAgICAvLyBoYXMgdG8gbW92ZSBsZXNzIHRoYW4gYSBmZXcgcGl4ZWxzIGFuZCBiZSBvdmVyIHF1aWNrbHkuXG4gICAgbGV0IGRvd246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgb25Eb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGRvd24gPSB7IHg6IGUuY2xpZW50WCwgeTogZS5jbGllbnRZLCB0OiBEYXRlLm5vdygpIH07XG4gICAgfTtcbiAgICBjb25zdCBvblVwID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gZG93bjtcbiAgICAgIGRvd24gPSBudWxsO1xuICAgICAgaWYgKCFzdGFydCkgcmV0dXJuO1xuICAgICAgY29uc3QgbW92ZWQgPSBNYXRoLmh5cG90KGUuY2xpZW50WCAtIHN0YXJ0LngsIGUuY2xpZW50WSAtIHN0YXJ0LnkpO1xuICAgICAgaWYgKG1vdmVkID4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuQ0xJQ0tfU0xPUF9QWCkgcmV0dXJuO1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydC50ID4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuQ0xJQ0tfTUFYX01TKSByZXR1cm47XG4gICAgICAvLyBBIHJlZ2lvbiB0b29sIG93bnMgdGhlIHBvaW50ZXIgd2hpbGUgaXQgaXMgYWN0aXZlLCBhbmQgcGxhY2luZyBhIHBvbHlnb25cbiAgICAgIC8vIHZlcnRleCBpcyBhbHNvIGEgY2xpY2sgdGhhdCBkb2VzIG5vdCBtb3ZlLlxuICAgICAgaWYgKHRoaXMucmVnaW9uT3ZlcmxheT8udG9vbEFjdGl2ZSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZWxlY3RDbGFzc0F0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCBvbkxlYXZlKTtcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKTtcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uVXApO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Nb3ZlKSk7XG4gICAgdGhpcy5ob3Zlck9mZi5wdXNoKCgpID0+IGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSkpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKSk7XG4gICAgdGhpcy5ob3Zlck9mZi5wdXNoKCgpID0+IGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25VcCkpO1xuXG4gICAgLy8gSW4gM0QgdGhlIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHNjcmVlbiBwaXhlbHMsIHNvIGFuIG9yYml0IGludmFsaWRhdGVzIHRoZW0uXG4gICAgY29uc3QgY2FtZXJhID0gdGhpcy52aWV3ZXI/LmNhbWVyYTNkO1xuICAgIGlmIChjYW1lcmEgJiYgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgIGNvbnN0IG9mZiA9IGNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4ge1xuICAgICAgICB0aGlzLnNwYXRpYWxTY2VuZVJldisrO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmhvdmVyT2ZmLnB1c2gob2ZmKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVNwYXRpYWxIb3ZlcigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9mZiBvZiB0aGlzLmhvdmVyT2ZmKSBvZmYoKTtcbiAgICB0aGlzLmhvdmVyT2ZmID0gW107XG4gICAgaWYgKHRoaXMuaG92ZXJGcmFtZSkgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5ob3ZlckZyYW1lKTtcbiAgICB0aGlzLmhvdmVyRnJhbWUgPSAwO1xuICAgIHRoaXMuaG92ZXJQb2ludGVyID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxUb29sdGlwPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcCA9IG51bGw7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9uc1JldiA9IC0xO1xuICAgIHRoaXMuaG92ZXJJbmRleCA9IG51bGw7XG4gIH1cblxuICAvKiogSGl0LXRlc3QgdGhlIGxhc3QgcG9pbnRlciBwb3NpdGlvbiBhbmQgc2hvdyBvciBoaWRlIHRoZSB0b29sdGlwLiAqL1xuICBwcml2YXRlIHVwZGF0ZUhvdmVyKGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5zcGF0aWFsVG9vbHRpcDtcbiAgICBjb25zdCBwb2ludGVyID0gdGhpcy5ob3ZlclBvaW50ZXI7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdO1xuICAgIGlmICghdGlwIHx8ICFwb2ludGVyIHx8ICFkYXRhc2V0KSByZXR1cm47XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmhvdmVyUG9zaXRpb25zRm9yKGRhdGFzZXQub2JzZXJ2YXRpb25zKTtcbiAgICBpZiAoIXBvc2l0aW9ucykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIC8vIDNEIGNvbXBhcmVzIHNjcmVlbiBwaXhlbHMgZGlyZWN0bHk7IDJEIGhvbGRzIHdvcmxkIHBvc2l0aW9ucywgc28gdGhlIHJhZGl1c1xuICAgIC8vIGlzIGNvbnZlcnRlZCBvbmNlIGluc3RlYWQgb2YgcHJvamVjdGluZyB0aGUgd2hvbGUgY2xvdWQuXG4gICAgY29uc3Qgem9vbSA9IGlzM2QgPyAxIDogKHRoaXMudmlld2VyPy5jYW1lcmEuem9vbSA/PyAxKTtcbiAgICBjb25zdCByYWRpdXMgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5IT1ZFUl9SQURJVVNfUFggLyAoem9vbSA+IDAgPyB6b29tIDogMSk7XG4gICAgbGV0IHggPSBwb2ludGVyLng7XG4gICAgbGV0IHkgPSBwb2ludGVyLnk7XG4gICAgaWYgKCFpczNkKSB7XG4gICAgICBjb25zdCB3b3JsZCA9IHRoaXMudmlld2VyPy5jYW52YXNUb1dvcmxkKHBvaW50ZXIuY2xpZW50WCwgcG9pbnRlci5jbGllbnRZKTtcbiAgICAgIGlmICghd29ybGQpIHtcbiAgICAgICAgdGlwLmhpZGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgW3gsIHldID0gd29ybGQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGl0ID0gdGhpcy5waWNrT2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMsIGlzM2QpO1xuICAgIGNvbnN0IGxpbmVzID0gaG92ZXJUZXh0KHRoaXMuaG92ZXJTb3VyY2UsIGhpdCk7XG4gICAgaWYgKCFsaW5lcykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGlwLnNob3cobGluZXMsIHBvaW50ZXIuY2xpZW50WCAtIHJlY3QubGVmdCwgcG9pbnRlci5jbGllbnRZIC0gcmVjdC50b3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgY2xhc3Mgb2YgdGhlIG1hcmtlciBhdCBhIGNsaWVudCBwb3NpdGlvbiDigJQgdGhlIGNhbnZhcyBlcXVpdmFsZW50IG9mXG4gICAqIGNsaWNraW5nIHRoYXQgY2xhc3MgaW4gdGhlIHBhbmVsJ3MgbGVnZW5kLCBhbmQgdGhlIHNhbWUgc2VsZWN0aW9uIG9iamVjdCwgc29cbiAgICogdGhlIHR3byBjb250cm9scyBjYW5ub3QgcHJvZHVjZSBkaWZmZXJlbnQgcmVzdWx0cy5cbiAgICpcbiAgICogQ2xpY2tpbmcgYSBjbGFzcyB0aGF0IGlzIGFscmVhZHkgdGhlIHdob2xlIHNlbGVjdGlvbiBDTEVBUlMgaXQsIHdoaWNoIGlzIHdoYXRcbiAgICogdGhlIGxlZ2VuZCBkb2VzLiBDb21wYXJlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gaXRzZWxmIHJhdGhlciB0aGFuIGFnYWluc3QgYVxuICAgKiByZW1lbWJlcmVkIGNsaWNrLCBzbyBzZWxlY3RpbmcgZnJvbSB0aGUgbGVnZW5kIGFuZCB0aGVuIGNsaWNraW5nIHRoZSBzYW1lXG4gICAqIGNsYXNzIG9uIHRoZSBjYW52YXMgc3RpbGwgdG9nZ2xlcy5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0Q2xhc3NBdChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaG92ZXJTb3VyY2U7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnNlbGVjdGlvblN0b3JlO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICAvLyBPbmx5IGEgY2F0ZWdvcmljYWwgc291cmNlIGhhcyBjbGFzc2VzIHRvIHNlbGVjdC4gQSBnZW5lIGlzIGNvbnRpbnVvdXM6XG4gICAgLy8gdGhlcmUgaXMgbm8gc2V0IG9mIGNlbGxzIHRoYXQgXCJpc1wiIGEgdmFsdWUuXG4gICAgaWYgKCFzdG9yZSB8fCAhZGF0YXNldCB8fCBzb3VyY2U/LmtpbmQgIT09ICdjYXRlZ29yaWNhbCcpIHJldHVybjtcblxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuaG92ZXJQb3NpdGlvbnNGb3IoZGF0YXNldC5vYnNlcnZhdGlvbnMpO1xuICAgIGlmICghcG9zaXRpb25zKSByZXR1cm47XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgaWYgKCFjYW52YXMpIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGlzM2QgPSBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKTtcbiAgICBjb25zdCB6b29tID0gaXMzZCA/IDEgOiAodGhpcy52aWV3ZXI/LmNhbWVyYS56b29tID8/IDEpO1xuICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICBsZXQgeCA9IGNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgbGV0IHkgPSBjbGllbnRZIC0gcmVjdC50b3A7XG4gICAgaWYgKCFpczNkKSB7XG4gICAgICBjb25zdCB3b3JsZCA9IHRoaXMudmlld2VyPy5jYW52YXNUb1dvcmxkKGNsaWVudFgsIGNsaWVudFkpO1xuICAgICAgaWYgKCF3b3JsZCkgcmV0dXJuO1xuICAgICAgW3gsIHldID0gd29ybGQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGl0ID0gbmVhcmVzdE9ic2VydmF0aW9uKHBvc2l0aW9ucywgeCwgeSwgcmFkaXVzKTtcbiAgICBpZiAoaGl0IDwgMCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvZGUgPSBzb3VyY2UuY29kZXNbaGl0XTtcbiAgICAvLyBBIGNlbGwgdGhlIGFubm90YXRpb24gZG9lcyBub3QgY292ZXIgaGFzIG5vIGNsYXNzIHRvIHNlbGVjdC5cbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkIHx8IGNvZGUgPT09IE5PX0NBVEVHT1JZKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXh0ID0gc2VsZWN0QnlDYXRlZ29yeShzb3VyY2UuY29kZXMsIGNvZGUpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBzdG9yZS5jdXJyZW50KCk7XG4gICAgaWYgKHNhbWVTZWxlY3Rpb24oY3VycmVudCwgbmV4dCkpIHtcbiAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0b3JlLnNldChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCBvYnNlcnZhdGlvbiBpcyB1bmRlciB0aGUgY3Vyc29yLlxuICAgKlxuICAgKiBJbiAzRCB0aGlzIGRlZmVycyB0byBuYXBhcmktanMncyB7QGxpbmsgbmVhcmVzdFByb2plY3RlZEluZGV4fSBXSVRIIHRoZSBkZXB0aHMgdGhlXG4gICAqIHByb2plY3Rpb24gcHJvZHVjZWQsIHNvIHRoZSBmcm9udC1tb3N0IGNhbmRpZGF0ZSB3aW5zLiBUaGF0IG1hdHRlcnMgbW9yZSB0aGFuIGl0XG4gICAqIHNvdW5kczogdGhlIHJlbmRlcmVyIGRlcHRoLXRlc3RzIHRoZSBiaWxsYm9hcmRzLCBhbmQgaW4gYSAzLjdNLXBvaW50IGNsb3VkIHRoZSBjdXJzb3JcbiAgICogY292ZXJzIG1hbnkgb2YgdGhlbSDigJQgcGlja2luZyB0aGUgb25lIG5lYXJlc3QgdGhlIGN1cnNvcidzIGNlbnRyZSByZWd1bGFybHkgbmFtZXMgYVxuICAgKiBjZWxsIHRoYXQgc29tZXRoaW5nIGVsc2UgaXMgZHJhd24gb3Zlciwgd2hpY2ggcmVhZHMgYXMgYSB3cm9uZyB0b29sdGlwIHJhdGhlciB0aGFuIGFzXG4gICAqIGEgc3VidGxldHkgb2YgcGlja2luZy5cbiAgICpcbiAgICogSW4gMkQgdGhlIHBvc2l0aW9ucyBhcmUgV09STEQgY29vcmRpbmF0ZXMgb24gb25lIHBsYW5lLCBzbyB0aGVyZSBpcyBubyBkZXB0aCB0byBicmVha1xuICAgKiB0aWVzIHdpdGggYW5kIHRoZSBleGlzdGluZyBuZWFyZXN0LW1hcmtlciBydWxlIGlzIHRoZSByaWdodCBvbmUuXG4gICAqL1xuICBwcml2YXRlIHBpY2tPYnNlcnZhdGlvbihcbiAgICBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSxcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIGlzM2Q6IGJvb2xlYW4sXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFpczNkKSByZXR1cm4gbmVhcmVzdE9ic2VydmF0aW9uKHBvc2l0aW9ucywgeCwgeSwgcmFkaXVzKTtcbiAgICAvLyBUaGUgY2xvdWQgZHJhd3MgYSBzZWxlY3RlZCBtYXJrZXIgTEFSR0VSLCBzbyB0aGUgcGljayBoYXMgdG8gdXNlIHRoZSBzYW1lIHJhZGl1cyB0aGVcbiAgICAvLyByZW5kZXJlciB1c2VkIOKAlCBvdGhlcndpc2UgdGhlIGhpZ2hsaWdodGVkIGNlbGxzLCB0aGUgb25lcyBhIHJlYWRlciBpcyBtb3N0IGxpa2VseSB0b1xuICAgIC8vIGJlIHBvaW50aW5nIGF0LCBhcmUgdGhlIGhhcmRlc3QgdG8gaG92ZXIuXG4gICAgY29uc3Qgc2NhbGUgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEU7XG4gICAgY29uc3QgbWFzayA9IHRoaXMuc2VsZWN0aW9uU3RvcmU/LmN1cnJlbnQoKT8ubWFzaztcbiAgICBjb25zdCBvcHRzID0gbWFzaz8ubGVuZ3RoXG4gICAgICA/IHsgcmFkaXVzQXQ6IChpOiBudW1iZXIpID0+IChtYXNrW2ldID8gcmFkaXVzICogc2NhbGUgOiByYWRpdXMpIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIC8vIGByYWRpdXNgIHN0aWxsIGJvdW5kcyB3aGljaCBidWNrZXRzIGFyZSB2aXNpdGVkLCBzbyBpdCBoYXMgdG8gYmUgdGhlIExBUkdFU1QgYW55XG4gICAgLy8gcG9pbnQgY2FuIGNsYWltLCBub3QgdGhlIGJhc2Ugb25lLlxuICAgIGNvbnN0IHJlYWNoID0gbWFzaz8ubGVuZ3RoID8gcmFkaXVzICogc2NhbGUgOiByYWRpdXM7XG4gICAgaWYgKHRoaXMuaG92ZXJJbmRleCkgcmV0dXJuIHRoaXMuaG92ZXJJbmRleC5waWNrKHgsIHksIHJlYWNoLCBvcHRzKTtcbiAgICByZXR1cm4gbmVhcmVzdFByb2plY3RlZEluZGV4KHBvc2l0aW9ucywgeCwgeSwgcmVhY2gsIHRoaXMuc3BhdGlhbERlcHRoczNkLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3NpdGlvbnMgdG8gaGl0LXRlc3QgYWdhaW5zdCwgcmVidWlsdCBvbmx5IHdoZW4gdGhlIHNjZW5lIG9yIGNhbWVyYSBtb3ZlZC5cbiAgICpcbiAgICogQSBwYXNzIG92ZXIgMy43TSBvYnNlcnZhdGlvbnMgaXMgbm90IHNvbWV0aGluZyB0byBkbyBwZXIgcG9pbnRlcm1vdmUsIGFuZCB0aGVcbiAgICogY2xvdWQgZG9lcyBub3QgbW92ZSBiZXR3ZWVuIGZyYW1lcyB1bmxlc3Mgc29tZXRoaW5nIHNheXMgaXQgZGlkLlxuICAgKi9cbiAgcHJpdmF0ZSBob3ZlclBvc2l0aW9uc0ZvcihvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMpOiBGbG9hdDMyQXJyYXkgfCBudWxsIHtcbiAgICBpZiAodGhpcy5ob3ZlclBvc2l0aW9ucyAmJiB0aGlzLmhvdmVyUG9zaXRpb25zUmV2ID09PSB0aGlzLnNwYXRpYWxTY2VuZVJldikge1xuICAgICAgcmV0dXJuIHRoaXMuaG92ZXJQb3NpdGlvbnM7XG4gICAgfVxuICAgIGNvbnN0IGlzM2QgPSBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKTtcbiAgICBjb25zdCBidWlsdCA9IGlzM2RcbiAgICAgID8gdGhpcy5nZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbihvYnMpXG4gICAgICA6IHRoaXMuaG92ZXJXb3JsZFBvc2l0aW9ucyhvYnMpO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnMgPSBidWlsdDtcbiAgICB0aGlzLmhvdmVyUG9zaXRpb25zUmV2ID0gdGhpcy5zcGF0aWFsU2NlbmVSZXY7XG4gICAgLy8gQnVpbHQgaGVyZSwgaW4gdGhlIHNhbWUgbGF6eSBzbG90LCBzbyBpdCBpcyBwYWlkIGZvciBvbiB0aGUgZmlyc3QgaG92ZXIgYWZ0ZXIgdGhlXG4gICAgLy8gc2NlbmUgbW92ZWQgYW5kIG5vdCBvbiBldmVyeSBmcmFtZSBvZiBhbiBvcmJpdC4gT25seSB3b3J0aCBpdCBwYXN0IHRoZSBwb2ludCB3aGVyZVxuICAgIC8vIHRoZSBsaW5lYXIgc2NhbiBzdG9wcyBiZWluZyBmcmVlOyBiZWxvdyB0aGF0IHRoZSBidWlsZCBjb3N0cyBtb3JlIHRoYW4gaXQgc2F2ZXMuXG4gICAgdGhpcy5ob3ZlckluZGV4ID0gbnVsbDtcbiAgICBpZiAoaXMzZCAmJiBidWlsdCAmJiB0aGlzLmNhbnZhcyAmJiBidWlsdC5sZW5ndGggLyAyID49IFNDUkVFTl9JTkRFWF9NSU5fUE9JTlRTKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICBjb25zdCBoID0gdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0IHx8IHRoaXMuY2FudmFzLmhlaWdodDtcbiAgICAgIGlmICh3ICYmIGgpIHtcbiAgICAgICAgdGhpcy5ob3ZlckluZGV4ID0gbmV3IFNjcmVlbkluZGV4KFxuICAgICAgICAgIHsgc2NyZWVuOiBidWlsdCwgZGVwdGg6IHRoaXMuc3BhdGlhbERlcHRoczNkID8/IG5ldyBGbG9hdDMyQXJyYXkoYnVpbHQubGVuZ3RoIC8gMikgfSxcbiAgICAgICAgICB3LFxuICAgICAgICAgIGgsXG4gICAgICAgICAgLy8gVGhlIGxhcmdlc3QgcmFkaXVzIGFueSBwaWNrIGhlcmUgY2FuIGNsYWltOiB0aGUgYmFzZSBob3ZlciByYWRpdXMsIHRpbWVzIHRoZVxuICAgICAgICAgIC8vIHNjYWxlIGEgU0VMRUNURUQgbWFya2VyIGlzIGRyYXduIGF0LiBTdGF0ZWQgcmF0aGVyIHRoYW4gbGVmdCB0byB0aGUgZGVmYXVsdCxcbiAgICAgICAgICAvLyBiZWNhdXNlIGl0IGlzIHdoYXQgZGVjaWRlcyB3aGV0aGVyIGEgbWFya2VyIHN0cmFkZGxpbmcgdGhlIGNhbnZhcyBlZGdlIGlzXG4gICAgICAgICAgLy8gZm91bmQg4oCUIGl0cyBjZW50cmUgaXMgb2ZmIHNjcmVlbiB3aGlsZSBwYXJ0IG9mIGl0IGlzIG5vdC5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhSZWFjaDogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuSE9WRVJfUkFESVVTX1BYXG4gICAgICAgICAgICAgICogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBidWlsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgMkQgbWFya2VycycgV09STEQgcG9zaXRpb25zLCBpbmRleGVkIGJ5IG9ic2VydmF0aW9uLCBOYU4gZm9yIGFueSBub3Qgb25cbiAgICogdGhlIGRpc3BsYXllZCBwbGFuZSDigJQgdGhlIHNhbWUgYWZmaW5lIGFuZCB0aGUgc2FtZSBzdWJzZXQgdGhlIG1hcmtlciBsYXllciB3YXNcbiAgICogYnVpbHQgZnJvbSwgc28gdGhlIHRvb2x0aXAgY2Fubm90IHBvaW50IGF0IGEgY2VsbCB0aGF0IGlzIG5vdCBkcmF3bi5cbiAgICovXG4gIHByaXZhdGUgaG92ZXJXb3JsZFBvc2l0aW9ucyhvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMpOiBGbG9hdDMyQXJyYXkgfCBudWxsIHtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5zcGF0aWFsTGF0ZXN0Py5bMF07XG4gICAgaWYgKCFkYXRhc2V0IHx8IG9icy5jb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2xhYiA9IHRoaXMuc3BhdGlhbFNsYWIoZGF0YXNldCk7XG4gICAgY29uc3QgcmVmID0gc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWY7XG4gICAgY29uc3QgW3N4LCBzeV0gPSByZWY/LnNjYWxlID8/IFsxLCAxXTtcbiAgICBjb25zdCBbdHgsIHR5XSA9IHJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgICBjb25zdCBkcmF3biA9IHNsYWI/LmluZGljZXMgPz8gbnVsbDtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCAqIDIpLmZpbGwoTmFOKTtcbiAgICBjb25zdCBuID0gZHJhd24gPyBkcmF3bi5sZW5ndGggOiBvYnMuY291bnQ7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBkcmF3biA/IGRyYXduW2tdIDogaztcbiAgICAgIG91dFtpICogMl0gPSBvYnMueFtpXSAqIHN4ICsgdHg7XG4gICAgICBvdXRbaSAqIDIgKyAxXSA9IG9icy55W2ldICogc3kgKyB0eTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSB0b29sdGlwIHNheXMsIHJlc29sdmVkIG9uY2UgcGVyIGNvbG91ciBzb3VyY2UgcmF0aGVyIHRoYW4gcGVyIGhvdmVyLlxuICAgKlxuICAgKiBGZXRjaGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgY29sb3VyaW5nIG9uIHB1cnBvc2U6IHRoZSByZWZlcmVuY2UgcG9ydCBjYWNoZXNcbiAgICogY29sdW1ucywgYnV0IGEgaG9zdCdzIG5lZWQgbm90LCBhbmQgcmUtZmV0Y2hpbmcgYSAzLjdNLWVsZW1lbnQgdmVjdG9yIGJlY2F1c2VcbiAgICogdGhlIHBvaW50ZXIgbW92ZWQgd291bGQgYmUgaW5kZWZlbnNpYmxlIGVpdGhlciB3YXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVIb3ZlclNvdXJjZShcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgY29uc3Qga2V5ID0gZGF0YXNldCAmJiBjb2xvckJ5XG4gICAgICA/IGAke2RhdGFzZXQuaWR9fCR7Y29sb3JCeS5raW5kfToke2NvbG9yQnkubmFtZX1gXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5ob3ZlclNvdXJjZUtleSkgcmV0dXJuO1xuICAgIC8vIFRoZSBrZXkgaXMgY29tbWl0dGVkIG9ubHkgd2hlcmUgYSB2YWx1ZSBpcyBhY3R1YWxseSBzdG9yZWQuIFNldHRpbmcgaXQgdXBcbiAgICAvLyBmcm9udCB3b3VsZCBtZWFuIGEgcmVzb2x1dGlvbiB0aGF0IGxvc2VzIHRoZSByYWNlIGxlYXZlcyB0aGUga2V5IGNsYWltaW5nIGFcbiAgICAvLyBzb3VyY2UgdGhhdCB3YXMgbmV2ZXIgc3RvcmVkIOKAlCBhbmQgc2luY2UgZXZlcnkgbGF0ZXIgZW1pc3Npb24gY2FycmllcyB0aGVcbiAgICAvLyBzYW1lIGtleSwgaXQgd291bGQgc2hvcnQtY2lyY3VpdCBoZXJlIGZvcmV2ZXIgYW5kIHRoZSB0b29sdGlwIHdvdWxkIHN0YXlcbiAgICAvLyBzaWxlbnQgZm9yIHRoZSByZXN0IG9mIHRoZSBzZXNzaW9uLlxuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLmhvdmVyU291cmNlVG9rZW47XG4gICAgLy8gTm8gY29sb3VyIHNvdXJjZSBtZWFucyBub3RoaW5nIGlzIGJlaW5nIHNhaWQgYWJvdXQgdGhlIGNlbGxzLCBzbyB0aGVyZSBpcyBub1xuICAgIC8vIGNsdXN0ZXIgdG8gbmFtZSBhbmQgdGhlIHRvb2x0aXAgc3RheXMgc2lsZW50LlxuICAgIGlmICgha2V5IHx8ICFkYXRhc2V0IHx8ICFjb2xvckJ5IHx8ICFwb3J0KSB7XG4gICAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBrZXk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMuaG92ZXJTb3VyY2VUb2tlbikgcmV0dXJuO1xuICAgICAgICB0aGlzLmhvdmVyU291cmNlID0gaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBraW5kOiAnY2F0ZWdvcmljYWwnLFxuICAgICAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogY29sdW1uLm1ldGEuY2F0ZWdvcmllcyxcbiAgICAgICAgICAgIGNvZGVzOiBjb2x1bW4uY29kZXMsXG4gICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAga2luZDogJ2NvbnRpbnVvdXMnLFxuICAgICAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICAgICAgdmFsdWVzOiBjb2x1bW4udmFsdWVzLFxuICAgICAgICAgICAgLi4uKGNvbHVtbi5tZXRhLnVuaXQgPyB7IHVuaXQ6IGNvbHVtbi5tZXRhLnVuaXQgfSA6IHt9KSxcbiAgICAgICAgICB9O1xuICAgICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5ob3ZlclNvdXJjZVRva2VuKSByZXR1cm47XG4gICAgICB0aGlzLmhvdmVyU291cmNlID0ge1xuICAgICAgICBraW5kOiAnY29udGludW91cycsXG4gICAgICAgIG5hbWU6IGNvbG9yQnkubmFtZSxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICAuLi4oZGF0YXNldC5mZWF0dXJlcz8udW5pdCA/IHsgdW5pdDogZGF0YXNldC5mZWF0dXJlcy51bml0IH0gOiB7fSksXG4gICAgICB9O1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5ob3ZlclNvdXJjZVRva2VuKSByZXR1cm47XG4gICAgICAvLyBUaGUgdG9vbHRpcCBpcyBhbiBleHRyYTsgYSBmYWlsZWQgZmV0Y2ggbXVzdCBub3QgZGlzdHVyYiB0aGUgcmVuZGVyLiBUaGVcbiAgICAgIC8vIGtleSBpcyBsZWZ0IHVuc2V0IHNvIGEgbGF0ZXIgZW1pc3Npb24gcmV0cmllcyByYXRoZXIgdGhhbiBpbmhlcml0aW5nIGFcbiAgICAgIC8vIHBlcm1hbmVudCBzaWxlbmNlLlxuICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdCBldmVyeSBvYnNlcnZhdGlvbiB0byBjYW52YXMgcGl4ZWxzIHVuZGVyIHRoZSBjdXJyZW50IDNEIGNhbWVyYS5cbiAgICpcbiAgICogVGhlIHByb2plY3Rpb24gaXRzZWxmIGlzIHRoZSByZW5kZXJlcidzOiBgdmlld2VyLnByb2plY3RQb2ludHNgIG93bnMgdGhlIGNhbWVyYSwgdGhlXG4gICAqIHZpZXdwb3J0IGluIENTUyBwaXhlbHMsIHRoZSBwZXJzcGVjdGl2ZSBkaXZpZGUgYW5kIHRoZSB5LWZsaXAuIFRoaXMgdXNlZCB0byBiZSBmaWZ0ZWVuXG4gICAqIGxpbmVzIG9mIGNvbHVtbi1tYWpvciBtYXRyaXggYXJpdGhtZXRpYyBoZXJlLCBkdXBsaWNhdGluZyBhIHNlY29uZCBjb3B5IGluXG4gICAqIGBuYXBhcmktYXhlcy1sYWJlbHNgIOKAlCBhbmQgdGhlIHR3byBoYWQgZHJpZnRlZCBvbiB3aGF0IHRvIGRvIHdpdGggYSBOYU4gdy5cbiAgICpcbiAgICogV2hhdCBpcyBsZWZ0IGlzIHRoZSBwYXJ0IHRoYXQgaXMgZ2VudWluZWx5IHRoaXMgYWRhcHRlcidzOiBTQ0FUVEVSSU5HIHRoZSBkcmF3biBzdWJzZXRcbiAgICogYmFjayBpbnRvIG9ic2VydmF0aW9uIG9yZGVyLiBUaGUgY2xvdWQgaG9sZHMgb25seSB0aGUgcG9pbnRzIG9mIHRoZSBkaXNwbGF5ZWQgc2VjdGlvbixcbiAgICogaW4gaXRzIG93biBwYWNraW5nOyBldmVyeSBjb25zdW1lciBpbmRleGVzIGJ5IG9ic2VydmF0aW9uLiBOYU4gc3RhbmRzIGZvciBcIm5vdCBvblxuICAgKiBzY3JlZW5cIiwgd2hpY2ggaXMgYWxzbyB0aGUgcmlnaHQgYW5zd2VyIGZvciBhbiBvYnNlcnZhdGlvbiB3aG9zZSBzZWN0aW9uIGlzIGhpZGRlbi5cbiAgICpcbiAgICogTnVsbCB3aGVuIHRoZSAzRCBjbG91ZCBpcyBub3QgbW91bnRlZCwgc28gdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIHRoZSAyRCBhZmZpbmUgcGF0aC5cbiAgICovXG4gIGdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdmlld2VyIHx8ICF0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBwcm9qZWN0ZWQgPSB2aWV3ZXIucHJvamVjdFBvaW50cyh0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCwgdGhpcy5zcGF0aWFsUHJvamVjdGlvbjNkKTtcbiAgICBpZiAoIXByb2plY3RlZCkgcmV0dXJuIG51bGw7XG4gICAgLy8gUmV1c2VkIGFjcm9zcyBjYW1lcmEgY2hhbmdlczogYXQgMy43TSBvYnNlcnZhdGlvbnMgdGhpcyBpcyBhIDMwIE1CIGFsbG9jYXRpb24gdGhhdFxuICAgIC8vIHdvdWxkIG90aGVyd2lzZSBoYXBwZW4gb24gZXZlcnkgb3JiaXQuXG4gICAgdGhpcy5zcGF0aWFsUHJvamVjdGlvbjNkID0gcHJvamVjdGVkO1xuXG4gICAgY29uc3QgZHJhd24gPSB0aGlzLnNwYXRpYWxEcmF3bjNkO1xuICAgIGNvbnN0IHsgc2NyZWVuLCBkZXB0aCB9ID0gcHJvamVjdGVkO1xuICAgIGNvbnN0IGNvdW50ID0gc2NyZWVuLmxlbmd0aCA+PiAxO1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50ICogMikuZmlsbChOYU4pO1xuICAgIGNvbnN0IGRlcHRocyA9IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50KS5maWxsKE5hTik7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gZHJhd24gPyBkcmF3bltrXSA6IGs7XG4gICAgICBpZiAoaSA+PSBvYnMuY291bnQpIGNvbnRpbnVlO1xuICAgICAgb3V0W2kgKiAyXSA9IHNjcmVlbltrICogMl07XG4gICAgICBvdXRbaSAqIDIgKyAxXSA9IHNjcmVlbltrICogMiArIDFdO1xuICAgICAgZGVwdGhzW2ldID0gZGVwdGhba107XG4gICAgfVxuICAgIC8vIEtlcHQgYmVzaWRlIHRoZSBzY3JlZW4gcG9zaXRpb25zIHNvIHRoZSBob3ZlciBwaWNrIGNhbiBwcmVmZXIgdGhlIEZST05ULW1vc3QgcG9pbnRcbiAgICAvLyB1bmRlciB0aGUgY3Vyc29yIHJhdGhlciB0aGFuIHRoZSBvbmUgbmVhcmVzdCBpdHMgY2VudHJlIOKAlCB3aGljaCBpbiBhIGRlbnNlIGNsb3VkIGlzXG4gICAgLy8gcmVndWxhcmx5IHNvbWV0aGluZyB0aGUgcmVuZGVyZXIgZHJldyBhbm90aGVyIHBvaW50IG92ZXIuXG4gICAgdGhpcy5zcGF0aWFsRGVwdGhzM2QgPSBkZXB0aHM7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIHRoZSBtYXJrZXJzIG9uIGFueSBkYXRhc2V0IG9yIHZpZXctc3RhdGUgY2hhbmdlLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVNwYXRpYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zcGF0aWFsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGlmICghcG9ydCkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGVjdGlvbiQgPSB0aGlzLnNlbGVjdGlvblN0b3JlPy5nZXRTZWxlY3Rpb24kKCkgPz8gb2YoZW1wdHlTZWxlY3Rpb24oKSk7XG4gICAgLy8gVGhlIGRpc3BsYXkgY29sb3JtYXAgaXMgYW4gaW5wdXQgaGVyZSwgbm90IGp1c3Qgc29tZXRoaW5nIHJlYWQgYXQgYnVpbGRcbiAgICAvLyB0aW1lOiBgY29udGludW91c0NvbG9ybWFwOiBudWxsYCBtZWFucyBcImZvbGxvdyB0aGUgaW1hZ2UncyBjb2xvcm1hcFwiLCBhbmQgYVxuICAgIC8vIHNldHRpbmcgdGhhdCBvbmx5IHRha2VzIGVmZmVjdCBhdCB0aGUgbmV4dCB1bnJlbGF0ZWQgcmVidWlsZCBpcyBub3Qgb25lLlxuICAgIHRoaXMuc3BhdGlhbFN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgcG9ydC5nZXREYXRhc2V0JCgpLCB0aGlzLnN0b3JlLmdldFNwYXRpYWxWaWV3JCgpLCBzZWxlY3Rpb24kLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLCB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2RhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbiwgY29sb3JtYXAsIHJldmVyc2VdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gISFyZXZlcnNlO1xuICAgICAgLy8gS2VwdCBzbyBhIHNsaWNlIGNoYW5nZSBjYW4gcmVkcmF3IHRoZSBtYXJrZXJzIGZvciB0aGUgbmV3IHBsYW5lLCB3aGljaFxuICAgICAgLy8gYXJyaXZlcyB0aHJvdWdoIHNldFpJbmRleCByYXRoZXIgdGhhbiB0aHJvdWdoIGFueSBvZiB0aGVzZSBzdHJlYW1zLlxuICAgICAgdGhpcy5zcGF0aWFsTGF0ZXN0ID0gW2RhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbl07XG4gICAgICAvLyBUaGUgbWFya2VycyBhcmUgYWJvdXQgdG8gbW92ZSBvciBjaGFuZ2UgbWVhbmluZywgc28gYm90aCBoYWx2ZXMgb2YgdGhlXG4gICAgICAvLyB0b29sdGlwIOKAlCB3aGVyZSB0aGUgcG9pbnRzIGFyZSwgYW5kIHdoYXQgdGhleSBhcmUg4oCUIGFyZSBzdGFsZS5cbiAgICAgIHRoaXMuc3BhdGlhbFNjZW5lUmV2Kys7XG4gICAgICB2b2lkIHRoaXMucmVzb2x2ZUhvdmVyU291cmNlKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgdm9pZCAoaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSlcbiAgICAgICAgPyB0aGlzLnJlYnVpbGRTcGF0aWFsUG9pbnRzM2QoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKVxuICAgICAgICA6IHRoaXMucmVidWlsZFNwYXRpYWxQb2ludHMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSBvYnNlcnZhdGlvbiBtYXJrZXIgbGF5ZXIgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSBjb2xvdXJzIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmU6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZVxuICAgIC8vIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGUgZXhpc3RpbmcgbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGZhY2VDb2xvcjogUmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRyeSB7XG4gICAgICBmYWNlQ29sb3IgPSBkYXRhc2V0XG4gICAgICAgID8gYXdhaXQgdGhpcy5zcGF0aWFsRmFjZUNvbG9ycyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pXG4gICAgICAgIDogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIGNvbG91cmluZyBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBhIGZsYXQgY29sb3VyJywgZXJyKTtcbiAgICAgIGZhY2VDb2xvciA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICB9XG4gICAgLy8gQSBuZXdlciByZWJ1aWxkIChvciBhIHRlYXJkb3duKSBzdGFydGVkIHdoaWxlIHRoZSB2ZWN0b3Igd2FzIGluIGZsaWdodC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBpZiAoIWRhdGFzZXQgfHwgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzKTtcbiAgICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgZGF0YXNldCB3aG9zZSBpbWFnZSBJUyBpdHMgdm9sdW1lIHNob3dzIE9ORSBQTEFORSBhdCBhIHRpbWUsIHNvIHRoZVxuICAgIC8vIG1hcmtlcnMgYXJlIHRoZSBvYnNlcnZhdGlvbnMgaW4gdGhlIGRpc3BsYXllZCBwbGFuZSwgZHJhd24gaW4gdGhhdCBwbGFuZSdzXG4gICAgLy8gcGl4ZWwgZ3JpZC4gV2l0aG91dCB0aGUgZmlsdGVyIHRoZSBzcGVjaW1lbidzIHdob2xlIGRlcHRoIHBpbGVzIG9udG8gb25lXG4gICAgLy8gc2VjdGlvbiBhbmQgcmVhZHMgYXMgYSBzbWVhcjsgd2l0aG91dCB0aGUgYWZmaW5lIHRoZSBjb29yZGluYXRlcyBhcmUgcmVhZFxuICAgIC8vIGFzIHBpeGVscyBhbmQgbGFuZCBvZmYgdGhlIHNsaWNlIGVudGlyZWx5LlxuICAgIGNvbnN0IHNsYWIgPSB0aGlzLnNwYXRpYWxTbGFiKGRhdGFzZXQpO1xuICAgIC8vIFRoZSBnZW5lIG1hcCBnb2VzIFVOREVSIHRoZSBjZWxscywgc28gaXQgaXMgc2V0dGxlZCBiZWZvcmUgdGhleSBhcmUgYWRkZWQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVHZW5lTWFwKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBzbGFiKTtcbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgcmVmID0gc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWY7XG4gICAgY29uc3QgYmFzZSA9IG1hcmtlckRpYW1ldGVycyhvYnMsIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTKTtcbiAgICBjb25zdCBzY2FsZSA9IHZpZXcucG9pbnRTY2FsZSA+IDAgPyB2aWV3LnBvaW50U2NhbGUgOiAxO1xuICAgIGNvbnN0IGZsb29yID0gc2xhYj8ubWluRGlhbWV0ZXIgPz8gMDtcbiAgICBjb25zdCBzaXplT2YgPSAoaTogbnVtYmVyKSA9PlxuICAgICAgTWF0aC5tYXgodHlwZW9mIGJhc2UgPT09ICdudW1iZXInID8gYmFzZSA6IGJhc2VbaV0sIGZsb29yKSAqIHNjYWxlO1xuICAgIGNvbnN0IHNpemU6IG51bWJlciB8IEZsb2F0MzJBcnJheSA9XG4gICAgICB0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgJiYgIXNsYWJcbiAgICAgICAgPyBNYXRoLm1heChiYXNlLCBmbG9vcikgKiBzY2FsZVxuICAgICAgICA6IEZsb2F0MzJBcnJheS5mcm9tKHNsYWI/LmluZGljZXMgPz8geyBsZW5ndGg6IG9icy5jb3VudCB9LCAoX3YsIGkpID0+XG4gICAgICAgICAgICBzaXplT2Yoc2xhYiA/IHNsYWIuaW5kaWNlc1tpXSA6IGkpKTtcblxuICAgIC8vIG5hcGFyaSdzIGltYWdlIHZpZXcgQ0xFQVJTIHRoZSB3aG9sZSBsYXllciBsaXN0IG9uIGV2ZXJ5IHJlbmRlciwgc28gdGhlXG4gICAgLy8gbWFya2VycyBnbyB3aXRoIGl0IHdoZW5ldmVyIHRoZSBpbWFnZSBpcyByZS1yZW5kZXJlZCDigJQgYSBzY3J1YiwgYSBjb250cmFzdFxuICAgIC8vIGNoYW5nZS4gVGhlIGNhY2hlZCBoYW5kbGUgaXMgdGhlbiBkZXRhY2hlZCwgYW5kIG11dGF0aW5nIGl0IGRyYXdzIG5vdGhpbmc6XG4gICAgLy8gdHJlYXQgYSBsYXllciB0aGF0IGlzIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgYXMgYWJzZW50IHNvIGl0IGdldHMgcmUtYWRkZWQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cyAmJiAhdmlld2VyLmxheWVycy5pdGVtcy5pbmNsdWRlcyh0aGlzLnNwYXRpYWxQb2ludHMpKSB7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEEgc2l6ZS9jb2xvdXIvb3BhY2l0eS9zZWxlY3Rpb24gY2hhbmdlIGlzIERJU1BMQVktb25seTogbXV0YXRlIHRoZSBsYXllclxuICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwaW5nIGFuZCByZS1hZGRpbmcgaXQuIEJvdGggc2V0dGVycyBidW1wIHRoZSBsYXllcidzXG4gICAgLy8gZGF0YVZlcnNpb24sIHdoaWNoIGlzIHdoYXQgbWFrZXMgbmFwYXJpLWpzIHJlYnVpbGQgdGhlIGluc3RhbmNlIGJ1ZmZlciBhbmRcbiAgICAvLyByZWRyYXcg4oCUIGFuZCBpdCBhdm9pZHMgcmVidWlsZGluZyA4NGsgcG9zaXRpb25zIHRvIGNoYW5nZSBvbmUgbnVtYmVyLlxuICAgIC8vIFRoZSBzbGljZSBpcyBwYXJ0IG9mIHRoZSBrZXk6IGEgc2NydWIgY2hhbmdlcyBXSElDSCBvYnNlcnZhdGlvbnMgYXJlIGRyYXduLFxuICAgIC8vIHdoaWNoIGlzIGdlb21ldHJ5LCBub3QgZGlzcGxheS5cbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfToke29icy5jb3VudH06JHtzbGFiPy5zbGljZSA/PyAnJ31gO1xuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMgJiYga2V5ID09PSB0aGlzLnNwYXRpYWxMYXllcktleSkge1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzLnNpemUgPSBzaXplO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzLmZhY2VDb2xvciA9IHRoaXMuZ2F0aGVyQ29sb3JzKGZhY2VDb2xvciwgc2xhYj8uaW5kaWNlcykgYXMgbmV2ZXI7XG4gICAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFBvaW50cyk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRyYXduID0gc2xhYj8uaW5kaWNlcztcbiAgICBjb25zdCBjb3VudCA9IGRyYXduID8gZHJhd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBkcmF3biA/IGRyYXduW2ldIDogaTtcbiAgICAgIHBvc2l0aW9uc1tpICogMl0gPSBvYnMueFtvXTtcbiAgICAgIHBvc2l0aW9uc1tpICogMiArIDFdID0gb2JzLnlbb107XG4gICAgfVxuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0ga2V5O1xuICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IHZpZXdlci5hZGRQb2ludHMocG9zaXRpb25zLCB7XG4gICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgIHNpemUsXG4gICAgICBmYWNlQ29sb3I6IHRoaXMuZ2F0aGVyQ29sb3JzKGZhY2VDb2xvciwgZHJhd24pLFxuICAgICAgLy8gTm8gYm9yZGVyOiBhdCBWaXNpdW0gc3BvdCBkZW5zaXR5IGFuIG91dGxpbmUgcGVyIG1hcmtlciByZWFkcyBhcyBub2lzZSxcbiAgICAgIC8vIGFuZCBpdCBjb3N0cyBhIHNlY29uZCBjb2xvdXIgYXJyYXkuXG4gICAgICBib3JkZXJXaWR0aDogMCxcbiAgICAgIC8vIFRoZSBkYXRhc2V0J3MgZGF0YS0+d29ybGQgYWZmaW5lLiBTcGF0aWFsRGF0YSByZWNvcmRzIG9uZSBwZXIgY29vcmRpbmF0ZVxuICAgICAgLy8gc3lzdGVtIChWaXNpdW0gc3BvdCBjb29yZHMgYXJlIGluIHRoZSBGVUxMLXJlc29sdXRpb24gZnJhbWUgd2hpbGUgdGhlXG4gICAgICAvLyBzZXJ2ZWQgaW1hZ2UgbWF5IGJlIHRoZSBoaXJlcyBkb3duc2NhbGUpLCBzbyB3aXRob3V0IHRoaXMgdGhlIG1hcmtlcnNcbiAgICAgIC8vIGxhbmQgaW4gdGhlIHJpZ2h0IHNoYXBlIGF0IHRoZSB3cm9uZyBzY2FsZS4gRGVmYXVsdHMgdG8gaWRlbnRpdHkgd2hlblxuICAgICAgLy8gdGhlIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IGluIHRoZSBpbWFnZSdzIHBpeGVsIHNwYWNlLlxuICAgICAgc2NhbGU6IHJlZj8uc2NhbGUgPz8gWzEsIDFdLFxuICAgICAgdHJhbnNsYXRlOiByZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF0sXG4gICAgfSk7XG4gICAgdGhpcy5mcmFtZVNwYXRpYWxQb2ludHNPbmNlKHZpZXdlciwgZGF0YXNldC5pZCwgcG9zaXRpb25zLCAhIXJlZik7XG4gICAgdGhpcy5oaWRlRm9yZWlnbkltYWdlKHZpZXdlciwgISFyZWYgfHwgISFkYXRhc2V0LnZvbHVtZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMucmVnaW9uT3ZlcmxheTtcbiAgICBpZiAoIW92ZXJsYXk/LnNldFdvcmxkUXVhbnR1bSkgcmV0dXJuO1xuICAgIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8IGRhdGFzZXQudm9sdW1lKSB7XG4gICAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bShQSVhFTF9XT1JMRF9RVUFOVFVNKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTsgbGV0IG1heFggPSAtSW5maW5pdHk7IGxldCBtaW5ZID0gSW5maW5pdHk7IGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCB4ID0gcG9zaXRpb25zW2ldO1xuICAgICAgY29uc3QgeSA9IHBvc2l0aW9uc1tpICsgMV07XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSBjb250aW51ZTtcbiAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgfVxuICAgIG92ZXJsYXkuc2V0V29ybGRRdWFudHVtKHdvcmxkUXVhbnR1bUZvckV4dGVudChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmFtZSB0aGUgMkQgY2FtZXJhIG9uIHRoZSBvYnNlcnZhdGlvbnMsIGZvciBhIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2UuXG4gICAqXG4gICAqIFRoZSAyRCBjYW1lcmEgaXMgbm9ybWFsbHkgZml0dGVkIHRvIHRoZSBJTUFHRSwgYmVjYXVzZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBpbiB0aGF0XG4gICAqIGltYWdlJ3MgcGl4ZWwgc3BhY2UgYW5kIGZyYW1pbmcgdGhlIGltYWdlIGZyYW1lcyB0aGVtIHRvby4gQSBkYXRhc2V0IHdpdGggbm9cbiAgICogcmVmZXJlbmNlIGltYWdlIGhhcyBjb29yZGluYXRlcyBpbiBpdHMgb3duIHVuaXRzIGluc3RlYWQg4oCUIHNlcUZJU0gncyBzcGFuIGFib3V0XG4gICAqIDV4NyDigJQgc28gdGhlIGltYWdlIGZyYW1pbmcgbGVmdCBvdmVyIGZyb20gd2hhdGV2ZXIgd2FzIG9uIHNjcmVlbiBiZWZvcmUgcHV0cyB0aGVcbiAgICogd2hvbGUgY2xvdWQgb2Zmc2NyZWVuOiBtZWFzdXJlZCBhdCA5LjcgeCAxMy40IFBJWEVMUywgY2VudHJlZCAyNTZweCBmcm9tIHdoZXJlIHRoZVxuICAgKiBjYW1lcmEgd2FzIGxvb2tpbmcuIFRoZSBwb2ludHMgYXJlIGFsbCB0aGVyZSBhbmQgZHJhd247IHRoZXkgYXJlIGEgc3BlY2suIFdoaWNoXG4gICAqIGxvb2tzIGV4YWN0bHkgbGlrZSB0aGUgZGF0YXNldCBoYXZpbmcgZmFpbGVkIHRvIGxvYWQuXG4gICAqXG4gICAqIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZyxcbiAgICogc2xpY2luZyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmVcbiAgICogdGhlIGNhbWVyYSB1bmRlciB0aGUgdXNlciDigJQgdGhlIGNhbWVyYSB0b29scyBhbmQgdGhlIGNhbnZhcyBkcmFnIGFyZSBtZWFudCB0byBiZVxuICAgKiB0aGUgb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICovXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBpbWFnZSBsYXllciBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlIG9mIGl0cyBvd24uXG4gICAqXG4gICAqIFRoZSBob3N0J3Mgdmlld2VyIGtlZXBzIHdoYXRldmVyIGltYWdlIHdhcyBsYXN0IGxvYWRlZCwgYW5kIGZvciBhIGRhdGFzZXQgdGhhdFxuICAgKiByZWdpc3RlcnMgb250byBub25lIHRoYXQgcGljdHVyZSBiZWxvbmdzIHRvIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5IOKAlCB0aGUgZXhhbXBsZSdzXG4gICAqIGRlZmF1bHQgc2xpZGUsIHNheS4gSXQgaXMgbm90IG1lcmVseSBpcnJlbGV2YW50OiB0aGUgdHdvIGxpdmUgaW4gZGlmZmVyZW50IGNvb3JkaW5hdGVcbiAgICogc3BhY2VzIChpbWFnZSBwaXhlbHMgYWdhaW5zdCB0aGUgZW1iZWRkaW5nJ3Mgb3duIHVuaXRzKSwgc28gdGhlIGxlZnRvdmVyIGlzIG1hZ25pZmllZFxuICAgKiByb3VnaGx5IGEgaHVuZHJlZGZvbGQuIEF0IHRoZSBmaXR0ZWQgem9vbSB0aGUgY2FtZXJhIHNpdHMgaW5zaWRlIGl0cyBjb3JuZXIsIHdoZXJlIGl0XG4gICAqIHJlYWRzIGFzIGJsYW5rIGJhY2tncm91bmQsIGFuZCBpdCBhcHBlYXJzIG9ubHkgb25jZSB5b3Ugem9vbSBvdXQgZmFyIGVub3VnaCB0byBmaW5kXG4gICAqIGl0IOKAlCB3aGljaCBpcyBleGFjdGx5IGhvdyBpdCBnZXRzIG5vdGljZWQuXG4gICAqXG4gICAqIEhpZGRlbiByYXRoZXIgdGhhbiByZW1vdmVkLCBhbmQgaGlkZGVuIEhFUkUgcmF0aGVyIHRoYW4gYnkgY2xlYXJpbmcgdGhlIGhvc3QncyBpbWFnZVxuICAgKiBzdGF0ZTogdGhhdCBzdGF0ZSBkcml2ZXMgdGhlIHdob2xlIHJlbmRlciBwaXBlbGluZSwgaW5jbHVkaW5nIGEgUGxvdGx5IGJhY2tlbmQgd2hvc2VcbiAgICogZmllbGRzIGFyZSBkZWNsYXJlZCB3aXRoIGRlZmluaXRlLWFzc2lnbm1lbnQgYXNzZXJ0aW9ucywgc28gZW1wdHlpbmcgaXQgdGhyb3dzIGZyb21cbiAgICogd2hpY2hldmVyIGZpZWxkIHRoZSBuZXh0IHBhdGggaGFwcGVucyB0byByZWFkLiBUaGlzIHRvdWNoZXMgb25lIGxheWVyJ3MgdmlzaWJpbGl0eVxuICAgKiBhbmQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlRm9yZWlnbkltYWdlKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB2aWV3ZXIubGF5ZXJzLml0ZW1zKSB7XG4gICAgICBpZiAobGF5ZXIua2luZCAhPT0gJ2ltYWdlJykgY29udGludWU7XG4gICAgICAvLyBSZS1zaG93biB3aGVuIGEgZGF0YXNldCB0aGF0IG93bnMgYW4gaW1hZ2UgY29tZXMgYmFjaywgc28gc3dpdGNoaW5nIGJldHdlZW5cbiAgICAgIC8vIGRhdGFzZXRzIGRvZXMgbm90IGxlYXZlIHRoZSB0aXNzdWUgcGVybWFuZW50bHkgaGlkZGVuLlxuICAgICAgbGF5ZXIudmlzaWJsZSA9IGRhdGFzZXRIYXNQaXhlbHM7XG4gICAgfVxuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGZyYW1lU3BhdGlhbFBvaW50c09uY2UoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXRJZDogc3RyaW5nLCBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSwgcmVnaXN0ZXJlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgLy8gR2F0ZWQgb24gd2hldGhlciBUSElTIGRhdGFzZXQgcmVnaXN0ZXJzIG9udG8gYW4gaW1hZ2UsIG5vdCBvbiBgaW1hZ2VXYC9gaW1hZ2VIYDpcbiAgICAvLyB0aG9zZSBrZWVwIHRoZSBsYXN0IHBsb3R0ZWQgaW1hZ2UncyBkaW1lbnNpb25zIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgc28gYVxuICAgIC8vIHN0YWxlIDUxMngzODMgcmVhZCBhcyBcInRoZXJlIGlzIGFuIGltYWdlXCIgYW5kIHNraXBwZWQgdGhlIGZyYW1pbmcgZW50aXJlbHkuXG4gICAgaWYgKHJlZ2lzdGVyZWQpIHJldHVybjtcbiAgICAvLyBPbmNlIHBlciBkYXRhc2V0LCBhcyBuYXBhcmktanMncyBgZml0M2Q6ICdvbmNlJ2AgZG9lcyBmb3IgdGhlIGNsb3VkOiByZS1jb2xvdXJpbmcsIHNsaWNpbmdcbiAgICAvLyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmUgdGhlXG4gICAgLy8gY2FtZXJhIHVuZGVyIHRoZSB1c2VyIOKAlCB0aGUgY2FtZXJhIHRvb2xzIGFuZCB0aGUgY2FudmFzIGRyYWcgYXJlIG1lYW50IHRvIGJlIHRoZVxuICAgIC8vIG9ubHkgdGhpbmdzIHRoYXQgZG8uXG4gICAgaWYgKHRoaXMuc3BhdGlhbDJkRnJhbWVkPy52aWV3ZXIgPT09IHZpZXdlclxuICAgICAgJiYgdGhpcy5zcGF0aWFsMmRGcmFtZWQuZGF0YXNldElkID09PSBkYXRhc2V0SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGZpdCA9IGZyYW1lUG9zaXRpb25zKFxuICAgICAgcG9zaXRpb25zLCB0aGlzLmNhbnZhcz8uY2xpZW50V2lkdGggPz8gMCwgdGhpcy5jYW52YXM/LmNsaWVudEhlaWdodCA/PyAwLFxuICAgICk7XG4gICAgLy8gTnVsbCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGZyYW1lIG9uOyBsZWF2ZSB0aGUgY2FtZXJhIHdoZXJlIGl0IGlzIHJhdGhlclxuICAgIC8vIHRoYW4gbW92aW5nIHRoZSB2aWV3IGZvciBhIGRhdGFzZXQgd2UgY2Fubm90IGZpdC5cbiAgICBpZiAoIWZpdCkgcmV0dXJuO1xuICAgIHZpZXdlci5jYW1lcmEuc2V0KGZpdC5jZW50ZXIsIGZpdC56b29tID8/IHZpZXdlci5jYW1lcmEuem9vbSk7XG4gICAgdGhpcy5zcGF0aWFsMmRGcmFtZWQgPSB7IHZpZXdlciwgZGF0YXNldElkIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlICoqZ2VuZSBtYXAqKjogdGhlIGFjdGl2ZSBnZW5lJ3MgZXhwcmVzc2lvbiBhcyBhIGNvbnRpbnVvdXMgZmllbGQgZHJhd24gdW5kZXJcbiAgICogdGhlIGNlbGxzLlxuICAgKlxuICAgKiBBIHNjYXR0ZXIgY29sb3VyZWQgYnkgYSBnZW5lIHNheXMgd2hpY2ggY2VsbHMgZXhwcmVzcyBpdDsgaXQgY2Fubm90IHNheSB3aGVyZSxcbiAgICogYmVjYXVzZSB0aGUgZXllIHdpbGwgbm90IGludGVncmF0ZSB0aG91c2FuZHMgb2YgZG90cyBpbnRvIGEgdGVycml0b3J5LiBUaGUgZmllbGRcbiAgICogaXMgYSBrZXJuZWwtd2VpZ2h0ZWQgTUVBTiBwZXIgY2VsbCAoc2VlIGBzcGF0aWFsLWV4cHJlc3Npb24udHNgKSwgc28gYSBkZW5zZVxuICAgKiByZWdpb24gZG9lcyBub3QgZ2xvdyBtZXJlbHkgZm9yIGJlaW5nIGRlbnNlLCBhbmQgaXQgaXMgdHJhbnNwYXJlbnQgd2hlcmV2ZXIgbm9cbiAgICogY2VsbCB3YXMgbWVhc3VyZWQg4oCUIGFuIHVuc2FtcGxlZCBnYXAgbXVzdCBub3QgcmVhZCBhcyBcIm5vdCBleHByZXNzZWRcIi5cbiAgICpcbiAgICogSXQgc2hhcmVzIHRoZSBwb2ludHMnIExVVCwgcGVyY2VudGlsZSB3aW5kb3cgYW5kIGxvZyBmbGFnLCBzbyB0aGUgbGF5ZXIgdW5kZXJcbiAgICogdGhlIGNlbGxzIGFuZCB0aGUgY2VsbHMgdGhlbXNlbHZlcyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBhIGNvbG91ciBtZWFucy5cbiAgICpcbiAgICogRXN0aW1hdGVkIG9uIHRoZSBESVNQTEFZRUQgaW1hZ2UncyBwaXhlbCBncmlkLCBjb2Fyc2VuZWQgc28gdGhlIGxvbmcgc2lkZSBpcyBhdFxuICAgKiBtb3N0IHtAbGluayBHRU5FX01BUF9NQVhfU0lERX06IGEgc21vb3RoIGZpZWxkIGdhaW5zIG5vdGhpbmcgZnJvbSBhIHNsaWRlJ3MgZnVsbFxuICAgKiByZXNvbHV0aW9uLiBGb3IgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhhdCBncmlkIGlzIHRoZSBjdXJyZW50IHNsaWNlLCBhbmQgb25seVxuICAgKiB0aGF0IHBsYW5lJ3Mgb2JzZXJ2YXRpb25zIGFyZSBpbmNsdWRlZCDigJQgdGhlIHNhbWUgcnVsZSB0aGUgbWFya2VycyBmb2xsb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUdlbmVNYXAoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2xhYjogeyByZWY6IFNwYXRpYWxJbWFnZVJlZjsgaW5kaWNlczogVWludDMyQXJyYXk7IHNsaWNlOiBudW1iZXIgfSB8IG51bGwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuXG4gICAgLy8gVHdvIGNsb2NrczogdGhlIEZJRUxEIGRlcGVuZHMgb24gdGhlIGdlbmUsIHRoZSBwbGFuZSBhbmQgdGhlIGJhbmR3aWR0aCwgd2hpbGVcbiAgICAvLyB0aGUgY29sb3VycyBkZXBlbmQgb24gdGhlIHdpbmRvdywgdGhlIGxvZyBmbGFnIGFuZCB0aGUgb3BhY2l0eS4gUmVjb2xvdXJpbmcgYVxuICAgIC8vIGNhY2hlZCBmaWVsZCBpcyBhIGZyYWN0aW9uIG9mIGVzdGltYXRpbmcgb25lLlxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbZGF0YXNldC5pZCwgZ2VuZSwgc2xhYj8uc2xpY2UgPz8gJycsIHNtb290aGluZywgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKV0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZmllbGRLZXlcbiAgICAgID8gW1xuICAgICAgICBmaWVsZEtleSwgY2xpcC5qb2luKCcsJyksIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLCB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICB0aGlzLmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5nZW5lTWFwS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICB9XG4gICAgLy8gQU5ZIGNoYW5nZSBoZXJlIGNoYW5nZXMgdGhlIG9yZGVyIHRoZSBjZWxscyBoYXZlIHRvIHNpdCBhYm92ZSDigJQgaW5jbHVkaW5nIHRoZVxuICAgIC8vIGZpcnN0IG9uZSwgd2hlcmUgdGhlcmUgaXMgbm8gcHJldmlvdXMgbGF5ZXIgdG8gcmVtb3ZlIOKAlCBhbmQgdGhlIGxheWVyIGxpc3QgaXNcbiAgICAvLyBhcHBlbmQtb25seS4gU28gZHJvcCB0aGUgbWFya2VycyB1bmNvbmRpdGlvbmFsbHkgYW5kIGxldCB0aGUgcmVidWlsZCBiZWxvdyBwdXRcbiAgICAvLyB0aGVtIGJhY2sgb24gdG9wOyBvdGhlcndpc2UgdGhlIGZpZWxkIGlzIGFwcGVuZGVkIG92ZXIgdGhlIG1lYXN1cmVtZW50LlxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFBvaW50cyk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIHRoaXMuZ2VuZU1hcEZpZWxkID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcEZpZWxkS2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmFzdGVyIGNvdmVycyB0aGUgZGlzcGxheWVkIGltYWdlOyB3aXRob3V0IG9uZSB0aGVyZSBpcyBub3RoaW5nIHRvXG4gICAgLy8gb3ZlcmxheSBhbmQgdGhlIGNsb3VkIGlzIHRoZSAzRCBtb2RlJ3MgYnVzaW5lc3MsIG5vdCB0aGlzIG9uZSdzLlxuICAgIGNvbnN0IGltYWdlVyA9IHNsYWIgPyBkYXRhc2V0LnZvbHVtZSEud2lkdGggOiB0aGlzLmltYWdlVztcbiAgICBjb25zdCBpbWFnZUggPSBzbGFiID8gZGF0YXNldC52b2x1bWUhLmhlaWdodCA6IHRoaXMuaW1hZ2VIO1xuICAgIGlmICghaW1hZ2VXIHx8ICFpbWFnZUgpIHJldHVybjtcbiAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoXG4gICAgICAxLFxuICAgICAgTWF0aC5jZWlsKE1hdGgubWF4KGltYWdlVywgaW1hZ2VIKSAvIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX01BWF9TSURFKSxcbiAgICApO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSB0aGlzLmdlbmVNYXBGaWVsZEtleSkge1xuICAgICAgbGV0IHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGdlbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gZ2VuZSBtYXA6IFwiJHtnZW5lfVwiIHVuYXZhaWxhYmxlYCwgZXJyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXMoc2VsZWN0aW9uLm1hc2spIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGQgPSBleHByZXNzaW9uRmllbGQoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHtcbiAgICAgICAgcmVmOiBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZixcbiAgICAgICAgd2lkdGg6IE1hdGguY2VpbChpbWFnZVcgLyBzdGVwKSxcbiAgICAgICAgaGVpZ2h0OiBNYXRoLmNlaWwoaW1hZ2VIIC8gc3RlcCksXG4gICAgICAgIHN0ZXAsXG4gICAgICAgIHNpZ21hOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5HRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICAvLyBBIHBsYW5lIHdpbnMgb3ZlciBhIHNlbGVjdGlvbjogdGhlIDJEIHZpZXcgaXMgc2hvd2luZyBvbmUgc2VjdGlvbiwgc28gYVxuICAgICAgICAvLyBmaWVsZCBzcGFubmluZyB0aGUgc3BlY2ltZW4ncyBkZXB0aCB3b3VsZCBub3QgYmUgdGhlIHRoaW5nIG9uIHNjcmVlbi5cbiAgICAgICAgaW5kaWNlczogc2xhYj8uaW5kaWNlcyA/PyBpblNlbGVjdGlvbixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGRLZXkgPSBmaWVsZEtleTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmdlbmVNYXBGaWVsZDtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gY29udHJhc3RXaW5kb3coZmllbGQubWVhbiwgY2xpcFswXSwgY2xpcFsxXSk7XG4gICAgY29uc3QgcmdiYSA9IGNvbG9yRXhwcmVzc2lvbkZpZWxkKGZpZWxkLCBsdXQsIFtsbywgaGldLCB7XG4gICAgICBsb2c6IHZpZXcubG9nU2NhbGUsXG4gICAgICAvLyBUaGUgTUFQJ3Mgb3duIG9wYWNpdHk6IHJlYWRpbmcgYSBmaWVsZCB1bmRlciB0aGUgY2VsbHMgbWVhbnMgdHVybmluZyB0aGVcbiAgICAgIC8vIGNlbGxzIGRvd24sIHdoaWNoIG11c3Qgbm90IHRha2UgdGhlIGZpZWxkIHdpdGggdGhlbS5cbiAgICAgIG9wYWNpdHk6IHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgfSk7XG4gICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSB2aWV3ZXIuYWRkSW1hZ2UoXG4gICAgICB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBmaWVsZC53aWR0aCwgaGVpZ2h0OiBmaWVsZC5oZWlnaHQsIGNoYW5uZWxzOiA0LCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogcmdiYSB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfWAsXG4gICAgICAgIHNjYWxlOiBbc3RlcCwgc3RlcF0sXG4gICAgICAgIHRyYW5zbGF0ZTogWzAsIDBdLFxuICAgICAgICBibGVuZGluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFuZSBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCBpcyBjdXJyZW50bHkgc2hvd2luZzogaXRzIHBpeGVsIGFmZmluZSwgdGhlXG4gICAqIG9ic2VydmF0aW9ucyB0aGF0IGZhbGwgaW4gaXQsIGFuZCB0aGUgbWFya2VyIGZsb29yIHRoYXQgZ3JpZCBuZWVkcy5cbiAgICpcbiAgICogTnVsbCBmb3IgYSBkYXRhc2V0IHdpdGggYSByZWFsIGBpbWFnZVJlZmAgKGl0cyBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSB0aGVcbiAgICogaW1hZ2UncyBwaXhlbHMgYW5kIGV2ZXJ5IG9ic2VydmF0aW9uIGJlbG9uZ3MgdG8gdGhlIG9uZSBzZWN0aW9uKSBhbmQgZm9yIG9uZVxuICAgKiB3aXRoIG5vIHZvbHVtZSBhdCBhbGwg4oCUIGJvdGggb2Ygd2hpY2ggZHJhdyBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICovXG4gIHByaXZhdGUgc3BhdGlhbFNsYWIoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiB7XG4gICAgcmVmOiBTcGF0aWFsSW1hZ2VSZWY7IGluZGljZXM6IFVpbnQzMkFycmF5OyBzbGljZTogbnVtYmVyOyBtaW5EaWFtZXRlcjogbnVtYmVyO1xuICB9IHwgbnVsbCB7XG4gICAgY29uc3Qgdm9sdW1lID0gZGF0YXNldC52b2x1bWU7XG4gICAgaWYgKGRhdGFzZXQuaW1hZ2VSZWYgfHwgIXZvbHVtZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLmxvYWRlZD8ueiA/PyAwO1xuICAgIHJldHVybiB7XG4gICAgICByZWY6IHZvbHVtZUltYWdlUmVmKHZvbHVtZSwgZGF0YXNldC5taWNyb25zUGVyVW5pdCksXG4gICAgICBpbmRpY2VzOiBvYnNlcnZhdGlvbnNJblNsaWNlKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB2b2x1bWUsIHNsaWNlKSxcbiAgICAgIHNsaWNlLFxuICAgICAgbWluRGlhbWV0ZXI6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0xJQ0VfTUlOX0RJQU1FVEVSX1BYICogdm9sdW1lLnZveGVsU2l6ZVswXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFBlci1wb2ludCBjb2xvdXJzIGZvciB0aGUgZHJhd24gc3Vic2V0LiBBIGJyb2FkY2FzdCB0dXBsZSBzdGF5cyBicm9hZGNhc3Qg4oCUXG4gICAqICBpdCBpcyBvbmUgY29sb3VyIGZvciBldmVyeSBwb2ludCBlaXRoZXIgd2F5LiAqL1xuICBwcml2YXRlIGdhdGhlckNvbG9yczxUPihjb2xvcnM6IFRbXSB8IFQsIGluZGljZXM/OiBVaW50MzJBcnJheSk6IFRbXSB8IFQge1xuICAgIGlmICghaW5kaWNlcyB8fCAhQXJyYXkuaXNBcnJheShjb2xvcnMpKSByZXR1cm4gY29sb3JzO1xuICAgIGNvbnN0IG91dDogVFtdID0gbmV3IEFycmF5KGluZGljZXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIG91dFtpXSA9IGNvbG9yc1tpbmRpY2VzW2ldXTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBvdmVyIGEgZnJlc2hseSByZW5kZXJlZCBpbWFnZS5cbiAgICpcbiAgICogVHdvIHJlYXNvbnMsIGJvdGggaW52aXNpYmxlIGZyb20gdGhlIHNwYXRpYWwgc3RvcmUg4oCUIHdoaWNoIGlzIHdoeSBhIHNjcnViIG9yIGFcbiAgICogcmUtcmVuZGVyIG5ldmVyIHJlYWNoZWQgdGhlIG1hcmtlcnMgb24gaXRzIG93bjpcbiAgICogIC0gdGhlIGltYWdlIHJlbmRlciBDTEVBUlMgdGhlIGxheWVyIGxpc3QsIHRha2luZyB0aGUgbWFya2VycyB3aXRoIGl0O1xuICAgKiAgLSBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBkaXNwbGF5ZWQgcGxhbmUgZGVjaWRlcyB3aGljaFxuICAgKiAgICBvYnNlcnZhdGlvbnMgYmVsb25nIG9uIHNjcmVlbiBhdCBhbGwsIHNvIHRoZSBjZWxscyBoYXZlIHRvIG1vdmUgd2l0aCB0aGVcbiAgICogICAgc2VjdGlvbiByYXRoZXIgdGhhbiBoYW5nIG92ZXIgYSBkaWZmZXJlbnQgb25lLlxuICAgKlxuICAgKiBVc2VzIHRoZSBsYXRlc3QgdmFsdWVzIHRoZSBtYXJrZXIgc3Vic2NyaXB0aW9uIHNhdzsgYSBuby1vcCB1bnRpbCBpdCBoYXMgc2VlblxuICAgKiBhbnksIGluIHRoZSAzRCBjbG91ZCAobm8gaW1hZ2UsIG5vIHBsYW5lKSwgYW5kIHdpdGggbm8gZGF0YXNldCB0byBkcmF3LlxuICAgKi9cbiAgcHJpdmF0ZSByZWRyYXdTcGF0aWFsTWFya2VycygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLnNwYXRpYWxMYXRlc3Q7XG4gICAgaWYgKCFsYXRlc3Q/LlswXSB8fCBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKSkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5yZWJ1aWxkU3BhdGlhbFBvaW50cyguLi5sYXRlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBTUEFUSUFMX09NSUNTXzNEIHZpZXc6IG9ic2VydmF0aW9ucyBhcyBhIDNEIHBvaW50IGNsb3VkIHVuZGVyIHRoZSBvcmJpdCBjYW1lcmEuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBtdWNoIHRoaW5uZXIgdGhhbiB0aGUgMkQgbW91bnQuIFRoZXJlIGlzIG5vIHRpc3N1ZSBpbWFnZSB0byByZW5kZXIgKGEgcmVnaXN0ZXJlZFxuICAgKiB2b2x1bWUgbGlrZSB0aGUgQWxsZW4gQ0NGIGhhcyBubyBzaW5nbGUgcmVmZXJlbmNlIHBsYW5lKSwgc28gbm8gc2NhbGUgYmFyLCBubyByZWFkYmFjaywgYW5kIG5vXG4gICAqIDJEIGludGVyYWN0aW9uIHN0YWNrIOKAlCB0aGUgcmVnaW9uIHRvb2xzIGRyYXcgaW4gc2NyZWVuIHNwYWNlIGFuZCBoYXZlIG5vIG1lYW5pbmcgYWdhaW5zdCBhblxuICAgKiBvcmJpdGluZyBjYW1lcmEsIHdoaWNoIGlzIHdoeSBgU2VsZWN0IGZyb20gUk9Jc2AgaXMgaGlkZGVuIGluIHRoaXMgbW9kZS4gYGFkZFBvaW50czNEYCBwdXRzXG4gICAqIHRoZSB2aWV3ZXIgaW4gM0QgYW5kIGZyYW1lcyB0aGUgY2FtZXJhIG9uIHRoZSBjbG91ZCBpdHNlbGYuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3BhdGlhbE9taWNzM2Qodmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbnN0YWxsM2RJbnRlcmFjdGlvbih2aWV3ZXIsIGhvc3QpO1xuICAgIHRoaXMuaW5zdGFsbFNwYXRpYWxIb3Zlcihob3N0KTtcbiAgICB0aGlzLnN1YnNjcmliZVNwYXRpYWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZSBiYXIgZm9yIHRoZSAzRCBjbG91ZCwgbWVhc3VyZWQgYXQgdGhlIE9SQklUIFBJVk9ULlxuICAgKlxuICAgKiBBIHBlcnNwZWN0aXZlIGNhbWVyYSBoYXMgbm8gc2luZ2xlIHNjYWxlIOKAlCB0aGluZ3MgZmFydGhlciBhd2F5IGFyZSBzbWFsbGVyIOKAlCBzbyBhIGJhciBjYW5cbiAgICogb25seSBiZSB0cnVlIGF0IG9uZSBkZXB0aC4gVGhlIHBpdm90IGlzIHRoZSBob25lc3QgY2hvaWNlOiBpdCBpcyB3aGF0IHRoZSBjYW1lcmEgaXMgZnJhbWluZyxcbiAgICogd2hhdCBhIHpvb20gbW92ZXMgdG93YXJkcywgYW5kIHdoZXJlIHRoZSBleWUgaXMgYW55d2F5LiBuYXBhcmkncyBvd24gM0Qgc2NhbGUgYmFyIHdvcmtzIHRoZVxuICAgKiBzYW1lIHdheS5cbiAgICpcbiAgICogYE5hcGFyaVNjYWxlQmFyYCBuZWVkcyBDU1MgcHggcGVyIHdvcmxkIHVuaXQsIHdoaWNoIGFuIG9yYml0IGNhbWVyYSBkb2VzIG5vdCBleHBvc2UsIGJ1dCBhdFxuICAgKiB0aGUgcGl2b3QgaXQgaXMgZXhhY3RseSBgdmlld3BvcnRIZWlnaHQgLyAoMiAqIGRpc3RhbmNlICogdGFuKGZvdiAvIDIpKWAg4oCUIHRoZSBzYW1lXG4gICAqIHJlbGF0aW9uc2hpcCBgQ2FtZXJhM0QucGFuYCB1c2VzIHRvIHRyYWNrIHRoZSBjdXJzb3IuIFRoZSBiYXIgdGhlbiBjb252ZXJ0cyB0aHJvdWdoXG4gICAqIGBtaWNyb25zUGVyVW5pdGAsIGFuZCBkcmF3cyBub3RoaW5nIGF0IGFsbCB3aGVuIHRoZSBkYXRhc2V0IGRvZXMgbm90IGRlY2xhcmUgb25lLCBiZWNhdXNlIGFcbiAgICogYmFyIGxhYmVsbGVkIGluIG1pY3JvbnMgb3ZlciB1bmtub3duIHVuaXRzIHdvdWxkIHJlYWQgYXMgYSBtZWFzdXJlbWVudC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNwYXRpYWwzZFNjYWxlQmFyKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgY29uc3QgbWljcm9uc1BlclVuaXQgPSBkYXRhc2V0Py5taWNyb25zUGVyVW5pdDtcbiAgICBpZiAoIXRoaXMuaG9zdCB8fCAhbWljcm9uc1BlclVuaXQgfHwgbWljcm9uc1BlclVuaXQgPD0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgY29uc3QgY2FtID0gdmlld2VyLmNhbWVyYTNkO1xuICAgIGNvbnN0IHNoaW06IFNjYWxlQmFyQ2FtZXJhID0ge1xuICAgICAgZ2V0IHpvb20oKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaCA9IGNhbnZhcz8uY2xpZW50SGVpZ2h0IHx8IGNhbnZhcz8uaGVpZ2h0IHx8IDA7XG4gICAgICAgIGNvbnN0IHdvcmxkUGVyUHggPSAoMiAqIGNhbS5kaXN0YW5jZSAqIE1hdGgudGFuKGNhbS5mb3YgLyAyKSkgLyAoaCB8fCAxKTtcbiAgICAgICAgcmV0dXJuIHdvcmxkUGVyUHggPiAwID8gMSAvIHdvcmxkUGVyUHggOiAwO1xuICAgICAgfSxcbiAgICAgIGNoYW5nZWQ6IGNhbS5jaGFuZ2VkLFxuICAgIH07XG4gICAgdGhpcy5zY2FsZUJhciA9IG5ldyBOYXBhcmlTY2FsZUJhcih0aGlzLmhvc3QsIHNoaW0sIG1pY3JvbnNQZXJVbml0KTtcbiAgfVxuXG4gIC8qKiBCYXNlIG1hcmtlciBkaWFtZXRlciBmb3IgdGhlIDNEIGNsb3VkLCBpbiBTQ1JFRU4gcGl4ZWxzICh0aGUgbGF5ZXIncyB1bml0KS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF8zRF9CQVNFX1NJWkUgPSAzO1xuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDNEIHBvaW50IGNsb3VkIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWJ1aWxkU3BhdGlhbFBvaW50czNkKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgc2NhbGFyIGVuY29kaW5nIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmUsIGZvciB0aGUgc2FtZSByZWFzb25cbiAgICAvLyB0aGUgMkQgcGF0aCBkb2VzOiBhIGdlbmUgZmV0Y2ggY2FuIGZhaWwgb3IgYmUgc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZVxuICAgIC8vIGxheWVyIGZpcnN0IHdvdWxkIGJsYW5rIHRoZSB2aWV3LlxuICAgIGxldCBlbmM6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGRhdGFzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVuYyA9IGF3YWl0IHRoaXMuc3BhdGlhbFNjYWxhcjNkKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgIGVuYyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQ/Lm9ic2VydmF0aW9ucztcbiAgICAvLyBObyB6IG1lYW5zIG5vdGhpbmcgdG8gZHJhdyBpbiAzRC4gVGhlIHBsb3QgdHlwZSBpcyBnYXRlZCBvbiBgcmVxdWlyZXNTcGF0aWFsM2RgXG4gICAgLy8gc28gdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUksIGJ1dCBhIGhvc3QgY2FuIHNldCB0aGUgdHlwZSBkaXJlY3RseS5cbiAgICBpZiAoIWRhdGFzZXQgfHwgIW9icyB8fCBvYnMuY291bnQgPT09IDAgfHwgIW9icy56KSB7XG4gICAgICB0aGlzLnJlbW92ZVNwYXRpYWwzZExheWVycyh2aWV3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFuYXRvbXkgZmlyc3Q6IG9uIGEgc2NlbmUncyBGSVJTVCBsYXllciBuYXBhcmkgZnJhbWVzIHRoZSBvcmJpdCBjYW1lcmEsIGFuZFxuICAgIC8vIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIHRoZSBmcmFtaW5nIHdlIHdhbnQg4oCUIHRoZSBicmFpbiwgbm90IHRoZSBvdXRlcm1vc3RcbiAgICAvLyBzdHJheSBzZWdtZW50YXRpb24uIEV2ZXJ5IGxhdGVyIGFkZCBrZWVwcyB0aGUgcG9zZSBpbnN0ZWFkIChuYXBhcmktanMgYGZpdDNkOiAnb25jZSdgKS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNwYXRpYWxWb2x1bWUodmlld2VyLCBkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMsIHdoaWNoIGNhbiBzZXQgdGhlIGNlbnRyaW5nIG9mZnNldCB3aGVuXG4gICAgLy8gdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHZvbHVtZSDigJQgc28gYmVmb3JlIGFueSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tIGl0LlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlRGVuc2l0eVZvbHVtZXModmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBnZW5lIG1hcCwgd2hpY2ggc2hhcmVzIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgbGF0dGljZSDigJQgc28gaXQgZ29lc1xuICAgIC8vIGFmdGVyIGFueXRoaW5nIHRoYXQgY2FuIHN0aWxsIG1vdmUgdGhlIGNlbnRyaW5nIG9mZnNldC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXBWb2x1bWUodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBTY2FsZSBkZXBlbmRzIG9uIHRoZSBkYXRhc2V0J3MgZGVjbGFyZWQgdW5pdCwgc28gaXQgd2FpdHMgZm9yIHRoZSBkYXRhc2V0XG4gICAgLy8gcmF0aGVyIHRoYW4gYmVpbmcgc2V0IHVwIGF0IG1vdW50IHRpbWUuXG4gICAgaWYgKGRhdGFzZXQuaWQgIT09IHRoaXMuc3BhdGlhbFNjYWxlQmFyS2V5KSB7XG4gICAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IGRhdGFzZXQuaWQ7XG4gICAgICB0aGlzLmluc3RhbGxTcGF0aWFsM2RTY2FsZUJhcih2aWV3ZXIsIGRhdGFzZXQpO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIGhpZGRlbiwgbm90IHJlbW92ZWQ6IGl0IGFsc28gZml4ZXMgdGhlIGNlbnRyaW5nXG4gICAgLy8gb2Zmc2V0IGV2ZXJ5IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20sIGFuZCByZS1mZXRjaGluZyBhIDEwMCBNQiB0ZW1wbGF0ZVxuICAgIC8vIHRvIHVuLWhpZGUgaXQgd291bGQgbWFrZSBhIGNoZWNrYm94IGZlZWwgbGlrZSBhIGxvYWQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFZvbHVtZSkge1xuICAgICAgdGhpcy5zcGF0aWFsVm9sdW1lLnZpc2libGUgPSB2aWV3LnNob3dWb2x1bWU7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUub3BhY2l0eSA9IHZpZXcudm9sdW1lT3BhY2l0eTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZSA9IHZpZXcucG9pbnRTY2FsZSA+IDAgPyB2aWV3LnBvaW50U2NhbGUgOiAxO1xuICAgIGNvbnN0IHNpemUgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMXzNEX0JBU0VfU0laRSAqIHNjYWxlO1xuICAgIGNvbnN0IHNjYWxhcnMgPSBlbmM/LnZhbHVlcyA/PyBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCk7XG4gICAgY29uc3QgY29sb3JtYXAgPSBlbmM/LmNvbG9ybWFwID8/IHRoaXMuc3BhdGlhbEZsYXRDb2xvcm1hcCgpO1xuICAgIGNvbnN0IGNvbnRyYXN0TGltaXRzOiBbbnVtYmVyLCBudW1iZXJdID0gZW5jPy5jb250cmFzdExpbWl0cyA/PyBbMCwgMV07XG5cbiAgICAvLyBPbmUgaW1hZ2VkIHNlY3Rpb24sIG9yIHRoZSB3aG9sZSBzdGFjay4gVGhlIHN1YnNldCBJUyB0aGUgZ2VvbWV0cnksIHNvIGl0XG4gICAgLy8gYmVsb25ncyBpbiB0aGUgZ2VvbWV0cnkga2V5IHJhdGhlciB0aGFuIGJlaW5nIHJlLWRlcml2ZWQgcGVyIGZyYW1lIOKAlCBhbmQgYW5cbiAgICAvLyBvdXQtb2YtcmFuZ2UgaW5kZXggaXMgY2xhbXBlZCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGUgY2xvdWQsIGJlY2F1c2UgdGhlXG4gICAgLy8gc2VjdGlvbiBjb3VudCBjaGFuZ2VzIHdpdGggdGhlIGRhdGFzZXQgd2hpbGUgdGhlIHZpZXcgc3RhdGUgcGVyc2lzdHMuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc09mKG9icyk7XG4gICAgY29uc3Qgc2VjdGlvbiA9XG4gICAgICB2aWV3LnBvaW50U2VjdGlvbiAhPSBudWxsICYmIHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzZWN0aW9uc1tNYXRoLm1heCgwLCBNYXRoLm1pbihzZWN0aW9ucy5sZW5ndGggLSAxLCB2aWV3LnBvaW50U2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2hvd24gPSBzZWN0aW9uICE9IG51bGwgPyBvYnNlcnZhdGlvbnNJblNlY3Rpb24ob2JzLCBzZWN0aW9uKSA6IG51bGw7XG4gICAgY29uc3Qgc2hvd25Db3VudCA9IHNob3duID8gc2hvd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuXG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtvYnMuY291bnR9OiR7c2VjdGlvbiA/PyAnYWxsJ31gO1xuICAgIC8vIGBQb2ludHMzRExheWVyLnZhbHVlc2AgaXMgcmVhZG9ubHkgYW5kIHRoZSBsYXllciBleHBvc2VzIG5vIGRhdGFWZXJzaW9uIHRvXG4gICAgLy8gYnVtcCwgc28gdW5saWtlIHRoZSAyRCBwYXRoIGEgY2hhbmdlIG9mIGNvbG91ciBTT1VSQ0UgY2Fubm90IGJlIG11dGF0ZWQgaW5cbiAgICAvLyDigJQgdGhlIGxheWVyIGhhcyB0byBiZSByZWJ1aWx0LiBPbmx5IHRoZSBzaXplL29wYWNpdHkvY29sb3JtYXAga25vYnMgYXJlXG4gICAgLy8gZ2VudWluZWx5IGRpc3BsYXktb25seS4gU28gdHJhY2sgdGhlIHNjYWxhcnMnIGlkZW50aXR5IHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAgICAvLyBnZW9tZXRyeSdzOiBgY29sb3JCeWAgcGx1cyB0aGUgdHJhbnNmb3JtcyBmZWVkaW5nIHRoZSBlbmNvZGluZy5cbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3Qgc2NhbGFyS2V5ID0gW1xuICAgICAga2V5LFxuICAgICAgdmlldy5jb2xvckJ5ID8gYCR7dmlldy5jb2xvckJ5LmtpbmR9OiR7dmlldy5jb2xvckJ5Lm5hbWV9YCA6ICdmbGF0JyxcbiAgICAgIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLFxuICAgICAgY2xpcC5qb2luKCcsJyksXG4gICAgXS5qb2luKCd8Jyk7XG5cbiAgICBpZiAoa2V5ICE9PSB0aGlzLnNwYXRpYWxMYXllcktleTNkKSB7XG4gICAgICAvLyBOZXcgZ2VvbWV0cnk6IGludGVybGVhdmUgeCx5LHogKHRoZSBsYXllcidzIGRvY3VtZW50ZWQgbGF5b3V0LCB4LWZhc3Rlc3QpXG4gICAgICAvLyBhbmQgY2FjaGUgaXQsIHNvIGxhdGVyIGNvbG91ciBjaGFuZ2VzIHJlYnVpbGQgdGhlIGxheWVyIHdpdGhvdXQgd2Fsa2luZ1xuICAgICAgLy8gdGhlIG9ic2VydmF0aW9ucyBhZ2Fpbi5cbiAgICAgIGNvbnN0IFtveCwgb3ksIG96XSA9IHRoaXMuc3BhdGlhbE9yaWdpbjNkO1xuICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50ICogMyk7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNob3duQ291bnQ7IGsrKykge1xuICAgICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICAgIHBvc2l0aW9uc1trICogM10gPSBvYnMueFtpXSArIG94O1xuICAgICAgICBwb3NpdGlvbnNbayAqIDMgKyAxXSA9IG9icy55W2ldICsgb3k7XG4gICAgICAgIHBvc2l0aW9uc1trICogMyArIDJdID0gb2JzLnpbaV0gKyBvejtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gcG9zaXRpb25zO1xuICAgICAgdGhpcy5zcGF0aWFsRHJhd24zZCA9IHNob3duO1xuICAgIH1cblxuICAgIC8vIFRoZSBzY2FsYXJzIGhhdmUgdG8gZm9sbG93IHRoZSBnZW9tZXRyeTogYSBwZXItb2JzZXJ2YXRpb24gdmVjdG9yIGFnYWluc3Qgb25lXG4gICAgLy8gc2VjdGlvbidzIHBvc2l0aW9ucyB3b3VsZCBjb2xvdXIgZWFjaCBjZWxsIGJ5IGEgc3RyYW5nZXIncyB2YWx1ZS5cbiAgICBjb25zdCB2YWx1ZXNGb3IgPSAoKSA9PiAoc2hvd24gPyBGbG9hdDMyQXJyYXkuZnJvbShzaG93biwgKGkpID0+IHNjYWxhcnNbaV0pIDogc2NhbGFycyk7XG5cbiAgICBpZiAoIXRoaXMuc3BhdGlhbFBvaW50czNkIHx8IGtleSAhPT0gdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCkge1xuICAgICAgLy8gTmV3IEdFT01FVFJZIOKAlCBhIGRpZmZlcmVudCBkYXRhc2V0LCBvciBhIGRpZmZlcmVudCBzZWN0aW9uIOKAlCBzbyBhIG5ldyBsYXllci5cbiAgICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMzZCkgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzM2QpO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IGtleTtcbiAgICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gc2NhbGFyS2V5O1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QgPSB2aWV3ZXIuYWRkUG9pbnRzM0QodGhpcy5zcGF0aWFsUG9zaXRpb25zM2QhLCB2YWx1ZXNGb3IoKSwge1xuICAgICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgICAgY29sb3JtYXAsXG4gICAgICAgIGNvbnRyYXN0TGltaXRzLFxuICAgICAgICBzaXplLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzY2FsYXJLZXkgIT09IHRoaXMuc3BhdGlhbFNjYWxhcktleTNkKSB7XG4gICAgICAgIC8vIEEgY2hhbmdlIG9mIGNvbG91ciBTT1VSQ0UsIHdoaWNoIHVzZWQgdG8gbWVhbiBkaXNjYXJkaW5nIHRoZSBsYXllciBhbmQgYnVpbGRpbmdcbiAgICAgICAgLy8gYW5vdGhlciDigJQgYW5kLCBiZWNhdXNlIGFkZGluZyBhIDNEIGxheWVyIHJlZnJhbWVzLCBhIGNhbWVyYSBqdW1wIHRvIHVuZG8gYXMgd2VsbC5cbiAgICAgICAgLy8gbmFwYXJpLWpzIOKJpSAwLjE0IGxldHMgdGhlIHNjYWxhcnMgYmUgcmVwbGFjZWQgaW4gcGxhY2Ug4oCUIHRoZSBzZXR0ZXIgYnVtcHMgdGhlXG4gICAgICAgIC8vIGxheWVyJ3MgZGF0YVZlcnNpb24gc28gdGhlIHZpc3VhbCByZS11cGxvYWRzIOKAlCBhbmQgdGhlIHBvc2l0aW9ucyBoYXZlIG5vdCBtb3ZlZCxcbiAgICAgICAgLy8gc28gdGhlcmUgaXMgbm90aGluZyBmb3IgdGhlIGNhbWVyYSB0byByZWZyYW1lLlxuICAgICAgICB0aGlzLnNwYXRpYWxTY2FsYXJLZXkzZCA9IHNjYWxhcktleTtcbiAgICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QudmFsdWVzID0gdmFsdWVzRm9yKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC5jb2xvcm1hcCA9IGNvbG9ybWFwO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QuY29udHJhc3RMaW1pdHMgPSBjb250cmFzdExpbWl0cztcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLnNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8vIFNlbGVjdGlvbiBpcyBhIFBFUi1QT0lOVCBhbHBoYSwgaW4gdGhlIG9uZSBsYXllci5cbiAgICAvL1xuICAgIC8vIEl0IHVzZWQgdG8gYmUgYSBzZWNvbmQgbGF5ZXI6IHdpdGggYSBzaW5nbGUgb3BhY2l0eSBmb3IgdGhlIHdob2xlIGNsb3VkLCB0aGUgb25seSB3YXlcbiAgICAvLyB0byBoaWdobGlnaHQgYSBzdWJzZXQgd2FzIHRvIGRyYXcgaXQgYWdhaW4gb24gdG9wIGF0IGZ1bGwgb3BhY2l0eSB3aGlsZSB0aGUgcGFyZW50XG4gICAgLy8gZHJvcHBlZCB0byB0aGUgbXV0ZWQgbGV2ZWwuIFRoYXQgc2Vjb25kIGxheWVyIGhhZCB0byBiZSBrZXB0IGluIHN0ZXAgdGhyb3VnaCBldmVyeVxuICAgIC8vIGNvbG9ybWFwLCB3aW5kb3cgYW5kIHNpemUgY2hhbmdlLCBhbmQgdGhlIHR3byB0aGVuIGRlcHRoLXNvcnRlZCBhZ2FpbnN0IGVhY2ggb3RoZXIgYXNcbiAgICAvLyBzZXBhcmF0ZSBkcmF3cy4gUGVyLXBvaW50IGFscGhhcyBhbmQgc2l6ZXMgZ2l2ZSB0aGUgc2FtZSByZWFkaW5nIOKAlCBtdXRlZCBjbG91ZCwgYnJpZ2h0XG4gICAgLy8gc2VsZWN0aW9uLCBzbGlnaHRseSBsYXJnZXIgc28gYSBzbWFsbCBvbmUgaXMgZmluZGFibGUgaW5zaWRlIDMuN00gcG9pbnRzIOKAlCBpbiBvbmUuXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCAmJiBzZWxlY3Rpb24ubWFzay5sZW5ndGggPT09IG9icy5jb3VudDtcbiAgICBjb25zdCBjbG91ZCA9IHRoaXMuc3BhdGlhbFBvaW50czNkO1xuICAgIGlmIChjbG91ZCkge1xuICAgICAgY2xvdWQub3BhY2l0eSA9IHZpZXcub3BhY2l0eTtcbiAgICAgIGlmICghaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgIGNsb3VkLmFscGhhcyA9IG51bGw7XG4gICAgICAgIGNsb3VkLnNpemVzID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFscGhhcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgICAgIGNvbnN0IHNpemVzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBzaG93bkNvdW50OyBrKyspIHtcbiAgICAgICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICAgICAgY29uc3QgcGlja2VkID0gISFzZWxlY3Rpb24ubWFza1tpXTtcbiAgICAgICAgICBhbHBoYXNba10gPSBwaWNrZWQgPyAxIDogREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgICAgIHNpemVzW2tdID0gcGlja2VkID8gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFIDogMTtcbiAgICAgICAgfVxuICAgICAgICBjbG91ZC5hbHBoYXMgPSBhbHBoYXM7XG4gICAgICAgIGNsb3VkLnNpemVzID0gc2l6ZXM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExhc3QsIHNvIGl0IGFsc28gY292ZXJzIGEgbGF5ZXIgdGhpcyBwYXNzIGp1c3QgY3JlYXRlZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzM2QpIHRoaXMuc3BhdGlhbFBvaW50czNkLnZpc2libGUgPSB2aWV3LnNob3dQb2ludHM7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKiozRCBnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIG92ZXIgdGhlIHdob2xlIHNlY3Rpb25lZFxuICAgKiBzcGVjaW1lbiwgYXMgb25lIHJheW1hcmNoZWQgdm9sdW1lLlxuICAgKlxuICAgKiBUd28gdGhpbmdzIGl0IGNhbiBiZSwgYW5kIHRoZSBwYW5lbCdzIGBWb2x1bWUgcmVuZGVyaW5nYCB0b2dnbGUgcGlja3Mgd2hpY2g6XG4gICAqXG4gICAqICAtICoqc2hlZXRzKiog4oCUIGV4YWN0bHkgdGhlIHBsYW5lcyB0aGF0IHdlcmUgaW1hZ2VkLCBlYWNoIGNhcnJ5aW5nIHRoYXRcbiAgICogICAgc2xpZGUncyBvd24gMkQgZ2VuZSBtYXAsIHdpdGggdGhlIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyBlbXB0eS4gQSBzdGFjayBvZlxuICAgKiAgICBtZWFzdXJlZCBmaWVsZHMsIGF0IHRoZWlyIHRydWUgei5cbiAgICogIC0gKip2b2x1bWUqKiDigJQgdGhlIHNhbWUgZmllbGRzIHNtb290aGVkIGFsb25nIHosIHNvIHRoZSBwbGFuZXMgYmV0d2VlbiB0aGVcbiAgICogICAgc2VjdGlvbnMgY2FycnkgYW4gaW50ZXJwb2xhdGVkIHZhbHVlLiBBbiBlc3RpbWF0ZSwgYW5kIGRyYXduIGFzIGFcbiAgICogICAgdHJhbnNsdWNlbnQgY2xvdWQgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgZGVuc2l0eSB2b2x1bWVzIGFyZS5cbiAgICpcbiAgICogT25lIGBWb2x1bWVMYXllcmAgcmF0aGVyIHRoYW4gYSB0ZXh0dXJlZCBxdWFkIHBlciBzZWN0aW9uOiBhbiBgSW1hZ2VMYXllcmBcbiAgICogcmVuZGVycyBvbmx5IGF0IGBuZGlzcGxheSA9PT0gMmAsIHNvIDUzIHNoZWV0cyBpbiB0aGUgb3JiaXQgdmlldyB3b3VsZCBuZWVkIGFcbiAgICogbmV3IGxheWVyIHR5cGUgdXBzdHJlYW0g4oCUIHdoaWxlIGEgc2NhbGFyIHZvbHVtZSB3aG9zZSB6IHNhbXBsaW5nIGFscmVhZHkgSVNcbiAgICogdGhlIHNlY3Rpb24gc3BhY2luZyBleHByZXNzZXMgdGhlIHNoZWV0cyBleGFjdGx5LCBhbmQgdGhlIHNhbWUgbGF0dGljZSB0aGVuXG4gICAqIGdpdmVzIHRoZSBpbnRlcnBvbGF0ZWQgdmVyc2lvbiBmb3IgZnJlZS5cbiAgICpcbiAgICogRXN0aW1hdGVkIG9uIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duIGxhdHRpY2UgKGBkZW5zaXR5R3JpZGAgYXQgc3RyaWRlIDEpLFxuICAgKiBzbyB0aGUgZmllbGQgbGFuZHMgdm94ZWwtZm9yLXZveGVsIG9uIHRoZSBhbmF0b215IGFuZCBuZWVkcyBubyBvZmZzZXQg4oCUIGFcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlLCBhbmQgbmFwYXJpIGNlbnRyZXMgYm90aCBib3hlcyBvbiB0aGUgd29ybGRcbiAgICogb3JpZ2luLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVHZW5lTWFwVm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnZW5lID0gdmlldy5nZW5lTWFwICYmIHZpZXcuY29sb3JCeT8ua2luZCA9PT0gJ2ZlYXR1cmUnID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IHNtb290aGluZyA9IHZpZXcuZ2VuZU1hcFNtb290aGluZyA+IDAgPyB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgOiAxO1xuICAgIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICAvLyBBIHZvbHVtZSBidWlsdCBmcm9tIE9ORSBzZWN0aW9uIHdvdWxkIHNtZWFyIHRoYXQgc2xpZGUgdGhyb3VnaCB0aGUgd2hvbGVcbiAgICAvLyBkZXB0aCwgc28gdGhlIHNlY3Rpb24gcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBzaGVldHMuXG4gICAgY29uc3QgaW50ZXJwb2xhdGUgPSAhIXZpZXcuZ2VuZU1hcFZvbHVtZTtcbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgICBjb25zdCBzZWN0aW9uID1cbiAgICAgICFpbnRlcnBvbGF0ZSAmJiB2aWV3LmdlbmVNYXBTZWN0aW9uICE9IG51bGwgJiYgc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcuZ2VuZU1hcFNlY3Rpb24pKV1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZmllbGRLZXkgPSBnZW5lXG4gICAgICA/IFtcbiAgICAgICAgZGF0YXNldC5pZCwgZ2VuZSwgc21vb3RoaW5nLCBzZWN0aW9uID8/ICdhbGwnLCBpbnRlcnBvbGF0ZSA/ICd2b2wnIDogJ3NoZWV0cycsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmV2KHNlbGVjdGlvbiksXG4gICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGtleSA9IGZpZWxkS2V5XG4gICAgICA/IFtcbiAgICAgICAgZmllbGRLZXksIGNsaXAuam9pbignLCcpLCB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJywgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgdGhpcy5jb250aW51b3VzQ29sb3JtYXBLZXkodmlldyksXG4gICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZ2VuZU1hcFZvbHVtZUtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBWb2x1bWVMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvYXJzZW5lZCBpbi1wbGFuZSBidXQgTk9UIGFsb25nIHo6IHRoZSBzaGVldHMgbmVlZCBvbmUgcGxhbmUgcGVyIGltYWdlZFxuICAgIC8vIHNlY3Rpb24sIHdoaWxlIHRoZSBmaWVsZCB0aGV5IGNhcnJ5IGlzIHNtb290aCBieSBjb25zdHJ1Y3Rpb24gYW5kIGdhaW5zXG4gICAgLy8gbm90aGluZyBmcm9tIHRoZSB0ZW1wbGF0ZSdzIDQwIMK1bSBkZXRhaWwuIEF0IGZ1bGwgcmVzb2x1dGlvbiB0aGUgZXN0aW1hdGUgaXNcbiAgICAvLyBhIDUuN00tdm94ZWwgcGFpciBvZiBibHVycyBvbiB0aGUgbWFpbiB0aHJlYWQg4oCUIHNlY29uZHMgb2YgZnJvemVuIFVJIGZvciBhXG4gICAgLy8gY2hlY2tib3g7IGFuIGVpZ2h0aCBvZiB0aGUgdm94ZWxzIGlzIGFuIGVpZ2h0aCBvZiB0aGUgd29yay5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCwgR0VORV9NQVBfVk9MVU1FX1NUUklERSwgMTI4LCAxKTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcblxuICAgIGlmIChmaWVsZEtleSAhPT0gdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkpIHtcbiAgICAgIGxldCB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnZW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIDNEIGdlbmUgbWFwOiBcIiR7Z2VuZX1cIiB1bmF2YWlsYWJsZWAsIGVycik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMuZ2VuZU1hcFZvbHVtZUtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBtYXNrVG9JbmRpY2VzKHNlbGVjdGlvbi5tYXNrKSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEluLXBsYW5lIGJhbmR3aWR0aCBpcyB0aGUgMkQgbWFwJ3MsIGluIHRoaXMgbGF0dGljZSdzIHVuaXRzLCBzbyBhIHNoZWV0XG4gICAgICAvLyBhbmQgdGhlIDJEIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQuIEFsb25nIHogaXQgaXMgdGhlXG4gICAgICAvLyBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzIOKAlCB0aGUgc21hbGxlc3Qgz4MgdGhhdCBicmlkZ2VzIG9uZSBzZWN0aW9uIGdhcC5cbiAgICAgIC8vIEluLXBsYW5lIM+DIGlzIGEgUEhZU0lDQUwgYmFuZHdpZHRoLCBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93blxuICAgICAgLy8gdm94ZWwg4oCUIHRoZSByZXNvbHV0aW9uIHRoZSAyRCBtYXAgZXN0aW1hdGVzIGF0IOKAlCBzbyBhIHNoZWV0IGFuZCB0aGUgMkRcbiAgICAgIC8vIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQgd2hhdGV2ZXIgbGF0dGljZSB0aGlzIGlzXG4gICAgICAvLyByYXN0ZXJpc2VkIG9uLiBBbG9uZyB6IGl0IGlzIHRoZSBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzOiB0aGUgc21hbGxlc3Qgz4NcbiAgICAgIC8vIHRoYXQgYnJpZGdlcyBvbmUgc2VjdGlvbiBnYXAuXG4gICAgICBjb25zdCBpblBsYW5lID0gZGF0YXNldC52b2x1bWU/LnZveGVsU2l6ZSA/PyBncmlkLnZveGVsU2l6ZTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkID0gZXhwcmVzc2lvblZvbHVtZShvYnMsIGdyaWQsIHtcbiAgICAgICAgc2lnbWE6IFtcbiAgICAgICAgICBpblBsYW5lWzBdICogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgaW5QbGFuZVsxXSAqIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgIGdyaWQudm94ZWxTaXplWzJdICogMS41ICogc21vb3RoaW5nLFxuICAgICAgICBdLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIGluZGljZXM6IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogaW5TZWxlY3Rpb24sXG4gICAgICAgIGludGVycG9sYXRlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IFtsbywgaGldID0gY29udHJhc3RXaW5kb3coZmllbGQubWVhbiwgY2xpcFswXSwgY2xpcFsxXSk7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZUV4cHJlc3Npb25Wb2x1bWUoZmllbGQsIFtsbywgaGldLCB7IGxvZzogdmlldy5sb2dTY2FsZSB9KTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyID0gdmlld2VyLmFkZFZvbHVtZShcbiAgICAgIGRhdGEsIGZpZWxkLndpZHRoLCBmaWVsZC5oZWlnaHQsIGZpZWxkLmRlcHRoLFxuICAgICAge1xuICAgICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfSR7aW50ZXJwb2xhdGUgPyAnIMK3IHZvbHVtZScgOiAnJ31gLFxuICAgICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KGBnZW5lLW1hcC0ke2dlbmV9YCwgbHV0KSxcbiAgICAgICAgLy8gVGhlIGVuY29kaW5nIGFscmVhZHkgYXBwbGllZCB0aGUgd2luZG93LCBzbyB0aGUgbGF5ZXIgbXVzdCBub3QgYXBwbHkgYVxuICAgICAgICAvLyBzZWNvbmQgb25lOiAwLi4yNTUgaXMgdGhlIHdob2xlIG9mIHdoYXQgaXQgd2FzIGdpdmVuLlxuICAgICAgICBjb250cmFzdExpbWl0czogWzAsIDI1NV0sXG4gICAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgICAgLy8gQWRkaXRpdmUgbGlrZSB0aGUgZGVuc2l0eSB2b2x1bWVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhlIHNoZWV0c1xuICAgICAgICAvLyBoYXZlIHRvIHJlYWQgVEhST1VHSCBlYWNoIG90aGVyIGFuZCB0aHJvdWdoIHRoZSBhbmF0b215LCB3aGljaCBhXG4gICAgICAgIC8vIHRyYW5zbHVjZW50IGJsZW5kIHdvdWxkIG9jY2x1ZGUgb25lIHNoZWV0IGF0IGEgdGltZS5cbiAgICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICAgIG9wYWNpdHk6IHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICB9LFxuICAgICk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbHVzdGVyIGRlbnNpdHkgdm9sdW1lczogZWFjaCBjbHVzdGVyIHJhc3RlcmlzZWQgaW50byBhIHNtb290aCBzY2FsYXIgZmllbGQgYW5kXG4gICAqIHJheW1hcmNoZWQgYWxvbmdzaWRlIHRoZSBjbG91ZCwgdGludGVkIHdpdGggdGhlIGNsdXN0ZXIncyBvd24gbGVnZW5kIGNvbG91ci5cbiAgICpcbiAgICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgc2VyaWFsbHkgc2VjdGlvbmVkIGRhdGFzZXQgcmVhZGFibGUgYXMgYW4gYW5hdG9taWNhbFxuICAgKiBkaXN0cmlidXRpb24uIFRoZSBjbG91ZCBzaG93cyBtZWFzdXJlZCBjZWxscyBhbmQgbm90aGluZyBlbHNlIOKAlCBidXQgYXQgMjAwIMK1bVxuICAgKiBzZWN0aW9uIHNwYWNpbmcgdGhlIGV5ZSBjYW5ub3QgaW50ZWdyYXRlIGEgc3RhY2sgb2YgZGlzY3MgaW50byBhIHNoYXBlLCBhbmRcbiAgICogZXZlcnkgZ2FwIHJlYWRzIGFzIGFic2VuY2UuIEEgZGVuc2l0eSBmaWVsZCBpcyBhIGRpZmZlcmVudCBvYmplY3QgZnJvbSBhIGNlbGw6XG4gICAqIGFuIGVzdGltYXRlLCBkZWZpbmVkIGJldHdlZW4gdGhlIGltYWdlZCBwbGFuZXMsIGRyYXduIGFzIGEgdHJhbnNsdWNlbnQgY2xvdWQgc29cbiAgICogaXQgY2Fubm90IGJlIG1pc3Rha2VuIGZvciBtZWFzdXJlbWVudC4gSW5kaXZpZHVhbCBjZWxscyBhcmUgbmV2ZXIgaW50ZXJwb2xhdGVkIOKAlFxuICAgKiBjb25zZWN1dGl2ZSBzZWN0aW9ucyBzYW1wbGUgZGlmZmVyZW50IGNlbGxzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVycG9sYXRlXG4gICAqIGFsb25nLlxuICAgKlxuICAgKiBPbmUgdm9sdW1lIHBlciBjbHVzdGVyIHJhdGhlciB0aGFuIG9uZSBmb3IgZXZlcnl0aGluZzogYWRkaXRpdmUgYmxlbmRpbmcgaXMgd2hhdFxuICAgKiBtYWtlcyB0d28gY2x1c3RlcnMnIHRlcnJpdG9yaWVzIGNvbXBhcmFibGUsIGFuZCBhIHNpbmdsZSBibGVuZGVkIGZpZWxkIHdvdWxkXG4gICAqIGFuc3dlciBubyBxdWVzdGlvbiBhbnlvbmUgYXNrcyBvZiBhIHRheG9ub215LiBDYXBwZWQgYXRcbiAgICoge0BsaW5rIERFTlNJVFlfTUFYX0NMVVNURVJTfSBieSBjZWxsIGNvdW50LlxuICAgKlxuICAgKiBLZXllZCBzbyBpdCByZWJ1aWxkcyBvbmx5IHdoZW4gdGhlIGZpZWxkIHdvdWxkIGFjdHVhbGx5IGRpZmZlciDigJQgdGhlIGRhdGFzZXQsXG4gICAqIHRoZSBjb2xvdXIgY29sdW1uLCB0aGUgYmFuZHdpZHRoLCBvciB0aGUgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZW5zaXR5Vm9sdW1lcyhcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb24gPSAhIXZpZXcuZGVuc2l0eVZvbHVtZSAmJiAhIWRhdGFzZXQub2JzZXJ2YXRpb25zLno7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5kZW5zaXR5U21vb3RoaW5nID4gMCA/IHZpZXcuZGVuc2l0eVNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY29sdW1uID0gdmlldy5jb2xvckJ5Py5raW5kID09PSAnY29sdW1uJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICAvLyBUaGUgc2VsZWN0aW9uIGVudGVycyB0aGUga2V5IGJ5IElERU5USVRZLCBub3QgYnkgY291bnQ6IHR3byBkaWZmZXJlbnQgUk9Jc1xuICAgIC8vIGhvbGRpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGNlbGxzIHdvdWxkIG90aGVyd2lzZSBsb29rIGxpa2UgdGhlIHNhbWUga2V5IGFuZFxuICAgIC8vIGxlYXZlIHRoZSBwcmV2aW91cyBST0kncyBmaWVsZHMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGtleSA9IG9uXG4gICAgICA/IFtkYXRhc2V0LmlkLCBjb2x1bW4gPz8gJ2FsbCcsIHNtb290aGluZywgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKV0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5kZW5zaXR5S2V5KSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuZGVuc2l0eUxheWVycykgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IGtleTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIC8vIFdpdGggbm8gcmVmZXJlbmNlIHZvbHVtZSB0aGVyZSBpcyBubyBvZmZzZXQgeWV0LCBhbmQgYSBWb2x1bWVMYXllciBoYXMgbm9cbiAgICAvLyB0cmFuc2xhdGUg4oCUIG5hcGFyaSBjZW50cmVzIGl0cyBib3ggb24gdGhlIHdvcmxkIG9yaWdpbi4gU28gdGhlIFBPSU5UUyBtb3ZlIGJ5XG4gICAgLy8gaGFsZiB0aGUgZGVuc2l0eSBib3gsIGV4YWN0bHkgYXMgdGhleSBkbyBmb3IgYSByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgdGhlXG4gICAgLy8gY2FjaGVkIGdlb21ldHJ5IGlzIGludmFsaWRhdGVkIGJlY2F1c2UgdGhhdCBvZmZzZXQganVzdCBjaGFuZ2VkLlxuICAgIGlmICghdGhpcy5zcGF0aWFsVm9sdW1lKSB7XG4gICAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFtcbiAgICAgICAgLShncmlkLndpZHRoICogZ3JpZC52b3hlbFNpemVbMF0pIC8gMixcbiAgICAgICAgLShncmlkLmhlaWdodCAqIGdyaWQudm94ZWxTaXplWzFdKSAvIDIsXG4gICAgICAgIC0oZ3JpZC5kZXB0aCAqIGdyaWQudm94ZWxTaXplWzJdKSAvIDIsXG4gICAgICBdO1xuICAgICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGdyb3VwczogeyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmc7IGluZGljZXM/OiBVaW50MzJBcnJheSB9W107XG4gICAgdHJ5IHtcbiAgICAgIGdyb3VwcyA9IGF3YWl0IHRoaXMuZGVuc2l0eUdyb3VwcyhkYXRhc2V0LCBjb2x1bW4sIHNlbGVjdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIGRlbnNpdHkgdm9sdW1lczogY29sdW1uIHVuYXZhaWxhYmxlJywgZXJyKTtcbiAgICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBzaWdtYSA9IGRlZmF1bHRTaWdtYShncmlkLCBzbW9vdGhpbmcpO1xuICAgIC8vIEFkZGl0aXZlIGJsZW5kaW5nIFNVTVMsIHNvIGEgZml4ZWQgcGVyLWxheWVyIG9wYWNpdHkgYmxvd3Mgb3V0IHRvIHdoaXRlIGFzXG4gICAgLy8gc29vbiBhcyBzZXZlcmFsIGJyb2FkIGNsdXN0ZXJzIG92ZXJsYXAg4oCUIHNpeCBzdWJjbGFzc2VzIGF0IDAuNTUgZWFjaCB0dXJuZWRcbiAgICAvLyB0aGUgYnJhaW4gaW50byBvbmUgY3lhbiBtYXNzLiBTcGxpdHRpbmcgdGhlIGJ1ZGdldCBrZWVwcyBuIGZ1bGx5IG92ZXJsYXBwaW5nXG4gICAgLy8gcGVha3MgaW5zaWRlIHRoZSBkaXNwbGF5J3MgcmFuZ2UsIHNvIG92ZXJsYXAgcmVhZHMgYXMgb3ZlcmxhcDsgYSBzaW5nbGVcbiAgICAvLyBjbHVzdGVyIHN0aWxsIGdldHMgdGhlIGZ1bGwgMC41NS4gSXQgb25seSBtaXRpZ2F0ZXM6IGEgdHJhbnNsdWNlbnQgcmF5bWFyY2hcbiAgICAvLyBpbnRlZ3JhdGVzIGFsb25nIHRoZSByYXksIHNvIGNsdXN0ZXJzIHRoYXQgYXJlIHViaXF1aXRvdXMgcmF0aGVyIHRoYW5cbiAgICAvLyByZWdpb25hbCAodGhlIGxhcmdlc3Qgc3ViY2xhc3NlcyBhcmUgZ2xpYSwgd2hpY2ggYXJlIGV2ZXJ5d2hlcmUpIHN0aWxsIHBpbGVcbiAgICAvLyB1cCwgYW5kIG9uZSBjbHVzdGVyIGF0IGEgdGltZSBpcyB0aGUgcmVhZGFibGUgd2F5IHRvIGxvb2sgYXQgdGhvc2UuXG4gICAgY29uc3Qgb3BhY2l0eSA9IE1hdGgubWluKDAuNTUsIDAuOSAvIE1hdGgubWF4KDEsIGdyb3Vwcy5sZW5ndGgpKTtcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgICAgY29uc3QgZGF0YSA9IHJhc3Rlcml6ZURlbnNpdHkoZGF0YXNldC5vYnNlcnZhdGlvbnMsIGdyaWQsIHsgc2lnbWEsIGluZGljZXM6IGdyb3VwLmluZGljZXMgfSk7XG4gICAgICAvLyBBIGNsdXN0ZXIgd2l0aCBub3RoaW5nIG9uIHRoZSBncmlkIGRyYXdzIG5vIGxheWVyLCByYXRoZXIgdGhhbiBhbiBlbXB0eSBib3guXG4gICAgICBpZiAoIWRhdGEpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIHRoaXMuZGVuc2l0eUxheWVycy5wdXNoKFxuICAgICAgICAoXG4gICAgICAgICAgdmlld2VyLmFkZFZvbHVtZShkYXRhLCBncmlkLndpZHRoLCBncmlkLmhlaWdodCwgZ3JpZC5kZXB0aCwge1xuICAgICAgICAgICAgbmFtZTogYGRlbnNpdHkgwrcgJHtncm91cC5uYW1lfWAsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKGdyb3VwLmNvbG9yKSxcbiAgICAgICAgICAgIC8vIFRyYW5zbHVjZW50LCBub3QgTUlQOiBhIGNsdXN0ZXIncyBpbnRlcmlvciBpcyB0aGUgcmVhZGFibGUgcGFydCwgYW5kIE1JUFxuICAgICAgICAgICAgLy8gd291bGQgZmxhdHRlbiBldmVyeSBjbG91ZCB0byBpdHMgYnJpZ2h0ZXN0IHNoZWxsLlxuICAgICAgICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgICAgIC8vIEFkZGl0aXZlLCBzbyB0d28gY2x1c3RlcnMgb3ZlcmxhcHBpbmcgcmVhZCBhcyBib3RoIGJlaW5nIHRoZXJlIGluc3RlYWRcbiAgICAgICAgICAgIC8vIG9mIHRoZSBuZWFyZXIgb25lIGhpZGluZyB0aGUgb3RoZXIuXG4gICAgICAgICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICAgICAgfSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGl0eSBvZiB0aGUgY29sb3VyIHNjYWxlIGEgY29udGludW91cyBzcGF0aWFsIGxheWVyIHdpbGwgZHJhdyB3aXRoLCBmb3IgYVxuICAgKiBjYWNoZSBrZXk6IHRoZSBleHBsaWNpdCBjaG9pY2UsIG9yIGVsc2UgdGhlIGRpc3BsYXkgY29sb3JtYXAgYW5kIGl0cyByZXZlcnNlXG4gICAqIGZsYWcsIHNpbmNlIHRoYXQgaXMgd2hhdCB7QGxpbmsgc3BhdGlhbENvbnRpbnVvdXNMdXR9IGZhbGxzIGJhY2sgdG8uXG4gICAqXG4gICAqIFRoZSBnZW5lIG1hcHMgY2FjaGUgdGhlaXIgY29sb3VyZWQgb3V0cHV0LCBzbyB3aXRob3V0IHRoaXMgaW4gdGhlIGtleSBhIGNoYW5nZVxuICAgKiBvZiBjb2xvdXIgc2NhbGUgbGVmdCB0aGUgZmllbGQgb24gc2NyZWVuIGluIHRoZSBwcmV2aW91cyBjb2xvdXJzIOKAlCB0aGUgbWFya2Vyc1xuICAgKiByZWNvbG91cmVkIGFuZCB0aGUgbWFwIHVuZGVyIHRoZW0gZGlkIG5vdC5cbiAgICovXG4gIHByaXZhdGUgY29udGludW91c0NvbG9ybWFwS2V5KHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIHJldHVybiBbXG4gICAgICBjb2xvcm1hcElkKHZpZXcuY29udGludW91c0NvbG9ybWFwKSxcbiAgICAgIGNvbG9ybWFwSWQobm9kZT8uZGF0YT8udmFsdWUpLFxuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA/ICdyZXYnIDogJycsXG4gICAgXS5qb2luKCc6Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSByZXZpc2lvbiBudW1iZXIgZm9yIGEgc2VsZWN0aW9uIG9iamVjdC5cbiAgICpcbiAgICogVGhlIHN0b3JlIGhhbmRzIG91dCBhIE5FVyBtYXNrIG9iamVjdCBwZXIgY2hhbmdlLCBzbyBvYmplY3QgaWRlbnRpdHkgaXMgdGhlXG4gICAqIGNoZWFwIGFuZCBleGFjdCB3YXkgdG8gdGVsbCB0d28gc2VsZWN0aW9ucyBhcGFydCDigJQgYSBmaW5nZXJwcmludCBvdmVyIDMuN01cbiAgICogbWFzayBieXRlcyB3b3VsZCBiZSBuZWl0aGVyLiBDb3VudGluZyByZXZpc2lvbnMga2VlcHMgdGhlIGNhY2hlIGtleSBhIHNob3J0XG4gICAqIHN0cmluZy5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2KHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2spOiBudW1iZXIge1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHRoaXMubGFzdFNlbGVjdGlvblNlZW4pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGlvblNlZW4gPSBzZWxlY3Rpb247XG4gICAgICB0aGlzLnNlbGVjdGlvblJldmlzaW9uKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblJldmlzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbHVzdGVycyB0byByYXN0ZXJpc2U6IHRoZSBjYXRlZ29yaWVzIG9mIHRoZSBhY3RpdmUgY2F0ZWdvcmljYWwgY29sb3VyaW5nLFxuICAgKiBiaWdnZXN0IGZpcnN0IGFuZCBjYXBwZWQsIGVhY2ggd2l0aCBpdHMgbGVnZW5kIGNvbG91ci5cbiAgICpcbiAgICogUmVzdHJpY3RlZCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2hlbiB0aGVyZSBpcyBvbmUsIHNvIFwic2VsZWN0IGEgcmVnaW9uLFxuICAgKiBjaGVjayB0aGUgYm94XCIgYW5zd2VycyB3aGljaCBjbHVzdGVycyBsaXZlIHRoZXJlLiBXaXRoIG5vIGNhdGVnb3JpY2FsIGNvbG91cmluZ1xuICAgKiB0aGVyZSBpcyBvbmUgZ3JvdXAg4oCUIHRvdGFsIGNlbGwgZGVuc2l0eSwgd2hpY2ggaXMgYSByZWFsIHF1ZXN0aW9uIG9uIGl0cyBvd25cbiAgICogKFwid2hlcmUgaXMgdGhlIHRpc3N1ZSBkZW5zZT9cIikgYW5kIHRoZSBob25lc3QgdGhpbmcgdG8gc2hvdyB3aGVuIHRoZSB2aWV3IGlzXG4gICAqIG5vdCBlbmNvZGluZyBhIHRheG9ub215LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZW5zaXR5R3JvdXBzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCBjb2x1bW46IHN0cmluZyB8IG51bGwsIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmc7IGluZGljZXM/OiBVaW50MzJBcnJheSB9W10+IHtcbiAgICBjb25zdCBuID0gZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQ7XG4gICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gc2VsZWN0aW9uLm1hc2sgOiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IG1ldGEgPSBjb2x1bW4gPyBmaW5kQ29sdW1uTWV0YShkYXRhc2V0LCBjb2x1bW4pIDogdW5kZWZpbmVkO1xuICAgIGlmICghcG9ydCB8fCAhY29sdW1uIHx8ICFtZXRhIHx8IG1ldGEua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IGluU2VsZWN0aW9uID8gbWFza1RvSW5kaWNlcyhpblNlbGVjdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICBjb25zdCBoZXggPSBgIyR7W3IsIGcsIGJdLm1hcCgoYykgPT4gTWF0aC5yb3VuZChjICogMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YDtcbiAgICAgIHJldHVybiBbeyBuYW1lOiBpblNlbGVjdGlvbiA/ICdzZWxlY3RlZCBjZWxscycgOiAnYWxsIGNlbGxzJywgY29sb3I6IGhleCwgaW5kaWNlcyB9XTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihsb2FkZWQpKSByZXR1cm4gW107XG4gICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGxvYWRlZC5tZXRhKTtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgVWludDMyQXJyYXkobG9hZGVkLm1ldGEuY2F0ZWdvcmllcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZiAoaW5TZWxlY3Rpb24gJiYgIWluU2VsZWN0aW9uW2ldKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNvZGUgPSBsb2FkZWQuY29kZXNbaV07XG4gICAgICBpZiAoY29kZSAhPT0gTk9fQ0FURUdPUlkgJiYgY29kZSA8IGNvdW50cy5sZW5ndGgpIGNvdW50c1tjb2RlXSsrO1xuICAgIH1cbiAgICBjb25zdCByYW5rZWQgPSBBcnJheS5mcm9tKGNvdW50cywgKGNvdW50LCBjb2RlKSA9PiAoeyBjb2RlLCBjb3VudCB9KSlcbiAgICAgIC5maWx0ZXIoKGMpID0+IGMuY291bnQgPiAwKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY291bnQgLSBhLmNvdW50KVxuICAgICAgLnNsaWNlKDAsIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkRFTlNJVFlfTUFYX0NMVVNURVJTKTtcbiAgICBpZiAoY291bnRzLmZpbHRlcigoYykgPT4gYyA+IDApLmxlbmd0aCA+IHJhbmtlZC5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgYFtuYXBhcmktanNdICR7Y29sdW1ufTogZHJhd2luZyB0aGUgJHtyYW5rZWQubGVuZ3RofSBsYXJnZXN0IGNsdXN0ZXJzIGFzIGRlbnNpdHkgYCArXG4gICAgICAgICAgJ3ZvbHVtZXM7IG1vcmUgdGhhbiB0aGF0IHN0b3AgYmVpbmcgc2VwYXJhYmxlIGJ5IGV5ZScsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmFua2VkLm1hcCgoeyBjb2RlIH0pID0+IHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBuZXcgVWludDMyQXJyYXkoY291bnRzW2NvZGVdKTtcbiAgICAgIGxldCBrID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGlmIChpblNlbGVjdGlvbiAmJiAhaW5TZWxlY3Rpb25baV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAobG9hZGVkLmNvZGVzW2ldID09PSBjb2RlKSBpbmRpY2VzW2srK10gPSBpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbG9hZGVkLm1ldGEuY2F0ZWdvcmllc1tjb2RlXSxcbiAgICAgICAgY29sb3I6IGNvbG9yc1tjb2RlXSA/PyAnIzg4ODg4OCcsXG4gICAgICAgIGluZGljZXM6IGluZGljZXMuc3ViYXJyYXkoMCwgayksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCAob3Iga2VlcCkgdGhlIGRhdGFzZXQncyByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgZGVyaXZlIHRoZSBvZmZzZXQgdGhhdCBzaXRzIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgaW5zaWRlIGl0LlxuICAgKlxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGU6IG5hcGFyaS1qcyBtYXBzIHRoZSB2b2x1bWUncyB1bml0IGN1YmUgdG8gYSB3b3JsZCBib3hcbiAgICogKipjZW50cmVkIG9uIHRoZSBvcmlnaW4qKiwgc2l6ZWQgYGRpbXMgeCB2b3hlbFNpemVgLiBUaGUgb2JzZXJ2YXRpb25zLCBieSBjb250cmFjdCwgYXJlIGluXG4gICAqIHRoZSB2b2x1bWUncyBvd24gZnJhbWUgd2l0aCBpdHMgbmVhciBjb3JuZXIgYXQgdGhlIGNvb3JkaW5hdGUgb3JpZ2luLiBTbyB0aGUgdHdvIG9ubHkgbGluZVxuICAgKiB1cCBpZiB0aGUgUE9JTlRTIG1vdmUg4oCUIGJ5IGhhbGYgdGhlIGJveCDigJQgd2hpY2ggaXMgd2hhdCB7QGxpbmsgc3BhdGlhbE9yaWdpbjNkfSBpcy5cbiAgICpcbiAgICogQSBmYWlsZWQgb3IgYWJzZW50IHZvbHVtZSBpcyBub3QgZmF0YWw6IHRoZSBjbG91ZCByZW5kZXJzIG9uIGl0cyBvd24sIGF0IGl0cyBvd25cbiAgICogY29vcmRpbmF0ZXMsIGFuZCB0aGUgY2FtZXJhIGZyYW1lcyB0aGUgcG9pbnRzIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVNwYXRpYWxWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qga2V5ID0gbWV0YSA/IGAke2RhdGFzZXQuaWR9OiR7bWV0YS53aWR0aH14JHttZXRhLmhlaWdodH14JHttZXRhLmRlcHRofWAgOiBudWxsO1xuICAgIGlmIChrZXkgJiYga2V5ID09PSB0aGlzLnNwYXRpYWxWb2x1bWVLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnNwYXRpYWxWb2x1bWUpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFZvbHVtZSk7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbMCwgMCwgMF07XG4gICAgaWYgKCFtZXRhIHx8ICFwb3J0Py5nZXRWb2x1bWUpIHJldHVybjtcblxuICAgIGxldCB2b3hlbHM6IFVpbnQ4QXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgIHZveGVscyA9IGF3YWl0IHBvcnQuZ2V0Vm9sdW1lKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHJlZmVyZW5jZSB2b2x1bWUgdW5hdmFpbGFibGUg4oCUIGRyYXdpbmcgdGhlIGNsb3VkIGFsb25lJywgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IFt2eCwgdnksIHZ6XSA9IG1ldGEudm94ZWxTaXplO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZUtleSA9IGtleTtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSAoXG4gICAgICB2aWV3ZXIuYWRkVm9sdW1lKHZveGVscywgbWV0YS53aWR0aCwgbWV0YS5oZWlnaHQsIG1ldGEuZGVwdGgsIHtcbiAgICAgIG5hbWU6ICdyZWZlcmVuY2Ugdm9sdW1lJyxcbiAgICAgIGNvbG9ybWFwOiAnZ3JheScsXG4gICAgICAvLyBNSVAgd291bGQgZHJhdyB0aGUgYnJpZ2h0ZXN0IHZveGVsIGFsb25nIGVhY2ggcmF5LCB3aGljaCBmb3IgYW4gYXZlcmFnZWRcbiAgICAgIC8vIHRlbXBsYXRlIG1lYW5zIGEgZmxhdCB3aGl0ZSBzaGVsbCB0aGF0IGhpZGVzIHRoZSBjbG91ZC4gVHJhbnNsdWNlbnQgbGV0c1xuICAgICAgLy8gdGhlIHBvaW50cyByZWFkIHRocm91Z2ggdGhlIHRpc3N1ZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBkcmF3aW5nXG4gICAgICAvLyB0aGVtIHRvZ2V0aGVyLlxuICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgb3BhY2l0eTogdmlldy52b2x1bWVPcGFjaXR5LFxuICAgICAgICB2b3hlbFNpemU6IFt2eCwgdnksIHZ6XSxcbiAgICAgIH0pKTtcbiAgICAvLyBIYWxmIHRoZSBib3gsIG5lZ2F0ZWQ6IHRoZSBvYnNlcnZhdGlvbnMnIG9yaWdpbiBpcyB0aGUgYm94J3MgbmVhciBjb3JuZXIsXG4gICAgLy8gYW5kIHRoZSBib3ggaXMgY2VudHJlZCBvbiB0aGUgd29ybGQgb3JpZ2luLlxuICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gW1xuICAgICAgLShtZXRhLndpZHRoICogdngpIC8gMixcbiAgICAgIC0obWV0YS5oZWlnaHQgKiB2eSkgLyAyLFxuICAgICAgLShtZXRhLmRlcHRoICogdnopIC8gMixcbiAgICBdO1xuICAgIC8vIEZvcmNlIGEgZ2VvbWV0cnkgcmVidWlsZDogdGhlIG9mZnNldCBjaGFuZ2VkLCBzbyBjYWNoZWQgcG9zaXRpb25zIGFyZSBzdGFsZS5cbiAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BhdGlhbDNkTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBbXG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCwgdGhpcy5zcGF0aWFsVm9sdW1lLFxuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIsIC4uLnRoaXMuZGVuc2l0eUxheWVycyxcbiAgICBdKSB7XG4gICAgICBpZiAobGF5ZXIpIHZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBudWxsO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkS2V5ID0gbnVsbDtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBudWxsO1xuICAgIC8vIFRoZSBzY2VuZSBpcyBnb25lLCBzbyB0aGUgbmV4dCAzRCBsYXllciBzaG91bGQgZnJhbWUgaXRzZWxmIGFnYWluLiBUaGF0IHVzZWQgdG8gYmVcbiAgICAvLyBgc3BhdGlhbEZyYW1lZCA9IG51bGxgIG5leHQgdG8gYSBoYW5kLXJvbGxlZCBzYXZlL3Jlc3RvcmU7IHRoZSByZW5kZXJlciBvd25zIHRoZVxuICAgIC8vIHBvbGljeSBub3csIGFuZCB0aGlzIGlzIHRoZSBzYW1lIHN0YXRlbWVudCBhZGRyZXNzZWQgdG8gaXQuXG4gICAgdmlld2VyLnJlc2V0Rml0M0QoKTtcbiAgICB0aGlzLnNwYXRpYWwyZEZyYW1lZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWVLZXkgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gWzAsIDAsIDBdO1xuICAgIHRoaXMuc3BhdGlhbFBvaW50czNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxTY2FsYXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsUG9zaXRpb25zM2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbERyYXduM2QgPSBudWxsO1xuICB9XG5cbiAgLyoqIEEgb25lLWNvbG91ciBjb2xvcm1hcCwgZm9yIHRoZSBcIm5vdGhpbmcgdG8gY29sb3VyIGJ5XCIgc3RhdGUuICovXG4gIHByaXZhdGUgc3BhdGlhbEZsYXRDb2xvcm1hcCgpOiBDb2xvcm1hcCB7XG4gICAgY29uc3QgW3IsIGcsIGJdID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgIGNvbnN0IHJnYjogUmdiID0gW01hdGgucm91bmQociAqIDI1NSksIE1hdGgucm91bmQoZyAqIDI1NSksIE1hdGgucm91bmQoYiAqIDI1NSldO1xuICAgIC8vIFR3byBpZGVudGljYWwgc3RvcHM6IGNvbG9ybWFwRnJvbUx1dCBuZWVkcyBhdCBsZWFzdCB0d28sIGFuZCBlcXVhbCBlbmRzXG4gICAgLy8gbWFrZSBldmVyeSB2YWx1ZSByZXNvbHZlIHRvIHRoZSBzYW1lIGNvbG91ci5cbiAgICByZXR1cm4gY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWZsYXQnLCBbcmdiLCByZ2JdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXBvaW50IHNjYWxhciArIGNvbG9ybWFwICsgd2luZG93IHRoYXQgY29sb3VyIHRoZSAzRCBjbG91ZC5cbiAgICpcbiAgICogQ29udGludW91cyBkYXRhIGlzIHRoZSBuYXR1cmFsIGZpdDogdmFsdWVzIGdvIHN0cmFpZ2h0IHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCB3aXRoIHRoZVxuICAgKiBzYW1lIHBlcmNlbnRpbGUgd2luZG93IHRoZSAyRCBwYXRoIHVzZXMuIENhdGVnb3JpY2FsIGRhdGEgaGFzIHRvIGJlIHNtdWdnbGVkIHRocm91Z2ggdGhlIHNhbWVcbiAgICogc2NhbGFyIGNoYW5uZWwg4oCUIHNlZSB7QGxpbmsgU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFU30uIENvZGVzIG1hcCB0byBMVVQgYmxvY2tzLCBhbmRcbiAgICogYGNvbnRyYXN0TGltaXRzYCBvZiBgWy0wLjUsIEsgLSAwLjVdYCBwdXRzIGNvZGUgYGlgIGF0IHRoZSBjZW50cmUgb2YgYmxvY2sgYGlgLCB3aGljaCBpcyB3aGF0XG4gICAqIG1ha2VzIHRoZSByb3VuZC10cmlwIGV4YWN0IGluc3RlYWQgb2YgYXBwcm94aW1hdGVseSByaWdodC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3BhdGlhbFNjYWxhcjNkKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICApOiBQcm9taXNlPFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2xvckJ5KSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICBjb25zdCBjb2x1bW46IFNwYXRpYWxDb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbChjb2x1bW4uY29kZXMsIHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICAgICAgY29sdW1uLnZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0aGlzLmVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsIHZpZXcsIHZpZXcubG9nU2NhbGUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDYXRlZ29yeSBjb2RlcyDihpIgYSBzdGVwcGVkIExVVCwgZXhhY3QgZm9yIHVwIHRvIHtAbGluayBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfS4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbChjb2RlczogVWludDE2QXJyYXksIGNvbG9yczogc3RyaW5nW10pOiBTcGF0aWFsM2RFbmNvZGluZyB8IG51bGwge1xuICAgIC8vIFNsb3QgMCBpcyByZXNlcnZlZCBmb3IgXCJubyBjYXRlZ29yeVwiLCBzbyB0aGUgcGFsZXR0ZSBvY2N1cGllcyAxLi5LIGFuZCB0aGVcbiAgICAvLyBibG9jayBjb3VudCBpcyBvbmUgbW9yZSB0aGFuIHRoZSBjYXRlZ29yeSBjb3VudCDigJQgd2hpY2ggaXMgd2h5IHRoZSBwdWJsaXNoZWRcbiAgICAvLyBjZWlsaW5nIGlzIDk1IGNhdGVnb3JpZXMgcmF0aGVyIHRoYW4gdGhlIExVVCdzIDk2IGRpc3Rpbmd1aXNoYWJsZSBibG9ja3MuXG4gICAgaWYgKGNvbG9ycy5sZW5ndGggPiBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSAke2NvbG9ycy5sZW5ndGh9IGNhdGVnb3JpZXMgZXhjZWVkcyB0aGUgJHtTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfSB0aGUgM0QgYFxuICAgICAgICArIFwibGF5ZXIncyAyNTYtZW50cnkgTFVUIGNhbiBob2xkIGRpc3RpbmN0bHk7IGRyYXdpbmcgZmxhdCBpbnN0ZWFkIG9mIHdpdGggd3JvbmcgY29sb3Vyc1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBrID0gY29sb3JzLmxlbmd0aCArIDE7XG4gICAgY29uc3QgcGFsZXR0ZTogUmdiW10gPSBbXG4gICAgICBNSVNTSU5HX0NPTE9SLFxuICAgICAgLi4uY29sb3JzLm1hcChwYXJzZUhleCksXG4gICAgXTtcbiAgICBjb25zdCBsdXQ6IFJnYltdID0gbmV3IEFycmF5KExVVF9TSVpFKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IExVVF9TSVpFOyBqKyspIHtcbiAgICAgIGx1dFtqXSA9IHBhbGV0dGVbTWF0aC5taW4oayAtIDEsIE1hdGguZmxvb3IoKGogKiBrKSAvIExVVF9TSVpFKSldO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNvZGVzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzW2ldID0gY29kZXNbaV0gPT09IE5PX0NBVEVHT1JZID8gMCA6IGNvZGVzW2ldICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtY2F0ZWdvcmllcycsIGx1dCksXG4gICAgICBjb250cmFzdExpbWl0czogWy0wLjUsIGsgLSAwLjVdLFxuICAgIH07XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIHRoZSBhY3RpdmUgY29sb3JtYXAgb3ZlciBhIHBlcmNlbnRpbGUtY2xpcHBlZCB3aW5kb3cuICovXG4gIHByaXZhdGUgZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICBzb3VyY2U6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgbG9nOiBib29sZWFuLFxuICApOiBTcGF0aWFsM2RFbmNvZGluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgY29uc3QgbHV0ID0gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gICAgICBub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXAsXG4gICAgKTtcbiAgICBjb25zdCBbbG8sIGhpXSA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGxldCB2YWx1ZXMgPSBzb3VyY2U7XG4gICAgaWYgKGxvZykge1xuICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShzb3VyY2UubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB2YWx1ZXNbaV0gPSBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIHNvdXJjZVtpXSkpO1xuICAgIH1cbiAgICBjb25zdCBbbWluLCBtYXhdID0gY29udHJhc3RXaW5kb3codmFsdWVzLCBsbywgaGkpO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZXMsXG4gICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWNvbnRpbnVvdXMnLCBsdXQpLFxuICAgICAgLy8gQSBkZWdlbmVyYXRlIHdpbmRvdyB3b3VsZCBkaXZpZGUgYnkgemVybyBpbiB0aGUgc2hhZGVyJ3Mgbm9ybWFsaXNhdGlvbi5cbiAgICAgIGNvbnRyYXN0TGltaXRzOiBtYXggPiBtaW4gPyBbbWluLCBtYXhdIDogW21pbiwgbWluICsgMV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItb2JzZXJ2YXRpb24gY29sb3VycyBmb3IgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSwgb3IgYSBzaW5nbGUgZmxhdCBjb2xvdXIgd2hlbiBub3RoaW5nIGlzXG4gICAqIHNlbGVjdGVkIHRvIGNvbG91ciBieS4gQ2F0ZWdvcmljYWwgY29sdW1ucyB1c2UgdGhlIGNvbHVtbidzIG93biBwYWxldHRlOyBjb250aW51b3VzIGNvbHVtbnNcbiAgICogYW5kIGdlbmUgdmVjdG9ycyBnbyB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgd2l0aCBhIHBlcmNlbnRpbGUtY2xpcHBlZCB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNwYXRpYWxGYWNlQ29sb3JzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIHRvUmdiYVR1cGxlcz4gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgLy8gRXZlcnl0aGluZyBOT1Qgc2VsZWN0ZWQgaXMgbXV0ZWQ7IHdpdGggbm90aGluZyBzZWxlY3RlZCwgbm90aGluZyBpcyBtdXRlZFxuICAgIC8vIGFuZCB0aGUgd2hvbGUgdGlzc3VlIHJlYWRzIG5vcm1hbGx5ICh0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZSkuXG4gICAgY29uc3QgbXV0ZWQgPSBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTtcblxuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkge1xuICAgICAgY29uc3QgW3IsIGcsIGJdID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgLy8gR2VudWluZWx5IHVuaWZvcm06IG9uZSBicm9hZGNhc3QgdHVwbGUsIHNvIGEgZmxhdCA4NGstb2JzZXJ2YXRpb24gdmlld1xuICAgICAgLy8gZG9lcyBub3QgYWxsb2NhdGUgODRrIG9mIHRoZW0uXG4gICAgICBpZiAoIW11dGVkICYmIHZpZXcub3BhY2l0eSA+PSAxKSByZXR1cm4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgLy8gTm90IHVuaWZvcm0g4oCUIHRoZSBvcGFjaXR5IGNvbnRyb2wgb3IgYSBzZWxlY3Rpb24gdmFyaWVzIHRoZSBhbHBoYSwgc28gaXRcbiAgICAgIC8vIGhhcyB0byBiZSBwZXItcG9pbnQuIFJldHVybmluZyB0aGUgY29uc3RhbnQgdHVwbGUgaGVyZSBpcyB3aGF0IG1hZGUgdGhlXG4gICAgICAvLyBPcGFjaXR5IHNsaWRlciBkbyBub3RoaW5nIGluIHRoZSBkZWZhdWx0IHN0YXRlLCB3aGljaCBpcyB0aGUgc3RhdGUgYW55b25lXG4gICAgICAvLyBsYW5kcyBpbiBiZWZvcmUgcGlja2luZyBhIGNvbG91ciBzb3VyY2UuXG4gICAgICBjb25zdCBoZXggPSBgIyR7W3IsIGcsIGJdLm1hcCgoYykgPT4gTWF0aC5yb3VuZChjICogMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YDtcbiAgICAgIHJldHVybiB0b1JnYmFUdXBsZXMoZW5jb2RlQ2F0ZWdvcmljYWwobmV3IFVpbnQxNkFycmF5KGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50KSwge1xuICAgICAgICBjb2xvcnM6IFtoZXhdLFxuICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgIG11dGVkLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICBjb25zdCBjb2x1bW46IFNwYXRpYWxDb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKGVuY29kZUNhdGVnb3JpY2FsKGNvbHVtbi5jb2Rlcywge1xuICAgICAgICAgIGNvbG9yczogcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSxcbiAgICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgICAgbXV0ZWQsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIC8vIEEgY29udGludW91cyBjb2x1bW4gbWF5IGNhcnJ5IGl0cyBvd24gbG9nIGhpbnQgKGNvdW50cyk7IHRoZSB2aWV3J3NcbiAgICAgIC8vIHRvZ2dsZSB3aW5zIG9uY2UgdGhlIHVzZXIgaGFzIHNldCBpdC5cbiAgICAgIHJldHVybiB0b1JnYmFUdXBsZXModGhpcy5lbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICAgICAgY29sdW1uLnZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSwgbXV0ZWQsXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKTtcbiAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKHRoaXMuZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsIHZpZXcsIHZpZXcubG9nU2NhbGUsIG11dGVkLFxuICAgICkpO1xuICB9XG5cbiAgLyoqIENvbnRpbnVvdXMgdmFsdWVzIOKGkiBSR0JBIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCBhbmQgYSBjbGlwcGVkIHdpbmRvdy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICB2YWx1ZXM6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgbG9nOiBib29sZWFuLFxuICAgIG11dGVkOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4gICk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgY29uc3QgbHV0ID0gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gICAgICBub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXAsXG4gICAgKTtcbiAgICBjb25zdCBbbG8sIGhpXSA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb250cmFzdFdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG4gICAgcmV0dXJuIGVuY29kZUNvbnRpbnVvdXModmFsdWVzLCB7IGx1dCwgbWluLCBtYXgsIGxvZywgb3BhY2l0eTogdmlldy5vcGFjaXR5LCBtdXRlZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIzRCAzRCBzY2F0dGVyOiB0aGUgZG93bnNhbXBsZWQgdm94ZWwgZ3JpZCBhcyBhIDNEIHBvaW50IGNsb3VkIGNvbG9yZWRcbiAgICogYnkgaW50ZW5zaXR5IChuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSdzIHZveGVsIHNjYXR0ZXIzZCkuIEFzc2VtYmxlcyBhIGNvYXJzZSB2b2x1bWUsIHRoZW5cbiAgICogZW1pdHMgYSBmbGF0LXN0cmlkZWQgc2FtcGxlIG9mIHZveGVscyAoY2FwcGVkIGF0IHtAbGluayBTQ0FUVEVSM0RfTUFYX1BPSU5UU30pIHZpYSBgYWRkUG9pbnRzM0RgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNjYXR0ZXIzZCh2aWV3ZXI6IFZpZXdlciwgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIGxldCB2b2w6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHtcbiAgICAgICAgbWF4U2xpY2U6IE1hdGgubWluKHJlcy5tYXhTbGljZSwgU0NBVFRFUjNEX01BWF9YWSksXG4gICAgICAgIHNsaWNlU3RlcDogcmVzLnNsaWNlU3RlcCxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgICBpZiAoIXZvbCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB2b2w7XG4gICAgY29uc3QgelNjYWxlID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgLyBNYXRoLm1heCgxLCBkZXB0aCk7IC8vIOKJiCBjdWJpYyBhc3BlY3RcbiAgICBjb25zdCB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogZGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gU0NBVFRFUjNEX01BWF9QT0lOVFMpKTtcbiAgICBjb25zdCBwb3M6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdmFsOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICBjb25zdCB4ID0gaSAlIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHdpZHRoKSAlIGhlaWdodDtcbiAgICAgIGNvbnN0IHppID0gTWF0aC5mbG9vcihpIC8gKHdpZHRoICogaGVpZ2h0KSk7XG4gICAgICBwb3MucHVzaCh4LCB5LCB6aSAqIHpTY2FsZSk7XG4gICAgICB2YWwucHVzaChkYXRhW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKVswXTtcbiAgICB0aGlzLnNjYXR0ZXIzZExheWVyID0gdmlld2VyLmFkZFBvaW50czNEKG5ldyBGbG9hdDMyQXJyYXkocG9zKSwgbmV3IEZsb2F0MzJBcnJheSh2YWwpLCB7XG4gICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgc2l6ZTogMyxcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlVyA9IHdpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IHsgd2lkdGgsIGhlaWdodCwgZGVwdGggfTtcbiAgICAvLyBGZWVkIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIGZyb20gdGhlIGFzc2VtYmxlZCB2b2x1bWUgKGtleSAwKS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgZGF0YSk7XG4gICAgdGhpcy5zdWJzY3JpYmVTY2F0dGVyM2REaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiBTdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIDNEIHNjYXR0ZXIncyBjb2xvcm1hcCArIGNvbnRyYXN0LiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVNjYXR0ZXIzZERpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMuc2NhdHRlcjNkTGF5ZXI7XG4gICAgICBpZiAoIWxheWVyKSByZXR1cm47XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgbGF5ZXIuY29sb3JtYXAgPSB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KTtcbiAgICAgIGlmIChzdCkgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbc3QubWluLCBzdC5tYXhdO1xuICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NVUkZBQ0UgaGVpZ2h0LWZpZWxkIHN1cmZhY2UuIEEgaGVpZ2h0IGZpZWxkIGlzIHNpbmdsZS1zY2FsYXIsIHNvIGZvciBhXG4gICAqIG11bHRpY2hhbm5lbCBpbWFnZSB0aGUgc3VyZmFjZSBmb2xsb3dzIE9ORSBiYW5kIOKAlCB0aGUgZmlyc3QgdmlzaWJsZSBjaGFubmVsIChmYWxsYmFjayAwKSDigJRcbiAgICogY29sb3VyZWQgYnkgdGhhdCBjaGFubmVsJ3Mgd2luZG93L2NvbG9ybWFwIChsaWtlIHRoZSBQbG90bHkgU1VSRkFDRSwgd2hpY2ggaXMgZ3JheXNjYWxlLW9ubHkpLlxuICAgKiBQcmUtbG9hZHMgZXZlcnkgc2xpY2UncyBoZWlnaHQgZGF0YSB3aXRoIGEgcHJvZ3Jlc3MgYmFyIChhcyB0aGUgdm9sdW1lIGRvZXMpIHNvIHRoZSBzdGFja1xuICAgKiBzbGlkZXIgcmUtc2xpY2VzIGluc3RhbnRseSwgdGhlbiBidWlsZHMgdGhlIG1lc2ggZm9yIHRoZSBjdXJyZW50IHNsaWNlLiBBbGwgbWVzaCArIEdQVSB3b3JrXG4gICAqIGxpdmVzIGluIG5hcGFyaS1qcyAoYGhlaWdodEZpZWxkYCArIGBWaWV3ZXIuYWRkU3VyZmFjZWApOyB0aGlzIGJhY2tlbmQgc3VwcGxpZXMgc2NhbGFyIHNsaWNlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTdXJmYWNlKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsICh0aWxlZDpmYWxzZSArIGNoYW5uZWxVcmxzKSBoYXMgbm8gZGVzY3JpcHRvciDigJQgZGV0ZWN0XG4gICAgLy8gaXQgZnJvbSBpbWFnZU1ldGEgc28gdGhlIFN1cmZhY2Ugc3RpbGwgZm9sbG93cyBvbmUgYmFuZC5cbiAgICBjb25zdCBzaW1wbGVNYyA9IHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykgJiYgISFpbmZvPy5jaGFubmVsVXJscz8ubGVuZ3RoXG4gICAgICAmJiAoaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDE7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIChkZXNjPy5jaGFubmVscyA/PyAxKSA+IDEpO1xuICAgIHRoaXMuc3VyZmFjZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICAvLyBBIGhlaWdodCBmaWVsZCBpcyBzaW5nbGUtc2NhbGFyIOKGkiBmb2xsb3cgdGhlIHBhbmUtU0VMRUNURUQgY2hhbm5lbC5cbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gbXVsdGljaGFubmVsID8gdGhpcy5zdG9yZS5jdXJyZW50U2VsZWN0ZWRDaGFubmVsKCkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdXJmYWNlTWF4R3JpZCA9IHN1cmZhY2VSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKS5tYXhHcmlkO1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLnByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcik7XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkU3VyZmFjZSh2aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgIHRoaXMuaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcik7XG4gICAgLy8gU3Vic2NyaWJlIGFmdGVyIHRoZSBmaXJzdCBidWlsZCBzbyBkaXNwbGF5LXN0YXRlIGVkaXRzIHRhcmdldCBhIGxpdmUgbGF5ZXIuXG4gICAgdGhpcy5zdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk7XG4gIH1cblxuICAvKiogQWRkIHRoZSAzRCBheGVzIGdpem1vICsgRE9NIGxhYmVscyBhcm91bmQgdGhlIChvcmlnaW4tY2VudGVyZWQpIHN1cmZhY2UgbWVzaCwgbWF0Y2hpbmcgdGhlXG4gICAqICB2b2x1bWUvaXNvc3VyZmFjZS4gSW5zdGFsbGVkIG9uY2UgcGVyIG1vdW50OyB0aGUgYm94IHRyYWNrcyB0aGUgbWVzaCBib3VuZHMsIFgvWSBzaG93IHRoZVxuICAgKiAgcGh5c2ljYWwgKG9yIHBpeGVsKSBleHRlbnQsIGFuZCBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuICovXG4gIHByaXZhdGUgaW5zdGFsbFN1cmZhY2VBeGVzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN1cmZhY2VMYXllcikgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSB0aGlzLnN1cmZhY2VMYXllci5ib3VuZHMoKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5tYXgoMSwgYi5tYXhbMF0gLSBiLm1pblswXSk7XG4gICAgY29uc3QgYm94SCA9IE1hdGgubWF4KDEsIGIubWF4WzFdIC0gYi5taW5bMV0pO1xuICAgIGNvbnN0IGJveEQgPSBNYXRoLm1heCgxLCBiLm1heFsyXSAtIGIubWluWzJdKTtcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF0/Lm1wcFggfHwgMDtcbiAgICBjb25zdCB2b3hlbCA9IG1wcFggPiAwID8gKG1wcFggKiAodGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVykpIC8gTWF0aC5tYXgoMSwgdGhpcy5pbWFnZVcpIDogMTtcbiAgICB0aGlzLmF4ZXNMYXllciA9IHZpZXdlci5hZGRBeGVzKGJveFcsIGJveEgsIGJveEQsIHtcbiAgICAgIHZveGVsU2l6ZTogW3ZveGVsLCB2b3hlbCwgMV0sXG4gICAgICB2aXNpYmxlOiB0aGlzLmF4ZXNWaXNpYmxlLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMuYXhlc0xhYmVscyA9IG5ldyBOYXBhcmlBeGVzTGFiZWxzKFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIHZpZXdlci5jYW1lcmEzZCxcbiAgICAgICAgdGhpcy5idWlsZFN1cmZhY2VBeGVzTGFiZWxzKGJveFcsIGJveEgsIGJveEQsIG1wcFgpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXhlc0xhYmVscy5zZXRWaXNpYmxlKHRoaXMuYXhlc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBYL1kvWiBlbmQtbGFiZWxzIGZvciB0aGUgc3VyZmFjZSBnaXptbzogWC9ZIGFyZSB0aGUgcGh5c2ljYWwgKMK1bSkgb3IgcGl4ZWwgZXh0ZW50IG9mIHRoZSBGVUxMXG4gICAqICBpbWFnZTsgWiBpcyB0aGUgaW50ZW5zaXR5L2hlaWdodCBheGlzLiBBbmNob3JzIGFyZSBpbiB0aGUgY2VudGVyZWQgYm94IChtYXRjaGluZyBBeGVzTGF5ZXIpLiAqL1xuICBwcml2YXRlIGJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoXG4gICAgYm94VzogbnVtYmVyLFxuICAgIGJveEg6IG51bWJlcixcbiAgICBib3hEOiBudW1iZXIsXG4gICAgbXBwWDogbnVtYmVyLFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gYm94VyAvIDI7XG4gICAgY29uc3QgaHkgPSBib3hIIC8gMjtcbiAgICBjb25zdCBoeiA9IGJveEQgLyAyO1xuICAgIGNvbnN0IGRlc2NXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyB0aGlzLmltYWdlVztcbiAgICBjb25zdCBkZXNjSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IHRoaXMuaW1hZ2VIO1xuICAgIGNvbnN0IGxlbiA9IChweDogbnVtYmVyKTogc3RyaW5nID0+IChtcHBYID4gMCA/IGZvcm1hdFVtKHB4ICogbXBwWCkgOiBgJHtweH0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihkZXNjVyl9YCwgY29sb3I6ICcjZWQ0NTQ1JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihkZXNjSCl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIC1oeSwgaHpdLCB0ZXh0OiAnWiDCtyBpbnRlbnNpdHknLCBjb2xvcjogJyM2NjhjZmYnIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtZmV0Y2ggZXZlcnkgc3RhY2sgc2xpY2UncyBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byB0aGUgc3VyZmFjZSBncmlkKSBpbnRvXG4gICAqIHtAbGluayBzdXJmYWNlUGxhbmVzfSwgZHJpdmluZyB7QGxpbmsgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkfSDigJQgdGhlIHNhbWUgbG9hZC13aXRoLXByb2dyZXNzIFVYXG4gICAqIGFzIHRoZSB2b2x1bWUsIGJ1dCBrZWVwaW5nIG9uZSAyRCBwbGFuZSBwZXIgc2xpY2UgcmF0aGVyIHRoYW4gcGFja2luZyBhIDNEIHZvbHVtZS4gQm91bmRlZFxuICAgKiBjb25jdXJyZW5jeSBrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGJ1c3kgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXAgc3RhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWxvYWRTdXJmYWNlUGxhbmVzKHZpZXdlcjogVmlld2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXMgd2hpbGUgd2UgZmV0Y2hcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXB0aCA9IGluZm8/LmltYWdlTWV0YT8uWzBdPy56IHx8IGluZm8/LnVybHM/Lmxlbmd0aCB8fCAxO1xuICAgIGNvbnN0IHsgbWF4R3JpZCB9ID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IGRlcHRoOyB6KyspIHBlbmRpbmcucHVzaCh6KTtcbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHogPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHogPT09IHVuZGVmaW5lZCB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIGF3YWl0IHRoaXMuZmV0Y2hTdXJmYWNlUGxhbmUoeiwgbWF4R3JpZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlICR7en0gcHJlbG9hZCBmYWlsZWRgLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb25lKys7XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChkb25lIC8gZGVwdGgpICogMTAwKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBwb29sID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9vbCB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBzbGljZSBgemAgYXMgYSBzaW5nbGUgV0hPTEUtaW1hZ2UgbHVtaW5hbmNlIHBsYW5lIChkZWNpbWF0ZWQgdG8gYG1heEdyaWRgKS4gUHJlZmVycyB0aGVcbiAgICogYXBwJ3MgY29tcGxldGUgcGVyLXNsaWNlIGltYWdlIChgc21hbGxVcmxzYC9gdXJsc2AsIGV4YWN0bHkgbGlrZSB0aGUgUGxvdGx5IHN1cmZhY2UpIHNvIHRoZVxuICAgKiBzdXJmYWNlIGFsd2F5cyBjb3ZlcnMgdGhlIEZVTEwgc2xpY2Ug4oCUIHRoZSB0aWxlLXB5cmFtaWQgYGZldGNoU2xpY2VgIHBhdGggd291bGQgZmFsbCBiYWNrIHRvIGFcbiAgICogc2luZ2xlIHRvcC1sZWZ0IHRpbGUgKGEgY29ybmVyKSBmb3Igc2VsZi1jb250YWluZWQgLyBub24tYC90aWxlcy9pbmZvYCBpbWFnZXMuIEZhbGxzIGJhY2sgdG9cbiAgICogc3RpdGNoaW5nIHRoZSB0aWxlIGdyaWQgb25seSB3aGVuIG5vIGNvbXBsZXRlLWltYWdlIFVSTCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICAvKiogVGlsZSBidWRnZXQgdG8gc3RpdGNoIGEgd2hvbGUgc2xpY2UgYXQgfmB0YXJnZXRQeGAgcmVzb2x1dGlvbiBmcm9tIHRoZSBweXJhbWlkOiBhIGhpZ2hlciB0YXJnZXRcbiAgICogIHB1bGxzIGEgRklORVIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCBhbmQgdGhlIHZvbHVtZVxuICAgKiAgYXNzZW1ibHkgc28gYm90aCBzY2FsZSB0aGVpciBpbi1wbGFuZSByZXNvbHV0aW9uIHdpdGggdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB0aWxlQnVkZ2V0Rm9yKHRhcmdldFB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5kZXNjcmlwdG9yPy50aWxlU2l6ZSB8fCBUSUxFX1NJWkU7XG4gICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgTUFYX1NUSVRDSF9USUxFUyxcbiAgICAgIE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHRhcmdldFB4IC8gdGlsZVNpemUpICoqIDIgKiBTVElUQ0hfQlVER0VUX0NPRUZGKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdXJmYWNlUGxhbmUoXG4gICAgejogbnVtYmVyLFxuICAgIG1heEdyaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgbGV0IHBsYW5lOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFByZWZlcnJlZDogc3RpdGNoIHRoZSBXSE9MRSBzbGljZSBmcm9tIHRoZSBzZXJ2ZXIgcHlyYW1pZCBhdCBhIHJlc29sdXRpb24gZHJpdmVuIGJ5IHRoZVxuICAgIC8vIGRlY2ltYXRlIGZhY3RvciDigJQgYSBoaWdoZXIgdGFyZ2V0IGdyaWQgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gV2l0aCBhXG4gICAgLy8gZGVzY3JpcHRvciwgZmV0Y2hTbGljZSBzdGl0Y2hlcyB0aGUgd2hvbGUgY2hvc2VuIGxldmVsIChuZXZlciBhIGNvcm5lciksIHRoZW4gd2UgZG93bnNjYWxlIHRvXG4gICAgLy8gdGhlIGdyaWQuIFRoaXMgaXMgd2hhdCBtYWtlcyBcIkZ1bGxcIiBhY3R1YWxseSBoaWdoZXItcmVzIHRoYW4gXCLCvVwiLCBub3QganVzdCBhIGZpeGVkIHByZXZpZXcuXG4gICAgaWYgKGRlc2M/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCk7XG4gICAgICAvLyBUaGUgc3VyZmFjZSBpcyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUsIHNvIHRoZSBjb21wb3NpdGUgZmFsbGJhY2sgaXMgYWNjZXB0YWJsZSB3aGVuIHRoZVxuICAgICAgLy8gY2hhbm5lbCBoYXMgbm8gc21hbGwgcHlyYW1pZCBsZXZlbCAoa2VlcHMgaXQgZmFzdCk7IGEgbXVsdGljaGFubmVsIFZPTFVNRSBtdXN0IG5vdCBkbyB0aGlzLlxuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgYnVkZ2V0LCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgKG5vIHB5cmFtaWQpOiB0aGUgYXBwJ3MgQ09NUExFVEUgcGVyLXNsaWNlIGltYWdlICh1cmxzW3pdLCBub3QgdGhlIHNtYWxsIGJsdXJyeVxuICAgIC8vIHRodW1ibmFpbCkg4oCUIHdob2xlIHNsaWNlLCBhdm9pZHMgYSBjb3JuZXIgdGlsZS4gQ2FwcGVkIGF0IHRoZSBpbWFnZSdzIG93biByZXNvbHV0aW9uLlxuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIGNvbnN0IHVybCA9IGluZm8/LnVybHM/Llt6XSA/PyBpbmZvPy5zbWFsbFVybHM/Llt6XTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgICBpZiAocmVzcC5vaykge1xuICAgICAgICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKSwgbWF4R3JpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2UgdXJsIGZldGNoIGZhaWxlZCBmb3Igej0ke3p9YCwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExhc3QgcmVzb3J0IChubyBweXJhbWlkIGFuZCBubyBjb21wbGV0ZSBpbWFnZSk6IGEgc2luZ2xlIHRpbGUuXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgcGxhbmUgPSB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdGhpcy5zdXJmYWNlQ2hhbm5lbCwgdGhpcy50aWxlQnVkZ2V0Rm9yKG1heEdyaWQpLCB0cnVlKSxcbiAgICAgICAgbWF4R3JpZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwbGFuZTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hhbm5lbCBzdGF0ZSBkcml2aW5nIHRoZSBzdXJmYWNlOiB0aGUgY2hvc2VuIGJhbmQgZm9yIG11bHRpY2hhbm5lbCAobWF0Y2hlZCBieSBpbmRleCksXG4gICAqICBlbHNlIHRoZSBzaW5nbGUgZ3JheXNjYWxlIGNoYW5uZWwuICovXG4gIHByaXZhdGUgc3VyZmFjZVN0YXRlKGNoYW5uZWxzOiBJQ2hhbm5lbFN0YXRlW10pOiBJQ2hhbm5lbFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5zdXJmYWNlQ2hhbm5lbCA9PSBudWxsKSByZXR1cm4gY2hhbm5lbHNbMF07XG4gICAgcmV0dXJuIGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpID8/IGNoYW5uZWxzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIChSZSlidWlsZCB0aGUgc3VyZmFjZSBtZXNoIGZvciBzbGljZSBgemAgZnJvbSB0aGUgcHJlLWxvYWRlZCBwbGFuZSBjYWNoZSAoaW5zdGFudCDigJQgdGhpcyBpc1xuICAgKiB3aGF0IHRoZSBzdGFjayBzbGlkZXIgY2FsbHMpOyBhIHNsaWNlIG1pc3NpbmcgZnJvbSB0aGUgY2FjaGUgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuIG5hcGFyaS1qcydzXG4gICAqIHB1cmUgYGhlaWdodEZpZWxkYCBidWlsZHMgdGhlIHRyaWFuZ2xlIGdyaWQgKHogPSBub3JtYWxpemVkIGludGVuc2l0eSksIHRoZW4gYGFkZFN1cmZhY2VgXG4gICAqIHJlbmRlcnMgaXQuIFRoZSBzbGljZSBwbGFuZSBhbHNvIGZlZWRzIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtIChrZXkgMCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3VyZmFjZSh2aWV3ZXI6IFZpZXdlciwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBsYW5lID0gdGhpcy5zdXJmYWNlUGxhbmVzLmdldCh6KTtcbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBsYW5lID0gYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCB0aGlzLnN1cmZhY2VNYXhHcmlkKTtcbiAgICAgICAgdGhpcy5zdXJmYWNlUGxhbmVzLnNldCh6LCBwbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSBzbGljZSBmZXRjaCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwbGFuZSB8fCBwbGFuZS53aWR0aCA8IDIgfHwgcGxhbmUuaGVpZ2h0IDwgMiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSk7XG4gICAgY29uc3Qgd2luOiBbbnVtYmVyLCBudW1iZXJdID0gW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IHdpbjtcbiAgICAvLyBIZWlnaHQgQU5EIGNvbG91ciBhcmUgbm9ybWFsaXplZCBieSB0aGUgc2FtZSBjb250cmFzdCB3aW5kb3csIHNvIGNoYW5naW5nIG1pbi9tYXggcmVzaGFwZXMgdGhlXG4gICAgLy8gc3VyZmFjZSAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSkuIENlbnRlciBpdCBmb3IgdGhlIGF4ZXMgZ2l6bW8uIFRoZVxuICAgIC8vIHBsYW5lIGlzIGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBncmlkIGNhcCDihpIgc3RyaWRlIDEuXG4gICAgY29uc3QgelNjYWxlID0gU1VSRkFDRV9aX0FTUEVDVCAqIE1hdGgubWF4KHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQpO1xuICAgIGNvbnN0IHsgdmVydGljZXMsIGZhY2VzLCB2YWx1ZXMgfSA9IGhlaWdodEZpZWxkKHBsYW5lLmRhdGEsIHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQsIHtcbiAgICAgIHpTY2FsZSxcbiAgICAgIHpMaW1pdHM6IHdpbixcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFByZXNlcnZlIHRoZSBvcmJpdCBjYW1lcmEgYWNyb3NzIGEgcmUtc2xpY2UgLyB3aW5kb3cgcmVidWlsZCDigJQgb25seSB0aGUgZmlyc3QgbW91bnQgZnJhbWVzLCBzb1xuICAgIC8vIHN0ZXBwaW5nIHRoZSBzdGFjayBvciBjaGFuZ2luZyB0aGUgd2luZG93IGtlZXBzIHRoZSBjdXJyZW50IHpvb20vcGFuL29yaWVudGF0aW9uLlxuICAgIGNvbnN0IGNhbSA9IHZpZXdlci5jYW1lcmEzZDtcbiAgICBjb25zdCBwcmVzZXJ2ZUNhbWVyYSA9IHRoaXMuc3VyZmFjZUxheWVyICE9IG51bGw7XG4gICAgY29uc3Qgc2F2ZWRUYXJnZXQgPSBjYW0udGFyZ2V0O1xuICAgIGNvbnN0IHNhdmVkRGlzdGFuY2UgPSBjYW0uZGlzdGFuY2U7XG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnN1cmZhY2VMYXllcik7XG4gICAgICB0aGlzLnN1cmZhY2VMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gdmlld2VyLmFkZFN1cmZhY2UodmVydGljZXMsIGZhY2VzLCB2YWx1ZXMsIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiB3aW4sXG4gICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICB3aXJlZnJhbWU6IHRoaXMuc3VyZmFjZVdpcmVmcmFtZSxcbiAgICB9KTtcbiAgICBpZiAocHJlc2VydmVDYW1lcmEpIHtcbiAgICAgIGNhbS50YXJnZXQgPSBzYXZlZFRhcmdldDtcbiAgICAgIGNhbS5kaXN0YW5jZSA9IHNhdmVkRGlzdGFuY2U7XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZVcgPSBwbGFuZS53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IHBsYW5lLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoOiBwbGFuZS53aWR0aCwgaGVpZ2h0OiBwbGFuZS5oZWlnaHQsIGRlcHRoOiBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHpTY2FsZSkpIH07XG4gICAgLy8gUmV1c2UgdGhlIHZvbHVtZSBpbnRlbnNpdHktaGlzdG9ncmFtIHBhdGg6IHRoZSBzbGljZSdzIHNjYWxhciBwbGFuZSBpcyB0aGUgaGlzdG9ncmFtIHNvdXJjZS5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgcGxhbmUuZGF0YSk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIHN1cmZhY2UsIHNvIGhpc3RvZ3JhbVxuICAgKiAgJiBjaGFubmVsLWRpYWxvZyBlZGl0cyB1cGRhdGUgaXQgbGl2ZSB3aXRob3V0IGEgcmUtZmV0Y2guICoqbWluL21heCByZXNoYXBlcyB0aGUgc3VyZmFjZSdzXG4gICAqICBoZWlnaHQqKiAoYSBwaXhlbCdzIGhlaWdodCA9IGl0cyBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGEgd2luZG93IGNoYW5nZSByZWJ1aWxkcyB0aGVcbiAgICogIG1lc2ggZ2VvbWV0cnkgKGZyb20gdGhlIGNhY2hlZCBzbGljZSk7IGNvbG91ci1vbmx5IGVkaXRzIChjb2xvcm1hcC9MVVQsIGdhbW1hLCByZXZlcnNlLCBpbnZlcnQpXG4gICAqICBqdXN0IHVwZGF0ZSB0aGUgbGF5ZXIncyB1bmlmb3Jtcy4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTdXJmYWNlRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFNlbGVjdGVkQ2hhbm5lbCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQsIGNoYW5uZWxzLCBzZWxlY3RlZF0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN1cmZhY2VMYXllcjtcbiAgICAgIGlmICghbGF5ZXIgfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAvLyBTZWxlY3RlZCBjaGFubmVsIGNoYW5nZWQgKG11bHRpY2hhbm5lbCk6IHJlLWZldGNoIFRIQVQgYmFuZCdzIHBsYW5lcyBhbmRcbiAgICAgIC8vIHJlYnVpbGQgdGhlIGhlaWdodC1maWVsZCBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuXG4gICAgICBpZiAodGhpcy5zdXJmYWNlTXVsdGljaGFubmVsICYmIHNlbGVjdGVkICE9PSB0aGlzLnN1cmZhY2VDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc3VyZmFjZUNoYW5uZWwgPSBzZWxlY3RlZDtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJlbG9hZFN1cmZhY2VQbGFuZXModGhpcy52aWV3ZXIhKTtcbiAgICAgICAgICBpZiAodGhpcy52aWV3ZXIpIGF3YWl0IHRoaXMuYnVpbGRTdXJmYWNlKHRoaXMudmlld2VyLCB0aGlzLmxvYWRlZD8ueiA/PyAwKTtcbiAgICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIGNoYW5uZWwgc3dpdGNoIGZhaWxlZDonLCBlcnIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3QgPSB0aGlzLnN1cmZhY2VTdGF0ZShjaGFubmVscyk7XG4gICAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgICBjb25zdCB3aW5kb3dDaGFuZ2VkID1cbiAgICAgICAgIXRoaXMuc3VyZmFjZVdpbmRvdyB8fCB3aW5bMF0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1swXSB8fCB3aW5bMV0gIT09IHRoaXMuc3VyZmFjZVdpbmRvd1sxXTtcbiAgICAgIGlmICh3aW5kb3dDaGFuZ2VkKSB7XG4gICAgICAgIC8vIEhlaWdodCBmb2xsb3dzIHRoZSBjb250cmFzdCB3aW5kb3cg4oaSIHJlYnVpbGQgdGhlIG1lc2ggZm9yIHRoZSBuZXcgW21pbixtYXhdIChjYW1lcmEga2VwdCkuXG4gICAgICAgIHZvaWQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApLmNhdGNoKChlcnIpID0+XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSB3aW5kb3cgcmVidWlsZCBmYWlsZWQ6JywgZXJyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQ29sb3VyLW9ubHkgY2hhbmdlOiB1cGRhdGUgdW5pZm9ybXMgaW4gcGxhY2UsIG5vIGdlb21ldHJ5IHJlYnVpbGQuXG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSB7XG4gICAgICAgIGxheWVyLmNvbnRyYXN0TGltaXRzID0gd2luO1xuICAgICAgICBsYXllci5nYW1tYSA9IHN0LmdhbW1hO1xuICAgICAgfVxuICAgICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXRDYW1lcmFTb29uKCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmNhbnZhcyAmJiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2VyLmNhbWVyYS5maXQoXG4gICAgICAgICAgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5pbWFnZUgsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdGhpcy5pbWFnZVcsXG4gICAgICAgICAgdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0IHx8IHRoaXMuaW1hZ2VILFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHJlcXVlc3RBbmltYXRpb25GcmFtZShydW4pO1xuICAgIGVsc2UgcnVuKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljOyBob3N0IHJlLWRyaXZlcyBwbG90KCkgZnJvbSBpdHMgaW1hZ2Ugc3RyZWFtLiAqL1xuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIG5vLW9wICovXG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRUb2tlbisrOyAvLyBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgZnJhbWUgbG9hZGluZyBmcm9tIHRoZSBwcmV2aW91cyBwbG90XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheT8uZGVzdHJveSgpO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG51bGw7XG4gICAgdGhpcy5heGVzTGFiZWxzPy5kZXN0cm95KCk7XG4gICAgdGhpcy5heGVzTGFiZWxzID0gbnVsbDtcbiAgICB0aGlzLnpIYW5kbGU/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnpIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmxhc3RQaXhlbHNSZWN0ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgICB0aGlzLnRpbGVkID0gZmFsc2U7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmPy4oKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gbnVsbDtcbiAgICB0aGlzLmNoYW5uZWxWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3BhdGlhbFN1YiA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IG51bGw7XG4gICAgLy8gRHJvcCB0aGUgY2FjaGVkIGludGVybGVhdmVkIGNvb3JkaW5hdGVzIHRvbzogaG9sZGluZyAzLjdNIHggMyBmbG9hdHMgYWZ0ZXJcbiAgICAvLyBhIHRlYXJkb3duIGlzIH40NU1CIG9mIHJldGFpbmVkIGhlYXAgZm9yIGEgc2NlbmUgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gbnVsbDtcbiAgICAvLyBJbnZhbGlkYXRlIGFueSBjb2xvdXIgZmV0Y2ggc3RpbGwgaW4gZmxpZ2h0IHNvIGl0IGNhbid0IGF0dGFjaCB0byB0aGUgbmV4dCBzY2VuZS5cbiAgICB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4rKztcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IG51bGw7XG4gICAgdGhpcy5heGVzTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lRGltcyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICB9XG5cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF4aXMgcmVzZXQuICovXG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWMgYXV0b3NjYWxlLiAqL1xuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5hdXRvc2NhbGVFdmVudCQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAqIDEuMztcbiAgfVxuXG4gIHpvb21PdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyKSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSA9IHRoaXMudmlld2VyLmNhbWVyYS56b29tIC8gMS4zO1xuICB9XG5cbiAgc2V0RHJhZ01vZGUoX21vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gTm8tb3A6IHBhbiBhbmQgem9vbSBhcmUgYWx3YXlzIHRoZSBuYXBhcmkgY2FtZXJhJ3MgZGVmYXVsdCBnZXN0dXJlcywgYW5kIHBhbi96b29tIGdhdGluZyBmb3JcbiAgICAvLyBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSByZWdpb24gb3ZlcmxheSdzIHNldE1vZGUgKHNldENvbnRyb2xzRW5hYmxlZCkuIFRvZ2dsaW5nIGNvbnRyb2xzIGhlcmVcbiAgICAvLyB3b3VsZCBmaWdodCB0aGF0IOKAlCB0aGUgaG9zdCBjYWxscyBzZXREcmFnTW9kZShmYWxzZSkgYWxvbmdzaWRlIG92ZXJsYXkuc2V0TW9kZSg8dG9vbD4pLlxuICB9XG5cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZShfdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIG5hcGFyaS1qcyBoYXMgbm8gbWluaW1hcDsgbm8tb3AgKi9cbiAgfVxuXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZVNtb290aGluZyA9IGVuYWJsZWQ7XG4gICAgLy8gQXBwbHkgbGl2ZSB0byB0aGUgcmVuZGVyZWQgaW1hZ2UgbGF5ZXJzOyBiYWtlZCBpbnRvIHRoZSBuZXh0IHJlbmRlciB0b28uXG4gICAgdGhpcy5jaGFubmVsVmlldz8uc2V0SW50ZXJwb2xhdGlvbihlbmFibGVkID8gJ2xpbmVhcicgOiAnbmVhcmVzdCcpO1xuICB9XG5cbiAgc2V0U2hvd1N0YWNrKF9zaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBzdGFjayBuYXZpZ2F0ZWQgdmlhIHNldFpJbmRleCAqL1xuICB9XG5cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGVkKSB0aGlzLmxvYWRlZC56ID0gekluZGV4O1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICAvLyBTdXJmYWNlOiBvbmUgc2xpY2Ug4oaSIG9uZSBtZXNoLCBzbyByZS1idWlsZCB0aGUgaGVpZ2h0IGZpZWxkIGZvciB0aGUgbmV3IHNsaWNlLlxuICAgIGlmICh0aGlzLnN1cmZhY2VMYXllcikge1xuICAgICAgdm9pZCB0aGlzLmJ1aWxkU3VyZmFjZSh2LCB6SW5kZXgpLmNhdGNoKChlcnIpID0+XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzdXJmYWNlIGZhaWxlZDonLCBlcnIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogc3RlcCB0aGUgdm9sdW1lJ3MgeiBwbGFuZSBpbiBwbGFjZS5cbiAgICBpZiAodGhpcy52b2x1bWVWaWV3KSB7XG4gICAgICB2LmRpbXMueiA9IHpJbmRleDtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaWxlZCAyRCBpbWFnZToganVzdCBtb3ZlIHRoZSBkaW1zIHBsYW5lIOKAlCB0aGUgdGlsZWQgdmlzdWFsIGZldGNoZXMgdGhlIG5ldyBzbGljZSdzIHRpbGVzXG4gICAgLy8gKGNhY2hlZCBwZXIgeiksIG5vIGxheWVyIHJlYnVpbGQuIFJlZnJlc2ggdGhlIGNvYXJzZSBoaXN0b2dyYW0gc2FtcGxlIGZvciB0aGUgbmV3IHNsaWNlLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICB2LmRpbXMueiA9IHpJbmRleDtcbiAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHZvaWQgdGhpcy5yZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6SW5kZXgsIHRoaXMuZGVzY3JpcHRvcik7XG4gICAgICB0aGlzLnJlZHJhd1NwYXRpYWxNYXJrZXJzKCk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gMkQgaW1hZ2UgKHN0aXRjaCBmYWxsYmFjayk6IHJlLXJlbmRlciB0aGUgc2xpY2UgKHJlLWZldGNoZXMgcGVyLWNoYW5uZWwgLyBjb21wb3NpdGUpLiBCcmFuY2hcbiAgICAvLyBvZiBhIHZvbHVtZSBsYXllciAobm90IGN1cnJlbnRQbG90VHlwZSwgd2hpY2ggY291bGQgYmUgc3RhbGUgYW5kIHNpbGVudGx5IG5vLW9wIHRoZSBzd2FwKS5cbiAgICAvLyBUaGUgdG9rZW4gbGV0cyByZW5kZXJJbWFnZSBkcm9wIGEgc3VwZXJzZWRlZCBzY3J1YiBzbyBhIHNsb3cgb2xkZXIgc2xpY2UgY2FuJ3QgY2xvYmJlciBhIG5ld2VyIG9uZS5cbiAgICBjb25zdCByZXEgPSArK3RoaXMuc2xpY2VSZXE7XG4gICAgdm9pZCB0aGlzLnJlbmRlckltYWdlKHpJbmRleCwgcmVxKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAocmVxICE9PSB0aGlzLnNsaWNlUmVxKSByZXR1cm47XG4gICAgICAgIC8vIEFGVEVSIHRoZSBpbWFnZSwgbmV2ZXIgYmVmb3JlOiB0aGUgcmVuZGVyIGNsZWFycyB0aGUgbGF5ZXIgbGlzdCwgc29cbiAgICAgICAgLy8gbWFya2VycyBkcmF3biBmaXJzdCBhcmUgd2lwZWQgYnkgdGhlIHZlcnkgaW1hZ2UgbWVhbnQgdG8gc2l0IHVuZGVyIHRoZW0uXG4gICAgICAgIC8vIE92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhlIHBsYW5lIGFsc28gZGVjaWRlcyB3aGljaCBvYnNlcnZhdGlvbnNcbiAgICAgICAgLy8gYXJlIGRyYXduIGF0IGFsbCwgc28gdGhpcyBpcyB3aGF0IG1vdmVzIHRoZSBjZWxscyB3aXRoIHRoZSBzZWN0aW9uLlxuICAgICAgICB0aGlzLnJlZHJhd1NwYXRpYWxNYXJrZXJzKCk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzZXRaSW5kZXggc2xpY2UgZmFpbGVkOicsIGVycikpO1xuICB9XG5cbiAgc2V0U3RhY2tMb2FkaW5nKHN0YWNrTG9hZGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHN0YWNrTG9hZGluZyk7XG4gIH1cblxuICAvKiogQ2FuY2VsIGluLWZsaWdodCBmcmFtZSBsb2FkaW5nOiBidW1wIHRoZSBsb2FkIGdlbmVyYXRpb24gc28gdGhlIHZvbHVtZS1hc3NlbWJseSAvIHN1cmZhY2VcbiAgICogIHByZWxvYWQgd29ya2VycyBzdG9wIGZldGNoaW5nIG1vcmUgZnJhbWVzLCBhbmQgY2xlYXIgdGhlIGxvYWRpbmcgZmxhZyArIHByb2dyZXNzLiAqL1xuICBjYW5jZWxMb2FkaW5nKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFRva2VuKys7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gIH1cblxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmltYWdlVyA+IDAgJiYgdGhpcy5pbWFnZUggPiAwID8geyB3aWR0aDogdGhpcy5pbWFnZVcsIGhlaWdodDogdGhpcy5pbWFnZUggfSA6IG51bGw7XG4gIH1cblxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhc3RQaXhlbHM7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgIGlmICghdiB8fCAhc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgciA9IHYudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCByLngpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCByLnkpO1xuICAgIHJldHVybiB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoOiBNYXRoLm1pbihzaXplLndpZHRoLCByLnggKyByLndpZHRoKSAtIHgsXG4gICAgICBoZWlnaHQ6IE1hdGgubWluKHNpemUuaGVpZ2h0LCByLnkgKyByLmhlaWdodCkgLSB5LFxuICAgIH07XG4gIH1cblxuICBkb3dubG9hZEltYWdlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5leHBvcnRDb21wb3NpdGUoKTtcbiAgfVxuXG4gIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gIH1cblxuICAvKiogTWFwIGEgUGxvdGx5LXN0eWxlIDNEIGRyYWcgbW9kZSBvbnRvIG5hcGFyaS1qcydzIGNhbWVyYSBkcmFnIG1vZGUuICovXG4gIHNldFN1cmZhY2VEcmFnTW9kZShtb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbSA9IG1vZGUgPT09ICdwYW4nID8gJ3BhbicgOiBtb2RlID09PSAnem9vbScgPyAnem9vbScgOiAncm90YXRlJzsgLy8gb3JiaXQvdHVybnRhYmxlIOKGkiByb3RhdGVcbiAgICB0aGlzLnZpZXdlci5zZXRDYW1lcmFEcmFnTW9kZShtKTtcbiAgfVxuXG4gIC8qKiBSZS1mcmFtZSB0aGUgM0QgY2FtZXJhIG9uIHRoZSBjdXJyZW50IDNEIGxheWVyLiBBIHN1cmZhY2UgbWVzaCBzaXRzIGluIHRoZSBwb3NpdGl2ZSBvY3RhbnRcbiAgICogIChub3QgY2VudHJlZCksIHNvIGZyYW1lIGl0IGJ5IGl0cyBvd24gYm91bmRzOyBhIHZvbHVtZS9pc29zdXJmYWNlIHVzZXMgaXRzIGNlbnRyZWQgYm94LiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGNvbnN0IG1lc2hMYXllciA9IHRoaXMuc3VyZmFjZUxheWVyID8/IHRoaXMuc2NhdHRlcjNkTGF5ZXI7XG4gICAgaWYgKG1lc2hMYXllcikge1xuICAgICAgY29uc3QgYiA9IG1lc2hMYXllci5ib3VuZHMoKTtcbiAgICAgIHRoaXMudmlld2VyLmNhbWVyYTNkLnRhcmdldCA9IGIuY2VudGVyO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZGlzdGFuY2UgPSBNYXRoLm1heChiLnJhZGl1cyAqIDIuNSwgMWUtMyk7XG4gICAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSB0aGlzLnZvbHVtZURpbXM7XG4gICAgaWYgKGQpIHRoaXMudmlld2VyLmNhbWVyYTNkLmZyYW1lKGQud2lkdGgsIGQuaGVpZ2h0LCBkLmRlcHRoKTtcbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmF1dG9zY2FsZUV2ZW50JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFRoZSBXZWJHUFUgbmFwYXJpLWpzIG9wdGlvbnMsIG9mZmVyZWQgYWxvbmdzaWRlIChub3QgcmVwbGFjaW5nKSB0aGUgT1NEL1Bsb3RseSB0eXBlcy5cbiAgICByZXR1cm4gW1xuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9JTUFHRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NVUkZBQ0VdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU0NBVFRFUjNEXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1ZPTFVNRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9JU09TVVJGQUNFXSEsXG4gICAgICAvLyBHYXRlZCBieSBgcmVxdWlyZXNTcGF0aWFsRGF0YWAsIHNvIHRoZSBzZWxlY3RvciBoaWRlcyBpdCB1bnRpbCBhIGRhdGFzZXQgaXMgcHVibGlzaGVkLlxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLlNQQVRJQUxfT01JQ1NdISxcbiAgICBdO1xuICB9XG5cbiAgLyoqIFRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yICgxID0gZnVsbCDigKYgOCA9IOKFmykuIFJlYWQgYnkgdGhlIHRvb2xiYXIgdG8gaW5pdCB0aGUgY29udHJvbC4gKi9cbiAgZ2V0UmVzb2x1dGlvblNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblNjYWxlO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZGVjaW1hdGUgZmFjdG9yIGZvciB0aGUgbmFwYXJpIDNEIHR5cGVzLiBUYWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgKHJlKWxvYWQg4oCUIHRoZSBob3N0XG4gICAqICByZS1wbG90cyBhZnRlciBjYWxsaW5nIHRoaXMsIHNpbmNlIGRlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YS4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc29sdXRpb25TY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBQbG90bHkgb3ducyB0aGUgaW50ZW5zaXR5IGluc2V0ICovXG4gIH1cblxuICAvKiogUmVhZCB0aGUgZGlzcGxheWVkIGNvbXBvc2l0ZSBpbnRvIGBsYXN0UGl4ZWxzYCAodGhlIHBpeGVsLXRvb2xzJyBzb3VyY2UpICsgZW1pdCB0aGUgY2xhbXBlZFxuICAgKiAgdmlzaWJsZSByZWdpb24uIEEgZnJlc2ggUGl4ZWxEYXRhIG9iamVjdCBtZWFucyBjYWNoZWRJbWFnZURhdGEoKSByZWJ1aWxkcyBhdXRvbWF0aWNhbGx5LiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blJlYWRiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHggPSBhd2FpdCB2LnJlYWREaXNwbGF5ZWRQaXhlbHMoKTtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdikgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IHYudmlzaWJsZVdvcmxkUmVjdCgpOyAvLyBjYXB0dXJlIFdJVEggdGhlIHBpeGVscyAoc2FtZSBjYW1lcmEpXG4gICAgICB0aGlzLmxhc3RQaXhlbHMgPSBweDtcbiAgICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSByZWN0O1xuICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICAgICAgaWYgKHNpemUgJiYgcmVjdCkge1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2l6ZS53aWR0aCwgcmVjdC54KSk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLmhlaWdodCwgcmVjdC55KSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS53aWR0aCAtIHgsIHJlY3Qud2lkdGgpKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc2l6ZS5oZWlnaHQgLSB5LCByZWN0LmhlaWdodCkpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHJlYWRiYWNrIHVuYXZhaWxhYmxlICovXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlYWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHZvaWQgdGhpcy5ydW5SZWFkYmFjaygpKTtcbiAgICBlbHNlIHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCksIDApO1xuICB9XG5cbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayDigJQgYXJtZWQgb24gY2FtZXJhIGNoYW5nZXMgc28gYGxhc3RQaXhlbHNgIHRyYWNrcyB0aGUgY3VycmVudCB2aWV3IGFmdGVyIGFcbiAgICogIHBhbi96b29tIHNldHRsZXMgKGFuZCBhZnRlciB0aWxlZCBsZXZlbHMgZmluaXNoIGxvYWRpbmcpLCB3aGljaCB0aGUgb24tY2FudmFzIHBpeGVsIHRvb2xzXG4gICAqICAod2FuZC9icnVzaC9TQU0pIHJlYWQgc3luY2hyb25vdXNseS4gQ29hbGVzY2VzIHJhcGlkIGNoYW5nZXMuICovXG4gIHByaXZhdGUgYXJtUmVhZGJhY2soZGVsYXlNcyA9IDI1MCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRiYWNrVGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMucmVhZGJhY2tUaW1lcik7XG4gICAgdGhpcy5yZWFkYmFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBudWxsO1xuICAgICAgdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCk7XG4gICAgfSwgZGVsYXlNcyk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gdGhlIE9TRCBiYWNrZW5kKS5cblxuICAvLyDilIDilIAgUGl4ZWwgdG9vbHM6IHJldXNlIHRoZSBzaGFyZWQsIGJhY2tlbmQtYWdub3N0aWMgdG9vbCBzZXJ2aWNlcyB3aXRoIGEgbmFwYXJpIGhvc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1aWxkIHRoZSBjb29yZGluYXRlIHRyYW5zZm9ybSArIHRvb2wgaG9zdHMgZm9yIHRoZSBjdXJyZW50IHZpZXdlciAoY2FsbGVkIGZyb20gcGxvdCgpKS4gVGhlXG4gICAqICBwaXhlbCB0b29scyByZWFkIGRpc3BsYXllZCBwaXhlbHMgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIGFuZCBjb252ZXJ0IHBvaW50ZXJcbiAgICogIGNvb3JkcyB2aWEgdGhlIG5hcGFyaSBjYW1lcmEsIGV4YWN0bHkgbWlycm9yaW5nIHRoZSBPU0QgaG9zdC4gKi9cbiAgcHJpdmF0ZSBidWlsZFRvb2xIb3N0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG5ldyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgdGhpcy52aWV3ZXIsXG4gICAgICAoKSA9PiAhIXRoaXMudmlld2VyICYmIHRoaXMuaW1hZ2VXID4gMCxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnJlZ2lvblN0b3JlO1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiByZWdpb25zLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyKSA9PiByZWdpb25zLnNldFJlZ2lvbnMociksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuY2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5ob3N0LFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmxvYWRlZD8uZmlsZW5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiByZWdpb25zLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKT8ucmF0aW9zWzBdID8/IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXZJZCxcbiAgICAgIHBpeGVsVG9EYXRhOiAocHgsIHB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIXRoaXMudmlld2VyIHx8ICFyZWN0KSByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQocmVjdC5sZWZ0ICsgcHgsIHJlY3QudG9wICsgcHkpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgICB9LFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHMpID0+IHRoaXMuYXBwbHlab29tVG9Cb3goY29vcmRzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFpvb20vcGFuIHRoZSBjYW1lcmEgdG8gZml0IGEgZGF0YS1zcGFjZSByZWN0YW5nbGUgYFt4TWluLCB4TWF4LCB5TWF4LCB5TWluXWAuICovXG4gIHByaXZhdGUgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdiB8fCAhdGhpcy5jYW52YXMgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFt4TWluLCB4TWF4LCB5QSwgeUJdID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbih4TWluLCB4TWF4KTtcbiAgICBjb25zdCB4MSA9IE1hdGgubWF4KHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHkwID0gTWF0aC5taW4oeUEsIHlCKTtcbiAgICBjb25zdCB5MSA9IE1hdGgubWF4KHlBLCB5Qik7XG4gICAgY29uc3QgdyA9IE1hdGgubWF4KDEsIHgxIC0geDApO1xuICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCB5MSAtIHkwKTtcbiAgICBjb25zdCB2dyA9IHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgdmggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgaDtcbiAgICB2LmNhbWVyYS5jZW50ZXIgPSBbKHgwICsgeDEpIC8gMiwgKHkwICsgeTEpIC8gMl07XG4gICAgdi5jYW1lcmEuem9vbSA9IE1hdGgubWluKHZ3IC8gdywgdmggLyBoKTtcbiAgICB2LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBDYWNoZWRJbWFnZURhdGEgZnJvbSB0aGUgbW9zdCByZWNlbnQgcmVhZGJhY2sgKFJHQkEgZGV2aWNlIHBpeGVscyDihpIgW3ldW3hdPVtyLGcsYl0pLFxuICAgKiAgd2l0aCByYXRpb3Mvb3JpZ2luIG1hcHBpbmcgaW1hZ2UgY29vcmRzIOKGlCByZWFkYmFjayBwaXhlbHMuIENhY2hlZCB1bnRpbCB0aGUgcmVhZGJhY2sgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmxhc3RQaXhlbHM7XG4gICAgaWYgKCFweCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNhY2hlZEltYWdlICYmIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPT09IHB4KSByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgICBjb25zdCB3ID0gcHgud2lkdGg7XG4gICAgY29uc3QgaCA9IHB4LmhlaWdodDtcbiAgICBjb25zdCBkYXRhID0gcHguZGF0YTtcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW11bXSA9IG5ldyBBcnJheShoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgY29uc3Qgcm93OiBudW1iZXJbXVtdID0gbmV3IEFycmF5KHcpO1xuICAgICAgY29uc3QgYmFzZSA9IHkgKiB3ICogNDtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgIGNvbnN0IG8gPSBiYXNlICsgeCAqIDQ7XG4gICAgICAgIHJvd1t4XSA9IFtkYXRhW29dLCBkYXRhW28gKyAxXSwgZGF0YVtvICsgMl1dO1xuICAgICAgfVxuICAgICAgbWF0cml4W3ldID0gcm93O1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHJlY3QgY2FwdHVyZWQgV0lUSCB0aGlzIHJlYWRiYWNrIChub3QgdGhlIGxpdmUgb25lKSBzbyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZVxuICAgIC8vIG1hdHJpeCdzIGNhbWVyYSDigJQgb3RoZXJ3aXNlIGEgcGFuL3pvb20gc2luY2UgdGhlIHJlYWRiYWNrIG1pcy1zY2FsZXMgdGhlIHRyYWNlZCByZWdpb24uXG4gICAgY29uc3QgcmVjdCA9IHRoaXMubGFzdFBpeGVsc1JlY3QgPz8gdGhpcy52aWV3ZXIudmlzaWJsZVdvcmxkUmVjdCgpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyZWN0LndpZHRoIC8gdywgcmVjdC5oZWlnaHQgLyBoXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIG9yaWdpblg6IHJlY3QueCxcbiAgICAgIG9yaWdpblk6IHJlY3QueSxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBweDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRJbWFnZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENvbnRyb2wgZ2F0aW5nOiBhIHRvb2wgdGhhdCBBQ1RJVkFURVMgZGlzYWJsZXMgdGhlIGNhbWVyYSBjb250cm9sczsgZGVhY3RpdmF0aW9uIGlzIGEgbm8tb3BcbiAgLy8gYmVjYXVzZSB0aGUgaG9zdCBhbHdheXMgY2FsbHMgdGhlIHJlZ2lvbiBvdmVybGF5J3Mgc2V0TW9kZSBGSVJTVCBpbiBlYWNoIHRvZ2dsZSAod2hpY2ggc2V0c1xuICAvLyB0aGUgYmFzZWxpbmUgZW5hYmxlZC9kaXNhYmxlZCksIHNvIHJlLWVuYWJsaW5nIGhlcmUgd291bGQgZmlnaHQgYSBmcmVzaGx5LWFjdGl2YXRlZCBkcmF3IG1vZGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjsgLy8gbm8gcGxvdCB5ZXQg4oaSIG5vdGhpbmcgdG8gZHJpdmVcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucygob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuICBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuYXJtUmVhZGJhY2soMCk7XG4gICAgaWYgKHRoaXMud2FuZEhvc3QpIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUodHJ1ZSwgKG9wdGlvbnMgPz8ge30pIGFzIHVua25vd24gYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5zaXplICE9IG51bGwpIHRoaXMuYnJ1c2hUb29sLnNldFNpemUob3B0aW9ucy5zaXplKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG4iXX0=
|