@jax-data-science/sci-image-visualizer 0.12.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
- package/esm2022/lib/contracts/display-types.mjs +7 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/reconstruct.mjs +11 -1
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
- package/esm2022/lib/region-editor/region-editor.component.mjs +13 -1
- package/esm2022/lib/routing-visualizer.service.mjs +4 -1
- package/esm2022/lib/spatial/lod.mjs +6 -3
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +78 -23
- package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +70 -1
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +54 -11
- package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
- package/esm2022/lib/store/region-selection.mjs +21 -4
- package/esm2022/lib/store/region-store.service.mjs +22 -3
- package/esm2022/lib/store/spatial-selection.service.mjs +13 -1
- package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +3 -3
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1777 -793
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -2
- package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
- package/lib/contracts/display-types.d.ts +27 -0
- package/lib/contracts/image.contract.d.ts +2 -0
- package/lib/contracts/region-editor-api.contract.d.ts +3 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
- package/lib/contracts/visualizer.contract.d.ts +28 -2
- package/lib/geometry/reconstruct.d.ts +6 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +5 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
- package/lib/routing-visualizer.service.d.ts +1 -0
- package/lib/spatial/lod.d.ts +3 -1
- package/lib/spatial/spatial-controls.facade.d.ts +19 -2
- package/lib/spatial/spatial-gene-filter.d.ts +44 -0
- package/lib/spatial/spatial-selection.d.ts +16 -1
- package/lib/spatial/spatial-tile-merge.d.ts +17 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +14 -3
- package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
- package/lib/store/region-selection.d.ts +14 -3
- package/lib/store/region-store.service.d.ts +14 -1
- package/lib/store/spatial-selection.service.d.ts +8 -0
- package/lib/store/visualizer-store.service.d.ts +13 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { pointSymbolCode } from 'napari-js';
|
|
1
2
|
import { NO_CATEGORY, isCategoricalColumn, } from '../../contracts/spatial-dataset.contract';
|
|
2
3
|
import { encodeCategorical, markerDiameters, resolveCategoryColors } from '../../spatial/spatial-encoding';
|
|
3
4
|
import { emptySelection, maskToIndices, mutedFromSelection, } from '../../spatial/spatial-selection';
|
|
@@ -5,12 +6,14 @@ import { framePositions } from '../../spatial/spatial-framing';
|
|
|
5
6
|
import { PIXEL_WORLD_QUANTUM, worldQuantumForExtent } from '../../spatial/world-grid';
|
|
6
7
|
import { observationsInSlice, volumeImageRef } from '../../spatial/spatial-volume-image';
|
|
7
8
|
import { cellTypeColumnFor } from '../../spatial/spatial-tiles';
|
|
9
|
+
import { observationGeneMask, observationGeneStyle } from '../../spatial/spatial-gene-filter';
|
|
8
10
|
import { colorExpressionField, fieldContrastWindow } from '../../spatial/spatial-expression';
|
|
9
11
|
import { computeExpressionFieldAsync } from '../../workers/spatial-math';
|
|
10
12
|
import { Supersede } from '../../util/supersede';
|
|
11
13
|
import { isAbortError } from '../tile-server';
|
|
14
|
+
import { GLYPH_SYMBOLS } from './spatial-tiles/transcript-layers';
|
|
12
15
|
import { Image2dScene } from './napari-image-2d-scene';
|
|
13
|
-
import { GENE_MAP_MAX_SIDE, GENE_MAP_SIGMA, SPATIAL_FALLBACK_RADIUS, SPATIAL_NEUTRAL_COLOR, SPATIAL_NEUTRAL_HEX, SPATIAL_SLICE_MIN_DIAMETER_PX, encodeSpatialContinuous, gatherColors, } from './napari-spatial-encoding';
|
|
16
|
+
import { GENE_MAP_MAX_SIDE, GENE_MAP_SIGMA, SPATIAL_FALLBACK_RADIUS, SPATIAL_NEUTRAL_COLOR, SPATIAL_NEUTRAL_HEX, SPATIAL_SLICE_MIN_DIAMETER_PX, encodeSpatialContinuous, gatherColors, hideUnshown, } from './napari-spatial-encoding';
|
|
14
17
|
import { SpatialSceneBase } from './napari-spatial-scene';
|
|
15
18
|
/**
|
|
16
19
|
* SPATIAL_OMICS (review Appendix B, cluster J): the tissue image (an {@link Image2dScene}) with one
|
|
@@ -156,13 +159,33 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
156
159
|
// Resolve colours BEFORE touching the scene: a gene fetch can fail or be
|
|
157
160
|
// superseded, and dropping the existing layer first would blank the view.
|
|
158
161
|
let faceColor;
|
|
162
|
+
let symbols = null;
|
|
163
|
+
let shown = null;
|
|
159
164
|
const endLoading = this.ctx.badge.begin('Observations');
|
|
160
165
|
try {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
+
// Which observations the gene filter keeps, settled apart from their colours: a colour can
|
|
167
|
+
// fall back to a flat one, the filter cannot. Drawn without it, every observation would
|
|
168
|
+
// show as if it expressed the picked genes. So a failed read keeps the markers as they
|
|
169
|
+
// were drawn, and the panel says the filter could not be applied.
|
|
170
|
+
try {
|
|
171
|
+
shown = dataset ? await this.filterMask(dataset, view) : null;
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
console.warn('[napari-js] gene filter could not be applied — keeping the observations as drawn', err);
|
|
175
|
+
if (task())
|
|
176
|
+
this.session.reportGeneFilter(true);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
const style = dataset ? await this.markerStyle(dataset, view, selection) : null;
|
|
181
|
+
faceColor = style?.colors ?? SPATIAL_NEUTRAL_COLOR;
|
|
182
|
+
symbols = style?.symbols ?? null;
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
console.warn('[napari-js] spatial colouring failed — falling back to a flat colour', err);
|
|
186
|
+
faceColor = SPATIAL_NEUTRAL_COLOR;
|
|
187
|
+
symbols = null;
|
|
188
|
+
}
|
|
166
189
|
}
|
|
167
190
|
finally {
|
|
168
191
|
endLoading();
|
|
@@ -170,6 +193,10 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
170
193
|
// A newer rebuild (or a teardown) started while the vector was in flight.
|
|
171
194
|
if (!task())
|
|
172
195
|
return;
|
|
196
|
+
this.session.reportGeneFilter(false);
|
|
197
|
+
// The filter applies to whichever colours won, the fallback's included.
|
|
198
|
+
if (shown && dataset)
|
|
199
|
+
faceColor = hideUnshown(faceColor, shown);
|
|
173
200
|
if (!dataset || dataset.observations.count === 0) {
|
|
174
201
|
this.removeLayers(viewer);
|
|
175
202
|
return;
|
|
@@ -184,7 +211,7 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
184
211
|
await this.ensureGeneMap(viewer, dataset, view, selection, slab);
|
|
185
212
|
if (!task())
|
|
186
213
|
return;
|
|
187
|
-
this.drawMarkers(viewer, dataset, view, faceColor, slab);
|
|
214
|
+
this.drawMarkers(viewer, dataset, view, faceColor, slab, symbols);
|
|
188
215
|
}
|
|
189
216
|
/** Nothing to draw: drop the markers and the gene map. */
|
|
190
217
|
removeLayers(viewer) {
|
|
@@ -204,7 +231,7 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
204
231
|
* Draw the observation markers over the image (and the gene map): restyled in place for a
|
|
205
232
|
* display-only change, else a new layer.
|
|
206
233
|
*/
|
|
207
|
-
drawMarkers(viewer, dataset, view, faceColor, slab) {
|
|
234
|
+
drawMarkers(viewer, dataset, view, faceColor, slab, symbols = null) {
|
|
208
235
|
const obs = dataset.observations;
|
|
209
236
|
const ref = slab?.ref ?? dataset.imageRef;
|
|
210
237
|
const size = markerSizes(obs, view, slab);
|
|
@@ -228,6 +255,7 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
228
255
|
this.points.size = size;
|
|
229
256
|
this.points.visible = this.pointsVisible();
|
|
230
257
|
this.points.faceColor = gatherColors(faceColor, slab?.indices);
|
|
258
|
+
this.points.symbols = gatherSymbols(symbols, slab?.indices);
|
|
231
259
|
this.hideForeignImage(viewer, showImage);
|
|
232
260
|
this.ctx.tools.regionOverlay?.setRegionsVisible(view.showAnnotations !== false);
|
|
233
261
|
viewer.requestRender();
|
|
@@ -245,6 +273,8 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
245
273
|
name: 'observations',
|
|
246
274
|
size,
|
|
247
275
|
faceColor: gatherColors(faceColor, drawn),
|
|
276
|
+
// Each observation's gene's icon while they are coloured by gene; the layer's disc else.
|
|
277
|
+
symbols: gatherSymbols(symbols, drawn),
|
|
248
278
|
// No border: at Visium spot density an outline per marker reads as noise,
|
|
249
279
|
// and it costs a second colour array.
|
|
250
280
|
borderWidth: 0,
|
|
@@ -338,6 +368,10 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
338
368
|
// datasets does not leave the tissue permanently hidden.
|
|
339
369
|
layer.visible = datasetHasPixels;
|
|
340
370
|
}
|
|
371
|
+
// Showing the tissue must not show its channels the user or the defaults switched off (a
|
|
372
|
+
// 22-channel plate starts with four): the channel states decide which of its layers draw.
|
|
373
|
+
if (datasetHasPixels)
|
|
374
|
+
this.image.reapplyDisplayState();
|
|
341
375
|
viewer.requestRender();
|
|
342
376
|
}
|
|
343
377
|
/**
|
|
@@ -515,7 +549,38 @@ export class Spatial2dScene extends SpatialSceneBase {
|
|
|
515
549
|
* selected to colour by. Categorical columns use the column's own palette; continuous columns
|
|
516
550
|
* and gene vectors go through the active colormap with a percentile-clipped window.
|
|
517
551
|
*/
|
|
518
|
-
|
|
552
|
+
/** The observations the view's gene filter keeps (1 = drawn), or null when it has none.
|
|
553
|
+
* Rejects when an expression read fails. */
|
|
554
|
+
filterMask(dataset, view) {
|
|
555
|
+
const port = this.session.port;
|
|
556
|
+
if (!port)
|
|
557
|
+
return Promise.resolve(null);
|
|
558
|
+
return observationGeneMask(view, dataset.observations.count, (g) => port.getFeatureVector(g));
|
|
559
|
+
}
|
|
560
|
+
/** The markers' colours (and icons, by gene) before the gene filter hides any of them. */
|
|
561
|
+
async markerStyle(dataset, view, selection) {
|
|
562
|
+
const port = this.session.port;
|
|
563
|
+
const count = dataset.observations.count;
|
|
564
|
+
// Coloured by gene: each observation in its gene's colour, drawn as its gene's icon. That is
|
|
565
|
+
// a colour, so a failed read falls back to the view's colour source, as any colour does.
|
|
566
|
+
const byGene = port
|
|
567
|
+
? await observationGeneStyle(view, count, (g) => port.getFeatureVector(g)).catch((err) => {
|
|
568
|
+
console.warn('[napari-js] colouring by gene failed — falling back to the colour source', err);
|
|
569
|
+
return null;
|
|
570
|
+
})
|
|
571
|
+
: null;
|
|
572
|
+
const colors = byGene
|
|
573
|
+
? encodeCategorical(byGene.codes, {
|
|
574
|
+
colors: byGene.colors,
|
|
575
|
+
opacity: view.opacity,
|
|
576
|
+
muted: mutedFromSelection(selection),
|
|
577
|
+
})
|
|
578
|
+
: await this.sourceColors(dataset, view, selection);
|
|
579
|
+
const symbols = byGene ? glyphSymbols(byGene.codes, byGene.glyphs) : null;
|
|
580
|
+
return { colors, symbols };
|
|
581
|
+
}
|
|
582
|
+
/** {@link faceColors} before the gene filter: what the colour source and the selection make of them. */
|
|
583
|
+
async sourceColors(dataset, view, selection) {
|
|
519
584
|
const port = this.session.port;
|
|
520
585
|
const colorBy = view.colorBy;
|
|
521
586
|
// Everything NOT selected is muted; with nothing selected, nothing is muted
|
|
@@ -611,4 +676,17 @@ function slabAt(dataset, slice) {
|
|
|
611
676
|
minDiameter: SPATIAL_SLICE_MIN_DIAMETER_PX * volume.voxelSize[0],
|
|
612
677
|
};
|
|
613
678
|
}
|
|
614
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUNMLFdBQVcsRUFLWCxtQkFBbUIsR0FDcEIsTUFBTSwwQ0FBMEMsQ0FBQztBQUVsRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0csT0FBTyxFQUVMLGNBQWMsRUFDZCxhQUFhLEVBQ2Isa0JBQWtCLEdBQ25CLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQW1CLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDOUcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsNkJBQTZCLEVBRTdCLHVCQUF1QixFQUN2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ZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIFNwYXRpYWxDb2x1bW4sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IGVuY29kZUNhdGVnb3JpY2FsLCBtYXJrZXJEaWFtZXRlcnMsIHJlc29sdmVDYXRlZ29yeUNvbG9ycyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQge1xuICBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgZW1wdHlTZWxlY3Rpb24sXG4gIG1hc2tUb0luZGljZXMsXG4gIG11dGVkRnJvbVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBmcmFtZVBvc2l0aW9ucyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1mcmFtaW5nJztcbmltcG9ydCB7IFBJWEVMX1dPUkxEX1FVQU5UVU0sIHdvcmxkUXVhbnR1bUZvckV4dGVudCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvd29ybGQtZ3JpZCc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNJblNsaWNlLCB2b2x1bWVJbWFnZVJlZiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC12b2x1bWUtaW1hZ2UnO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbkZpZWxkLCBjb2xvckV4cHJlc3Npb25GaWVsZCwgZmllbGRDb250cmFzdFdpbmRvdyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IGNvbXB1dGVFeHByZXNzaW9uRmllbGRBc3luYyB9IGZyb20gJy4uLy4uL3dvcmtlcnMvc3BhdGlhbC1tYXRoJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB7IGlzQWJvcnRFcnJvciB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10aWxlcyc7XG5pbXBvcnQgeyBJbWFnZTJkU2NlbmUgfSBmcm9tICcuL25hcGFyaS1pbWFnZS0yZC1zY2VuZSc7XG5pbXBvcnQge1xuICBHRU5FX01BUF9NQVhfU0lERSxcbiAgR0VORV9NQVBfU0lHTUEsXG4gIFNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTLFxuICBTUEFUSUFMX05FVVRSQUxfQ09MT1IsXG4gIFNQQVRJQUxfTkVVVFJBTF9IRVgsXG4gIFNQQVRJQUxfU0xJQ0VfTUlOX0RJQU1FVEVSX1BYLFxuICBQb2ludENvbG9ycyxcbiAgZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMsXG4gIGdhdGhlckNvbG9ycyxcbn0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBTcGF0aWFsU2NlbmVCYXNlLCBTcGF0aWFsU2Vzc2lvbiwgU3BhdGlhbFRpbGVPd25lciB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtc2NlbmUnO1xuaW1wb3J0IHR5cGUgeyBOYXBhcmlTY2VuZSwgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuXG4vKiogVGhlIHBsYW5lIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IGlzIHNob3dpbmcgKHNlZSB7QGxpbmsgU3BhdGlhbDJkU2NlbmUuc2xhYn0pLiAqL1xuaW50ZXJmYWNlIFNsYWIge1xuICByZWY6IFNwYXRpYWxJbWFnZVJlZjtcbiAgaW5kaWNlczogVWludDMyQXJyYXk7XG4gIHNsaWNlOiBudW1iZXI7XG4gIG1pbkRpYW1ldGVyOiBudW1iZXI7XG59XG5cbi8qKlxuICogU1BBVElBTF9PTUlDUyAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgSik6IHRoZSB0aXNzdWUgaW1hZ2UgKGFuIHtAbGluayBJbWFnZTJkU2NlbmV9KSB3aXRoIG9uZVxuICogbWFya2VyIHBlciBvYnNlcnZhdGlvbiwgY29sb3VyZWQgYnkgYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLCB0aGUgZ2VuZSBtYXAgdW5kZXIgdGhlXG4gKiBjZWxscywgYW5kIHRoZSBsZXZlbC1vZi1kZXRhaWwgdGlsZSBsYXllcnMgKG91dGxpbmVzLCB0cmFuc2NyaXB0cywgZGVuc2l0eSkgb3ZlciB0aGVtLiBUaGVcbiAqIG1hcmtlcnMgcmVidWlsZCB3aGVuZXZlciB0aGUgZGF0YXNldCBvciB0aGUgdmlldyBzdGF0ZSBjaGFuZ2VzLCBzbyBzd2l0Y2hpbmcgdGhlIGNvbG91ci1ieVxuICogY29sdW1uIGRvZXMgbm90IHJlbW91bnQgdGhlIHNjZW5lLlxuICpcbiAqIFNldHMgdXAgdGhlIGZ1bGwgMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHJlZ2lvbiBvdmVybGF5LCBwaXhlbCB0b29scywgcmVhZGJhY2sgY3VycmVuY3kg4oCUIGV4YWN0bHlcbiAqIGFzIHRoZSBwbGFpbiBpbWFnZSB2aWV3IGRvZXMuIFRoYXQgaXMgTk9UIG9wdGlvbmFsIGhlcmU6IHRoaXMgbW9kZSdzIHNlbGVjdGlvbiBpcyBkcml2ZW4gYnlcbiAqIGRyYXduIFJPSXMsIHNvIHdpdGhvdXQgdGhlIG92ZXJsYXkgdGhlcmUgaXMgbm8gd2F5IHRvIG1ha2UgYSBzZWxlY3Rpb24gYXQgYWxsLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDJkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUsIFNwYXRpYWxUaWxlT3duZXIge1xuICByZWFkb25seSBpbWFnZTogSW1hZ2UyZFNjZW5lO1xuICAvKiogVGhlIG9ic2VydmF0aW9uIG1hcmtlcnMsIGFuZCB3aGljaCBkYXRhc2V0L3BsYW5lIHRoZXkgd2VyZSBidWlsdCBmb3Ig4oCUIHNvIGEgZGlzcGxheS1vbmx5XG4gICAqICBjaGFuZ2UgKHNpemUsIGNvbG91ciwgb3BhY2l0eSwgc2VsZWN0aW9uKSBjYW4gdXBkYXRlIHRoZW0gaW4gcGxhY2UuICovXG4gIHByaXZhdGUgcG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBvYnNlcnZhdGlvbiBlYWNoIG1hcmtlciBpcywgaW4gZHJhdyBvcmRlcjsgbnVsbCB3aGVuIGV2ZXJ5IG9ic2VydmF0aW9uIGlzIGRyYXduLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUgbWFwJ3MgbGF5ZXIgYW5kIHRoZSBpbnB1dHMgaXQgd2FzIGNvbG91cmVkIGZvciAoaXRzIGZpZWxkIGlzIGNhY2hlZCBpbiB0aGUgc2Vzc2lvbixcbiAgICogIG9uIGEgY2xvY2sgb2YgaXRzIG93bikuICovXG4gIGdlbmVNYXBMYXllcjogSW1hZ2VMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgdGhlIGNhbWVyYSBoYXMgYmVlbiBmcmFtZWQgb24g4oCUIHNlZSB7QGxpbmsgZnJhbWVPbmNlfS4gKi9cbiAgcHJpdmF0ZSBmcmFtZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUtbWFwIGVzdGltYXRlIGluIGZsaWdodCAob2ZmIHRoZSBtYWluIHRocmVhZCBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkLFxuICAgKiAgU1BBVElBTC0xOSk6IGEgbmV3IGZpZWxkIGtleSBzdXBlcnNlZGVzIOKAlCBhbmQgYWJvcnRzIOKAlCBpdDsgYSByZWJ1aWxkIHRoYXQgbGVhdmVzIHRoZSBrZXlcbiAgICogIGFsb25lIGxldHMgaXQgZmluaXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVNYXBMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcblxuICAvKiogYG5vSW1hZ2VgOiBhbiBpbWFnZS1sZXNzIGRhdGFzZXQgb3BlbmVkIGJlZm9yZSBhbnkgaW1hZ2Ug4oCUIHRoZSBvYnNlcnZhdGlvbnMgYWxvbmUuICovXG4gIGNvbnN0cnVjdG9yKGN0eDogU2NlbmVDb250ZXh0LCBzZXNzaW9uOiBTcGF0aWFsU2Vzc2lvbiwgbm9JbWFnZSA9IGZhbHNlKSB7XG4gICAgc3VwZXIoY3R4LCBzZXNzaW9uLCBmYWxzZSk7XG4gICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZTJkU2NlbmUoY3R4LCB7XG4gICAgICBpbWFnZTogIW5vSW1hZ2UsXG4gICAgICAvLyBPbmx5IGZpdCB0byB0aGUgaW1hZ2Ugd2hlbiB0aGlzIGRhdGFzZXQgYWN0dWFsbHkgaGFzIG9uZS4gT3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgICAgIC8vIGZpdCwgdGhlIGltYWdlIHNpemUgc3RpbGwgaG9sZHMgdGhlIExBU1QgaW1hZ2UncyBkaW1lbnNpb25zLCBhbmQgdGhpcyBmaXRzIHRvIHRob3NlIOKAlCBhbmRcbiAgICAgIC8vIGJlY2F1c2UgaXQgZGVmZXJzIHRvIGEgZnJhbWUsIGl0IGxhbmRzIEFGVEVSIHRoZSBwb2ludHMgYXJlIGFkZGVkIGFuZCBvdmVyd3JpdGVzIHRoZVxuICAgICAgLy8gZnJhbWluZyB0aGV5IHNldC4gVGhhdCBpcyB3aGF0IGxlZnQgYW4gaW1hZ2UtbGVzcyBkYXRhc2V0IGFzIGEgdGVuLXBpeGVsIHNwZWNrLlxuICAgICAgZml0OiAoKSA9PiAhIXNlc3Npb24ubGF0ZXN0Py5bMF0/LmltYWdlUmVmLFxuICAgICAgb25TbGljZTogKHJlcmVuZGVyZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZWRyYXdNYXJrZXJzKCk7XG4gICAgICAgIC8vIFRoZSBzdGl0Y2hlZCByZS1yZW5kZXIgY2xlYXJlZCB0aGUgY2VsbHMsIHRyYW5zY3JpcHRzIGFuZCBkZW5zaXR5IHRvbzogcmUtcGxhbiB0aGVtIG5vd1xuICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgbmV4dCBjYW1lcmEgbW92ZSAoZWFjaCBncm91cCByZWRyYXdzIG9ubHkgd2hhdCBsZWZ0IHRoZSBzY2VuZSkuXG4gICAgICAgIGlmIChyZXJlbmRlcmVkKSB0aGlzLnNlc3Npb24udGlsZXM/LnJlZnJlc2goKTtcbiAgICAgIH0sXG4gICAgICBvbk5hdmlnYXRvckludGVyYWN0OiAoKSA9PiB0aGlzLmhvdmVyLmhpZGUoKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGF3YWl0IHRoaXMuaW1hZ2UubW91bnQoKTtcbiAgICAvLyBEaXNwb3NlZCB3aGlsZSB0aGUgaW1hZ2UgbG9hZGVkOiBjbGFpbWluZyB0aGUgdGlsZXMgbm93IHdvdWxkIHRha2UgdGhlbSBmcm9tIHRoZSBuZXh0IHNjZW5lLFxuICAgIC8vIGFuZCB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gd291bGQgb3V0bGl2ZSB0aGlzIG9uZS5cbiAgICBpZiAoY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5ob3Zlci5pbnN0YWxsKGN0eC5ob3N0KTtcbiAgICB0aGlzLnNlc3Npb24uY2xhaW1UaWxlcyh0aGlzKT8uYXR0YWNoKGN0eC52aWV3ZXIpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICBzZXRaKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0Wih6KTtcbiAgfVxuXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZS5oaXN0b2dyYW0oY2hhbm5lbCwgYmlucyk7XG4gIH1cblxuICBzZXRJbWFnZVNtb290aGluZyhlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZS5zZXRJbWFnZVNtb290aGluZyhlbmFibGVkKTtcbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlU3BhdGlhbCgpO1xuICAgIHRoaXMuZ2VuZU1hcExvYWRzLmNhbmNlbCgpO1xuICAgIHRoaXMuc2Vzc2lvbi5yZWxlYXNlVGlsZXModGhpcyk7XG4gICAgdGhpcy5pbWFnZS5kaXNwb3NlKCk7XG4gIH1cblxuICBjYW52YXNTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbdGhpcy5jdHguY2FudmFzLmNsaWVudFdpZHRoID8/IDAsIHRoaXMuY3R4LmNhbnZhcy5jbGllbnRIZWlnaHQgPz8gMF07XG4gIH1cblxuICBwb2x5Z29uc1Nob3duQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2ludHMpIHRoaXMucG9pbnRzLnZpc2libGUgPSB0aGlzLnBvaW50c1Zpc2libGUoKTtcbiAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFmdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbi50aWxlcz8ucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGhvdmVyVGlsZXMoKTogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYnNlcnZhdGlvbiB1bmRlciBhIGNsaWVudCBwb3NpdGlvbjogbmFwYXJpLWpzJ3MgcGljayBvbiB0aGUgbWFya2VyIGxheWVyIGl0c2VsZiAoYSBncmlkXG4gICAqIG92ZXIgaXRzIHBvc2l0aW9ucywgcmVidWlsdCBvbmx5IHdoZW4gdGhleSBjaGFuZ2UpLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgbmFtZSBhIGNlbGwgdGhhdCBpc1xuICAgKiBub3QgZHJhd24sIHRoZW4gdGhlIGRyYXduIGluZGV4IG1hcHBlZCBiYWNrIHRvIHRoZSBvYnNlcnZhdGlvbi5cbiAgICpcbiAgICogQSBtYXJrZXIgaXMgaGl0IGFueXdoZXJlIG9uIGl0cyBkcmF3biBkaXNjLCBvciB3aXRoaW4gYHNsYWNrUHhgIHNjcmVlbiBwaXhlbHMgb2YgaXRzIGNlbnRyZVxuICAgKiB3aGVuIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGF0IChhIDEuNSBweCBkb3Qgc3RpbGwgaGFzIHRvIGJlIGhvdmVyYWJsZSksIGFuZCBvZiBzZXZlcmFsIGhpdHMgdGhlXG4gICAqIE5FQVJFU1QgY2VudHJlIHdpbnMgKGFuIGV4YWN0IHRpZSBnb2VzIHRvIHRoZSBvbmUgZHJhd24gb24gdG9wKS4gTm90IG5hcGFyaSdzIGAndG9wbW9zdCdgOiB0aGVcbiAgICogc2xhY2sgaXMgd2lkZXIgdGhhbiBtb3N0IG1hcmtlcnMsIGFuZCBvdmVyIGEgZGVuc2UgZmllbGQgb2Ygc21hbGwgb25lcyBcInRoZSBsYXN0IGRyYXduIHdpdGhpblxuICAgKiAxMCBweFwiIG5hbWVzIGEgbmVpZ2hib3VyIHJhdGhlciB0aGFuIHRoZSBjZWxsIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGlja09ic2VydmF0aW9uKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyLCBzbGFja1B4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIGlmICghcG9pbnRzKSByZXR1cm4gLTE7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5jdHgudmlld2VyO1xuICAgIGNvbnN0IFt3eCwgd3ldID0gdmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3Qgem9vbSA9IHZpZXdlci5jYW1lcmEuem9vbTtcbiAgICBjb25zdCBrID0gcG9pbnRzLnBpY2sod3gsIHd5LCB7IHRvbGVyYW5jZTogc2xhY2tQeCAvICh6b29tID4gMCA/IHpvb20gOiAxKSwgdGllQnJlYWs6ICduZWFyZXN0JyB9KTtcbiAgICBpZiAoayA8IDApIHJldHVybiAtMTtcbiAgICByZXR1cm4gdGhpcy5kcmF3biA/IHRoaXMuZHJhd25ba10gOiBrO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1hcmtlcnMgYXJlIGRyYXduOiB3aGVuIHRoZSB1c2VyIHdhbnRzIHRoZW0sIGFuZCBub3Qgd2hpbGUgY2VsbCBvdXRsaW5lcyBhcmUgb25cbiAgICogc2NyZWVuIOKAlCB0aGVuIGEgY2VsbCBJUyBpdHMgb3V0bGluZSwgYW5kIGEgY2lyY2xlIG9uIHRvcCBvZiBpdCBpcyBub2lzZS4gWm9vbWVkIG91dCBwYXN0IHRoZVxuICAgKiBvdXRsaW5lIHRocmVzaG9sZCwgdGhlIGNpcmNsZXMgc3RhbmQgaW4gZm9yIHRoZSBjZWxscy5cbiAgICovXG4gIHByaXZhdGUgcG9pbnRzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzFdO1xuICAgIHJldHVybiAodmlldz8uc2hvd1BvaW50cyA/PyB0cnVlKSAmJiAhdGhpcy5zZXNzaW9uLnRpbGVzPy5vdXRsaW5lc1Nob3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgbWFya2VycyBvdmVyIGEgZnJlc2hseSByZW5kZXJlZCBpbWFnZS4gVHdvIHJlYXNvbnMsIGJvdGggaW52aXNpYmxlIGZyb20gdGhlXG4gICAqIHNwYXRpYWwgc3RvcmUg4oCUIHdoaWNoIGlzIHdoeSBhIHNjcnViIG9yIGEgcmUtcmVuZGVyIG5ldmVyIHJlYWNoZWQgdGhlIG1hcmtlcnMgb24gaXRzIG93bjpcbiAgICogIC0gdGhlIGltYWdlIHJlbmRlciBDTEVBUlMgdGhlIGxheWVyIGxpc3QsIHRha2luZyB0aGUgbWFya2VycyB3aXRoIGl0O1xuICAgKiAgLSBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBkaXNwbGF5ZWQgcGxhbmUgZGVjaWRlcyB3aGljaCBvYnNlcnZhdGlvbnMgYmVsb25nIG9uXG4gICAqICAgIHNjcmVlbiBhdCBhbGwsIHNvIHRoZSBjZWxscyBoYXZlIHRvIG1vdmUgd2l0aCB0aGUgc2VjdGlvbiByYXRoZXIgdGhhbiBoYW5nIG92ZXIgYW5vdGhlci5cbiAgICovXG4gIHByaXZhdGUgcmVkcmF3TWFya2VycygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLnNlc3Npb24ubGF0ZXN0O1xuICAgIGlmICghbGF0ZXN0Py5bMF0pIHJldHVybjtcbiAgICB2b2lkIHRoaXMucmVidWlsZCguLi5sYXRlc3QpO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgb2JzZXJ2YXRpb24gbWFya2VyIGxheWVyIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuY3R4LnZpZXdlcjtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5yZWJ1aWxkcy5uZXh0KCk7XG5cbiAgICAvLyBSZXNvbHZlIGNvbG91cnMgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZTogYSBnZW5lIGZldGNoIGNhbiBmYWlsIG9yIGJlXG4gICAgLy8gc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZSBleGlzdGluZyBsYXllciBmaXJzdCB3b3VsZCBibGFuayB0aGUgdmlldy5cbiAgICBsZXQgZmFjZUNvbG9yOiBQb2ludENvbG9ycztcbiAgICBjb25zdCBlbmRMb2FkaW5nID0gdGhpcy5jdHguYmFkZ2UuYmVnaW4oJ09ic2VydmF0aW9ucycpO1xuICAgIHRyeSB7XG4gICAgICBmYWNlQ29sb3IgPSBkYXRhc2V0ID8gYXdhaXQgdGhpcy5mYWNlQ29sb3JzKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbikgOiBTUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHNwYXRpYWwgY29sb3VyaW5nIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIGEgZmxhdCBjb2xvdXInLCBlcnIpO1xuICAgICAgZmFjZUNvbG9yID0gU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbmRMb2FkaW5nKCk7XG4gICAgfVxuICAgIC8vIEEgbmV3ZXIgcmVidWlsZCAob3IgYSB0ZWFyZG93bikgc3RhcnRlZCB3aGlsZSB0aGUgdmVjdG9yIHdhcyBpbiBmbGlnaHQuXG4gICAgaWYgKCF0YXNrKCkpIHJldHVybjtcblxuICAgIGlmICghZGF0YXNldCB8fCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnModmlld2VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIGRhdGFzZXQgd2hvc2UgaW1hZ2UgSVMgaXRzIHZvbHVtZSBzaG93cyBPTkUgUExBTkUgYXQgYSB0aW1lLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGFyZSB0aGUgb2JzZXJ2YXRpb25zIGluIHRoZSBkaXNwbGF5ZWQgcGxhbmUsIGRyYXduIGluIHRoYXQgcGxhbmUnc1xuICAgIC8vIHBpeGVsIGdyaWQuIFdpdGhvdXQgdGhlIGZpbHRlciB0aGUgc3BlY2ltZW4ncyB3aG9sZSBkZXB0aCBwaWxlcyBvbnRvIG9uZVxuICAgIC8vIHNlY3Rpb24gYW5kIHJlYWRzIGFzIGEgc21lYXI7IHdpdGhvdXQgdGhlIGFmZmluZSB0aGUgY29vcmRpbmF0ZXMgYXJlIHJlYWRcbiAgICAvLyBhcyBwaXhlbHMgYW5kIGxhbmQgb2ZmIHRoZSBzbGljZSBlbnRpcmVseS5cbiAgICBjb25zdCBzbGFiID0gc2xhYkF0KGRhdGFzZXQsIHRoaXMuY3R4LnooKSk7XG4gICAgLy8gVGhlIGdlbmUgbWFwIGdvZXMgVU5ERVIgdGhlIGNlbGxzLCBzbyBpdCBpcyBzZXR0bGVkIGJlZm9yZSB0aGV5IGFyZSBhZGRlZC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHNsYWIpO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgdGhpcy5kcmF3TWFya2Vycyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIGZhY2VDb2xvciwgc2xhYik7XG4gIH1cblxuICAvKiogTm90aGluZyB0byBkcmF3OiBkcm9wIHRoZSBtYXJrZXJzIGFuZCB0aGUgZ2VuZSBtYXAuICovXG4gIHByaXZhdGUgcmVtb3ZlTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhd24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMgb3ZlciB0aGUgaW1hZ2UgKGFuZCB0aGUgZ2VuZSBtYXApOiByZXN0eWxlZCBpbiBwbGFjZSBmb3IgYVxuICAgKiBkaXNwbGF5LW9ubHkgY2hhbmdlLCBlbHNlIGEgbmV3IGxheWVyLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3TWFya2VycyhcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIGZhY2VDb2xvcjogUG9pbnRDb2xvcnMsXG4gICAgc2xhYjogU2xhYiB8IG51bGwsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIGNvbnN0IHJlZiA9IHNsYWI/LnJlZiA/PyBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IHNpemUgPSBtYXJrZXJTaXplcyhvYnMsIHZpZXcsIHNsYWIpO1xuXG4gICAgLy8gbmFwYXJpJ3MgaW1hZ2UgdmlldyBDTEVBUlMgdGhlIHdob2xlIGxheWVyIGxpc3Qgb24gZXZlcnkgcmVuZGVyLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGdvIHdpdGggaXQgd2hlbmV2ZXIgdGhlIGltYWdlIGlzIHJlLXJlbmRlcmVkIOKAlCBhIHNjcnViLCBhIGNvbnRyYXN0XG4gICAgLy8gY2hhbmdlLiBUaGUgY2FjaGVkIGhhbmRsZSBpcyB0aGVuIGRldGFjaGVkLCBhbmQgbXV0YXRpbmcgaXQgZHJhd3Mgbm90aGluZzpcbiAgICAvLyB0cmVhdCBhIGxheWVyIHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBzY2VuZSBhcyBhYnNlbnQgc28gaXQgZ2V0cyByZS1hZGRlZC5cbiAgICBpZiAodGhpcy5wb2ludHMgJiYgIXZpZXdlci5sYXllcnMuaXRlbXMuaW5jbHVkZXModGhpcy5wb2ludHMpKSB7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzaG93SW1hZ2UgPSAoISFyZWYgfHwgISFkYXRhc2V0LnZvbHVtZSkgJiYgdmlldy5zaG93SW1hZ2UgIT09IGZhbHNlO1xuICAgIC8vIEEgc2l6ZS9jb2xvdXIvb3BhY2l0eS9zZWxlY3Rpb24gY2hhbmdlIGlzIERJU1BMQVktb25seTogbXV0YXRlIHRoZSBsYXllclxuICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwaW5nIGFuZCByZS1hZGRpbmcgaXQuIEJvdGggc2V0dGVycyBidW1wIHRoZSBsYXllcidzXG4gICAgLy8gZGF0YVZlcnNpb24sIHdoaWNoIGlzIHdoYXQgbWFrZXMgbmFwYXJpLWpzIHJlYnVpbGQgdGhlIGluc3RhbmNlIGJ1ZmZlciBhbmRcbiAgICAvLyByZWRyYXcg4oCUIGFuZCBpdCBhdm9pZHMgcmVidWlsZGluZyA4NGsgcG9zaXRpb25zIHRvIGNoYW5nZSBvbmUgbnVtYmVyLlxuICAgIC8vIFRoZSBzbGljZSBpcyBwYXJ0IG9mIHRoZSBrZXk6IGEgc2NydWIgY2hhbmdlcyBXSElDSCBvYnNlcnZhdGlvbnMgYXJlIGRyYXduLFxuICAgIC8vIHdoaWNoIGlzIGdlb21ldHJ5LCBub3QgZGlzcGxheS5cbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfToke29icy5jb3VudH06JHtzbGFiPy5zbGljZSA/PyAnJ31gO1xuICAgIGlmICh0aGlzLnBvaW50cyAmJiBrZXkgPT09IHRoaXMubGF5ZXJLZXkpIHtcbiAgICAgIHRoaXMucG9pbnRzLnNpemUgPSBzaXplO1xuICAgICAgdGhpcy5wb2ludHMudmlzaWJsZSA9IHRoaXMucG9pbnRzVmlzaWJsZSgpO1xuICAgICAgdGhpcy5wb2ludHMuZmFjZUNvbG9yID0gZ2F0aGVyQ29sb3JzKGZhY2VDb2xvciwgc2xhYj8uaW5kaWNlcyk7XG4gICAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCBzaG93SW1hZ2UpO1xuICAgICAgdGhpcy5jdHgudG9vbHMucmVnaW9uT3ZlcmxheT8uc2V0UmVnaW9uc1Zpc2libGUodmlldy5zaG93QW5ub3RhdGlvbnMgIT09IGZhbHNlKTtcbiAgICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHJhd24gPSBzbGFiPy5pbmRpY2VzO1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9ic2VydmF0aW9uUG9zaXRpb25zKG9icywgZHJhd24pO1xuICAgIHRoaXMubGF5ZXJLZXkgPSBrZXk7XG4gICAgdGhpcy5kcmF3biA9IGRyYXduID8/IG51bGw7XG4gICAgdGhpcy5wb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICBzaXplLFxuICAgICAgZmFjZUNvbG9yOiBnYXRoZXJDb2xvcnMoZmFjZUNvbG9yLCBkcmF3biksXG4gICAgICAvLyBObyBib3JkZXI6IGF0IFZpc2l1bSBzcG90IGRlbnNpdHkgYW4gb3V0bGluZSBwZXIgbWFya2VyIHJlYWRzIGFzIG5vaXNlLFxuICAgICAgLy8gYW5kIGl0IGNvc3RzIGEgc2Vjb25kIGNvbG91ciBhcnJheS5cbiAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgICAgLy8gVGhlIGRhdGFzZXQncyBkYXRhLT53b3JsZCBhZmZpbmUuIFNwYXRpYWxEYXRhIHJlY29yZHMgb25lIHBlciBjb29yZGluYXRlXG4gICAgICAvLyBzeXN0ZW0gKFZpc2l1bSBzcG90IGNvb3JkcyBhcmUgaW4gdGhlIEZVTEwtcmVzb2x1dGlvbiBmcmFtZSB3aGlsZSB0aGVcbiAgICAgIC8vIHNlcnZlZCBpbWFnZSBtYXkgYmUgdGhlIGhpcmVzIGRvd25zY2FsZSksIHNvIHdpdGhvdXQgdGhpcyB0aGUgbWFya2Vyc1xuICAgICAgLy8gbGFuZCBpbiB0aGUgcmlnaHQgc2hhcGUgYXQgdGhlIHdyb25nIHNjYWxlLiBEZWZhdWx0cyB0byBpZGVudGl0eSB3aGVuXG4gICAgICAvLyB0aGUgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gdGhlIGltYWdlJ3MgcGl4ZWwgc3BhY2UuXG4gICAgICBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sXG4gICAgICB0cmFuc2xhdGU6IHJlZj8udHJhbnNsYXRlID8/IFswLCAwXSxcbiAgICAgIHZpc2libGU6IHRoaXMucG9pbnRzVmlzaWJsZSgpLFxuICAgIH0pO1xuICAgIC8vIE91dGxpbmVzLCBkZW5zaXR5IGFuZCB0cmFuc2NyaXB0cyBnbyBiYWNrIG92ZXIgdGhlIG1hcmtlcnMganVzdCBhZGRlZC5cbiAgICB0aGlzLnNlc3Npb24udGlsZXM/LmFmdGVyT2JzZXJ2YXRpb25zKCk7XG4gICAgdGhpcy5mcmFtZU9uY2Uodmlld2VyLCBkYXRhc2V0LmlkLCBwb3NpdGlvbnMsICEhcmVmKTtcbiAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCBzaG93SW1hZ2UpO1xuICAgIHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk7XG4gICAgaWYgKCFvdmVybGF5Py5zZXRXb3JsZFF1YW50dW0pIHJldHVybjtcbiAgICBpZiAoZGF0YXNldC5pbWFnZVJlZiB8fCBkYXRhc2V0LnZvbHVtZSkge1xuICAgICAgb3ZlcmxheS5zZXRXb3JsZFF1YW50dW0oUElYRUxfV09STERfUVVBTlRVTSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgY29uc3QgeCA9IHBvc2l0aW9uc1tpXTtcbiAgICAgIGNvbnN0IHkgPSBwb3NpdGlvbnNbaSArIDFdO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkgY29udGludWU7XG4gICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgIH1cbiAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bSh3b3JsZFF1YW50dW1Gb3JFeHRlbnQobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgaW1hZ2UgbGF5ZXIgZm9yIGEgZGF0YXNldCB0aGF0IGJyaW5ncyBubyBpbWFnZSBvZiBpdHMgb3duLlxuICAgKlxuICAgKiBUaGUgaG9zdCdzIHZpZXdlciBrZWVwcyB3aGF0ZXZlciBpbWFnZSB3YXMgbGFzdCBsb2FkZWQsIGFuZCBmb3IgYSBkYXRhc2V0IHRoYXRcbiAgICogcmVnaXN0ZXJzIG9udG8gbm9uZSB0aGF0IHBpY3R1cmUgYmVsb25ncyB0byBzb21ldGhpbmcgZWxzZSBlbnRpcmVseSDigJQgdGhlIGV4YW1wbGUnc1xuICAgKiBkZWZhdWx0IHNsaWRlLCBzYXkuIEl0IGlzIG5vdCBtZXJlbHkgaXJyZWxldmFudDogdGhlIHR3byBsaXZlIGluIGRpZmZlcmVudCBjb29yZGluYXRlXG4gICAqIHNwYWNlcyAoaW1hZ2UgcGl4ZWxzIGFnYWluc3QgdGhlIGVtYmVkZGluZydzIG93biB1bml0cyksIHNvIHRoZSBsZWZ0b3ZlciBpcyBtYWduaWZpZWRcbiAgICogcm91Z2hseSBhIGh1bmRyZWRmb2xkLiBBdCB0aGUgZml0dGVkIHpvb20gdGhlIGNhbWVyYSBzaXRzIGluc2lkZSBpdHMgY29ybmVyLCB3aGVyZSBpdFxuICAgKiByZWFkcyBhcyBibGFuayBiYWNrZ3JvdW5kLCBhbmQgaXQgYXBwZWFycyBvbmx5IG9uY2UgeW91IHpvb20gb3V0IGZhciBlbm91Z2ggdG8gZmluZFxuICAgKiBpdCDigJQgd2hpY2ggaXMgZXhhY3RseSBob3cgaXQgZ2V0cyBub3RpY2VkLlxuICAgKlxuICAgKiBIaWRkZW4gcmF0aGVyIHRoYW4gcmVtb3ZlZCwgYW5kIGhpZGRlbiBIRVJFIHJhdGhlciB0aGFuIGJ5IGNsZWFyaW5nIHRoZSBob3N0J3MgaW1hZ2VcbiAgICogc3RhdGU6IHRoYXQgc3RhdGUgZHJpdmVzIHRoZSB3aG9sZSByZW5kZXIgcGlwZWxpbmUsIGluY2x1ZGluZyBhIFBsb3RseSBiYWNrZW5kIHdob3NlXG4gICAqIGZpZWxkcyBhcmUgZGVjbGFyZWQgd2l0aCBkZWZpbml0ZS1hc3NpZ25tZW50IGFzc2VydGlvbnMsIHNvIGVtcHR5aW5nIGl0IHRocm93cyBmcm9tXG4gICAqIHdoaWNoZXZlciBmaWVsZCB0aGUgbmV4dCBwYXRoIGhhcHBlbnMgdG8gcmVhZC4gVGhpcyB0b3VjaGVzIG9uZSBsYXllcidzIHZpc2liaWxpdHlcbiAgICogYW5kIG5vdGhpbmcgZWxzZS5cbiAgICovXG4gIGhpZGVGb3JlaWduSW1hZ2Uodmlld2VyOiBQaWNrPFZpZXdlciwgJ2xheWVycycgfCAncmVxdWVzdFJlbmRlcic+LCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gTm8gaW1hZ2Ugb2YgaXRzIG93biDihpIgbm90aGluZyBmb3IgYW4gb3ZlcnZpZXcgdG8gc2hvdyBlaXRoZXIuXG4gICAgdGhpcy5pbWFnZS5zaG93TmF2aWdhdG9yRm9yKGRhdGFzZXRIYXNQaXhlbHMpO1xuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2Ygdmlld2VyLmxheWVycy5pdGVtcykge1xuICAgICAgaWYgKGxheWVyLmtpbmQgIT09ICdpbWFnZScpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIHRyYW5zY3JpcHQtZGVuc2l0eSByYXN0ZXIgYW5kIHRoZSBnZW5lIG1hcCBhcmUgaW1hZ2UgbGF5ZXJzIHRvbywgYnV0IHRoZXkgYXJlXG4gICAgICAvLyBkYXRhLCBub3QgdGhlIHRpc3N1ZTogdGhlIEltYWdlcyB0b2dnbGUgbXVzdCBub3QgdGFrZSB0aGVtIGRvd24gd2l0aCB0aGUgc2xpZGUuXG4gICAgICBpZiAodGlsZXM/Lm93bnMobGF5ZXIpIHx8IGxheWVyID09PSB0aGlzLmdlbmVNYXBMYXllcikgY29udGludWU7XG4gICAgICAvLyBSZS1zaG93biB3aGVuIGEgZGF0YXNldCB0aGF0IG93bnMgYW4gaW1hZ2UgY29tZXMgYmFjaywgc28gc3dpdGNoaW5nIGJldHdlZW5cbiAgICAgIC8vIGRhdGFzZXRzIGRvZXMgbm90IGxlYXZlIHRoZSB0aXNzdWUgcGVybWFuZW50bHkgaGlkZGVuLlxuICAgICAgbGF5ZXIudmlzaWJsZSA9IGRhdGFzZXRIYXNQaXhlbHM7XG4gICAgfVxuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWUgdGhlIGNhbWVyYSBvbiB0aGUgb2JzZXJ2YXRpb25zLCBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlLlxuICAgKlxuICAgKiBUaGUgMkQgY2FtZXJhIGlzIG5vcm1hbGx5IGZpdHRlZCB0byB0aGUgSU1BR0UsIGJlY2F1c2UgdGhlIG9ic2VydmF0aW9ucyBhcmUgaW4gdGhhdFxuICAgKiBpbWFnZSdzIHBpeGVsIHNwYWNlIGFuZCBmcmFtaW5nIHRoZSBpbWFnZSBmcmFtZXMgdGhlbSB0b28uIEEgZGF0YXNldCB3aXRoIG5vXG4gICAqIHJlZmVyZW5jZSBpbWFnZSBoYXMgY29vcmRpbmF0ZXMgaW4gaXRzIG93biB1bml0cyBpbnN0ZWFkIOKAlCBzZXFGSVNIJ3Mgc3BhbiBhYm91dFxuICAgKiA1eDcg4oCUIHNvIHRoZSBpbWFnZSBmcmFtaW5nIGxlZnQgb3ZlciBmcm9tIHdoYXRldmVyIHdhcyBvbiBzY3JlZW4gYmVmb3JlIHB1dHMgdGhlXG4gICAqIHdob2xlIGNsb3VkIG9mZnNjcmVlbjogbWVhc3VyZWQgYXQgOS43IHggMTMuNCBQSVhFTFMsIGNlbnRyZWQgMjU2cHggZnJvbSB3aGVyZSB0aGVcbiAgICogY2FtZXJhIHdhcyBsb29raW5nLiBUaGUgcG9pbnRzIGFyZSBhbGwgdGhlcmUgYW5kIGRyYXduOyB0aGV5IGFyZSBhIHNwZWNrLiBXaGljaFxuICAgKiBsb29rcyBleGFjdGx5IGxpa2UgdGhlIGRhdGFzZXQgaGF2aW5nIGZhaWxlZCB0byBsb2FkLlxuICAgKlxuICAgKiBPbmNlIHBlciBkYXRhc2V0LCBhcyBuYXBhcmktanMncyBgZml0M2Q6ICdvbmNlJ2AgZG9lcyBmb3IgdGhlIGNsb3VkOiByZS1jb2xvdXJpbmcsXG4gICAqIHNsaWNpbmcgb3IgcGlja2luZyBhIGdlbmUgcmUtYWRkcyB0aGlzIGxheWVyLCBhbmQgcmUtZnJhbWluZyBvbiB0aG9zZSB3b3VsZCBtb3ZlXG4gICAqIHRoZSBjYW1lcmEgdW5kZXIgdGhlIHVzZXIg4oCUIHRoZSBjYW1lcmEgdG9vbHMgYW5kIHRoZSBjYW52YXMgZHJhZyBhcmUgbWVhbnQgdG8gYmVcbiAgICogdGhlIG9ubHkgdGhpbmdzIHRoYXQgZG8uXG4gICAqL1xuICBwcml2YXRlIGZyYW1lT25jZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldElkOiBzdHJpbmcsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LCByZWdpc3RlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gR2F0ZWQgb24gd2hldGhlciBUSElTIGRhdGFzZXQgcmVnaXN0ZXJzIG9udG8gYW4gaW1hZ2UsIG5vdCBvbiB0aGUgaW1hZ2Ugc2l6ZTogdGhhdCBrZWVwc1xuICAgIC8vIHRoZSBsYXN0IHBsb3R0ZWQgaW1hZ2UncyBkaW1lbnNpb25zIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgc28gYSBzdGFsZSA1MTJ4MzgzIHJlYWQgYXNcbiAgICAvLyBcInRoZXJlIGlzIGFuIGltYWdlXCIgYW5kIHNraXBwZWQgdGhlIGZyYW1pbmcgZW50aXJlbHkuXG4gICAgaWYgKHJlZ2lzdGVyZWQpIHJldHVybjtcbiAgICAvLyBPbmNlIHBlciBkYXRhc2V0IChzZWUgYWJvdmUpLlxuICAgIGlmICh0aGlzLmZyYW1lZCA9PT0gZGF0YXNldElkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGNhbnZhcyB9ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZml0ID0gZnJhbWVQb3NpdGlvbnMocG9zaXRpb25zLCBjYW52YXMuY2xpZW50V2lkdGggPz8gMCwgY2FudmFzLmNsaWVudEhlaWdodCA/PyAwKTtcbiAgICAvLyBOdWxsIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gZnJhbWUgb247IGxlYXZlIHRoZSBjYW1lcmEgd2hlcmUgaXQgaXMgcmF0aGVyXG4gICAgLy8gdGhhbiBtb3ZpbmcgdGhlIHZpZXcgZm9yIGEgZGF0YXNldCB3ZSBjYW5ub3QgZml0LlxuICAgIGlmICghZml0KSByZXR1cm47XG4gICAgdmlld2VyLmNhbWVyYS5zZXQoZml0LmNlbnRlciwgZml0Lnpvb20gPz8gdmlld2VyLmNhbWVyYS56b29tKTtcbiAgICB0aGlzLmZyYW1lZCA9IGRhdGFzZXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKipnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIGFzIGEgY29udGludW91cyBmaWVsZCBkcmF3biB1bmRlclxuICAgKiB0aGUgY2VsbHMuXG4gICAqXG4gICAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBhIGdlbmUgc2F5cyB3aGljaCBjZWxscyBleHByZXNzIGl0OyBpdCBjYW5ub3Qgc2F5IHdoZXJlLFxuICAgKiBiZWNhdXNlIHRoZSBleWUgd2lsbCBub3QgaW50ZWdyYXRlIHRob3VzYW5kcyBvZiBkb3RzIGludG8gYSB0ZXJyaXRvcnkuIFRoZSBmaWVsZFxuICAgKiBpcyBhIGtlcm5lbC13ZWlnaHRlZCBNRUFOIHBlciBjZWxsIChzZWUgYHNwYXRpYWwtZXhwcmVzc2lvbi50c2ApLCBzbyBhIGRlbnNlXG4gICAqIHJlZ2lvbiBkb2VzIG5vdCBnbG93IG1lcmVseSBmb3IgYmVpbmcgZGVuc2UsIGFuZCBpdCBpcyB0cmFuc3BhcmVudCB3aGVyZXZlciBub1xuICAgKiBjZWxsIHdhcyBtZWFzdXJlZCDigJQgYW4gdW5zYW1wbGVkIGdhcCBtdXN0IG5vdCByZWFkIGFzIFwibm90IGV4cHJlc3NlZFwiLlxuICAgKlxuICAgKiBJdCBzaGFyZXMgdGhlIHBvaW50cycgTFVULCBwZXJjZW50aWxlIHdpbmRvdyBhbmQgbG9nIGZsYWcsIHNvIHRoZSBsYXllciB1bmRlclxuICAgKiB0aGUgY2VsbHMgYW5kIHRoZSBjZWxscyB0aGVtc2VsdmVzIGNhbm5vdCBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIERJU1BMQVlFRCBpbWFnZSdzIHBpeGVsIGdyaWQsIGNvYXJzZW5lZCBzbyB0aGUgbG9uZyBzaWRlIGlzIGF0XG4gICAqIG1vc3QgYEdFTkVfTUFQX01BWF9TSURFYDogYSBzbW9vdGggZmllbGQgZ2FpbnMgbm90aGluZyBmcm9tIGEgc2xpZGUncyBmdWxsXG4gICAqIHJlc29sdXRpb24uIEZvciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGF0IGdyaWQgaXMgdGhlIGN1cnJlbnQgc2xpY2UsIGFuZCBvbmx5XG4gICAqIHRoYXQgcGxhbmUncyBvYnNlcnZhdGlvbnMgYXJlIGluY2x1ZGVkIOKAlCB0aGUgc2FtZSBydWxlIHRoZSBtYXJrZXJzIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2xhYjogU2xhYiB8IG51bGwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zZXNzaW9uLmdlbmVNYXA7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuXG4gICAgLy8gVHdvIGNsb2NrczogdGhlIEZJRUxEIGRlcGVuZHMgb24gdGhlIGdlbmUsIHRoZSBwbGFuZSBhbmQgdGhlIGJhbmR3aWR0aCwgd2hpbGVcbiAgICAvLyB0aGUgY29sb3VycyBkZXBlbmQgb24gdGhlIHdpbmRvdywgdGhlIGxvZyBmbGFnIGFuZCB0aGUgb3BhY2l0eS4gUmVjb2xvdXJpbmcgYVxuICAgIC8vIGNhY2hlZCBmaWVsZCBpcyBhIGZyYWN0aW9uIG9mIGVzdGltYXRpbmcgb25lLlxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbZGF0YXNldC5pZCwgZ2VuZSwgc2xhYj8uc2xpY2UgPz8gJycsIHNtb290aGluZywgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgICAgZmllbGRLZXksXG4gICAgICAgICAgY2xpcC5qb2luKCcsJyksXG4gICAgICAgICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgICAgICAgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgICB0aGlzLmN0eC5kaXNwbGF5LmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICAvLyBBIHN0aXRjaGVkIHNsaWNlIHJlLXJlbmRlciBjbGVhcnMgdGhlIHdob2xlIGxheWVyIGxpc3QsIHRoZSBtYXAgd2l0aCBpdCwgYW5kIHRoZSBrZXkgb2YgYVxuICAgIC8vIHJlZ2lzdGVyZWQgaW1hZ2UncyBtYXAgZG9lcyBub3QgbmFtZSB0aGUgc2xpY2U6IGEgbWFwIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgaXMgYWJzZW50LFxuICAgIC8vIGFzIHRoZSBtYXJrZXJzJyBpcyAoc2VlIGByZWJ1aWxkYCksIHNvIGl0IGlzIGRyYXduIGFnYWluIGZyb20gdGhlIGNhY2hlZCBmaWVsZC5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIgJiYgIXZpZXdlci5sYXllcnMuaXRlbXMuaW5jbHVkZXModGhpcy5nZW5lTWFwTGF5ZXIpKSB7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIGNhY2hlLmZpZWxkID0gbnVsbDtcbiAgICAgIGNhY2hlLmtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHJhc3RlciBjb3ZlcnMgdGhlIGRpc3BsYXllZCBpbWFnZTsgd2l0aG91dCBvbmUgdGhlcmUgaXMgbm90aGluZyB0b1xuICAgIC8vIG92ZXJsYXkgYW5kIHRoZSBjbG91ZCBpcyB0aGUgM0QgbW9kZSdzIGJ1c2luZXNzLCBub3QgdGhpcyBvbmUncy4gR2F0ZWQgb24gdGhlXG4gICAgLy8gREFUQVNFVCBicmluZ2luZyBwaXhlbHMsIG5vdCBvbiB0aGUgaW1hZ2Ugc2l6ZTogdGhhdCBrZWVwcyB0aGUgbGFzdCBwbG90dGVkIGltYWdlJ3NcbiAgICAvLyBzaXplIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgd2hpY2ggd291bGQgc2l6ZSB0aGUgbWFwIG92ZXIgdGhlIHdyb25nIGV4dGVudC5cbiAgICBpZiAoIXNsYWIgJiYgIWRhdGFzZXQuaW1hZ2VSZWYpIHJldHVybjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5jdHguaW1hZ2VTaXplKCk7XG4gICAgY29uc3QgaW1hZ2VXID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS53aWR0aCA6IHNpemUud2lkdGg7XG4gICAgY29uc3QgaW1hZ2VIID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS5oZWlnaHQgOiBzaXplLmhlaWdodDtcbiAgICBpZiAoIWltYWdlVyB8fCAhaW1hZ2VIKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChNYXRoLm1heChpbWFnZVcsIGltYWdlSCkgLyBHRU5FX01BUF9NQVhfU0lERSkpO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSBjYWNoZS5rZXkpIHtcbiAgICAgIGNvbnN0IGxvYWQgPSB0aGlzLmdlbmVNYXBMb2Fkcy5uZXh0KCk7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICBsZXQgZXN0aW1hdGVkOiBFeHByZXNzaW9uRmllbGQgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXN0aW1hdGVkID0gYXdhaXQgY29tcHV0ZUV4cHJlc3Npb25GaWVsZEFzeW5jKFxuICAgICAgICAgIGRhdGFzZXQub2JzZXJ2YXRpb25zLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlZjogc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWYsXG4gICAgICAgICAgICB3aWR0aDogTWF0aC5jZWlsKGltYWdlVyAvIHN0ZXApLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmNlaWwoaW1hZ2VIIC8gc3RlcCksXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgc2lnbWE6IEdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gQSBwbGFuZSB3aW5zIG92ZXIgYSBzZWxlY3Rpb246IHRoZSAyRCB2aWV3IGlzIHNob3dpbmcgb25lIHNlY3Rpb24sIHNvIGFcbiAgICAgICAgICAgIC8vIGZpZWxkIHNwYW5uaW5nIHRoZSBzcGVjaW1lbidzIGRlcHRoIHdvdWxkIG5vdCBiZSB0aGUgdGhpbmcgb24gc2NyZWVuLlxuICAgICAgICAgICAgaW5kaWNlczogc2xhYj8uaW5kaWNlcyA/PyBpblNlbGVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBsb2FkLnNpZ25hbCB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgbWFwLCBvciB0aGUgc2NlbmUgd2VudCBhd2F5XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjYWNoZS5maWVsZCA9IGVzdGltYXRlZDtcbiAgICAgIGNhY2hlLmtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IGNhY2hlLmZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IGx1dCA9IHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KTtcbiAgICAvLyBPdmVyIHRoZSBtZWFzdXJlZCBwaXhlbHMgb25seTogdW5tZWFzdXJlZCBvbmVzIGFyZSAwIGFuZCB3b3VsZCBkcmFnIHRoZSBsb3cgZW5kIGRvd24uXG4gICAgY29uc3QgW2xvLCBoaV0gPSBmaWVsZENvbnRyYXN0V2luZG93KGZpZWxkLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCByZ2JhID0gY29sb3JFeHByZXNzaW9uRmllbGQoZmllbGQsIGx1dCwgW2xvLCBoaV0sIHtcbiAgICAgIGxvZzogdmlldy5sb2dTY2FsZSxcbiAgICAgIC8vIFRoZSBNQVAncyBvd24gb3BhY2l0eTogcmVhZGluZyBhIGZpZWxkIHVuZGVyIHRoZSBjZWxscyBtZWFucyB0dXJuaW5nIHRoZVxuICAgICAgLy8gY2VsbHMgZG93biwgd2hpY2ggbXVzdCBub3QgdGFrZSB0aGUgZmllbGQgd2l0aCB0aGVtLlxuICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICB9KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRJbWFnZShcbiAgICAgIHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGZpZWxkLndpZHRoLCBoZWlnaHQ6IGZpZWxkLmhlaWdodCwgY2hhbm5lbHM6IDQsIGR0eXBlOiAndWludDgnLCBkYXRhOiByZ2JhIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9YCxcbiAgICAgICAgc2NhbGU6IFtzdGVwLCBzdGVwXSxcbiAgICAgICAgdHJhbnNsYXRlOiBbMCwgMF0sXG4gICAgICAgIGJsZW5kaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIGBhZGRJbWFnZWAgYXBwZW5kcywgc28gdGhlIG1hcCBqdXN0IGxhbmRlZCBvdmVyIHRoZSBjZWxscyAoZHJhd24gYnkgdGhpcyByZWJ1aWxkJ3NcbiAgICAvLyBwcmV2aW91cyBwYXNzLCBvciBieSBhIG5ld2VyIHJlYnVpbGQgd2hpbGUgdGhlIGZpZWxkIHdhcyBjb21wdXRpbmcpOiBtb3ZlIGl0IHRvIGp1c3QgdW5kZXJcbiAgICAvLyB0aGVtLiBBIG1vdmUga2VlcHMgdGhlIG1hcmtlcnMnIEdQVSBidWZmZXJzLCB3aGVyZSBkcm9wcGluZyBhbmQgcmUtYWRkaW5nIHRoZSBtYXJrZXJzXG4gICAgLy8gcmUtdXBsb2FkZWQgZXZlcnkgb25lIG9mIHRoZW0gKE5BUEFSSS1CT1VOREFSWS0xMSkuIFdpdGhvdXQgbWFya2VycyBvbiBzY3JlZW4gdGhlcmUgaXNcbiAgICAvLyBub3RoaW5nIHRvIGdvIHVuZGVyOyB0aGUgcmVidWlsZCBhZGRzIHRoZW0gb3ZlciB0aGUgbWFwLlxuICAgIGNvbnN0IHVuZGVyID0gdGhpcy5wb2ludHMgPyB2aWV3ZXIubGF5ZXJzLml0ZW1zLmluZGV4T2YodGhpcy5wb2ludHMpIDogLTE7XG4gICAgaWYgKHVuZGVyID49IDApIHZpZXdlci5sYXllcnMubW92ZSh0aGlzLmdlbmVNYXBMYXllciwgdW5kZXIpO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLW9ic2VydmF0aW9uIGNvbG91cnMgZm9yIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUsIG9yIGEgc2luZ2xlIGZsYXQgY29sb3VyIHdoZW4gbm90aGluZyBpc1xuICAgKiBzZWxlY3RlZCB0byBjb2xvdXIgYnkuIENhdGVnb3JpY2FsIGNvbHVtbnMgdXNlIHRoZSBjb2x1bW4ncyBvd24gcGFsZXR0ZTsgY29udGludW91cyBjb2x1bW5zXG4gICAqIGFuZCBnZW5lIHZlY3RvcnMgZ28gdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggYSBwZXJjZW50aWxlLWNsaXBwZWQgd2luZG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmYWNlQ29sb3JzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTxQb2ludENvbG9ycz4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIC8vIEV2ZXJ5dGhpbmcgTk9UIHNlbGVjdGVkIGlzIG11dGVkOyB3aXRoIG5vdGhpbmcgc2VsZWN0ZWQsIG5vdGhpbmcgaXMgbXV0ZWRcbiAgICAvLyBhbmQgdGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSAodGhlIENvc014IGhpZ2hsaWdodC12cy1tdXRlIHJ1bGUpLlxuICAgIGNvbnN0IG11dGVkID0gbXV0ZWRGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7XG5cbiAgICBpZiAoIXBvcnQgfHwgIWNvbG9yQnkpIHtcbiAgICAgIC8vIEdlbnVpbmVseSB1bmlmb3JtOiBvbmUgYnJvYWRjYXN0IHR1cGxlLCBzbyBhIGZsYXQgODRrLW9ic2VydmF0aW9uIHZpZXdcbiAgICAgIC8vIGRvZXMgbm90IGFsbG9jYXRlIGEgY29sb3VyIHBlciBwb2ludC5cbiAgICAgIGlmICghbXV0ZWQgJiYgdmlldy5vcGFjaXR5ID49IDEpIHJldHVybiBTUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICAvLyBOb3QgdW5pZm9ybSDigJQgdGhlIG9wYWNpdHkgY29udHJvbCBvciBhIHNlbGVjdGlvbiB2YXJpZXMgdGhlIGFscGhhLCBzbyBpdFxuICAgICAgLy8gaGFzIHRvIGJlIHBlci1wb2ludC4gUmV0dXJuaW5nIHRoZSBjb25zdGFudCB0dXBsZSBoZXJlIGlzIHdoYXQgbWFkZSB0aGVcbiAgICAgIC8vIE9wYWNpdHkgc2xpZGVyIGRvIG5vdGhpbmcgaW4gdGhlIGRlZmF1bHQgc3RhdGUsIHdoaWNoIGlzIHRoZSBzdGF0ZSBhbnlvbmVcbiAgICAgIC8vIGxhbmRzIGluIGJlZm9yZSBwaWNraW5nIGEgY29sb3VyIHNvdXJjZS5cbiAgICAgIHJldHVybiBlbmNvZGVDYXRlZ29yaWNhbChuZXcgVWludDE2QXJyYXkoZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQpLCB7XG4gICAgICAgIGNvbG9yczogW1NQQVRJQUxfTkVVVFJBTF9IRVhdLFxuICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgIG11dGVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGNvbnN0IGNvbHVtbjogU3BhdGlhbENvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICBpZiAoaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBlbmNvZGVDYXRlZ29yaWNhbChjb2x1bW4uY29kZXMsIHtcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gR3JvdXBzIHN3aXRjaGVkIG9mZiBpbiB0aGUgQ2VsbHMgcGFuZWwgaGlkZSB0aGVpciBkb3RzIHRvbywgd2hlbiB0aGUgZG90cyBhcmVcbiAgICAgICAgLy8gY29sb3VyZWQgYnkgdGhhdCBzYW1lIGdyb3VwaW5nLlxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgICBpZiAodmlldy5oaWRkZW5Hcm91cHM/Lmxlbmd0aCAmJiBncm91cENvbHVtbiA9PT0gY29sb3JCeS5uYW1lKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmID0gbmV3IFNldCh2aWV3LmhpZGRlbkdyb3Vwcyk7XG4gICAgICAgICAgY29uc3QgaGlkZSA9IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMubWFwKChjKSA9PiBvZmYuaGFzKGMpKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbi5jb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbHVtbi5jb2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChjICE9PSBOT19DQVRFR09SWSAmJiBoaWRlW2NdKSByZ2JhWzQgKiBpICsgM10gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmdiYTtcbiAgICAgIH1cbiAgICAgIC8vIEEgY29udGludW91cyBjb2x1bW4gbWF5IGNhcnJ5IGl0cyBvd24gbG9nIGhpbnQgKGNvdW50cyk7IHRoZSB2aWV3J3NcbiAgICAgIC8vIHRvZ2dsZSB3aW5zIG9uY2UgdGhlIHVzZXIgaGFzIHNldCBpdC5cbiAgICAgIHJldHVybiB0aGlzLmVuY29kZUNvbnRpbnVvdXMoY29sdW1uLnZhbHVlcywgdmlldywgbXV0ZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0aGlzLmVuY29kZUNvbnRpbnVvdXModmFsdWVzLCB2aWV3LCBtdXRlZCk7XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIFJHQkEgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIGFuZCBhIGNsaXBwZWQgd2luZG93LiAqL1xuICBlbmNvZGVDb250aW51b3VzKHZhbHVlczogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBtdXRlZDogVWludDhBcnJheSB8IG51bGwgPSBudWxsKTogRmxvYXQzMkFycmF5IHtcbiAgICByZXR1cm4gZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gICAgICB2YWx1ZXMsXG4gICAgICB2aWV3LFxuICAgICAgdGhpcy5jdHguZGlzcGxheS5zcGF0aWFsTHV0KHZpZXcpLFxuICAgICAgdGhpcy5zZXNzaW9uLmNvbnRyYXN0V2luZG93cyxcbiAgICAgIG11dGVkLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIFRoZSBtYXJrZXJzJyBkaWFtZXRlcnM6IGVhY2ggb2JzZXJ2YXRpb24ncyBvd24gKG9yIHRoZSBmYWxsYmFjayksIGF0IGxlYXN0IHRoZSBzbGFiJ3MgZmxvb3IsXG4gKiAgdGltZXMgdGhlIHZpZXcncyBwb2ludCBzY2FsZTsgb25lIG51bWJlciB3aGVuIGV2ZXJ5IG1hcmtlciBpcyBkcmF3biBhdCB0aGUgc2FtZSBzaXplLiAqL1xuZnVuY3Rpb24gbWFya2VyU2l6ZXMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBzbGFiOiBTbGFiIHwgbnVsbCk6IG51bWJlciB8IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IGJhc2UgPSBtYXJrZXJEaWFtZXRlcnMob2JzLCBTUEFUSUFMX0ZBTExCQUNLX1JBRElVUyk7XG4gIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gIGNvbnN0IGZsb29yID0gc2xhYj8ubWluRGlhbWV0ZXIgPz8gMDtcbiAgaWYgKHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyAmJiAhc2xhYikgcmV0dXJuIE1hdGgubWF4KGJhc2UsIGZsb29yKSAqIHNjYWxlO1xuICBjb25zdCBzaXplT2YgPSAoaTogbnVtYmVyKSA9PiBNYXRoLm1heCh0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgPyBiYXNlIDogYmFzZVtpXSwgZmxvb3IpICogc2NhbGU7XG4gIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShzbGFiPy5pbmRpY2VzID8/IHsgbGVuZ3RoOiBvYnMuY291bnQgfSwgKF92LCBpKSA9PiBzaXplT2Yoc2xhYiA/IHNsYWIuaW5kaWNlc1tpXSA6IGkpKTtcbn1cblxuLyoqIEludGVybGVhdmVkIHgseSBvZiB0aGUgYGRyYXduYCBvYnNlcnZhdGlvbnMgKHVuZGVmaW5lZDogYWxsIG9mIHRoZW0pLiAqL1xuZnVuY3Rpb24gb2JzZXJ2YXRpb25Qb3NpdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBkcmF3bjogVWludDMyQXJyYXkgfCB1bmRlZmluZWQpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBjb3VudCA9IGRyYXduID8gZHJhd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IG8gPSBkcmF3biA/IGRyYXduW2ldIDogaTtcbiAgICBwb3NpdGlvbnNbaSAqIDJdID0gb2JzLnhbb107XG4gICAgcG9zaXRpb25zW2kgKiAyICsgMV0gPSBvYnMueVtvXTtcbiAgfVxuICByZXR1cm4gcG9zaXRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwbGFuZSBgc2xpY2VgIG9mIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0OiBpdHMgcGl4ZWwgYWZmaW5lLCB0aGUgb2JzZXJ2YXRpb25zIHRoYXQgZmFsbCBpblxuICogaXQsIGFuZCB0aGUgbWFya2VyIGZsb29yIHRoYXQgZ3JpZCBuZWVkcy5cbiAqXG4gKiBOdWxsIGZvciBhIGRhdGFzZXQgd2l0aCBhIHJlYWwgYGltYWdlUmVmYCAoaXRzIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IHRoZSBpbWFnZSdzIHBpeGVscyBhbmRcbiAqIGV2ZXJ5IG9ic2VydmF0aW9uIGJlbG9uZ3MgdG8gdGhlIG9uZSBzZWN0aW9uKSBhbmQgZm9yIG9uZSB3aXRoIG5vIHZvbHVtZSBhdCBhbGwg4oCUIGJvdGggb2ZcbiAqIHdoaWNoIGRyYXcgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmZ1bmN0aW9uIHNsYWJBdChkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgc2xpY2U6IG51bWJlcik6IFNsYWIgfCBudWxsIHtcbiAgY29uc3Qgdm9sdW1lID0gZGF0YXNldC52b2x1bWU7XG4gIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8ICF2b2x1bWUpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIHJlZjogdm9sdW1lSW1hZ2VSZWYodm9sdW1lLCBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0KSxcbiAgICBpbmRpY2VzOiBvYnNlcnZhdGlvbnNJblNsaWNlKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB2b2x1bWUsIHNsaWNlKSxcbiAgICBzbGljZSxcbiAgICBtaW5EaWFtZXRlcjogU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggKiB2b2x1bWUudm94ZWxTaXplWzBdLFxuICB9O1xufVxuIl19
|
|
679
|
+
/** Per-observation napari-js symbol codes: each observation's gene's icon (`codes` index
|
|
680
|
+
* `glyphs`), a disc where it has none. */
|
|
681
|
+
export function glyphSymbols(codes, glyphs) {
|
|
682
|
+
const byGene = glyphs.map((g) => pointSymbolCode(GLYPH_SYMBOLS[g]));
|
|
683
|
+
const disc = pointSymbolCode('disc');
|
|
684
|
+
return Uint8Array.from(codes, (c) => (c === NO_CATEGORY ? disc : (byGene[c] ?? disc)));
|
|
685
|
+
}
|
|
686
|
+
/** The symbols of the drawn subset (all of them when `indices` is undefined). */
|
|
687
|
+
export function gatherSymbols(symbols, indices) {
|
|
688
|
+
if (!symbols || !indices)
|
|
689
|
+
return symbols;
|
|
690
|
+
return Uint8Array.from(indices, (i) => symbols[i]);
|
|
691
|
+
}
|
|
692
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtMmQtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUk1QyxPQUFPLEVBQ0wsV0FBVyxFQUtYLG1CQUFtQixHQUNwQixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRyxPQUFPLEVBRUwsY0FBYyxFQUNkLGFBQWEsRUFDYixrQkFBa0IsR0FDbkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzlGLE9BQU8sRUFBbUIsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNs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O0FBQ2pGLE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBMEIsRUFBRSxPQUFxQjtJQUM3RSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ3pDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb2ludFN5bWJvbENvZGUgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZUxheWVyLCBQb2ludHNMYXllciwgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIFNwYXRpYWxDb2x1bW4sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSwgVHJhbnNjcmlwdEdseXBoTmFtZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IGVuY29kZUNhdGVnb3JpY2FsLCBtYXJrZXJEaWFtZXRlcnMsIHJlc29sdmVDYXRlZ29yeUNvbG9ycyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQge1xuICBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgZW1wdHlTZWxlY3Rpb24sXG4gIG1hc2tUb0luZGljZXMsXG4gIG11dGVkRnJvbVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBmcmFtZVBvc2l0aW9ucyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1mcmFtaW5nJztcbmltcG9ydCB7IFBJWEVMX1dPUkxEX1FVQU5UVU0sIHdvcmxkUXVhbnR1bUZvckV4dGVudCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvd29ybGQtZ3JpZCc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNJblNsaWNlLCB2b2x1bWVJbWFnZVJlZiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC12b2x1bWUtaW1hZ2UnO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25HZW5lTWFzaywgb2JzZXJ2YXRpb25HZW5lU3R5bGUgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZ2VuZS1maWx0ZXInO1xuaW1wb3J0IHsgRXhwcmVzc2lvbkZpZWxkLCBjb2xvckV4cHJlc3Npb25GaWVsZCwgZmllbGRDb250cmFzdFdpbmRvdyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IGNvbXB1dGVFeHByZXNzaW9uRmllbGRBc3luYyB9IGZyb20gJy4uLy4uL3dvcmtlcnMvc3BhdGlhbC1tYXRoJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB7IGlzQWJvcnRFcnJvciB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10aWxlcyc7XG5pbXBvcnQgeyBHTFlQSF9TWU1CT0xTIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL3RyYW5zY3JpcHQtbGF5ZXJzJztcbmltcG9ydCB7IEltYWdlMmRTY2VuZSB9IGZyb20gJy4vbmFwYXJpLWltYWdlLTJkLXNjZW5lJztcbmltcG9ydCB7XG4gIEdFTkVfTUFQX01BWF9TSURFLFxuICBHRU5FX01BUF9TSUdNQSxcbiAgU1BBVElBTF9GQUxMQkFDS19SQURJVVMsXG4gIFNQQVRJQUxfTkVVVFJBTF9DT0xPUixcbiAgU1BBVElBTF9ORVVUUkFMX0hFWCxcbiAgU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFgsXG4gIFBvaW50Q29sb3JzLFxuICBlbmNvZGVTcGF0aWFsQ29udGludW91cyxcbiAgZ2F0aGVyQ29sb3JzLFxuICBoaWRlVW5zaG93bixcbn0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBTcGF0aWFsU2NlbmVCYXNlLCBTcGF0aWFsU2Vzc2lvbiwgU3BhdGlhbFRpbGVPd25lciB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtc2NlbmUnO1xuaW1wb3J0IHR5cGUgeyBOYXBhcmlTY2VuZSwgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuXG4vKiogVGhlIHBsYW5lIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IGlzIHNob3dpbmcgKHNlZSB7QGxpbmsgU3BhdGlhbDJkU2NlbmUuc2xhYn0pLiAqL1xuaW50ZXJmYWNlIFNsYWIge1xuICByZWY6IFNwYXRpYWxJbWFnZVJlZjtcbiAgaW5kaWNlczogVWludDMyQXJyYXk7XG4gIHNsaWNlOiBudW1iZXI7XG4gIG1pbkRpYW1ldGVyOiBudW1iZXI7XG59XG5cbi8qKlxuICogU1BBVElBTF9PTUlDUyAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgSik6IHRoZSB0aXNzdWUgaW1hZ2UgKGFuIHtAbGluayBJbWFnZTJkU2NlbmV9KSB3aXRoIG9uZVxuICogbWFya2VyIHBlciBvYnNlcnZhdGlvbiwgY29sb3VyZWQgYnkgYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLCB0aGUgZ2VuZSBtYXAgdW5kZXIgdGhlXG4gKiBjZWxscywgYW5kIHRoZSBsZXZlbC1vZi1kZXRhaWwgdGlsZSBsYXllcnMgKG91dGxpbmVzLCB0cmFuc2NyaXB0cywgZGVuc2l0eSkgb3ZlciB0aGVtLiBUaGVcbiAqIG1hcmtlcnMgcmVidWlsZCB3aGVuZXZlciB0aGUgZGF0YXNldCBvciB0aGUgdmlldyBzdGF0ZSBjaGFuZ2VzLCBzbyBzd2l0Y2hpbmcgdGhlIGNvbG91ci1ieVxuICogY29sdW1uIGRvZXMgbm90IHJlbW91bnQgdGhlIHNjZW5lLlxuICpcbiAqIFNldHMgdXAgdGhlIGZ1bGwgMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHJlZ2lvbiBvdmVybGF5LCBwaXhlbCB0b29scywgcmVhZGJhY2sgY3VycmVuY3kg4oCUIGV4YWN0bHlcbiAqIGFzIHRoZSBwbGFpbiBpbWFnZSB2aWV3IGRvZXMuIFRoYXQgaXMgTk9UIG9wdGlvbmFsIGhlcmU6IHRoaXMgbW9kZSdzIHNlbGVjdGlvbiBpcyBkcml2ZW4gYnlcbiAqIGRyYXduIFJPSXMsIHNvIHdpdGhvdXQgdGhlIG92ZXJsYXkgdGhlcmUgaXMgbm8gd2F5IHRvIG1ha2UgYSBzZWxlY3Rpb24gYXQgYWxsLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDJkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUsIFNwYXRpYWxUaWxlT3duZXIge1xuICByZWFkb25seSBpbWFnZTogSW1hZ2UyZFNjZW5lO1xuICAvKiogVGhlIG9ic2VydmF0aW9uIG1hcmtlcnMsIGFuZCB3aGljaCBkYXRhc2V0L3BsYW5lIHRoZXkgd2VyZSBidWlsdCBmb3Ig4oCUIHNvIGEgZGlzcGxheS1vbmx5XG4gICAqICBjaGFuZ2UgKHNpemUsIGNvbG91ciwgb3BhY2l0eSwgc2VsZWN0aW9uKSBjYW4gdXBkYXRlIHRoZW0gaW4gcGxhY2UuICovXG4gIHByaXZhdGUgcG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBvYnNlcnZhdGlvbiBlYWNoIG1hcmtlciBpcywgaW4gZHJhdyBvcmRlcjsgbnVsbCB3aGVuIGV2ZXJ5IG9ic2VydmF0aW9uIGlzIGRyYXduLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUgbWFwJ3MgbGF5ZXIgYW5kIHRoZSBpbnB1dHMgaXQgd2FzIGNvbG91cmVkIGZvciAoaXRzIGZpZWxkIGlzIGNhY2hlZCBpbiB0aGUgc2Vzc2lvbixcbiAgICogIG9uIGEgY2xvY2sgb2YgaXRzIG93bikuICovXG4gIGdlbmVNYXBMYXllcjogSW1hZ2VMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgdGhlIGNhbWVyYSBoYXMgYmVlbiBmcmFtZWQgb24g4oCUIHNlZSB7QGxpbmsgZnJhbWVPbmNlfS4gKi9cbiAgcHJpdmF0ZSBmcmFtZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGdlbmUtbWFwIGVzdGltYXRlIGluIGZsaWdodCAob2ZmIHRoZSBtYWluIHRocmVhZCBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkLFxuICAgKiAgU1BBVElBTC0xOSk6IGEgbmV3IGZpZWxkIGtleSBzdXBlcnNlZGVzIOKAlCBhbmQgYWJvcnRzIOKAlCBpdDsgYSByZWJ1aWxkIHRoYXQgbGVhdmVzIHRoZSBrZXlcbiAgICogIGFsb25lIGxldHMgaXQgZmluaXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVNYXBMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcblxuICAvKiogYG5vSW1hZ2VgOiBhbiBpbWFnZS1sZXNzIGRhdGFzZXQgb3BlbmVkIGJlZm9yZSBhbnkgaW1hZ2Ug4oCUIHRoZSBvYnNlcnZhdGlvbnMgYWxvbmUuICovXG4gIGNvbnN0cnVjdG9yKGN0eDogU2NlbmVDb250ZXh0LCBzZXNzaW9uOiBTcGF0aWFsU2Vzc2lvbiwgbm9JbWFnZSA9IGZhbHNlKSB7XG4gICAgc3VwZXIoY3R4LCBzZXNzaW9uLCBmYWxzZSk7XG4gICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZTJkU2NlbmUoY3R4LCB7XG4gICAgICBpbWFnZTogIW5vSW1hZ2UsXG4gICAgICAvLyBPbmx5IGZpdCB0byB0aGUgaW1hZ2Ugd2hlbiB0aGlzIGRhdGFzZXQgYWN0dWFsbHkgaGFzIG9uZS4gT3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgICAgIC8vIGZpdCwgdGhlIGltYWdlIHNpemUgc3RpbGwgaG9sZHMgdGhlIExBU1QgaW1hZ2UncyBkaW1lbnNpb25zLCBhbmQgdGhpcyBmaXRzIHRvIHRob3NlIOKAlCBhbmRcbiAgICAgIC8vIGJlY2F1c2UgaXQgZGVmZXJzIHRvIGEgZnJhbWUsIGl0IGxhbmRzIEFGVEVSIHRoZSBwb2ludHMgYXJlIGFkZGVkIGFuZCBvdmVyd3JpdGVzIHRoZVxuICAgICAgLy8gZnJhbWluZyB0aGV5IHNldC4gVGhhdCBpcyB3aGF0IGxlZnQgYW4gaW1hZ2UtbGVzcyBkYXRhc2V0IGFzIGEgdGVuLXBpeGVsIHNwZWNrLlxuICAgICAgZml0OiAoKSA9PiAhIXNlc3Npb24ubGF0ZXN0Py5bMF0/LmltYWdlUmVmLFxuICAgICAgb25TbGljZTogKHJlcmVuZGVyZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZWRyYXdNYXJrZXJzKCk7XG4gICAgICAgIC8vIFRoZSBzdGl0Y2hlZCByZS1yZW5kZXIgY2xlYXJlZCB0aGUgY2VsbHMsIHRyYW5zY3JpcHRzIGFuZCBkZW5zaXR5IHRvbzogcmUtcGxhbiB0aGVtIG5vd1xuICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgbmV4dCBjYW1lcmEgbW92ZSAoZWFjaCBncm91cCByZWRyYXdzIG9ubHkgd2hhdCBsZWZ0IHRoZSBzY2VuZSkuXG4gICAgICAgIGlmIChyZXJlbmRlcmVkKSB0aGlzLnNlc3Npb24udGlsZXM/LnJlZnJlc2goKTtcbiAgICAgIH0sXG4gICAgICBvbk5hdmlnYXRvckludGVyYWN0OiAoKSA9PiB0aGlzLmhvdmVyLmhpZGUoKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGF3YWl0IHRoaXMuaW1hZ2UubW91bnQoKTtcbiAgICAvLyBEaXNwb3NlZCB3aGlsZSB0aGUgaW1hZ2UgbG9hZGVkOiBjbGFpbWluZyB0aGUgdGlsZXMgbm93IHdvdWxkIHRha2UgdGhlbSBmcm9tIHRoZSBuZXh0IHNjZW5lLFxuICAgIC8vIGFuZCB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gd291bGQgb3V0bGl2ZSB0aGlzIG9uZS5cbiAgICBpZiAoY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5ob3Zlci5pbnN0YWxsKGN0eC5ob3N0KTtcbiAgICB0aGlzLnNlc3Npb24uY2xhaW1UaWxlcyh0aGlzKT8uYXR0YWNoKGN0eC52aWV3ZXIpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICBzZXRaKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0Wih6KTtcbiAgfVxuXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZS5oaXN0b2dyYW0oY2hhbm5lbCwgYmlucyk7XG4gIH1cblxuICBzZXRJbWFnZVNtb290aGluZyhlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZS5zZXRJbWFnZVNtb290aGluZyhlbmFibGVkKTtcbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlU3BhdGlhbCgpO1xuICAgIHRoaXMuZ2VuZU1hcExvYWRzLmNhbmNlbCgpO1xuICAgIHRoaXMuc2Vzc2lvbi5yZWxlYXNlVGlsZXModGhpcyk7XG4gICAgdGhpcy5pbWFnZS5kaXNwb3NlKCk7XG4gIH1cblxuICBjYW52YXNTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbdGhpcy5jdHguY2FudmFzLmNsaWVudFdpZHRoID8/IDAsIHRoaXMuY3R4LmNhbnZhcy5jbGllbnRIZWlnaHQgPz8gMF07XG4gIH1cblxuICBwb2x5Z29uc1Nob3duQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2ludHMpIHRoaXMucG9pbnRzLnZpc2libGUgPSB0aGlzLnBvaW50c1Zpc2libGUoKTtcbiAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFmdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbi50aWxlcz8ucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGhvdmVyVGlsZXMoKTogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYnNlcnZhdGlvbiB1bmRlciBhIGNsaWVudCBwb3NpdGlvbjogbmFwYXJpLWpzJ3MgcGljayBvbiB0aGUgbWFya2VyIGxheWVyIGl0c2VsZiAoYSBncmlkXG4gICAqIG92ZXIgaXRzIHBvc2l0aW9ucywgcmVidWlsdCBvbmx5IHdoZW4gdGhleSBjaGFuZ2UpLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgbmFtZSBhIGNlbGwgdGhhdCBpc1xuICAgKiBub3QgZHJhd24sIHRoZW4gdGhlIGRyYXduIGluZGV4IG1hcHBlZCBiYWNrIHRvIHRoZSBvYnNlcnZhdGlvbi5cbiAgICpcbiAgICogQSBtYXJrZXIgaXMgaGl0IGFueXdoZXJlIG9uIGl0cyBkcmF3biBkaXNjLCBvciB3aXRoaW4gYHNsYWNrUHhgIHNjcmVlbiBwaXhlbHMgb2YgaXRzIGNlbnRyZVxuICAgKiB3aGVuIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGF0IChhIDEuNSBweCBkb3Qgc3RpbGwgaGFzIHRvIGJlIGhvdmVyYWJsZSksIGFuZCBvZiBzZXZlcmFsIGhpdHMgdGhlXG4gICAqIE5FQVJFU1QgY2VudHJlIHdpbnMgKGFuIGV4YWN0IHRpZSBnb2VzIHRvIHRoZSBvbmUgZHJhd24gb24gdG9wKS4gTm90IG5hcGFyaSdzIGAndG9wbW9zdCdgOiB0aGVcbiAgICogc2xhY2sgaXMgd2lkZXIgdGhhbiBtb3N0IG1hcmtlcnMsIGFuZCBvdmVyIGEgZGVuc2UgZmllbGQgb2Ygc21hbGwgb25lcyBcInRoZSBsYXN0IGRyYXduIHdpdGhpblxuICAgKiAxMCBweFwiIG5hbWVzIGEgbmVpZ2hib3VyIHJhdGhlciB0aGFuIHRoZSBjZWxsIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGlja09ic2VydmF0aW9uKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyLCBzbGFja1B4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIGlmICghcG9pbnRzKSByZXR1cm4gLTE7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5jdHgudmlld2VyO1xuICAgIGNvbnN0IFt3eCwgd3ldID0gdmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgY29uc3Qgem9vbSA9IHZpZXdlci5jYW1lcmEuem9vbTtcbiAgICBjb25zdCBrID0gcG9pbnRzLnBpY2sod3gsIHd5LCB7IHRvbGVyYW5jZTogc2xhY2tQeCAvICh6b29tID4gMCA/IHpvb20gOiAxKSwgdGllQnJlYWs6ICduZWFyZXN0JyB9KTtcbiAgICBpZiAoayA8IDApIHJldHVybiAtMTtcbiAgICByZXR1cm4gdGhpcy5kcmF3biA/IHRoaXMuZHJhd25ba10gOiBrO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1hcmtlcnMgYXJlIGRyYXduOiB3aGVuIHRoZSB1c2VyIHdhbnRzIHRoZW0sIGFuZCBub3Qgd2hpbGUgY2VsbCBvdXRsaW5lcyBhcmUgb25cbiAgICogc2NyZWVuIOKAlCB0aGVuIGEgY2VsbCBJUyBpdHMgb3V0bGluZSwgYW5kIGEgY2lyY2xlIG9uIHRvcCBvZiBpdCBpcyBub2lzZS4gWm9vbWVkIG91dCBwYXN0IHRoZVxuICAgKiBvdXRsaW5lIHRocmVzaG9sZCwgdGhlIGNpcmNsZXMgc3RhbmQgaW4gZm9yIHRoZSBjZWxscy5cbiAgICovXG4gIHByaXZhdGUgcG9pbnRzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzFdO1xuICAgIHJldHVybiAodmlldz8uc2hvd1BvaW50cyA/PyB0cnVlKSAmJiAhdGhpcy5zZXNzaW9uLnRpbGVzPy5vdXRsaW5lc1Nob3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgbWFya2VycyBvdmVyIGEgZnJlc2hseSByZW5kZXJlZCBpbWFnZS4gVHdvIHJlYXNvbnMsIGJvdGggaW52aXNpYmxlIGZyb20gdGhlXG4gICAqIHNwYXRpYWwgc3RvcmUg4oCUIHdoaWNoIGlzIHdoeSBhIHNjcnViIG9yIGEgcmUtcmVuZGVyIG5ldmVyIHJlYWNoZWQgdGhlIG1hcmtlcnMgb24gaXRzIG93bjpcbiAgICogIC0gdGhlIGltYWdlIHJlbmRlciBDTEVBUlMgdGhlIGxheWVyIGxpc3QsIHRha2luZyB0aGUgbWFya2VycyB3aXRoIGl0O1xuICAgKiAgLSBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBkaXNwbGF5ZWQgcGxhbmUgZGVjaWRlcyB3aGljaCBvYnNlcnZhdGlvbnMgYmVsb25nIG9uXG4gICAqICAgIHNjcmVlbiBhdCBhbGwsIHNvIHRoZSBjZWxscyBoYXZlIHRvIG1vdmUgd2l0aCB0aGUgc2VjdGlvbiByYXRoZXIgdGhhbiBoYW5nIG92ZXIgYW5vdGhlci5cbiAgICovXG4gIHByaXZhdGUgcmVkcmF3TWFya2VycygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLnNlc3Npb24ubGF0ZXN0O1xuICAgIGlmICghbGF0ZXN0Py5bMF0pIHJldHVybjtcbiAgICB2b2lkIHRoaXMucmVidWlsZCguLi5sYXRlc3QpO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgb2JzZXJ2YXRpb24gbWFya2VyIGxheWVyIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuY3R4LnZpZXdlcjtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5yZWJ1aWxkcy5uZXh0KCk7XG5cbiAgICAvLyBSZXNvbHZlIGNvbG91cnMgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZTogYSBnZW5lIGZldGNoIGNhbiBmYWlsIG9yIGJlXG4gICAgLy8gc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZSBleGlzdGluZyBsYXllciBmaXJzdCB3b3VsZCBibGFuayB0aGUgdmlldy5cbiAgICBsZXQgZmFjZUNvbG9yOiBQb2ludENvbG9ycztcbiAgICBsZXQgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzaG93bjogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGVuZExvYWRpbmcgPSB0aGlzLmN0eC5iYWRnZS5iZWdpbignT2JzZXJ2YXRpb25zJyk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdoaWNoIG9ic2VydmF0aW9ucyB0aGUgZ2VuZSBmaWx0ZXIga2VlcHMsIHNldHRsZWQgYXBhcnQgZnJvbSB0aGVpciBjb2xvdXJzOiBhIGNvbG91ciBjYW5cbiAgICAgIC8vIGZhbGwgYmFjayB0byBhIGZsYXQgb25lLCB0aGUgZmlsdGVyIGNhbm5vdC4gRHJhd24gd2l0aG91dCBpdCwgZXZlcnkgb2JzZXJ2YXRpb24gd291bGRcbiAgICAgIC8vIHNob3cgYXMgaWYgaXQgZXhwcmVzc2VkIHRoZSBwaWNrZWQgZ2VuZXMuIFNvIGEgZmFpbGVkIHJlYWQga2VlcHMgdGhlIG1hcmtlcnMgYXMgdGhleVxuICAgICAgLy8gd2VyZSBkcmF3biwgYW5kIHRoZSBwYW5lbCBzYXlzIHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIGFwcGxpZWQuXG4gICAgICB0cnkge1xuICAgICAgICBzaG93biA9IGRhdGFzZXQgPyBhd2FpdCB0aGlzLmZpbHRlck1hc2soZGF0YXNldCwgdmlldykgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZ2VuZSBmaWx0ZXIgY291bGQgbm90IGJlIGFwcGxpZWQg4oCUIGtlZXBpbmcgdGhlIG9ic2VydmF0aW9ucyBhcyBkcmF3bicsIGVycik7XG4gICAgICAgIGlmICh0YXNrKCkpIHRoaXMuc2Vzc2lvbi5yZXBvcnRHZW5lRmlsdGVyKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGRhdGFzZXQgPyBhd2FpdCB0aGlzLm1hcmtlclN0eWxlKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbikgOiBudWxsO1xuICAgICAgICBmYWNlQ29sb3IgPSBzdHlsZT8uY29sb3JzID8/IFNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgICAgc3ltYm9scyA9IHN0eWxlPy5zeW1ib2xzID8/IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIGNvbG91cmluZyBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBhIGZsYXQgY29sb3VyJywgZXJyKTtcbiAgICAgICAgZmFjZUNvbG9yID0gU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgICBzeW1ib2xzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5kTG9hZGluZygpO1xuICAgIH1cbiAgICAvLyBBIG5ld2VyIHJlYnVpbGQgKG9yIGEgdGVhcmRvd24pIHN0YXJ0ZWQgd2hpbGUgdGhlIHZlY3RvciB3YXMgaW4gZmxpZ2h0LlxuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgdGhpcy5zZXNzaW9uLnJlcG9ydEdlbmVGaWx0ZXIoZmFsc2UpO1xuICAgIC8vIFRoZSBmaWx0ZXIgYXBwbGllcyB0byB3aGljaGV2ZXIgY29sb3VycyB3b24sIHRoZSBmYWxsYmFjaydzIGluY2x1ZGVkLlxuICAgIGlmIChzaG93biAmJiBkYXRhc2V0KSBmYWNlQ29sb3IgPSBoaWRlVW5zaG93bihmYWNlQ29sb3IsIHNob3duKTtcblxuICAgIGlmICghZGF0YXNldCB8fCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnModmlld2VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIGRhdGFzZXQgd2hvc2UgaW1hZ2UgSVMgaXRzIHZvbHVtZSBzaG93cyBPTkUgUExBTkUgYXQgYSB0aW1lLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGFyZSB0aGUgb2JzZXJ2YXRpb25zIGluIHRoZSBkaXNwbGF5ZWQgcGxhbmUsIGRyYXduIGluIHRoYXQgcGxhbmUnc1xuICAgIC8vIHBpeGVsIGdyaWQuIFdpdGhvdXQgdGhlIGZpbHRlciB0aGUgc3BlY2ltZW4ncyB3aG9sZSBkZXB0aCBwaWxlcyBvbnRvIG9uZVxuICAgIC8vIHNlY3Rpb24gYW5kIHJlYWRzIGFzIGEgc21lYXI7IHdpdGhvdXQgdGhlIGFmZmluZSB0aGUgY29vcmRpbmF0ZXMgYXJlIHJlYWRcbiAgICAvLyBhcyBwaXhlbHMgYW5kIGxhbmQgb2ZmIHRoZSBzbGljZSBlbnRpcmVseS5cbiAgICBjb25zdCBzbGFiID0gc2xhYkF0KGRhdGFzZXQsIHRoaXMuY3R4LnooKSk7XG4gICAgLy8gVGhlIGdlbmUgbWFwIGdvZXMgVU5ERVIgdGhlIGNlbGxzLCBzbyBpdCBpcyBzZXR0bGVkIGJlZm9yZSB0aGV5IGFyZSBhZGRlZC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHNsYWIpO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgdGhpcy5kcmF3TWFya2Vycyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIGZhY2VDb2xvciwgc2xhYiwgc3ltYm9scyk7XG4gIH1cblxuICAvKiogTm90aGluZyB0byBkcmF3OiBkcm9wIHRoZSBtYXJrZXJzIGFuZCB0aGUgZ2VuZSBtYXAuICovXG4gIHByaXZhdGUgcmVtb3ZlTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhd24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMgb3ZlciB0aGUgaW1hZ2UgKGFuZCB0aGUgZ2VuZSBtYXApOiByZXN0eWxlZCBpbiBwbGFjZSBmb3IgYVxuICAgKiBkaXNwbGF5LW9ubHkgY2hhbmdlLCBlbHNlIGEgbmV3IGxheWVyLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3TWFya2VycyhcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIGZhY2VDb2xvcjogUG9pbnRDb2xvcnMsXG4gICAgc2xhYjogU2xhYiB8IG51bGwsXG4gICAgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBzaXplID0gbWFya2VyU2l6ZXMob2JzLCB2aWV3LCBzbGFiKTtcblxuICAgIC8vIG5hcGFyaSdzIGltYWdlIHZpZXcgQ0xFQVJTIHRoZSB3aG9sZSBsYXllciBsaXN0IG9uIGV2ZXJ5IHJlbmRlciwgc28gdGhlXG4gICAgLy8gbWFya2VycyBnbyB3aXRoIGl0IHdoZW5ldmVyIHRoZSBpbWFnZSBpcyByZS1yZW5kZXJlZCDigJQgYSBzY3J1YiwgYSBjb250cmFzdFxuICAgIC8vIGNoYW5nZS4gVGhlIGNhY2hlZCBoYW5kbGUgaXMgdGhlbiBkZXRhY2hlZCwgYW5kIG11dGF0aW5nIGl0IGRyYXdzIG5vdGhpbmc6XG4gICAgLy8gdHJlYXQgYSBsYXllciB0aGF0IGlzIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgYXMgYWJzZW50IHNvIGl0IGdldHMgcmUtYWRkZWQuXG4gICAgaWYgKHRoaXMucG9pbnRzICYmICF2aWV3ZXIubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKHRoaXMucG9pbnRzKSkge1xuICAgICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5sYXllcktleSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0ltYWdlID0gKCEhcmVmIHx8ICEhZGF0YXNldC52b2x1bWUpICYmIHZpZXcuc2hvd0ltYWdlICE9PSBmYWxzZTtcbiAgICAvLyBBIHNpemUvY29sb3VyL29wYWNpdHkvc2VsZWN0aW9uIGNoYW5nZSBpcyBESVNQTEFZLW9ubHk6IG11dGF0ZSB0aGUgbGF5ZXJcbiAgICAvLyByYXRoZXIgdGhhbiBkcm9wcGluZyBhbmQgcmUtYWRkaW5nIGl0LiBCb3RoIHNldHRlcnMgYnVtcCB0aGUgbGF5ZXInc1xuICAgIC8vIGRhdGFWZXJzaW9uLCB3aGljaCBpcyB3aGF0IG1ha2VzIG5hcGFyaS1qcyByZWJ1aWxkIHRoZSBpbnN0YW5jZSBidWZmZXIgYW5kXG4gICAgLy8gcmVkcmF3IOKAlCBhbmQgaXQgYXZvaWRzIHJlYnVpbGRpbmcgODRrIHBvc2l0aW9ucyB0byBjaGFuZ2Ugb25lIG51bWJlci5cbiAgICAvLyBUaGUgc2xpY2UgaXMgcGFydCBvZiB0aGUga2V5OiBhIHNjcnViIGNoYW5nZXMgV0hJQ0ggb2JzZXJ2YXRpb25zIGFyZSBkcmF3bixcbiAgICAvLyB3aGljaCBpcyBnZW9tZXRyeSwgbm90IGRpc3BsYXkuXG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtvYnMuY291bnR9OiR7c2xhYj8uc2xpY2UgPz8gJyd9YDtcbiAgICBpZiAodGhpcy5wb2ludHMgJiYga2V5ID09PSB0aGlzLmxheWVyS2V5KSB7XG4gICAgICB0aGlzLnBvaW50cy5zaXplID0gc2l6ZTtcbiAgICAgIHRoaXMucG9pbnRzLnZpc2libGUgPSB0aGlzLnBvaW50c1Zpc2libGUoKTtcbiAgICAgIHRoaXMucG9pbnRzLmZhY2VDb2xvciA9IGdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIHNsYWI/LmluZGljZXMpO1xuICAgICAgdGhpcy5wb2ludHMuc3ltYm9scyA9IGdhdGhlclN5bWJvbHMoc3ltYm9scywgc2xhYj8uaW5kaWNlcyk7XG4gICAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCBzaG93SW1hZ2UpO1xuICAgICAgdGhpcy5jdHgudG9vbHMucmVnaW9uT3ZlcmxheT8uc2V0UmVnaW9uc1Zpc2libGUodmlldy5zaG93QW5ub3RhdGlvbnMgIT09IGZhbHNlKTtcbiAgICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHJhd24gPSBzbGFiPy5pbmRpY2VzO1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9ic2VydmF0aW9uUG9zaXRpb25zKG9icywgZHJhd24pO1xuICAgIHRoaXMubGF5ZXJLZXkgPSBrZXk7XG4gICAgdGhpcy5kcmF3biA9IGRyYXduID8/IG51bGw7XG4gICAgdGhpcy5wb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICBzaXplLFxuICAgICAgZmFjZUNvbG9yOiBnYXRoZXJDb2xvcnMoZmFjZUNvbG9yLCBkcmF3biksXG4gICAgICAvLyBFYWNoIG9ic2VydmF0aW9uJ3MgZ2VuZSdzIGljb24gd2hpbGUgdGhleSBhcmUgY29sb3VyZWQgYnkgZ2VuZTsgdGhlIGxheWVyJ3MgZGlzYyBlbHNlLlxuICAgICAgc3ltYm9sczogZ2F0aGVyU3ltYm9scyhzeW1ib2xzLCBkcmF3biksXG4gICAgICAvLyBObyBib3JkZXI6IGF0IFZpc2l1bSBzcG90IGRlbnNpdHkgYW4gb3V0bGluZSBwZXIgbWFya2VyIHJlYWRzIGFzIG5vaXNlLFxuICAgICAgLy8gYW5kIGl0IGNvc3RzIGEgc2Vjb25kIGNvbG91ciBhcnJheS5cbiAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgICAgLy8gVGhlIGRhdGFzZXQncyBkYXRhLT53b3JsZCBhZmZpbmUuIFNwYXRpYWxEYXRhIHJlY29yZHMgb25lIHBlciBjb29yZGluYXRlXG4gICAgICAvLyBzeXN0ZW0gKFZpc2l1bSBzcG90IGNvb3JkcyBhcmUgaW4gdGhlIEZVTEwtcmVzb2x1dGlvbiBmcmFtZSB3aGlsZSB0aGVcbiAgICAgIC8vIHNlcnZlZCBpbWFnZSBtYXkgYmUgdGhlIGhpcmVzIGRvd25zY2FsZSksIHNvIHdpdGhvdXQgdGhpcyB0aGUgbWFya2Vyc1xuICAgICAgLy8gbGFuZCBpbiB0aGUgcmlnaHQgc2hhcGUgYXQgdGhlIHdyb25nIHNjYWxlLiBEZWZhdWx0cyB0byBpZGVudGl0eSB3aGVuXG4gICAgICAvLyB0aGUgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gdGhlIGltYWdlJ3MgcGl4ZWwgc3BhY2UuXG4gICAgICBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sXG4gICAgICB0cmFuc2xhdGU6IHJlZj8udHJhbnNsYXRlID8/IFswLCAwXSxcbiAgICAgIHZpc2libGU6IHRoaXMucG9pbnRzVmlzaWJsZSgpLFxuICAgIH0pO1xuICAgIC8vIE91dGxpbmVzLCBkZW5zaXR5IGFuZCB0cmFuc2NyaXB0cyBnbyBiYWNrIG92ZXIgdGhlIG1hcmtlcnMganVzdCBhZGRlZC5cbiAgICB0aGlzLnNlc3Npb24udGlsZXM/LmFmdGVyT2JzZXJ2YXRpb25zKCk7XG4gICAgdGhpcy5mcmFtZU9uY2Uodmlld2VyLCBkYXRhc2V0LmlkLCBwb3NpdGlvbnMsICEhcmVmKTtcbiAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCBzaG93SW1hZ2UpO1xuICAgIHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuY3R4LnRvb2xzLnJlZ2lvbk92ZXJsYXk7XG4gICAgaWYgKCFvdmVybGF5Py5zZXRXb3JsZFF1YW50dW0pIHJldHVybjtcbiAgICBpZiAoZGF0YXNldC5pbWFnZVJlZiB8fCBkYXRhc2V0LnZvbHVtZSkge1xuICAgICAgb3ZlcmxheS5zZXRXb3JsZFF1YW50dW0oUElYRUxfV09STERfUVVBTlRVTSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgY29uc3QgeCA9IHBvc2l0aW9uc1tpXTtcbiAgICAgIGNvbnN0IHkgPSBwb3NpdGlvbnNbaSArIDFdO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkgY29udGludWU7XG4gICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgIH1cbiAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bSh3b3JsZFF1YW50dW1Gb3JFeHRlbnQobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgaW1hZ2UgbGF5ZXIgZm9yIGEgZGF0YXNldCB0aGF0IGJyaW5ncyBubyBpbWFnZSBvZiBpdHMgb3duLlxuICAgKlxuICAgKiBUaGUgaG9zdCdzIHZpZXdlciBrZWVwcyB3aGF0ZXZlciBpbWFnZSB3YXMgbGFzdCBsb2FkZWQsIGFuZCBmb3IgYSBkYXRhc2V0IHRoYXRcbiAgICogcmVnaXN0ZXJzIG9udG8gbm9uZSB0aGF0IHBpY3R1cmUgYmVsb25ncyB0byBzb21ldGhpbmcgZWxzZSBlbnRpcmVseSDigJQgdGhlIGV4YW1wbGUnc1xuICAgKiBkZWZhdWx0IHNsaWRlLCBzYXkuIEl0IGlzIG5vdCBtZXJlbHkgaXJyZWxldmFudDogdGhlIHR3byBsaXZlIGluIGRpZmZlcmVudCBjb29yZGluYXRlXG4gICAqIHNwYWNlcyAoaW1hZ2UgcGl4ZWxzIGFnYWluc3QgdGhlIGVtYmVkZGluZydzIG93biB1bml0cyksIHNvIHRoZSBsZWZ0b3ZlciBpcyBtYWduaWZpZWRcbiAgICogcm91Z2hseSBhIGh1bmRyZWRmb2xkLiBBdCB0aGUgZml0dGVkIHpvb20gdGhlIGNhbWVyYSBzaXRzIGluc2lkZSBpdHMgY29ybmVyLCB3aGVyZSBpdFxuICAgKiByZWFkcyBhcyBibGFuayBiYWNrZ3JvdW5kLCBhbmQgaXQgYXBwZWFycyBvbmx5IG9uY2UgeW91IHpvb20gb3V0IGZhciBlbm91Z2ggdG8gZmluZFxuICAgKiBpdCDigJQgd2hpY2ggaXMgZXhhY3RseSBob3cgaXQgZ2V0cyBub3RpY2VkLlxuICAgKlxuICAgKiBIaWRkZW4gcmF0aGVyIHRoYW4gcmVtb3ZlZCwgYW5kIGhpZGRlbiBIRVJFIHJhdGhlciB0aGFuIGJ5IGNsZWFyaW5nIHRoZSBob3N0J3MgaW1hZ2VcbiAgICogc3RhdGU6IHRoYXQgc3RhdGUgZHJpdmVzIHRoZSB3aG9sZSByZW5kZXIgcGlwZWxpbmUsIGluY2x1ZGluZyBhIFBsb3RseSBiYWNrZW5kIHdob3NlXG4gICAqIGZpZWxkcyBhcmUgZGVjbGFyZWQgd2l0aCBkZWZpbml0ZS1hc3NpZ25tZW50IGFzc2VydGlvbnMsIHNvIGVtcHR5aW5nIGl0IHRocm93cyBmcm9tXG4gICAqIHdoaWNoZXZlciBmaWVsZCB0aGUgbmV4dCBwYXRoIGhhcHBlbnMgdG8gcmVhZC4gVGhpcyB0b3VjaGVzIG9uZSBsYXllcidzIHZpc2liaWxpdHlcbiAgICogYW5kIG5vdGhpbmcgZWxzZS5cbiAgICovXG4gIGhpZGVGb3JlaWduSW1hZ2Uodmlld2VyOiBQaWNrPFZpZXdlciwgJ2xheWVycycgfCAncmVxdWVzdFJlbmRlcic+LCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gTm8gaW1hZ2Ugb2YgaXRzIG93biDihpIgbm90aGluZyBmb3IgYW4gb3ZlcnZpZXcgdG8gc2hvdyBlaXRoZXIuXG4gICAgdGhpcy5pbWFnZS5zaG93TmF2aWdhdG9yRm9yKGRhdGFzZXRIYXNQaXhlbHMpO1xuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5zZXNzaW9uLnRpbGVzO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2Ygdmlld2VyLmxheWVycy5pdGVtcykge1xuICAgICAgaWYgKGxheWVyLmtpbmQgIT09ICdpbWFnZScpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIHRyYW5zY3JpcHQtZGVuc2l0eSByYXN0ZXIgYW5kIHRoZSBnZW5lIG1hcCBhcmUgaW1hZ2UgbGF5ZXJzIHRvbywgYnV0IHRoZXkgYXJlXG4gICAgICAvLyBkYXRhLCBub3QgdGhlIHRpc3N1ZTogdGhlIEltYWdlcyB0b2dnbGUgbXVzdCBub3QgdGFrZSB0aGVtIGRvd24gd2l0aCB0aGUgc2xpZGUuXG4gICAgICBpZiAodGlsZXM/Lm93bnMobGF5ZXIpIHx8IGxheWVyID09PSB0aGlzLmdlbmVNYXBMYXllcikgY29udGludWU7XG4gICAgICAvLyBSZS1zaG93biB3aGVuIGEgZGF0YXNldCB0aGF0IG93bnMgYW4gaW1hZ2UgY29tZXMgYmFjaywgc28gc3dpdGNoaW5nIGJldHdlZW5cbiAgICAgIC8vIGRhdGFzZXRzIGRvZXMgbm90IGxlYXZlIHRoZSB0aXNzdWUgcGVybWFuZW50bHkgaGlkZGVuLlxuICAgICAgbGF5ZXIudmlzaWJsZSA9IGRhdGFzZXRIYXNQaXhlbHM7XG4gICAgfVxuICAgIC8vIFNob3dpbmcgdGhlIHRpc3N1ZSBtdXN0IG5vdCBzaG93IGl0cyBjaGFubmVscyB0aGUgdXNlciBvciB0aGUgZGVmYXVsdHMgc3dpdGNoZWQgb2ZmIChhXG4gICAgLy8gMjItY2hhbm5lbCBwbGF0ZSBzdGFydHMgd2l0aCBmb3VyKTogdGhlIGNoYW5uZWwgc3RhdGVzIGRlY2lkZSB3aGljaCBvZiBpdHMgbGF5ZXJzIGRyYXcuXG4gICAgaWYgKGRhdGFzZXRIYXNQaXhlbHMpIHRoaXMuaW1hZ2UucmVhcHBseURpc3BsYXlTdGF0ZSgpO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWUgdGhlIGNhbWVyYSBvbiB0aGUgb2JzZXJ2YXRpb25zLCBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlLlxuICAgKlxuICAgKiBUaGUgMkQgY2FtZXJhIGlzIG5vcm1hbGx5IGZpdHRlZCB0byB0aGUgSU1BR0UsIGJlY2F1c2UgdGhlIG9ic2VydmF0aW9ucyBhcmUgaW4gdGhhdFxuICAgKiBpbWFnZSdzIHBpeGVsIHNwYWNlIGFuZCBmcmFtaW5nIHRoZSBpbWFnZSBmcmFtZXMgdGhlbSB0b28uIEEgZGF0YXNldCB3aXRoIG5vXG4gICAqIHJlZmVyZW5jZSBpbWFnZSBoYXMgY29vcmRpbmF0ZXMgaW4gaXRzIG93biB1bml0cyBpbnN0ZWFkIOKAlCBzZXFGSVNIJ3Mgc3BhbiBhYm91dFxuICAgKiA1eDcg4oCUIHNvIHRoZSBpbWFnZSBmcmFtaW5nIGxlZnQgb3ZlciBmcm9tIHdoYXRldmVyIHdhcyBvbiBzY3JlZW4gYmVmb3JlIHB1dHMgdGhlXG4gICAqIHdob2xlIGNsb3VkIG9mZnNjcmVlbjogbWVhc3VyZWQgYXQgOS43IHggMTMuNCBQSVhFTFMsIGNlbnRyZWQgMjU2cHggZnJvbSB3aGVyZSB0aGVcbiAgICogY2FtZXJhIHdhcyBsb29raW5nLiBUaGUgcG9pbnRzIGFyZSBhbGwgdGhlcmUgYW5kIGRyYXduOyB0aGV5IGFyZSBhIHNwZWNrLiBXaGljaFxuICAgKiBsb29rcyBleGFjdGx5IGxpa2UgdGhlIGRhdGFzZXQgaGF2aW5nIGZhaWxlZCB0byBsb2FkLlxuICAgKlxuICAgKiBPbmNlIHBlciBkYXRhc2V0LCBhcyBuYXBhcmktanMncyBgZml0M2Q6ICdvbmNlJ2AgZG9lcyBmb3IgdGhlIGNsb3VkOiByZS1jb2xvdXJpbmcsXG4gICAqIHNsaWNpbmcgb3IgcGlja2luZyBhIGdlbmUgcmUtYWRkcyB0aGlzIGxheWVyLCBhbmQgcmUtZnJhbWluZyBvbiB0aG9zZSB3b3VsZCBtb3ZlXG4gICAqIHRoZSBjYW1lcmEgdW5kZXIgdGhlIHVzZXIg4oCUIHRoZSBjYW1lcmEgdG9vbHMgYW5kIHRoZSBjYW52YXMgZHJhZyBhcmUgbWVhbnQgdG8gYmVcbiAgICogdGhlIG9ubHkgdGhpbmdzIHRoYXQgZG8uXG4gICAqL1xuICBwcml2YXRlIGZyYW1lT25jZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldElkOiBzdHJpbmcsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LCByZWdpc3RlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gR2F0ZWQgb24gd2hldGhlciBUSElTIGRhdGFzZXQgcmVnaXN0ZXJzIG9udG8gYW4gaW1hZ2UsIG5vdCBvbiB0aGUgaW1hZ2Ugc2l6ZTogdGhhdCBrZWVwc1xuICAgIC8vIHRoZSBsYXN0IHBsb3R0ZWQgaW1hZ2UncyBkaW1lbnNpb25zIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgc28gYSBzdGFsZSA1MTJ4MzgzIHJlYWQgYXNcbiAgICAvLyBcInRoZXJlIGlzIGFuIGltYWdlXCIgYW5kIHNraXBwZWQgdGhlIGZyYW1pbmcgZW50aXJlbHkuXG4gICAgaWYgKHJlZ2lzdGVyZWQpIHJldHVybjtcbiAgICAvLyBPbmNlIHBlciBkYXRhc2V0IChzZWUgYWJvdmUpLlxuICAgIGlmICh0aGlzLmZyYW1lZCA9PT0gZGF0YXNldElkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGNhbnZhcyB9ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZml0ID0gZnJhbWVQb3NpdGlvbnMocG9zaXRpb25zLCBjYW52YXMuY2xpZW50V2lkdGggPz8gMCwgY2FudmFzLmNsaWVudEhlaWdodCA/PyAwKTtcbiAgICAvLyBOdWxsIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gZnJhbWUgb247IGxlYXZlIHRoZSBjYW1lcmEgd2hlcmUgaXQgaXMgcmF0aGVyXG4gICAgLy8gdGhhbiBtb3ZpbmcgdGhlIHZpZXcgZm9yIGEgZGF0YXNldCB3ZSBjYW5ub3QgZml0LlxuICAgIGlmICghZml0KSByZXR1cm47XG4gICAgdmlld2VyLmNhbWVyYS5zZXQoZml0LmNlbnRlciwgZml0Lnpvb20gPz8gdmlld2VyLmNhbWVyYS56b29tKTtcbiAgICB0aGlzLmZyYW1lZCA9IGRhdGFzZXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKipnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIGFzIGEgY29udGludW91cyBmaWVsZCBkcmF3biB1bmRlclxuICAgKiB0aGUgY2VsbHMuXG4gICAqXG4gICAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBhIGdlbmUgc2F5cyB3aGljaCBjZWxscyBleHByZXNzIGl0OyBpdCBjYW5ub3Qgc2F5IHdoZXJlLFxuICAgKiBiZWNhdXNlIHRoZSBleWUgd2lsbCBub3QgaW50ZWdyYXRlIHRob3VzYW5kcyBvZiBkb3RzIGludG8gYSB0ZXJyaXRvcnkuIFRoZSBmaWVsZFxuICAgKiBpcyBhIGtlcm5lbC13ZWlnaHRlZCBNRUFOIHBlciBjZWxsIChzZWUgYHNwYXRpYWwtZXhwcmVzc2lvbi50c2ApLCBzbyBhIGRlbnNlXG4gICAqIHJlZ2lvbiBkb2VzIG5vdCBnbG93IG1lcmVseSBmb3IgYmVpbmcgZGVuc2UsIGFuZCBpdCBpcyB0cmFuc3BhcmVudCB3aGVyZXZlciBub1xuICAgKiBjZWxsIHdhcyBtZWFzdXJlZCDigJQgYW4gdW5zYW1wbGVkIGdhcCBtdXN0IG5vdCByZWFkIGFzIFwibm90IGV4cHJlc3NlZFwiLlxuICAgKlxuICAgKiBJdCBzaGFyZXMgdGhlIHBvaW50cycgTFVULCBwZXJjZW50aWxlIHdpbmRvdyBhbmQgbG9nIGZsYWcsIHNvIHRoZSBsYXllciB1bmRlclxuICAgKiB0aGUgY2VsbHMgYW5kIHRoZSBjZWxscyB0aGVtc2VsdmVzIGNhbm5vdCBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIERJU1BMQVlFRCBpbWFnZSdzIHBpeGVsIGdyaWQsIGNvYXJzZW5lZCBzbyB0aGUgbG9uZyBzaWRlIGlzIGF0XG4gICAqIG1vc3QgYEdFTkVfTUFQX01BWF9TSURFYDogYSBzbW9vdGggZmllbGQgZ2FpbnMgbm90aGluZyBmcm9tIGEgc2xpZGUncyBmdWxsXG4gICAqIHJlc29sdXRpb24uIEZvciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGF0IGdyaWQgaXMgdGhlIGN1cnJlbnQgc2xpY2UsIGFuZCBvbmx5XG4gICAqIHRoYXQgcGxhbmUncyBvYnNlcnZhdGlvbnMgYXJlIGluY2x1ZGVkIOKAlCB0aGUgc2FtZSBydWxlIHRoZSBtYXJrZXJzIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2xhYjogU2xhYiB8IG51bGwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zZXNzaW9uLmdlbmVNYXA7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuXG4gICAgLy8gVHdvIGNsb2NrczogdGhlIEZJRUxEIGRlcGVuZHMgb24gdGhlIGdlbmUsIHRoZSBwbGFuZSBhbmQgdGhlIGJhbmR3aWR0aCwgd2hpbGVcbiAgICAvLyB0aGUgY29sb3VycyBkZXBlbmQgb24gdGhlIHdpbmRvdywgdGhlIGxvZyBmbGFnIGFuZCB0aGUgb3BhY2l0eS4gUmVjb2xvdXJpbmcgYVxuICAgIC8vIGNhY2hlZCBmaWVsZCBpcyBhIGZyYWN0aW9uIG9mIGVzdGltYXRpbmcgb25lLlxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbZGF0YXNldC5pZCwgZ2VuZSwgc2xhYj8uc2xpY2UgPz8gJycsIHNtb290aGluZywgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgICAgZmllbGRLZXksXG4gICAgICAgICAgY2xpcC5qb2luKCcsJyksXG4gICAgICAgICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgICAgICAgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgICB0aGlzLmN0eC5kaXNwbGF5LmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICAvLyBBIHN0aXRjaGVkIHNsaWNlIHJlLXJlbmRlciBjbGVhcnMgdGhlIHdob2xlIGxheWVyIGxpc3QsIHRoZSBtYXAgd2l0aCBpdCwgYW5kIHRoZSBrZXkgb2YgYVxuICAgIC8vIHJlZ2lzdGVyZWQgaW1hZ2UncyBtYXAgZG9lcyBub3QgbmFtZSB0aGUgc2xpY2U6IGEgbWFwIG5vIGxvbmdlciBpbiB0aGUgc2NlbmUgaXMgYWJzZW50LFxuICAgIC8vIGFzIHRoZSBtYXJrZXJzJyBpcyAoc2VlIGByZWJ1aWxkYCksIHNvIGl0IGlzIGRyYXduIGFnYWluIGZyb20gdGhlIGNhY2hlZCBmaWVsZC5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIgJiYgIXZpZXdlci5sYXllcnMuaXRlbXMuaW5jbHVkZXModGhpcy5nZW5lTWFwTGF5ZXIpKSB7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIGNhY2hlLmZpZWxkID0gbnVsbDtcbiAgICAgIGNhY2hlLmtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHJhc3RlciBjb3ZlcnMgdGhlIGRpc3BsYXllZCBpbWFnZTsgd2l0aG91dCBvbmUgdGhlcmUgaXMgbm90aGluZyB0b1xuICAgIC8vIG92ZXJsYXkgYW5kIHRoZSBjbG91ZCBpcyB0aGUgM0QgbW9kZSdzIGJ1c2luZXNzLCBub3QgdGhpcyBvbmUncy4gR2F0ZWQgb24gdGhlXG4gICAgLy8gREFUQVNFVCBicmluZ2luZyBwaXhlbHMsIG5vdCBvbiB0aGUgaW1hZ2Ugc2l6ZTogdGhhdCBrZWVwcyB0aGUgbGFzdCBwbG90dGVkIGltYWdlJ3NcbiAgICAvLyBzaXplIGFmdGVyIHRoZSBob3N0IGNsZWFycyBpdCwgd2hpY2ggd291bGQgc2l6ZSB0aGUgbWFwIG92ZXIgdGhlIHdyb25nIGV4dGVudC5cbiAgICBpZiAoIXNsYWIgJiYgIWRhdGFzZXQuaW1hZ2VSZWYpIHJldHVybjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5jdHguaW1hZ2VTaXplKCk7XG4gICAgY29uc3QgaW1hZ2VXID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS53aWR0aCA6IHNpemUud2lkdGg7XG4gICAgY29uc3QgaW1hZ2VIID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS5oZWlnaHQgOiBzaXplLmhlaWdodDtcbiAgICBpZiAoIWltYWdlVyB8fCAhaW1hZ2VIKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChNYXRoLm1heChpbWFnZVcsIGltYWdlSCkgLyBHRU5FX01BUF9NQVhfU0lERSkpO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSBjYWNoZS5rZXkpIHtcbiAgICAgIGNvbnN0IGxvYWQgPSB0aGlzLmdlbmVNYXBMb2Fkcy5uZXh0KCk7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICBsZXQgZXN0aW1hdGVkOiBFeHByZXNzaW9uRmllbGQgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXN0aW1hdGVkID0gYXdhaXQgY29tcHV0ZUV4cHJlc3Npb25GaWVsZEFzeW5jKFxuICAgICAgICAgIGRhdGFzZXQub2JzZXJ2YXRpb25zLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlZjogc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWYsXG4gICAgICAgICAgICB3aWR0aDogTWF0aC5jZWlsKGltYWdlVyAvIHN0ZXApLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmNlaWwoaW1hZ2VIIC8gc3RlcCksXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgc2lnbWE6IEdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gQSBwbGFuZSB3aW5zIG92ZXIgYSBzZWxlY3Rpb246IHRoZSAyRCB2aWV3IGlzIHNob3dpbmcgb25lIHNlY3Rpb24sIHNvIGFcbiAgICAgICAgICAgIC8vIGZpZWxkIHNwYW5uaW5nIHRoZSBzcGVjaW1lbidzIGRlcHRoIHdvdWxkIG5vdCBiZSB0aGUgdGhpbmcgb24gc2NyZWVuLlxuICAgICAgICAgICAgaW5kaWNlczogc2xhYj8uaW5kaWNlcyA/PyBpblNlbGVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBsb2FkLnNpZ25hbCB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgbWFwLCBvciB0aGUgc2NlbmUgd2VudCBhd2F5XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjYWNoZS5maWVsZCA9IGVzdGltYXRlZDtcbiAgICAgIGNhY2hlLmtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IGNhY2hlLmZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IGx1dCA9IHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KTtcbiAgICAvLyBPdmVyIHRoZSBtZWFzdXJlZCBwaXhlbHMgb25seTogdW5tZWFzdXJlZCBvbmVzIGFyZSAwIGFuZCB3b3VsZCBkcmFnIHRoZSBsb3cgZW5kIGRvd24uXG4gICAgY29uc3QgW2xvLCBoaV0gPSBmaWVsZENvbnRyYXN0V2luZG93KGZpZWxkLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCByZ2JhID0gY29sb3JFeHByZXNzaW9uRmllbGQoZmllbGQsIGx1dCwgW2xvLCBoaV0sIHtcbiAgICAgIGxvZzogdmlldy5sb2dTY2FsZSxcbiAgICAgIC8vIFRoZSBNQVAncyBvd24gb3BhY2l0eTogcmVhZGluZyBhIGZpZWxkIHVuZGVyIHRoZSBjZWxscyBtZWFucyB0dXJuaW5nIHRoZVxuICAgICAgLy8gY2VsbHMgZG93biwgd2hpY2ggbXVzdCBub3QgdGFrZSB0aGUgZmllbGQgd2l0aCB0aGVtLlxuICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICB9KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRJbWFnZShcbiAgICAgIHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGZpZWxkLndpZHRoLCBoZWlnaHQ6IGZpZWxkLmhlaWdodCwgY2hhbm5lbHM6IDQsIGR0eXBlOiAndWludDgnLCBkYXRhOiByZ2JhIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9YCxcbiAgICAgICAgc2NhbGU6IFtzdGVwLCBzdGVwXSxcbiAgICAgICAgdHJhbnNsYXRlOiBbMCwgMF0sXG4gICAgICAgIGJsZW5kaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIGBhZGRJbWFnZWAgYXBwZW5kcywgc28gdGhlIG1hcCBqdXN0IGxhbmRlZCBvdmVyIHRoZSBjZWxscyAoZHJhd24gYnkgdGhpcyByZWJ1aWxkJ3NcbiAgICAvLyBwcmV2aW91cyBwYXNzLCBvciBieSBhIG5ld2VyIHJlYnVpbGQgd2hpbGUgdGhlIGZpZWxkIHdhcyBjb21wdXRpbmcpOiBtb3ZlIGl0IHRvIGp1c3QgdW5kZXJcbiAgICAvLyB0aGVtLiBBIG1vdmUga2VlcHMgdGhlIG1hcmtlcnMnIEdQVSBidWZmZXJzLCB3aGVyZSBkcm9wcGluZyBhbmQgcmUtYWRkaW5nIHRoZSBtYXJrZXJzXG4gICAgLy8gcmUtdXBsb2FkZWQgZXZlcnkgb25lIG9mIHRoZW0gKE5BUEFSSS1CT1VOREFSWS0xMSkuIFdpdGhvdXQgbWFya2VycyBvbiBzY3JlZW4gdGhlcmUgaXNcbiAgICAvLyBub3RoaW5nIHRvIGdvIHVuZGVyOyB0aGUgcmVidWlsZCBhZGRzIHRoZW0gb3ZlciB0aGUgbWFwLlxuICAgIGNvbnN0IHVuZGVyID0gdGhpcy5wb2ludHMgPyB2aWV3ZXIubGF5ZXJzLml0ZW1zLmluZGV4T2YodGhpcy5wb2ludHMpIDogLTE7XG4gICAgaWYgKHVuZGVyID49IDApIHZpZXdlci5sYXllcnMubW92ZSh0aGlzLmdlbmVNYXBMYXllciwgdW5kZXIpO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLW9ic2VydmF0aW9uIGNvbG91cnMgZm9yIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUsIG9yIGEgc2luZ2xlIGZsYXQgY29sb3VyIHdoZW4gbm90aGluZyBpc1xuICAgKiBzZWxlY3RlZCB0byBjb2xvdXIgYnkuIENhdGVnb3JpY2FsIGNvbHVtbnMgdXNlIHRoZSBjb2x1bW4ncyBvd24gcGFsZXR0ZTsgY29udGludW91cyBjb2x1bW5zXG4gICAqIGFuZCBnZW5lIHZlY3RvcnMgZ28gdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggYSBwZXJjZW50aWxlLWNsaXBwZWQgd2luZG93LlxuICAgKi9cbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMgdGhlIHZpZXcncyBnZW5lIGZpbHRlciBrZWVwcyAoMSA9IGRyYXduKSwgb3IgbnVsbCB3aGVuIGl0IGhhcyBub25lLlxuICAgKiAgUmVqZWN0cyB3aGVuIGFuIGV4cHJlc3Npb24gcmVhZCBmYWlscy4gKi9cbiAgcHJpdmF0ZSBmaWx0ZXJNYXNrKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBpZiAoIXBvcnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgcmV0dXJuIG9ic2VydmF0aW9uR2VuZU1hc2sodmlldywgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIChnKSA9PiBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZykpO1xuICB9XG5cbiAgLyoqIFRoZSBtYXJrZXJzJyBjb2xvdXJzIChhbmQgaWNvbnMsIGJ5IGdlbmUpIGJlZm9yZSB0aGUgZ2VuZSBmaWx0ZXIgaGlkZXMgYW55IG9mIHRoZW0uICovXG4gIHByaXZhdGUgYXN5bmMgbWFya2VyU3R5bGUoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHsgY29sb3JzOiBQb2ludENvbG9yczsgc3ltYm9sczogVWludDhBcnJheSB8IG51bGwgfT4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBjb25zdCBjb3VudCA9IGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50O1xuICAgIC8vIENvbG91cmVkIGJ5IGdlbmU6IGVhY2ggb2JzZXJ2YXRpb24gaW4gaXRzIGdlbmUncyBjb2xvdXIsIGRyYXduIGFzIGl0cyBnZW5lJ3MgaWNvbi4gVGhhdCBpc1xuICAgIC8vIGEgY29sb3VyLCBzbyBhIGZhaWxlZCByZWFkIGZhbGxzIGJhY2sgdG8gdGhlIHZpZXcncyBjb2xvdXIgc291cmNlLCBhcyBhbnkgY29sb3VyIGRvZXMuXG4gICAgY29uc3QgYnlHZW5lID0gcG9ydFxuICAgICAgPyBhd2FpdCBvYnNlcnZhdGlvbkdlbmVTdHlsZSh2aWV3LCBjb3VudCwgKGcpID0+IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnKSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gY29sb3VyaW5nIGJ5IGdlbmUgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbG91ciBzb3VyY2UnLCBlcnIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGNvbG9ycyA9IGJ5R2VuZVxuICAgICAgPyBlbmNvZGVDYXRlZ29yaWNhbChieUdlbmUuY29kZXMsIHtcbiAgICAgICAgICBjb2xvcnM6IGJ5R2VuZS5jb2xvcnMsXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkOiBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKSxcbiAgICAgICAgfSlcbiAgICAgIDogYXdhaXQgdGhpcy5zb3VyY2VDb2xvcnMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICBjb25zdCBzeW1ib2xzID0gYnlHZW5lID8gZ2x5cGhTeW1ib2xzKGJ5R2VuZS5jb2RlcywgYnlHZW5lLmdseXBocykgOiBudWxsO1xuICAgIHJldHVybiB7IGNvbG9ycywgc3ltYm9scyB9O1xuICB9XG5cbiAgLyoqIHtAbGluayBmYWNlQ29sb3JzfSBiZWZvcmUgdGhlIGdlbmUgZmlsdGVyOiB3aGF0IHRoZSBjb2xvdXIgc291cmNlIGFuZCB0aGUgc2VsZWN0aW9uIG1ha2Ugb2YgdGhlbS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzb3VyY2VDb2xvcnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPFBvaW50Q29sb3JzPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgLy8gRXZlcnl0aGluZyBOT1Qgc2VsZWN0ZWQgaXMgbXV0ZWQ7IHdpdGggbm90aGluZyBzZWxlY3RlZCwgbm90aGluZyBpcyBtdXRlZFxuICAgIC8vIGFuZCB0aGUgd2hvbGUgdGlzc3VlIHJlYWRzIG5vcm1hbGx5ICh0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZSkuXG4gICAgY29uc3QgbXV0ZWQgPSBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTtcblxuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkge1xuICAgICAgLy8gR2VudWluZWx5IHVuaWZvcm06IG9uZSBicm9hZGNhc3QgdHVwbGUsIHNvIGEgZmxhdCA4NGstb2JzZXJ2YXRpb24gdmlld1xuICAgICAgLy8gZG9lcyBub3QgYWxsb2NhdGUgYSBjb2xvdXIgcGVyIHBvaW50LlxuICAgICAgaWYgKCFtdXRlZCAmJiB2aWV3Lm9wYWNpdHkgPj0gMSkgcmV0dXJuIFNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIC8vIE5vdCB1bmlmb3JtIOKAlCB0aGUgb3BhY2l0eSBjb250cm9sIG9yIGEgc2VsZWN0aW9uIHZhcmllcyB0aGUgYWxwaGEsIHNvIGl0XG4gICAgICAvLyBoYXMgdG8gYmUgcGVyLXBvaW50LiBSZXR1cm5pbmcgdGhlIGNvbnN0YW50IHR1cGxlIGhlcmUgaXMgd2hhdCBtYWRlIHRoZVxuICAgICAgLy8gT3BhY2l0eSBzbGlkZXIgZG8gbm90aGluZyBpbiB0aGUgZGVmYXVsdCBzdGF0ZSwgd2hpY2ggaXMgdGhlIHN0YXRlIGFueW9uZVxuICAgICAgLy8gbGFuZHMgaW4gYmVmb3JlIHBpY2tpbmcgYSBjb2xvdXIgc291cmNlLlxuICAgICAgcmV0dXJuIGVuY29kZUNhdGVnb3JpY2FsKG5ldyBVaW50MTZBcnJheShkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCksIHtcbiAgICAgICAgY29sb3JzOiBbU1BBVElBTF9ORVVUUkFMX0hFWF0sXG4gICAgICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICAgICAgbXV0ZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgY29uc3QgcmdiYSA9IGVuY29kZUNhdGVnb3JpY2FsKGNvbHVtbi5jb2Rlcywge1xuICAgICAgICAgIGNvbG9yczogcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSxcbiAgICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgICAgbXV0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcm91cHMgc3dpdGNoZWQgb2ZmIGluIHRoZSBDZWxscyBwYW5lbCBoaWRlIHRoZWlyIGRvdHMgdG9vLCB3aGVuIHRoZSBkb3RzIGFyZVxuICAgICAgICAvLyBjb2xvdXJlZCBieSB0aGF0IHNhbWUgZ3JvdXBpbmcuXG4gICAgICAgIGNvbnN0IGdyb3VwQ29sdW1uID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgICAgIGlmICh2aWV3LmhpZGRlbkdyb3Vwcz8ubGVuZ3RoICYmIGdyb3VwQ29sdW1uID09PSBjb2xvckJ5Lm5hbWUpIHtcbiAgICAgICAgICBjb25zdCBvZmYgPSBuZXcgU2V0KHZpZXcuaGlkZGVuR3JvdXBzKTtcbiAgICAgICAgICBjb25zdCBoaWRlID0gY29sdW1uLm1ldGEuY2F0ZWdvcmllcy5tYXAoKGMpID0+IG9mZi5oYXMoYykpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uLmNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sdW1uLmNvZGVzW2ldO1xuICAgICAgICAgICAgaWYgKGMgIT09IE5PX0NBVEVHT1JZICYmIGhpZGVbY10pIHJnYmFbNCAqIGkgKyAzXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZ2JhO1xuICAgICAgfVxuICAgICAgLy8gQSBjb250aW51b3VzIGNvbHVtbiBtYXkgY2FycnkgaXRzIG93biBsb2cgaGludCAoY291bnRzKTsgdGhlIHZpZXcnc1xuICAgICAgLy8gdG9nZ2xlIHdpbnMgb25jZSB0aGUgdXNlciBoYXMgc2V0IGl0LlxuICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlQ29udGludW91cyhjb2x1bW4udmFsdWVzLCB2aWV3LCBtdXRlZCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGNvbG9yQnkubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2RlQ29udGludW91cyh2YWx1ZXMsIHZpZXcsIG11dGVkKTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgUkdCQSB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgYW5kIGEgY2xpcHBlZCB3aW5kb3cuICovXG4gIGVuY29kZUNvbnRpbnVvdXModmFsdWVzOiBGbG9hdDMyQXJyYXksIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIG11dGVkOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBlbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICAgIHZhbHVlcyxcbiAgICAgIHZpZXcsXG4gICAgICB0aGlzLmN0eC5kaXNwbGF5LnNwYXRpYWxMdXQodmlldyksXG4gICAgICB0aGlzLnNlc3Npb24uY29udHJhc3RXaW5kb3dzLFxuICAgICAgbXV0ZWQsXG4gICAgKTtcbiAgfVxufVxuXG4vKiogVGhlIG1hcmtlcnMnIGRpYW1ldGVyczogZWFjaCBvYnNlcnZhdGlvbidzIG93biAob3IgdGhlIGZhbGxiYWNrKSwgYXQgbGVhc3QgdGhlIHNsYWIncyBmbG9vcixcbiAqICB0aW1lcyB0aGUgdmlldydzIHBvaW50IHNjYWxlOyBvbmUgbnVtYmVyIHdoZW4gZXZlcnkgbWFya2VyIGlzIGRyYXduIGF0IHRoZSBzYW1lIHNpemUuICovXG5mdW5jdGlvbiBtYXJrZXJTaXplcyhvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHNsYWI6IFNsYWIgfCBudWxsKTogbnVtYmVyIHwgRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgYmFzZSA9IG1hcmtlckRpYW1ldGVycyhvYnMsIFNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTKTtcbiAgY29uc3Qgc2NhbGUgPSB2aWV3LnBvaW50U2NhbGUgPiAwID8gdmlldy5wb2ludFNjYWxlIDogMTtcbiAgY29uc3QgZmxvb3IgPSBzbGFiPy5taW5EaWFtZXRlciA/PyAwO1xuICBpZiAodHlwZW9mIGJhc2UgPT09ICdudW1iZXInICYmICFzbGFiKSByZXR1cm4gTWF0aC5tYXgoYmFzZSwgZmxvb3IpICogc2NhbGU7XG4gIGNvbnN0IHNpemVPZiA9IChpOiBudW1iZXIpID0+IE1hdGgubWF4KHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyA/IGJhc2UgOiBiYXNlW2ldLCBmbG9vcikgKiBzY2FsZTtcbiAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKHNsYWI/LmluZGljZXMgPz8geyBsZW5ndGg6IG9icy5jb3VudCB9LCAoX3YsIGkpID0+IHNpemVPZihzbGFiID8gc2xhYi5pbmRpY2VzW2ldIDogaSkpO1xufVxuXG4vKiogSW50ZXJsZWF2ZWQgeCx5IG9mIHRoZSBgZHJhd25gIG9ic2VydmF0aW9ucyAodW5kZWZpbmVkOiBhbGwgb2YgdGhlbSkuICovXG5mdW5jdGlvbiBvYnNlcnZhdGlvblBvc2l0aW9ucyhvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIGRyYXduOiBVaW50MzJBcnJheSB8IHVuZGVmaW5lZCk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IGNvdW50ID0gZHJhd24gPyBkcmF3bi5sZW5ndGggOiBvYnMuY291bnQ7XG4gIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY29uc3QgbyA9IGRyYXduID8gZHJhd25baV0gOiBpO1xuICAgIHBvc2l0aW9uc1tpICogMl0gPSBvYnMueFtvXTtcbiAgICBwb3NpdGlvbnNbaSAqIDIgKyAxXSA9IG9icy55W29dO1xuICB9XG4gIHJldHVybiBwb3NpdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIHBsYW5lIGBzbGljZWAgb2YgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQ6IGl0cyBwaXhlbCBhZmZpbmUsIHRoZSBvYnNlcnZhdGlvbnMgdGhhdCBmYWxsIGluXG4gKiBpdCwgYW5kIHRoZSBtYXJrZXIgZmxvb3IgdGhhdCBncmlkIG5lZWRzLlxuICpcbiAqIE51bGwgZm9yIGEgZGF0YXNldCB3aXRoIGEgcmVhbCBgaW1hZ2VSZWZgIChpdHMgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgdGhlIGltYWdlJ3MgcGl4ZWxzIGFuZFxuICogZXZlcnkgb2JzZXJ2YXRpb24gYmVsb25ncyB0byB0aGUgb25lIHNlY3Rpb24pIGFuZCBmb3Igb25lIHdpdGggbm8gdm9sdW1lIGF0IGFsbCDigJQgYm90aCBvZlxuICogd2hpY2ggZHJhdyBleGFjdGx5IGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gc2xhYkF0KGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCBzbGljZTogbnVtYmVyKTogU2xhYiB8IG51bGwge1xuICBjb25zdCB2b2x1bWUgPSBkYXRhc2V0LnZvbHVtZTtcbiAgaWYgKGRhdGFzZXQuaW1hZ2VSZWYgfHwgIXZvbHVtZSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7XG4gICAgcmVmOiB2b2x1bWVJbWFnZVJlZih2b2x1bWUsIGRhdGFzZXQubWljcm9uc1BlclVuaXQpLFxuICAgIGluZGljZXM6IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgc2xpY2UpLFxuICAgIHNsaWNlLFxuICAgIG1pbkRpYW1ldGVyOiBTUEFUSUFMX1NMSUNFX01JTl9ESUFNRVRFUl9QWCAqIHZvbHVtZS52b3hlbFNpemVbMF0sXG4gIH07XG59XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gbmFwYXJpLWpzIHN5bWJvbCBjb2RlczogZWFjaCBvYnNlcnZhdGlvbidzIGdlbmUncyBpY29uIChgY29kZXNgIGluZGV4XG4gKiAgYGdseXBoc2ApLCBhIGRpc2Mgd2hlcmUgaXQgaGFzIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gZ2x5cGhTeW1ib2xzKGNvZGVzOiBVaW50MTZBcnJheSwgZ2x5cGhzOiByZWFkb25seSBUcmFuc2NyaXB0R2x5cGhOYW1lW10pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYnlHZW5lID0gZ2x5cGhzLm1hcCgoZykgPT4gcG9pbnRTeW1ib2xDb2RlKEdMWVBIX1NZTUJPTFNbZ10pKTtcbiAgY29uc3QgZGlzYyA9IHBvaW50U3ltYm9sQ29kZSgnZGlzYycpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGNvZGVzLCAoYykgPT4gKGMgPT09IE5PX0NBVEVHT1JZID8gZGlzYyA6IChieUdlbmVbY10gPz8gZGlzYykpKTtcbn1cblxuLyoqIFRoZSBzeW1ib2xzIG9mIHRoZSBkcmF3biBzdWJzZXQgKGFsbCBvZiB0aGVtIHdoZW4gYGluZGljZXNgIGlzIHVuZGVmaW5lZCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyU3ltYm9scyhzeW1ib2xzOiBVaW50OEFycmF5IHwgbnVsbCwgaW5kaWNlcz86IFVpbnQzMkFycmF5KTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIXN5bWJvbHMgfHwgIWluZGljZXMpIHJldHVybiBzeW1ib2xzO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGluZGljZXMsIChpKSA9PiBzeW1ib2xzW2ldKTtcbn1cbiJdfQ==
|