@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.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/display-types.mjs +3 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
- package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
- 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 +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4521 -759
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +90 -4
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +14 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { boxRadius, keepSceneInDepth } from './napari-camera-depth';
|
|
2
|
+
import { placeInWorker } from '../../region-source/worker-region-source';
|
|
1
3
|
import { MultiChannelVolumeView, histogramScalar } from 'napari-js';
|
|
2
4
|
import { formatLength } from 'napari-js/overlays';
|
|
3
5
|
import { NapariVolumeZHandle } from './napari-volume-z-handle';
|
|
@@ -55,7 +57,10 @@ export class VolumeScene {
|
|
|
55
57
|
this.selecting = false;
|
|
56
58
|
/** Whether the volume lets every region through (see {@link setRegionsThroughVolume}). */
|
|
57
59
|
this.regionsThrough = false;
|
|
58
|
-
|
|
60
|
+
/** Gives the camera back napari-js's own depth range (see keepSceneInDepth). */
|
|
61
|
+
this.restoreDepth = null;
|
|
62
|
+
// Placed in the cells' worker: placing every class's vertices here held the UI for seconds.
|
|
63
|
+
this.regionMeshes = new VolumeRegionMeshes(ctx.viewer, (v, f) => placeInWorker(v, f));
|
|
59
64
|
this.slicePlanes = new VolumeSlicePlanes(ctx.viewer, ctx.host, {
|
|
60
65
|
onMove: (axis, value) => ctx.inZone(() => ctx.slicePlaneMoved(axis, value)),
|
|
61
66
|
});
|
|
@@ -150,6 +155,11 @@ export class VolumeScene {
|
|
|
150
155
|
*/
|
|
151
156
|
async mount() {
|
|
152
157
|
const { ctx, info } = this;
|
|
158
|
+
// Zoomed close, the whole volume stays drawn (napari-js's far plane follows the distance).
|
|
159
|
+
this.restoreDepth = keepSceneInDepth(ctx.viewer.camera3d, () => {
|
|
160
|
+
const b = this.worldBase;
|
|
161
|
+
return b ? boxRadius(b.width, b.height, b.depth * ctx.settings.volumeZScale) : null;
|
|
162
|
+
});
|
|
153
163
|
const loading = ctx.loading(); // bail before rendering on a Cancel / new plot
|
|
154
164
|
const desc = await ctx.tiles.ensureDescriptor(ctx.info());
|
|
155
165
|
// Serverless multichannel (tiled:false + channelUrls): no tile descriptor, so
|
|
@@ -349,6 +359,8 @@ export class VolumeScene {
|
|
|
349
359
|
return this.view ? surface3dControls(this.ctx, () => this.gizmo) : null;
|
|
350
360
|
}
|
|
351
361
|
dispose() {
|
|
362
|
+
this.restoreDepth?.();
|
|
363
|
+
this.restoreDepth = null;
|
|
352
364
|
this.displaySub?.unsubscribe();
|
|
353
365
|
this.displaySub = null;
|
|
354
366
|
this.gizmo?.destroy();
|
|
@@ -551,4 +563,4 @@ export class Scatter3dScene {
|
|
|
551
563
|
this.displaySub = null;
|
|
552
564
|
}
|
|
553
565
|
}
|
|
554
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1zY2VuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdm9sdW1lLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTWxELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRy9ELE9BQU8sRUFBRSxXQUFXLEVBQVEsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLFVBQVUsRUFDVixPQUFPLEVBQ1AsWUFBWSxFQUNaLGFBQWEsRUFDYixtQkFBbUIsR0FDcEIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQTZCLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUYsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFakUscUdBQXFHO0FBQ3JHLFNBQVMsZ0JBQWdCLENBQUMsSUFBNkIsRUFBRSxPQUFlLEVBQUUsSUFBWTtJQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzNFLENBQUM7QUFFRDs7cUdBRXFHO0FBQ3JHLFNBQVMsUUFBUSxDQUNmLEdBQWlCLEVBQ2pCLElBQTRCLEVBQzVCLElBQStDLEVBQy9DLE9BQW9CLEVBQ3BCLE9BQWdCO0lBRWhCLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7UUFDbkQsTUFBTSxFQUFFLE9BQU87UUFDZixRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztLQUN2QyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBMkJ0QixZQUNtQixHQUFpQixFQUNqQixJQUE0QixFQUM1QixTQUF3QjtRQUZ4QixRQUFHLEdBQUgsR0FBRyxDQUFjO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQXdCO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQWU7UUE3QjNDLDBEQUEwRDtRQUMxRCxTQUFJLEdBQWtDLElBQUksQ0FBQztRQUMzQyxpR0FBaUc7UUFDekYsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDN0I7NkZBQ3FGO1FBQzdFLGNBQVMsR0FBZ0IsSUFBSSxDQUFDO1FBQzlCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBZ0IsSUFBSSxDQUFDO1FBQ2pDO2dHQUN3RjtRQUN2RSxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO1FBQzdELFVBQUssR0FBdUIsSUFBSSxDQUFDO1FBQ3pCLFlBQU8sR0FBK0IsSUFBSSxDQUFDO1FBQzNDLGVBQVUsR0FBd0IsSUFBSSxDQUFDO1FBSy9DLDRFQUE0RTtRQUNwRSxhQUFRLEdBQW9DLElBQUksQ0FBQztRQUN6RCx5RUFBeUU7UUFDakUsZ0JBQVcsR0FBNkIsSUFBSSxDQUFDO1FBQzdDLFlBQU8sR0FBd0IsSUFBSSxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUEwQjFCLDBGQUEwRjtRQUNsRixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQXBCN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQzdELE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDNUUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixlQUFlLENBQUMsTUFBK0I7UUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQXVCO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBdUI7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUtEOzs7Ozs7T0FNRztJQUNILHVCQUF1QixDQUFDLE9BQWdCO1FBQ3RDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDOUIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDaEYsQ0FBQztJQUNILENBQUM7SUFFRCx5RkFBeUY7SUFDekYsY0FBYyxDQUFDLE1BQW1CO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWTtRQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUQsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDWixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDMUIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtTQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLG9CQUFvQjtRQUMxQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNwRyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQ2hDLEdBQUcsRUFBRSxDQUNILElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQzFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbEUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNqRixDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRCw2RkFBNkY7SUFDN0YsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RixDQUFDO0lBRUQsK0VBQStFO0lBQ3ZFLGlCQUFpQjtRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQWdCO1lBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNuQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1NBQ3ZDLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7UUFDOUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELDhFQUE4RTtRQUM5RSw4RUFBOEU7UUFDOUUscUVBQXFFO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUFDLFNBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6RixNQUFNLFlBQVksR0FBRyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsMkJBQTJCO1FBRXJGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsaUdBQWlHO1FBQ2pHLDRGQUE0RjtRQUM1RixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUE2QjtZQUMxQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQ3hCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFDMUIsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZO1NBQzNCLENBQUM7UUFDRixLQUFLLE1BQU0sRUFBRSxJQUFJLFFBQVE7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUVwRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2RyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWpCLGdHQUFnRztRQUNoRyx3RkFBd0Y7UUFDeEYsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDNUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVztTQUNsQyxDQUFDLENBQUM7UUFDSCw0RkFBNEY7UUFDNUYsOEZBQThGO1FBQzlGLGdGQUFnRjtRQUNoRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNwRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUMxQixDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUk7YUFDakU7WUFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCLElBQTJCLEVBQzNCLFlBQW9CLEVBQ3BCLE9BQW9CO1FBRXBCLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRWhELCtGQUErRjtRQUMvRiw4RkFBOEY7UUFDOUYsNkZBQTZGO1FBQzdGLElBQUksSUFBSSxHQUFnQixJQUFJLENBQUM7UUFDN0IsTUFBTSxRQUFRLEdBQW9CLEVBQUUsQ0FBQztRQUNyQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELElBQUksT0FBTyxDQUFDLE9BQU87d0JBQUUsTUFBTSxDQUFDLGdEQUFnRDtvQkFDNUUsSUFBSSxDQUFDLEdBQUc7d0JBQUUsU0FBUztvQkFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQztvQkFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUM3QyxNQUFNLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RSxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNaLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTt3QkFDZCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7d0JBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTt3QkFDbEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO3dCQUNoQixRQUFRLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7d0JBQ2hELGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDO3dCQUM5QyxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSx5QkFBeUI7d0JBQzFELE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU07d0JBQzFCLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxJQUFJLElBQUk7cUJBQzdCLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxHQUFHLE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQixRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNaLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTt3QkFDZCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7d0JBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTt3QkFDbEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO3dCQUNoQixRQUFRLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO3dCQUN4QyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQzt3QkFDOUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUseUJBQXlCO3dCQUMxRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNO3FCQUMzQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2dCQUFTLENBQUM7WUFDVCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsMkZBQTJGO0lBQ25GLFFBQVEsQ0FBQyxJQUFVO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDckIsNkZBQTZGO1FBQzdGLGdCQUFnQjtRQUNoQixFQUFFO1FBQ0YsNkVBQTZFO1FBQzdFLCtFQUErRTtRQUMvRSw2RUFBNkU7UUFDN0UsMEVBQTBFO1FBQzFFLDhDQUE4QztRQUM5QyxFQUFFO1FBQ0YsNkVBQTZFO1FBQzdFLDZFQUE2RTtRQUM3RSx5RUFBeUU7UUFDekUsK0VBQStFO1FBQy9FLDJFQUEyRTtRQUMzRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRCxpR0FBaUc7UUFDakcsc0JBQXNCO1FBQ3RCLE1BQU0sRUFBRSxHQUFHLFNBQVMsRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQztRQUN6QyxNQUFNLEVBQUUsR0FBRyxTQUFTLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsU0FBUyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFvQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDckYsK0VBQStFO1FBQy9FLDRFQUE0RTtRQUM1RSxrRUFBa0U7UUFDbEUsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixNQUFNLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLEtBQUssRUFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUN6QixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxPQUFPO1lBQ0wsS0FBSyxFQUFFLENBQUMsS0FBSyxHQUFHLHdCQUF3QixDQUFDLEdBQUcsUUFBUTtZQUNwRCxNQUFNLEVBQUUsQ0FBQyxLQUFLLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxRQUFRO1lBQ3JELEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUk7UUFDRixxQkFBcUI7SUFDdkIsQ0FBQztJQUVEO2lFQUM2RDtJQUM3RCxTQUFTLENBQUMsT0FBZSxFQUFFLElBQVk7UUFDckMsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVCLE9BQU87WUFDTCxXQUFXLEVBQUUsQ0FBQyxNQUFjLEVBQUUsTUFBYyxFQUFRLEVBQUU7Z0JBQ3BELHlDQUF5QztnQkFDekMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDNUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDeEMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3hCLEtBQUssQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2xDLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMxRSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLE1BQWM7UUFDdEIsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDOUIsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDbEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNqQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOzt1RUFFbUU7SUFDbkUsVUFBVSxDQUFDLEdBQVM7UUFDbEIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDekIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDMUIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDekIsK0VBQStFO1FBQy9FLDZFQUE2RTtRQUM3RSwwRUFBMEU7UUFDMUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBVSxFQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakcsT0FBTztZQUNMLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDL0UsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUMvRSw0RUFBNEU7WUFDNUUsOEVBQThFO1lBQzlFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7U0FDaEYsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssV0FBVztRQUNqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELE1BQU0sSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7UUFDM0MsT0FBTztZQUNMLEVBQUUsRUFBRTtnQkFDRixJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDO2dCQUMxQyxJQUFJLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDO2dCQUM1QyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDO2FBQ3JDO1lBQ0QsOEVBQThFO1lBQzlFLCtDQUErQztZQUMvQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1NBQzdFLENBQUM7SUFDSixDQUFDO0lBRUQ7OztxQkFHaUI7SUFDVCxrQkFBa0I7UUFDeEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPO1lBQ2xCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0Qix5RkFBeUY7Z0JBQ3pGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMzQixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRTt3QkFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLFNBQVMsQ0FBQzt3QkFDN0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO3dCQUN0QixHQUFHLENBQUMsRUFBRTs0QkFDSixDQUFDLENBQUM7Z0NBQ0UsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFxQjtnQ0FDcEQsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUseUJBQXlCO2dDQUN6RCxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU87NkJBQ3BCOzRCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQ1IsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUU7b0JBQ3BCLFFBQVEsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO29CQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBcUIsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ3hHLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQU16QixZQUNtQixHQUFpQixFQUNqQixJQUE0QjtRQUQ1QixRQUFHLEdBQUgsR0FBRyxDQUFjO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQXdCO1FBUHZDLFVBQUssR0FBeUIsSUFBSSxDQUFDO1FBQzNDLGlFQUFpRTtRQUNoRCxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO1FBQ3JELGVBQVUsR0FBd0IsSUFBSSxDQUFDO0lBSzVDLENBQUM7SUFFSixLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDckIsTUFBTSxHQUFHLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLEdBQUcsR0FBMkIsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQztZQUNILEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FDbEIsR0FBRyxFQUNILElBQUksQ0FBQyxJQUFJLEVBQ1QsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFDaEYsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUNkLENBQUM7UUFDSixDQUFDO2dCQUFTLENBQUM7WUFDVCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRXZDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7UUFDOUUsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztRQUN6QixNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNwQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hGLFFBQVEsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDOUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUMxQixJQUFJLEVBQUUsQ0FBQztTQUNSLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5Qix3RkFBd0Y7UUFDeEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTztZQUNuQixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2xDLElBQUksQ0FBQztnQkFBRSxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsOERBQThEO0lBQzlELElBQUk7UUFDRixxQkFBcUI7SUFDdkIsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFlLEVBQUUsSUFBWTtRQUNyQyxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3LCBoaXN0b2dyYW1TY2FsYXIgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBQb2ludHMzRExheWVyLCBWb2x1bWVDaGFubmVsIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB7IGZvcm1hdExlbmd0aCB9IGZyb20gJ25hcGFyaS1qcy9vdmVybGF5cyc7XG5pbXBvcnQgdHlwZSB7IEF4aXNMYWJlbFNwZWMgfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElJc29zdXJmYWNlQ29udHJvbHMsIElTdXJmYWNlM2RDb250cm9scyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IE5hcGFyaVZvbHVtZVpIYW5kbGUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtei1oYW5kbGUnO1xuaW1wb3J0IHsgQXNzZW1ibGVkVm9sdW1lIH0gZnJvbSAnLi9uYXBhcmktdGlsZS1jbGllbnQnO1xuaW1wb3J0IHsgVGlsZURlc2NyaXB0b3IgfSBmcm9tICcuLi90aWxlLXNlcnZlcic7XG5pbXBvcnQgeyBBeGVzM2RHaXptbywgQm94Mywgc3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuL25hcGFyaS1heGVzLWdpem1vJztcbmltcG9ydCB7XG4gIFNDQVRURVIzRF9NQVhfUE9JTlRTLFxuICBTQ0FUVEVSM0RfTUFYX1hZLFxuICBWT0xVTUVfV09STERfSU5QTEFORV9SRUYsXG4gIGlzU2VydmVybGVzc011bHRpY2hhbm5lbCxcbiAgc3RhY2tEZXB0aCxcbiAgdGludEZvcixcbiAgdG9JSGlzdG9ncmFtLFxuICB0b05hcGFyaUdhbW1hLFxuICB2b2x1bWVSZXNvbHV0aW9uRm9yLFxufSBmcm9tICcuL25hcGFyaS1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgTmFwYXJpU2NlbmUsIFNjZW5lQ29udGV4dCwgVm9sdW1lVm94ZWxzT25TY3JlZW4gfSBmcm9tICcuL25hcGFyaS1zY2VuZSc7XG5pbXBvcnQgeyBSZWdpb25NZXNoM0QsIFZvbHVtZUZyYW1lLCBWb2x1bWVSZWdpb25NZXNoZXMgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcyc7XG5pbXBvcnQgeyBTbGljZVBsYW5lcywgVm9sdW1lU2xpY2VQbGFuZXMgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtc2xpY2UtcGxhbmVzJztcbmltcG9ydCB7IFJlZ2lvbk1lc2hQb2ludGVyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW1lc2gtcG9pbnRlcic7XG5cbi8qKiBUaGUgaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiBhbiBhc3NlbWJsZWQgdWludDggY2hhbm5lbCAob3IgdGhlIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lLCBrZXkgMCkuICovXG5mdW5jdGlvbiBjaGFubmVsSGlzdG9ncmFtKGRhdGE6IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+LCBjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgaWYgKCFkYXRhLnNpemUpIHJldHVybiBudWxsO1xuICBjb25zdCBwbGFuZSA9IGRhdGEuZ2V0KGNoYW5uZWwpID8/IGRhdGEuZ2V0KDApO1xuICByZXR1cm4gcGxhbmUgPyB0b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKHBsYW5lLCBiaW5zLCAwLCAyNTUpKSA6IG51bGw7XG59XG5cbi8qKiBBc3NlbWJsZSBgaW5mb2AncyBzdGFjayBpbnRvIGEgdWludDggdm9sdW1lIHVuZGVyIHRoZSBzdGFjayBwcm9ncmVzcyBiYXI7IG51bGwgb25jZSBgbG9hZGluZ2BcbiAqICBhYm9ydHMgKGEgQ2FuY2VsIG9yIGEgbmV3IHBsb3QpLiBUaGUgY2FsbGVyIG93bnMgdGhlIGxvYWRpbmcgZmxhZyBhbmQgdGFrZXMgYGxvYWRpbmdgIG9uY2UgcGVyXG4gKiAgbG9hZDogYSBDYW5jZWwgcmVwbGFjZXMgYGN0eC5sb2FkaW5nKClgLCBhbmQgYSBtdWx0aWNoYW5uZWwgdm9sdW1lIGFzc2VtYmxlcyBjaGFubmVscyBpbiB0dXJuLiAqL1xuZnVuY3Rpb24gYXNzZW1ibGUoXG4gIGN0eDogU2NlbmVDb250ZXh0LFxuICBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICBvcHRzOiB7IG1heFNsaWNlPzogbnVtYmVyOyBzbGljZVN0ZXA/OiBudW1iZXIgfSxcbiAgbG9hZGluZzogQWJvcnRTaWduYWwsXG4gIGNoYW5uZWw/OiBudW1iZXIsXG4pOiBQcm9taXNlPEFzc2VtYmxlZFZvbHVtZSB8IG51bGw+IHtcbiAgcmV0dXJuIGN0eC50aWxlcy5hc3NlbWJsZVZvbHVtZShpbmZvLCBvcHRzLCBjaGFubmVsLCB7XG4gICAgc2lnbmFsOiBsb2FkaW5nLFxuICAgIHByb2dyZXNzOiAocCkgPT4gY3R4LnN0YWNrLnByb2dyZXNzKHApLFxuICB9KTtcbn1cblxuLyoqXG4gKiBOQVBBUklfVk9MVU1FIC8gTkFQQVJJX0lTT1NVUkZBQ0UgKHJldmlldyBBcHBlbmRpeCBCLCBjbHVzdGVyIEYpOiB0aGUgc3RhY2sgYXNzZW1ibGVkIGludG8gYVxuICogZGVjaW1hdGVkIHZvbHVtZSDigJQgb25lIGFkZGl0aXZlLCB0aW50ZWQgYFZvbHVtZUxheWVyYCBwZXIgY2hhbm5lbCBmb3IgYSBtdWx0aWNoYW5uZWwgaW1hZ2UsIGFcbiAqIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lIG90aGVyd2lzZSDigJQgd2l0aCB0aGUgYXhlcyBnaXptbyBhbmQgdGhlIGluLXZpZXcgWi1oZWlnaHQgaGFuZGxlLlxuICovXG5leHBvcnQgY2xhc3MgVm9sdW1lU2NlbmUgaW1wbGVtZW50cyBOYXBhcmlTY2VuZSB7XG4gIC8qKiBuYXBhcmktanMgaGlnaC1sZXZlbCB2aWV3IG93bmluZyB0aGUgdm9sdW1lIGxheWVycy4gKi9cbiAgdmlldzogTXVsdGlDaGFubmVsVm9sdW1lVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB2b2x1bWUgaXMgY29tcG9zaXRlZCBmcm9tIHBlci1jaGFubmVsIGxheWVycyAodnMgYSBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSkuICovXG4gIHByaXZhdGUgbXVsdGljaGFubmVsID0gZmFsc2U7XG4gIC8qKiBWb2x1bWUgd29ybGQgYm94IGF0IFotc2NhbGUgMSAoYmFzZSkgKyB0aGUgc2FtcGxlZCB2b3hlbCBkZXB0aCDigJQgZW5vdWdoIHRvIHJlY29tcHV0ZSB0aGVcbiAgICogIFotYXhpcyB2b3hlbCBzY2FsZSwgYXhlcyBkZXB0aCwgYW5kIG92ZXJsYXkgYW5jaG9ycyBhcyB0aGUgaGFuZGxlIHN0cmV0Y2hlcyBaLiAqL1xuICBwcml2YXRlIHdvcmxkQmFzZTogQm94MyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNhbXBsZWREZXB0aCA9IDE7XG4gIHByaXZhdGUgZGltczogQm94MyB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIGdpem1vOiBBeGVzM2RHaXptbyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHpIYW5kbGU6IE5hcGFyaVZvbHVtZVpIYW5kbGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIFJlZ2lvbnMnIDNEIHJlY29uc3RydWN0aW9ucyBzaG93biBpbiB0aGUgdm9sdW1lIChzZWUge0BsaW5rIHNldFJlZ2lvbk1lc2hlc30pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbk1lc2hlczogVm9sdW1lUmVnaW9uTWVzaGVzO1xuICAvKiogVGhlIHBsYW5lcyBvZiB0aGUgc2VjdGlvbnMgc2hvd24gYmVzaWRlIHRoZSB2b2x1bWUsIG1hcmtlZCBhbmQgZHJhZ2dhYmxlIGluIGl0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlUGxhbmVzOiBWb2x1bWVTbGljZVBsYW5lcztcbiAgLyoqIFRoZSBpbWFnZSdzIGZ1bGwgc2l6ZSAocHgsIHB4LCBzbGljZXMpLCB3aGljaCByZWNvbnN0cnVjdGlvbnMgYXJlIGluLiAqL1xuICBwcml2YXRlIGZ1bGxTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsID0gbnVsbDtcbiAgLyoqIENsaWNrcyBhbmQgaG92ZXIgb24gdGhlIHJlY29uc3RydWN0aW9ucyAod2l0aCB0aGUgc2VsZWN0aW9uIHRvb2wpLiAqL1xuICBwcml2YXRlIG1lc2hQb2ludGVyOiBSZWdpb25NZXNoUG9pbnRlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRvb2xTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGluZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBTY2VuZUNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyaW5nOiAnaXNvJyB8ICdtaXAnLFxuICApIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcyA9IG5ldyBWb2x1bWVSZWdpb25NZXNoZXMoY3R4LnZpZXdlcik7XG4gICAgdGhpcy5zbGljZVBsYW5lcyA9IG5ldyBWb2x1bWVTbGljZVBsYW5lcyhjdHgudmlld2VyLCBjdHguaG9zdCwge1xuICAgICAgb25Nb3ZlOiAoYXhpcywgdmFsdWUpID0+IGN0eC5pblpvbmUoKCkgPT4gY3R4LnNsaWNlUGxhbmVNb3ZlZChheGlzLCB2YWx1ZSkpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNob3cgdGhlc2UgcmVnaW9uIHJlY29uc3RydWN0aW9ucyBpbiB0aGUgdm9sdW1lIChyZXBsYWNpbmcgdGhlIG9uZXMgc2hvd24pLiAqL1xuICBzZXRSZWdpb25NZXNoZXMobWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldChtZXNoZXMpO1xuICB9XG5cbiAgc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0SGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgc2V0UmVnaW9uSGlkZGVuKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0SGlkZGVuKGtleXMpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSBsZXRzIGV2ZXJ5IHJlZ2lvbiB0aHJvdWdoIChzZWUge0BsaW5rIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lfSkuICovXG4gIHByaXZhdGUgcmVnaW9uc1Rocm91Z2ggPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHZvbHVtZSBoaWRlcyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyBiZWhpbmQgd2hhdCBpdCBzaG93cyAoaXRzIGJyaWdodGVzdCBzYW1wbGUgYWxvbmdcbiAgICogZWFjaCByYXksIG5hcGFyaS1qcydzIGAndHJhbnNsdWNlbnQnYCBkZXB0aCkg4oCUIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHJlZ2lvbiBiZWhpbmQgdGhlXG4gICAqIGNlcmViZWxsdW0g4oCUIG9yLCBgdGhyb3VnaGAsIGhpZGVzIG5vbmUgKGAndHJhbnNsdWNlbnRfbm9fZGVwdGgnYCk6IHN1cmZhY2VzIHRyYWNlZCBpbnNpZGUgaXRzXG4gICAqIGJyaWdodCBzdHJ1Y3R1cmVzLCBhbiBPQ1QncyBsYXllciBib3VuZGFyaWVzIGluIGl0cyBicmlnaHQgYmFuZHMsIHdoaWNoIHRoYXQgZGVwdGggc3BlY2tsZXNcbiAgICogb3IgaGlkZXMuIEEgbXVsdGljaGFubmVsIHZvbHVtZSdzIGNoYW5uZWxzIGFkZCB1cCBhbmQgaGlkZSBub3RoaW5nIGVpdGhlciB3YXkuXG4gICAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaCA9IHRocm91Z2g7XG4gICAgdGhpcy5hcHBseVZvbHVtZURlcHRoKCk7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlWb2x1bWVEZXB0aCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aWNoYW5uZWwpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMudmlldz8ubGF5ZXJzID8/IFtdKSB7XG4gICAgICBsYXllci5ibGVuZGluZyA9IHRoaXMucmVnaW9uc1Rocm91Z2ggPyAndHJhbnNsdWNlbnRfbm9fZGVwdGgnIDogJ3RyYW5zbHVjZW50JztcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdyB0aGUgcGxhbmVzIG9mIHRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHZvbHVtZSB3aGVyZSB0aGV5IGFyZSAobnVsbDogaGlkZSBvbmUpLiAqL1xuICBzZXRTbGljZVBsYW5lcyhwbGFuZXM6IFNsaWNlUGxhbmVzKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBsYW5lcy5zZXQocGxhbmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXNzZW1ibGVkIHZvbHVtZSdzIHZveGVscyBwZXIgY2hhbm5lbCAoa2V5IDA6IHRoZSBncmF5c2NhbGUgb25lKSwgaXRzIGZyYW1lLCBhbmQgd2hldGhlclxuICAgKiBpdCBpcyBhIG11bHRpY2hhbm5lbCBjb21wb3NpdGUg4oCUIHdoYXQgdGhlIHNlY3Rpb25zIGJlc2lkZSBpdCBhcmUgY3V0IGZyb20uIE51bGwgYmVmb3JlIGl0IGlzXG4gICAqIGFzc2VtYmxlZC5cbiAgICovXG4gIHZvbHVtZVZveGVscygpOiBWb2x1bWVWb3hlbHNPblNjcmVlbiB8IG51bGwge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLndvcmxkQmFzZTtcbiAgICBpZiAoIXRoaXMuZGltcyB8fCAhYmFzZSB8fCAhdGhpcy5mdWxsU2l6ZSB8fCAhdGhpcy5jaGFubmVsRGF0YS5zaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkZXB0aCA9IGJhc2UuZGVwdGggKiB0aGlzLmN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGU7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZGltcyxcbiAgICAgIGNoYW5uZWxzOiB0aGlzLmNoYW5uZWxEYXRhLFxuICAgICAgbXVsdGljaGFubmVsOiB0aGlzLm11bHRpY2hhbm5lbCxcbiAgICAgIGZyYW1lOiB7IHNpemU6IHRoaXMuZnVsbFNpemUsIHdvcmxkOiBbYmFzZS53aWR0aCwgYmFzZS5oZWlnaHQsIGRlcHRoXSB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGlja2luZyB0aGUgcmVjb25zdHJ1Y3Rpb25zOiB3aXRoIHRoZSBzZWxlY3Rpb24gdG9vbCBhcm1lZCwgYSBjbGljayBvbiBvbmUgc2VsZWN0cyBpdHMgY2xhc3NcbiAgICogKG51bGwgYmVzaWRlIHRoZW0pOyByZXN0aW5nIG92ZXIgb25lIG5hbWVzIGl0LCB3aGF0ZXZlciB0aGUgdG9vbC5cbiAgICovXG4gIHByaXZhdGUgbGlzdGVuVG9SZWdpb25NZXNoZXMoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgaWYgKHRoaXMubWVzaFBvaW50ZXIpIHJldHVybjtcbiAgICB0aGlzLnRvb2xTdWIgPSBjdHguc3RvcmUuZ2V0QWN0aXZlVG9vbCQoKS5zdWJzY3JpYmUoKHRvb2wpID0+ICh0aGlzLnNlbGVjdGluZyA9IHRvb2wgPT09ICdzZWxlY3QnKSk7XG4gICAgdGhpcy5tZXNoUG9pbnRlciA9IGN0eC5vdXRzaWRlWm9uZShcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBSZWdpb25NZXNoUG9pbnRlcihjdHguY2FudmFzLCBjdHguaG9zdCwge1xuICAgICAgICAgIHBpY2tBdDogKHgsIHkpID0+IHRoaXMucmVnaW9uTWVzaGVzLnBpY2tBdCh4LCB5KSxcbiAgICAgICAgICBhY3RpdmU6ICgpID0+IHRoaXMuc2VsZWN0aW5nICYmIHRoaXMucmVnaW9uTWVzaGVzLnNob3duLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaG92ZXJhYmxlOiAoKSA9PiB0aGlzLnJlZ2lvbk1lc2hlcy5zaG93bi5sZW5ndGggPiAwLFxuICAgICAgICAgIG9uUGljazogKGtleSwgYWRkaXRpdmUpID0+IGN0eC5pblpvbmUoKCkgPT4gY3R4LnJlZ2lvbk1lc2hQaWNrZWQoa2V5LCBhZGRpdGl2ZSkpLFxuICAgICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoaW4tcGxhbmUpLCBvciBudWxsIGJlZm9yZSBpdCBpcyBhc3NlbWJsZWQuICovXG4gIHZveGVsU3RlcCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5mdWxsU2l6ZSAmJiB0aGlzLmRpbXMgPyB0aGlzLmZ1bGxTaXplWzBdIC8gTWF0aC5tYXgoMSwgdGhpcy5kaW1zLndpZHRoKSA6IG51bGw7XG4gIH1cblxuICAvKiogUGxhY2UgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgaW4gdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBhcyBpdCBpcyBub3cuICovXG4gIHByaXZhdGUgZnJhbWVSZWdpb25NZXNoZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMud29ybGRCYXNlO1xuICAgIGlmICghYmFzZSB8fCAhdGhpcy5mdWxsU2l6ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGRlcHRoID0gYmFzZS5kZXB0aCAqIHRoaXMuY3R4LnNldHRpbmdzLnZvbHVtZVpTY2FsZTtcbiAgICBjb25zdCBmcmFtZTogVm9sdW1lRnJhbWUgPSB7XG4gICAgICBzaXplOiB0aGlzLmZ1bGxTaXplLFxuICAgICAgd29ybGQ6IFtiYXNlLndpZHRoLCBiYXNlLmhlaWdodCwgZGVwdGhdLFxuICAgICAgelNjYWxlOiB0aGlzLmN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGUsXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5zbGljZVBsYW5lcy5zZXRGcmFtZShmcmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgYW5kIHJlbmRlciB0aGUgdm9sdW1lLCB0aGVuIGFkZCB0aGUgYXhlcyBnaXptbyArIGxhYmVscyBhbmQgdGhlIFogaGFuZGxlIGFuZCBmb2xsb3dcbiAgICogdGhlIGRpc3BsYXkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCwgaW5mbyB9ID0gdGhpcztcbiAgICBjb25zdCBsb2FkaW5nID0gY3R4LmxvYWRpbmcoKTsgLy8gYmFpbCBiZWZvcmUgcmVuZGVyaW5nIG9uIGEgQ2FuY2VsIC8gbmV3IHBsb3RcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgY3R4LnRpbGVzLmVuc3VyZURlc2NyaXB0b3IoY3R4LmluZm8oKSk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoSW1hZ2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSBpc1NlcnZlcmxlc3NNdWx0aWNoYW5uZWwoY3R4LnRpbGVzLmlzU2ltcGxlKGluZm8pLCBpbmZvKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBzaW1wbGVNYyA/IGluZm8hLmltYWdlTWV0YSFbMF0uY2hhbm5lbENvdW50IDogKGRlc2M/LmNoYW5uZWxzID8/IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHNpbXBsZU1jIHx8ICghIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxKTtcblxuICAgIHRoaXMuY2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLm11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICBjb25zdCB2aWV3ID0gbmV3IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcoY3R4LnZpZXdlcik7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICBjb25zdCB7IGRpbXMsIGNoYW5uZWxzIH0gPSBhd2FpdCB0aGlzLmFzc2VtYmxlQ2hhbm5lbHMoZGVzYywgY2hhbm5lbENvdW50LCBsb2FkaW5nKTtcbiAgICBpZiAoIWRpbXMgfHwgIWNoYW5uZWxzLmxlbmd0aCB8fCBsb2FkaW5nLmFib3J0ZWQpIHJldHVybjsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXJcblxuICAgIGNvbnN0IHdvcmxkID0gdGhpcy53b3JsZEJveChkaW1zKTtcbiAgICAvLyBCYXNlIGJveCAoWi1zY2FsZSA9IDEpICsgdGhlIHNhbXBsZWQgZGVwdGggZHJpdmUgdGhlIGxpdmUgWi1oZWlnaHQgaGFuZGxlIGJlbG93OyB0aGUgcGVyc2lzdGVkXG4gICAgLy8gYHZvbHVtZVpTY2FsZWAgKHVzZXIgZHJhZykgYXBwbGllcyBvbiB0b3Agc28gY2hhbmdpbmcgcmVzb2x1dGlvbiBrZWVwcyB0aGUgY2hvc2VuIGhlaWdodC5cbiAgICB0aGlzLndvcmxkQmFzZSA9IHdvcmxkO1xuICAgIHRoaXMuc2FtcGxlZERlcHRoID0gTWF0aC5tYXgoMSwgZGltcy5kZXB0aCk7XG4gICAgY29uc3Qgd29ybGRaID0gd29ybGQuZGVwdGggKiBjdHguc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgd29ybGQud2lkdGggLyBkaW1zLndpZHRoLFxuICAgICAgd29ybGQuaGVpZ2h0IC8gZGltcy5oZWlnaHQsXG4gICAgICB3b3JsZFogLyB0aGlzLnNhbXBsZWREZXB0aCxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2ggb2YgY2hhbm5lbHMpIGNoLnZveGVsU2l6ZSA9IHZveGVsU2l6ZTtcblxuICAgIHZpZXcucmVuZGVyKHRoaXMubXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJywgY2hhbm5lbHMsIHsgcmVuZGVyaW5nOiB0aGlzLnJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmFwcGx5Vm9sdW1lRGVwdGgoKTtcbiAgICBjdHguc2V0SW1hZ2VTaXplKGRpbXMud2lkdGgsIGRpbXMuaGVpZ2h0KTtcbiAgICB0aGlzLmRpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIGNvbnN0IGJveCA9IHsgd2lkdGg6IHdvcmxkLndpZHRoLCBoZWlnaHQ6IHdvcmxkLmhlaWdodCwgZGVwdGg6IHdvcmxkWiB9O1xuICAgIHRoaXMuZ2l6bW8gPSBuZXcgQXhlczNkR2l6bW8oY3R4LnZpZXdlciwgY3R4Lmhvc3QsIGJveCwgdGhpcy5heGVzTGFiZWxzKGJveCksIHtcbiAgICAgIHZpc2libGU6IGN0eC5zZXR0aW5ncy5heGVzVmlzaWJsZSxcbiAgICB9KTtcbiAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgIC8vIFwiWlwiIGF4aXMgKyBsYWJlbCBsaXZlKSwgc28gaXQgcmVhZHMgYXMgdGhlIFotaGVpZ2h0IGNvbnRyb2wuIEZsb2F0ZWQgYSBsaXR0bGUgcGFzdCB0aGUgYXhpc1xuICAgIC8vIHRpcCAow5cxLjEyKSBzbyB0aGUgZ3JpcCBjbGVhcnMgdGhlIFwiWiDCtyDigKZcIiBsYWJlbC4gRHJhZyDihpUgdG8gcmVzdHJldGNoIFogbGl2ZS5cbiAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZShjdHguaG9zdCwgY3R4LnZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgdG9wQW5jaG9yOiAoKSA9PiBbXG4gICAgICAgIC10aGlzLndvcmxkQmFzZSEud2lkdGggLyAyLFxuICAgICAgICAtdGhpcy53b3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICgodGhpcy53b3JsZEJhc2UhLmRlcHRoICogY3R4LnNldHRpbmdzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICBdLFxuICAgICAgZ2V0U2NhbGU6ICgpID0+IGN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGUsXG4gICAgICBzZXRTY2FsZTogKHMpID0+IHRoaXMuc2V0WlNjYWxlKHMpLFxuICAgIH0pO1xuICAgIHRoaXMuZm9sbG93RGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5mcmFtZVJlZ2lvbk1lc2hlcygpO1xuICAgIHRoaXMubGlzdGVuVG9SZWdpb25NZXNoZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBlYWNoIGNoYW5uZWwncyB2b2x1bWUgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpIHVuZGVyXG4gICAqIHRoZSBzdGFjayBwcm9ncmVzcyBiYXIsIHdpdGggdGhlIGRpc3BsYXkgc2V0dGluZ3MgaXQgaXMgZHJhd24gd2l0aC4gYGRpbXNgIGlzIG51bGwgd2hlblxuICAgKiBub3RoaW5nIHdhcyBhc3NlbWJsZWQgKGEgQ2FuY2VsLCBhIG5ldyBwbG90LCBvciBubyBzbGljZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlbWJsZUNoYW5uZWxzKFxuICAgIGRlc2M6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCxcbiAgICBjaGFubmVsQ291bnQ6IG51bWJlcixcbiAgICBsb2FkaW5nOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx7IGRpbXM6IEJveDMgfCBudWxsOyBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdIH0+IHtcbiAgICBjb25zdCB7IGN0eCwgaW5mbyB9ID0gdGhpcztcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKGN0eC5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHN0YXRlcyA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuXG4gICAgLy8gQXNzZW1ibGUgcGVyLWNoYW5uZWwgc2NhbGFyIHZvbHVtZXMgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChqaXQtc3BlY2lmaWMpOyB0aGUgbmFwYXJpLWpzIHZpZXdcbiAgICAvLyBvd25zIHRoZSBsYXllciBvcmNoZXN0cmF0aW9uIChvbmUgYWRkaXRpdmUgdGludGVkIHZvbHVtZSBwZXIgY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlXG4gICAgLy8gdm9sdW1lKS4gVGhlIGFkYXB0ZXIgY29tcHV0ZXMgZWFjaCBjaGFubmVsJ3MgY29sb3JtYXAgKGluY2wuIHRoZSByZXZlcnNlIGZsaXApIGFuZCBpbnZlcnQuXG4gICAgbGV0IGRpbXM6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdID0gW107XG4gICAgY3R4LnN0YWNrLmxvYWRpbmcodHJ1ZSk7XG4gICAgY3R4LnN0YWNrLnByb2dyZXNzKDApO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5tdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IGFzc2VtYmxlKGN0eCwgaW5mbywgcmVzLCBsb2FkaW5nLCBjKTtcbiAgICAgICAgICBpZiAobG9hZGluZy5hYm9ydGVkKSBicmVhazsgLy8gYSBDYW5jZWwgLyBuZXcgcGxvdDogZmV0Y2ggbm8gZnVydGhlciBjaGFubmVsXG4gICAgICAgICAgaWYgKCF2b2wpIGNvbnRpbnVlO1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy5jaGFubmVsRGF0YS5zZXQoYywgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IGN0eC5kaXNwbGF5LmNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3IpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiB0b05hcGFyaUdhbW1hKHN0Py5nYW1tYSksIC8vIEltYWdlSiDOsyDihpIgbmFwYXJpLWpzIM6zXG4gICAgICAgICAgICBpbnZlcnQ6IGN0eC5kaXNwbGF5LmludmVydCxcbiAgICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IGFzc2VtYmxlKGN0eCwgaW5mbywgcmVzLCBsb2FkaW5nKTtcbiAgICAgICAgaWYgKHZvbCkge1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy5jaGFubmVsRGF0YS5zZXQoMCwgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiBjdHguZGlzcGxheS52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHRvTmFwYXJpR2FtbWEoc3Q/LmdhbW1hKSwgLy8gSW1hZ2VKIM6zIOKGkiBuYXBhcmktanMgzrNcbiAgICAgICAgICAgIGludmVydDogY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5zdGFjay5sb2FkaW5nKGZhbHNlKTtcbiAgICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGltcywgY2hhbm5lbHMgfTtcbiAgfVxuXG4gIC8qKiBUaGUgdm9sdW1lJ3Mgd29ybGQgYm94IGZvciB0aGUgYXNzZW1ibGVkIGBkaW1zYCwgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB3b3JsZEJveChkaW1zOiBCb3gzKTogQm94MyB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgLy8gUmVzb2x1dGlvbi1pbnZhcmlhbnQgd29ybGQgYm94OyB0aGUgcGVyLWF4aXMgYHZveGVsU2l6ZWAgKG5hcGFyaSBgc2NhbGVgKSBtYXBzIHRoZSBzYW1wbGVkXG4gICAgLy8gZ3JpZCBvbnRvIGl0LlxuICAgIC8vXG4gICAgLy8gQSBzdGFjayB0aGF0IGRlY2xhcmVzIGl0cyBwaHlzaWNhbCBzcGFjaW5nIG9uIEFMTCBUSFJFRSBheGVzIGdldHMgaXRzIHRydWVcbiAgICAvLyBleHRlbnQgYXMgdGhlIHdvcmxkIGJveCDigJQgdGhlIG9ubHkgd2F5IGFuaXNvdHJvcHkgc3Vydml2ZXMsIGFuZCB3aGF0IG1ha2VzIGFcbiAgICAvLyByZXNhbXBsZWQgNDAgeCA0MCB4IDIwMCDCtW0gdm9sdW1lIHJlYWQgYXMgYSBicmFpbiBpbnN0ZWFkIG9mIGEgY3ViZS1hc3BlY3RcbiAgICAvLyBicmljay4gSXQgbmVlZHMgbm9uZSBvZiB0aGUgcmVmZXJlbmNlLWJveCBhcml0aG1ldGljOiBhIHBoeXNpY2FsIGJveCBpc1xuICAgIC8vIGFscmVhZHkgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyB0aGF0IGFyaXRobWV0aWMuIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsXG4gICAgLy8gY291bnRzIG1hZGUgaGlnaGVyIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGVcbiAgICAvLyAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi5cbiAgICAvLyBBbmNob3JpbmcgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmQgbGV0dGluZyBaIHNwYW4gdGhlXG4gICAgLy8gZnVsbCBzbGljZSBjb3VudCBtYWtlcyB0aGUgYm94IHNoYXBlIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuXG4gICAgY29uc3QgbWV0YSA9IGN0eC5pbmZvKCk/LmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGltYWdlRGVzYyA9IGN0eC50aWxlcy5jdXJyZW50RGVzY3JpcHRvcihjdHguaW5mbygpKTtcbiAgICAvLyBUaGUgc2VydmVyJ3MgZGVzY3JpcHRvciBmaXJzdCAoaXQgcmVwb3J0cyBhIHRpbGVkIHN0YWNrJ3Mgc3BhY2luZywgZS5nLiBhIE5SUkQgdm9sdW1lJ3MpLCBlbHNlXG4gICAgLy8gdGhlIGltYWdlIG1ldGFkYXRhLlxuICAgIGNvbnN0IG14ID0gaW1hZ2VEZXNjPy5tcHBYIHx8IG1ldGE/Lm1wcFg7XG4gICAgY29uc3QgbXkgPSBpbWFnZURlc2M/Lm1wcFkgfHwgbWV0YT8ubXBwWTtcbiAgICBjb25zdCBteiA9IGltYWdlRGVzYz8ubXBwWiB8fCBtZXRhPy5tcHBaO1xuICAgIGNvbnN0IG1wcFhZWjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG14ICYmIG15ICYmIG16ID8gW214LCBteSwgbXpdIDogbnVsbDtcbiAgICAvLyBUaGUgaW1hZ2UncyBERUNMQVJFRCBwaXhlbCBkaW1lbnNpb25zLCB3aGljaCBpcyB3aGF0IG1wcCBpcyBwZXI6IHRoZSBzYW1wbGVkXG4gICAgLy8gZGltcyBhcmUgZGVjaW1hdGVkLCBzbyBzaXppbmcgYSBwaHlzaWNhbCBib3ggYnkgdGhlbSB3b3VsZCBtYWtlIHRoZSB3b3JsZFxuICAgIC8vIGJveCBkZXBlbmQgb24gdGhlIHJlc29sdXRpb24gdGhlIHVzZXIgaGFwcGVucyB0byBiZSB2aWV3aW5nIGF0LlxuICAgIGNvbnN0IGZ1bGxXID0gaW1hZ2VEZXNjPy53aWR0aCA/PyBtZXRhPy54ID8/IGRpbXMud2lkdGg7XG4gICAgY29uc3QgZnVsbEggPSBpbWFnZURlc2M/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXMuaGVpZ2h0O1xuICAgIGNvbnN0IGZ1bGxEID0gc3RhY2tEZXB0aChjdHguaW5mbygpKSB8fCBkaW1zLmRlcHRoO1xuICAgIHRoaXMuZnVsbFNpemUgPSBbZnVsbFcsIGZ1bGxILCBmdWxsRF07XG4gICAgaWYgKG1wcFhZWikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IGZ1bGxXICogbXBwWFlaWzBdLFxuICAgICAgICBoZWlnaHQ6IGZ1bGxIICogbXBwWFlaWzFdLFxuICAgICAgICBkZXB0aDogZnVsbEQgKiBtcHBYWVpbMl0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmdWxsTG9uZyA9IE1hdGgubWF4KDEsIGZ1bGxXLCBmdWxsSCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICBoZWlnaHQ6IChmdWxsSCAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgIGRlcHRoOiBmdWxsRCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB3aG9sZSBzdGFjayBpcyBhbHJlYWR5IG9uIHNjcmVlbjogbm8gcGxhbmUgdG8gc3RlcC4gKFRoaXMgdXNlZCB0byB3cml0ZSBgdmlld2VyLmRpbXMuemAsXG4gICAqIHdoaWNoIG9ubHkgYSB0aWxlZCAyRCBpbWFnZSByZWFkcyDigJQgYSB2b2x1bWUgcmF5bWFyY2hlcyBldmVyeSBzbGljZSDigJQgYW5kIHNjaGVkdWxlIGEgcmVhZGJhY2tcbiAgICogb2YgYSBmcmFtZSB0aGF0IGhhZCBub3QgY2hhbmdlZC4gVGhlIHRvb2xiYXIgc2hvd3Mgbm8gc2xpY2UgY29udHJvbCBpbiB2b2x1bWUgLyBpc29zdXJmYWNlXG4gICAqIG1vZGUsIGFzIFBsb3RseSdzIGlzb3N1cmZhY2UgaWdub3JlcyB0aGUgc2xpY2UgdG9vLilcbiAgICovXG4gIHNldFooKTogdm9pZCB7XG4gICAgLyogbm90aGluZyB0byBzdGVwICovXG4gIH1cblxuICAvKiogVGhlIGludGVuc2l0eSBoaXN0b2dyYW0gb2YgdGhlIGFzc2VtYmxlZCAoZG93bnNhbXBsZWQpIHVpbnQ4IHZvbHVtZSBmb3IgdGhlIHJlcXVlc3RlZFxuICAgKiAgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUuICovXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gY2hhbm5lbEhpc3RvZ3JhbSh0aGlzLmNoYW5uZWxEYXRhLCBjaGFubmVsLCBiaW5zKTtcbiAgfVxuXG4gIGlzb0NvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52aWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ID8gc3VyZmFjZTNkQ29udHJvbHModGhpcy5jdHgsICgpID0+IHRoaXMuZ2l6bW8pIDogbnVsbDtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5naXptbz8uZGVzdHJveSgpO1xuICAgIHRoaXMuZ2l6bW8gPSBudWxsO1xuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXIoKTtcbiAgICB0aGlzLnNsaWNlUGxhbmVzLmRlc3Ryb3koKTtcbiAgICB0aGlzLm1lc2hQb2ludGVyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5tZXNoUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy50b29sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudG9vbFN1YiA9IG51bGw7XG4gICAgdGhpcy53b3JsZEJhc2UgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBzZXRaU2NhbGUoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB7IHNldHRpbmdzIH0gPSB0aGlzLmN0eDtcbiAgICBzZXR0aW5ncy52b2x1bWVaU2NhbGUgPSBNYXRoLm1pbigxMCwgTWF0aC5tYXgoMC4xLCBmYWN0b3IpKTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy53b3JsZEJhc2U7XG4gICAgaWYgKCFiYXNlIHx8ICF0aGlzLnZpZXcpIHJldHVybjtcbiAgICBjb25zdCB3b3JsZFogPSBiYXNlLmRlcHRoICogc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMuc2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52aWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICB0aGlzLmdpem1vPy5zZXREZXB0aCh3b3JsZFosIHRoaXMuYXhlc0xhYmVscyh7IHdpZHRoOiBiYXNlLndpZHRoLCBoZWlnaHQ6IGJhc2UuaGVpZ2h0LCBkZXB0aDogd29ybGRaIH0pKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLmZyYW1lUmVnaW9uTWVzaGVzKCk7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBUaGUgWC9ZL1ogYXhpcy1lbmQgbGFiZWwgc3BlY3MgZm9yIHRoZSBnaXptby4gQW5jaG9ycyBhcmUgaW4gdGhlIHZvbHVtZSdzIGNlbnRyZWQgd29ybGQgYm94XG4gICAqICAobWF0Y2hpbmcgdGhlIEF4ZXNMYXllciBnZW9tZXRyeSk7IHRoZSBzY2FsZSB0ZXh0IHJlZmxlY3RzIHRoZSBGVUxMIGltYWdlIGV4dGVudCDigJQgcGh5c2ljYWwgwrVtXG4gICAqICB3aGVuIMK1bS9waXhlbCBpcyBrbm93biwgZWxzZSBwaXhlbCAoWC9ZKSAvIHNsaWNlIChaKSBjb3VudHMuICovXG4gIGF4ZXNMYWJlbHModm9sOiBCb3gzKTogQXhpc0xhYmVsU3BlY1tdIHtcbiAgICBjb25zdCBoeCA9IHZvbC53aWR0aCAvIDI7XG4gICAgY29uc3QgaHkgPSB2b2wuaGVpZ2h0IC8gMjtcbiAgICBjb25zdCBoeiA9IHZvbC5kZXB0aCAvIDI7XG4gICAgLy8gTWVhc3VyZWQgZnJvbSB0aGUgSU1BR0UncyBvd24gZXh0ZW50LCBuZXZlciBmcm9tIHRoZSB3b3JsZCBib3g6IHRoZSBib3ggaXMgYVxuICAgIC8vIHNoYXBlIChhbmQgZm9yIGEgcGh5c2ljYWxseSBzaXplZCB2b2x1bWUgaXQgaXMgYWxyZWFkeSBpbiDCtW0sIHNvIHJlYWRpbmcgYVxuICAgIC8vIHBpeGVsIGNvdW50IG9mZiBpdCBhbmQgbXVsdGlwbHlpbmcgYnkgbXBwIHdvdWxkIHNjYWxlIHRoZSBsYWJlbCB0d2ljZSkuXG4gICAgY29uc3QgeyBweCwgbXBwIH0gPSB0aGlzLmltYWdlRXh0ZW50KCk7XG4gICAgY29uc3QgbGVuID0gKG46IG51bWJlciwgdW06IG51bWJlcik6IHN0cmluZyA9PiAodW0gPiAwID8gZm9ybWF0TGVuZ3RoKG4gKiB1bSwgJ8K1bScpIDogYCR7bn0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihweFswXSwgbXBwWzBdKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKHB4WzFdLCBtcHBbMV0pfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICAgIC8vIFBoeXNpY2FsIHdoZW4gdGhlIHN0YWNrIGRlY2xhcmVzIGl0cyBzbGljZSBzcGFjaW5nIChgbXBwWmApIOKAlCBhIHJlc2FtcGxlZFxuICAgICAgLy8gdm9sdW1lIGtub3dzIGhvdyB0aGljayBpdCBpczsgYSBwbGFpbiB6LXN0YWNrIGNhbiBvbmx5IHNheSBob3cgbWFueSBzbGljZXMuXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7bGVuKHB4WzJdLCBtcHBbMl0pfWAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSdzIGRlY2xhcmVkIGV4dGVudCBpbiBwaXhlbHMvc2xpY2VzLCBhbmQgaXRzIHBoeXNpY2FsIHNwYWNpbmcgcGVyXG4gICAqIGF4aXMgaW4gwrVtICgwID0gdW5kZWNsYXJlZCwgYW5kIHRoZW4gdGhhdCBheGlzIHJlYWRzIGluIHBpeGVscykuXG4gICAqXG4gICAqIE9uZSBwbGFjZSwgYmVjYXVzZSB0aGUgdm9sdW1lIHdvcmxkIGJveCBhbmQgdGhlIGF4aXMgbGFiZWxzIGhhdmUgdG8gYWdyZWVcbiAgICogYWJvdXQgd2hhdCB0aGUgaW1hZ2UncyByZWFsIGRpbWVuc2lvbnMgYXJlIOKAlCB0aGUgc2FtcGxlZCBncmlkIGlzIGRlY2ltYXRlZCBhbmRcbiAgICogc2F5cyBub3RoaW5nIGFib3V0IGVpdGhlci5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VFeHRlbnQoKTogeyBweDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtcHA6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5jdHguaW5mbygpO1xuICAgIGNvbnN0IG1ldGEgPSBpbmZvPy5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBkaW1zID0gdGhpcy5kaW1zO1xuICAgIGNvbnN0IGRlc2MgPSB0aGlzLmN0eC50aWxlcy5jdXJyZW50RGVzY3JpcHRvcihpbmZvKTtcbiAgICBjb25zdCBtcHBYID0gZGVzYz8ubXBwWCB8fCBtZXRhPy5tcHBYIHx8IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB4OiBbXG4gICAgICAgIGRlc2M/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcz8ud2lkdGggPz8gMSxcbiAgICAgICAgZGVzYz8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcz8uaGVpZ2h0ID8/IDEsXG4gICAgICAgIHN0YWNrRGVwdGgoaW5mbykgfHwgZGltcz8uZGVwdGggfHwgMSxcbiAgICAgIF0sXG4gICAgICAvLyBBIGRlc2NyaXB0b3IgdGhhdCByZXBvcnRzIG9ubHkgbXBwWCBpcyBzcXVhcmUtcGl4ZWwgYnkgY29udmVudGlvbiwgd2hpY2ggaXNcbiAgICAgIC8vIHdoYXQgdGhlIDJEIHNjYWxlIGJhciBhbHJlYWR5IGFzc3VtZXMgb2YgaXQuXG4gICAgICBtcHA6IFttcHBYLCBkZXNjPy5tcHBZIHx8IG1ldGE/Lm1wcFkgfHwgbXBwWCwgZGVzYz8ubXBwWiB8fCBtZXRhPy5tcHBaIHx8IDBdLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0b3JlJ3MgY29sb3JtYXAsIHJldmVyc2UsIGludmVydCBhbmQgY2hhbm5lbCB3aW5kb3dzIOKGkiB0aGUgdm9sdW1lJ3MgdHJhbnNmZXIgZnVuY3Rpb246XG4gICAqICBjb2xvdXIgKGNoYW5uZWwgdGludCBvciBzZWxlY3RlZCBjb2xvcm1hcCksIHRoZSBpbnRlbnNpdHkgd2luZG93IChtaW4vbWF4IOKGkiBjb250cmFzdExpbWl0cylcbiAgICogIGFuZCBnYW1tYSwgbWlycm9yaW5nIHRoZSBncmF5c2NhbGUgaW1hZ2UncyBkaXNwbGF5IGNvbnRyb2xzIHNvIHRoZSBoaXN0b2dyYW0gcGFuZSBkcml2ZXMgdGhlXG4gICAqICAzRCByZW5kZXIuICovXG4gIHByaXZhdGUgZm9sbG93RGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgZGlzcGxheSB9ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXc7XG4gICAgICBpZiAoIXZpZXcpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLm11bHRpY2hhbm5lbCkge1xuICAgICAgICAvLyBFYWNoIGNoYW5uZWwncyBsYXllciBpcyB0aW50ZWQgYnkgaXRzIGNvbG91ciBhbmQgZ2V0cyBpdHMgb3duIHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5LlxuICAgICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkuY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnKSxcbiAgICAgICAgICAgIGludmVydDogZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgICAuLi4oc3RcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgZ2FtbWE6IHRvTmFwYXJpR2FtbWEoc3QuZ2FtbWEpLCAvLyBJbWFnZUogzrMg4oaSIG5hcGFyaS1qcyDOs1xuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgIGludmVydDogZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogdG9OYXBhcmlHYW1tYShzdC5nYW1tYSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBOQVBBUklfU0NBVFRFUjNEIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBIKTogdGhlIGRvd25zYW1wbGVkIHZveGVsIGdyaWQgYXMgYSAzRCBwb2ludCBjbG91ZFxuICogY29sb3VyZWQgYnkgaW50ZW5zaXR5ICh0aGUgbmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyB2b3hlbCBzY2F0dGVyM2QpLiBBc3NlbWJsZXMgYSBjb2Fyc2VcbiAqIHZvbHVtZSwgdGhlbiBlbWl0cyBhIGZsYXQtc3RyaWRlZCBzYW1wbGUgb2Ygdm94ZWxzIChjYXBwZWQgYXQgYFNDQVRURVIzRF9NQVhfUE9JTlRTYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2F0dGVyM2RTY2VuZSBpbXBsZW1lbnRzIE5hcGFyaVNjZW5lIHtcbiAgcHJpdmF0ZSBsYXllcjogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFzc2VtYmxlZCB2b2x1bWUgKGtleSAwKSwgZm9yIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdHg6IFNjZW5lQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICkge31cblxuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKGN0eC5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGN0eC5zdGFjay5sb2FkaW5nKHRydWUpO1xuICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICBsZXQgdm9sOiBBc3NlbWJsZWRWb2x1bWUgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdm9sID0gYXdhaXQgYXNzZW1ibGUoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5pbmZvLFxuICAgICAgICB7IG1heFNsaWNlOiBNYXRoLm1pbihyZXMubWF4U2xpY2UsIFNDQVRURVIzRF9NQVhfWFkpLCBzbGljZVN0ZXA6IHJlcy5zbGljZVN0ZXAgfSxcbiAgICAgICAgY3R4LmxvYWRpbmcoKSxcbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5zdGFjay5sb2FkaW5nKGZhbHNlKTtcbiAgICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICB9XG4gICAgaWYgKCF2b2wgfHwgY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB2b2w7XG4gICAgY29uc3QgelNjYWxlID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgLyBNYXRoLm1heCgxLCBkZXB0aCk7IC8vIOKJiCBjdWJpYyBhc3BlY3RcbiAgICBjb25zdCB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogZGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gU0NBVFRFUjNEX01BWF9QT0lOVFMpKTtcbiAgICBjb25zdCBwb3M6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdmFsOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICBjb25zdCB4ID0gaSAlIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHdpZHRoKSAlIGhlaWdodDtcbiAgICAgIGNvbnN0IHppID0gTWF0aC5mbG9vcihpIC8gKHdpZHRoICogaGVpZ2h0KSk7XG4gICAgICBwb3MucHVzaCh4LCB5LCB6aSAqIHpTY2FsZSk7XG4gICAgICB2YWwucHVzaChkYXRhW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdCA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIHRoaXMubGF5ZXIgPSBjdHgudmlld2VyLmFkZFBvaW50czNEKG5ldyBGbG9hdDMyQXJyYXkocG9zKSwgbmV3IEZsb2F0MzJBcnJheSh2YWwpLCB7XG4gICAgICBjb2xvcm1hcDogY3R4LmRpc3BsYXkudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgIGludmVydDogY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgc2l6ZTogMyxcbiAgICB9KTtcbiAgICBjdHguc2V0SW1hZ2VTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIC8vIEZlZWQgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gZnJvbSB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoa2V5IDApLlxuICAgIHRoaXMuY2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5uZWxEYXRhLnNldCgwLCBkYXRhKTtcbiAgICAvLyBTdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIGNsb3VkJ3MgY29sb3JtYXAgKyBjb250cmFzdC5cbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjdHguZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcjtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHMgPSBjaGFubmVsc1swXTtcbiAgICAgIGxheWVyLmNvbG9ybWFwID0gY3R4LmRpc3BsYXkudm9sdW1lQ29sb3JtYXAocyk7XG4gICAgICBsYXllci5pbnZlcnQgPSBjdHguZGlzcGxheS5pbnZlcnQ7XG4gICAgICBpZiAocykgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbcy5taW4sIHMubWF4XTtcbiAgICAgIGN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogVGhlIHdob2xlIHN0YWNrIGlzIGFscmVhZHkgb24gc2NyZWVuOiBubyBwbGFuZSB0byBzdGVwLiAqL1xuICBzZXRaKCk6IHZvaWQge1xuICAgIC8qIG5vdGhpbmcgdG8gc3RlcCAqL1xuICB9XG5cbiAgaGlzdG9ncmFtKGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiBjaGFubmVsSGlzdG9ncmFtKHRoaXMuY2hhbm5lbERhdGEsIGNoYW5uZWwsIGJpbnMpO1xuICB9XG5cbiAgc3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIgPyBzdXJmYWNlM2RDb250cm9scyh0aGlzLmN0eCwgKCkgPT4gbnVsbCkgOiBudWxsO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gbnVsbDtcbiAgfVxufVxuIl19
|
|
566
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1zY2VuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdm9sdW1lLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFNbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHL0QsT0FBTyxFQUFFLFdBQVcsRUFBUSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNFLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLE9BQU8sRUFDUCxZQUFZLEVBQ1osYUFBYSxFQUNiLG1CQUFtQixHQUNwQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBNkIsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RixPQUFPLEVBQWUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxxR0FBcUc7QUFDckcsU0FBUyxnQkFBZ0IsQ0FBQyxJQUE2QixFQUFFLE9BQWUsRUFBRSxJQUFZO0lBQ3BGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFD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bmVJbkRlcHRoIH0gZnJvbSAnLi9uYXBhcmktY2FtZXJhLWRlcHRoJztcbmltcG9ydCB7IHBsYWNlSW5Xb3JrZXIgfSBmcm9tICcuLi8uLi9yZWdpb24tc291cmNlL3dvcmtlci1yZWdpb24tc291cmNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTXVsdGlDaGFubmVsVm9sdW1lVmlldywgaGlzdG9ncmFtU2NhbGFyIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRzM0RMYXllciwgVm9sdW1lQ2hhbm5lbCB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBmb3JtYXRMZW5ndGggfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuaW1wb3J0IHR5cGUgeyBBeGlzTGFiZWxTcGVjIH0gZnJvbSAnbmFwYXJpLWpzL292ZXJsYXlzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSXNvc3VyZmFjZUNvbnRyb2xzLCBJU3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7IEFzc2VtYmxlZFZvbHVtZSB9IGZyb20gJy4vbmFwYXJpLXRpbGUtY2xpZW50JztcbmltcG9ydCB7IFRpbGVEZXNjcmlwdG9yIH0gZnJvbSAnLi4vdGlsZS1zZXJ2ZXInO1xuaW1wb3J0IHsgQXhlczNkR2l6bW8sIEJveDMsIHN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi9uYXBhcmktYXhlcy1naXptbyc7XG5pbXBvcnQge1xuICBTQ0FUVEVSM0RfTUFYX1BPSU5UUyxcbiAgU0NBVFRFUjNEX01BWF9YWSxcbiAgVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGLFxuICBpc1NlcnZlcmxlc3NNdWx0aWNoYW5uZWwsXG4gIHN0YWNrRGVwdGgsXG4gIHRpbnRGb3IsXG4gIHRvSUhpc3RvZ3JhbSxcbiAgdG9OYXBhcmlHYW1tYSxcbiAgdm9sdW1lUmVzb2x1dGlvbkZvcixcbn0gZnJvbSAnLi9uYXBhcmktaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE5hcGFyaVNjZW5lLCBTY2VuZUNvbnRleHQsIFZvbHVtZVZveGVsc09uU2NyZWVuIH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuaW1wb3J0IHsgUmVnaW9uTWVzaDNELCBWb2x1bWVGcmFtZSwgVm9sdW1lUmVnaW9uTWVzaGVzIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXJlZ2lvbi1tZXNoZXMnO1xuaW1wb3J0IHsgU2xpY2VQbGFuZXMsIFZvbHVtZVNsaWNlUGxhbmVzIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXNsaWNlLXBsYW5lcyc7XG5pbXBvcnQgeyBSZWdpb25NZXNoUG9pbnRlciB9IGZyb20gJy4vbmFwYXJpLXJlZ2lvbi1tZXNoLXBvaW50ZXInO1xuXG4vKiogVGhlIGludGVuc2l0eSBoaXN0b2dyYW0gb2YgYW4gYXNzZW1ibGVkIHVpbnQ4IGNoYW5uZWwgKG9yIHRoZSBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSwga2V5IDApLiAqL1xuZnVuY3Rpb24gY2hhbm5lbEhpc3RvZ3JhbShkYXRhOiBNYXA8bnVtYmVyLCBVaW50OEFycmF5PiwgY2hhbm5lbDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gIGlmICghZGF0YS5zaXplKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGxhbmUgPSBkYXRhLmdldChjaGFubmVsKSA/PyBkYXRhLmdldCgwKTtcbiAgcmV0dXJuIHBsYW5lID8gdG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihwbGFuZSwgYmlucywgMCwgMjU1KSkgOiBudWxsO1xufVxuXG4vKiogQXNzZW1ibGUgYGluZm9gJ3Mgc3RhY2sgaW50byBhIHVpbnQ4IHZvbHVtZSB1bmRlciB0aGUgc3RhY2sgcHJvZ3Jlc3MgYmFyOyBudWxsIG9uY2UgYGxvYWRpbmdgXG4gKiAgYWJvcnRzIChhIENhbmNlbCBvciBhIG5ldyBwbG90KS4gVGhlIGNhbGxlciBvd25zIHRoZSBsb2FkaW5nIGZsYWcgYW5kIHRha2VzIGBsb2FkaW5nYCBvbmNlIHBlclxuICogIGxvYWQ6IGEgQ2FuY2VsIHJlcGxhY2VzIGBjdHgubG9hZGluZygpYCwgYW5kIGEgbXVsdGljaGFubmVsIHZvbHVtZSBhc3NlbWJsZXMgY2hhbm5lbHMgaW4gdHVybi4gKi9cbmZ1bmN0aW9uIGFzc2VtYmxlKFxuICBjdHg6IFNjZW5lQ29udGV4dCxcbiAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgb3B0czogeyBtYXhTbGljZT86IG51bWJlcjsgc2xpY2VTdGVwPzogbnVtYmVyIH0sXG4gIGxvYWRpbmc6IEFib3J0U2lnbmFsLFxuICBjaGFubmVsPzogbnVtYmVyLFxuKTogUHJvbWlzZTxBc3NlbWJsZWRWb2x1bWUgfCBudWxsPiB7XG4gIHJldHVybiBjdHgudGlsZXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgb3B0cywgY2hhbm5lbCwge1xuICAgIHNpZ25hbDogbG9hZGluZyxcbiAgICBwcm9ncmVzczogKHApID0+IGN0eC5zdGFjay5wcm9ncmVzcyhwKSxcbiAgfSk7XG59XG5cbi8qKlxuICogTkFQQVJJX1ZPTFVNRSAvIE5BUEFSSV9JU09TVVJGQUNFIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBGKTogdGhlIHN0YWNrIGFzc2VtYmxlZCBpbnRvIGFcbiAqIGRlY2ltYXRlZCB2b2x1bWUg4oCUIG9uZSBhZGRpdGl2ZSwgdGludGVkIGBWb2x1bWVMYXllcmAgcGVyIGNoYW5uZWwgZm9yIGEgbXVsdGljaGFubmVsIGltYWdlLCBhXG4gKiBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSBvdGhlcndpc2Ug4oCUIHdpdGggdGhlIGF4ZXMgZ2l6bW8gYW5kIHRoZSBpbi12aWV3IFotaGVpZ2h0IGhhbmRsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvbHVtZVNjZW5lIGltcGxlbWVudHMgTmFwYXJpU2NlbmUge1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyBvd25pbmcgdGhlIHZvbHVtZSBsYXllcnMuICovXG4gIHZpZXc6IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdm9sdW1lIGlzIGNvbXBvc2l0ZWQgZnJvbSBwZXItY2hhbm5lbCBsYXllcnMgKHZzIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiAqL1xuICBwcml2YXRlIG11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBaLXNjYWxlIDEgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGUgdGhlXG4gICAqICBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB3b3JsZEJhc2U6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzYW1wbGVkRGVwdGggPSAxO1xuICBwcml2YXRlIGRpbXM6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgLyoqIEFzc2VtYmxlZCB1aW50OCB2b2x1bWUgZGF0YSBwZXIgY2hhbm5lbCAoa2V5ID0gY2hhbm5lbCBpbmRleCksIGtlcHQgZm9yIHRoZSB2b2x1bWUgaW50ZW5zaXR5XG4gICAqICBoaXN0b2dyYW0uIEtleSAwIGhvbGRzIHRoZSBncmF5c2NhbGUvY29tcG9zaXRlIHZvbHVtZSBpbiB0aGUgc2luZ2xlLWNoYW5uZWwgY2FzZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFubmVsRGF0YSA9IG5ldyBNYXA8bnVtYmVyLCBVaW50OEFycmF5PigpO1xuICBnaXptbzogQXhlczNkR2l6bW8gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB6SGFuZGxlOiBOYXBhcmlWb2x1bWVaSGFuZGxlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSZWdpb25zJyAzRCByZWNvbnN0cnVjdGlvbnMgc2hvd24gaW4gdGhlIHZvbHVtZSAoc2VlIHtAbGluayBzZXRSZWdpb25NZXNoZXN9KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25NZXNoZXM6IFZvbHVtZVJlZ2lvbk1lc2hlcztcbiAgLyoqIFRoZSBwbGFuZXMgb2YgdGhlIHNlY3Rpb25zIHNob3duIGJlc2lkZSB0aGUgdm9sdW1lLCBtYXJrZWQgYW5kIGRyYWdnYWJsZSBpbiBpdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzbGljZVBsYW5lczogVm9sdW1lU2xpY2VQbGFuZXM7XG4gIC8qKiBUaGUgaW1hZ2UncyBmdWxsIHNpemUgKHB4LCBweCwgc2xpY2VzKSwgd2hpY2ggcmVjb25zdHJ1Y3Rpb25zIGFyZSBpbi4gKi9cbiAgcHJpdmF0ZSBmdWxsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDbGlja3MgYW5kIGhvdmVyIG9uIHRoZSByZWNvbnN0cnVjdGlvbnMgKHdpdGggdGhlIHNlbGVjdGlvbiB0b29sKS4gKi9cbiAgcHJpdmF0ZSBtZXNoUG9pbnRlcjogUmVnaW9uTWVzaFBvaW50ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0b29sU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWxlY3RpbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN0eDogU2NlbmVDb250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmluZzogJ2lzbycgfCAnbWlwJyxcbiAgKSB7XG4gICAgLy8gUGxhY2VkIGluIHRoZSBjZWxscycgd29ya2VyOiBwbGFjaW5nIGV2ZXJ5IGNsYXNzJ3MgdmVydGljZXMgaGVyZSBoZWxkIHRoZSBVSSBmb3Igc2Vjb25kcy5cbiAgICB0aGlzLnJlZ2lvbk1lc2hlcyA9IG5ldyBWb2x1bWVSZWdpb25NZXNoZXMoY3R4LnZpZXdlciwgKHYsIGYpID0+IHBsYWNlSW5Xb3JrZXIodiwgZikpO1xuICAgIHRoaXMuc2xpY2VQbGFuZXMgPSBuZXcgVm9sdW1lU2xpY2VQbGFuZXMoY3R4LnZpZXdlciwgY3R4Lmhvc3QsIHtcbiAgICAgIG9uTW92ZTogKGF4aXMsIHZhbHVlKSA9PiBjdHguaW5ab25lKCgpID0+IGN0eC5zbGljZVBsYW5lTW92ZWQoYXhpcywgdmFsdWUpKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTaG93IHRoZXNlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgaW4gdGhlIHZvbHVtZSAocmVwbGFjaW5nIHRoZSBvbmVzIHNob3duKS4gKi9cbiAgc2V0UmVnaW9uTWVzaGVzKG1lc2hlczogcmVhZG9ubHkgUmVnaW9uTWVzaDNEW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXQobWVzaGVzKTtcbiAgfVxuXG4gIHNldFJlZ2lvbkhpZ2hsaWdodChrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEhpZ2hsaWdodChrZXlzKTtcbiAgfVxuXG4gIHNldFJlZ2lvbkhpZGRlbihrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEhpZGRlbihrZXlzKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgbGV0cyBldmVyeSByZWdpb24gdGhyb3VnaCAoc2VlIHtAbGluayBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZX0pLiAqL1xuICBwcml2YXRlIHJlZ2lvbnNUaHJvdWdoID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSB2b2x1bWUgaGlkZXMgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgYmVoaW5kIHdoYXQgaXQgc2hvd3MgKGl0cyBicmlnaHRlc3Qgc2FtcGxlIGFsb25nXG4gICAqIGVhY2ggcmF5LCBuYXBhcmktanMncyBgJ3RyYW5zbHVjZW50J2AgZGVwdGgpIOKAlCB0aGUgcGVyc3BlY3RpdmUgb2YgYSByZWdpb24gYmVoaW5kIHRoZVxuICAgKiBjZXJlYmVsbHVtIOKAlCBvciwgYHRocm91Z2hgLCBoaWRlcyBub25lIChgJ3RyYW5zbHVjZW50X25vX2RlcHRoJ2ApOiBzdXJmYWNlcyB0cmFjZWQgaW5zaWRlIGl0c1xuICAgKiBicmlnaHQgc3RydWN0dXJlcywgYW4gT0NUJ3MgbGF5ZXIgYm91bmRhcmllcyBpbiBpdHMgYnJpZ2h0IGJhbmRzLCB3aGljaCB0aGF0IGRlcHRoIHNwZWNrbGVzXG4gICAqIG9yIGhpZGVzLiBBIG11bHRpY2hhbm5lbCB2b2x1bWUncyBjaGFubmVscyBhZGQgdXAgYW5kIGhpZGUgbm90aGluZyBlaXRoZXIgd2F5LlxuICAgKi9cbiAgc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uc1Rocm91Z2ggPSB0aHJvdWdoO1xuICAgIHRoaXMuYXBwbHlWb2x1bWVEZXB0aCgpO1xuICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Vm9sdW1lRGVwdGgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGljaGFubmVsKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLnZpZXc/LmxheWVycyA/PyBbXSkge1xuICAgICAgbGF5ZXIuYmxlbmRpbmcgPSB0aGlzLnJlZ2lvbnNUaHJvdWdoID8gJ3RyYW5zbHVjZW50X25vX2RlcHRoJyA6ICd0cmFuc2x1Y2VudCc7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNob3cgdGhlIHBsYW5lcyBvZiB0aGUgc2VjdGlvbnMgYmVzaWRlIHRoZSB2b2x1bWUgd2hlcmUgdGhleSBhcmUgKG51bGw6IGhpZGUgb25lKS4gKi9cbiAgc2V0U2xpY2VQbGFuZXMocGxhbmVzOiBTbGljZVBsYW5lcyk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQbGFuZXMuc2V0KHBsYW5lcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFzc2VtYmxlZCB2b2x1bWUncyB2b3hlbHMgcGVyIGNoYW5uZWwgKGtleSAwOiB0aGUgZ3JheXNjYWxlIG9uZSksIGl0cyBmcmFtZSwgYW5kIHdoZXRoZXJcbiAgICogaXQgaXMgYSBtdWx0aWNoYW5uZWwgY29tcG9zaXRlIOKAlCB3aGF0IHRoZSBzZWN0aW9ucyBiZXNpZGUgaXQgYXJlIGN1dCBmcm9tLiBOdWxsIGJlZm9yZSBpdCBpc1xuICAgKiBhc3NlbWJsZWQuXG4gICAqL1xuICB2b2x1bWVWb3hlbHMoKTogVm9sdW1lVm94ZWxzT25TY3JlZW4gfCBudWxsIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy53b3JsZEJhc2U7XG4gICAgaWYgKCF0aGlzLmRpbXMgfHwgIWJhc2UgfHwgIXRoaXMuZnVsbFNpemUgfHwgIXRoaXMuY2hhbm5lbERhdGEuc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZGVwdGggPSBiYXNlLmRlcHRoICogdGhpcy5jdHguc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmRpbXMsXG4gICAgICBjaGFubmVsczogdGhpcy5jaGFubmVsRGF0YSxcbiAgICAgIG11bHRpY2hhbm5lbDogdGhpcy5tdWx0aWNoYW5uZWwsXG4gICAgICBmcmFtZTogeyBzaXplOiB0aGlzLmZ1bGxTaXplLCB3b3JsZDogW2Jhc2Uud2lkdGgsIGJhc2UuaGVpZ2h0LCBkZXB0aF0gfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tpbmcgdGhlIHJlY29uc3RydWN0aW9uczogd2l0aCB0aGUgc2VsZWN0aW9uIHRvb2wgYXJtZWQsIGEgY2xpY2sgb24gb25lIHNlbGVjdHMgaXRzIGNsYXNzXG4gICAqIChudWxsIGJlc2lkZSB0aGVtKTsgcmVzdGluZyBvdmVyIG9uZSBuYW1lcyBpdCwgd2hhdGV2ZXIgdGhlIHRvb2wuXG4gICAqL1xuICBwcml2YXRlIGxpc3RlblRvUmVnaW9uTWVzaGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGlmICh0aGlzLm1lc2hQb2ludGVyKSByZXR1cm47XG4gICAgdGhpcy50b29sU3ViID0gY3R4LnN0b3JlLmdldEFjdGl2ZVRvb2wkKCkuc3Vic2NyaWJlKCh0b29sKSA9PiAodGhpcy5zZWxlY3RpbmcgPSB0b29sID09PSAnc2VsZWN0JykpO1xuICAgIHRoaXMubWVzaFBvaW50ZXIgPSBjdHgub3V0c2lkZVpvbmUoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgUmVnaW9uTWVzaFBvaW50ZXIoY3R4LmNhbnZhcywgY3R4Lmhvc3QsIHtcbiAgICAgICAgICBwaWNrQXQ6ICh4LCB5KSA9PiB0aGlzLnJlZ2lvbk1lc2hlcy5waWNrQXQoeCwgeSksXG4gICAgICAgICAgYWN0aXZlOiAoKSA9PiB0aGlzLnNlbGVjdGluZyAmJiB0aGlzLnJlZ2lvbk1lc2hlcy5zaG93bi5sZW5ndGggPiAwLFxuICAgICAgICAgIGhvdmVyYWJsZTogKCkgPT4gdGhpcy5yZWdpb25NZXNoZXMuc2hvd24ubGVuZ3RoID4gMCxcbiAgICAgICAgICBvblBpY2s6IChrZXksIGFkZGl0aXZlKSA9PiBjdHguaW5ab25lKCgpID0+IGN0eC5yZWdpb25NZXNoUGlja2VkKGtleSwgYWRkaXRpdmUpKSxcbiAgICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBJbWFnZSBweCBwZXIgdm94ZWwgb2YgdGhlIGFzc2VtYmxlZCB2b2x1bWUgKGluLXBsYW5lKSwgb3IgbnVsbCBiZWZvcmUgaXQgaXMgYXNzZW1ibGVkLiAqL1xuICB2b3hlbFN0ZXAoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZnVsbFNpemUgJiYgdGhpcy5kaW1zID8gdGhpcy5mdWxsU2l6ZVswXSAvIE1hdGgubWF4KDEsIHRoaXMuZGltcy53aWR0aCkgOiBudWxsO1xuICB9XG5cbiAgLyoqIFBsYWNlIHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIGluIHRoZSB2b2x1bWUncyB3b3JsZCBib3ggYXMgaXQgaXMgbm93LiAqL1xuICBwcml2YXRlIGZyYW1lUmVnaW9uTWVzaGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLndvcmxkQmFzZTtcbiAgICBpZiAoIWJhc2UgfHwgIXRoaXMuZnVsbFNpemUpIHJldHVybjtcbiAgICBjb25zdCBkZXB0aCA9IGJhc2UuZGVwdGggKiB0aGlzLmN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGU7XG4gICAgY29uc3QgZnJhbWU6IFZvbHVtZUZyYW1lID0ge1xuICAgICAgc2l6ZTogdGhpcy5mdWxsU2l6ZSxcbiAgICAgIHdvcmxkOiBbYmFzZS53aWR0aCwgYmFzZS5oZWlnaHQsIGRlcHRoXSxcbiAgICAgIHpTY2FsZTogdGhpcy5jdHguc2V0dGluZ3Mudm9sdW1lWlNjYWxlLFxuICAgIH07XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0RnJhbWUoZnJhbWUpO1xuICAgIHRoaXMuc2xpY2VQbGFuZXMuc2V0RnJhbWUoZnJhbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGFuZCByZW5kZXIgdGhlIHZvbHVtZSwgdGhlbiBhZGQgdGhlIGF4ZXMgZ2l6bW8gKyBsYWJlbHMgYW5kIHRoZSBaIGhhbmRsZSBhbmQgZm9sbG93XG4gICAqIHRoZSBkaXNwbGF5IHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgbW91bnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBjdHgsIGluZm8gfSA9IHRoaXM7XG4gICAgLy8gWm9vbWVkIGNsb3NlLCB0aGUgd2hvbGUgdm9sdW1lIHN0YXlzIGRyYXduIChuYXBhcmktanMncyBmYXIgcGxhbmUgZm9sbG93cyB0aGUgZGlzdGFuY2UpLlxuICAgIHRoaXMucmVzdG9yZURlcHRoID0ga2VlcFNjZW5lSW5EZXB0aChjdHgudmlld2VyLmNhbWVyYTNkLCAoKSA9PiB7XG4gICAgICBjb25zdCBiID0gdGhpcy53b3JsZEJhc2U7XG4gICAgICByZXR1cm4gYiA/IGJveFJhZGl1cyhiLndpZHRoLCBiLmhlaWdodCwgYi5kZXB0aCAqIGN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGUpIDogbnVsbDtcbiAgICB9KTtcbiAgICBjb25zdCBsb2FkaW5nID0gY3R4LmxvYWRpbmcoKTsgLy8gYmFpbCBiZWZvcmUgcmVuZGVyaW5nIG9uIGEgQ2FuY2VsIC8gbmV3IHBsb3RcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgY3R4LnRpbGVzLmVuc3VyZURlc2NyaXB0b3IoY3R4LmluZm8oKSk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoSW1hZ2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSBpc1NlcnZlcmxlc3NNdWx0aWNoYW5uZWwoY3R4LnRpbGVzLmlzU2ltcGxlKGluZm8pLCBpbmZvKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBzaW1wbGVNYyA/IGluZm8hLmltYWdlTWV0YSFbMF0uY2hhbm5lbENvdW50IDogKGRlc2M/LmNoYW5uZWxzID8/IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHNpbXBsZU1jIHx8ICghIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxKTtcblxuICAgIHRoaXMuY2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLm11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICBjb25zdCB2aWV3ID0gbmV3IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcoY3R4LnZpZXdlcik7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICBjb25zdCB7IGRpbXMsIGNoYW5uZWxzIH0gPSBhd2FpdCB0aGlzLmFzc2VtYmxlQ2hhbm5lbHMoZGVzYywgY2hhbm5lbENvdW50LCBsb2FkaW5nKTtcbiAgICBpZiAoIWRpbXMgfHwgIWNoYW5uZWxzLmxlbmd0aCB8fCBsb2FkaW5nLmFib3J0ZWQpIHJldHVybjsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXJcblxuICAgIGNvbnN0IHdvcmxkID0gdGhpcy53b3JsZEJveChkaW1zKTtcbiAgICAvLyBCYXNlIGJveCAoWi1zY2FsZSA9IDEpICsgdGhlIHNhbXBsZWQgZGVwdGggZHJpdmUgdGhlIGxpdmUgWi1oZWlnaHQgaGFuZGxlIGJlbG93OyB0aGUgcGVyc2lzdGVkXG4gICAgLy8gYHZvbHVtZVpTY2FsZWAgKHVzZXIgZHJhZykgYXBwbGllcyBvbiB0b3Agc28gY2hhbmdpbmcgcmVzb2x1dGlvbiBrZWVwcyB0aGUgY2hvc2VuIGhlaWdodC5cbiAgICB0aGlzLndvcmxkQmFzZSA9IHdvcmxkO1xuICAgIHRoaXMuc2FtcGxlZERlcHRoID0gTWF0aC5tYXgoMSwgZGltcy5kZXB0aCk7XG4gICAgY29uc3Qgd29ybGRaID0gd29ybGQuZGVwdGggKiBjdHguc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgd29ybGQud2lkdGggLyBkaW1zLndpZHRoLFxuICAgICAgd29ybGQuaGVpZ2h0IC8gZGltcy5oZWlnaHQsXG4gICAgICB3b3JsZFogLyB0aGlzLnNhbXBsZWREZXB0aCxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2ggb2YgY2hhbm5lbHMpIGNoLnZveGVsU2l6ZSA9IHZveGVsU2l6ZTtcblxuICAgIHZpZXcucmVuZGVyKHRoaXMubXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJywgY2hhbm5lbHMsIHsgcmVuZGVyaW5nOiB0aGlzLnJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmFwcGx5Vm9sdW1lRGVwdGgoKTtcbiAgICBjdHguc2V0SW1hZ2VTaXplKGRpbXMud2lkdGgsIGRpbXMuaGVpZ2h0KTtcbiAgICB0aGlzLmRpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIGNvbnN0IGJveCA9IHsgd2lkdGg6IHdvcmxkLndpZHRoLCBoZWlnaHQ6IHdvcmxkLmhlaWdodCwgZGVwdGg6IHdvcmxkWiB9O1xuICAgIHRoaXMuZ2l6bW8gPSBuZXcgQXhlczNkR2l6bW8oY3R4LnZpZXdlciwgY3R4Lmhvc3QsIGJveCwgdGhpcy5heGVzTGFiZWxzKGJveCksIHtcbiAgICAgIHZpc2libGU6IGN0eC5zZXR0aW5ncy5heGVzVmlzaWJsZSxcbiAgICB9KTtcbiAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgIC8vIFwiWlwiIGF4aXMgKyBsYWJlbCBsaXZlKSwgc28gaXQgcmVhZHMgYXMgdGhlIFotaGVpZ2h0IGNvbnRyb2wuIEZsb2F0ZWQgYSBsaXR0bGUgcGFzdCB0aGUgYXhpc1xuICAgIC8vIHRpcCAow5cxLjEyKSBzbyB0aGUgZ3JpcCBjbGVhcnMgdGhlIFwiWiDCtyDigKZcIiBsYWJlbC4gRHJhZyDihpUgdG8gcmVzdHJldGNoIFogbGl2ZS5cbiAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZShjdHguaG9zdCwgY3R4LnZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgdG9wQW5jaG9yOiAoKSA9PiBbXG4gICAgICAgIC10aGlzLndvcmxkQmFzZSEud2lkdGggLyAyLFxuICAgICAgICAtdGhpcy53b3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICgodGhpcy53b3JsZEJhc2UhLmRlcHRoICogY3R4LnNldHRpbmdzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICBdLFxuICAgICAgZ2V0U2NhbGU6ICgpID0+IGN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGUsXG4gICAgICBzZXRTY2FsZTogKHMpID0+IHRoaXMuc2V0WlNjYWxlKHMpLFxuICAgIH0pO1xuICAgIHRoaXMuZm9sbG93RGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5mcmFtZVJlZ2lvbk1lc2hlcygpO1xuICAgIHRoaXMubGlzdGVuVG9SZWdpb25NZXNoZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBlYWNoIGNoYW5uZWwncyB2b2x1bWUgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpIHVuZGVyXG4gICAqIHRoZSBzdGFjayBwcm9ncmVzcyBiYXIsIHdpdGggdGhlIGRpc3BsYXkgc2V0dGluZ3MgaXQgaXMgZHJhd24gd2l0aC4gYGRpbXNgIGlzIG51bGwgd2hlblxuICAgKiBub3RoaW5nIHdhcyBhc3NlbWJsZWQgKGEgQ2FuY2VsLCBhIG5ldyBwbG90LCBvciBubyBzbGljZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlbWJsZUNoYW5uZWxzKFxuICAgIGRlc2M6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCxcbiAgICBjaGFubmVsQ291bnQ6IG51bWJlcixcbiAgICBsb2FkaW5nOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx7IGRpbXM6IEJveDMgfCBudWxsOyBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdIH0+IHtcbiAgICBjb25zdCB7IGN0eCwgaW5mbyB9ID0gdGhpcztcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKGN0eC5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHN0YXRlcyA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuXG4gICAgLy8gQXNzZW1ibGUgcGVyLWNoYW5uZWwgc2NhbGFyIHZvbHVtZXMgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChqaXQtc3BlY2lmaWMpOyB0aGUgbmFwYXJpLWpzIHZpZXdcbiAgICAvLyBvd25zIHRoZSBsYXllciBvcmNoZXN0cmF0aW9uIChvbmUgYWRkaXRpdmUgdGludGVkIHZvbHVtZSBwZXIgY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlXG4gICAgLy8gdm9sdW1lKS4gVGhlIGFkYXB0ZXIgY29tcHV0ZXMgZWFjaCBjaGFubmVsJ3MgY29sb3JtYXAgKGluY2wuIHRoZSByZXZlcnNlIGZsaXApIGFuZCBpbnZlcnQuXG4gICAgbGV0IGRpbXM6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdID0gW107XG4gICAgY3R4LnN0YWNrLmxvYWRpbmcodHJ1ZSk7XG4gICAgY3R4LnN0YWNrLnByb2dyZXNzKDApO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5tdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IGFzc2VtYmxlKGN0eCwgaW5mbywgcmVzLCBsb2FkaW5nLCBjKTtcbiAgICAgICAgICBpZiAobG9hZGluZy5hYm9ydGVkKSBicmVhazsgLy8gYSBDYW5jZWwgLyBuZXcgcGxvdDogZmV0Y2ggbm8gZnVydGhlciBjaGFubmVsXG4gICAgICAgICAgaWYgKCF2b2wpIGNvbnRpbnVlO1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy5jaGFubmVsRGF0YS5zZXQoYywgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IGN0eC5kaXNwbGF5LmNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3IpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiB0b05hcGFyaUdhbW1hKHN0Py5nYW1tYSksIC8vIEltYWdlSiDOsyDihpIgbmFwYXJpLWpzIM6zXG4gICAgICAgICAgICBpbnZlcnQ6IGN0eC5kaXNwbGF5LmludmVydCxcbiAgICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IGFzc2VtYmxlKGN0eCwgaW5mbywgcmVzLCBsb2FkaW5nKTtcbiAgICAgICAgaWYgKHZvbCkge1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy5jaGFubmVsRGF0YS5zZXQoMCwgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiBjdHguZGlzcGxheS52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHRvTmFwYXJpR2FtbWEoc3Q/LmdhbW1hKSwgLy8gSW1hZ2VKIM6zIOKGkiBuYXBhcmktanMgzrNcbiAgICAgICAgICAgIGludmVydDogY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5zdGFjay5sb2FkaW5nKGZhbHNlKTtcbiAgICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGltcywgY2hhbm5lbHMgfTtcbiAgfVxuXG4gIC8qKiBUaGUgdm9sdW1lJ3Mgd29ybGQgYm94IGZvciB0aGUgYXNzZW1ibGVkIGBkaW1zYCwgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB3b3JsZEJveChkaW1zOiBCb3gzKTogQm94MyB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgLy8gUmVzb2x1dGlvbi1pbnZhcmlhbnQgd29ybGQgYm94OyB0aGUgcGVyLWF4aXMgYHZveGVsU2l6ZWAgKG5hcGFyaSBgc2NhbGVgKSBtYXBzIHRoZSBzYW1wbGVkXG4gICAgLy8gZ3JpZCBvbnRvIGl0LlxuICAgIC8vXG4gICAgLy8gQSBzdGFjayB0aGF0IGRlY2xhcmVzIGl0cyBwaHlzaWNhbCBzcGFjaW5nIG9uIEFMTCBUSFJFRSBheGVzIGdldHMgaXRzIHRydWVcbiAgICAvLyBleHRlbnQgYXMgdGhlIHdvcmxkIGJveCDigJQgdGhlIG9ubHkgd2F5IGFuaXNvdHJvcHkgc3Vydml2ZXMsIGFuZCB3aGF0IG1ha2VzIGFcbiAgICAvLyByZXNhbXBsZWQgNDAgeCA0MCB4IDIwMCDCtW0gdm9sdW1lIHJlYWQgYXMgYSBicmFpbiBpbnN0ZWFkIG9mIGEgY3ViZS1hc3BlY3RcbiAgICAvLyBicmljay4gSXQgbmVlZHMgbm9uZSBvZiB0aGUgcmVmZXJlbmNlLWJveCBhcml0aG1ldGljOiBhIHBoeXNpY2FsIGJveCBpc1xuICAgIC8vIGFscmVhZHkgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyB0aGF0IGFyaXRobWV0aWMuIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsXG4gICAgLy8gY291bnRzIG1hZGUgaGlnaGVyIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGVcbiAgICAvLyAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi5cbiAgICAvLyBBbmNob3JpbmcgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmQgbGV0dGluZyBaIHNwYW4gdGhlXG4gICAgLy8gZnVsbCBzbGljZSBjb3VudCBtYWtlcyB0aGUgYm94IHNoYXBlIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuXG4gICAgY29uc3QgbWV0YSA9IGN0eC5pbmZvKCk/LmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGltYWdlRGVzYyA9IGN0eC50aWxlcy5jdXJyZW50RGVzY3JpcHRvcihjdHguaW5mbygpKTtcbiAgICAvLyBUaGUgc2VydmVyJ3MgZGVzY3JpcHRvciBmaXJzdCAoaXQgcmVwb3J0cyBhIHRpbGVkIHN0YWNrJ3Mgc3BhY2luZywgZS5nLiBhIE5SUkQgdm9sdW1lJ3MpLCBlbHNlXG4gICAgLy8gdGhlIGltYWdlIG1ldGFkYXRhLlxuICAgIGNvbnN0IG14ID0gaW1hZ2VEZXNjPy5tcHBYIHx8IG1ldGE/Lm1wcFg7XG4gICAgY29uc3QgbXkgPSBpbWFnZURlc2M/Lm1wcFkgfHwgbWV0YT8ubXBwWTtcbiAgICBjb25zdCBteiA9IGltYWdlRGVzYz8ubXBwWiB8fCBtZXRhPy5tcHBaO1xuICAgIGNvbnN0IG1wcFhZWjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG14ICYmIG15ICYmIG16ID8gW214LCBteSwgbXpdIDogbnVsbDtcbiAgICAvLyBUaGUgaW1hZ2UncyBERUNMQVJFRCBwaXhlbCBkaW1lbnNpb25zLCB3aGljaCBpcyB3aGF0IG1wcCBpcyBwZXI6IHRoZSBzYW1wbGVkXG4gICAgLy8gZGltcyBhcmUgZGVjaW1hdGVkLCBzbyBzaXppbmcgYSBwaHlzaWNhbCBib3ggYnkgdGhlbSB3b3VsZCBtYWtlIHRoZSB3b3JsZFxuICAgIC8vIGJveCBkZXBlbmQgb24gdGhlIHJlc29sdXRpb24gdGhlIHVzZXIgaGFwcGVucyB0byBiZSB2aWV3aW5nIGF0LlxuICAgIGNvbnN0IGZ1bGxXID0gaW1hZ2VEZXNjPy53aWR0aCA/PyBtZXRhPy54ID8/IGRpbXMud2lkdGg7XG4gICAgY29uc3QgZnVsbEggPSBpbWFnZURlc2M/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXMuaGVpZ2h0O1xuICAgIGNvbnN0IGZ1bGxEID0gc3RhY2tEZXB0aChjdHguaW5mbygpKSB8fCBkaW1zLmRlcHRoO1xuICAgIHRoaXMuZnVsbFNpemUgPSBbZnVsbFcsIGZ1bGxILCBmdWxsRF07XG4gICAgaWYgKG1wcFhZWikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IGZ1bGxXICogbXBwWFlaWzBdLFxuICAgICAgICBoZWlnaHQ6IGZ1bGxIICogbXBwWFlaWzFdLFxuICAgICAgICBkZXB0aDogZnVsbEQgKiBtcHBYWVpbMl0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmdWxsTG9uZyA9IE1hdGgubWF4KDEsIGZ1bGxXLCBmdWxsSCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICBoZWlnaHQ6IChmdWxsSCAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgIGRlcHRoOiBmdWxsRCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB3aG9sZSBzdGFjayBpcyBhbHJlYWR5IG9uIHNjcmVlbjogbm8gcGxhbmUgdG8gc3RlcC4gKFRoaXMgdXNlZCB0byB3cml0ZSBgdmlld2VyLmRpbXMuemAsXG4gICAqIHdoaWNoIG9ubHkgYSB0aWxlZCAyRCBpbWFnZSByZWFkcyDigJQgYSB2b2x1bWUgcmF5bWFyY2hlcyBldmVyeSBzbGljZSDigJQgYW5kIHNjaGVkdWxlIGEgcmVhZGJhY2tcbiAgICogb2YgYSBmcmFtZSB0aGF0IGhhZCBub3QgY2hhbmdlZC4gVGhlIHRvb2xiYXIgc2hvd3Mgbm8gc2xpY2UgY29udHJvbCBpbiB2b2x1bWUgLyBpc29zdXJmYWNlXG4gICAqIG1vZGUsIGFzIFBsb3RseSdzIGlzb3N1cmZhY2UgaWdub3JlcyB0aGUgc2xpY2UgdG9vLilcbiAgICovXG4gIHNldFooKTogdm9pZCB7XG4gICAgLyogbm90aGluZyB0byBzdGVwICovXG4gIH1cblxuICAvKiogVGhlIGludGVuc2l0eSBoaXN0b2dyYW0gb2YgdGhlIGFzc2VtYmxlZCAoZG93bnNhbXBsZWQpIHVpbnQ4IHZvbHVtZSBmb3IgdGhlIHJlcXVlc3RlZFxuICAgKiAgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUuICovXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gY2hhbm5lbEhpc3RvZ3JhbSh0aGlzLmNoYW5uZWxEYXRhLCBjaGFubmVsLCBiaW5zKTtcbiAgfVxuXG4gIGlzb0NvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52aWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ID8gc3VyZmFjZTNkQ29udHJvbHModGhpcy5jdHgsICgpID0+IHRoaXMuZ2l6bW8pIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBHaXZlcyB0aGUgY2FtZXJhIGJhY2sgbmFwYXJpLWpzJ3Mgb3duIGRlcHRoIHJhbmdlIChzZWUga2VlcFNjZW5lSW5EZXB0aCkuICovXG4gIHByaXZhdGUgcmVzdG9yZURlcHRoOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucmVzdG9yZURlcHRoPy4oKTtcbiAgICB0aGlzLnJlc3RvcmVEZXB0aCA9IG51bGw7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5naXptbz8uZGVzdHJveSgpO1xuICAgIHRoaXMuZ2l6bW8gPSBudWxsO1xuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXIoKTtcbiAgICB0aGlzLnNsaWNlUGxhbmVzLmRlc3Ryb3koKTtcbiAgICB0aGlzLm1lc2hQb2ludGVyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5tZXNoUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy50b29sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudG9vbFN1YiA9IG51bGw7XG4gICAgdGhpcy53b3JsZEJhc2UgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBzZXRaU2NhbGUoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB7IHNldHRpbmdzIH0gPSB0aGlzLmN0eDtcbiAgICBzZXR0aW5ncy52b2x1bWVaU2NhbGUgPSBNYXRoLm1pbigxMCwgTWF0aC5tYXgoMC4xLCBmYWN0b3IpKTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy53b3JsZEJhc2U7XG4gICAgaWYgKCFiYXNlIHx8ICF0aGlzLnZpZXcpIHJldHVybjtcbiAgICBjb25zdCB3b3JsZFogPSBiYXNlLmRlcHRoICogc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMuc2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52aWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICB0aGlzLmdpem1vPy5zZXREZXB0aCh3b3JsZFosIHRoaXMuYXhlc0xhYmVscyh7IHdpZHRoOiBiYXNlLndpZHRoLCBoZWlnaHQ6IGJhc2UuaGVpZ2h0LCBkZXB0aDogd29ybGRaIH0pKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLmZyYW1lUmVnaW9uTWVzaGVzKCk7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBUaGUgWC9ZL1ogYXhpcy1lbmQgbGFiZWwgc3BlY3MgZm9yIHRoZSBnaXptby4gQW5jaG9ycyBhcmUgaW4gdGhlIHZvbHVtZSdzIGNlbnRyZWQgd29ybGQgYm94XG4gICAqICAobWF0Y2hpbmcgdGhlIEF4ZXNMYXllciBnZW9tZXRyeSk7IHRoZSBzY2FsZSB0ZXh0IHJlZmxlY3RzIHRoZSBGVUxMIGltYWdlIGV4dGVudCDigJQgcGh5c2ljYWwgwrVtXG4gICAqICB3aGVuIMK1bS9waXhlbCBpcyBrbm93biwgZWxzZSBwaXhlbCAoWC9ZKSAvIHNsaWNlIChaKSBjb3VudHMuICovXG4gIGF4ZXNMYWJlbHModm9sOiBCb3gzKTogQXhpc0xhYmVsU3BlY1tdIHtcbiAgICBjb25zdCBoeCA9IHZvbC53aWR0aCAvIDI7XG4gICAgY29uc3QgaHkgPSB2b2wuaGVpZ2h0IC8gMjtcbiAgICBjb25zdCBoeiA9IHZvbC5kZXB0aCAvIDI7XG4gICAgLy8gTWVhc3VyZWQgZnJvbSB0aGUgSU1BR0UncyBvd24gZXh0ZW50LCBuZXZlciBmcm9tIHRoZSB3b3JsZCBib3g6IHRoZSBib3ggaXMgYVxuICAgIC8vIHNoYXBlIChhbmQgZm9yIGEgcGh5c2ljYWxseSBzaXplZCB2b2x1bWUgaXQgaXMgYWxyZWFkeSBpbiDCtW0sIHNvIHJlYWRpbmcgYVxuICAgIC8vIHBpeGVsIGNvdW50IG9mZiBpdCBhbmQgbXVsdGlwbHlpbmcgYnkgbXBwIHdvdWxkIHNjYWxlIHRoZSBsYWJlbCB0d2ljZSkuXG4gICAgY29uc3QgeyBweCwgbXBwIH0gPSB0aGlzLmltYWdlRXh0ZW50KCk7XG4gICAgY29uc3QgbGVuID0gKG46IG51bWJlciwgdW06IG51bWJlcik6IHN0cmluZyA9PiAodW0gPiAwID8gZm9ybWF0TGVuZ3RoKG4gKiB1bSwgJ8K1bScpIDogYCR7bn0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihweFswXSwgbXBwWzBdKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKHB4WzFdLCBtcHBbMV0pfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICAgIC8vIFBoeXNpY2FsIHdoZW4gdGhlIHN0YWNrIGRlY2xhcmVzIGl0cyBzbGljZSBzcGFjaW5nIChgbXBwWmApIOKAlCBhIHJlc2FtcGxlZFxuICAgICAgLy8gdm9sdW1lIGtub3dzIGhvdyB0aGljayBpdCBpczsgYSBwbGFpbiB6LXN0YWNrIGNhbiBvbmx5IHNheSBob3cgbWFueSBzbGljZXMuXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7bGVuKHB4WzJdLCBtcHBbMl0pfWAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSdzIGRlY2xhcmVkIGV4dGVudCBpbiBwaXhlbHMvc2xpY2VzLCBhbmQgaXRzIHBoeXNpY2FsIHNwYWNpbmcgcGVyXG4gICAqIGF4aXMgaW4gwrVtICgwID0gdW5kZWNsYXJlZCwgYW5kIHRoZW4gdGhhdCBheGlzIHJlYWRzIGluIHBpeGVscykuXG4gICAqXG4gICAqIE9uZSBwbGFjZSwgYmVjYXVzZSB0aGUgdm9sdW1lIHdvcmxkIGJveCBhbmQgdGhlIGF4aXMgbGFiZWxzIGhhdmUgdG8gYWdyZWVcbiAgICogYWJvdXQgd2hhdCB0aGUgaW1hZ2UncyByZWFsIGRpbWVuc2lvbnMgYXJlIOKAlCB0aGUgc2FtcGxlZCBncmlkIGlzIGRlY2ltYXRlZCBhbmRcbiAgICogc2F5cyBub3RoaW5nIGFib3V0IGVpdGhlci5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VFeHRlbnQoKTogeyBweDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtcHA6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5jdHguaW5mbygpO1xuICAgIGNvbnN0IG1ldGEgPSBpbmZvPy5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBkaW1zID0gdGhpcy5kaW1zO1xuICAgIGNvbnN0IGRlc2MgPSB0aGlzLmN0eC50aWxlcy5jdXJyZW50RGVzY3JpcHRvcihpbmZvKTtcbiAgICBjb25zdCBtcHBYID0gZGVzYz8ubXBwWCB8fCBtZXRhPy5tcHBYIHx8IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB4OiBbXG4gICAgICAgIGRlc2M/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcz8ud2lkdGggPz8gMSxcbiAgICAgICAgZGVzYz8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcz8uaGVpZ2h0ID8/IDEsXG4gICAgICAgIHN0YWNrRGVwdGgoaW5mbykgfHwgZGltcz8uZGVwdGggfHwgMSxcbiAgICAgIF0sXG4gICAgICAvLyBBIGRlc2NyaXB0b3IgdGhhdCByZXBvcnRzIG9ubHkgbXBwWCBpcyBzcXVhcmUtcGl4ZWwgYnkgY29udmVudGlvbiwgd2hpY2ggaXNcbiAgICAgIC8vIHdoYXQgdGhlIDJEIHNjYWxlIGJhciBhbHJlYWR5IGFzc3VtZXMgb2YgaXQuXG4gICAgICBtcHA6IFttcHBYLCBkZXNjPy5tcHBZIHx8IG1ldGE/Lm1wcFkgfHwgbXBwWCwgZGVzYz8ubXBwWiB8fCBtZXRhPy5tcHBaIHx8IDBdLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0b3JlJ3MgY29sb3JtYXAsIHJldmVyc2UsIGludmVydCBhbmQgY2hhbm5lbCB3aW5kb3dzIOKGkiB0aGUgdm9sdW1lJ3MgdHJhbnNmZXIgZnVuY3Rpb246XG4gICAqICBjb2xvdXIgKGNoYW5uZWwgdGludCBvciBzZWxlY3RlZCBjb2xvcm1hcCksIHRoZSBpbnRlbnNpdHkgd2luZG93IChtaW4vbWF4IOKGkiBjb250cmFzdExpbWl0cylcbiAgICogIGFuZCBnYW1tYSwgbWlycm9yaW5nIHRoZSBncmF5c2NhbGUgaW1hZ2UncyBkaXNwbGF5IGNvbnRyb2xzIHNvIHRoZSBoaXN0b2dyYW0gcGFuZSBkcml2ZXMgdGhlXG4gICAqICAzRCByZW5kZXIuICovXG4gIHByaXZhdGUgZm9sbG93RGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgZGlzcGxheSB9ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXc7XG4gICAgICBpZiAoIXZpZXcpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLm11bHRpY2hhbm5lbCkge1xuICAgICAgICAvLyBFYWNoIGNoYW5uZWwncyBsYXllciBpcyB0aW50ZWQgYnkgaXRzIGNvbG91ciBhbmQgZ2V0cyBpdHMgb3duIHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5LlxuICAgICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkuY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnKSxcbiAgICAgICAgICAgIGludmVydDogZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgICAuLi4oc3RcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgZ2FtbWE6IHRvTmFwYXJpR2FtbWEoc3QuZ2FtbWEpLCAvLyBJbWFnZUogzrMg4oaSIG5hcGFyaS1qcyDOs1xuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgIGludmVydDogZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogdG9OYXBhcmlHYW1tYShzdC5nYW1tYSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBOQVBBUklfU0NBVFRFUjNEIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBIKTogdGhlIGRvd25zYW1wbGVkIHZveGVsIGdyaWQgYXMgYSAzRCBwb2ludCBjbG91ZFxuICogY29sb3VyZWQgYnkgaW50ZW5zaXR5ICh0aGUgbmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyB2b3hlbCBzY2F0dGVyM2QpLiBBc3NlbWJsZXMgYSBjb2Fyc2VcbiAqIHZvbHVtZSwgdGhlbiBlbWl0cyBhIGZsYXQtc3RyaWRlZCBzYW1wbGUgb2Ygdm94ZWxzIChjYXBwZWQgYXQgYFNDQVRURVIzRF9NQVhfUE9JTlRTYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2F0dGVyM2RTY2VuZSBpbXBsZW1lbnRzIE5hcGFyaVNjZW5lIHtcbiAgcHJpdmF0ZSBsYXllcjogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFzc2VtYmxlZCB2b2x1bWUgKGtleSAwKSwgZm9yIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdHg6IFNjZW5lQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICkge31cblxuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKGN0eC5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGN0eC5zdGFjay5sb2FkaW5nKHRydWUpO1xuICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICBsZXQgdm9sOiBBc3NlbWJsZWRWb2x1bWUgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdm9sID0gYXdhaXQgYXNzZW1ibGUoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5pbmZvLFxuICAgICAgICB7IG1heFNsaWNlOiBNYXRoLm1pbihyZXMubWF4U2xpY2UsIFNDQVRURVIzRF9NQVhfWFkpLCBzbGljZVN0ZXA6IHJlcy5zbGljZVN0ZXAgfSxcbiAgICAgICAgY3R4LmxvYWRpbmcoKSxcbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5zdGFjay5sb2FkaW5nKGZhbHNlKTtcbiAgICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICB9XG4gICAgaWYgKCF2b2wgfHwgY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB2b2w7XG4gICAgY29uc3QgelNjYWxlID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgLyBNYXRoLm1heCgxLCBkZXB0aCk7IC8vIOKJiCBjdWJpYyBhc3BlY3RcbiAgICBjb25zdCB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogZGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gU0NBVFRFUjNEX01BWF9QT0lOVFMpKTtcbiAgICBjb25zdCBwb3M6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdmFsOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICBjb25zdCB4ID0gaSAlIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHdpZHRoKSAlIGhlaWdodDtcbiAgICAgIGNvbnN0IHppID0gTWF0aC5mbG9vcihpIC8gKHdpZHRoICogaGVpZ2h0KSk7XG4gICAgICBwb3MucHVzaCh4LCB5LCB6aSAqIHpTY2FsZSk7XG4gICAgICB2YWwucHVzaChkYXRhW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdCA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIHRoaXMubGF5ZXIgPSBjdHgudmlld2VyLmFkZFBvaW50czNEKG5ldyBGbG9hdDMyQXJyYXkocG9zKSwgbmV3IEZsb2F0MzJBcnJheSh2YWwpLCB7XG4gICAgICBjb2xvcm1hcDogY3R4LmRpc3BsYXkudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgIGludmVydDogY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgc2l6ZTogMyxcbiAgICB9KTtcbiAgICBjdHguc2V0SW1hZ2VTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIC8vIEZlZWQgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gZnJvbSB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoa2V5IDApLlxuICAgIHRoaXMuY2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5uZWxEYXRhLnNldCgwLCBkYXRhKTtcbiAgICAvLyBTdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIGNsb3VkJ3MgY29sb3JtYXAgKyBjb250cmFzdC5cbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjdHguZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcjtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHMgPSBjaGFubmVsc1swXTtcbiAgICAgIGxheWVyLmNvbG9ybWFwID0gY3R4LmRpc3BsYXkudm9sdW1lQ29sb3JtYXAocyk7XG4gICAgICBsYXllci5pbnZlcnQgPSBjdHguZGlzcGxheS5pbnZlcnQ7XG4gICAgICBpZiAocykgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbcy5taW4sIHMubWF4XTtcbiAgICAgIGN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogVGhlIHdob2xlIHN0YWNrIGlzIGFscmVhZHkgb24gc2NyZWVuOiBubyBwbGFuZSB0byBzdGVwLiAqL1xuICBzZXRaKCk6IHZvaWQge1xuICAgIC8qIG5vdGhpbmcgdG8gc3RlcCAqL1xuICB9XG5cbiAgaGlzdG9ncmFtKGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiBjaGFubmVsSGlzdG9ncmFtKHRoaXMuY2hhbm5lbERhdGEsIGNoYW5uZWwsIGJpbnMpO1xuICB9XG5cbiAgc3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIgPyBzdXJmYWNlM2RDb250cm9scyh0aGlzLmN0eCwgKCkgPT4gbnVsbCkgOiBudWxsO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gbnVsbDtcbiAgfVxufVxuIl19
|