@jax-data-science/sci-image-visualizer 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +7 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +70 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +11 -1
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
- package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
- package/esm2022/lib/region-editor/region-editor.component.mjs +152 -4
- package/esm2022/lib/region-editor/region-persistence.service.mjs +9 -1
- package/esm2022/lib/region-import/label-classes.mjs +149 -0
- package/esm2022/lib/region-import/label-volume.mjs +225 -0
- package/esm2022/lib/region-import/ome-zarr-labels.mjs +253 -0
- package/esm2022/lib/region-import/open-annotations.mjs +289 -0
- package/esm2022/lib/region-import/region-import.mjs +71 -0
- package/esm2022/lib/region-import/zarr-codecs.mjs +167 -0
- package/esm2022/lib/region-import/zip.mjs +157 -0
- package/esm2022/lib/routing-visualizer.service.mjs +112 -7
- package/esm2022/lib/store/region-source-scope.mjs +19 -4
- package/esm2022/lib/store/region-store.service.mjs +64 -14
- package/esm2022/lib/visualizer/region-load.mjs +16 -1
- package/esm2022/lib/visualizer.component.mjs +28 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs} +2057 -196
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs} +4 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/index.d.ts +12 -0
- package/lib/contracts/image.contract.d.ts +7 -0
- package/lib/contracts/ports/region-io.port.d.ts +24 -0
- package/lib/contracts/region-editor-api.contract.d.ts +19 -1
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +40 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +5 -0
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
- package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
- package/lib/implementations/osd/slice-cache.d.ts +13 -3
- package/lib/region-editor/region-editor.component.d.ts +27 -0
- package/lib/region-editor/region-persistence.service.d.ts +5 -1
- package/lib/region-import/label-classes.d.ts +39 -0
- package/lib/region-import/label-volume.d.ts +35 -0
- package/lib/region-import/ome-zarr-labels.d.ts +36 -0
- package/lib/region-import/open-annotations.d.ts +73 -0
- package/lib/region-import/region-import.d.ts +46 -0
- package/lib/region-import/zarr-codecs.d.ts +14 -0
- package/lib/region-import/zip.d.ts +31 -0
- package/lib/routing-visualizer.service.d.ts +39 -1
- package/lib/store/region-source-scope.d.ts +8 -2
- package/lib/store/region-store.service.d.ts +15 -5
- package/lib/visualizer.component.d.ts +9 -0
- package/package.json +2 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +0 -1
|
@@ -499,6 +499,8 @@ export class VisualizerComponent {
|
|
|
499
499
|
/** Isosurface band as a 0–255 slider position, mapped onto the volume's real
|
|
500
500
|
* intensity range by the renderer. Defaults to the full range. */
|
|
501
501
|
this.isoRange = [0, 255];
|
|
502
|
+
/** Waits for a viewer created outside the document to be attached (see {@link whenInDocument}). */
|
|
503
|
+
this.attachObserver = null;
|
|
502
504
|
/** Debounced z-slice scrubbing (see SliceScrubber — refactoring plan Step 7). */
|
|
503
505
|
this.scrubber = new SliceScrubber((z) => {
|
|
504
506
|
this.plotService.setZIndex(z);
|
|
@@ -778,12 +780,35 @@ export class VisualizerComponent {
|
|
|
778
780
|
// re-enters the zone (ngZone.run) only when it actually changes view state.
|
|
779
781
|
this.shortcuts = new ViewerShortcuts(this.shortcutHost(), this.ngZone);
|
|
780
782
|
this.shortcuts.attach();
|
|
781
|
-
this.onViewReady();
|
|
783
|
+
this.whenInDocument(() => this.onViewReady());
|
|
782
784
|
}
|
|
783
785
|
/** The plot div exists now: run an image-less draw that arrived before it did. */
|
|
784
786
|
onViewReady() {
|
|
785
787
|
this.render.viewIsReady(this.spatial.dataset, !!this.imageInfo);
|
|
786
788
|
}
|
|
789
|
+
/**
|
|
790
|
+
* Run `ready` once this viewer is in the document. A host may create it detached — a closed
|
|
791
|
+
* dialog's projected content, such as jit-ui's pipeline preview — and the backends find the
|
|
792
|
+
* plot div by id, so a draw then found no target and alerted "the renderer could not start"
|
|
793
|
+
* over another viewer. Until then its view is not ready, and an image-less draw waits.
|
|
794
|
+
*/
|
|
795
|
+
whenInDocument(ready) {
|
|
796
|
+
const el = this.hostRef?.nativeElement;
|
|
797
|
+
if (!el || el.isConnected || typeof ResizeObserver === 'undefined') {
|
|
798
|
+
ready();
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
// Attached and laid out, its size changes from nothing: that is when it can be drawn into.
|
|
802
|
+
const observer = new ResizeObserver(() => {
|
|
803
|
+
if (!el.isConnected)
|
|
804
|
+
return;
|
|
805
|
+
observer.disconnect();
|
|
806
|
+
this.attachObserver = null;
|
|
807
|
+
this.ngZone.run(ready);
|
|
808
|
+
});
|
|
809
|
+
this.attachObserver = observer;
|
|
810
|
+
observer.observe(el);
|
|
811
|
+
}
|
|
787
812
|
/** What the keyboard, wheel and context-menu shortcuts act on. Their listeners live
|
|
788
813
|
* outside this view, so every action that changes what it shows marks it for check. */
|
|
789
814
|
shortcutHost() {
|
|
@@ -832,6 +857,7 @@ export class VisualizerComponent {
|
|
|
832
857
|
this.toggleDragMode('select');
|
|
833
858
|
}
|
|
834
859
|
ngOnDestroy() {
|
|
860
|
+
this.attachObserver?.disconnect();
|
|
835
861
|
// A contributed mode's session ends first, while the viewer it drew over
|
|
836
862
|
// still exists. The panel goes with this view, so no change detection.
|
|
837
863
|
this.contributions.destroy();
|
|
@@ -1292,4 +1318,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
1292
1318
|
type: ViewChild,
|
|
1293
1319
|
args: ['toolDialogSlot']
|
|
1294
1320
|
}] } });
|
|
1295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBSU4sUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBWSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJB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QWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBjb21wdXRlZCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlLCBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBDaGVja2JveE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnUsIENvbnRleHRNZW51TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jb250ZXh0bWVudSc7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHsgSW5wdXROdW1iZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcbmltcG9ydCB7IFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9wcm9ncmVzc2Jhcic7XG5pbXBvcnQgeyBTbGlkZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NsaWRlcic7XG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSW1hZ2VTdGF0ZVBvcnQsIElNQUdFX1NUQVRFX1BPUlQgfSBmcm9tICcuL2NvbnRyYWN0cy9wb3J0cy9pbWFnZS1zdGF0ZS5wb3J0JztcbmltcG9ydCB7IFBvbHlnb24gfSBmcm9tICcuL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUmVnaW9uT3BzU2VydmljZSB9IGZyb20gJy4vcmVnaW9uLW9wcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZJWl9UT0FTVF9LRVksIFZJWl9BTEVSVF9UT0FTVF9LRVkgfSBmcm9tICcuL3RvYXN0LW91dGxldHMnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2xpY2VTY3J1YmJlciB9IGZyb20gJy4vcmVuZGVyLW9yY2hlc3RyYXRvcic7XG5pbXBvcnQgeyBJbWFnZVJlbmRlclNlc3Npb24sIGVycm9yTWVzc2FnZSB9IGZyb20gJy4vcmVuZGVyLXNlc3Npb24nO1xuaW1wb3J0IHtcbiAgUGxvdFR5cGUsXG4gIFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgUGxvdFR5cGVJZCxcbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9yLFxuICBpc0J1aWx0aW5QbG90VHlwZSxcbiAgaXNOYXBhcmkzZCxcbiAgaXNTcGF0aWFsT21pY3MsXG4gIGlzU3BhdGlhbE9taWNzM2QsXG4gIHJlbmRlcmVyT3duc1doZWVsLFxuICBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbiAgaXNOYXBhcmlWb2x1bWUsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIFBMT1RfVFlQRV9DT05UUklCVVRJT05TLFxuICBQbG90VHlwZUNvbnRyaWJ1dGlvbixcbiAgUGxvdFR5cGVPcHRpb24sXG59IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuaW1wb3J0IHsgUGxvdE1vZGVDb250cm9sbGVyIH0gZnJvbSAnLi9wbG90LW1vZGUvcGxvdC1tb2RlLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgY29tcHV0ZVBsb3RUeXBlTWVudSwgcmVjb25jaWxlUGxvdFR5cGUgfSBmcm9tICcuL3Bsb3QtbW9kZS9wbG90LXR5cGUtbWVudSc7XG5pbXBvcnQgeyBUb29sUGFyYW1zTW9kZWwgfSBmcm9tICcuL3Bsb3QtbW9kZS90b29sLXBhcmFtcy1tb2RlbCc7XG5pbXBvcnQgeyBDb250cmlidXRpb25Ib3N0LCBQbG90TW9kZVBhbmVsVmlldywgVG9vbERpYWxvZ1ZpZXcgfSBmcm9tICcuL3Bsb3QtbW9kZS9jb250cmlidXRpb24taG9zdCc7XG5pbXBvcnQgeyBJVmlzdWFsaXplciwgVklTVUFMSVpFUiwgVmlzdWFsaXplckhhbmRsZSB9IGZyb20gJy4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgU0FNX01PREVMUywgZ2V0RGVmYXVsdFNhbU1vZGVsSWQsIGlzU2FtTW9kZWxSZWFkeSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW1vZGVsLXJlZ2lzdHJ5JztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTZWdtZW50YXRpb25SdW5uZXIgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NlZ21lbnRhdGlvbi1ydW5uZXInO1xuaW1wb3J0IHtcbiAgVE9PTEJBUl9UT09MUyxcbiAgVG9vbGJhckNvbnRyaWJ1dGlvbixcbiAgVG9vbGJhckRpYWxvZ1Rvb2xDb250cmlidXRpb24sXG4gIFRvb2xiYXJUb29sQ29udHJpYnV0aW9uLFxuICB2aXNpYmxlVG9vbENvbnRyaWJ1dGlvbnMsXG59IGZyb20gJy4vY29udHJhY3RzL3Rvb2xiYXItdG9vbC5jb250cmFjdCc7XG5pbXBvcnQgeyBUb29sYmFyVG9vbFZpc2liaWxpdHksIEFMTF9UT09MQkFSX1RPT0xTIH0gZnJvbSAnLi9jb250cmFjdHMvdG9vbGJhci1jb25maWcnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgYXBwbHlJbWFnZVJvaXMgfSBmcm9tICcuL3Zpc3VhbGl6ZXIvcmVnaW9uLWxvYWQnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVBY3Rpb25zLCBDb250ZXh0TWVudVN0YXRlLCBidWlsZENvbnRleHRNZW51IH0gZnJvbSAnLi92aXN1YWxpemVyL3Zpc3VhbGl6ZXItY29udGV4dC1tZW51JztcbmltcG9ydCB7IFJlZ2lvbkFjdGlvbnMgfSBmcm9tICcuL3Zpc3VhbGl6ZXIvcmVnaW9uLWFjdGlvbnMnO1xuaW1wb3J0IHsgVG9vbE1vZGVzIH0gZnJvbSAnLi92aXN1YWxpemVyL3Rvb2wtbW9kZXMnO1xuaW1wb3J0IHsgU2hvcnRjdXRIb3N0LCBWaWV3ZXJTaG9ydGN1dHMgfSBmcm9tICcuL3Zpc3VhbGl6ZXIvdmlld2VyLXNob3J0Y3V0cyc7XG5pbXBvcnQgeyBGbG9hdGluZ0RyYWdEaXJlY3RpdmUsIEZsb2F0aW5nUG9zIH0gZnJvbSAnLi92aXN1YWxpemVyL2Zsb2F0aW5nLWRyYWcuZGlyZWN0aXZlJztcbmltcG9ydCB7IEludGVuc2l0eUluc2V0Q29tcG9uZW50IH0gZnJvbSAnLi9pbnRlbnNpdHktaW5zZXQvaW50ZW5zaXR5LWluc2V0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWN0aW9uUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vc2VjdGlvbi1wYW5lL3NlY3Rpb24tcGFuZS5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXdzIH0gZnJvbSAnLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxEYXRhc2V0QmluZGVyIH0gZnJvbSAnLi92aXN1YWxpemVyL3NwYXRpYWwtZGF0YXNldC1iaW5kZXInO1xuaW1wb3J0IHsgVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vdG9vbGJhci90b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWdpb25FZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2hhbm5lbEhpc3RvZ3JhbUNvbXBvbmVudCB9IGZyb20gJy4vY2hhbm5lbC1oaXN0b2dyYW0vY2hhbm5lbC1oaXN0b2dyYW0uY29tcG9uZW50JztcbmltcG9ydCB7IFNwYXRpYWxDb250cm9sc0NvbXBvbmVudCB9IGZyb20gJy4vc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNvbnRyb2xzLmNvbXBvbmVudCc7XG5cbi8qKiBQZXItaW5zdGFuY2UgcGxvdC1kaXYgaWQgc291cmNlLiBUaGUgbW91bnQgZWxlbWVudCdzIGlkIG11c3QgYmUgdW5pcXVlIHNvIHR3b1xuICogIGxpdmUgdmlld2VycyAoZS5nLiB0aGUgbWFpbiBkaWFncmFtICsgYSBtb2RhbCBwcmV2aWV3KSBkb24ndCBjb2xsaWRlIG9uIHRoZVxuICogIHNhbWUgRE9NIGlkIOKAlCBgZ2V0RWxlbWVudEJ5SWRgIHdvdWxkIG90aGVyd2lzZSByZXR1cm4gd2hpY2hldmVyIGNhbWUgZmlyc3QuXG4gKiAgU3R5bGluZyBoYW5ncyBvZmYgdGhlIGAudml6LXBsb3RgIGNsYXNzIGluc3RlYWQgb2YgdGhlIGlkLiAqL1xubGV0IHBsb3RJbnN0YW5jZVNlcSA9IDA7XG5cbi8qKlxuICogVGhlIHZpZXdlciAoYDx2aXN1YWxpemVyPmApOiB0aGUgcGxvdCBzdXJmYWNlLCBpdHMgdG9vbGJhciwgdGhlIGxvYWRpbmcgb3ZlcmxheSBhbmRcbiAqIHRoZSBkaWFsb2dzIGl0IG9wZW5zIChDaGFubmVscyAmIEhpc3RvZ3JhbSwgc3BhdGlhbC1vbWljcyBjb250cm9scywgUmVnaW9uIEVkaXRvcixcbiAqIGNvbnRyaWJ1dGVkIG1vZGVzIGFuZCB0b29scykuIEl0IG9yY2hlc3RyYXRlcyByZW5kZXJpbmcgdGhyb3VnaCB0aGUgYFZJU1VBTElaRVJgXG4gKiBjb250cmFjdCBhbmQgcmVhZHMgdGhlIGltYWdlIGZyb20gdGhlIGhvc3QncyBgSU1BR0VfU1RBVEVfUE9SVGAuXG4gKlxuICogT25QdXNoLiBUZW1wbGF0ZSBldmVudHMgcmUtcmVuZGVyIGl0OyBzdGF0ZSB0aGF0IGxhbmRzIGFzeW5jaHJvbm91c2x5IGdvZXMgdGhyb3VnaFxuICoge0BsaW5rIGNoYW5nZWR9IChvciBhIHNpZ25hbDogdGhlIGxvYWRpbmcgb3ZlcmxheSksIGFuZCB0aGUgY29sbGFib3JhdG9ycyB0aGF0IG11c3RcbiAqIHJlbmRlciBzeW5jaHJvbm91c2x5ICh0aGUgcmVuZGVyIHNlc3Npb24ncyBvdmVybGF5LCBhIGNvbnRyaWJ1dGVkIHBhbmVsJ3Mgc2xvdCwgdGhlXG4gKiBjb250ZXh0IG1lbnUgYmVmb3JlIGl0IG9wZW5zKSBzdGlsbCBjYWxsIGBkZXRlY3RDaGFuZ2VzKClgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2aXN1YWxpemVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENoZWNrYm94TW9kdWxlLFxuICAgIENvbnRleHRNZW51TW9kdWxlLFxuICAgIERpYWxvZ01vZHVsZSxcbiAgICBEcm9wZG93bk1vZHVsZSxcbiAgICBJbnB1dE51bWJlck1vZHVsZSxcbiAgICBQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBTbGlkZXJNb2R1bGUsXG4gICAgVG9hc3RNb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBGbG9hdGluZ0RyYWdEaXJlY3RpdmUsXG4gICAgVG9vbGJhckNvbXBvbmVudCxcbiAgICBJbnRlbnNpdHlJbnNldENvbXBvbmVudCxcbiAgICBTZWN0aW9uUGFuZUNvbXBvbmVudCxcbiAgICBDaGFubmVsSGlzdG9ncmFtQ29tcG9uZW50LFxuICAgIFNwYXRpYWxDb250cm9sc0NvbXBvbmVudCxcbiAgICBSZWdpb25FZGl0b3JDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmlzdWFsaXplci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRleHRNZW51QWN0aW9ucyB7XG4gIC8qKiBQZXItaW5zdGFuY2UgdG9hc3Qga2V5LiBNZXNzYWdlU2VydmljZSBpcyBhIGdsb2JhbCBzaW5nbGV0b24sIHNvIHR3byBsaXZlXG4gICAqICBgPHZpc3VhbGl6ZXI+YCBpbnN0YW5jZXMgKG1haW4gdmlld2VyICsgcGlwZWxpbmUtZGlhbG9nIHByZXZpZXcpIHNoYXJpbmdcbiAgICogIG9uZSBrZXkgd291bGQgZWFjaCByZW5kZXIgdGhlIHNhbWUgbWVzc2FnZSDigJQgYSBkdXBsaWNhdGUgdG9hc3QuIEEgdW5pcXVlXG4gICAqICBrZXkgcGVyIGluc3RhbmNlIHNjb3BlcyB0aGUgdG9hc3QgdG8gdGhlIGNvbXBvbmVudCB0aGF0IHJhaXNlZCBpdC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbmV4dFRvYXN0SWQgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlicmFyeSBhbHNvIHJhaXNlcyBub3RpY2VzIGZyb20gcGxhY2VzIHRoYXQgaGF2ZSBubyBpbnN0YW5jZSBvZiB0aGVpclxuICAgKiBvd24gdG8ga2V5IGFnYWluc3Q6IHtAbGluayBQbG90bHlTZXJ2aWNlfSBpcyBgcHJvdmlkZWRJbjogJ3Jvb3QnYCwgYW5kIHRoZVxuICAgKiByZWdpb24gZWRpdG9yIGlzIGEgY2hpbGQgZGlhbG9nLiBUaG9zZSB1c2UgdGhlIGZpeGVkXG4gICAqIHtAbGluayBWSVpfVE9BU1RfS0VZfSAvIHtAbGluayBWSVpfQUxFUlRfVE9BU1RfS0VZfSBvdXRsZXRzLlxuICAgKlxuICAgKiBGb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBwZXItaW5zdGFuY2Uga2V5IGFib3ZlIGV4aXN0cywgZXhhY3RseSBPTkUgbW91bnRlZFxuICAgKiB2aXN1YWxpemVyIG1heSByZW5kZXIgdGhvc2Ugc2hhcmVkIG91dGxldHMg4oCUIG90aGVyd2lzZSBhIG1lc3NhZ2UgZnJvbSB0aGVcbiAgICogcm9vdCBzZXJ2aWNlIHdvdWxkIGJlIHNob3duIG9uY2UgcGVyIGxpdmUgdmlld2VyIChqaXQtdWkgcnVucyBhIG1haW4gdmlld1xuICAgKiBhbmQgYSBwaXBlbGluZS1wcmV2aWV3IGF0IHRoZSBzYW1lIHRpbWUpLiBUaGUgZmlyc3QgdG8gaW5pdCBjbGFpbXMgdGhlbSBhbmRcbiAgICogcmVsZWFzZXMgb24gZGVzdHJveSwgc28gdGhlIHN1cnZpdmluZyB2aWV3ZXIgcGlja3MgdGhlbSB1cC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxpdmVJbnN0YW5jZXMgPSBuZXcgU2V0PFZpc3VhbGl6ZXJDb21wb25lbnQ+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSB2aXpUb2FzdEtleSA9IFZJWl9UT0FTVF9LRVk7XG4gIHByb3RlY3RlZCByZWFkb25seSB2aXpBbGVydFRvYXN0S2V5ID0gVklaX0FMRVJUX1RPQVNUX0tFWTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpbnN0YW5jZSByZW5kZXJzIHRoZSBzaGFyZWQgb3V0bGV0cy4gVGhlIG93bmVyIGlzIHNpbXBseSB0aGVcbiAgICogb2xkZXN0IGxpdmUgdmlzdWFsaXplciDigJQgYSBgU2V0YCBpdGVyYXRlcyBpbiBpbnNlcnRpb24gb3JkZXIsIHNvIHdoZW4gdGhlXG4gICAqIG93bmVyIGlzIGRlc3Ryb3llZCB0aGUgbmV4dCBvbmUgdGFrZXMgb3ZlciBvbiBpdHMgZm9sbG93aW5nIGNoYW5nZS1kZXRlY3Rpb25cbiAgICogcGFzcy4gVHJhY2tpbmcgYSBzZXQgcmF0aGVyIHRoYW4gYSBzaW5nbGUgb3duZXIgbWF0dGVyczogd2l0aCBhIGxvbmVcbiAgICogYG93bmVyYCByZWZlcmVuY2UsIHRlYXJpbmcgZG93biB0aGUgb3duZXIgd2hpbGUgYSBzaWJsaW5nIHdhcyBhbHJlYWR5XG4gICAqIGluaXRpYWxpc2VkIHdvdWxkIGxlYXZlIG5vYm9keSByZW5kZXJpbmcgdGhlIG91dGxldHMsIGFuZCBldmVyeSBub3RpY2UgZnJvbVxuICAgKiB0aGUgcm9vdCBzZXJ2aWNlIHdvdWxkIHNpbGVudGx5IHZhbmlzaCBhZ2Fpbi5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgb3duc1NoYXJlZFRvYXN0cygpOiBib29sZWFuIHtcbiAgICBjb25zdCBvbGRlc3QgPSBWaXN1YWxpemVyQ29tcG9uZW50LmxpdmVJbnN0YW5jZXMudmFsdWVzKCkubmV4dCgpO1xuICAgIHJldHVybiAhb2xkZXN0LmRvbmUgJiYgb2xkZXN0LnZhbHVlID09PSB0aGlzO1xuICB9XG5cbiAgLyoqIEVhY2ggbmV3IGltYWdlOiB3aGV0aGVyIGl0IGlzIGEgei1zdGFjay4gKi9cbiAgQE91dHB1dCgpXG4gIGlzU3RhY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICAvKiogRWFjaCBuZXcgaW1hZ2U6IHdoZXRoZXIgaXQgaXMgc2luZ2xlLWNoYW5uZWwgKGdyYXlzY2FsZSkuICovXG4gIEBPdXRwdXQoKVxuICBpc0dyYXlzY2FsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG5cbiAgLyoqIFdoaWNoIHRvb2xiYXIgZ3JvdXBzIHRvIHNob3cuIEEgcGFydGlhbCBvdmVycmlkZSBtZXJnZXMgb3ZlciB0aGUgZnVsbCBzZXQsXG4gICAqICBzbyBgeyBzcGVjaWFsVG9vbHM6IGZhbHNlIH1gIGhpZGVzIG9ubHkgdGhhdCBncm91cC4gRGVmYXVsdHMgdG8gZXZlcnl0aGluZy4gKi9cbiAgQElucHV0KClcbiAgc2V0IHRvb2xiYXJUb29scyh2OiBUb29sYmFyVG9vbFZpc2liaWxpdHkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90b29sYmFyVG9vbHMgPSB7IC4uLkFMTF9UT09MQkFSX1RPT0xTLCAuLi4odiA/PyB7fSkgfTtcbiAgfVxuXG4gIGdldCB0b29sYmFyVG9vbHMoKTogUmVxdWlyZWQ8VG9vbGJhclRvb2xWaXNpYmlsaXR5PiB7XG4gICAgcmV0dXJuIHRoaXMuX3Rvb2xiYXJUb29scztcbiAgfVxuICBwcml2YXRlIF90b29sYmFyVG9vbHM6IFJlcXVpcmVkPFRvb2xiYXJUb29sVmlzaWJpbGl0eT4gPSBBTExfVE9PTEJBUl9UT09MUztcblxuICAvKiogRXhwb3NlIHRlc3Qtb25seSBwbG90IG1vZGVzIGluIHRoZSBzZWxlY3RvciAoZS5nLiB0aGUgbmFwYXJpIGBJbWFnZWBcbiAgICogIG1vZGUsIG90aGVyd2lzZSBoaWRkZW4pLiBUaGUgaG9zdCBhcHAgc2V0cyB0aGlzIGZyb20gYSBgP3Rlc3Q9MWAgVVJMXG4gICAqICB0b2dnbGUuIE9mZiBieSBkZWZhdWx0LCBzbyBwcm9kdWN0aW9uIHVzZXJzIG5ldmVyIHNlZSB0aGVtLiAqL1xuICBASW5wdXQoKVxuICB0ZXN0TW9kZSA9IGZhbHNlO1xuXG4gIC8qKiBJbWFnZS1zbW9vdGhpbmcgc3RhdGUgZm9yIHRoZSB0b29sYmFyJ3MgU21vb3RoZW4gdG9nZ2xlIChPU0Qgb25seSkuXG4gICAqICBEZWZhdWx0cyB0byBgZmFsc2VgIHNvIE9TRCBzaG93cyByYXcgcGl4ZWxzIChuZWFyZXN0LW5laWdoYm91cikuICovXG4gIHByb3RlY3RlZCBpbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgZmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBsb2FkZWRGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOKUgOKUgCBUaGUgbG9hZGluZyBvdmVybGF5LCBhcyBzaWduYWxzOiBpdCBpcyBmZWQgYnkgdGhlIGhvc3QncyBhbmQgdGhlIGJhY2tlbmRzJyBzdHJlYW1zXG4gIC8vIGFuZCBieSB0aGUgcmVuZGVyIHNlc3Npb24sIGFsbCBvZiB3aGljaCBsYW5kIG91dHNpZGUgdGhpcyB2aWV3J3MgdGVtcGxhdGUgZXZlbnRzLiDilIDilIBcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvYWRpbmdNZXNzYWdlID0gc2lnbmFsKCdMb2FkaW5nIGltYWdlLi4uJyk7XG4gIC8qKiBUaGUgaG9zdCBpcyBsb2FkaW5nIGF0IHpvb20gKHRoZSBvdmVybGF5IG1lc3NhZ2UgbW92ZXMgb3V0IG9mIHRoZSB3YXkpLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgem9vbSA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdGFja0xvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1nTG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBsb2FkaW5nUGVyY2VudGFnZSA9IHNpZ25hbCgwKTtcbiAgLy8gTm9uLW51bGwgKDAuLjEwMCkgd2hpbGUgaml0LXNlcnZpY2UgaXMgY29weWluZyB0aGUgc291cmNlIGZpbGUgaW50byB0aGVcbiAgLy8gbG9jYWwgY2FjaGUgUFZDIG9uIGZpcnN0IGNsaWNrLiBXaGVuIHNldCwgdGhlIGxvYWRpbmcgb3ZlcmxheSBzd2FwcyB0aGVcbiAgLy8gc3Bpbm5lciBmb3IgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgd2l0aCBhIFwiQ2FjaGluZyBpbWFnZVwiIG1lc3NhZ2UuXG4gIHByb3RlY3RlZCByZWFkb25seSBjYWNoZVByb2dyZXNzID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuICAvKiogQSBqaXQtc2VydmljZSBjYWNoZSBjb3B5IGlzIGFjdGl2ZWx5IGluIHByb2dyZXNzIChkZXRlcm1pbmF0ZSAwLi45OSkuIERyaXZlcyB0aGUgY2FjaGVcbiAgICogIHByb2dyZXNzIGJhciBpbmRlcGVuZGVudGx5IG9mIGBpbWdMb2FkaW5nYCBzbyB0aGUgYmFyIGNhbid0IGJlIGRyb3BwZWQg4oCUIG9yIG1hc2tlZCBieSB0aGVcbiAgICogIFwiU2hhcnBlbmluZyBwcmV2aWV3Li4uXCIgb3ZlcmxheSDigJQgbWlkLWRvd25sb2FkIGlmIHRoZSBsb2FkaW5nIGZsYWcgZmxpcHMgZWFybHkuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBpc0NhY2hpbmcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcCA9IHRoaXMuY2FjaGVQcm9ncmVzcygpO1xuICAgIHJldHVybiBwICE9PSBudWxsICYmIHAgPCAxMDA7XG4gIH0pO1xuXG4gIC8qKiBFbWl0cyBvbmNlIHdoZW4gdGhpcyB2aWV3IGlzIGRlc3Ryb3llZDsgdGhlIGNvbGxhYm9yYXRvcnMgZW5kIHRoZWlyIHN1YnNjcmlwdGlvbnMgb24gaXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveWVkJCA9IG5ldyBPYnNlcnZhYmxlPHZvaWQ+KChzdWJzY3JpYmVyKSA9PlxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSksXG4gICk7XG4gIC8qKiBIb3N0IGltYWdlLWluZm8gb2JqZWN0cyB3aG9zZSBvbmUtc2hvdCBgaW5pdGlhbFpJbmRleGAgd2FzIGFscmVhZHkgYXBwbGllZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdW1lZFNsaWNlSGludHMgPSBuZXcgV2Vha1NldDxJSW1hZ2VJbmZvPigpO1xuICBwcm90ZWN0ZWQgekluZGV4ID0gMDtcbiAgcHJvdGVjdGVkIG1heEluZGV4ID0gMDtcblxuICBAVmlld0NoaWxkKCdjbScpIGNvbnRleHRNZW51ITogQ29udGV4dE1lbnU7XG4gIHByb3RlY3RlZCBjb250ZXh0TWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgLyoqIFRoZSBhcm1lZCB0b29sIG1vZGUgYW5kIHRoZSB0b29sYmFyJ3MgdG9vbCBzZXR0aW5ncy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvb2xzID0gbmV3IFRvb2xNb2RlcyhcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLFxuICAgIHRoaXMuc2Vzc2lvbixcbiAgICB0aGlzLm5nWm9uZSxcbiAgICAobW9kZSkgPT4ge1xuICAgICAgaWYgKG1vZGUgIT09ICdzYW1Qb2ludCcpIHRoaXMuc2VnbWVudGF0aW9uLmhpZGUoKTtcbiAgICB9LCAvLyBsZWF2aW5nIHBvaW50IG1vZGUgZHJvcHMgaXRzIHRvYXN0XG4gICAgKCkgPT4gdGhpcy5jaGFuZ2VkKCksXG4gICk7XG4gIHByb3RlY3RlZCBnZXQgYWN0aXZlRHJhZ01vZGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHMuYWN0aXZlO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgYWN0aXZlRHJhZ01vZGUobW9kZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMudG9vbHMuYWN0aXZlID0gbW9kZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHdhbmRTZW5zaXRpdml0eSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRvb2xzLndhbmRTZW5zaXRpdml0eTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0IHdhbmRTZW5zaXRpdml0eSh2OiBudW1iZXIpIHtcbiAgICB0aGlzLnRvb2xzLndhbmRTZW5zaXRpdml0eSA9IHY7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBicnVzaFNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50b29scy5icnVzaFNpemU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB2ZXJ0ZXhFcmFzZXJSYWRpdXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50b29scy52ZXJ0ZXhFcmFzZXJSYWRpdXM7XG4gIH1cbiAgcHJvdGVjdGVkIHNldCB2ZXJ0ZXhFcmFzZXJSYWRpdXModjogbnVtYmVyKSB7XG4gICAgdGhpcy50b29scy52ZXJ0ZXhFcmFzZXJSYWRpdXMgPSB2O1xuICB9XG5cbiAgLyoqIFJlZ2lvbiBzZXQtb3BlcmF0aW9ucyBvbiB0aGUgc2VsZWN0aW9uLCBhbmQgdGhlIHN0b3JlIG1pcnJvcnMgdGhleSByZWFkIChqaXQtdWkjODUpLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVnaW9uQWN0aW9ucyA9IG5ldyBSZWdpb25BY3Rpb25zKFxuICAgIHRoaXMucGxvdFNlcnZpY2UsXG4gICAgdGhpcy5yZWdpb25PcHMsXG4gICAgKCkgPT4gdGhpcy5pbWFnZUluZm8/LnRydWVJbWFnZVNpemUsXG4gICAgKG0pID0+IHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiB0aGlzLnJlc3VsdFRvYXN0S2V5LCAuLi5tIH0pLFxuICApO1xuICAvKiogQ3VzdG9tLXRocmVzaG9sZCBTaW1wbGlmeSBkaWFsb2cgdmlzaWJpbGl0eSAoc2VlIHtAbGluayBSZWdpb25BY3Rpb25zfSkuICovXG4gIHByb3RlY3RlZCBnZXQgZGlzcGxheVNpbXBsaWZ5RGlhbG9nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkFjdGlvbnMuZGlzcGxheVNpbXBsaWZ5RGlhbG9nO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgZGlzcGxheVNpbXBsaWZ5RGlhbG9nKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlZ2lvbkFjdGlvbnMuZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gdjtcbiAgfVxuXG4gIC8qKiBTQU0gbW9kZWwgcGlja2VyIG9wdGlvbnMgKyBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzkwIFAxKS4gT25seSBtb2RlbHNcbiAgICogIHdpdGggYSBob3N0ZWQgT05OWCBwYWlyIChjb25maWd1cmVkIHZpYSBzZXRTYW1Nb2RlbFVybHMgYXQgYXBwIGluaXQpIGFyZVxuICAgKiAgb2ZmZXJlZCwgc28gdGhlIHBpY2tlciBjYW4ndCBzZWxlY3QgYSBtb2RlbCB0aGF0IGNhbid0IHJ1bi4gKi9cbiAgcHJvdGVjdGVkIHNhbU1vZGVscyA9IFNBTV9NT0RFTFMuZmlsdGVyKGlzU2FtTW9kZWxSZWFkeSkubWFwKChtKSA9PiAoeyBpZDogbS5pZCwgbGFiZWw6IG0ubGFiZWwgfSkpO1xuICBwcm90ZWN0ZWQgc2FtTW9kZWxJZCA9IGdldERlZmF1bHRTYW1Nb2RlbElkKCk7XG5cbiAgLyoqXG4gICAqIE5vLXByb21wdCB0b29scyByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIFRPT0xCQVJfVE9PTFN9LCBmaWx0ZXJlZCB0byB0aG9zZVxuICAgKiB3aXRoIGNvbmZpZ3VyZWQgbW9kZWxzIGFuZCBzb3J0ZWQuIFRoaXMgbGlicmFyeSByZWdpc3RlcnMgbm9uZSDigJQgYSBob3N0XG4gICAqIHN1cHBsaWVzIHRoZW0g4oCUIHNvIGFuIG9wZW4gYnVpbGQgaGFzIGFuIGVtcHR5IGFycmF5IGhlcmUgYW5kIHRoZSB0b29sYmFyXG4gICAqIGFuZCBoZWxwIGRpYWxvZyBzaW1wbHkgb21pdCB0aGF0IGdyb3VwLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnRyaWJ1dGVkVG9vbHM6IFRvb2xiYXJUb29sQ29udHJpYnV0aW9uW10gPSBbXTtcbiAgLyoqIENoZWNrcG9pbnRzIGFuZCBwYXJhbWV0ZXIgdmFsdWVzIG9mIHtAbGluayBjb250cmlidXRlZFRvb2xzfSwgYW5kIHRoZWlyIGRpYWxvZy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvb2xQYXJhbXM6IFRvb2xQYXJhbXNNb2RlbDtcbiAgLyoqIENvbnRyaWJ1dGVkIHBsb3QgbW9kZXMgYW5kIGRpYWxvZyB0b29scywgYW5kIHRoZWlyIGxpdmUgc2Vzc2lvbnMuICovXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dGlvbnM6IENvbnRyaWJ1dGlvbkhvc3Q7XG4gIC8qKiBEaWFsb2cgdG9vbHMgcmVnaXN0ZXJlZCB0aHJvdWdoIHtAbGluayBUT09MQkFSX1RPT0xTfSAoYGtpbmQ6ICdkaWFsb2cnYCkuICovXG4gIHByb3RlY3RlZCBnZXQgZGlhbG9nVG9vbHMoKTogVG9vbGJhckRpYWxvZ1Rvb2xDb250cmlidXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJpYnV0aW9ucy5kaWFsb2dUb29scztcbiAgfVxuICAvKiogVGhlIGRpYWxvZyB0b29sIHRoZSB1c2VyIGhhcyBvcGVuIChpdHMgc2Vzc2lvbiBtYXkgYmUgYmV0d2VlbiByZW5kZXJzKS4gKi9cbiAgcHJvdGVjdGVkIGdldCBvcGVuRGlhbG9nVG9vbElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRyaWJ1dGlvbnMub3BlbkRpYWxvZ1Rvb2xJZDtcbiAgfVxuICAvKiogVGhlIG9wZW4gZGlhbG9nIHRvb2wncyBsaXZlIGRpYWxvZywgYXMgdGhlIHRlbXBsYXRlIHJlbmRlcnMgaXQuICovXG4gIHByb3RlY3RlZCBnZXQgdG9vbERpYWxvZygpOiBUb29sRGlhbG9nVmlldyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRyaWJ1dGlvbnMudG9vbERpYWxvZztcbiAgfVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2FtVG9hc3RLZXkgPSBgc2FtLSR7VmlzdWFsaXplckNvbXBvbmVudC5uZXh0VG9hc3RJZCsrfWA7XG4gIC8qKlxuICAgKiBPdXRsZXQgZm9yIHRoZSBsaWJyYXJ5J3Mgb3duIHJlc3VsdC9lcnJvciBub3RpY2VzLCBrZXllZCB0byB0aGlzIGluc3RhbmNlIHNvIHRoZXlcbiAgICogZG8gbm90IGRlcGVuZCBvbiB0aGUgaG9zdCBtb3VudGluZyBhIGtleWxlc3MgYDxwLXRvYXN0PmAgKG1vc3QgaG9zdHMgZG9uJ3QsIGFuZCBhXG4gICAqIGZhaWxlZCBzZWdtZW50YXRpb24gdGhlbiBsb29rZWQgbGlrZSBhIGRlYWQgYnV0dG9uKS4gRGVsaWJlcmF0ZWx5IE5PVCB0aGUgc3RpY2t5XG4gICAqIHRvYXN0J3Mga2V5OiB0aGF0IGlzIGNsZWFyZWQgd2hlbiBhIHJ1biBzZXR0bGVzLCB3aGljaCB3b3VsZCB3aXBlIHRoZSByZXN1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzdWx0VG9hc3RLZXkgPSBgJHt0aGlzLnNhbVRvYXN0S2V5fS1yZXN1bHRgO1xuICAvKiogU2VnbWVudGF0aW9uIHJ1bnMgYW5kIHRoZWlyIHN0aWNreSBwcm9ncmVzcyB0b2FzdC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlZ21lbnRhdGlvbiA9IG5ldyBTZWdtZW50YXRpb25SdW5uZXIoXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZSxcbiAgICB0aGlzLnNhbVRvYXN0S2V5LFxuICAgIHRoaXMucmVzdWx0VG9hc3RLZXksXG4gICAgKCkgPT4gdGhpcy5jaGFuZ2VkKCksXG4gICk7XG5cbiAgLyoqIENoYW5uZWxzICYgSGlzdG9ncmFtIGRpYWxvZyB2aXNpYmlsaXR5IChvcGVuZWQgZnJvbSB0aGUgdG9vbGJhcikuICovXG4gIHByb3RlY3RlZCBzaG93Q2hhbm5lbEhpc3RvZ3JhbSA9IGZhbHNlO1xuICAvKiogU3BhdGlhbC1vbWljcyBjb250cm9scyBkaWFsb2cgdmlzaWJpbGl0eSAodG9vbGJhciBidXR0b24pLiAqL1xuICBwcm90ZWN0ZWQgc2hvd1NwYXRpYWxDb250cm9scyA9IGZhbHNlO1xuICAvKiogUmVnaW9uIEVkaXRvciBkaWFsb2cgdmlzaWJpbGl0eSAob3BlbmVkIGZyb20gdGhlIHRvb2xiYXIpLiAqL1xuICBwcm90ZWN0ZWQgc2hvd1JlZ2lvbkVkaXRvciA9IGZhbHNlO1xuICAvKiogUmVnaW9uIEVkaXRvciBkaWFsb2cgd2lkdGguIE9uIG9wZW4gaXQgaXMgc2V0IHRvIHRoZSBjb25maWd1cmVkIGhvc3RcbiAgICogIGVsZW1lbnQncyBjdXJyZW50IHdpZHRoLCBvciDigJQgd2hlbiBubyBzZWxlY3RvciBpcyBjb25maWd1cmVkIC8gdGhlIGVsZW1lbnRcbiAgICogIGlzbid0IGZvdW5kIOKAlCB0byBhIHF1YXJ0ZXIgb2YgdGhlIHBhZ2UgKHNlZSBvcGVuUmVnaW9uRWRpdG9yKS4gKi9cbiAgcHJvdGVjdGVkIHJlZ2lvbkVkaXRvcldpZHRoID0gJzI1dncnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxvdERpdk5hbWUgPSBgdml6LXBsb3QtJHtwbG90SW5zdGFuY2VTZXErK31gO1xuICAvKiogVGhlIHJlbmRlciBwaXBlbGluZTogdGhlIG5ld2VzdCBpbWFnZSAob3IgaW1hZ2UtbGVzcyBkYXRhc2V0KSBhbHdheXMgd2lucy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlbmRlcjogSW1hZ2VSZW5kZXJTZXNzaW9uID0gbmV3IEltYWdlUmVuZGVyU2Vzc2lvbih7XG4gICAgcGxvdERpdk5hbWU6IHRoaXMucGxvdERpdk5hbWUsXG4gICAgdmlzdWFsaXplcjogdGhpcy5wbG90U2VydmljZSxcbiAgICB6SW5kZXg6ICgpID0+IHRoaXMuekluZGV4LFxuICAgIHBsb3RUeXBlOiAoKSA9PiB0aGlzLnBsb3RUeXBlLFxuICAgIGlzSGVhdG1hcDogKCkgPT4gdGhpcy5pc0hlYXRtYXAsXG4gICAgaXNDYWNoaW5nOiAoKSA9PiB0aGlzLmlzQ2FjaGluZygpLFxuICAgIGJlZm9yZVJlc2V0OiAoKSA9PiB0aGlzLmNvbnRyaWJ1dGlvbnMuZW5kU2Vzc2lvbnMoKSxcbiAgICBwcmVwYXJlOiAoaW5mbykgPT4gdGhpcy5sYXlPdXRTbGljZXMoaW5mbyksXG4gICAgcmVsZWFzZU92ZXJsYXk6IChpbmZvKSA9PiB7XG4gICAgICBpZiAoaW5mby5pc1N0YWNrICYmIGluZm8uc2hvd1N0YWNrKSB0aGlzLnN0YWNrTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgIH0sXG4gICAgbGFuZGVkOiAoaW5mbykgPT4ge1xuICAgICAgLy8gVGhlIGhvc3QncyBIdHRwQ2xpZW50IGNhcnJpZXMgYSBzZXJ2ZXItc2lkZSByZWdpb24gc291cmNlJ3MgcmVxdWVzdHM6IGl0cyBpbnRlcmNlcHRvcnMgKGF1dGgpIGFwcGx5LlxuICAgICAgY29uc3QgaHR0cCA9IHRoaXMuaW5qZWN0b3I/LmdldChIdHRwQ2xpZW50LCBudWxsKSA/PyB1bmRlZmluZWQ7XG4gICAgICBhcHBseUltYWdlUm9pcyhpbmZvLCB0aGlzLnBsb3RTZXJ2aWNlLCB0aGlzLnpJbmRleCwgdGhpcy52aXpDb25maWc/LnJlZ2lvblNvdXJjZU1pbkNoYXJzLCBodHRwKTtcbiAgICAgIHRoaXMuY29udHJpYnV0aW9ucy5hY3RpdmF0ZSgpO1xuICAgIH0sXG4gICAgc2V0SW1hZ2VMb2FkaW5nOiAobG9hZGluZykgPT4gdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcobG9hZGluZyksXG4gICAgYWxlcnQ6IChzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKSA9PlxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IHRoaXMudml6QWxlcnRUb2FzdEtleSwgc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCB9KSxcbiAgICBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCksXG4gIH0pO1xuICBwbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICBwcm90ZWN0ZWQgaXNIZWF0bWFwID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgLyoqIFdoZXRoZXIgdGhlIG5hcGFyaSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyBpcyBzaG93biAodm9sdW1lL2lzb3N1cmZhY2UpLiAqL1xuICBwcm90ZWN0ZWQgYXhlc1Zpc2libGUgPSB0cnVlO1xuICBwcm90ZWN0ZWQgd2lyZWZyYW1lQWN0aXZlID0gZmFsc2U7XG4gIC8qKiBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yICgxID0gRnVsbCDigKYgOCA9IOKFmzsgZGVmYXVsdCDCvSk7IGNoYW5naW5nIGl0IHJlLXBsb3RzLiAqL1xuICBwcm90ZWN0ZWQgcmVzb2x1dGlvblNjYWxlID0gTkFQQVJJX0RFRkFVTFRfREVDSU1BVEU7XG5cbiAgLyoqIFRoZSBzZWxlY3RvcidzIGVudHJpZXM6IHRoZSBidWlsdC1pbiBwbG90IHR5cGVzIHRoZSBhY3RpdmUgYmFja2VuZFxuICAgKiAgYWR2ZXJ0aXNlcyAoM0QgZ2F0ZWQgYnkgY2FwYWJpbGl0eSksIHRoZW4gYW55IGNvbnRyaWJ1dGVkIG1vZGVzXG4gICAqICAoe0BsaW5rIFBMT1RfVFlQRV9DT05UUklCVVRJT05TfSkuICovXG4gIHByb3RlY3RlZCBwbG90VHlwZU1lbnU6IFBsb3RUeXBlT3B0aW9uW10gPSBbXTtcbiAgLyoqXG4gICAqIFRoZSBidWlsdC1pbiBwbG90IHR5cGVzIG9uIG9mZmVyIOKAlCB7QGxpbmsgcGxvdFR5cGVNZW51fSB3aXRob3V0IGNvbnRyaWJ1dGVkXG4gICAqIG1vZGVzLiBLZXB0IHdpdGggaXRzIG9yaWdpbmFsIHR5cGUgc28gZXhpc3RpbmcgcmVhZGVycyBhcmUgdW5hZmZlY3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCBwbG90VHlwZU9wdGlvbnM6IFBsb3RUeXBlRGVzY3JpcHRvcltdID0gW107XG4gIC8qKlxuICAgKiBXaGF0IHRoZSBzZWxlY3RvciBzaG93czogYSBidWlsdC1pbiB0eXBlIG9yIGEgY29udHJpYnV0ZWQgbW9kZSdzIGlkLiBFdmVyeVxuICAgKiByZW5kZXJpbmcgYW5kIHRvb2wgZGVjaXNpb24gZ29lcyB0aHJvdWdoIHtAbGluayBiYXNlUGxvdFR5cGV9IGluc3RlYWQsIHNvIGFcbiAgICogY29udHJpYnV0ZWQgbW9kZSBiZWhhdmVzIGV4YWN0bHkgbGlrZSB0aGUgYnVpbHQtaW4gdHlwZSBpdCByaWRlcyBvbi5cbiAgICovXG4gIHByb3RlY3RlZCBzZWxlY3RlZFBsb3RUeXBlSWQ6IFBsb3RUeXBlSWQgPSBQbG90VHlwZS5JTUFHRTtcblxuICAvKipcbiAgICogVGhlIGJ1aWx0LWluIHBsb3QgdHlwZSBiZWluZyByZW5kZXJlZC4gV2l0aCBubyBjb250cmlidXRlZCBtb2RlIGFjdGl2ZSB0aGlzXG4gICAqIGlzIHRoZSBzZWxlY3Rpb24gaXRzZWxmOyBkdXJpbmcgb25lIGl0IGlzIHRoZSBtb2RlJ3MgYGJhc2VUeXBlYC4gS2VwdCB3aXRoIGl0c1xuICAgKiBvcmlnaW5hbCBgUGxvdFR5cGVgIHR5cGUgZm9yIGV4aXN0aW5nIHJlYWRlcnMg4oCUIHVzZSB7QGxpbmsgc2VsZWN0ZWRQbG90VHlwZUlkfVxuICAgKiBmb3IgdGhlIHNlbGVjdG9yJ3MgaWQuIEFzc2lnbmluZyBzZWxlY3RzIHRoYXQgYnVpbHQtaW4gdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc2VsZWN0ZWRQbG90VHlwZSgpOiBQbG90VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVBsb3RUeXBlO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgc2VsZWN0ZWRQbG90VHlwZSh0eXBlOiBQbG90VHlwZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZUlkID0gdHlwZTtcbiAgfVxuXG4gIC8qKiBDb250cmlidXRlZCBwbG90IG1vZGVzIGFuZCB0aGVpciBzaW5nbGUgbGl2ZSBzZXNzaW9uLiAqL1xuICBnZXQgcGxvdE1vZGVzKCk6IFBsb3RNb2RlQ29udHJvbGxlciB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJpYnV0aW9ucy5wbG90TW9kZXM7XG4gIH1cbiAgLyoqIFRoZSBsaXZlIGNvbnRyaWJ1dGVkIG1vZGUncyBzaWRlIHBhbmVsOyBudWxsIHdoaWxlIG5vIGNvbnRyaWJ1dGVkIHNlc3Npb24gaXMgbGl2ZS4gKi9cbiAgcHJvdGVjdGVkIGdldCBwbG90TW9kZVBhbmVsKCk6IFBsb3RNb2RlUGFuZWxWaWV3IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJpYnV0aW9ucy5wbG90TW9kZVBhbmVsO1xuICB9XG5cbiAgLyoqIFdoZXJlIGEgYG1vdW50YCBwYW5lbCdzIGhvc3QgZWxlbWVudCBpcyBhdHRhY2hlZCBvbmNlIHRoZSBkaWFsb2cgcmVuZGVycy4gKi9cbiAgQFZpZXdDaGlsZCgncGxvdE1vZGVQYW5lbFNsb3QnKVxuICBzZXQgcGxvdE1vZGVQYW5lbFNsb3QocmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY29udHJpYnV0aW9ucy5hdHRhY2hQYW5lbFNsb3QocmVmPy5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIC8qKiBUaGUgYnVpbHQtaW4gdHlwZSBhY3R1YWxseSByZW5kZXJlZCBmb3Ige0BsaW5rIHNlbGVjdGVkUGxvdFR5cGVJZH06IGl0c2VsZlxuICAgKiAgZm9yIGEgYnVpbHQtaW4gdHlwZSwgYGJhc2VUeXBlYCBmb3IgYSBjb250cmlidXRlZCBtb2RlLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGJhc2VQbG90VHlwZSgpOiBQbG90VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGxvdE1vZGVzLmJhc2VUeXBlT2YodGhpcy5zZWxlY3RlZFBsb3RUeXBlSWQpO1xuICB9XG5cbiAgLyoqIERpdiB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgaXMgY2hhcnRlZCBpbnRvLiBQZXIgaW5zdGFuY2UsIGxpa2VcbiAgICogIHtAbGluayBwbG90RGl2TmFtZX06IHRoZSBiYWNrZW5kIHJlc29sdmVzIGl0IGJ5IGlkLCBzbyBhIGZpeGVkIGlkIG1hZGUgdHdvIGxpdmVcbiAgICogIHZpZXdlcnMgZHJhdyBib3RoIGluc2V0cyBpbnRvIHdoaWNoZXZlciBkaXYgY2FtZSBmaXJzdCBpbiB0aGUgZG9jdW1lbnQuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBpbnRlbnNpdHlJbnNldERpdiA9IGAke3RoaXMucGxvdERpdk5hbWV9LWluc2V0YDtcblxuICAvKiogVG9vbGJhciBkb2NraW5nOiBkb2NrZWQgYWNyb3NzIHRoZSB0b3AgYnkgZGVmYXVsdDsgZHJhZ2dpbmcgaXRzIGhhbmRsZVxuICAgKiAgZGV0YWNoZXMgaXQgaW50byBhIGZsb2F0aW5nLCBtb3ZhYmxlIHdpbmRvdyAoZnJlZXMgdGhlIHRvcCByb3cgZm9yIHRoZVxuICAgKiAgdmlzdWFsaXphdGlvbikuICovXG4gIHByb3RlY3RlZCB0b29sYmFyRmxvYXRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHRvb2xiYXJQb3MgPSB7IHg6IDgsIHk6IDggfTtcbiAgLyoqIFdoZXJlIGEgdG9vbGJhci1oYW5kbGUgZHJhZyBzdGFydHMgZnJvbTogZ3JhYmJpbmcgdGhlIGRvY2tlZCB0b29sYmFyIGZsb2F0cyBpdC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvb2xiYXJEcmFnT3JpZ2luID0gKCk6IEZsb2F0aW5nUG9zID0+IHtcbiAgICBpZiAoIXRoaXMudG9vbGJhckZsb2F0aW5nKSB7XG4gICAgICB0aGlzLnRvb2xiYXJGbG9hdGluZyA9IHRydWU7XG4gICAgICB0aGlzLnRvb2xiYXJQb3MgPSB7IHg6IDgsIHk6IDggfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9vbGJhclBvcztcbiAgfTtcbiAgLyoqIFRoZSBmbG9hdGluZyBpbnRlbnNpdHktcHJvZmlsZSBpbnNldCAoYWx3YXlzIG1vdW50ZWQ7IHNob3dzIGl0c2VsZiB3aGlsZSBsaW5lcyBleGlzdCkuICovXG4gIEBWaWV3Q2hpbGQoSW50ZW5zaXR5SW5zZXRDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIGluc2V0PzogSW50ZW5zaXR5SW5zZXRDb21wb25lbnQ7XG5cbiAgLyoqIFRydWUgd2hpbGUgdGhlIDNEIHNwYXRpYWwgY2xvdWQgaXMgdGhlIGFjdGl2ZSBtb2RlLiBUaGUgY29udHJvbHMgZHJvcCB0aGUgUk9JXG4gICAqICBzZWxlY3Rpb24gdGhlcmU6IHJlZ2lvbiB0b29scyBhcmUgc2NyZWVuLXNwYWNlLCBhbmQgYWdhaW5zdCBhbiBvcmJpdGluZ1xuICAgKiAgY2FtZXJhIGEgZHJhd24gcmVjdGFuZ2xlIGhhcyBubyBmaXhlZCBtZWFuaW5nIGluIHRoZSBkYXRhLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzU3BhdGlhbDNkTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNTcGF0aWFsT21pY3MzZCh0aGlzLmJhc2VQbG90VHlwZSk7XG4gIH1cblxuICAvKiogVHJ1ZSBpbiBhIG5hcGFyaSB2b2x1bWUgb3IgaXNvc3VyZmFjZSB2aWV3LCB3aGVyZSB0aGUgUmVnaW9uIEVkaXRvciBzaG93cyByZWdpb25zIGluIDNELiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzVm9sdW1lVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOYXBhcmlWb2x1bWUodGhpcy5iYXNlUGxvdFR5cGUpIHx8IGlzTmFwYXJpSXNvc3VyZmFjZSh0aGlzLmJhc2VQbG90VHlwZSk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgdXNlciBzcGxpdCB0aGUgdm9sdW1lIHZpZXcgd2l0aCB0aGUgc2xpY2UgZWRpdG9yIChvZmYgYnkgZGVmYXVsdDsga2VwdCB3aGlsZVxuICAgKiAgdGhlIHZpZXcgc2hvd3Mgb3RoZXIgcGxvdCB0eXBlcywgc28gYSB2b2x1bWUgdmlldyBvcGVucyBzcGxpdCBhZ2FpbikuICovXG4gIHByb3RlY3RlZCBzbGljZUVkaXRvciA9IGZhbHNlO1xuICAvKiogVGhlIHNsaWNlIGVkaXRvcidzIHBhbmU6IHRoZSBkaXNwbGF5ZWQgc2xpY2UsIHdpdGggZXZlcnkgcmVnaW9uIHRvb2wsIHRvcCByaWdodC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNsaWNlRGl2TmFtZSA9IGAke3RoaXMucGxvdERpdk5hbWV9LXNsaWNlYDtcbiAgLyoqIFRoZSBsZWZ0IGNvbHVtbidzIGFuZCB0aGUgdG9wIHJvdydzIHNoYXJlcyBvZiB0aGUgc2xpY2UgZWRpdG9yICglKS4gKi9cbiAgcHJvdGVjdGVkIHNwbGl0WCA9IDUwO1xuICBwcm90ZWN0ZWQgc3BsaXRZID0gNTA7XG4gIC8qKiBUaGUgc2VjdGlvbnMgdGhyb3VnaCB4IGFuZCB5IHNob3duIGJlbG93IChudWxscyB1bnRpbCB0aGUgdm9sdW1lIGlzIGN1dCkuICovXG4gIHByb3RlY3RlZCBzZWN0aW9uczogU2VjdGlvblZpZXdzID0geyB4OiBudWxsLCB5OiBudWxsIH07XG4gIHByb3RlY3RlZCBnZXQgc2xpY2VFZGl0b3JTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZUVkaXRvciAmJiB0aGlzLmlzVm9sdW1lVmlldztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGUgdm9sdW1lIHZpZXcgd2l0aCB0aGUgc2xpY2UgZWRpdG9yLCBvciBjbG9zZSBpdC4gVGhlIGVkaXRvciBvcGVucyBvbiB0aGUgZGlzcGxheWVkXG4gICAqIHNsaWNlIGFuZCB0YWtlcyB0aGUgZHJhd2luZyB0b29sczsgY2xvc2luZyBpdCBsZWF2ZXMgdGhlIHNlbGVjdGlvbiB0b29sIGFybWVkIChpdCBwaWNrcyB0aGVcbiAgICogc3VyZmFjZXMgaW4gM0QpIGFuZCBkaXNhcm1zIGFueSBvdGhlci5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0b2dnbGVTbGljZUVkaXRvcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNsaWNlRWRpdG9yID0gIXRoaXMuc2xpY2VFZGl0b3I7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyB0aGUgcGFuZSdzIGRpdiwgYmVmb3JlIHRoZSBiYWNrZW5kIGxvb2tzIGl0IHVwXG4gICAgdGhpcy5wbG90U2VydmljZS5yZWxheW91dCgpOyAvLyB0aGUgM0QgdmlldyBpcyBhIHF1YXJ0ZXIgb2YgdGhlIGFyZWEgbm93LCBvciBhbGwgb2YgaXQgYWdhaW5cbiAgICBpZiAoIXRoaXMuc2xpY2VFZGl0b3IpIHtcbiAgICAgIGF3YWl0IHRoaXMucGxvdFNlcnZpY2Uuc2V0U2xpY2VFZGl0b3I/LihudWxsKTtcbiAgICAgIGlmICh0aGlzLnRvb2xzLmFjdGl2ZSAhPT0gbnVsbCAmJiB0aGlzLnRvb2xzLmFjdGl2ZSAhPT0gJ3NlbGVjdCcpIHRoaXMudG9vbHMuYXBwbHkobnVsbCk7XG4gICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIHJlZ2lvbnMgZWRpdGVkIGFyZSB0aGUgZGlzcGxheWVkIHNsaWNlJ3MuXG4gICAgdGhpcy5wbG90U2VydmljZS5zZXREaXNwbGF5U2xpY2UodGhpcy56SW5kZXgpO1xuICAgIGNvbnN0IHNob3duID0gYXdhaXQgdGhpcy5wbG90U2VydmljZS5zZXRTbGljZUVkaXRvcj8uKHRoaXMuc2xpY2VEaXZOYW1lKTtcbiAgICAvLyBUaGUgYXJtZWQgdG9vbCBub3cgYWN0cyBpbiB0aGUgcGFuZS5cbiAgICBpZiAoc2hvd24gJiYgdGhpcy50b29scy5hY3RpdmUgIT09IG51bGwpIHRoaXMudG9vbHMuYXBwbHkodGhpcy50b29scy5hY3RpdmUpO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIEEgcG9pbnQgcGlja2VkIGluIGEgc2VjdGlvbjogdGhlIHNsaWNlIGFuZCB0aGUgb3RoZXIgc2VjdGlvbidzIHBsYW5lIG1vdmUgdGhlcmUuICovXG4gIHByb3RlY3RlZCBvblNlY3Rpb25QaWNrKGF4aXM6IFNlY3Rpb25BeGlzLCBhdDogeyB1OiBudW1iZXI7IHY6IG51bWJlciB9KTogdm9pZCB7XG4gICAgLy8gVGhyb3VnaCB4LCBhY3Jvc3MgaXMgdGhlIHNsaWNlIGFuZCBkb3duIGlzIHk7IHRocm91Z2ggeSwgYWNyb3NzIGlzIHggYW5kIGRvd24gdGhlIHNsaWNlLlxuICAgIGNvbnN0IHNsaWNlID0gTWF0aC5mbG9vcihheGlzID09PSAneCcgPyBhdC51IDogYXQudik7XG4gICAgaWYgKGF4aXMgPT09ICd4JykgdGhpcy5wbG90U2VydmljZS5zZXRTZWN0aW9uUGxhbmU/LigneScsIGF0LnYpO1xuICAgIGVsc2UgdGhpcy5wbG90U2VydmljZS5zZXRTZWN0aW9uUGxhbmU/LigneCcsIGF0LnUpO1xuICAgIHRoaXMub25aU2xpZGUoTWF0aC5taW4odGhpcy5tYXhJbmRleCwgTWF0aC5tYXgoMCwgc2xpY2UpKSk7XG4gIH1cblxuICAvKiogRHJhZyBhIGRpdmlkZXIgb2YgdGhlIHNsaWNlIGVkaXRvcjogdGhlIHZlcnRpY2FsIG9uZSBzZXRzIHRoZSBjb2x1bW5zLCB0aGUgaG9yaXpvbnRhbCBvbmUgdGhlIHJvd3MuICovXG4gIHByb3RlY3RlZCBzdGFydFBhbmVSZXNpemUoZXZlbnQ6IFBvaW50ZXJFdmVudCwgYXhpczogJ3gnIHwgJ3knKTogdm9pZCB7XG4gICAgY29uc3QgZGl2aWRlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgcGFuZXMgPSBkaXZpZGVyLnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFwYW5lcykgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZGl2aWRlci5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIGNvbnN0IG1vdmUgPSAoZTogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBib3ggPSBwYW5lcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChheGlzID09PSAneCcgJiYgYm94LndpZHRoID4gMCkgdGhpcy5zZXRTcGxpdCgneCcsICgoZS5jbGllbnRYIC0gYm94LmxlZnQpIC8gYm94LndpZHRoKSAqIDEwMCk7XG4gICAgICBpZiAoYXhpcyA9PT0gJ3knICYmIGJveC5oZWlnaHQgPiAwKSB0aGlzLnNldFNwbGl0KCd5JywgKChlLmNsaWVudFkgLSBib3gudG9wKSAvIGJveC5oZWlnaHQpICogMTAwKTtcbiAgICB9O1xuICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICAgIGRpdmlkZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgIGRpdmlkZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgIGRpdmlkZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgfTtcbiAgICBkaXZpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgZGl2aWRlci5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xuICAgIGRpdmlkZXIuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gIH1cblxuICAvKiogQSBkaXZpZGVyJ3Mga2V5Ym9hcmQ6IOKGkCDihpIgbW92ZSB0aGUgdmVydGljYWwgb25lLCDihpEg4oaTIHRoZSBob3Jpem9udGFsIG9uZSwgYnkgNSUuICovXG4gIHByb3RlY3RlZCBudWRnZVBhbmVTaXplKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBheGlzOiAneCcgfCAneScpOiB2b2lkIHtcbiAgICBjb25zdCBrZXlzID0gYXhpcyA9PT0gJ3gnID8gWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCddIDogWydBcnJvd1VwJywgJ0Fycm93RG93biddO1xuICAgIGNvbnN0IHN0ZXAgPSBldmVudC5rZXkgPT09IGtleXNbMF0gPyAtNSA6IGV2ZW50LmtleSA9PT0ga2V5c1sxXSA/IDUgOiAwO1xuICAgIGlmICghc3RlcCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIG5vdCBhIHNsaWNlIHN0ZXBcbiAgICB0aGlzLnNldFNwbGl0KGF4aXMsIChheGlzID09PSAneCcgPyB0aGlzLnNwbGl0WCA6IHRoaXMuc3BsaXRZKSArIHN0ZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTcGxpdChheGlzOiAneCcgfCAneScsIHBlcmNlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gTWF0aC5yb3VuZChNYXRoLm1pbig4MCwgTWF0aC5tYXgoMjAsIHBlcmNlbnQpKSk7XG4gICAgaWYgKGF4aXMgPT09ICd4JykgdGhpcy5zcGxpdFggPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuc3BsaXRZID0gdmFsdWU7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgLy8gVGhlIDNEIHZpZXcgZm9sbG93cyBpdHMgY2VsbCBvbmNlIHRoZSBncmlkIGhhcyBpdHMgbmV3IHRyYWNrcy5cbiAgICBpZiAodGhpcy5yZWxheW91dEZyYW1lID09PSBudWxsICYmIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnJlbGF5b3V0RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbGF5b3V0RnJhbWUgPSBudWxsO1xuICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbGF5b3V0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZWxheW91dEZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogVHJ1ZSBmb3IgdGhlIEltYWdlIHBsb3QgdHlwZSwgd2hpY2ggcmVuZGVycyBhcyBhIG5hdGl2ZWx5IHBhbi96b29tLWFibGVcbiAgICogIHJhc3RlciDigJQgc28gdGhlIGJhY2tlbmQtYWdub3N0aWMgem9vbS9wYW4gdG9vbGJhciB0b29scyBhcmUgaGlkZGVuLiBUaGVcbiAgICogIGNvbXBvbmVudCBkcml2ZXMgdGhpcyBvZmYgdGhlIHBsb3QgdHlwZSwgbm90IHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgcHJvdGVjdGVkIGdldCBpc0ltYWdlVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlUGxvdFR5cGUgPT09IFBsb3RUeXBlLklNQUdFO1xuICB9XG5cbiAgLyoqIElzb3N1cmZhY2UgYmFuZCBhcyBhIDDigJMyNTUgc2xpZGVyIHBvc2l0aW9uLCBtYXBwZWQgb250byB0aGUgdm9sdW1lJ3MgcmVhbFxuICAgKiAgaW50ZW5zaXR5IHJhbmdlIGJ5IHRoZSByZW5kZXJlci4gRGVmYXVsdHMgdG8gdGhlIGZ1bGwgcmFuZ2UuICovXG4gIHByb3RlY3RlZCBpc29SYW5nZTogbnVtYmVyW10gPSBbMCwgMjU1XTtcblxuICAvKiogVGhlIHNwYXRpYWwtb21pY3MgZGF0YXNldCBvbiBvZmZlciBhbmQgdGhlIGdhdGVzIGl0IHB1dHMgb24gdGhlIHNlbGVjdG9yLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3BhdGlhbDogU3BhdGlhbERhdGFzZXRCaW5kZXI7XG4gIC8qKiBXaGV0aGVyIGEgc3BhdGlhbC1vbWljcyBkYXRhc2V0IGlzIHB1Ymxpc2hlZCBvbiBgU1BBVElBTF9EQVRBX1BPUlRgIOKAlCBnYXRlcyB0aGVcbiAgICogIHNwYXRpYWwgcGxvdCB0eXBlczsgdGhlIHRvb2xiYXIgb2ZmZXJzIHRoZSBwbG90IG1vZGVzIGZvciBhbiBpbWFnZS1sZXNzIG9uZSB0b28uICovXG4gIHByb3RlY3RlZCBnZXQgaGFzU3BhdGlhbERhdGFzZXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbC5oYXNEYXRhc2V0O1xuICB9XG5cbiAgLyoqIEtleWJvYXJkLCB3aGVlbCBhbmQgY29udGV4dC1tZW51IGhhbmRsaW5nOyBjcmVhdGVkIG9uY2UgdGhlIHZpZXcgZXhpc3RzLiAqL1xuICBwcml2YXRlIHNob3J0Y3V0cz86IFZpZXdlclNob3J0Y3V0cztcblxuICAvKiogRGVib3VuY2VkIHotc2xpY2Ugc2NydWJiaW5nIChzZWUgU2xpY2VTY3J1YmJlciDigJQgcmVmYWN0b3JpbmcgcGxhbiBTdGVwIDcpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcnViYmVyID0gbmV3IFNsaWNlU2NydWJiZXIoKHopID0+IHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh6KTtcbiAgICAvLyBJbiBhIHBlci1zbGljZSB6LXN0YWNrIHNlc3Npb24gdGhlIHN0b3JlIHN3YXBzIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gdGhpc1xuICAgIC8vIHNsaWNlIChwcmVzZXJ2aW5nIGVkaXRzIG1hZGUgb24gdGhlIHByZXZpb3VzIG9uZSk7IG91dHNpZGUgc3RhY2sgbW9kZSB0aGlzXG4gICAgLy8ganVzdCByZWNvcmRzIHRoZSBzbGljZSwgbGVhdmluZyBzaW5nbGUtcGxhbmUgcmVnaW9ucyB1bnRvdWNoZWQgKGppdC11aSM5MykuXG4gICAgdGhpcy5wbG90U2VydmljZS5zZXREaXNwbGF5U2xpY2Uoeik7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGJlbG93IGFyZSB0aGUgaW5qZWN0aW9uIHBvaW50czsgbm9uZSBpcyBwdWJsaWMgQVBJLlxuICAgIEBJbmplY3QoSU1BR0VfU1RBVEVfUE9SVCkgcHJpdmF0ZSBzdGF0ZTogSW1hZ2VTdGF0ZVBvcnQsXG4gICAgQEluamVjdChWSVNVQUxJWkVSKSBwdWJsaWMgcGxvdFNlcnZpY2U6IElWaXN1YWxpemVyLFxuICAgIHB1YmxpYyBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzZXNzaW9uOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlZ2lvbk9wczogUmVnaW9uT3BzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZJWl9DT05GSUcpIHByaXZhdGUgdml6Q29uZmlnPzogVml6Q29uZmlnLFxuICAgIC8vIEEgY29uc3RydWN0b3IgcGFyYW1ldGVyIHJhdGhlciB0aGFuIGEgZmllbGQgYGluamVjdCgpYDogdGhpcyBjb21wb25lbnQgaXNcbiAgICAvLyBhbHNvIGNvbnN0cnVjdGVkIGRpcmVjdGx5IHdpdGggYG5ld2AgaW4gaXRzIG93biBzcGVjcywgd2hpY2ggaXMgb3V0c2lkZVxuICAgIC8vIGFuIGluamVjdGlvbiBjb250ZXh0IGFuZCB3b3VsZCB0aHJvdyBORzAyMDMgb24gYSBmaWVsZCBpbml0aWFsaXplci5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRPT0xCQVJfVE9PTFMpIHRvb2xDb250cmlidXRpb25zPzogcmVhZG9ubHkgVG9vbGJhckNvbnRyaWJ1dGlvbltdLFxuICAgIC8vIE9wdGlvbmFsIGxpa2UgdGhlIHJlc3Q6IGEgaG9zdCB0aGF0IHNob3dzIG9ubHkgaW1hZ2VzIG5ldmVyIHByb3ZpZGVzIGl0LFxuICAgIC8vIGFuZCB0aGUgc3BhdGlhbCBwbG90IHR5cGVzIHNpbXBseSBzdGF5IGhpZGRlbi5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKSBwcml2YXRlIHNwYXRpYWxEYXRhPzogU3BhdGlhbERhdGFQb3J0LFxuICAgIC8vIENvbnRyaWJ1dGVkIHBsb3QgbW9kZXMuIExpa2UgVE9PTEJBUl9UT09MUyB0aGUgdG9rZW4gaGFzIG5vIGZhY3RvcnksIHNvIGFcbiAgICAvLyBob3N0IHRoYXQgcHJvdmlkZXMgbm9uZSBnZXRzIG51bGwgaGVyZSBhbmQgdGhlIHNlbGVjdG9yIGlzIHVuY2hhbmdlZC5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFBMT1RfVFlQRV9DT05UUklCVVRJT05TKSBwbG90VHlwZUNvbnRyaWJ1dGlvbnM/OiByZWFkb25seSBQbG90VHlwZUNvbnRyaWJ1dGlvbltdLFxuICAgIC8vIFBhcmVudCBvZiBhIGNvbnRyaWJ1dGVkIHBhbmVsIGNvbXBvbmVudCdzIGluamVjdG9yLiBPcHRpb25hbCBvbmx5IHNvIHRoZVxuICAgIC8vIHNwZWNzIGNhbiBjb25zdHJ1Y3QgdGhpcyBjb21wb25lbnQgd2l0aCBgbmV3YC5cbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGluamVjdG9yPzogSW5qZWN0b3IsXG4gICAgLy8gVGhlIGA8dmlzdWFsaXplcj5gIGVsZW1lbnQ6IGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgc2NvcGVkIHRvIGl0IChDT1JFLTIpLlxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgaG9zdFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIC8vIEVuZHMgdGhlIHN1YnNjcmlwdGlvbnMgKGB0YWtlVW50aWxEZXN0cm95ZWRgKS4gQSBwYXJhbWV0ZXIsIGxpa2UgdGhlIHJlc3QsIHNvIHRoZVxuICAgIC8vIHNwZWNzJyBgbmV3YCBjYW4gcGFzcyBvbmU7IEFuZ3VsYXIgYWx3YXlzIHByb3ZpZGVzIGl0LlxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZiA9IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIERlc3Ryb3lSZWYsXG4gICkge1xuICAgIHRoaXMuY29udHJpYnV0ZWRUb29scyA9IHZpc2libGVUb29sQ29udHJpYnV0aW9ucyh0b29sQ29udHJpYnV0aW9ucyk7XG4gICAgdGhpcy50b29sUGFyYW1zID0gbmV3IFRvb2xQYXJhbXNNb2RlbCh0aGlzLmNvbnRyaWJ1dGVkVG9vbHMpO1xuICAgIHRoaXMuY29udHJpYnV0aW9ucyA9IG5ldyBDb250cmlidXRpb25Ib3N0KHBsb3RUeXBlQ29udHJpYnV0aW9ucywgdG9vbENvbnRyaWJ1dGlvbnMsIHtcbiAgICAgIHZpc3VhbGl6ZXI6IHRoaXMucGxvdFNlcnZpY2UsXG4gICAgICB6b25lOiB0aGlzLm5nWm9uZSxcbiAgICAgIHRvb2xzOiB0aGlzLnRvb2xzLnBsb3RNb2RlVG9vbHMsXG4gICAgICBpbmplY3RvcjogdGhpcy5pbmplY3RvcixcbiAgICAgIGltYWdlSW5mbyQ6ICgpID0+IHRoaXMuc3RhdGUuZ2V0SW1hZ2VJbmZvJCgpLFxuICAgICAgc2VsZWN0ZWRJZDogKCkgPT4gdGhpcy5zZWxlY3RlZFBsb3RUeXBlSWQsXG4gICAgICByZW5kZXJlZFR5cGU6ICgpID0+IHRoaXMucGxvdFR5cGUsXG4gICAgICBzZWxlY3RCYXNlOiAoYmFzZSkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCA9IGJhc2U7XG4gICAgICAgIHRoaXMucGxvdFR5cGUgPSBiYXNlO1xuICAgICAgfSxcbiAgICAgIG5vdGlmeTogKG0pID0+IHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiB0aGlzLnJlc3VsdFRvYXN0S2V5LCAuLi5tIH0pLFxuICAgICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpLFxuICAgIH0pO1xuICAgIHRoaXMuc3BhdGlhbCA9IG5ldyBTcGF0aWFsRGF0YXNldEJpbmRlcih0aGlzLnNwYXRpYWxEYXRhLCB7XG4gICAgICBnYXRlc0NoYW5nZWQ6ICgpID0+IHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpLFxuICAgICAgc2VsZWN0ZWRJZDogKCkgPT4gdGhpcy5zZWxlY3RlZFBsb3RUeXBlSWQsXG4gICAgICBiYXNlUGxvdFR5cGU6ICgpID0+IHRoaXMuYmFzZVBsb3RUeXBlLFxuICAgICAgaGFzSW1hZ2U6ICgpID0+ICEhdGhpcy5pbWFnZUluZm8sXG4gICAgICBzZWxlY3RQbG90VHlwZTogKHR5cGUpID0+IHRoaXMub25TZWxlY3RQbG90VHlwZSh0eXBlKSxcbiAgICAgIHJlcGxvdDogKCkgPT4gdGhpcy5yZWxvYWRBbmRQbG90KCksXG4gICAgICBwdWJsaXNoSW1hZ2U6IChpbmZvKSA9PiB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyhpbmZvKSxcbiAgICAgIHNldEltYWdlTG9hZGluZzogKGxvYWRpbmcpID0+IHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGxvYWRpbmcpLFxuICAgICAgc2V0dGxlZDogKCkgPT4ge1xuICAgICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9LFxuICAgICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdGhpcy5jaGFuZ2VkKCksXG4gICAgfSk7XG4gICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gIH1cblxuICAvKiogRm9sbG93IHRoZSBzcGF0aWFsLW9taWNzIGRhdGFzZXQ6IGEgZGF0YXNldCBhcHBlYXJpbmcsIHN3aXRjaGluZyBvciBiZWluZyBjbGVhcmVkXG4gICAqICByZS1nYXRlcyB0aGUgc2VsZWN0b3IgZXhhY3RseSBhcyB0aGUgaW1hZ2Ugc3RyZWFtIGFuZCB0aGUgdGVzdC1tb2RlIHRvZ2dsZSBkby4gKi9cbiAgcHJpdmF0ZSB3YXRjaFNwYXRpYWxEYXRhc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuc3BhdGlhbC5iaW5kKHRoaXMuZGVzdHJveWVkJCk7XG4gIH1cblxuICAvKiogUmVjb21wdXRlIHRoZSBzZWxlY3RvcidzIGVudHJpZXMgZm9yIHRoZSBjdXJyZW50IGltYWdlLCBkYXRhc2V0IGFuZCB0ZXN0IG1vZGVcbiAgICogIChzZWUge0BsaW5rIGNvbXB1dGVQbG90VHlwZU1lbnV9KS4gKi9cbiAgcHJpdmF0ZSBjb21wdXRlUGxvdFR5cGVPcHRpb25zKCkge1xuICAgIGNvbnN0IHsgYnVpbHRJbiwgbWVudSB9ID0gY29tcHV0ZVBsb3RUeXBlTWVudSh7XG4gICAgICBkZXNjcmlwdG9yczogdGhpcy5wbG90U2VydmljZS5nZXRQbG90VHlwZURlc2NyaXB0b3JzKCksXG4gICAgICBjb250cmlidXRpb25zOiB0aGlzLnBsb3RNb2Rlcy5kZXNjcmlwdG9ycygpLFxuICAgICAgY2FwczogdGhpcy5wbG90U2VydmljZS5jYXBhYmlsaXRpZXMsXG4gICAgICBpbWFnZUluZm86IHRoaXMuaW1hZ2VJbmZvLFxuICAgICAgc3BhdGlhbDogdGhpcy5zcGF0aWFsLFxuICAgICAgdGVzdE1vZGU6IHRoaXMudGVzdE1vZGUsXG4gICAgfSk7XG4gICAgdGhpcy5wbG90VHlwZU9wdGlvbnMgPSBidWlsdEluO1xuICAgIHRoaXMucGxvdFR5cGVNZW51ID0gbWVudTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBUaGUgY29uc3RydWN0b3IgY29tcHV0ZXMgdGhlIG9wdGlvbnMgd2l0aCB0ZXN0TW9kZSBzdGlsbCBhdCBpdHMgZGVmYXVsdDtcbiAgICAvLyByZWNvbXB1dGUgb25jZSB0aGUgaG9zdCBiaW5kcyBpdCAoYW5kIG9uIGFueSBsYXRlciBjaGFuZ2UpIHNvIHRoZSBzZWxlY3RvclxuICAgIC8vIHJlZmxlY3RzIHRlc3QgbW9kZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbiBpbWFnZSB0byAocmUpbG9hZC5cbiAgICBpZiAoY2hhbmdlc1sndGVzdE1vZGUnXSkge1xuICAgICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gICAgICAvLyBJZiB0ZXN0IG1vZGUgaXMgdHVybmVkIG9mZiB3aGlsZSBhIHRlc3Qtb25seSB0eXBlIChlLmcuIE5BUEFSSV9JTUFHRSkgaXNcbiAgICAgIC8vIGFjdGl2ZSwgdGhhdCB0eXBlIGlzIG5vIGxvbmdlciBvZmZlcmVkIOKAlCBmYWxsIGJhY2sgdG8gSW1hZ2UuXG4gICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhvc3QgcHVibGlzaGVkIE5PIGltYWdlIOKAlCBhIHNwYXRpYWwgZGF0YXNldCB0aGF0IGJyaW5ncyBub25lIGRvZXMgdGhpcy5cbiAgICpcbiAgICogV2l0aG91dCBoYW5kbGluZyB0aGUgZW1wdHkgZW1pc3Npb24sIGBpbWFnZUluZm9gIGtlZXBzIHRoZSBMQVNUIGltYWdlJ3MgbWV0YWRhdGE6IHRoZVxuICAgKiBzZWxlY3RvciBnb2VzIG9uIG9mZmVyaW5nIHBpeGVsIG1vZGVzIGZvciBwaXhlbHMgdGhhdCBhcmUgZ29uZSwgYW5kIGV2ZXJ5XG4gICAqIGBpc1N0YWNrYC9gaXNHcmF5c2NhbGVgIGRlY2lzaW9uIGlzIG1hZGUgYWdhaW5zdCBhIGZpbGUgdGhhdCBpcyBubyBsb25nZXIgbG9hZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkltYWdlQ2xlYXJlZCgpOiB2b2lkIHtcbiAgICAvLyBUaGUgaW1hZ2UgYSBjb250cmlidXRlZCBtb2RlIHdhcyBkcmF3aW5nIG92ZXIgaXMgZ29uZS4gQW4gb3BlbiBkaWFsb2dcbiAgICAvLyB0b29sIHN0YXlzIG9wZW4gYW5kIHJlc3RhcnRzIG9uY2UgdGhlIG5leHQgaW1hZ2UgaGFzIHBsb3R0ZWQuXG4gICAgdGhpcy5jb250cmlidXRpb25zLmVuZFNlc3Npb25zKCk7XG4gICAgdGhpcy5pbWFnZUluZm8gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sb2FkZWRGaWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKTtcbiAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIHJlY29uY2lsaW5nIHRoZSBzZWxlY3RlZCB0eXBlIGhlcmUuIFJlY29uY2lsaW5nIGNhbGxzXG4gICAgLy8gYHNldFBsb3RUeXBlYCwgd2hpY2ggZHJpdmVzIGEgcmUtcGxvdCDigJQgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gcGxvdCwgc28gdGhlXG4gICAgLy8gUGxvdGx5IGJhY2tlbmQgcmVhZCBpdHMgb3duIG5vdy11bnNldCBgaW1hZ2VJbmZvYCBhbmQgdGhyZXdcbiAgICAvLyAoXCJjYW4ndCBhY2Nlc3MgcHJvcGVydHkgaXNHcmF5c2NhbGVcIiksIGFib3J0aW5nIHRoZSBsb2FkIHdpdGggbm8gb2JzZXJ2YXRpb25zXG4gICAgLy8gZHJhd24uIElnbm9yaW5nIHRoZSBlbXB0eSBlbWlzc2lvbiBlbnRpcmVseSBpcyB3aGF0IHVzZWQgdG8gYXZvaWQgdGhhdC5cbiAgICAvL1xuICAgIC8vIE5vdGhpbmcgaXMgbGVmdCBzdHJhbmRlZDogYW4gaW1hZ2UgaXMgY2xlYXJlZCBiZWNhdXNlIGEgc3BhdGlhbCBkYXRhc2V0IHRoYXRcbiAgICAvLyBicmluZ3Mgbm9uZSBpcyBiZWluZyBvcGVuZWQsIGFuZCB0aGF0IGRhdGFzZXQncyBvd24gc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlXG4gICAgLy8gbW9kZSBpdHMgY29vcmRpbmF0ZXMgc3VwcG9ydCBhIG1vbWVudCBsYXRlci5cbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBJZiB0aGUgYWN0aXZlIHBsb3QgdHlwZSBpcyBubyBsb25nZXIgaW4gdGhlIG9mZmVyZWQgb3B0aW9ucyAoZS5nLiB0ZXN0IG1vZGVcbiAgICogIHR1cm5lZCBvZmYgd2hpbGUgYSB0ZXN0LW9ubHkgdHlwZSB3YXMgYWN0aXZlLCBvciBhIHNjYWxhciB0eXBlIGNhcnJpZWQgb250b1xuICAgKiAgYW4gUkdCIGltYWdlKSwgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IDJEIEltYWdlIHZpZXcuICovXG4gIHByaXZhdGUgcmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZSgpOiB2b2lkIHtcbiAgICBjb25zdCBmYWxsYmFjayA9IHJlY29uY2lsZVBsb3RUeXBlKHRoaXMucGxvdFR5cGVNZW51LCB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCk7XG4gICAgaWYgKCFmYWxsYmFjaykgcmV0dXJuO1xuICAgIC8vIExlYXZpbmcgYSBjb250cmlidXRlZCBtb2RlIChpdHMgZ2F0ZXMgc3RvcHBlZCBwYXNzaW5nLCBvciBpdHMgcHJvdmlkZXIgaXNcbiAgICAvLyBnb25lKTogaXRzIHNlc3Npb24gZW5kcyBiZWZvcmUgYW55dGhpbmcgZWxzZSBkcmF3cy5cbiAgICB0aGlzLnBsb3RNb2Rlcy5kZWFjdGl2YXRlKCk7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMucGxvdE1vZGVzLmJhc2VUeXBlT2YoZmFsbGJhY2spO1xuICAgIGlmIChiYXNlICE9PSBQbG90VHlwZS5JTUFHRSkgdGhpcy5jbG9zZURpYWxvZ1Rvb2woKTtcbiAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCA9IGZhbGxiYWNrO1xuICAgIHRoaXMucGxvdFR5cGUgPSBiYXNlO1xuICAgIHRoaXMuaXNIZWF0bWFwID0gYmFzZSA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZShiYXNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIEpvaW4gdGhlIGxpdmUgc2V0OyB0aGUgb2xkZXN0IG1lbWJlciByZW5kZXJzIHRoZSBzaGFyZWQgbm90aWNlIG91dGxldHMuXG4gICAgVmlzdWFsaXplckNvbXBvbmVudC5saXZlSW5zdGFuY2VzLmFkZCh0aGlzKTtcbiAgICB0aGlzLnN0YXRlLnNldERpYWdyYW0odGhpcy5ob3N0SGFuZGxlKTtcbiAgICB0aGlzLndhdGNoU3BhdGlhbERhdGFzZXQoKTtcbiAgICAvLyBPU0QgYW5kIG5hcGFyaS1qcyBlbWl0IHRoaXMgZnJvbSB0aGVpciBvd24gXCJmaXQgdG8gdmlld1wiOiBkaXNhcm0gdGhlIHRvb2wgb25cbiAgICAvLyB0aGUgYmFja2VuZCB0b28sIG5vdCBvbmx5IHRoZSB0b29sYmFyJ3MgaGlnaGxpZ2h0LlxuICAgIHRoaXMucGxvdFNlcnZpY2VcbiAgICAgIC5nZXRBdXRvc2NhbGVFdmVudCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b29scy5hcHBseShudWxsKSk7XG4gICAgLy8gTG9hZGluZy9vdmVybGF5IFVJIG1pcnJvcnMgKHNpZ25hbHM6IHRoZXkgcmUtcmVuZGVyIHRoZSB2aWV3IHRoZW1zZWx2ZXMpLlxuICAgIHRoaXMubWlycm9yKHRoaXMuc3RhdGUuaXNJbWFnZUxvYWRpbmckKCksICh2KSA9PiB0aGlzLmltZ0xvYWRpbmcuc2V0KHYpKTtcbiAgICB0aGlzLm1pcnJvcih0aGlzLnBsb3RTZXJ2aWNlLmdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCksICh2KSA9PiB0aGlzLmxvYWRpbmdQZXJjZW50YWdlLnNldCh2KSk7XG4gICAgdGhpcy5taXJyb3IodGhpcy5wbG90U2VydmljZS5pc1N0YWNrTG9hZGluZygpLCAodikgPT4gdGhpcy5zdGFja0xvYWRpbmcuc2V0KHYpKTtcbiAgICAvLyBUaGUgc2xpY2UgZWRpdG9yOiBpdHMgc2VjdGlvbnMsIGFuZCB0aGUgc2xpY2UgcGlja2VkIGJ5IGRyYWdnaW5nIHRoZSB6IHBsYW5lIGluIHRoZSB2b2x1bWUuXG4gICAgY29uc3Qgc2VjdGlvbnMkID0gdGhpcy5wbG90U2VydmljZS5nZXRTZWN0aW9uVmlld3MkPy4oKTtcbiAgICBpZiAoc2VjdGlvbnMkKSB7XG4gICAgICB0aGlzLm1pcnJvcihzZWN0aW9ucyQsICh2KSA9PiB7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSB2O1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzbGljZURyYWckID0gdGhpcy5wbG90U2VydmljZS5nZXRTbGljZURyYWckPy4oKTtcbiAgICBpZiAoc2xpY2VEcmFnJCkge1xuICAgICAgdGhpcy5taXJyb3Ioc2xpY2VEcmFnJCwgKHopID0+IHtcbiAgICAgICAgdGhpcy5vblpTY3J1YihNYXRoLm1pbih0aGlzLm1heEluZGV4LCBNYXRoLm1heCgwLCB6KSkpO1xuICAgICAgICAvLyBGcm9tIGEgRE9NIGxpc3RlbmVyLCBub3QgYSB0ZW1wbGF0ZSBldmVudDogdGhlIHNsaWRlciBhbmQgYmFkZ2UgbXVzdCBiZSBtYXJrZWQgdG8gZm9sbG93LlxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLm1pcnJvcih0aGlzLnN0YXRlLmdldEltYWdlTG9hZGluZ01lc3NhZ2UkKCksICh2KSA9PiB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCh2KSk7XG4gICAgdGhpcy5taXJyb3IodGhpcy5zdGF0ZS5nZXRDYWNoZVByb2dyZXNzJCgpLCAodikgPT4gdGhpcy5jYWNoZVByb2dyZXNzLnNldCh2KSk7XG4gICAgdGhpcy5taXJyb3IodGhpcy5zdGF0ZS5pc1pvb20kKCksICh2KSA9PiB0aGlzLnpvb20uc2V0KHYpKTtcbiAgICB0aGlzLm1pcnJvcih0aGlzLnN0YXRlLmdldEZpbGVuYW1lJCgpLCAodikgPT4ge1xuICAgICAgaWYgKHYpIHRoaXMuZmlsZU5hbWUgPSB2O1xuICAgIH0pO1xuICAgIHRoaXMucmVnaW9uQWN0aW9ucy5iaW5kKHRoaXMuZGVzdHJveWVkJCwgKCkgPT4gdGhpcy5jaGFuZ2VkKCkpO1xuICAgIHRoaXMuc2VnbWVudGF0aW9uLmJpbmRQb2ludFRvb2wodGhpcy5zYW1Qb2ludFRvb2wsIHRoaXMuZGVzdHJveWVkJCk7XG4gICAgdGhpcy5taXJyb3IodGhpcy5zdGF0ZS5nZXRQYW5lbFdpZHRoJCgpLCAoKSA9PiB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbGF5b3V0KCk7XG4gICAgICAvLyBUaGUgaW50ZW5zaXR5IGluc2V0IGlzIGEgc2VwYXJhdGUgY2hhcnQgaW4gYSBmbG9hdGluZyBwYW5lbDsgcmVmbG93IGl0IHRvby5cbiAgICAgIHRoaXMuaW5zZXQ/LnJlZmxvdygpO1xuICAgIH0pO1xuICAgIHRoaXMuc3RhdGVcbiAgICAgIC5nZXRJbWFnZUluZm8kKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChpbWdJbmZvKSA9PiB7XG4gICAgICAgICAgaWYgKCFpbWdJbmZvKSB7XG4gICAgICAgICAgICB0aGlzLm9uSW1hZ2VDbGVhcmVkKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBzZWxlY3RvciwgdGhlIHN0YWNrIGNvbnRyb2xzIGFuZCB0aGUgaW5zZXQgYWxsIGZvbGxvdyB0aGUgaW1hZ2UuXG4gICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgICAgaWYgKGltZ0luZm8pIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VJbmZvID0gaW1nSW5mbztcbiAgICAgICAgICAgIC8vIFN0YWNrLW9ubHkgcGxvdCB0eXBlcyAoaXNvc3VyZmFjZSwgc2NhdHRlcjNkKSBkZXBlbmQgb24gd2hldGhlciB0aGlzXG4gICAgICAgICAgICAvLyBmaWxlIGlzIGEgc3RhY2sg4oCUIHJlY29tcHV0ZSB0aGUgc2VsZWN0b3Igb3B0aW9ucy5cbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGFjdGl2ZSBwbG90IHR5cGUgaXNuJ3QgdmFsaWQgZm9yIHRoaXMgaW1hZ2UgKGUuZy4gYSBzY2FsYXJcbiAgICAgICAgICAgIC8vIHR5cGUgbGlrZSBDb250b3VyIGNhcnJpZWQgb3ZlciB0byBhbiBSR0IgaW1hZ2UpLCBmYWxsIGJhY2sgdG8gSW1hZ2UuXG4gICAgICAgICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICAgICAgICAgIC8vIFJlYWQgZnJvbSBgaW1nSW5mb2AsIHRoZSB2YWx1ZSB0aGlzIGVtaXNzaW9uIGNhcnJpZWQsIHJhdGhlciB0aGFuIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBmaWVsZC4gSGFuZGxpbmcgdGhlIGVtcHR5IGVtaXNzaW9uIG1lYW5zIHRoZSBmaWVsZCBDQU4gYmUgbnVsbGVkIHBhcnQtd2F5XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoaXMgYnJhbmNoOiBgcmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZWAgbWF5IGNhbGwgYHNldFBsb3RUeXBlYCxcbiAgICAgICAgICAgIC8vIHdoaWNoIGNhbiBtYWtlIHRoZSBob3N0IHB1Ymxpc2ggYSBuZXcgaW1hZ2Ugc3RhdGUsIHJlLWVudGVyaW5nIHRoaXMgdmVyeVxuICAgICAgICAgICAgLy8gc3Vic2NyaXB0aW9uLiBSZWFkaW5nIHRoZSBmaWVsZCB0aGVuIHRocmV3IG9uIGBpc0dyYXlzY2FsZWAgYW5kIGFib3J0ZWQgdGhlXG4gICAgICAgICAgICAvLyBoYW5kbGVyLCBzbyB0aGUgb2JzZXJ2YXRpb25zIHdlcmUgbmV2ZXIgZHJhd24uXG4gICAgICAgICAgICB0aGlzLmlzR3JheXNjYWxlRXZlbnQuZW1pdChpbWdJbmZvLmlzR3JheXNjYWxlKTtcbiAgICAgICAgICAgIHRoaXMuaXNTdGFja0V2ZW50LmVtaXQoaW1nSW5mby5pc1N0YWNrKTtcbiAgICAgICAgICAgIC8vIFJlc2V0IHRvIHRoZSBkZWZhdWx0IDJEIEltYWdlIHZpZXcgd2hlbiBhIGRpZmZlcmVudCBpbWFnZSBpc1xuICAgICAgICAgICAgLy8gc2VsZWN0ZWQgd2hpbGUgYSAzRCB0eXBlIGlzIGFjdGl2ZS5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc0hlYXRtYXAgJiYgaW1nSW5mby5maWxlTmFtZSAhPT0gdGhpcy5sb2FkZWRGaWxlTmFtZSkge1xuICAgICAgICAgICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMucGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBsb3RUeXBlSWQgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0aGlzLnBsb3RUeXBlKTtcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRlZEZpbGVOYW1lID0gaW1nSW5mby5maWxlTmFtZTtcbiAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0SW1hZ2VNZXRhKGltZ0luZm8uaW1hZ2VNZXRhLCBpbWdJbmZvLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIC8vIEEgbmV3ZXIgaW1hZ2UgYWx3YXlzIHByZWVtcHRzIGFuIGluLWZsaWdodCByZW5kZXIgKHNlZSBJbWFnZVJlbmRlclNlc3Npb24pLlxuICAgICAgICAgICAgaWYgKGltZ0luZm8udXJscykgdGhpcy5yZW5kZXIucmVuZGVyKGltZ0luZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBlcnJvck1lc3NhZ2UoZXJyKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkIHdoZW4gZ2V0dGluZyBpbWFnZSBpbmZvJywgZXJyKTtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICBrZXk6IHRoaXMudml6QWxlcnRUb2FzdEtleSxcbiAgICAgICAgICAgIHN0aWNreTogdHJ1ZSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgc3VtbWFyeTogJ0FuIGVycm9yIG9jY3VyZWQnLFxuICAgICAgICAgICAgZGV0YWlsOiBgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cmVkIHdoaWxlIGdldHRpbmcgaW1hZ2UgaW5mbzogJHttc2d9LlxuICAgICAgICAgICAgICAgICAgIFBsZWFzZSB0cnkgdG8gb3BlbiB0aGUgaW1hZ2UgYWdhaW4gdGhyb3VnaCB0aGUgZmlsZSBuYXZpZ2F0b3IuYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnN0YWNrTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnJlbmRlci5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldCgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRm9sbG93IGBzb3VyY2VgIHVudGlsIGRlc3Ryb3kuIEhvc3Qgc3RyZWFtcyBjYW4gZW1pdCBvdXRzaWRlIHRoZSBBbmd1bGFyIHpvbmUgKGFcbiAgICogc2VydmVybGVzcyBob3N0IGNsZWFycyBpdHMgbG9hZGluZyBmbGFnIGZyb20gYW4gaW1hZ2UgZGVjb2RlIG9yIGFuIE9wZW5TZWFkcmFnb25cbiAgICogY2FsbGJhY2spOyBzZXR0aW5nIGEgc2lnbmFsIHRoZXJlIG1hcmtzIHRoaXMgT25QdXNoIHZpZXcgYnV0IHNjaGVkdWxlcyBubyBjaGFuZ2VcbiAgICogZGV0ZWN0aW9uLCBzbyB0aGUgdXBkYXRlIGlzIGFwcGxpZWQgaW5zaWRlIHRoZSB6b25lLCBhcyB7QGxpbmsgY2hhbmdlZH0gZG9lcy5cbiAgICovXG4gIHByaXZhdGUgbWlycm9yPFQ+KHNvdXJjZTogT2JzZXJ2YWJsZTxUPiwgYXBwbHk6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHNvdXJjZS5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSBhcHBseSh2YWx1ZSk7XG4gICAgICBlbHNlIHRoaXMubmdab25lLnJ1bigoKSA9PiBhcHBseSh2YWx1ZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRlIHRoaXMgdmlldyBzaG93cyBjaGFuZ2VkIG91dHNpZGUgb25lIG9mIGl0cyB0ZW1wbGF0ZSBldmVudHMgKGEgc3RyZWFtLCBhXG4gICAqIHJlc29sdmVkIHByb21pc2UsIGEgaG9zdCBjYWxsKTogbWFyayB0aGUgT25QdXNoIHZpZXcgZm9yIGNoZWNrLCByZS1lbnRlcmluZyB0aGVcbiAgICogem9uZSB3aGVuIGl0IGNoYW5nZWQgb3V0c2lkZSBpdCBzbyBhIGNoYW5nZS1kZXRlY3Rpb24gcGFzcyBmb2xsb3dzLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmIChOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGVsc2UgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXkgYSBuZXcgaW1hZ2Ugb3V0IG9uY2UgdGhlIG9sZCB2aWV3IGlzIGdvbmU6IHRoZSBzdGFjayBmbGFnLCB0aGUgc2xpY2UgYm91bmRzIChvbmVcbiAgICogdXJsIHBlciBzbGljZSwgc28gdGhlIGxhc3QgaW5kZXggaXMgbGVuZ3RoLTEpLCBhbmQgdGhlIG9uZS1zaG90IGBpbml0aWFsWkluZGV4YCBoaW50XG4gICAqIChlLmcuIHRoZSBmaWxlIHRoZSB1c2VyIGNsaWNrZWQgd2l0aGluIGEgbnVtYmVyZWQgc2VyaWVzKS4gVGhlIGhpbnQgaXMgY29uc3VtZWQgc29cbiAgICogcmUtZGVsaXZlcmluZyB0aGUgc2FtZSBpbmZvIChhIHBsb3QtdHlwZSBzd2l0Y2gsIHJlbG9hZEFuZFBsb3QpIGRvZXMgbm90IHJlc2V0IHRoZVxuICAgKiB1c2VyJ3Mgc2NydWI7IHRoZSBob3N0J3Mgb2JqZWN0IGlzIG5ldmVyIHdyaXR0ZW4gdG8gKGEgaG9zdCBzdG9yZSBtYXkgZnJlZXplIGl0KSDigJRcbiAgICogdGhlIGNvbXBvbmVudCBrZWVwcyBhIGNvcHkgd2l0aG91dCB0aGUgaGludCwgYW5kIHJlbWVtYmVycyB0aGUgaG9zdCBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIGxheU91dFNsaWNlcyhpbmZvOiBJSW1hZ2VJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmcuc2V0KGluZm8uaXNTdGFjayAmJiBpbmZvLnNob3dTdGFjayk7XG4gICAgdGhpcy5tYXhJbmRleCA9IGluZm8udXJscy5sZW5ndGggPiAxID8gaW5mby51cmxzLmxlbmd0aCAtIDEgOiAwO1xuICAgIGlmIChpbmZvLmluaXRpYWxaSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCF0aGlzLmNvbnN1bWVkU2xpY2VIaW50cy5oYXMoaW5mbykpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lZFNsaWNlSGludHMuYWRkKGluZm8pO1xuICAgICAgICB0aGlzLnpJbmRleCA9IGluZm8uaW5pdGlhbFpJbmRleDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW1hZ2VJbmZvID0geyAuLi5pbmZvLCBpbml0aWFsWkluZGV4OiB1bmRlZmluZWQgfTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVaSW5kZXgoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBXaW5kb3cgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkIE9VVFNJREUgdGhlIEFuZ3VsYXIgem9uZTogem9uZS1wYXRjaGVkLCBldmVyeVxuICAgIC8vIG1vdXNlbW92ZSBhbnl3aGVyZSBpbiB0aGUgaG9zdCBhcHAgcmFuIGFwcC13aWRlIGNoYW5nZSBkZXRlY3Rpb24uIEVhY2ggaGFuZGxlclxuICAgIC8vIHJlLWVudGVycyB0aGUgem9uZSAobmdab25lLnJ1bikgb25seSB3aGVuIGl0IGFjdHVhbGx5IGNoYW5nZXMgdmlldyBzdGF0ZS5cbiAgICB0aGlzLnNob3J0Y3V0cyA9IG5ldyBWaWV3ZXJTaG9ydGN1dHModGhpcy5zaG9ydGN1dEhvc3QoKSwgdGhpcy5uZ1pvbmUpO1xuICAgIHRoaXMuc2hvcnRjdXRzLmF0dGFjaCgpO1xuICAgIHRoaXMub25WaWV3UmVhZHkoKTtcbiAgfVxuXG4gIC8qKiBUaGUgcGxvdCBkaXYgZXhpc3RzIG5vdzogcnVuIGFuIGltYWdlLWxlc3MgZHJhdyB0aGF0IGFycml2ZWQgYmVmb3JlIGl0IGRpZC4gKi9cbiAgcHJpdmF0ZSBvblZpZXdSZWFkeSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlci52aWV3SXNSZWFkeSh0aGlzLnNwYXRpYWwuZGF0YXNldCwgISF0aGlzLmltYWdlSW5mbyk7XG4gIH1cblxuICAvKiogV2hhdCB0aGUga2V5Ym9hcmQsIHdoZWVsIGFuZCBjb250ZXh0LW1lbnUgc2hvcnRjdXRzIGFjdCBvbi4gVGhlaXIgbGlzdGVuZXJzIGxpdmVcbiAgICogIG91dHNpZGUgdGhpcyB2aWV3LCBzbyBldmVyeSBhY3Rpb24gdGhhdCBjaGFuZ2VzIHdoYXQgaXQgc2hvd3MgbWFya3MgaXQgZm9yIGNoZWNrLiAqL1xuICBwcml2YXRlIHNob3J0Y3V0SG9zdCgpOiBTaG9ydGN1dEhvc3Qge1xuICAgIGNvbnN0IG1hcmtlZCA9XG4gICAgICA8QSBleHRlbmRzIHVua25vd25bXT4oYWN0OiAoLi4uYXJnczogQSkgPT4gdm9pZCkgPT5cbiAgICAgICguLi5hcmdzOiBBKTogdm9pZCA9PiB7XG4gICAgICAgIGFjdCguLi5hcmdzKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBwbG90RGl2TmFtZTogdGhpcy5wbG90RGl2TmFtZSxcbiAgICAgIGhvc3RFbGVtZW50OiB0aGlzLmhvc3RSZWY/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbCxcbiAgICAgIGFjdGl2ZURyYWdNb2RlOiAoKSA9PiB0aGlzLmFjdGl2ZURyYWdNb2RlLFxuICAgICAgY2FuU3RlcFNsaWNlOiAoKSA9PiAhIXRoaXMuaW1hZ2VJbmZvPy5pc1N0YWNrICYmICh0aGlzLmlzSW1hZ2VWaWV3IHx8IHRoaXMuc2xpY2VFZGl0b3JTaG93biksXG4gICAgICB3aGVlbFpvb21zOiAoKSA9PiAhcmVuZGVyZXJPd25zV2hlZWwodGhpcy5iYXNlUGxvdFR5cGUpICYmIHRoaXMuaXNIZWF0bWFwLFxuICAgICAgc3RlcFNsaWNlOiBtYXJrZWQoKGRlbHRhOiBudW1iZXIpID0+IHRoaXMuc3RlcFNsaWNlKGRlbHRhKSksXG4gICAgICByZXNvbHZlU2FtUHJvbXB0OiBtYXJrZWQoKGNvbW1pdDogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoY29tbWl0KSB0aGlzLnBsb3RTZXJ2aWNlLmNvbW1pdFNhbVBvaW50cygpO1xuICAgICAgICBlbHNlIHRoaXMucGxvdFNlcnZpY2UuY2xlYXJTYW1Qb2ludHMoKTtcbiAgICAgICAgdGhpcy5zZWdtZW50YXRpb24uaGlkZSgpOyAvLyBwcm9tcHQgcmVzb2x2ZWQg4oaSIGRpc21pc3MgdGhlIHN0YXR1cyB0b2FzdFxuICAgICAgfSksXG4gICAgICB1bmRvOiBtYXJrZWQoKCkgPT4gdGhpcy51bmRvUmVnaW9uKCkpLFxuICAgICAgcmVkbzogbWFya2VkKCgpID0+IHRoaXMucmVkb1JlZ2lvbigpKSxcbiAgICAgIGRlbGV0ZVJlZ2lvbjogbWFya2VkKCgpID0+IHRoaXMuZGVsZXRlUmVnaW9uKCkpLFxuICAgICAgem9vbUluOiBtYXJrZWQoKCkgPT4gdGhpcy56b29tSW4oKSksXG4gICAgICB6b29tT3V0OiBtYXJrZWQoKCkgPT4gdGhpcy56b29tT3V0KCkpLFxuICAgICAgdG9nZ2xlRHJhZ01vZGU6IG1hcmtlZCgobW9kZTogc3RyaW5nKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKG1vZGUpKSxcbiAgICAgIG9wZW5Db250ZXh0TWVudTogKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnVJdGVtcyA9IHRoaXMuYnVpbGRDb250ZXh0TWVudUl0ZW1zKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KGV2ZW50KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBTbmFwIHRoZSBmbG9hdGluZyB0b29sYmFyIGJhY2sgdG8gaXRzIGRvY2tlZCBwb3NpdGlvbiBhY3Jvc3MgdGhlIHRvcC4gKi9cbiAgcHJvdGVjdGVkIGRvY2tUb29sYmFyKCkge1xuICAgIHRoaXMudG9vbGJhckZsb2F0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKiogVG9vbGJhciBcIkludGVuc2l0eVwiIGdyb3VwOiBhZGQgYW5vdGhlciBsaW5lIFJPSSAobmV4dCBicmlnaHQgY29sb3VyKS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZFByb2ZpbGVMaW5lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlZ2lvbiA9IGF3YWl0IHRoaXMuaW5zZXQ/LmFkZFByb2ZpbGVMaW5lKCk7XG4gICAgLy8gT1NEIG9ubHkgZHJhd3MgYSBzZWxlY3RlZCByZWdpb24ncyBoYW5kbGVzIGluIGFuIGVkaXQgbW9kZSwgc28gYSBsaW5lIGluXG4gICAgLy8gJ25vbmUnIG1vZGUgbG9va3MgdW5zZWxlY3RlZC4gU3dpdGNoIHRvICdzZWxlY3QnIHNvIHRoZSBuZXcgbGluZSBzaG93cyBpdHNcbiAgICAvLyBlbmRwb2ludCBoYW5kbGVzIGFuZCBjYW4gYmUgZHJhZ2dlZC9kZWxldGVkIHJpZ2h0IGF3YXkuXG4gICAgaWYgKHJlZ2lvbiAmJiB0aGlzLmlzSW1hZ2VWaWV3ICYmIHRoaXMuYWN0aXZlRHJhZ01vZGUgIT09ICdzZWxlY3QnKSB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIEEgY29udHJpYnV0ZWQgbW9kZSdzIHNlc3Npb24gZW5kcyBmaXJzdCwgd2hpbGUgdGhlIHZpZXdlciBpdCBkcmV3IG92ZXJcbiAgICAvLyBzdGlsbCBleGlzdHMuIFRoZSBwYW5lbCBnb2VzIHdpdGggdGhpcyB2aWV3LCBzbyBubyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIHRoaXMuY29udHJpYnV0aW9ucy5kZXN0cm95KCk7XG4gICAgLy8gTGVhdmUgdGhlIGxpdmUgc2V0IHNvIHRoZSBuZXh0LW9sZGVzdCB2aXN1YWxpemVyIHBpY2tzIHVwIHRoZSBvdXRsZXRzIOKAlCBvbiBpdHNcbiAgICAvLyBuZXh0IGNoZWNrLCB3aGljaCBhbiBPblB1c2ggc2libGluZyBuZWVkcyBhc2tpbmcgZm9yLlxuICAgIFZpc3VhbGl6ZXJDb21wb25lbnQubGl2ZUluc3RhbmNlcy5kZWxldGUodGhpcyk7XG4gICAgZm9yIChjb25zdCBvdGhlciBvZiBWaXN1YWxpemVyQ29tcG9uZW50LmxpdmVJbnN0YW5jZXMpIG90aGVyLmNoYW5nZWQoKTtcbiAgICB0aGlzLnN0YXRlLnNldERpYWdyYW0obnVsbCk7XG4gICAgdGhpcy5yZW5kZXIuY2FuY2VsKCk7XG4gICAgdGhpcy5zcGF0aWFsLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNjcnViYmVyLmNhbmNlbCgpO1xuICAgIHRoaXMuc2hvcnRjdXRzPy5kZXRhY2goKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmRldGFjaCgpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGhvc3QgZ2V0cyB0aHJvdWdoIGBzZXREaWFncmFtYCDigJQgc2VlIHtAbGluayBWaXN1YWxpemVySGFuZGxlfS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBob3N0SGFuZGxlOiBWaXN1YWxpemVySGFuZGxlID0ge1xuICAgIHZpc3VhbGl6ZXI6IHRoaXMucGxvdFNlcnZpY2UsXG4gICAgcGxvdFNlcnZpY2U6IHRoaXMucGxvdFNlcnZpY2UsXG4gICAgaGFzUmVnaW9uczogKCkgPT4gdGhpcy5oYXNSZWdpb25zKCksXG4gICAgZ2V0UmVnaW9uUG9seWdvbnM6ICgpID0+IHRoaXMuZ2V0UmVnaW9uUG9seWdvbnMoKSxcbiAgfTtcblxuICBwdWJsaWMgaGFzUmVnaW9ucygpOiBib29sZWFuIHtcbiAgICAvLyBUaGUgY29udHJhY3QncyBmcmFtZXdvcmstbmV1dHJhbCByZWdpb24gYWNjZXNzb3I6IHRoZSBjb21wb25lbnQgb25seSBuZWVkcyB0b1xuICAgIC8vIGtub3cgd2hldGhlciBhbnkgcmVnaW9uIGV4aXN0cywgbmV2ZXIgYSBiYWNrZW5kJ3Mgd2lyZSBmb3JtYXQuXG4gICAgcmV0dXJuIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnQgcmVnaW9ucyBhcyBwb2x5Z29ucyAoYWxzbyBvbiB0aGUgaG9zdCBoYW5kbGUpLiAqL1xuICBwdWJsaWMgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdIHtcbiAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25Qb2x5Z29ucygpO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIGRpYWxvZyAodG9vbGJhciBidXR0b24pLiAqL1xuICBwcm90ZWN0ZWQgb3BlbkNoYW5uZWxIaXN0b2dyYW0oKSB7XG4gICAgdGhpcy5zaG93Q2hhbm5lbEhpc3RvZ3JhbSA9IHRydWU7XG4gIH1cblxuICAvKiogVG9vbGJhciDihpIgb3BlbiB0aGUgc3BhdGlhbC1vbWljcyBjb250cm9scy4gKi9cbiAgcHJvdGVjdGVkIG9wZW5TcGF0aWFsQ29udHJvbHMoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93U3BhdGlhbENvbnRyb2xzID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBPcGVuIHRoZSBSZWdpb24gRWRpdG9yIGRpYWxvZyAodG9vbGJhciBidXR0b24pLiBUaGUgZWRpdG9yIHN0YXlzIGxpbmtlZCB0b1xuICAgKiAgdGhpcyBwbG90dGluZyBpbnN0YW5jZSB0aHJvdWdoIHRoZSByb290IFJlZ2lvblN0b3JlIHNpbmdsZXRvbiwgc28gaXQgd29ya3NcbiAgICogIHRoZSBzYW1lIGFzIHRoZSBmb3JtZXIgcmlnaHQtcGFuZWwgUmVnaW9ucyB0YWIuICovXG4gIHByb3RlY3RlZCBvcGVuUmVnaW9uRWRpdG9yKCkge1xuICAgIC8vIFNpemUgdGhlIGRpYWxvZyB0byBtYXRjaCB0aGUgaG9zdCdzIGNvbmZpZ3VyZWQgZWxlbWVudCAoZS5nLiB0aGUgYXBwJ3NcbiAgICAvLyByaWdodCBwYW5lbCkgYXQgb3BlbiB0aW1lLiBNZWFzdXJlZCBvbmNlIOKAlCBpdCBpbnRlbnRpb25hbGx5IGRvZXMgbm90XG4gICAgLy8gdHJhY2sgbGF0ZXIgYnJvd3Nlci9zcGxpdCByZXNpemVzLiBGYWxscyBiYWNrIHRvIGEgcXVhcnRlciBvZiB0aGUgcGFnZVxuICAgIC8vIHdoZW4gbm8gc2VsZWN0b3IgaXMgY29uZmlndXJlZCBvciB0aGUgZWxlbWVudCBpc24ndCBwcmVzZW50LlxuICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy52aXpDb25maWc/LnJlZ2lvbkVkaXRvcldpZHRoU2VsZWN0b3I7XG4gICAgY29uc3Qgd2lkdGggPSBzZWxlY3RvclxuICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihzZWxlY3Rvcik/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlZ2lvbkVkaXRvcldpZHRoID0gd2lkdGggJiYgd2lkdGggPiAwID8gYCR7TWF0aC5yb3VuZCh3aWR0aCl9cHhgIDogJzI1dncnO1xuICAgIHRoaXMuc2hvd1JlZ2lvbkVkaXRvciA9IHRydWU7XG4gIH1cblxuICAvKiogVGhlIHRvb2xiYXIncyBTaW5nbGUgaW1hZ2UgLyBTdGFjayB0b2dnbGUuICovXG4gIHByb3RlY3RlZCBzZWxlY3RTdGFja09wdGlvbihzZWxlY3RlZFN0YWNrT3B0aW9uOiB7IG5hbWU6IHN0cmluZzsgdmFsOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IHNob3dzdGFjayA9IHNlbGVjdGVkU3RhY2tPcHRpb24udmFsID09PSAndHJ1ZSc7XG4gICAgdGhpcy5zdGFja0xvYWRpbmcuc2V0KHNob3dzdGFjayk7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoIXNob3dzdGFjayk7XG4gICAgLy8gU3RhY2sgbW9kZSBpcyBhbHdheXMgYSAyRCBoZWF0bWFwIOKAlCByZXNldCBzdXJmYWNlIG1vZGUgaWYgYWN0aXZlXG4gICAgaWYgKCF0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgdGhpcy5pc0hlYXRtYXAgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90VHlwZSA9IFBsb3RUeXBlLkhFQVRNQVA7XG4gICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCA9IFBsb3RUeXBlLkhFQVRNQVA7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHRoaXMucGxvdFR5cGUpO1xuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG5cbiAgLyoqIENsYW1wIHRoZSBzbGljZSBpbmRleCBpbnRvIFswLCBtYXhJbmRleF0gYW5kIHB1c2ggaXQgdG8gdGhlIHJlbmRlcmVyLiAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlWkluZGV4KCkge1xuICAgIGlmICh0aGlzLnpJbmRleCA+IHRoaXMubWF4SW5kZXgpIHtcbiAgICAgIHRoaXMuekluZGV4ID0gdGhpcy5tYXhJbmRleDtcbiAgICB9XG4gICAgaWYgKHRoaXMuekluZGV4IDwgMCkge1xuICAgICAgdGhpcy56SW5kZXggPSAwO1xuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh0aGlzLnpJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogTGl2ZSB6LXNsaWNlIHNjcnViIGZvciB0aGUgSW1hZ2UgdmlldzogdGhlIHJlbmRlcmVyIHN3YXBzIHRoZSBkaXNwbGF5ZWRcbiAgICogc2xpY2UgaW4gcGxhY2UgKG5vIHJlLW1vdW50KSwgc28gZHJhZ2dpbmcgdGhlIHNsaWRlciBzdGVwcyB0aHJvdWdoIHRoZVxuICAgKiBzdGFjayB0aGUgc2FtZSB3YXkgdGhlIGhlYXRtYXAgZnJhbWUgc2xpZGVyIGRvZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25aU2xpZGUoejogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuekluZGV4ID0gejtcbiAgICB0aGlzLnNjcnViYmVyLmNvbW1pdCh6KTtcbiAgICAvLyBLZWVwIHRoZSBpbnRlbnNpdHkgaW5zZXQgc2FtcGxpbmcgdGhlIGRpc3BsYXllZCBzbGljZSAoSW1hZ2UgdmlldykuXG4gICAgdGhpcy5pbnNldD8uc2xpY2VDb21taXR0ZWQoeik7XG4gIH1cblxuICAvKipcbiAgICogTGl2ZSAoZGVib3VuY2VkKSBzY3J1YiB3aGlsZSBkcmFnZ2luZyB0aGUgSW1hZ2UtdmlldyB6LXNsaWRlcjogdXBkYXRlIHRoZVxuICAgKiBzbGljZSBhcyB0aGUgdXNlciBkcmFncywgYnV0IGNvYWxlc2NlIHJhcGlkIGNoYW5nZXMgc28gd2UgZG9uJ3QgZmlyZSBhXG4gICAqIHNsaWNlIHN3YXAgb24gZXZlcnkgcGl4ZWwuIFRoZSBmaW5hbCB2YWx1ZSBhbHNvIGxhbmRzIHZpYSBvblpTbGlkZSAob25TbGlkZUVuZCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25aU2NydWIoejogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuekluZGV4ID0gejtcbiAgICB0aGlzLnNjcnViYmVyLnNjcnViKHopO1xuICB9XG5cbiAgLyoqIE1vdmUgdGhlIGRpc3BsYXllZCBzbGljZSBieSBgZGVsdGFgLCBjbGFtcGVkIHRvIHRoZSBzdGFjayBib3VuZHMuICovXG4gIHN0ZXBTbGljZShkZWx0YTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IE1hdGgubWluKHRoaXMubWF4SW5kZXgsIE1hdGgubWF4KDAsIHRoaXMuekluZGV4ICsgZGVsdGEpKTtcbiAgICBpZiAobmV4dCA9PT0gdGhpcy56SW5kZXgpIHJldHVybjtcbiAgICB0aGlzLm9uWlNsaWRlKG5leHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbG9hZEFuZFBsb3QoKSB7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcodHJ1ZSk7XG4gICAgLy8gUmUtZHJpdmUgdGhlIHJlbmRlciBwaXBlbGluZSBmcm9tIHRoZSBjdXJyZW50IGltYWdlIGluZm8gKHRoZSBzb3VyY2Ugb2ZcbiAgICAvLyB0cnV0aCwgd2l0aCByZWFsIHVybHMvZmlsZU5hbWUpLiBEb24ndCB1c2UgcGxvdFNlcnZpY2UucmVsb2FkQW5kUGxvdCgpOlxuICAgIC8vIHRoYXQgcmVidWlsZHMgdGhlIGluZm8gZnJvbSB0aGUgcmVuZGVyZXIncyBpbnRlcm5hbCBzdGF0ZSwgd2hpY2ggY2FuIGJlXG4gICAgLy8gc3RhbGUgKGUuZy4gYWZ0ZXIgc3dpdGNoaW5nIHBsb3QgdHlwZSBJbWFnZSAtPiBIZWF0bWFwKSBhbmQgcmUtZW1pdFxuICAgIC8vIGVtcHR5L29sZCB1cmxzLCBmYWlsaW5nIHRvIGhhbmQgdGhlIGRpdiBvdmVyIHRvIHRoZSBuZXcgcmVuZGVyZXIuXG4gICAgaWYgKHRoaXMuaW1hZ2VJbmZvKSB7XG4gICAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyh0aGlzLmltYWdlSW5mbyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNwYXRpYWwuZGF0YXNldCAmJiAoaXNTcGF0aWFsT21pY3ModGhpcy5wbG90VHlwZSkgfHwgaXNTcGF0aWFsT21pY3MzZCh0aGlzLnBsb3RUeXBlKSkpIHtcbiAgICAgIC8vIEEgc3BhdGlhbCBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlLCBvcGVuZWQgd2l0aCBubyBpbWFnZSBsb2FkZWQgKGEgaG9zdCdzXG4gICAgICAvLyBmaXJzdCB2aWV3KTogdGhlcmUgaXMgbm8gaW1hZ2UgaW5mbyB0byByZS1kcml2ZSwgc28gZHJhdyB0aGUgc3BhdGlhbCBtb2RlIGl0c2VsZi5cbiAgICAgIHZvaWQgdGhpcy5yZW5kZXIucGxvdFdpdGhvdXRJbWFnZSh0aGlzLnNwYXRpYWwuZGF0YXNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVsb2FkQW5kUGxvdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjYW5jZWxMb2FkaW5nKCkge1xuICAgIC8vIFN0b3AgYW55IGluLWZsaWdodCBmcmFtZSBzdHJlYW1pbmcgKG5hcGFyaS1qcyB2b2x1bWUvc3VyZmFjZSBwcmVsb2FkKSBzbyB0aGUgZmV0Y2ggbG9vcHNcbiAgICAvLyBhY3R1YWxseSBhYm9ydCDigJQgY2xlYXJpbmcgdGhlIGZsYWcgYWxvbmUgb25seSByb3V0ZWQgdG8gUGxvdGx5IGFuZCBsZWZ0IG5hcGFyaSBmZXRjaGluZy5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIC8vIFRoZSBjYW5jZWxsZWQgcmVuZGVyIGlzIHN1cGVyc2VkZWQsIG5vdCBqdXN0IGFib3J0ZWQ6IGl0cyBhYm9ydGVkIGxvYWQgbXVzdCBub3RcbiAgICAvLyBjb21lIGJhY2sgYXMgXCJDb3VsZCBub3QgZHJhdyB0aGUgaW1hZ2VcIiwgbm9yIGFwcGx5IFJPSXMgZm9yIGFuIGltYWdlIGxlZnQgdW5zaG93bi5cbiAgICB0aGlzLnJlbmRlci5jYW5jZWwoKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMuaW1nTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRaSW5kZXgodGhpcy56SW5kZXgpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U3RhY2tMb2FkaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb3dubG9hZEltYWdlKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZG93bmxvYWRJbWFnZSgpO1xuICB9XG5cbiAgYXV0b3NjYWxlSW1hZ2UoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5maXRUb1ZpZXcoKTtcbiAgfVxuXG4gIC8qKiBUb29sYmFyIHBpeGVsL3Ntb290aCB0b2dnbGU6IGZsaXAgc21vb3RoaW5nIGFuZCBhcHBseSB0byB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIHByb3RlY3RlZCBvblRvZ2dsZUltYWdlU21vb3RoaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gIXRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkKTtcbiAgfVxuXG4gIHJlc2V0QXhlcygpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0QXhlcygpO1xuICB9XG5cbiAgdG9nZ2xlRHJhZ01vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgdGhpcy50b29scy50b2dnbGUobW9kZSk7XG4gIH1cblxuICAvKiogTGl2ZS11cGRhdGUgdGhlIGlzb3N1cmZhY2UgYXMgdGhlIHJhbmdlIHNsaWRlciBtb3Zlcy4gVGhlIGNvbnRyb2wgaXMgb25seVxuICAgKiAgYXZhaWxhYmxlIHdoZW4gdGhlIGFjdGl2ZSBiYWNrZW5kIHJlbmRlcnMgaXNvc3VyZmFjZXMgKElTT1NVUkZBQ0UgbW9kZSkuICovXG4gIHByb3RlY3RlZCBvbklzb1JhbmdlQ2hhbmdlKHZhbHVlczogbnVtYmVyW10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXZhbHVlcyB8fCB2YWx1ZXMubGVuZ3RoIDwgMikgcmV0dXJuO1xuICAgIHRoaXMuaXNvUmFuZ2UgPSB2YWx1ZXM7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRJc29zdXJmYWNlQ29udHJvbHMoKT8uc2V0SXNvUmFuZ2UodmFsdWVzWzBdLCB2YWx1ZXNbMV0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uV2FuZFNlbnNpdGl2aXR5Q2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnRvb2xzLnNldFdhbmRTZW5zaXRpdml0eSh2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQnJ1c2hTaXplQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnRvb2xzLnNldEJydXNoU2l6ZSh2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnRvb2xzLnNldFZlcnRleEVyYXNlclJhZGl1cyh2YWx1ZSk7XG4gIH1cblxuICB6b29tSW4oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS56b29tSW4oKTtcbiAgfVxuXG4gIHpvb21PdXQoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS56b29tT3V0KCk7XG4gIH1cblxuICBkZWxldGVSZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5kZWxldGVBY3RpdmVTaGFwZSgpO1xuICB9XG5cbiAgLyoqIFVuZG8gdGhlIG1vc3QgcmVjZW50IHJlZ2lvbiBhY3Rpb24gKGppdC11aSM4NSkuIFVwIHRvIDEwIHN0ZXBzIGJhY2suICovXG4gIHByb3RlY3RlZCB1bmRvUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UudW5kbygpO1xuICB9XG5cbiAgLyoqIFJlZG8gdGhlIG1vc3QgcmVjZW50bHkgdW5kb25lIHJlZ2lvbiBhY3Rpb24gKGppdC11aSM4NSkuICovXG4gIHByb3RlY3RlZCByZWRvUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UucmVkbygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlZ2lvbiBzZXQtb3BlcmF0aW9ucyBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gKGppdC11aSM4NSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNlbGVjdEFsbFJlZ2lvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25BY3Rpb25zLnNlbGVjdEFsbCgpO1xuICB9XG4gIG1lcmdlUmVnaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFjdGlvbnMubWVyZ2UoKTtcbiAgfVxuICB1bmdyb3VwUmVnaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFjdGlvbnMudW5ncm91cCgpO1xuICB9XG4gIGludmVyc2VSZWdpb25zKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQWN0aW9ucy5pbnZlcnNlKCk7XG4gIH1cbiAgc2ltcGxpZnlSZWdpb25zKHRocmVzaG9sZFB4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFjdGlvbnMuc2ltcGxpZnkodGhyZXNob2xkUHgpO1xuICB9XG4gIG9wZW5TaW1wbGlmeURpYWxvZygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFjdGlvbnMub3BlblNpbXBsaWZ5RGlhbG9nKCk7XG4gIH1cblxuICAvKiogQm94LXByb21wdGVkIFNBTSBzZWdtZW50YXRpb24gb2YgdGhlIGRyYXduIHJlY3RhbmdsZXMgKGppdC11aSM5MCkuIEEgc3RpY2t5XG4gICAqICBgc2FtYCB0b2FzdCBzaG93cyBsaXZlIHN0YXR1cyArIGEgZG93bmxvYWQgcHJvZ3Jlc3MgYmFyIChmaXJzdCBydW4gcHVsbHMgdGhlXG4gICAqICBlbmNvZGVyLCB+MTcwIE1CKTsgaXQgc3RheXMgb3BlbiB1bnRpbCB0aGUgcnVuIGZpbmlzaGVzIChiYXIgaGl0cyAxMDAlKS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNlZ21lbnRSZWdpb25zKCkge1xuICAgIGF3YWl0IHRoaXMuc2VnbWVudGF0aW9uLnJ1bignU0FNJywgdGhpcy5zYW1Ub29sLCAoKSA9PiB0aGlzLnBsb3RTZXJ2aWNlLnNlZ21lbnRSZWN0YW5nbGVzKCkpO1xuICB9XG5cbiAgLyoqIEF1dG8tc2VnbWVudCBjZWxscyBpbnNpZGUgZWFjaCBkcmF3biByZWN0YW5nbGUgd2l0aCBjZWxscG9zZS1TQU0sIGNsaWVudC1zaWRlXG4gICAqICAoaml0LXVpIzkwKS4gRWFjaCBib3ggaXMgY3JvcHBlZCAoYnJvd3NlciBzbGlkZS1jcm9wKSB0aGVuIHJ1biB0aHJvdWdoIHRoZVxuICAgKiAgY2VsbHBvc2UtanMgbW9kZWw7IHRoZSBzYW1lIHN0aWNreSBgc2FtYCB0b2FzdCArIHByb2dyZXNzIGJhciBpcyByZXVzZWQuICovXG4gIHByb3RlY3RlZCBhc3luYyBzZWdtZW50Q2VsbHBvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5zZWdtZW50YXRpb24ucnVuKCdDZWxscG9zZScsIHRoaXMuY2VsbFNlZ21lbnRUb29sLCAoKSA9PlxuICAgICAgdGhpcy5wbG90U2VydmljZS5zZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBjb250cmlidXRlZCB0b29sIHBhcmFtZXRlcnMgKHNlZSBUb29sUGFyYW1zTW9kZWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwYXJhbXNGb3IodG9vbElkOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMudG9vbFBhcmFtcy5wYXJhbXNGb3IodG9vbElkKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Ub29sTW9kZWxDaGFuZ2UoZTogeyB0b29sSWQ6IHN0cmluZzsgbW9kZWxJZDogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnRvb2xQYXJhbXMuc2V0TW9kZWwoZS50b29sSWQsIGUubW9kZWxJZCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9wZW5Ub29sUGFyYW1zKHRvb2xJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b29sUGFyYW1zLm9wZW4odG9vbElkKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xvc2VUb29sUGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMudG9vbFBhcmFtcy5jbG9zZSgpO1xuICB9XG4gIHByb3RlY3RlZCByZXNldFRvb2xQYXJhbXModG9vbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2xQYXJhbXMucmVzZXQodG9vbElkKTtcbiAgfVxuXG4gIC8qKiBSdW4gYSBjb250cmlidXRlZCB0b29sIG92ZXIgdGhlIGN1cnJlbnQgdmlldy4gTm8gcHJvbXB0OiB0aGVzZSBzd2VlcCB0aGVcbiAgICogIHdob2xlIHZpZXcgcmF0aGVyIHRoYW4gYmVpbmcgcG9pbnRlZCBhdCBzb21ldGhpbmcuIFJldXNlcyB0aGUgc2hhcmVkXG4gICAqICBzZWdtZW50YXRpb24gdG9hc3Qgc28gcHJvZ3Jlc3MgcmVhZHMgdGhlIHNhbWUgYXMgdGhlIFNBTS9jZWxscG9zZSB0b29scy4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJ1blRvb2wodG9vbElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b29sID0gdGhpcy50b29sUGFyYW1zLmZpbmQodG9vbElkKTtcbiAgICBpZiAoIXRvb2wpIHJldHVybjtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnRvb2xQYXJhbXMucnVuUGFyYW1zKHRvb2wpO1xuICAgIGF3YWl0IHRoaXMuc2VnbWVudGF0aW9uLnJ1bih0b29sLmxhYmVsLCB0b29sLnByb2dyZXNzLCAoKSA9PiB0b29sLnJ1bih0aGlzLnBsb3RTZXJ2aWNlLCBwYXJhbXMpKTtcbiAgfVxuXG4gIC8qKiBQaWNrIHRoZSBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBwcm90ZWN0ZWQgb25TYW1Nb2RlbENoYW5nZShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zYW1Nb2RlbElkID0gaWQ7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cblxuICAvKiogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uIHRvIGEgc21vb3RoIGJlemllciBjdXJ2ZS4gKi9cbiAgdG9CZXppZXJSZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25PdmVybGF5KCk/LnNldFNlbGVjdGVkQmV6aWVyKHRydWUpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgdGhlIHNlbGVjdGVkIHJlZ2lvbiBiYWNrIHRvIGEgc3RyYWlnaHQtZWRnZWQgcG9seWdvbi4gKi9cbiAgdG9Qb2x5Z29uUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uT3ZlcmxheSgpPy5zZXRTZWxlY3RlZEJlemllcihmYWxzZSk7XG4gIH1cblxuICAvKiogVGhlIHJpZ2h0LWNsaWNrIG1lbnUgZm9yIHRoZSBjdXJyZW50IHZpZXcsIGFybWVkIG1vZGUgYW5kIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBidWlsZENvbnRleHRNZW51SXRlbXMoKTogTWVudUl0ZW1bXSB7XG4gICAgcmV0dXJuIGJ1aWxkQ29udGV4dE1lbnUodGhpcy5jb250ZXh0TWVudVN0YXRlKCksIHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb250ZXh0TWVudVN0YXRlKCk6IENvbnRleHRNZW51U3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICBpc0hlYXRtYXA6IHRoaXMuaXNIZWF0bWFwLFxuICAgICAgYmFzZVBsb3RUeXBlOiB0aGlzLmJhc2VQbG90VHlwZSxcbiAgICAgIGFjdGl2ZURyYWdNb2RlOiB0aGlzLmFjdGl2ZURyYWdNb2RlLFxuICAgICAgYWN0aXZlU3VyZmFjZTNkTW9kZTogdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlLFxuICAgICAgcmVnaW9uczogdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCksXG4gICAgICBzZWxlY3RlZEluZGljZXM6IHRoaXMucmVnaW9uQWN0aW9ucy5zZWxlY3RlZEluZGljZXMsXG4gICAgICBjYW5Vbmdyb3VwOiAocikgPT4gdGhpcy5yZWdpb25PcHMuY2FuVW5ncm91cChyKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIDNEIHNjZW5lIGludGVyYWN0aW9uIG1vZGUgKG9yYml0IC8gdHVybnRhYmxlIC8gcGFuIC8gem9vbSk7IG5vLW9wIG9uIGEgMkQtb25seSBiYWNrZW5kLiAqL1xuICB0b2dnbGVTdXJmYWNlM2RNb2RlKG1vZGU6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9IG1vZGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cblxuICByZXNldFN1cmZhY2VDYW1lcmEoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRTdXJmYWNlM2RDb250cm9scygpPy5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIG5hcGFyaSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyAodm9sdW1lL2lzb3N1cmZhY2UpLiBOby1vcCBvbiBiYWNrZW5kc1xuICAgKiAgdGhhdCBkb24ndCByZW5kZXIgb25lICh0aGUgY29udHJvbCBtZXRob2QgaXMgb3B0aW9uYWwpLiAqL1xuICBwcm90ZWN0ZWQgdG9nZ2xlQXhlcygpIHtcbiAgICB0aGlzLmF4ZXNWaXNpYmxlID0gIXRoaXMuYXhlc1Zpc2libGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRBeGVzVmlzaWJsZT8uKHRoaXMuYXhlc1Zpc2libGUpO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgbmFwYXJpIHN1cmZhY2Ugd2lyZWZyYW1lIChlZGdlcyB2cyBmaWxsZWQpLiBOby1vcCBvbiBiYWNrZW5kcyB3aXRob3V0IGEgc3VyZmFjZS4gKi9cbiAgcHJvdGVjdGVkIHRvZ2dsZVdpcmVmcmFtZSgpIHtcbiAgICB0aGlzLndpcmVmcmFtZUFjdGl2ZSA9ICF0aGlzLndpcmVmcmFtZUFjdGl2ZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnNldFdpcmVmcmFtZT8uKHRoaXMud2lyZWZyYW1lQWN0aXZlKTtcbiAgfVxuXG4gIC8qKiBDaGFuZ2UgdGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IuIERlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YSwgc28gdGhpc1xuICAgKiAgcmUtcGxvdHMgdGhlIGN1cnJlbnQgM0QgdHlwZSBhdCB0aGUgbmV3IHJlc29sdXRpb24gKHVubGlrZSBheGVzL3dpcmVmcmFtZSwgd2hpY2ggYXJlIGxpdmUpLiAqL1xuICBwcm90ZWN0ZWQgc2VsZWN0UmVzb2x1dGlvbihzY2FsZTogbnVtYmVyKSB7XG4gICAgaWYgKHNjYWxlID09PSB0aGlzLnJlc29sdXRpb25TY2FsZSkgcmV0dXJuO1xuICAgIHRoaXMucmVzb2x1dGlvblNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRSZXNvbHV0aW9uU2NhbGU/LihzY2FsZSk7XG4gICAgdGhpcy5yZWxvYWRBbmRQbG90KCk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgcGxvdCB0eXBlIChoZWF0bWFwLCBzdXJmYWNlLCBjb250b3VyLCBzY2F0dGVyLCBsaW5lLFxuICAgKiBzY2F0dGVyM2QsIGlzb3N1cmZhY2UpLiBLZWVwcyBgaXNIZWF0bWFwYCBhcyB0aGUgMkQtdnMtM0QgZmxhZyB0aGUgcmVzdCBvZlxuICAgKiB0aGUgdG9vbGJhci9jb250ZXh0LW1lbnUgbG9naWMgcmVsaWVzIG9uLCBkZWFjdGl2YXRlcyAyRC1vbmx5IHRvb2xzIHdoZW5cbiAgICogbW92aW5nIHRvIGEgM0QgdHlwZSwgdGhlbiByZS1wbG90cy5cbiAgICovXG4gIG9uU2VsZWN0UGxvdFR5cGUoc2VsZWN0ZWQ6IFBsb3RUeXBlSWQpIHtcbiAgICAvLyBBbHNvIGNhbGxlZCBieSB0aGUgaG9zdCBkaXJlY3RseSwgb3V0c2lkZSB0aGlzIHZpZXcncyBldmVudHM6IHRoZSBzZWxlY3RvciwgdGhlXG4gICAgLy8gdG9vbGJhcidzIHRvb2wgZ3JvdXBzIGFuZCB0aGUgZGlhbG9ncyBhbGwgZm9sbG93IHRoZSB0eXBlLlxuICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgIC8vIEEgY29udHJpYnV0ZWQgaWQgd2hvc2UgcHJvdmlkZXIgaXMgZ29uZSAoZS5nLiByZXN0b3JlZCBmcm9tIGEgcHJldmlvdXNcbiAgICAvLyBzZXNzaW9uKSBoYXMgbm90aGluZyB0byBhY3RpdmF0ZSDigJQgdGFrZSB0aGUgZGVmYXVsdCBJbWFnZSB2aWV3IGluc3RlYWQuXG4gICAgaWYgKCFpc0J1aWx0aW5QbG90VHlwZShzZWxlY3RlZCkgJiYgIXRoaXMucGxvdE1vZGVzLmZpbmQoc2VsZWN0ZWQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt2aXN1YWxpemVyXSB1bmtub3duIHBsb3QgdHlwZSAnJHtzZWxlY3RlZH0nIOKAlCBzaG93aW5nICcke1Bsb3RUeXBlLklNQUdFfScgaW5zdGVhZC5gKTtcbiAgICAgIHNlbGVjdGVkID0gUGxvdFR5cGUuSU1BR0U7XG4gICAgfVxuICAgIC8vIEFuIGV4cGxpY2l0IGNob2ljZSByZXRyaWVzIGEgbW9kZSB3aG9zZSBlYXJsaWVyIGNsZWFudXAgZmFpbGVkOyBvbmx5XG4gICAgLy8gYXV0b21hdGljIHJlLWFjdGl2YXRpb25zIChyZS1yZW5kZXIsIGltYWdlIHN3aXRjaCkgZmFsbCBiYWNrIGZvciB0aGF0LlxuICAgIHRoaXMucGxvdE1vZGVzLmNsZWFyQ2xlYW51cEZhaWx1cmVzKCk7XG4gICAgLy8gV2hhdGV2ZXIgd2FzIHNlbGVjdGVkIGJlZm9yZSwgYSBjb250cmlidXRlZCBzZXNzaW9uIGVuZHMgYmVmb3JlIHRoZSBuZXh0XG4gICAgLy8gbW9kZSBkcmF3cy4gKFJlLXNlbGVjdGluZyB0aGUgc2FtZSBjb250cmlidXRlZCBtb2RlIHJlLXBsb3RzLCBzbyBpdCBnZXRzIGFcbiAgICAvLyBmcmVzaCBzZXNzaW9uIHRvby4pXG4gICAgdGhpcy5wbG90TW9kZXMuZGVhY3RpdmF0ZSgpO1xuICAgIC8vIEV2ZXJ5dGhpbmcgYmVsb3cgZGVjaWRlcyBob3cgdG8gUkVOREVSLCBzbyBpdCB3b3JrcyBvbiB0aGUgYnVpbHQtaW4gdHlwZVxuICAgIC8vIHRoYXQgZHJhd3MgYHNlbGVjdGVkYDogYSBjb250cmlidXRlZCBtb2RlIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGl0cyBiYXNlLlxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnBsb3RNb2Rlcy5iYXNlVHlwZU9mKHNlbGVjdGVkKTtcbiAgICAvLyBBIGRpYWxvZyB0b29sIGRyYXdzIG92ZXIgdGhlIEltYWdlIHZpZXc6IGxlYXZpbmcgaXQgY2xvc2VzIHRoZSBkaWFsb2cuIFN0YXlpbmdcbiAgICAvLyBvbiBpdCwgdGhlIHNlc3Npb24gZW5kcyBoZXJlIGFuZCByZXN0YXJ0cyBvbmNlIHRoZSByZS1wbG90IGxhbmRzLlxuICAgIGlmICh0eXBlID09PSBQbG90VHlwZS5JTUFHRSkgdGhpcy5jb250cmlidXRpb25zLnRvb2xEaWFsb2dzLmRlYWN0aXZhdGUoKTtcbiAgICBlbHNlIHRoaXMuY2xvc2VEaWFsb2dUb29sKCk7XG4gICAgdGhpcy5wbG90VHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZFBsb3RUeXBlSWQgPSBzZWxlY3RlZDtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gaXNCdWlsdGluUGxvdFR5cGUoc2VsZWN0ZWQpXG4gICAgICA/IHRoaXMucGxvdFR5cGVNZW51LmZpbmQoKGQpID0+IGQudHlwZSA9PT0gdHlwZSlcbiAgICAgIDogZ2V0UGxvdFR5cGVEZXNjcmlwdG9yKHR5cGUpO1xuICAgIGNvbnN0IGlzM2QgPSBkZXNjcmlwdG9yPy5kaW1lbnNpb25zID09PSAnM2QnO1xuICAgIHRoaXMuaXNIZWF0bWFwID0gIWlzM2Q7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0eXBlKTtcbiAgICAvLyBTd2l0Y2hpbmcgcGxvdCB0eXBlIGNhbmNlbHMgdGhlIGFjdGl2ZSB0b29sIOKAlCBub3QgZXZlcnkgdHlwZSBzdXBwb3J0cyB0aGVcbiAgICAvLyBzYW1lIHRvb2xzIChsaW5lL3NjYXR0ZXIgY2hhcnRzIGFuZCAzRCBzY2VuZXMgaGF2ZSBubyBib3ggem9vbSBvciByZWdpb25cbiAgICAvLyBkcmF3aW5nKSwgc28gbGVhdmluZyBhIHRvb2wgYXJtZWQgd291bGQgbWlzYmVoYXZlIG9uIHRoZSBuZXcgcGxvdC5cbiAgICB0aGlzLnRvb2xzLmRlYWN0aXZhdGUoKTtcbiAgICBpZiAoaXMzZCkge1xuICAgICAgdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gICAgfVxuICAgIC8vIG5hcGFyaS1qcyB2b2x1bWUvaXNvc3VyZmFjZSBhc3NlbWJsZSB0aGVpciBvd24gM0QgdGV4dHVyZSBmcm9tIHRoZSBzbGljZSBlbmRwb2ludCwgc29cbiAgICAvLyB0aGV5IHRha2UgdGhlIG5vcm1hbCByZS1wbG90IHBhdGgg4oCUIE5PVCBQbG90bHkncyBzdGFjay1mcmFtZSBsb2FkZXIgKHdob3NlIFwiTG9hZGluZ1xuICAgIC8vIGZyYW1lc1wiIG92ZXJsYXkgd291bGQgbmV2ZXIgY2xlYXIsIHNpbmNlIFBsb3RseSBpc24ndCB0aGUgYWN0aXZlIGJhY2tlbmQpIChqaXQtdWkjMTAyKS5cbiAgICBjb25zdCBpc05hcGFyaSA9IHR5cGUgPT09IFBsb3RUeXBlLk5BUEFSSV9JTUFHRSB8fCBpc05hcGFyaTNkKHR5cGUpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5yZXF1aXJlc1N0YWNrICYmICFpc05hcGFyaSkge1xuICAgICAgLy8gVm9sdW1lIHR5cGVzIChpc29zdXJmYWNlLCBzY2F0dGVyM2QpIG5lZWQgdGhlIHdob2xlIHotc3RhY2sgbG9hZGVkIGFzIGFcbiAgICAgIC8vIDNEIGFycmF5LCBhbmQgdGhleSBhbHdheXMgcmVuZGVyIG9uIFBsb3RseS4gRHJpdmUgdGhlIHN0YWNrIHJlbG9hZFxuICAgICAgLy8gZGlyZWN0bHkgdGhyb3VnaCB0aGUgaW1hZ2UtaW5mbyBzdHJlYW0gcmF0aGVyIHRoYW4gdGhlIGFjdGl2ZSByZW5kZXJlcidzXG4gICAgICAvLyBzZXRTaG93U3RhY2s6IHdoZW4gT3BlblNlYWRyYWdvbiBvd25zIHRoZSBJbWFnZSB2aWV3IGl0cyBzZXRTaG93U3RhY2sgaXNcbiAgICAgIC8vIGEgbm8tb3AsIHNvIHRoZSByZWxvYWQgbmV2ZXIgZmlyZWQgYW5kIHRoZSBsb2FkZXIgc3B1biBmb3JldmVyLiBXZSBhcm1cbiAgICAgIC8vIFBsb3RseSdzIHN0YWNrLWxvYWRpbmcgZmxhZyAoa2VlcHMgaXRzIGZyYW1lLWZldGNoIGxvb3AgYWxpdmUpIGFuZFxuICAgICAgLy8gcmUtZW1pdCB0aGUgaW1hZ2UgaW5mbyB3aXRoIHNob3dTdGFjayBvbiBzbyB0aGUgcGlwZWxpbmUgcmVsb2FkcyBvblxuICAgICAgLy8gUGxvdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggYmFja2VuZCB3YXMgb24gc2NyZWVuLlxuICAgICAgdGhpcy5zdGFja0xvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRTdGFja0xvYWRpbmcodHJ1ZSk7XG4gICAgICBpZiAodGhpcy5pbWFnZUluZm8pIHtcbiAgICAgICAgLy8gQSBjb3B5OiB0aGUgaW1hZ2UgaW5mbyBtYXkgYmUgdGhlIGhvc3QncyBvd24gKHBvc3NpYmx5IGZyb3plbikgb2JqZWN0LlxuICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyh7IC4uLnRoaXMuaW1hZ2VJbmZvLCBzaG93U3RhY2s6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVsb2FkQW5kUGxvdCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGRpYWxvZyB0b29scyAoVE9PTEJBUl9UT09MUywga2luZDogJ2RpYWxvZycpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgdG9vbGJhciBidXR0b246IG9wZW4gdGhlIHRvb2wncyBkaWFsb2csIG9yIGNsb3NlIGl0IGlmIGl0IGlzIG9wZW4uICovXG4gIHByb3RlY3RlZCB0b2dnbGVEaWFsb2dUb29sKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyaWJ1dGlvbnMudG9nZ2xlRGlhbG9nVG9vbChpZCk7XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIG9wZW4gZGlhbG9nIHRvb2w6IGl0cyBib2R5IGlzIHRvcm4gZG93biwgdGhlbiBpdHMgc2Vzc2lvbiBlbmRzLiAqL1xuICBwcm90ZWN0ZWQgY2xvc2VEaWFsb2dUb29sKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJpYnV0aW9ucy5jbG9zZURpYWxvZ1Rvb2woKTtcbiAgfVxuXG4gIC8qKiBXaGVyZSB0aGUgb3BlbiBkaWFsb2cgdG9vbCdzIGhvc3QgZWxlbWVudCBpcyBhdHRhY2hlZCBvbmNlIGl0cyBkaWFsb2cgcmVuZGVycy4gKi9cbiAgQFZpZXdDaGlsZCgndG9vbERpYWxvZ1Nsb3QnKVxuICBzZXQgdG9vbERpYWxvZ1Nsb3QocmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY29udHJpYnV0aW9ucy5hdHRhY2hUb29sRGlhbG9nU2xvdChyZWY/Lm5hdGl2ZUVsZW1lbnQpO1xuICB9XG59XG4iLCI8IS0tIFNBTSB0b2FzdDogbGl2ZSBzdGF0dXMgKyBlbmNvZGVyLWRvd25sb2FkIHByb2dyZXNzIGJhciAoaml0LXVpIzkwKS4gU3RpY2t5XG4gICAgIHdoaWxlIGEgc2VnbWVudCBydW5zOyBzdGF5cyBvcGVuIHVudGlsIHRoZSBiYXIgcmVhY2hlcyAxMDAlIGFuZCB0aGUgcnVuIGVuZHMuIC0tPlxuPHAtdG9hc3QgW2tleV09XCJzYW1Ub2FzdEtleVwiIHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+XG4gIDxuZy10ZW1wbGF0ZSBsZXQtbWVzc2FnZSBwVGVtcGxhdGU9XCJtZXNzYWdlXCI+XG4gICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IG1pbi13aWR0aDogMTZyZW1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGQgbWItMVwiPnt7IG1lc3NhZ2Uuc3VtbWFyeSB9fTwvZGl2PlxuICAgICAgPGRpdj57eyBzZWdtZW50YXRpb24uc3RhdHVzIHx8IG1lc3NhZ2UuZGV0YWlsIH19PC9kaXY+XG4gICAgICA8cC1wcm9ncmVzc0JhclxuICAgICAgICAqbmdJZj1cInNlZ21lbnRhdGlvbi5kb3dubG9hZGluZ1wiXG4gICAgICAgIFt2YWx1ZV09XCJzZWdtZW50YXRpb24ucHJvZ3Jlc3NcIlxuICAgICAgICBzdHlsZUNsYXNzPVwibXQtMiBzYW0tcHJvZ3Jlc3NcIlxuICAgICAgPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgIDxwLXByb2dyZXNzQmFyXG4gICAgICAgICpuZ0lmPVwic2VnbWVudGF0aW9uLmJ1c3kgJiYgIXNlZ21lbnRhdGlvbi5kb3dubG9hZGluZ1wiXG4gICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICAgc3R5bGVDbGFzcz1cIm10LTJcIlxuICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICc0cHgnIH1cIlxuICAgICAgPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC10b2FzdD5cblxuPCEtLSBSZXN1bHQvZXJyb3Igbm90aWNlcyBmcm9tIHRoZSBsaWJyYXJ5IGl0c2VsZiAoc2VnbWVudGF0aW9uIG91dGNvbWUsIHJlZ2lvblxuICAgICB2YWxpZGF0aW9uKS4gUmVuZGVyZWQgaGVyZSBzbyB0aGV5IGRvIG5vdCBkZXBlbmQgb24gdGhlIGhvc3QgbW91bnRpbmcgYVxuICAgICBrZXlsZXNzIDxwLXRvYXN0PiDigJQgd2l0aG91dCB0aGlzIHRoZSBtZXNzYWdlcyB3ZW50IG5vd2hlcmUgaW4gYW55IGhvc3QgYnV0XG4gICAgIGppdC11aSwgYW5kIGEgZmFpbGVkIHJ1biBsb29rZWQgbGlrZSBhIGJ1dHRvbiB0aGF0IGRpZCBub3RoaW5nLiAtLT5cbjxwLXRvYXN0IFtrZXldPVwicmVzdWx0VG9hc3RLZXlcIiBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiPjwvcC10b2FzdD5cblxuPCEtLSBTaGFyZWQgb3V0bGV0cyBmb3Igbm90aWNlcyByYWlzZWQgd2hlcmUgdGhlcmUgaXMgbm8gcGVyLWluc3RhbmNlIGtleSB0byB1c2U6XG4gICAgIHRoZSByb290LXByb3ZpZGVkIFBsb3RseVNlcnZpY2UgYW5kIHRoZSByZWdpb24tZWRpdG9yIGRpYWxvZy4gUmVuZGVyZWQgYnkgYVxuICAgICBzaW5nbGUgdmlzdWFsaXplciAob3duc1NoYXJlZFRvYXN0cykgc28gYSBtZXNzYWdlIGZyb20gdGhlIHJvb3Qgc2VydmljZSBpc1xuICAgICBub3Qgc2hvd24gb25jZSBwZXIgbGl2ZSB2aWV3ZXIuIC0tPlxuPHAtdG9hc3QgKm5nSWY9XCJvd25zU2hhcmVkVG9hc3RzXCIgW2tleV09XCJ2aXpUb2FzdEtleVwiPjwvcC10b2FzdD5cbjxwLXRvYXN0ICpuZ0lmPVwib3duc1NoYXJlZFRvYXN0c1wiIFtrZXldPVwidml6QWxlcnRUb2FzdEtleVwiIHBvc2l0aW9uPVwiY2VudGVyXCI+PC9wLXRvYXN0PlxuXG48IS0tIFRvb2xiYXIgZG9jazogZG9ja2VkIGFjcm9zcyB0aGUgdG9wIGJ5IGRlZmF1bHQ7IGRyYWcgdGhlIGhhbmRsZSB0byBkZXRhY2hcbiAgICAgaXQgaW50byBhIGZsb2F0aW5nLCBtb3ZhYmxlIHdpbmRvdyAoZnJlZXMgdGhlIHRvcCByb3cgZm9yIHRoZSBpbWFnZSkuIC0tPlxuPGRpdlxuICBjbGFzcz1cInRvb2xiYXItZG9ja1wiXG4gIFtjbGFzcy5mbG9hdGluZ109XCJ0b29sYmFyRmxvYXRpbmdcIlxuICBbc3R5bGUubGVmdC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnggOiBudWxsXCJcbiAgW3N0eWxlLnRvcC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnkgOiBudWxsXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidG9vbGJhci1kcmFnLWhhbmRsZVwiXG4gICAgW3ZpekZsb2F0aW5nRHJhZ109XCJ0b29sYmFyRHJhZ09yaWdpblwiXG4gICAgKHZpekZsb2F0aW5nRHJhZ01vdmUpPVwidG9vbGJhclBvcyA9ICRldmVudFwiXG4gICAgcFRvb2x0aXA9XCJEcmFnIHRvIGZsb2F0IHRoZSB0b29sYmFyXCJcbiAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICA+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1iYXJzXCI+PC9pPlxuICA8L2Rpdj5cbiAgPHBsb3R0aW5nLXRvb2xiYXJcbiAgICBbaW1hZ2VJbmZvXT1cImltYWdlSW5mb1wiXG4gICAgW2hhc1NwYXRpYWxEYXRhc2V0XT1cImhhc1NwYXRpYWxEYXRhc2V0XCJcbiAgICBbcGxvdFR5cGVPcHRpb25zXT1cInBsb3RUeXBlTWVudVwiXG4gICAgW3NlbGVjdGVkUGxvdFR5cGVdPVwic2VsZWN0ZWRQbG90VHlwZUlkXCJcbiAgICBbYmFzZVBsb3RUeXBlXT1cImJhc2VQbG90VHlwZVwiXG4gICAgW2lzb1JhbmdlXT1cImlzb1JhbmdlXCJcbiAgICBbbWF4SW5kZXhdPVwibWF4SW5kZXhcIlxuICAgIFt6SW5kZXhdPVwiekluZGV4XCJcbiAgICBbaXNIZWF0bWFwXT1cImlzSGVhdG1hcFwiXG4gICAgW2lzM2RSZWdpb25zXT1cImlzU3BhdGlhbDNkTW9kZVwiXG4gICAgW2lzVm9sdW1lVmlld109XCJpc1ZvbHVtZVZpZXdcIlxuICAgIFtzbGljZUVkaXRvcl09XCJzbGljZUVkaXRvclwiXG4gICAgW2FjdGl2ZURyYWdNb2RlXT1cImFjdGl2ZURyYWdNb2RlXCJcbiAgICBbYWN0aXZlU3VyZmFjZTNkTW9kZV09XCJhY3RpdmVTdXJmYWNlM2RNb2RlXCJcbiAgICBbYXhlc1Zpc2libGVdPVwiYXhlc1Zpc2libGVcIlxuICAgIFt3aXJlZnJhbWVBY3RpdmVdPVwid2lyZWZyYW1lQWN0aXZlXCJcbiAgICBbcmVzb2x1dGlvblNjYWxlXT1cInJlc29sdXRpb25TY2FsZVwiXG4gICAgW3dhbmRTZW5zaXRpdml0eV09XCJ3YW5kU2Vuc2l0aXZpdHlcIlxuICAgIFticnVzaFNpemVdPVwiYnJ1c2hTaXplXCJcbiAgICBbc2FtTW9kZWxzXT1cInNhbU1vZGVsc1wiXG4gICAgW3NhbU1vZGVsSWRdPVwic2FtTW9kZWxJZFwiXG4gICAgW2NvbnRyaWJ1dGVkVG9vbHNdPVwiY29udHJpYnV0ZWRUb29sc1wiXG4gICAgW2RpYWxvZ1Rvb2xzXT1cImRpYWxvZ1Rvb2xzXCJcbiAgICBbb3BlbkRpYWxvZ1Rvb2xJZF09XCJvcGVuRGlhbG9nVG9vbElkXCJcbiAgICAodG9nZ2xlRGlhbG9nVG9vbCk9XCJ0b2dnbGVEaWFsb2dUb29sKCRldmVudClcIlxuICAgIFt0b29sTW9kZWxJZHNdPVwidG9vbFBhcmFtcy50b29sTW9kZWxJZHNcIlxuICAgIFt2ZXJ0ZXhFcmFzZXJSYWRpdXNdPVwidmVydGV4RXJhc2VyUmFkaXVzXCJcbiAgICBbY2FuVW5kb109XCJyZWdpb25BY3Rpb25zLmNhblVuZG9cIlxuICAgIFtjYW5SZWRvXT1cInJlZ2lvbkFjdGlvbnMuY2FuUmVkb1wiXG4gICAgW3Rvb2xzXT1cInRvb2xiYXJUb29sc1wiXG4gICAgW2ltYWdlU21vb3RoaW5nRW5hYmxlZF09XCJpbWFnZVNtb290aGluZ0VuYWJsZWRcIlxuICAgIChzZWxlY3RQbG90VHlwZSk9XCJvblNlbGVjdFBsb3RUeXBlKCRldmVudClcIlxuICAgICh0b2dnbGVJbWFnZVNtb290aGluZyk9XCJvblRvZ2dsZUltYWdlU21vb3RoaW5nKClcIlxuICAgIChhZGRQcm9maWxlTGluZSk9XCJhZGRQcm9maWxlTGluZSgpXCJcbiAgICAoaXNvUmFuZ2VDaGFuZ2UpPVwib25Jc29SYW5nZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAob3BlbkNoYW5uZWxIaXN0b2dyYW0pPVwib3BlbkNoYW5uZWxIaXN0b2dyYW0oKVwiXG4gICAgKG9wZW5TcGF0aWFsQ29udHJvbHMpPVwib3BlblNwYXRpYWxDb250cm9scygpXCJcbiAgICAob3BlblJlZ2lvbkVkaXRvcik9XCJvcGVuUmVnaW9uRWRpdG9yKClcIlxuICAgICh0b2dnbGVTbGljZUVkaXRvcik9XCJ0b2dnbGVTbGljZUVkaXRvcigpXCJcbiAgICAoc2VsZWN0U3RhY2tPcHRpb24pPVwic2VsZWN0U3RhY2tPcHRpb24oJGV2ZW50KVwiXG4gICAgKHpTY3J1Yik9XCJvblpTY3J1YigkZXZlbnQpXCJcbiAgICAoelNsaWRlKT1cIm9uWlNsaWRlKCRldmVudClcIlxuICAgICh6SW5kZXhJbnB1dCk9XCJ6SW5kZXggPSAkZXZlbnQ7IHVwZGF0ZVpJbmRleCgpXCJcbiAgICAocmVsb2FkQW5kUGxvdCk9XCJyZWxvYWRBbmRQbG90KClcIlxuICAgIChkb3dubG9hZEltYWdlKT1cImRvd25sb2FkSW1hZ2UoKVwiXG4gICAgKGF1dG9zY2FsZUltYWdlKT1cImF1dG9zY2FsZUltYWdlKClcIlxuICAgICh0b2dnbGVEcmFnTW9kZSk9XCJ0b2dnbGVEcmFnTW9kZSgkZXZlbnQpXCJcbiAgICAoem9vbUluKT1cInpvb21JbigpXCJcbiAgICAoem9vbU91dCk9XCJ6b29tT3V0KClcIlxuICAgICh0b2dnbGVTdXJmYWNlM2RNb2RlKT1cInRvZ2dsZVN1cmZhY2UzZE1vZGUoJGV2ZW50KVwiXG4gICAgKHJlc2V0U3VyZmFjZUNhbWVyYSk9XCJyZXNldFN1cmZhY2VDYW1lcmEoKVwiXG4gICAgKHRvZ2dsZUF4ZXMpPVwidG9nZ2xlQXhlcygpXCJcbiAgICAodG9nZ2xlV2lyZWZyYW1lKT1cInRvZ2dsZVdpcmVmcmFtZSgpXCJcbiAgICAoc2VsZWN0UmVzb2x1dGlvbik9XCJzZWxlY3RSZXNvbHV0aW9uKCRldmVudClcIlxuICAgIChkZWxldGVSZWdpb24pPVwiZGVsZXRlUmVnaW9uKClcIlxuICAgICh1bmRvUmVnaW9uKT1cInVuZG9SZWdpb24oKVwiXG4gICAgKHJlZG9SZWdpb24pPVwicmVkb1JlZ2lvbigpXCJcbiAgICAoc2VnbWVudFJlZ2lvbnMpPVwic2VnbWVudFJlZ2lvbnMoKVwiXG4gICAgKHNlZ21lbnRDZWxscG9zZSk9XCJzZWdtZW50Q2VsbHBvc2UoKVwiXG4gICAgKHNhbU1vZGVsQ2hhbmdlKT1cIm9uU2FtTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHJ1blRvb2wpPVwicnVuVG9vbCgkZXZlbnQpXCJcbiAgICAodG9vbE1vZGVsQ2hhbmdlKT1cIm9uVG9vbE1vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgIChvcGVuVG9vbFBhcmFtcyk9XCJvcGVuVG9vbFBhcmFtcygkZXZlbnQpXCJcbiAgICAod2FuZFNlbnNpdGl2aXR5Q2hhbmdlKT1cIm9uV2FuZFNlbnNpdGl2aXR5Q2hhbmdlKCRldmVudClcIlxuICAgIChicnVzaFNpemVDaGFuZ2UpPVwib25CcnVzaFNpemVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSk9XCJvblZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSgkZXZlbnQpXCJcbiAgPlxuICAgIDwhLS0gSG9zdC1wcm9qZWN0ZWQgY3VzdG9tIHRvb2xiYXIgYnV0dG9ucywgZm9yd2FyZGVkIGludG8gdGhlIHRvb2xiYXIuIC0tPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9wbG90dGluZy10b29sYmFyPlxuICA8cC1idXR0b25cbiAgICAqbmdJZj1cInRvb2xiYXJGbG9hdGluZ1wiXG4gICAgY2xhc3M9XCJ0b29sYmFyLWRvY2stYnRuXCJcbiAgICBpY29uPVwicGkgcGktdGh1bWJ0YWNrXCJcbiAgICBzaXplPVwic21hbGxcIlxuICAgIFt0ZXh0XT1cInRydWVcIlxuICAgIHBUb29sdGlwPVwiRG9jayB0byB0b3BcIlxuICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgKG9uQ2xpY2spPVwiZG9ja1Rvb2xiYXIoKVwiXG4gID5cbiAgPC9wLWJ1dHRvbj5cbjwvZGl2PlxuXG48cC1jb250ZXh0TWVudSAjY20gW21vZGVsXT1cImNvbnRleHRNZW51SXRlbXNcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtY29udGV4dE1lbnU+XG48IS0tIE5vIGBoLWZ1bGxgIGhlcmU6IFByaW1lRmxleCdzIGhlaWdodDoxMDAlICFpbXBvcnRhbnQgbWFkZSAjcGxvdCBhcyB0YWxsIGFzXG4gICAgIHRoZSB3aG9sZSBob3N0LCBzbyB1bmRlciB0aGUgZG9ja2VkIHRvb2xiYXIgaXRzIGJvdHRvbSB0b29sYmFyLWhlaWdodCBzdHJpcFxuICAgICAoaW5jbC4gdGhlIE9TRCBzY2FsZSBiYXIgYXQgYm90dG9tLWxlZnQpIHdhcyBjbGlwcGVkIGJ5IHRoZSBob3N0J3NcbiAgICAgb3ZlcmZsb3c6aGlkZGVuLiBUaGUgY29tcG9uZW50IHN0eWxlc2hlZXQgc2l6ZXMgaXQgKC52aXotcGxvdCB7IGZsZXg6IDEgfSkuIC0tPlxuPCEtLSBUaGUgcGxvdCwgYW5kIHdoaWxlIGEgdm9sdW1lIHZpZXcgaXMgc3BsaXQsIHRoZSBzbGljZSBlZGl0b3IncyBwYW5lIG9uIGl0cyBsZWZ0IChpdHMgb3duXG4gICAgIHZpZXdlciwgd2l0aCBldmVyeSByZWdpb24gdG9vbCkgd2l0aCBhIGRpdmlkZXIgdG8gcmVzaXplIHRoZSB0d28uIFRoZSBwbG90IGRpdiBrZWVwcyBpdHNcbiAgICAgcGxhY2UgaW4gdGhlIERPTSBlaXRoZXIgd2F5OiB0aGUgYmFja2VuZHMgZmluZCBpdCBieSBpZCwgYW5kIGEgdmlld2VyIG1vdW50ZWQgaW4gaXQgc3RheXMuIC0tPlxuPGRpdlxuICBjbGFzcz1cInZpei1wYW5lc1wiXG4gIFtjbGFzcy52aXotcXVhZF09XCJzbGljZUVkaXRvclNob3duXCJcbiAgW3N0eWxlLmdyaWQtdGVtcGxhdGUtY29sdW1uc109XCJzbGljZUVkaXRvclNob3duID8gc3BsaXRYICsgJyUgNnB4IG1pbm1heCgwLCAxZnIpJyA6IG51bGxcIlxuICBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1yb3dzXT1cInNsaWNlRWRpdG9yU2hvd24gPyBzcGxpdFkgKyAnJSA2cHggbWlubWF4KDAsIDFmciknIDogbnVsbFwiXG4+XG4gIDwhLS0gVGhlIHNsaWNlIGVkaXRvcjogdGhlIHZvbHVtZSAodGhlIHBsb3QpIHRvcCBsZWZ0LCB0aGUgc2xpY2UgYmVpbmcgZWRpdGVkIChaKSB0b3AgcmlnaHQsXG4gICAgICAgdGhlIHNlY3Rpb25zIHRocm91Z2ggeCBhbmQgeSBiZWxvdywgaW4gdGhlaXIgYXhpcyBjb2xvdXJzLiAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNsaWNlRWRpdG9yU2hvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwidml6LWNlbGwgdml6LWNlbGwtelwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZpei1zbGljZS1wYW5lXCIgW2lkXT1cInNsaWNlRGl2TmFtZVwiPjwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJ2aXotcGFuZS1iYWRnZSB2aXotcGFuZS1iYWRnZS16XCI+WiDCtyBzbGljZSB7eyB6SW5kZXggfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInZpei1jZWxsIHZpei1jZWxsLXhcIj5cbiAgICAgIDx2aXotc2VjdGlvbi1wYW5lIGF4aXM9XCJ4XCIgW3ZpZXddPVwic2VjdGlvbnMueFwiIChwaWNrKT1cIm9uU2VjdGlvblBpY2soJ3gnLCAkZXZlbnQpXCI+PC92aXotc2VjdGlvbi1wYW5lPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ2aXotY2VsbCB2aXotY2VsbC15XCI+XG4gICAgICA8dml6LXNlY3Rpb24tcGFuZSBheGlzPVwieVwiIFt2aWV3XT1cInNlY3Rpb25zLnlcIiAocGljayk9XCJvblNlY3Rpb25QaWNrKCd5JywgJGV2ZW50KVwiPjwvdml6LXNlY3Rpb24tcGFuZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInZpei1wYW5lLWRpdmlkZXIgdml6LXBhbmUtZGl2aWRlci12XCJcbiAgICAgIHJvbGU9XCJzZXBhcmF0b3JcIlxuICAgICAgYXJpYS1vcmllbnRhdGlvbj1cInZlcnRpY2FsXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJSZXNpemUgdGhlIHBhbmVzIGFjcm9zc1wiXG4gICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInNwbGl0WFwiXG4gICAgICBhcmlhLXZhbHVlbWluPVwiMjBcIlxuICAgICAgYXJpYS12YWx1ZW1heD1cIjgwXCJcbiAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAocG9pbnRlcmRvd24pPVwic3RhcnRQYW5lUmVzaXplKCRldmVudCwgJ3gnKVwiXG4gICAgICAoa2V5ZG93bik9XCJudWRnZVBhbmVTaXplKCRldmVudCwgJ3gnKVwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidml6LXBhbmUtZGl2aWRlciB2aXotcGFuZS1kaXZpZGVyLWhcIlxuICAgICAgcm9sZT1cInNlcGFyYXRvclwiXG4gICAgICBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICBhcmlhLWxhYmVsPVwiUmVzaXplIHRoZSBwYW5lcyBkb3duXCJcbiAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwic3BsaXRZXCJcbiAgICAgIGFyaWEtdmFsdWVtaW49XCIyMFwiXG4gICAgICBhcmlhLXZhbHVlbWF4PVwiODBcIlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgIChwb2ludGVyZG93bik9XCJzdGFydFBhbmVSZXNpemUoJGV2ZW50LCAneScpXCJcbiAgICAgIChrZXlkb3duKT1cIm51ZGdlUGFuZVNpemUoJGV2ZW50LCAneScpXCJcbiAgICA+PC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwidy1mdWxsIHJlbGF0aXZlIHZpei1wbG90XCIgW2lkXT1cInBsb3REaXZOYW1lXCI+XG4gICAgPGRpdiAqbmdJZj1cImltZ0xvYWRpbmcoKSB8fCBzdGFja0xvYWRpbmcoKSB8fCBpc0NhY2hpbmcoKVwiIGNsYXNzPVwibG9hZGluZy1vdmVybGF5XCI+XG4gICAgICA8IS0tIERldGVybWluYXRlIHN0YWNrL3ZvbHVtZSBwcm9ncmVzcyB0YWtlcyBwcmVjZWRlbmNlOiB3aGlsZSBpdCdzIGFjdGl2ZSBzaG93IE9OTFkgdGhlXG4gICAgICAgICBwcm9ncmVzcyBiYXIgKyBcIkxvYWRpbmcgZnJhbWVzLi4uXCIsIG5vdCB0aGUgZ2VuZXJpYyBzcGlubmVyL1wiTG9hZGluZyBpbWFnZS4uLlwiIG9uIHRvcCBvZlxuICAgICAgICAgaXQgKGJvdGggd2VyZSByZW5kZXJpbmcgYXQgb25jZSBmb3IgbmFwYXJpIHZvbHVtZS9pc29zdXJmYWNlIGxvYWRzKS4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhY2tMb2FkaW5nKCk7IGVsc2UgaW1nTG9hZGluZ1RwbFwiPlxuICAgICAgICA8cC1wcm9ncmVzc0JhciBjbGFzcz1cInByb2dyZXNzXCIgW3ZhbHVlXT1cImxvYWRpbmdQZXJjZW50YWdlKClcIj48L3AtcHJvZ3Jlc3NCYXI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+TG9hZGluZyBmcmFtZXMuLi48L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjaW1nTG9hZGluZ1RwbD5cbiAgICAgICAgPCEtLSBDYWNoZS1jb3B5IHByb2dyZXNzIGlzIHNob3duIHdoZW5ldmVyIGEgY2FjaGUgZG93bmxvYWQgaXMgYWN0aXZlIChpc0NhY2hpbmcpLCBpbmRlcGVuZGVudFxuICAgICAgICAgICBvZiBgaW1nTG9hZGluZ2AsIHNvIGl0J3MgbmV2ZXIgZHJvcHBlZC9tYXNrZWQgbWlkLWRvd25sb2FkLiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQ2FjaGluZygpOyBlbHNlIHNwaW5uZXJMb2FkaW5nXCI+XG4gICAgICAgICAgPCEtLSBTdGFnZS1hd2FyZSBtZXNzYWdlIGNvbWVzIGZyb20gQ2FjaGVQcm9ncmVzc1NlcnZpY2UgdXBkYXRpbmdcbiAgICAgICAgICAgICBpbWFnZUxvYWRpbmdNZXNzYWdlJCAoXCJDYWNoaW5nIGltYWdlLi4uXCIgZHVyaW5nIHRoZSBHQ1MgZG93bmxvYWQsXG4gICAgICAgICAgICAgdGhlbiBcIkdlbmVyYXRpbmcgcHJldmlldy4uLlwiIGR1cmluZyBwZXItc2xpY2UgdGh1bWJuYWlsIGdlbikuIE9uY2UgdGhlXG4gICAgICAgICAgICAgZG93bmxvYWQgaGl0cyAxMDAlIHRoZSByZW1haW5pbmcgd29yayAoc2VydmVyIHByZXZpZXcvdGlsZSBnZW5lcmF0aW9uKVxuICAgICAgICAgICAgIGhhcyBubyBkZXRlcm1pbmF0ZSBwcm9ncmVzcywgc28gZmFsbCB0aHJvdWdoIHRvIHRoZSBzcGlubmVyIHRlbXBsYXRlXG4gICAgICAgICAgICAgcmF0aGVyIHRoYW4gcGFya2luZyBhIGZ1bGwgYmFyIHVuZGVyIFwiTG9hZGluZyBpbWFnZS4uLlwiLiAtLT5cbiAgICAgICAgICA8cC1wcm9ncmVzc0JhciBjbGFzcz1cInByb2dyZXNzXCIgW3ZhbHVlXT1cImNhY2hlUHJvZ3Jlc3MoKVwiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPnt7IGxvYWRpbmdNZXNzYWdlKCkgfX08L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3NwaW5uZXJMb2FkaW5nPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpbWdMb2FkaW5nKClcIiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImltZ0xvYWRpbmcoKSAmJiAhem9vbSgpXCIgY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj57eyBsb2FkaW5nTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nTG9hZGluZygpICYmIHpvb20oKVwiIGNsYXNzPVwiem9vbS10ZXh0LWxvYWRpbmdcIj57eyBsb2FkaW5nTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxwLWJ1dHRvblxuICAgICAgICAqbmdJZj1cInN0YWNrTG9hZGluZygpIHx8IGltZ0xvYWRpbmcoKVwiXG4gICAgICAgIGNsYXNzPVwiY2FuY2VsLWxvYWRpbmdcIlxuICAgICAgICBsYWJlbD1cIkNhbmNlbFwiXG4gICAgICAgIChvbkNsaWNrKT1cImNhbmNlbExvYWRpbmcoKVwiXG4gICAgICA+XG4gICAgICA8L3AtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gVHJhbnNsdWNlbnQgXCJzaGFycGVuaW5nXCIgb3ZlcmxheSBzaG93biBhZnRlciB0aGUgc21hbGwtdGllciBwcmV2aWV3IGlzXG4gICAgICAgb24gc2NyZWVuIHdoaWxlIHRoZSBsYXJnZS10aWVyIHJlbmRlciBpcyBzdGlsbCBsb2FkaW5nIGluIHRoZVxuICAgICAgIGJhY2tncm91bmQuIExldHMgdGhlIHVzZXIgc2VlIHRoZSBibHVycnkgaW1hZ2UgdW5kZXJuZWF0aCBidXQgbWFrZXNcbiAgICAgICBpdCBjbGVhciBzb21ldGhpbmcgaXMgc3RpbGwgbG9hZGluZyBzbyB0aGV5IGRvbid0IG1pc3Rha2UgdGhlXG4gICAgICAgbG93LXJlcyByZW5kZXIgZm9yIHRoZSBmaW5hbCBpbWFnZS4gLS0+XG4gICAgPGRpdiAqbmdJZj1cInJlbmRlci5zaGFycGVuaW5nICYmICFpbWdMb2FkaW5nKCkgJiYgIXN0YWNrTG9hZGluZygpICYmICFpc0NhY2hpbmcoKVwiIGNsYXNzPVwic2hhcnBlbmluZy1vdmVybGF5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj5TaGFycGVuaW5nIHByZXZpZXcuLi48L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gRmxvYXRpbmcsIGRyYWdnYWJsZSBpbnRlbnNpdHktcHJvZmlsZSBpbnNldCwgc2hvd24gd2hpbGUgYW55IGludGVuc2l0eSBsaW5lXG4gICAgIGV4aXN0cy4gS2VwdCBPVVRTSURFIHRoZSBwbG90IGRpdiBhbmQgZml4ZWQgdG8gdGhlIHZpZXdwb3J0LCBzbyBpdCBmbG9hdHMgb3ZlclxuICAgICB0aGUgd2hvbGUgcGFnZSByYXRoZXIgdGhhbiBiZWluZyBjbGlwcGVkIHRvIHRoZSBjYW52YXMuIC0tPlxuPHZpei1pbnRlbnNpdHktaW5zZXRcbiAgW2RpdklkXT1cImludGVuc2l0eUluc2V0RGl2XCJcbiAgW3Bsb3REaXZOYW1lXT1cInBsb3REaXZOYW1lXCJcbiAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICBbaW1hZ2VWaWV3XT1cImlzSW1hZ2VWaWV3XCJcbiAgW2ltYWdlSW5mb109XCJpbWFnZUluZm9cIlxuPjwvdml6LWludGVuc2l0eS1pbnNldD5cblxuPCEtLSBDaGFubmVscyAmIEhpc3RvZ3JhbTogbm9uLW1vZGFsIGZsb2F0aW5nIGRpYWxvZyBvcGVuZWQgZnJvbSB0aGUgdG9vbGJhci4gLS0+XG48Y2hhbm5lbC1oaXN0b2dyYW0gWyh2aXNpYmxlKV09XCJzaG93Q2hhbm5lbEhpc3RvZ3JhbVwiPjwvY2hhbm5lbC1oaXN0b2dyYW0+XG5cbjwhLS0gU3BhdGlhbC1vbWljcyBjb250cm9scy4gUmVuZGVycyBpdHMgb3duIGVtcHR5IHN0YXRlIHdoZW4gbm8gZGF0YXNldCAob3Igbm9cbiAgICAgU1BBVElBTF9EQVRBX1BPUlQpIGlzIHByZXNlbnQsIHNvIGl0IGlzIGFsd2F5cyBzYWZlIHRvIGhvc3QuIC0tPlxuPHNwYXRpYWwtY29udHJvbHMgWyh2aXNpYmxlKV09XCJzaG93U3BhdGlhbENvbnRyb2xzXCIgW2lzM2RdPVwiaXNTcGF0aWFsM2RNb2RlXCI+PC9zcGF0aWFsLWNvbnRyb2xzPlxuXG48IS0tIFNpZGUgcGFuZWwgb2YgdGhlIGFjdGl2ZSBjb250cmlidXRlZCBwbG90IG1vZGUgKFBMT1RfVFlQRV9DT05UUklCVVRJT05TKSxcbiAgICAgaW4gdGhlIHNhbWUgcmlnaHQtaGFuZCBhcmVhIGFzIHRoZSBzcGF0aWFsIGNvbnRyb2xzIGFuZCB0aGUgUmVnaW9uIEVkaXRvci5cbiAgICAgRXhpc3RzIG9ubHkgd2hpbGUgdGhlIG1vZGUncyBzZXNzaW9uIGlzIGxpdmU7IHRoZXJlIGlzIG5vIGNsb3NlIGJ1dHRvbixcbiAgICAgYmVjYXVzZSBsZWF2aW5nIHRoZSBtb2RlIGlzIHdoYXQgZW5kcyBpdC4gQSBjb21wb25lbnQgcGFuZWwgZ2V0c1xuICAgICBQTE9UX01PREVfQ09OVEVYVCAvIFBMT1RfTU9ERV9TRVNTSU9OIGZyb20gaXRzIGluamVjdG9yOyBhIGBtb3VudGAgcGFuZWwnc1xuICAgICBob3N0IGVsZW1lbnQgaXMgYXR0YWNoZWQgdG8gdGhlIHNsb3QgYmVsb3cgKHNlZSBwbG90TW9kZVBhbmVsU2xvdCkuIC0tPlxuPHAtZGlhbG9nXG4gICpuZ0lmPVwicGxvdE1vZGVQYW5lbCBhcyBwYW5lbFwiXG4gIFtoZWFkZXJdPVwicGFuZWwudGl0bGVcIlxuICBbdmlzaWJsZV09XCJ0cnVlXCJcbiAgW21vZGFsXT1cImZhbHNlXCJcbiAgW2Nsb3NhYmxlXT1cImZhbHNlXCJcbiAgW3Jlc2l6YWJsZV09XCJ0cnVlXCJcbiAgW2RyYWdnYWJsZV09XCJ0cnVlXCJcbiAgYXBwZW5kVG89XCJib2R5XCJcbiAgcG9zaXRpb249XCJyaWdodFwiXG4gIHN0eWxlQ2xhc3M9XCJwbG90LW1vZGUtcGFuZWxcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogJzIycmVtJywgbWF4SGVpZ2h0OiAnODV2aCcgfVwiXG4gIFtjb250ZW50U3R5bGVdPVwieyBvdmVyZmxvdzogJ2F1dG8nIH1cIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuY29tcG9uZW50XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCJwYW5lbC5jb21wb25lbnQ7IGluamVjdG9yOiBwYW5lbC5pbmplY3RvciA/PyB1bmRlZmluZWRcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgKm5nSWY9XCJwYW5lbC5ob3N0XCIgI3Bsb3RNb2RlUGFuZWxTbG90IGNsYXNzPVwicGxvdC1tb2RlLXBhbmVsLXNsb3RcIj48L2Rpdj5cbjwvcC1kaWFsb2c+XG5cbjwhLS0gQW4gb3BlbiBkaWFsb2cgdG9vbCAoVE9PTEJBUl9UT09MUywga2luZDogJ2RpYWxvZycpLiBOb24tbW9kYWwgc28gdGhlIHVzZXIgY2FuXG4gICAgIGtlZXAgd29ya2luZyBvbiB0aGUgaW1hZ2UsIGUuZy4gcGFpbnRpbmcgd2l0aCB0aGUgYnJ1c2ggdGhlIHRvb2wgYXJtZWQuIFRoZVxuICAgICB0b29sIHJlbmRlcnMgaXRzIGJvZHkgaW50byBhIGhvc3QgZWxlbWVudCBhdHRhY2hlZCB0byB0aGUgc2xvdCBiZWxvdyAoc2VlXG4gICAgIHRvb2xEaWFsb2dTbG90KTsgY2xvc2luZyB0aGUgZGlhbG9nIGVuZHMgdGhlIHRvb2wncyBzZXNzaW9uLiAtLT5cbjxwLWRpYWxvZ1xuICAqbmdJZj1cInRvb2xEaWFsb2cgYXMgZGxnXCJcbiAgW2hlYWRlcl09XCJkbGcudGl0bGVcIlxuICBbdmlzaWJsZV09XCJ0cnVlXCJcbiAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50IHx8IGNsb3NlRGlhbG9nVG9vbCgpXCJcbiAgW21vZGFsXT1cImZhbHNlXCJcbiAgW2Nsb3NhYmxlXT1cInRydWVcIlxuICBbcmVzaXphYmxlXT1cInRydWVcIlxuICBbZHJhZ2dhYmxlXT1cInRydWVcIlxuICBhcHBlbmRUbz1cImJvZHlcIlxuICBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgc3R5bGVDbGFzcz1cInRvb2wtZGlhbG9nXCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6IGRsZy53aWR0aCwgbWF4SGVpZ2h0OiAnODV2aCcgfVwiXG4gIFtjb250ZW50U3R5bGVdPVwieyBvdmVyZmxvdzogJ2F1dG8nIH1cIlxuPlxuICA8ZGl2ICN0b29sRGlhbG9nU2xvdCBjbGFzcz1cInRvb2wtZGlhbG9nLXNsb3RcIj48L2Rpdj5cbjwvcC1kaWFsb2c+XG5cbjwhLS0gUmVnaW9uIEVkaXRvcjogbm9uLW1vZGFsLCBkcmFnZ2FibGUsIHJlc2l6YWJsZSBmbG9hdGluZyBkaWFsb2cgb3BlbmVkIGZyb21cbiAgICAgdGhlIHRvb2xiYXIgKGZvcm1lcmx5IHRoZSByaWdodC1wYW5lbCBSZWdpb25zIHRhYikuIE1vZGVsZXNzIHNvIHJlZ2lvbnMgY2FuXG4gICAgIHN0aWxsIGJlIGRyYXduL3NlbGVjdGVkIG9uIHRoZSBwbG90IHdoaWxlIGl0J3Mgb3Blbjsgc3RheXMgbGlua2VkIHRvIHRoaXNcbiAgICAgcGxvdHRpbmcgaW5zdGFuY2UgdmlhIHRoZSByb290IFJlZ2lvblN0b3JlIHNpbmdsZXRvbi4gT3BlbnMgb3ZlciB0aGUgcmlnaHRcbiAgICAgc2lkZSBvZiB0aGUgdmlldy4gLS0+XG48cC1kaWFsb2dcbiAgaGVhZGVyPVwiUmVnaW9uIEVkaXRvclwiXG4gIFsodmlzaWJsZSldPVwic2hvd1JlZ2lvbkVkaXRvclwiXG4gIFttb2RhbF09XCJmYWxzZVwiXG4gIFtyZXNpemFibGVdPVwidHJ1ZVwiXG4gIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gIFttYXhpbWl6YWJsZV09XCJ0cnVlXCJcbiAgYXBwZW5kVG89XCJib2R5XCJcbiAgcG9zaXRpb249XCJyaWdodFwiXG4gIFtzdHlsZV09XCJ7IHdpZHRoOiByZWdpb25FZGl0b3JXaWR0aCwgaGVpZ2h0OiAnODV2aCcgfVwiXG4gIFtjb250ZW50U3R5bGVdPVwieyBvdmVyZmxvdzogJ2F1dG8nIH1cIlxuPlxuICA8cmVnaW9uLWVkaXRvciBbYWN0aXZlXT1cInNob3dSZWdpb25FZGl0b3JcIj48L3JlZ2lvbi1lZGl0b3I+XG48L3AtZGlhbG9nPlxuXG48IS0tIFNpbXBsaWZ5IChEb3VnbGFz4oCTUGV1Y2tlcik6IGN1c3RvbSBweC10aHJlc2hvbGQgcGlja2VyIGZvciB0aGUgc2VsZWN0ZWRcbiAgICAgcmVnaW9uKHMpLCBvcGVuZWQgZnJvbSB0aGUgcmlnaHQtY2xpY2sgXCJTaW1wbGlmeSDilrggQ3VzdG9t4oCmXCIgYWN0aW9uLiAtLT5cbjxwLWRpYWxvZ1xuICBoZWFkZXI9XCJTaW1wbGlmeSByZWdpb24ocylcIlxuICBbKHZpc2libGUpXT1cImRpc3BsYXlTaW1wbGlmeURpYWxvZ1wiXG4gIFttb2RhbF09XCJ0cnVlXCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICcyMnJlbScgfVwiXG4gIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICBbcmVzaXphYmxlXT1cImZhbHNlXCJcbj5cbiAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gZ2FwLTJcIj5cbiAgICA8c3BhblxuICAgICAgPkFsdGl0dWRlIHRocmVzaG9sZDogPGI+e3sgcmVnaW9uQWN0aW9ucy5zaW1wbGlmeVRocmVzaG9sZCB9fSBweDwvYj48L3NwYW5cbiAgICA+XG4gICAgPHAtc2xpZGVyIFsobmdNb2RlbCldPVwicmVnaW9uQWN0aW9ucy5zaW1wbGlmeVRocmVzaG9sZFwiIFttaW5dPVwiMVwiIFttYXhdPVwiMjBcIiBbc3RlcF09XCIxXCI+PC9wLXNsaWRlcj5cbiAgICA8c21hbGw+VmVydGljZXMgd2l0aGluIHRoaXMgZGlzdGFuY2Ugb2YgdGhlIGxpbmUgYmV0d2VlbiB0aGVpciBuZWlnaGJvdXJzIGFyZSByZW1vdmVkLjwvc21hbGw+XG4gIDwvZGl2PlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgPHAtYnV0dG9uIGxhYmVsPVwiQ2FuY2VsXCIgW3RleHRdPVwidHJ1ZVwiIChvbkNsaWNrKT1cImRpc3BsYXlTaW1wbGlmeURpYWxvZyA9IGZhbHNlXCI+PC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGxhYmVsPVwiQXBwbHlcIlxuICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgIChvbkNsaWNrKT1cInNpbXBsaWZ5UmVnaW9ucyhyZWdpb25BY3Rpb25zLnNpbXBsaWZ5VGhyZXNob2xkKVwiXG4gICAgPjwvcC1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuXG48IS0tIFBhcmFtZXRlcnMgZm9yIHdoaWNoZXZlciBjb250cmlidXRlZCB0b29sIGlzIG9wZW4uIE9uZSBkaWFsb2cgZm9yIGFsbCBvZlxuICAgICB0aGVtOiBhIHRvb2wgZGVjbGFyZXMgaXRzIGZpZWxkcyAoVG9vbFBhcmFtU3BlYykgYW5kIHRoaXMgcmVuZGVycyB0aGVtLCBzb1xuICAgICB0aGUgdG9vbGJhciBjYW4gbGF5IGV2ZXJ5IHRvb2wgb3V0IHRoZSBzYW1lIHdheSBhbmQgYSBwbHVnaW4gbmVlZHMgbm9cbiAgICAgUHJpbWVORyBvZiBpdHMgb3duLiBEZWZhdWx0cyBjb21lIGZyb20gdGhlIGFjdGl2ZSBjaGVja3BvaW50LCBzaW5jZSB0aGV5XG4gICAgIGVuY29kZSB3aGF0IGl0IHdhcyB0cmFpbmVkIGZvci4gLS0+XG48cC1kaWFsb2dcbiAgKm5nSWY9XCJ0b29sUGFyYW1zLm9wZW5QYXJhbXMgYXMgb3BlblwiXG4gIFtoZWFkZXJdPVwib3Blbi50b29sLmxhYmVsICsgJyBwYXJhbWV0ZXJzJ1wiXG4gIFt2aXNpYmxlXT1cInRydWVcIlxuICAodmlzaWJsZUNoYW5nZSk9XCJjbG9zZVRvb2xQYXJhbXMoKVwiXG4gIFttb2RhbF09XCJ0cnVlXCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICczMHJlbScgfVwiXG4gIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICBbcmVzaXphYmxlXT1cImZhbHNlXCJcbiAgYXBwZW5kVG89XCJib2R5XCJcbj5cbiAgPGRpdiBjbGFzcz1cImdyaWQgZm9ybWdyaWQgcC1mbHVpZFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGYgb2Ygb3Blbi5maWVsZHNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiIFtuZ0NsYXNzXT1cImYuc3BlYy50eXBlID09PSAnYm9vbGVhbicgPyAnY29sLTEyJyA6ICdjb2wtNidcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImYubnVtYmVyIGFzIG5cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCIgW3BUb29sdGlwXT1cIm4udG9vbHRpcCB8fCAnJ1wiPnt7IG4ubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgIDxwLWlucHV0TnVtYmVyXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvcGVuLnZhbHVlc1tuLmlkXVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvcGVuLnZhbHVlc1tuLmlkXSA9ICRldmVudFwiXG4gICAgICAgICAgICBbbWluXT1cIm4ubWluXCJcbiAgICAgICAgICAgIFttYXhdPVwibi5tYXhcIlxuICAgICAgICAgICAgW3N0ZXBdPVwibi5zdGVwXCJcbiAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJuLmZyYWN0aW9uRGlnaXRzXCJcbiAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJ0cnVlXCJcbiAgICAgICAgICA+PC9wLWlucHV0TnVtYmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZi5zZWxlY3QgYXMgc2VsXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiIFtwVG9vbHRpcF09XCJzZWwudG9vbHRpcCB8fCAnJ1wiPnt7IHNlbC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbC5vcHRpb25zXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvcGVuLnZhbHVlc1tzZWwuaWRdXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9wZW4udmFsdWVzW3NlbC5pZF0gPSAkZXZlbnRcIlxuICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICA+PC9wLWRyb3Bkb3duPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIENoZWNrYm94IGxhYmVsIHNpdHMgYmVzaWRlIHRoZSBib3ggYW5kIG1heSBydW4gdG8gYSBzZW50ZW5jZSwgc29cbiAgICAgICAgICAgICBpdCBkb2VzIG5vdCBnZXQgdGhlIHN0YWNrZWQgbGFiZWwgdGhlIG90aGVyIHR5cGVzIHVzZS4gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmLnNwZWMudHlwZSA9PT0gJ2Jvb2xlYW4nXCIgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgIDxwLWNoZWNrYm94XG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvcGVuLnZhbHVlc1tmLnNwZWMuaWRdXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9wZW4udmFsdWVzW2Yuc3BlYy5pZF0gPSAkZXZlbnRcIlxuICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtpbnB1dElkXT1cIm9wZW4udG9vbC5pZCArICctJyArIGYuc3BlYy5pZFwiXG4gICAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJvcGVuLnRvb2wuaWQgKyAnLScgKyBmLnNwZWMuaWRcIiBjbGFzcz1cInRleHQtc20gbWItMFwiIFtwVG9vbHRpcF09XCJmLnNwZWMudG9vbHRpcCB8fCAnJ1wiPnt7XG4gICAgICAgICAgICBmLnNwZWMubGFiZWxcbiAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgPHAtYnV0dG9uXG4gICAgICBsYWJlbD1cIlJlc2V0IHRvIG1vZGVsIGRlZmF1bHRzXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIChvbkNsaWNrKT1cInJlc2V0VG9vbFBhcmFtcyhvcGVuLnRvb2wuaWQpXCJcbiAgICA+PC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b24gbGFiZWw9XCJDbG9zZVwiIHNpemU9XCJzbWFsbFwiIChvbkNsaWNrKT1cImNsb3NlVG9vbFBhcmFtcygpXCI+PC9wLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1kaWFsb2c+XG4iXX0=
|
|
1321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBSU4sUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBWSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJB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QUNqQixZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixxQkFBcUI7d0JBQ3JCLGdCQUFnQjt3QkFDaEIsdUJBQXVCO3dCQUN2QixvQkFBb0I7d0JBQ3BCLHlCQUF5Qjt3QkFDekIsd0JBQXdCO3dCQUN4QixxQkFBcUI7cUJBQ3RCLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNOzswQkFxYzVDLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDdkIsTUFBTTsyQkFBQyxVQUFVOzswQkFTakIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxVQUFVOzswQkFJN0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxhQUFhOzswQkFHaEMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUdwQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHVCQUF1Qjs7MEJBRzFDLFFBQVE7OzBCQUVSLFFBQVE7a0VBdGJYLFlBQVk7c0JBRFgsTUFBTTtnQkFJUCxnQkFBZ0I7c0JBRGYsTUFBTTtnQkFNSCxZQUFZO3NCQURmLEtBQUs7Z0JBY04sUUFBUTtzQkFEUCxLQUFLO2dCQTBDVyxXQUFXO3NCQUEzQixTQUFTO3VCQUFDLElBQUk7Z0JBb0xYLGlCQUFpQjtzQkFEcEIsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBOEJ3QixLQUFLO3NCQUExRCxTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkErNkJoRCxjQUFjO3NCQURqQixTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgY29tcHV0ZWQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSwgU2hhcmVkTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NoZWNrYm94JztcbmltcG9ydCB7IENvbnRleHRNZW51LCBDb250ZXh0TWVudU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY29udGV4dG1lbnUnO1xuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IElucHV0TnVtYmVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG51bWJlcic7XG5pbXBvcnQgeyBQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IHsgU2xpZGVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zbGlkZXInO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IEltYWdlU3RhdGVQb3J0LCBJTUFHRV9TVEFURV9QT1JUIH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvaW1hZ2Utc3RhdGUucG9ydCc7XG5pbXBvcnQgeyBQb2x5Z29uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFJlZ2lvbk9wc1NlcnZpY2UgfSBmcm9tICcuL3JlZ2lvbi1vcHMuc2VydmljZSc7XG5pbXBvcnQgeyBWSVpfVE9BU1RfS0VZLCBWSVpfQUxFUlRfVE9BU1RfS0VZIH0gZnJvbSAnLi90b2FzdC1vdXRsZXRzJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNsaWNlU2NydWJiZXIgfSBmcm9tICcuL3JlbmRlci1vcmNoZXN0cmF0b3InO1xuaW1wb3J0IHsgSW1hZ2VSZW5kZXJTZXNzaW9uLCBlcnJvck1lc3NhZ2UgfSBmcm9tICcuL3JlbmRlci1zZXNzaW9uJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBsb3RUeXBlSWQsXG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgaXNCdWlsdGluUGxvdFR5cGUsXG4gIGlzTmFwYXJpM2QsXG4gIGlzU3BhdGlhbE9taWNzLFxuICBpc1NwYXRpYWxPbWljczNkLFxuICByZW5kZXJlck93bnNXaGVlbCxcbiAgTkFQQVJJX0RFRkFVTFRfREVDSU1BVEUsXG4gIGlzTmFwYXJpVm9sdW1lLFxuICBpc05hcGFyaUlzb3N1cmZhY2UsXG59IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBQTE9UX1RZUEVfQ09OVFJJQlVUSU9OUyxcbiAgUGxvdFR5cGVDb250cmlidXRpb24sXG4gIFBsb3RUeXBlT3B0aW9uLFxufSBmcm9tICcuL2NvbnRyYWN0cy9wbG90LXR5cGUtY29udHJpYnV0aW9uLmNvbnRyYWN0JztcbmltcG9ydCB7IFBsb3RNb2RlQ29udHJvbGxlciB9IGZyb20gJy4vcGxvdC1tb2RlL3Bsb3QtbW9kZS1jb250cm9sbGVyJztcbmltcG9ydCB7IGNvbXB1dGVQbG90VHlwZU1lbnUsIHJlY29uY2lsZVBsb3RUeXBlIH0gZnJvbSAnLi9wbG90LW1vZGUvcGxvdC10eXBlLW1lbnUnO1xuaW1wb3J0IHsgVG9vbFBhcmFtc01vZGVsIH0gZnJvbSAnLi9wbG90LW1vZGUvdG9vbC1wYXJhbXMtbW9kZWwnO1xuaW1wb3J0IHsgQ29udHJpYnV0aW9uSG9zdCwgUGxvdE1vZGVQYW5lbFZpZXcsIFRvb2xEaWFsb2dWaWV3IH0gZnJvbSAnLi9wbG90LW1vZGUvY29udHJpYnV0aW9uLWhvc3QnO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXIsIFZJU1VBTElaRVIsIFZpc3VhbGl6ZXJIYW5kbGUgfSBmcm9tICcuL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNBTV9NT0RFTFMsIGdldERlZmF1bHRTYW1Nb2RlbElkLCBpc1NhbU1vZGVsUmVhZHkgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VnbWVudGF0aW9uUnVubmVyIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zZWdtZW50YXRpb24tcnVubmVyJztcbmltcG9ydCB7XG4gIFRPT0xCQVJfVE9PTFMsXG4gIFRvb2xiYXJDb250cmlidXRpb24sXG4gIFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9uLFxuICBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbixcbiAgdmlzaWJsZVRvb2xDb250cmlidXRpb25zLFxufSBmcm9tICcuL2NvbnRyYWN0cy90b29sYmFyLXRvb2wuY29udHJhY3QnO1xuaW1wb3J0IHsgVG9vbGJhclRvb2xWaXNpYmlsaXR5LCBBTExfVE9PTEJBUl9UT09MUyB9IGZyb20gJy4vY29udHJhY3RzL3Rvb2xiYXItY29uZmlnJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgU1BBVElBTF9EQVRBX1BPUlQsIFNwYXRpYWxEYXRhUG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7IGFwcGx5SW1hZ2VSb2lzIH0gZnJvbSAnLi92aXN1YWxpemVyL3JlZ2lvbi1sb2FkJztcbmltcG9ydCB7IENvbnRleHRNZW51QWN0aW9ucywgQ29udGV4dE1lbnVTdGF0ZSwgYnVpbGRDb250ZXh0TWVudSB9IGZyb20gJy4vdmlzdWFsaXplci92aXN1YWxpemVyLWNvbnRleHQtbWVudSc7XG5pbXBvcnQgeyBSZWdpb25BY3Rpb25zIH0gZnJvbSAnLi92aXN1YWxpemVyL3JlZ2lvbi1hY3Rpb25zJztcbmltcG9ydCB7IFRvb2xNb2RlcyB9IGZyb20gJy4vdmlzdWFsaXplci90b29sLW1vZGVzJztcbmltcG9ydCB7IFNob3J0Y3V0SG9zdCwgVmlld2VyU2hvcnRjdXRzIH0gZnJvbSAnLi92aXN1YWxpemVyL3ZpZXdlci1zaG9ydGN1dHMnO1xuaW1wb3J0IHsgRmxvYXRpbmdEcmFnRGlyZWN0aXZlLCBGbG9hdGluZ1BvcyB9IGZyb20gJy4vdmlzdWFsaXplci9mbG9hdGluZy1kcmFnLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJbnRlbnNpdHlJbnNldENvbXBvbmVudCB9IGZyb20gJy4vaW50ZW5zaXR5LWluc2V0L2ludGVuc2l0eS1pbnNldC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VjdGlvblBhbmVDb21wb25lbnQgfSBmcm9tICcuL3NlY3Rpb24tcGFuZS9zZWN0aW9uLXBhbmUuY29tcG9uZW50JztcbmltcG9ydCB0eXBlIHsgU2VjdGlvbkF4aXMsIFNlY3Rpb25WaWV3cyB9IGZyb20gJy4vY29udHJhY3RzL3NlY3Rpb24tdmlldy5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsRGF0YXNldEJpbmRlciB9IGZyb20gJy4vdmlzdWFsaXplci9zcGF0aWFsLWRhdGFzZXQtYmluZGVyJztcbmltcG9ydCB7IFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXIvdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnaW9uRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9yZWdpb24tZWRpdG9yL3JlZ2lvbi1lZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IENoYW5uZWxIaXN0b2dyYW1Db21wb25lbnQgfSBmcm9tICcuL2NoYW5uZWwtaGlzdG9ncmFtL2NoYW5uZWwtaGlzdG9ncmFtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTcGF0aWFsQ29udHJvbHNDb21wb25lbnQgfSBmcm9tICcuL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jb250cm9scy5jb21wb25lbnQnO1xuXG4vKiogUGVyLWluc3RhbmNlIHBsb3QtZGl2IGlkIHNvdXJjZS4gVGhlIG1vdW50IGVsZW1lbnQncyBpZCBtdXN0IGJlIHVuaXF1ZSBzbyB0d29cbiAqICBsaXZlIHZpZXdlcnMgKGUuZy4gdGhlIG1haW4gZGlhZ3JhbSArIGEgbW9kYWwgcHJldmlldykgZG9uJ3QgY29sbGlkZSBvbiB0aGVcbiAqICBzYW1lIERPTSBpZCDigJQgYGdldEVsZW1lbnRCeUlkYCB3b3VsZCBvdGhlcndpc2UgcmV0dXJuIHdoaWNoZXZlciBjYW1lIGZpcnN0LlxuICogIFN0eWxpbmcgaGFuZ3Mgb2ZmIHRoZSBgLnZpei1wbG90YCBjbGFzcyBpbnN0ZWFkIG9mIHRoZSBpZC4gKi9cbmxldCBwbG90SW5zdGFuY2VTZXEgPSAwO1xuXG4vKipcbiAqIFRoZSB2aWV3ZXIgKGA8dmlzdWFsaXplcj5gKTogdGhlIHBsb3Qgc3VyZmFjZSwgaXRzIHRvb2xiYXIsIHRoZSBsb2FkaW5nIG92ZXJsYXkgYW5kXG4gKiB0aGUgZGlhbG9ncyBpdCBvcGVucyAoQ2hhbm5lbHMgJiBIaXN0b2dyYW0sIHNwYXRpYWwtb21pY3MgY29udHJvbHMsIFJlZ2lvbiBFZGl0b3IsXG4gKiBjb250cmlidXRlZCBtb2RlcyBhbmQgdG9vbHMpLiBJdCBvcmNoZXN0cmF0ZXMgcmVuZGVyaW5nIHRocm91Z2ggdGhlIGBWSVNVQUxJWkVSYFxuICogY29udHJhY3QgYW5kIHJlYWRzIHRoZSBpbWFnZSBmcm9tIHRoZSBob3N0J3MgYElNQUdFX1NUQVRFX1BPUlRgLlxuICpcbiAqIE9uUHVzaC4gVGVtcGxhdGUgZXZlbnRzIHJlLXJlbmRlciBpdDsgc3RhdGUgdGhhdCBsYW5kcyBhc3luY2hyb25vdXNseSBnb2VzIHRocm91Z2hcbiAqIHtAbGluayBjaGFuZ2VkfSAob3IgYSBzaWduYWw6IHRoZSBsb2FkaW5nIG92ZXJsYXkpLCBhbmQgdGhlIGNvbGxhYm9yYXRvcnMgdGhhdCBtdXN0XG4gKiByZW5kZXIgc3luY2hyb25vdXNseSAodGhlIHJlbmRlciBzZXNzaW9uJ3Mgb3ZlcmxheSwgYSBjb250cmlidXRlZCBwYW5lbCdzIHNsb3QsIHRoZVxuICogY29udGV4dCBtZW51IGJlZm9yZSBpdCBvcGVucykgc3RpbGwgY2FsbCBgZGV0ZWN0Q2hhbmdlcygpYC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmlzdWFsaXplcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgU2hhcmVkTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBDaGVja2JveE1vZHVsZSxcbiAgICBDb250ZXh0TWVudU1vZHVsZSxcbiAgICBEaWFsb2dNb2R1bGUsXG4gICAgRHJvcGRvd25Nb2R1bGUsXG4gICAgSW5wdXROdW1iZXJNb2R1bGUsXG4gICAgUHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgU2xpZGVyTW9kdWxlLFxuICAgIFRvYXN0TW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgRmxvYXRpbmdEcmFnRGlyZWN0aXZlLFxuICAgIFRvb2xiYXJDb21wb25lbnQsXG4gICAgSW50ZW5zaXR5SW5zZXRDb21wb25lbnQsXG4gICAgU2VjdGlvblBhbmVDb21wb25lbnQsXG4gICAgQ2hhbm5lbEhpc3RvZ3JhbUNvbXBvbmVudCxcbiAgICBTcGF0aWFsQ29udHJvbHNDb21wb25lbnQsXG4gICAgUmVnaW9uRWRpdG9yQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFZpc3VhbGl6ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250ZXh0TWVudUFjdGlvbnMge1xuICAvKiogUGVyLWluc3RhbmNlIHRvYXN0IGtleS4gTWVzc2FnZVNlcnZpY2UgaXMgYSBnbG9iYWwgc2luZ2xldG9uLCBzbyB0d28gbGl2ZVxuICAgKiAgYDx2aXN1YWxpemVyPmAgaW5zdGFuY2VzIChtYWluIHZpZXdlciArIHBpcGVsaW5lLWRpYWxvZyBwcmV2aWV3KSBzaGFyaW5nXG4gICAqICBvbmUga2V5IHdvdWxkIGVhY2ggcmVuZGVyIHRoZSBzYW1lIG1lc3NhZ2Ug4oCUIGEgZHVwbGljYXRlIHRvYXN0LiBBIHVuaXF1ZVxuICAgKiAga2V5IHBlciBpbnN0YW5jZSBzY29wZXMgdGhlIHRvYXN0IHRvIHRoZSBjb21wb25lbnQgdGhhdCByYWlzZWQgaXQuICovXG4gIHByaXZhdGUgc3RhdGljIG5leHRUb2FzdElkID0gMDtcblxuICAvKipcbiAgICogVGhlIGxpYnJhcnkgYWxzbyByYWlzZXMgbm90aWNlcyBmcm9tIHBsYWNlcyB0aGF0IGhhdmUgbm8gaW5zdGFuY2Ugb2YgdGhlaXJcbiAgICogb3duIHRvIGtleSBhZ2FpbnN0OiB7QGxpbmsgUGxvdGx5U2VydmljZX0gaXMgYHByb3ZpZGVkSW46ICdyb290J2AsIGFuZCB0aGVcbiAgICogcmVnaW9uIGVkaXRvciBpcyBhIGNoaWxkIGRpYWxvZy4gVGhvc2UgdXNlIHRoZSBmaXhlZFxuICAgKiB7QGxpbmsgVklaX1RPQVNUX0tFWX0gLyB7QGxpbmsgVklaX0FMRVJUX1RPQVNUX0tFWX0gb3V0bGV0cy5cbiAgICpcbiAgICogRm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgcGVyLWluc3RhbmNlIGtleSBhYm92ZSBleGlzdHMsIGV4YWN0bHkgT05FIG1vdW50ZWRcbiAgICogdmlzdWFsaXplciBtYXkgcmVuZGVyIHRob3NlIHNoYXJlZCBvdXRsZXRzIOKAlCBvdGhlcndpc2UgYSBtZXNzYWdlIGZyb20gdGhlXG4gICAqIHJvb3Qgc2VydmljZSB3b3VsZCBiZSBzaG93biBvbmNlIHBlciBsaXZlIHZpZXdlciAoaml0LXVpIHJ1bnMgYSBtYWluIHZpZXdcbiAgICogYW5kIGEgcGlwZWxpbmUtcHJldmlldyBhdCB0aGUgc2FtZSB0aW1lKS4gVGhlIGZpcnN0IHRvIGluaXQgY2xhaW1zIHRoZW0gYW5kXG4gICAqIHJlbGVhc2VzIG9uIGRlc3Ryb3ksIHNvIHRoZSBzdXJ2aXZpbmcgdmlld2VyIHBpY2tzIHRoZW0gdXAuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsaXZlSW5zdGFuY2VzID0gbmV3IFNldDxWaXN1YWxpemVyQ29tcG9uZW50PigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdml6VG9hc3RLZXkgPSBWSVpfVE9BU1RfS0VZO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdml6QWxlcnRUb2FzdEtleSA9IFZJWl9BTEVSVF9UT0FTVF9LRVk7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaW5zdGFuY2UgcmVuZGVycyB0aGUgc2hhcmVkIG91dGxldHMuIFRoZSBvd25lciBpcyBzaW1wbHkgdGhlXG4gICAqIG9sZGVzdCBsaXZlIHZpc3VhbGl6ZXIg4oCUIGEgYFNldGAgaXRlcmF0ZXMgaW4gaW5zZXJ0aW9uIG9yZGVyLCBzbyB3aGVuIHRoZVxuICAgKiBvd25lciBpcyBkZXN0cm95ZWQgdGhlIG5leHQgb25lIHRha2VzIG92ZXIgb24gaXRzIGZvbGxvd2luZyBjaGFuZ2UtZGV0ZWN0aW9uXG4gICAqIHBhc3MuIFRyYWNraW5nIGEgc2V0IHJhdGhlciB0aGFuIGEgc2luZ2xlIG93bmVyIG1hdHRlcnM6IHdpdGggYSBsb25lXG4gICAqIGBvd25lcmAgcmVmZXJlbmNlLCB0ZWFyaW5nIGRvd24gdGhlIG93bmVyIHdoaWxlIGEgc2libGluZyB3YXMgYWxyZWFkeVxuICAgKiBpbml0aWFsaXNlZCB3b3VsZCBsZWF2ZSBub2JvZHkgcmVuZGVyaW5nIHRoZSBvdXRsZXRzLCBhbmQgZXZlcnkgbm90aWNlIGZyb21cbiAgICogdGhlIHJvb3Qgc2VydmljZSB3b3VsZCBzaWxlbnRseSB2YW5pc2ggYWdhaW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IG93bnNTaGFyZWRUb2FzdHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb2xkZXN0ID0gVmlzdWFsaXplckNvbXBvbmVudC5saXZlSW5zdGFuY2VzLnZhbHVlcygpLm5leHQoKTtcbiAgICByZXR1cm4gIW9sZGVzdC5kb25lICYmIG9sZGVzdC52YWx1ZSA9PT0gdGhpcztcbiAgfVxuXG4gIC8qKiBFYWNoIG5ldyBpbWFnZTogd2hldGhlciBpdCBpcyBhIHotc3RhY2suICovXG4gIEBPdXRwdXQoKVxuICBpc1N0YWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgLyoqIEVhY2ggbmV3IGltYWdlOiB3aGV0aGVyIGl0IGlzIHNpbmdsZS1jaGFubmVsIChncmF5c2NhbGUpLiAqL1xuICBAT3V0cHV0KClcbiAgaXNHcmF5c2NhbGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuXG4gIC8qKiBXaGljaCB0b29sYmFyIGdyb3VwcyB0byBzaG93LiBBIHBhcnRpYWwgb3ZlcnJpZGUgbWVyZ2VzIG92ZXIgdGhlIGZ1bGwgc2V0LFxuICAgKiAgc28gYHsgc3BlY2lhbFRvb2xzOiBmYWxzZSB9YCBoaWRlcyBvbmx5IHRoYXQgZ3JvdXAuIERlZmF1bHRzIHRvIGV2ZXJ5dGhpbmcuICovXG4gIEBJbnB1dCgpXG4gIHNldCB0b29sYmFyVG9vbHModjogVG9vbGJhclRvb2xWaXNpYmlsaXR5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdG9vbGJhclRvb2xzID0geyAuLi5BTExfVE9PTEJBUl9UT09MUywgLi4uKHYgPz8ge30pIH07XG4gIH1cblxuICBnZXQgdG9vbGJhclRvb2xzKCk6IFJlcXVpcmVkPFRvb2xiYXJUb29sVmlzaWJpbGl0eT4ge1xuICAgIHJldHVybiB0aGlzLl90b29sYmFyVG9vbHM7XG4gIH1cbiAgcHJpdmF0ZSBfdG9vbGJhclRvb2xzOiBSZXF1aXJlZDxUb29sYmFyVG9vbFZpc2liaWxpdHk+ID0gQUxMX1RPT0xCQVJfVE9PTFM7XG5cbiAgLyoqIEV4cG9zZSB0ZXN0LW9ubHkgcGxvdCBtb2RlcyBpbiB0aGUgc2VsZWN0b3IgKGUuZy4gdGhlIG5hcGFyaSBgSW1hZ2VgXG4gICAqICBtb2RlLCBvdGhlcndpc2UgaGlkZGVuKS4gVGhlIGhvc3QgYXBwIHNldHMgdGhpcyBmcm9tIGEgYD90ZXN0PTFgIFVSTFxuICAgKiAgdG9nZ2xlLiBPZmYgYnkgZGVmYXVsdCwgc28gcHJvZHVjdGlvbiB1c2VycyBuZXZlciBzZWUgdGhlbS4gKi9cbiAgQElucHV0KClcbiAgdGVzdE1vZGUgPSBmYWxzZTtcblxuICAvKiogSW1hZ2Utc21vb3RoaW5nIHN0YXRlIGZvciB0aGUgdG9vbGJhcidzIFNtb290aGVuIHRvZ2dsZSAoT1NEIG9ubHkpLlxuICAgKiAgRGVmYXVsdHMgdG8gYGZhbHNlYCBzbyBPU0Qgc2hvd3MgcmF3IHBpeGVscyAobmVhcmVzdC1uZWlnaGJvdXIpLiAqL1xuICBwcm90ZWN0ZWQgaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIGZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbG9hZGVkRmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGltYWdlSW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZDtcblxuICAvLyDilIDilIAgVGhlIGxvYWRpbmcgb3ZlcmxheSwgYXMgc2lnbmFsczogaXQgaXMgZmVkIGJ5IHRoZSBob3N0J3MgYW5kIHRoZSBiYWNrZW5kcycgc3RyZWFtc1xuICAvLyBhbmQgYnkgdGhlIHJlbmRlciBzZXNzaW9uLCBhbGwgb2Ygd2hpY2ggbGFuZCBvdXRzaWRlIHRoaXMgdmlldydzIHRlbXBsYXRlIGV2ZW50cy4g4pSA4pSAXG4gIHByb3RlY3RlZCByZWFkb25seSBsb2FkaW5nTWVzc2FnZSA9IHNpZ25hbCgnTG9hZGluZyBpbWFnZS4uLicpO1xuICAvKiogVGhlIGhvc3QgaXMgbG9hZGluZyBhdCB6b29tICh0aGUgb3ZlcmxheSBtZXNzYWdlIG1vdmVzIG91dCBvZiB0aGUgd2F5KS4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHpvb20gPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RhY2tMb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltZ0xvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9hZGluZ1BlcmNlbnRhZ2UgPSBzaWduYWwoMCk7XG4gIC8vIE5vbi1udWxsICgwLi4xMDApIHdoaWxlIGppdC1zZXJ2aWNlIGlzIGNvcHlpbmcgdGhlIHNvdXJjZSBmaWxlIGludG8gdGhlXG4gIC8vIGxvY2FsIGNhY2hlIFBWQyBvbiBmaXJzdCBjbGljay4gV2hlbiBzZXQsIHRoZSBsb2FkaW5nIG92ZXJsYXkgc3dhcHMgdGhlXG4gIC8vIHNwaW5uZXIgZm9yIGEgZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgYmFyIHdpdGggYSBcIkNhY2hpbmcgaW1hZ2VcIiBtZXNzYWdlLlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FjaGVQcm9ncmVzcyA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgLyoqIEEgaml0LXNlcnZpY2UgY2FjaGUgY29weSBpcyBhY3RpdmVseSBpbiBwcm9ncmVzcyAoZGV0ZXJtaW5hdGUgMC4uOTkpLiBEcml2ZXMgdGhlIGNhY2hlXG4gICAqICBwcm9ncmVzcyBiYXIgaW5kZXBlbmRlbnRseSBvZiBgaW1nTG9hZGluZ2Agc28gdGhlIGJhciBjYW4ndCBiZSBkcm9wcGVkIOKAlCBvciBtYXNrZWQgYnkgdGhlXG4gICAqICBcIlNoYXJwZW5pbmcgcHJldmlldy4uLlwiIG92ZXJsYXkg4oCUIG1pZC1kb3dubG9hZCBpZiB0aGUgbG9hZGluZyBmbGFnIGZsaXBzIGVhcmx5LiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNDYWNoaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNhY2hlUHJvZ3Jlc3MoKTtcbiAgICByZXR1cm4gcCAhPT0gbnVsbCAmJiBwIDwgMTAwO1xuICB9KTtcblxuICAvKiogRW1pdHMgb25jZSB3aGVuIHRoaXMgdmlldyBpcyBkZXN0cm95ZWQ7IHRoZSBjb2xsYWJvcmF0b3JzIGVuZCB0aGVpciBzdWJzY3JpcHRpb25zIG9uIGl0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3llZCQgPSBuZXcgT2JzZXJ2YWJsZTx2b2lkPigoc3Vic2NyaWJlcikgPT5cbiAgICB0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xuICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIH0pLFxuICApO1xuICAvKiogSG9zdCBpbWFnZS1pbmZvIG9iamVjdHMgd2hvc2Ugb25lLXNob3QgYGluaXRpYWxaSW5kZXhgIHdhcyBhbHJlYWR5IGFwcGxpZWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uc3VtZWRTbGljZUhpbnRzID0gbmV3IFdlYWtTZXQ8SUltYWdlSW5mbz4oKTtcbiAgcHJvdGVjdGVkIHpJbmRleCA9IDA7XG4gIHByb3RlY3RlZCBtYXhJbmRleCA9IDA7XG5cbiAgQFZpZXdDaGlsZCgnY20nKSBjb250ZXh0TWVudSE6IENvbnRleHRNZW51O1xuICBwcm90ZWN0ZWQgY29udGV4dE1lbnVJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuXG4gIC8qKiBUaGUgYXJtZWQgdG9vbCBtb2RlIGFuZCB0aGUgdG9vbGJhcidzIHRvb2wgc2V0dGluZ3MuICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0b29scyA9IG5ldyBUb29sTW9kZXMoXG4gICAgdGhpcy5wbG90U2VydmljZSxcbiAgICB0aGlzLnNlc3Npb24sXG4gICAgdGhpcy5uZ1pvbmUsXG4gICAgKG1vZGUpID0+IHtcbiAgICAgIGlmIChtb2RlICE9PSAnc2FtUG9pbnQnKSB0aGlzLnNlZ21lbnRhdGlvbi5oaWRlKCk7XG4gICAgfSwgLy8gbGVhdmluZyBwb2ludCBtb2RlIGRyb3BzIGl0cyB0b2FzdFxuICAgICgpID0+IHRoaXMuY2hhbmdlZCgpLFxuICApO1xuICBwcm90ZWN0ZWQgZ2V0IGFjdGl2ZURyYWdNb2RlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRvb2xzLmFjdGl2ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0IGFjdGl2ZURyYWdNb2RlKG1vZGU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLnRvb2xzLmFjdGl2ZSA9IG1vZGU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB3YW5kU2Vuc2l0aXZpdHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50b29scy53YW5kU2Vuc2l0aXZpdHk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldCB3YW5kU2Vuc2l0aXZpdHkodjogbnVtYmVyKSB7XG4gICAgdGhpcy50b29scy53YW5kU2Vuc2l0aXZpdHkgPSB2O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgYnJ1c2hTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHMuYnJ1c2hTaXplO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdmVydGV4RXJhc2VyUmFkaXVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHMudmVydGV4RXJhc2VyUmFkaXVzO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgdmVydGV4RXJhc2VyUmFkaXVzKHY6IG51bWJlcikge1xuICAgIHRoaXMudG9vbHMudmVydGV4RXJhc2VyUmFkaXVzID0gdjtcbiAgfVxuXG4gIC8qKiBSZWdpb24gc2V0LW9wZXJhdGlvbnMgb24gdGhlIHNlbGVjdGlvbiwgYW5kIHRoZSBzdG9yZSBtaXJyb3JzIHRoZXkgcmVhZCAoaml0LXVpIzg1KS4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2lvbkFjdGlvbnMgPSBuZXcgUmVnaW9uQWN0aW9ucyhcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLFxuICAgIHRoaXMucmVnaW9uT3BzLFxuICAgICgpID0+IHRoaXMuaW1hZ2VJbmZvPy50cnVlSW1hZ2VTaXplLFxuICAgIChtKSA9PiB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IGtleTogdGhpcy5yZXN1bHRUb2FzdEtleSwgLi4ubSB9KSxcbiAgKTtcbiAgLyoqIEN1c3RvbS10aHJlc2hvbGQgU2ltcGxpZnkgZGlhbG9nIHZpc2liaWxpdHkgKHNlZSB7QGxpbmsgUmVnaW9uQWN0aW9uc30pLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRpc3BsYXlTaW1wbGlmeURpYWxvZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25BY3Rpb25zLmRpc3BsYXlTaW1wbGlmeURpYWxvZztcbiAgfVxuICBwcm90ZWN0ZWQgc2V0IGRpc3BsYXlTaW1wbGlmeURpYWxvZyh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZWdpb25BY3Rpb25zLmRpc3BsYXlTaW1wbGlmeURpYWxvZyA9IHY7XG4gIH1cblxuICAvKiogU0FNIG1vZGVsIHBpY2tlciBvcHRpb25zICsgY3VycmVudCBzZWxlY3Rpb24gKGppdC11aSM5MCBQMSkuIE9ubHkgbW9kZWxzXG4gICAqICB3aXRoIGEgaG9zdGVkIE9OTlggcGFpciAoY29uZmlndXJlZCB2aWEgc2V0U2FtTW9kZWxVcmxzIGF0IGFwcCBpbml0KSBhcmVcbiAgICogIG9mZmVyZWQsIHNvIHRoZSBwaWNrZXIgY2FuJ3Qgc2VsZWN0IGEgbW9kZWwgdGhhdCBjYW4ndCBydW4uICovXG4gIHByb3RlY3RlZCBzYW1Nb2RlbHMgPSBTQU1fTU9ERUxTLmZpbHRlcihpc1NhbU1vZGVsUmVhZHkpLm1hcCgobSkgPT4gKHsgaWQ6IG0uaWQsIGxhYmVsOiBtLmxhYmVsIH0pKTtcbiAgcHJvdGVjdGVkIHNhbU1vZGVsSWQgPSBnZXREZWZhdWx0U2FtTW9kZWxJZCgpO1xuXG4gIC8qKlxuICAgKiBOby1wcm9tcHQgdG9vbHMgcmVnaXN0ZXJlZCB0aHJvdWdoIHtAbGluayBUT09MQkFSX1RPT0xTfSwgZmlsdGVyZWQgdG8gdGhvc2VcbiAgICogd2l0aCBjb25maWd1cmVkIG1vZGVscyBhbmQgc29ydGVkLiBUaGlzIGxpYnJhcnkgcmVnaXN0ZXJzIG5vbmUg4oCUIGEgaG9zdFxuICAgKiBzdXBwbGllcyB0aGVtIOKAlCBzbyBhbiBvcGVuIGJ1aWxkIGhhcyBhbiBlbXB0eSBhcnJheSBoZXJlIGFuZCB0aGUgdG9vbGJhclxuICAgKiBhbmQgaGVscCBkaWFsb2cgc2ltcGx5IG9taXQgdGhhdCBncm91cC5cbiAgICovXG4gIHByb3RlY3RlZCBjb250cmlidXRlZFRvb2xzOiBUb29sYmFyVG9vbENvbnRyaWJ1dGlvbltdID0gW107XG4gIC8qKiBDaGVja3BvaW50cyBhbmQgcGFyYW1ldGVyIHZhbHVlcyBvZiB7QGxpbmsgY29udHJpYnV0ZWRUb29sc30sIGFuZCB0aGVpciBkaWFsb2cuICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0b29sUGFyYW1zOiBUb29sUGFyYW1zTW9kZWw7XG4gIC8qKiBDb250cmlidXRlZCBwbG90IG1vZGVzIGFuZCBkaWFsb2cgdG9vbHMsIGFuZCB0aGVpciBsaXZlIHNlc3Npb25zLiAqL1xuICByZWFkb25seSBjb250cmlidXRpb25zOiBDb250cmlidXRpb25Ib3N0O1xuICAvKiogRGlhbG9nIHRvb2xzIHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgVE9PTEJBUl9UT09MU30gKGBraW5kOiAnZGlhbG9nJ2ApLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRpYWxvZ1Rvb2xzKCk6IFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyaWJ1dGlvbnMuZGlhbG9nVG9vbHM7XG4gIH1cbiAgLyoqIFRoZSBkaWFsb2cgdG9vbCB0aGUgdXNlciBoYXMgb3BlbiAoaXRzIHNlc3Npb24gbWF5IGJlIGJldHdlZW4gcmVuZGVycykuICovXG4gIHByb3RlY3RlZCBnZXQgb3BlbkRpYWxvZ1Rvb2xJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb250cmlidXRpb25zLm9wZW5EaWFsb2dUb29sSWQ7XG4gIH1cbiAgLyoqIFRoZSBvcGVuIGRpYWxvZyB0b29sJ3MgbGl2ZSBkaWFsb2csIGFzIHRoZSB0ZW1wbGF0ZSByZW5kZXJzIGl0LiAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRvb2xEaWFsb2coKTogVG9vbERpYWxvZ1ZpZXcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb250cmlidXRpb25zLnRvb2xEaWFsb2c7XG4gIH1cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbVRvYXN0S2V5ID0gYHNhbS0ke1Zpc3VhbGl6ZXJDb21wb25lbnQubmV4dFRvYXN0SWQrK31gO1xuICAvKipcbiAgICogT3V0bGV0IGZvciB0aGUgbGlicmFyeSdzIG93biByZXN1bHQvZXJyb3Igbm90aWNlcywga2V5ZWQgdG8gdGhpcyBpbnN0YW5jZSBzbyB0aGV5XG4gICAqIGRvIG5vdCBkZXBlbmQgb24gdGhlIGhvc3QgbW91bnRpbmcgYSBrZXlsZXNzIGA8cC10b2FzdD5gIChtb3N0IGhvc3RzIGRvbid0LCBhbmQgYVxuICAgKiBmYWlsZWQgc2VnbWVudGF0aW9uIHRoZW4gbG9va2VkIGxpa2UgYSBkZWFkIGJ1dHRvbikuIERlbGliZXJhdGVseSBOT1QgdGhlIHN0aWNreVxuICAgKiB0b2FzdCdzIGtleTogdGhhdCBpcyBjbGVhcmVkIHdoZW4gYSBydW4gc2V0dGxlcywgd2hpY2ggd291bGQgd2lwZSB0aGUgcmVzdWx0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdFRvYXN0S2V5ID0gYCR7dGhpcy5zYW1Ub2FzdEtleX0tcmVzdWx0YDtcbiAgLyoqIFNlZ21lbnRhdGlvbiBydW5zIGFuZCB0aGVpciBzdGlja3kgcHJvZ3Jlc3MgdG9hc3QuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWdtZW50YXRpb24gPSBuZXcgU2VnbWVudGF0aW9uUnVubmVyKFxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UsXG4gICAgdGhpcy5zYW1Ub2FzdEtleSxcbiAgICB0aGlzLnJlc3VsdFRvYXN0S2V5LFxuICAgICgpID0+IHRoaXMuY2hhbmdlZCgpLFxuICApO1xuXG4gIC8qKiBDaGFubmVscyAmIEhpc3RvZ3JhbSBkaWFsb2cgdmlzaWJpbGl0eSAob3BlbmVkIGZyb20gdGhlIHRvb2xiYXIpLiAqL1xuICBwcm90ZWN0ZWQgc2hvd0NoYW5uZWxIaXN0b2dyYW0gPSBmYWxzZTtcbiAgLyoqIFNwYXRpYWwtb21pY3MgY29udHJvbHMgZGlhbG9nIHZpc2liaWxpdHkgKHRvb2xiYXIgYnV0dG9uKS4gKi9cbiAgcHJvdGVjdGVkIHNob3dTcGF0aWFsQ29udHJvbHMgPSBmYWxzZTtcbiAgLyoqIFJlZ2lvbiBFZGl0b3IgZGlhbG9nIHZpc2liaWxpdHkgKG9wZW5lZCBmcm9tIHRoZSB0b29sYmFyKS4gKi9cbiAgcHJvdGVjdGVkIHNob3dSZWdpb25FZGl0b3IgPSBmYWxzZTtcbiAgLyoqIFJlZ2lvbiBFZGl0b3IgZGlhbG9nIHdpZHRoLiBPbiBvcGVuIGl0IGlzIHNldCB0byB0aGUgY29uZmlndXJlZCBob3N0XG4gICAqICBlbGVtZW50J3MgY3VycmVudCB3aWR0aCwgb3Ig4oCUIHdoZW4gbm8gc2VsZWN0b3IgaXMgY29uZmlndXJlZCAvIHRoZSBlbGVtZW50XG4gICAqICBpc24ndCBmb3VuZCDigJQgdG8gYSBxdWFydGVyIG9mIHRoZSBwYWdlIChzZWUgb3BlblJlZ2lvbkVkaXRvcikuICovXG4gIHByb3RlY3RlZCByZWdpb25FZGl0b3JXaWR0aCA9ICcyNXZ3JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsb3REaXZOYW1lID0gYHZpei1wbG90LSR7cGxvdEluc3RhbmNlU2VxKyt9YDtcbiAgLyoqIFRoZSByZW5kZXIgcGlwZWxpbmU6IHRoZSBuZXdlc3QgaW1hZ2UgKG9yIGltYWdlLWxlc3MgZGF0YXNldCkgYWx3YXlzIHdpbnMuICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZW5kZXI6IEltYWdlUmVuZGVyU2Vzc2lvbiA9IG5ldyBJbWFnZVJlbmRlclNlc3Npb24oe1xuICAgIHBsb3REaXZOYW1lOiB0aGlzLnBsb3REaXZOYW1lLFxuICAgIHZpc3VhbGl6ZXI6IHRoaXMucGxvdFNlcnZpY2UsXG4gICAgekluZGV4OiAoKSA9PiB0aGlzLnpJbmRleCxcbiAgICBwbG90VHlwZTogKCkgPT4gdGhpcy5wbG90VHlwZSxcbiAgICBpc0hlYXRtYXA6ICgpID0+IHRoaXMuaXNIZWF0bWFwLFxuICAgIGlzQ2FjaGluZzogKCkgPT4gdGhpcy5pc0NhY2hpbmcoKSxcbiAgICBiZWZvcmVSZXNldDogKCkgPT4gdGhpcy5jb250cmlidXRpb25zLmVuZFNlc3Npb25zKCksXG4gICAgcHJlcGFyZTogKGluZm8pID0+IHRoaXMubGF5T3V0U2xpY2VzKGluZm8pLFxuICAgIHJlbGVhc2VPdmVybGF5OiAoaW5mbykgPT4ge1xuICAgICAgaWYgKGluZm8uaXNTdGFjayAmJiBpbmZvLnNob3dTdGFjaykgdGhpcy5zdGFja0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICB9LFxuICAgIGxhbmRlZDogKGluZm8pID0+IHtcbiAgICAgIC8vIFRoZSBob3N0J3MgSHR0cENsaWVudCBjYXJyaWVzIGEgc2VydmVyLXNpZGUgcmVnaW9uIHNvdXJjZSdzIHJlcXVlc3RzOiBpdHMgaW50ZXJjZXB0b3JzIChhdXRoKSBhcHBseS5cbiAgICAgIGNvbnN0IGh0dHAgPSB0aGlzLmluamVjdG9yPy5nZXQoSHR0cENsaWVudCwgbnVsbCkgPz8gdW5kZWZpbmVkO1xuICAgICAgYXBwbHlJbWFnZVJvaXMoaW5mbywgdGhpcy5wbG90U2VydmljZSwgdGhpcy56SW5kZXgsIHRoaXMudml6Q29uZmlnPy5yZWdpb25Tb3VyY2VNaW5DaGFycywgaHR0cCk7XG4gICAgICB0aGlzLmNvbnRyaWJ1dGlvbnMuYWN0aXZhdGUoKTtcbiAgICB9LFxuICAgIHNldEltYWdlTG9hZGluZzogKGxvYWRpbmcpID0+IHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGxvYWRpbmcpLFxuICAgIGFsZXJ0OiAoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCkgPT5cbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiB0aGlzLnZpekFsZXJ0VG9hc3RLZXksIHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwgfSksXG4gICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpLFxuICB9KTtcbiAgcGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJvdGVjdGVkIGlzSGVhdG1hcCA9IHRydWU7XG4gIHByb3RlY3RlZCBhY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gIC8qKiBXaGV0aGVyIHRoZSBuYXBhcmkgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gaXMgc2hvd24gKHZvbHVtZS9pc29zdXJmYWNlKS4gKi9cbiAgcHJvdGVjdGVkIGF4ZXNWaXNpYmxlID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHdpcmVmcmFtZUFjdGl2ZSA9IGZhbHNlO1xuICAvKiogbmFwYXJpIDNEIGRlY2ltYXRlIGZhY3RvciAoMSA9IEZ1bGwg4oCmIDggPSDihZs7IGRlZmF1bHQgwr0pOyBjaGFuZ2luZyBpdCByZS1wbG90cy4gKi9cbiAgcHJvdGVjdGVkIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuXG4gIC8qKiBUaGUgc2VsZWN0b3IncyBlbnRyaWVzOiB0aGUgYnVpbHQtaW4gcGxvdCB0eXBlcyB0aGUgYWN0aXZlIGJhY2tlbmRcbiAgICogIGFkdmVydGlzZXMgKDNEIGdhdGVkIGJ5IGNhcGFiaWxpdHkpLCB0aGVuIGFueSBjb250cmlidXRlZCBtb2Rlc1xuICAgKiAgKHtAbGluayBQTE9UX1RZUEVfQ09OVFJJQlVUSU9OU30pLiAqL1xuICBwcm90ZWN0ZWQgcGxvdFR5cGVNZW51OiBQbG90VHlwZU9wdGlvbltdID0gW107XG4gIC8qKlxuICAgKiBUaGUgYnVpbHQtaW4gcGxvdCB0eXBlcyBvbiBvZmZlciDigJQge0BsaW5rIHBsb3RUeXBlTWVudX0gd2l0aG91dCBjb250cmlidXRlZFxuICAgKiBtb2Rlcy4gS2VwdCB3aXRoIGl0cyBvcmlnaW5hbCB0eXBlIHNvIGV4aXN0aW5nIHJlYWRlcnMgYXJlIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGxvdFR5cGVPcHRpb25zOiBQbG90VHlwZURlc2NyaXB0b3JbXSA9IFtdO1xuICAvKipcbiAgICogV2hhdCB0aGUgc2VsZWN0b3Igc2hvd3M6IGEgYnVpbHQtaW4gdHlwZSBvciBhIGNvbnRyaWJ1dGVkIG1vZGUncyBpZC4gRXZlcnlcbiAgICogcmVuZGVyaW5nIGFuZCB0b29sIGRlY2lzaW9uIGdvZXMgdGhyb3VnaCB7QGxpbmsgYmFzZVBsb3RUeXBlfSBpbnN0ZWFkLCBzbyBhXG4gICAqIGNvbnRyaWJ1dGVkIG1vZGUgYmVoYXZlcyBleGFjdGx5IGxpa2UgdGhlIGJ1aWx0LWluIHR5cGUgaXQgcmlkZXMgb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRQbG90VHlwZUlkOiBQbG90VHlwZUlkID0gUGxvdFR5cGUuSU1BR0U7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsdC1pbiBwbG90IHR5cGUgYmVpbmcgcmVuZGVyZWQuIFdpdGggbm8gY29udHJpYnV0ZWQgbW9kZSBhY3RpdmUgdGhpc1xuICAgKiBpcyB0aGUgc2VsZWN0aW9uIGl0c2VsZjsgZHVyaW5nIG9uZSBpdCBpcyB0aGUgbW9kZSdzIGBiYXNlVHlwZWAuIEtlcHQgd2l0aCBpdHNcbiAgICogb3JpZ2luYWwgYFBsb3RUeXBlYCB0eXBlIGZvciBleGlzdGluZyByZWFkZXJzIOKAlCB1c2Uge0BsaW5rIHNlbGVjdGVkUGxvdFR5cGVJZH1cbiAgICogZm9yIHRoZSBzZWxlY3RvcidzIGlkLiBBc3NpZ25pbmcgc2VsZWN0cyB0aGF0IGJ1aWx0LWluIHR5cGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNlbGVjdGVkUGxvdFR5cGUoKTogUGxvdFR5cGUge1xuICAgIHJldHVybiB0aGlzLmJhc2VQbG90VHlwZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0IHNlbGVjdGVkUGxvdFR5cGUodHlwZTogUGxvdFR5cGUpIHtcbiAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCA9IHR5cGU7XG4gIH1cblxuICAvKiogQ29udHJpYnV0ZWQgcGxvdCBtb2RlcyBhbmQgdGhlaXIgc2luZ2xlIGxpdmUgc2Vzc2lvbi4gKi9cbiAgZ2V0IHBsb3RNb2RlcygpOiBQbG90TW9kZUNvbnRyb2xsZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRyaWJ1dGlvbnMucGxvdE1vZGVzO1xuICB9XG4gIC8qKiBUaGUgbGl2ZSBjb250cmlidXRlZCBtb2RlJ3Mgc2lkZSBwYW5lbDsgbnVsbCB3aGlsZSBubyBjb250cmlidXRlZCBzZXNzaW9uIGlzIGxpdmUuICovXG4gIHByb3RlY3RlZCBnZXQgcGxvdE1vZGVQYW5lbCgpOiBQbG90TW9kZVBhbmVsVmlldyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRyaWJ1dGlvbnMucGxvdE1vZGVQYW5lbDtcbiAgfVxuXG4gIC8qKiBXaGVyZSBhIGBtb3VudGAgcGFuZWwncyBob3N0IGVsZW1lbnQgaXMgYXR0YWNoZWQgb25jZSB0aGUgZGlhbG9nIHJlbmRlcnMuICovXG4gIEBWaWV3Q2hpbGQoJ3Bsb3RNb2RlUGFuZWxTbG90JylcbiAgc2V0IHBsb3RNb2RlUGFuZWxTbG90KHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNvbnRyaWJ1dGlvbnMuYXR0YWNoUGFuZWxTbG90KHJlZj8ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICAvKiogVGhlIGJ1aWx0LWluIHR5cGUgYWN0dWFsbHkgcmVuZGVyZWQgZm9yIHtAbGluayBzZWxlY3RlZFBsb3RUeXBlSWR9OiBpdHNlbGZcbiAgICogIGZvciBhIGJ1aWx0LWluIHR5cGUsIGBiYXNlVHlwZWAgZm9yIGEgY29udHJpYnV0ZWQgbW9kZS4gKi9cbiAgcHJvdGVjdGVkIGdldCBiYXNlUGxvdFR5cGUoKTogUGxvdFR5cGUge1xuICAgIHJldHVybiB0aGlzLnBsb3RNb2Rlcy5iYXNlVHlwZU9mKHRoaXMuc2VsZWN0ZWRQbG90VHlwZUlkKTtcbiAgfVxuXG4gIC8qKiBEaXYgdGhlIGZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIGluc2V0IGlzIGNoYXJ0ZWQgaW50by4gUGVyIGluc3RhbmNlLCBsaWtlXG4gICAqICB7QGxpbmsgcGxvdERpdk5hbWV9OiB0aGUgYmFja2VuZCByZXNvbHZlcyBpdCBieSBpZCwgc28gYSBmaXhlZCBpZCBtYWRlIHR3byBsaXZlXG4gICAqICB2aWV3ZXJzIGRyYXcgYm90aCBpbnNldHMgaW50byB3aGljaGV2ZXIgZGl2IGNhbWUgZmlyc3QgaW4gdGhlIGRvY3VtZW50LiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZW5zaXR5SW5zZXREaXYgPSBgJHt0aGlzLnBsb3REaXZOYW1lfS1pbnNldGA7XG5cbiAgLyoqIFRvb2xiYXIgZG9ja2luZzogZG9ja2VkIGFjcm9zcyB0aGUgdG9wIGJ5IGRlZmF1bHQ7IGRyYWdnaW5nIGl0cyBoYW5kbGVcbiAgICogIGRldGFjaGVzIGl0IGludG8gYSBmbG9hdGluZywgbW92YWJsZSB3aW5kb3cgKGZyZWVzIHRoZSB0b3Agcm93IGZvciB0aGVcbiAgICogIHZpc3VhbGl6YXRpb24pLiAqL1xuICBwcm90ZWN0ZWQgdG9vbGJhckZsb2F0aW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCB0b29sYmFyUG9zID0geyB4OiA4LCB5OiA4IH07XG4gIC8qKiBXaGVyZSBhIHRvb2xiYXItaGFuZGxlIGRyYWcgc3RhcnRzIGZyb206IGdyYWJiaW5nIHRoZSBkb2NrZWQgdG9vbGJhciBmbG9hdHMgaXQuICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0b29sYmFyRHJhZ09yaWdpbiA9ICgpOiBGbG9hdGluZ1BvcyA9PiB7XG4gICAgaWYgKCF0aGlzLnRvb2xiYXJGbG9hdGluZykge1xuICAgICAgdGhpcy50b29sYmFyRmxvYXRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy50b29sYmFyUG9zID0geyB4OiA4LCB5OiA4IH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRvb2xiYXJQb3M7XG4gIH07XG4gIC8qKiBUaGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgKGFsd2F5cyBtb3VudGVkOyBzaG93cyBpdHNlbGYgd2hpbGUgbGluZXMgZXhpc3QpLiAqL1xuICBAVmlld0NoaWxkKEludGVuc2l0eUluc2V0Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnNldD86IEludGVuc2l0eUluc2V0Q29tcG9uZW50O1xuXG4gIC8qKiBUcnVlIHdoaWxlIHRoZSAzRCBzcGF0aWFsIGNsb3VkIGlzIHRoZSBhY3RpdmUgbW9kZS4gVGhlIGNvbnRyb2xzIGRyb3AgdGhlIFJPSVxuICAgKiAgc2VsZWN0aW9uIHRoZXJlOiByZWdpb24gdG9vbHMgYXJlIHNjcmVlbi1zcGFjZSwgYW5kIGFnYWluc3QgYW4gb3JiaXRpbmdcbiAgICogIGNhbWVyYSBhIGRyYXduIHJlY3RhbmdsZSBoYXMgbm8gZml4ZWQgbWVhbmluZyBpbiB0aGUgZGF0YS4gKi9cbiAgcHJvdGVjdGVkIGdldCBpc1NwYXRpYWwzZE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU3BhdGlhbE9taWNzM2QodGhpcy5iYXNlUGxvdFR5cGUpO1xuICB9XG5cbiAgLyoqIFRydWUgaW4gYSBuYXBhcmkgdm9sdW1lIG9yIGlzb3N1cmZhY2Ugdmlldywgd2hlcmUgdGhlIFJlZ2lvbiBFZGl0b3Igc2hvd3MgcmVnaW9ucyBpbiAzRC4gKi9cbiAgcHJvdGVjdGVkIGdldCBpc1ZvbHVtZVZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmFwYXJpVm9sdW1lKHRoaXMuYmFzZVBsb3RUeXBlKSB8fCBpc05hcGFyaUlzb3N1cmZhY2UodGhpcy5iYXNlUGxvdFR5cGUpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgc3BsaXQgdGhlIHZvbHVtZSB2aWV3IHdpdGggdGhlIHNsaWNlIGVkaXRvciAob2ZmIGJ5IGRlZmF1bHQ7IGtlcHQgd2hpbGVcbiAgICogIHRoZSB2aWV3IHNob3dzIG90aGVyIHBsb3QgdHlwZXMsIHNvIGEgdm9sdW1lIHZpZXcgb3BlbnMgc3BsaXQgYWdhaW4pLiAqL1xuICBwcm90ZWN0ZWQgc2xpY2VFZGl0b3IgPSBmYWxzZTtcbiAgLyoqIFRoZSBzbGljZSBlZGl0b3IncyBwYW5lOiB0aGUgZGlzcGxheWVkIHNsaWNlLCB3aXRoIGV2ZXJ5IHJlZ2lvbiB0b29sLCB0b3AgcmlnaHQuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzbGljZURpdk5hbWUgPSBgJHt0aGlzLnBsb3REaXZOYW1lfS1zbGljZWA7XG4gIC8qKiBUaGUgbGVmdCBjb2x1bW4ncyBhbmQgdGhlIHRvcCByb3cncyBzaGFyZXMgb2YgdGhlIHNsaWNlIGVkaXRvciAoJSkuICovXG4gIHByb3RlY3RlZCBzcGxpdFggPSA1MDtcbiAgcHJvdGVjdGVkIHNwbGl0WSA9IDUwO1xuICAvKiogVGhlIHNlY3Rpb25zIHRocm91Z2ggeCBhbmQgeSBzaG93biBiZWxvdyAobnVsbHMgdW50aWwgdGhlIHZvbHVtZSBpcyBjdXQpLiAqL1xuICBwcm90ZWN0ZWQgc2VjdGlvbnM6IFNlY3Rpb25WaWV3cyA9IHsgeDogbnVsbCwgeTogbnVsbCB9O1xuICBwcm90ZWN0ZWQgZ2V0IHNsaWNlRWRpdG9yU2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VFZGl0b3IgJiYgdGhpcy5pc1ZvbHVtZVZpZXc7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgdGhlIHZvbHVtZSB2aWV3IHdpdGggdGhlIHNsaWNlIGVkaXRvciwgb3IgY2xvc2UgaXQuIFRoZSBlZGl0b3Igb3BlbnMgb24gdGhlIGRpc3BsYXllZFxuICAgKiBzbGljZSBhbmQgdGFrZXMgdGhlIGRyYXdpbmcgdG9vbHM7IGNsb3NpbmcgaXQgbGVhdmVzIHRoZSBzZWxlY3Rpb24gdG9vbCBhcm1lZCAoaXQgcGlja3MgdGhlXG4gICAqIHN1cmZhY2VzIGluIDNEKSBhbmQgZGlzYXJtcyBhbnkgb3RoZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdG9nZ2xlU2xpY2VFZGl0b3IoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zbGljZUVkaXRvciA9ICF0aGlzLnNsaWNlRWRpdG9yO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8gdGhlIHBhbmUncyBkaXYsIGJlZm9yZSB0aGUgYmFja2VuZCBsb29rcyBpdCB1cFxuICAgIHRoaXMucGxvdFNlcnZpY2UucmVsYXlvdXQoKTsgLy8gdGhlIDNEIHZpZXcgaXMgYSBxdWFydGVyIG9mIHRoZSBhcmVhIG5vdywgb3IgYWxsIG9mIGl0IGFnYWluXG4gICAgaWYgKCF0aGlzLnNsaWNlRWRpdG9yKSB7XG4gICAgICBhd2FpdCB0aGlzLnBsb3RTZXJ2aWNlLnNldFNsaWNlRWRpdG9yPy4obnVsbCk7XG4gICAgICBpZiAodGhpcy50b29scy5hY3RpdmUgIT09IG51bGwgJiYgdGhpcy50b29scy5hY3RpdmUgIT09ICdzZWxlY3QnKSB0aGlzLnRvb2xzLmFwcGx5KG51bGwpO1xuICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSByZWdpb25zIGVkaXRlZCBhcmUgdGhlIGRpc3BsYXllZCBzbGljZSdzLlxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0RGlzcGxheVNsaWNlKHRoaXMuekluZGV4KTtcbiAgICBjb25zdCBzaG93biA9IGF3YWl0IHRoaXMucGxvdFNlcnZpY2Uuc2V0U2xpY2VFZGl0b3I/Lih0aGlzLnNsaWNlRGl2TmFtZSk7XG4gICAgLy8gVGhlIGFybWVkIHRvb2wgbm93IGFjdHMgaW4gdGhlIHBhbmUuXG4gICAgaWYgKHNob3duICYmIHRoaXMudG9vbHMuYWN0aXZlICE9PSBudWxsKSB0aGlzLnRvb2xzLmFwcGx5KHRoaXMudG9vbHMuYWN0aXZlKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBBIHBvaW50IHBpY2tlZCBpbiBhIHNlY3Rpb246IHRoZSBzbGljZSBhbmQgdGhlIG90aGVyIHNlY3Rpb24ncyBwbGFuZSBtb3ZlIHRoZXJlLiAqL1xuICBwcm90ZWN0ZWQgb25TZWN0aW9uUGljayhheGlzOiBTZWN0aW9uQXhpcywgYXQ6IHsgdTogbnVtYmVyOyB2OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIC8vIFRocm91Z2ggeCwgYWNyb3NzIGlzIHRoZSBzbGljZSBhbmQgZG93biBpcyB5OyB0aHJvdWdoIHksIGFjcm9zcyBpcyB4IGFuZCBkb3duIHRoZSBzbGljZS5cbiAgICBjb25zdCBzbGljZSA9IE1hdGguZmxvb3IoYXhpcyA9PT0gJ3gnID8gYXQudSA6IGF0LnYpO1xuICAgIGlmIChheGlzID09PSAneCcpIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2VjdGlvblBsYW5lPy4oJ3knLCBhdC52KTtcbiAgICBlbHNlIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2VjdGlvblBsYW5lPy4oJ3gnLCBhdC51KTtcbiAgICB0aGlzLm9uWlNsaWRlKE1hdGgubWluKHRoaXMubWF4SW5kZXgsIE1hdGgubWF4KDAsIHNsaWNlKSkpO1xuICB9XG5cbiAgLyoqIERyYWcgYSBkaXZpZGVyIG9mIHRoZSBzbGljZSBlZGl0b3I6IHRoZSB2ZXJ0aWNhbCBvbmUgc2V0cyB0aGUgY29sdW1ucywgdGhlIGhvcml6b250YWwgb25lIHRoZSByb3dzLiAqL1xuICBwcm90ZWN0ZWQgc3RhcnRQYW5lUmVzaXplKGV2ZW50OiBQb2ludGVyRXZlbnQsIGF4aXM6ICd4JyB8ICd5Jyk6IHZvaWQge1xuICAgIGNvbnN0IGRpdmlkZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHBhbmVzID0gZGl2aWRlci5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghcGFuZXMpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGRpdmlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICBjb25zdCBtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgYm94ID0gcGFuZXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoYXhpcyA9PT0gJ3gnICYmIGJveC53aWR0aCA+IDApIHRoaXMuc2V0U3BsaXQoJ3gnLCAoKGUuY2xpZW50WCAtIGJveC5sZWZ0KSAvIGJveC53aWR0aCkgKiAxMDApO1xuICAgICAgaWYgKGF4aXMgPT09ICd5JyAmJiBib3guaGVpZ2h0ID4gMCkgdGhpcy5zZXRTcGxpdCgneScsICgoZS5jbGllbnRZIC0gYm94LnRvcCkgLyBib3guaGVpZ2h0KSAqIDEwMCk7XG4gICAgfTtcbiAgICBjb25zdCBlbmQgPSAoKSA9PiB7XG4gICAgICBkaXZpZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICBkaXZpZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICBkaXZpZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xuICAgIH07XG4gICAgZGl2aWRlci5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xuICAgIGRpdmlkZXIuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICBkaXZpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xuICB9XG5cbiAgLyoqIEEgZGl2aWRlcidzIGtleWJvYXJkOiDihpAg4oaSIG1vdmUgdGhlIHZlcnRpY2FsIG9uZSwg4oaRIOKGkyB0aGUgaG9yaXpvbnRhbCBvbmUsIGJ5IDUlLiAqL1xuICBwcm90ZWN0ZWQgbnVkZ2VQYW5lU2l6ZShldmVudDogS2V5Ym9hcmRFdmVudCwgYXhpczogJ3gnIHwgJ3knKTogdm9pZCB7XG4gICAgY29uc3Qga2V5cyA9IGF4aXMgPT09ICd4JyA/IFsnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnXSA6IFsnQXJyb3dVcCcsICdBcnJvd0Rvd24nXTtcbiAgICBjb25zdCBzdGVwID0gZXZlbnQua2V5ID09PSBrZXlzWzBdID8gLTUgOiBldmVudC5rZXkgPT09IGtleXNbMV0gPyA1IDogMDtcbiAgICBpZiAoIXN0ZXApIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBub3QgYSBzbGljZSBzdGVwXG4gICAgdGhpcy5zZXRTcGxpdChheGlzLCAoYXhpcyA9PT0gJ3gnID8gdGhpcy5zcGxpdFggOiB0aGlzLnNwbGl0WSkgKyBzdGVwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3BsaXQoYXhpczogJ3gnIHwgJ3knLCBwZXJjZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQoTWF0aC5taW4oODAsIE1hdGgubWF4KDIwLCBwZXJjZW50KSkpO1xuICAgIGlmIChheGlzID09PSAneCcpIHRoaXMuc3BsaXRYID0gdmFsdWU7XG4gICAgZWxzZSB0aGlzLnNwbGl0WSA9IHZhbHVlO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgIC8vIFRoZSAzRCB2aWV3IGZvbGxvd3MgaXRzIGNlbGwgb25jZSB0aGUgZ3JpZCBoYXMgaXRzIG5ldyB0cmFja3MuXG4gICAgaWYgKHRoaXMucmVsYXlvdXRGcmFtZSA9PT0gbnVsbCAmJiB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5yZWxheW91dEZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxheW91dEZyYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZWxheW91dCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVsYXlvdXRGcmFtZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRydWUgZm9yIHRoZSBJbWFnZSBwbG90IHR5cGUsIHdoaWNoIHJlbmRlcnMgYXMgYSBuYXRpdmVseSBwYW4vem9vbS1hYmxlXG4gICAqICByYXN0ZXIg4oCUIHNvIHRoZSBiYWNrZW5kLWFnbm9zdGljIHpvb20vcGFuIHRvb2xiYXIgdG9vbHMgYXJlIGhpZGRlbi4gVGhlXG4gICAqICBjb21wb25lbnQgZHJpdmVzIHRoaXMgb2ZmIHRoZSBwbG90IHR5cGUsIG5vdCB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIHByb3RlY3RlZCBnZXQgaXNJbWFnZVZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVBsb3RUeXBlID09PSBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGJhbmQgYXMgYSAw4oCTMjU1IHNsaWRlciBwb3NpdGlvbiwgbWFwcGVkIG9udG8gdGhlIHZvbHVtZSdzIHJlYWxcbiAgICogIGludGVuc2l0eSByYW5nZSBieSB0aGUgcmVuZGVyZXIuIERlZmF1bHRzIHRvIHRoZSBmdWxsIHJhbmdlLiAqL1xuICBwcm90ZWN0ZWQgaXNvUmFuZ2U6IG51bWJlcltdID0gWzAsIDI1NV07XG5cbiAgLyoqIFRoZSBzcGF0aWFsLW9taWNzIGRhdGFzZXQgb24gb2ZmZXIgYW5kIHRoZSBnYXRlcyBpdCBwdXRzIG9uIHRoZSBzZWxlY3Rvci4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNwYXRpYWw6IFNwYXRpYWxEYXRhc2V0QmluZGVyO1xuICAvKiogV2hldGhlciBhIHNwYXRpYWwtb21pY3MgZGF0YXNldCBpcyBwdWJsaXNoZWQgb24gYFNQQVRJQUxfREFUQV9QT1JUYCDigJQgZ2F0ZXMgdGhlXG4gICAqICBzcGF0aWFsIHBsb3QgdHlwZXM7IHRoZSB0b29sYmFyIG9mZmVycyB0aGUgcGxvdCBtb2RlcyBmb3IgYW4gaW1hZ2UtbGVzcyBvbmUgdG9vLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGhhc1NwYXRpYWxEYXRhc2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWwuaGFzRGF0YXNldDtcbiAgfVxuXG4gIC8qKiBLZXlib2FyZCwgd2hlZWwgYW5kIGNvbnRleHQtbWVudSBoYW5kbGluZzsgY3JlYXRlZCBvbmNlIHRoZSB2aWV3IGV4aXN0cy4gKi9cbiAgcHJpdmF0ZSBzaG9ydGN1dHM/OiBWaWV3ZXJTaG9ydGN1dHM7XG4gIC8qKiBXYWl0cyBmb3IgYSB2aWV3ZXIgY3JlYXRlZCBvdXRzaWRlIHRoZSBkb2N1bWVudCB0byBiZSBhdHRhY2hlZCAoc2VlIHtAbGluayB3aGVuSW5Eb2N1bWVudH0pLiAqL1xuICBwcml2YXRlIGF0dGFjaE9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKHNlZSBTbGljZVNjcnViYmVyIOKAlCByZWZhY3RvcmluZyBwbGFuIFN0ZXAgNykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NydWJiZXIgPSBuZXcgU2xpY2VTY3J1YmJlcigoeikgPT4ge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0WkluZGV4KHopO1xuICAgIC8vIEluIGEgcGVyLXNsaWNlIHotc3RhY2sgc2Vzc2lvbiB0aGUgc3RvcmUgc3dhcHMgdGhlIGxpdmUgcmVnaW9uIHNldCB0byB0aGlzXG4gICAgLy8gc2xpY2UgKHByZXNlcnZpbmcgZWRpdHMgbWFkZSBvbiB0aGUgcHJldmlvdXMgb25lKTsgb3V0c2lkZSBzdGFjayBtb2RlIHRoaXNcbiAgICAvLyBqdXN0IHJlY29yZHMgdGhlIHNsaWNlLCBsZWF2aW5nIHNpbmdsZS1wbGFuZSByZWdpb25zIHVudG91Y2hlZCAoaml0LXVpIzkzKS5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldERpc3BsYXlTbGljZSh6KTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgYmVsb3cgYXJlIHRoZSBpbmplY3Rpb24gcG9pbnRzOyBub25lIGlzIHB1YmxpYyBBUEkuXG4gICAgQEluamVjdChJTUFHRV9TVEFURV9QT1JUKSBwcml2YXRlIHN0YXRlOiBJbWFnZVN0YXRlUG9ydCxcbiAgICBASW5qZWN0KFZJU1VBTElaRVIpIHB1YmxpYyBwbG90U2VydmljZTogSVZpc3VhbGl6ZXIsXG4gICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHNlc3Npb246IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICBwcml2YXRlIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVnaW9uT3BzOiBSZWdpb25PcHNTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSB2aXpDb25maWc/OiBWaXpDb25maWcsXG4gICAgLy8gQSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgcmF0aGVyIHRoYW4gYSBmaWVsZCBgaW5qZWN0KClgOiB0aGlzIGNvbXBvbmVudCBpc1xuICAgIC8vIGFsc28gY29uc3RydWN0ZWQgZGlyZWN0bHkgd2l0aCBgbmV3YCBpbiBpdHMgb3duIHNwZWNzLCB3aGljaCBpcyBvdXRzaWRlXG4gICAgLy8gYW4gaW5qZWN0aW9uIGNvbnRleHQgYW5kIHdvdWxkIHRocm93IE5HMDIwMyBvbiBhIGZpZWxkIGluaXRpYWxpemVyLlxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVE9PTEJBUl9UT09MUykgdG9vbENvbnRyaWJ1dGlvbnM/OiByZWFkb25seSBUb29sYmFyQ29udHJpYnV0aW9uW10sXG4gICAgLy8gT3B0aW9uYWwgbGlrZSB0aGUgcmVzdDogYSBob3N0IHRoYXQgc2hvd3Mgb25seSBpbWFnZXMgbmV2ZXIgcHJvdmlkZXMgaXQsXG4gICAgLy8gYW5kIHRoZSBzcGF0aWFsIHBsb3QgdHlwZXMgc2ltcGx5IHN0YXkgaGlkZGVuLlxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpIHByaXZhdGUgc3BhdGlhbERhdGE/OiBTcGF0aWFsRGF0YVBvcnQsXG4gICAgLy8gQ29udHJpYnV0ZWQgcGxvdCBtb2Rlcy4gTGlrZSBUT09MQkFSX1RPT0xTIHRoZSB0b2tlbiBoYXMgbm8gZmFjdG9yeSwgc28gYVxuICAgIC8vIGhvc3QgdGhhdCBwcm92aWRlcyBub25lIGdldHMgbnVsbCBoZXJlIGFuZCB0aGUgc2VsZWN0b3IgaXMgdW5jaGFuZ2VkLlxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUExPVF9UWVBFX0NPTlRSSUJVVElPTlMpIHBsb3RUeXBlQ29udHJpYnV0aW9ucz86IHJlYWRvbmx5IFBsb3RUeXBlQ29udHJpYnV0aW9uW10sXG4gICAgLy8gUGFyZW50IG9mIGEgY29udHJpYnV0ZWQgcGFuZWwgY29tcG9uZW50J3MgaW5qZWN0b3IuIE9wdGlvbmFsIG9ubHkgc28gdGhlXG4gICAgLy8gc3BlY3MgY2FuIGNvbnN0cnVjdCB0aGlzIGNvbXBvbmVudCB3aXRoIGBuZXdgLlxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgaW5qZWN0b3I/OiBJbmplY3RvcixcbiAgICAvLyBUaGUgYDx2aXN1YWxpemVyPmAgZWxlbWVudDoga2V5Ym9hcmQgc2hvcnRjdXRzIGFyZSBzY29wZWQgdG8gaXQgKENPUkUtMikuXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBob3N0UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgLy8gRW5kcyB0aGUgc3Vic2NyaXB0aW9ucyAoYHRha2VVbnRpbERlc3Ryb3llZGApLiBBIHBhcmFtZXRlciwgbGlrZSB0aGUgcmVzdCwgc28gdGhlXG4gICAgLy8gc3BlY3MnIGBuZXdgIGNhbiBwYXNzIG9uZTsgQW5ndWxhciBhbHdheXMgcHJvdmlkZXMgaXQuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmID0gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgRGVzdHJveVJlZixcbiAgKSB7XG4gICAgdGhpcy5jb250cmlidXRlZFRvb2xzID0gdmlzaWJsZVRvb2xDb250cmlidXRpb25zKHRvb2xDb250cmlidXRpb25zKTtcbiAgICB0aGlzLnRvb2xQYXJhbXMgPSBuZXcgVG9vbFBhcmFtc01vZGVsKHRoaXMuY29udHJpYnV0ZWRUb29scyk7XG4gICAgdGhpcy5jb250cmlidXRpb25zID0gbmV3IENvbnRyaWJ1dGlvbkhvc3QocGxvdFR5cGVDb250cmlidXRpb25zLCB0b29sQ29udHJpYnV0aW9ucywge1xuICAgICAgdmlzdWFsaXplcjogdGhpcy5wbG90U2VydmljZSxcbiAgICAgIHpvbmU6IHRoaXMubmdab25lLFxuICAgICAgdG9vbHM6IHRoaXMudG9vbHMucGxvdE1vZGVUb29scyxcbiAgICAgIGluamVjdG9yOiB0aGlzLmluamVjdG9yLFxuICAgICAgaW1hZ2VJbmZvJDogKCkgPT4gdGhpcy5zdGF0ZS5nZXRJbWFnZUluZm8kKCksXG4gICAgICBzZWxlY3RlZElkOiAoKSA9PiB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCxcbiAgICAgIHJlbmRlcmVkVHlwZTogKCkgPT4gdGhpcy5wbG90VHlwZSxcbiAgICAgIHNlbGVjdEJhc2U6IChiYXNlKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZUlkID0gYmFzZTtcbiAgICAgICAgdGhpcy5wbG90VHlwZSA9IGJhc2U7XG4gICAgICB9LFxuICAgICAgbm90aWZ5OiAobSkgPT4gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IHRoaXMucmVzdWx0VG9hc3RLZXksIC4uLm0gfSksXG4gICAgICBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCksXG4gICAgfSk7XG4gICAgdGhpcy5zcGF0aWFsID0gbmV3IFNwYXRpYWxEYXRhc2V0QmluZGVyKHRoaXMuc3BhdGlhbERhdGEsIHtcbiAgICAgIGdhdGVzQ2hhbmdlZDogKCkgPT4gdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCksXG4gICAgICBzZWxlY3RlZElkOiAoKSA9PiB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCxcbiAgICAgIGJhc2VQbG90VHlwZTogKCkgPT4gdGhpcy5iYXNlUGxvdFR5cGUsXG4gICAgICBoYXNJbWFnZTogKCkgPT4gISF0aGlzLmltYWdlSW5mbyxcbiAgICAgIHNlbGVjdFBsb3RUeXBlOiAodHlwZSkgPT4gdGhpcy5vblNlbGVjdFBsb3RUeXBlKHR5cGUpLFxuICAgICAgcmVwbG90OiAoKSA9PiB0aGlzLnJlbG9hZEFuZFBsb3QoKSxcbiAgICAgIHB1Ymxpc2hJbWFnZTogKGluZm8pID0+IHRoaXMuc3RhdGUuc2V0SW1hZ2VJbmZvKGluZm8pLFxuICAgICAgc2V0SW1hZ2VMb2FkaW5nOiAobG9hZGluZykgPT4gdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcobG9hZGluZyksXG4gICAgICBzZXR0bGVkOiAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZSgpO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0sXG4gICAgICBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB0aGlzLmNoYW5nZWQoKSxcbiAgICB9KTtcbiAgICB0aGlzLmNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKiBGb2xsb3cgdGhlIHNwYXRpYWwtb21pY3MgZGF0YXNldDogYSBkYXRhc2V0IGFwcGVhcmluZywgc3dpdGNoaW5nIG9yIGJlaW5nIGNsZWFyZWRcbiAgICogIHJlLWdhdGVzIHRoZSBzZWxlY3RvciBleGFjdGx5IGFzIHRoZSBpbWFnZSBzdHJlYW0gYW5kIHRoZSB0ZXN0LW1vZGUgdG9nZ2xlIGRvLiAqL1xuICBwcml2YXRlIHdhdGNoU3BhdGlhbERhdGFzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zcGF0aWFsLmJpbmQodGhpcy5kZXN0cm95ZWQkKTtcbiAgfVxuXG4gIC8qKiBSZWNvbXB1dGUgdGhlIHNlbGVjdG9yJ3MgZW50cmllcyBmb3IgdGhlIGN1cnJlbnQgaW1hZ2UsIGRhdGFzZXQgYW5kIHRlc3QgbW9kZVxuICAgKiAgKHNlZSB7QGxpbmsgY29tcHV0ZVBsb3RUeXBlTWVudX0pLiAqL1xuICBwcml2YXRlIGNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKSB7XG4gICAgY29uc3QgeyBidWlsdEluLCBtZW51IH0gPSBjb21wdXRlUGxvdFR5cGVNZW51KHtcbiAgICAgIGRlc2NyaXB0b3JzOiB0aGlzLnBsb3RTZXJ2aWNlLmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKSxcbiAgICAgIGNvbnRyaWJ1dGlvbnM6IHRoaXMucGxvdE1vZGVzLmRlc2NyaXB0b3JzKCksXG4gICAgICBjYXBzOiB0aGlzLnBsb3RTZXJ2aWNlLmNhcGFiaWxpdGllcyxcbiAgICAgIGltYWdlSW5mbzogdGhpcy5pbWFnZUluZm8sXG4gICAgICBzcGF0aWFsOiB0aGlzLnNwYXRpYWwsXG4gICAgICB0ZXN0TW9kZTogdGhpcy50ZXN0TW9kZSxcbiAgICB9KTtcbiAgICB0aGlzLnBsb3RUeXBlT3B0aW9ucyA9IGJ1aWx0SW47XG4gICAgdGhpcy5wbG90VHlwZU1lbnUgPSBtZW51O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBjb21wdXRlcyB0aGUgb3B0aW9ucyB3aXRoIHRlc3RNb2RlIHN0aWxsIGF0IGl0cyBkZWZhdWx0O1xuICAgIC8vIHJlY29tcHV0ZSBvbmNlIHRoZSBob3N0IGJpbmRzIGl0IChhbmQgb24gYW55IGxhdGVyIGNoYW5nZSkgc28gdGhlIHNlbGVjdG9yXG4gICAgLy8gcmVmbGVjdHMgdGVzdCBtb2RlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgZm9yIGFuIGltYWdlIHRvIChyZSlsb2FkLlxuICAgIGlmIChjaGFuZ2VzWyd0ZXN0TW9kZSddKSB7XG4gICAgICB0aGlzLmNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKTtcbiAgICAgIC8vIElmIHRlc3QgbW9kZSBpcyB0dXJuZWQgb2ZmIHdoaWxlIGEgdGVzdC1vbmx5IHR5cGUgKGUuZy4gTkFQQVJJX0lNQUdFKSBpc1xuICAgICAgLy8gYWN0aXZlLCB0aGF0IHR5cGUgaXMgbm8gbG9uZ2VyIG9mZmVyZWQg4oCUIGZhbGwgYmFjayB0byBJbWFnZS5cbiAgICAgIHRoaXMucmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwdWJsaXNoZWQgTk8gaW1hZ2Ug4oCUIGEgc3BhdGlhbCBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vbmUgZG9lcyB0aGlzLlxuICAgKlxuICAgKiBXaXRob3V0IGhhbmRsaW5nIHRoZSBlbXB0eSBlbWlzc2lvbiwgYGltYWdlSW5mb2Aga2VlcHMgdGhlIExBU1QgaW1hZ2UncyBtZXRhZGF0YTogdGhlXG4gICAqIHNlbGVjdG9yIGdvZXMgb24gb2ZmZXJpbmcgcGl4ZWwgbW9kZXMgZm9yIHBpeGVscyB0aGF0IGFyZSBnb25lLCBhbmQgZXZlcnlcbiAgICogYGlzU3RhY2tgL2Bpc0dyYXlzY2FsZWAgZGVjaXNpb24gaXMgbWFkZSBhZ2FpbnN0IGEgZmlsZSB0aGF0IGlzIG5vIGxvbmdlciBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIG9uSW1hZ2VDbGVhcmVkKCk6IHZvaWQge1xuICAgIC8vIFRoZSBpbWFnZSBhIGNvbnRyaWJ1dGVkIG1vZGUgd2FzIGRyYXdpbmcgb3ZlciBpcyBnb25lLiBBbiBvcGVuIGRpYWxvZ1xuICAgIC8vIHRvb2wgc3RheXMgb3BlbiBhbmQgcmVzdGFydHMgb25jZSB0aGUgbmV4dCBpbWFnZSBoYXMgcGxvdHRlZC5cbiAgICB0aGlzLmNvbnRyaWJ1dGlvbnMuZW5kU2Vzc2lvbnMoKTtcbiAgICB0aGlzLmltYWdlSW5mbyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvYWRlZEZpbGVOYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICAgIC8vIERlbGliZXJhdGVseSBOT1QgcmVjb25jaWxpbmcgdGhlIHNlbGVjdGVkIHR5cGUgaGVyZS4gUmVjb25jaWxpbmcgY2FsbHNcbiAgICAvLyBgc2V0UGxvdFR5cGVgLCB3aGljaCBkcml2ZXMgYSByZS1wbG90IOKAlCBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBwbG90LCBzbyB0aGVcbiAgICAvLyBQbG90bHkgYmFja2VuZCByZWFkIGl0cyBvd24gbm93LXVuc2V0IGBpbWFnZUluZm9gIGFuZCB0aHJld1xuICAgIC8vIChcImNhbid0IGFjY2VzcyBwcm9wZXJ0eSBpc0dyYXlzY2FsZVwiKSwgYWJvcnRpbmcgdGhlIGxvYWQgd2l0aCBubyBvYnNlcnZhdGlvbnNcbiAgICAvLyBkcmF3bi4gSWdub3JpbmcgdGhlIGVtcHR5IGVtaXNzaW9uIGVudGlyZWx5IGlzIHdoYXQgdXNlZCB0byBhdm9pZCB0aGF0LlxuICAgIC8vXG4gICAgLy8gTm90aGluZyBpcyBsZWZ0IHN0cmFuZGVkOiBhbiBpbWFnZSBpcyBjbGVhcmVkIGJlY2F1c2UgYSBzcGF0aWFsIGRhdGFzZXQgdGhhdFxuICAgIC8vIGJyaW5ncyBub25lIGlzIGJlaW5nIG9wZW5lZCwgYW5kIHRoYXQgZGF0YXNldCdzIG93biBzdWJzY3JpcHRpb24gc2VsZWN0cyB0aGVcbiAgICAvLyBtb2RlIGl0cyBjb29yZGluYXRlcyBzdXBwb3J0IGEgbW9tZW50IGxhdGVyLlxuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIElmIHRoZSBhY3RpdmUgcGxvdCB0eXBlIGlzIG5vIGxvbmdlciBpbiB0aGUgb2ZmZXJlZCBvcHRpb25zIChlLmcuIHRlc3QgbW9kZVxuICAgKiAgdHVybmVkIG9mZiB3aGlsZSBhIHRlc3Qtb25seSB0eXBlIHdhcyBhY3RpdmUsIG9yIGEgc2NhbGFyIHR5cGUgY2FycmllZCBvbnRvXG4gICAqICBhbiBSR0IgaW1hZ2UpLCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgMkQgSW1hZ2Ugdmlldy4gKi9cbiAgcHJpdmF0ZSByZWNvbmNpbGVTZWxlY3RlZFBsb3RUeXBlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZhbGxiYWNrID0gcmVjb25jaWxlUGxvdFR5cGUodGhpcy5wbG90VHlwZU1lbnUsIHRoaXMuc2VsZWN0ZWRQbG90VHlwZUlkKTtcbiAgICBpZiAoIWZhbGxiYWNrKSByZXR1cm47XG4gICAgLy8gTGVhdmluZyBhIGNvbnRyaWJ1dGVkIG1vZGUgKGl0cyBnYXRlcyBzdG9wcGVkIHBhc3NpbmcsIG9yIGl0cyBwcm92aWRlciBpc1xuICAgIC8vIGdvbmUpOiBpdHMgc2Vzc2lvbiBlbmRzIGJlZm9yZSBhbnl0aGluZyBlbHNlIGRyYXdzLlxuICAgIHRoaXMucGxvdE1vZGVzLmRlYWN0aXZhdGUoKTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5wbG90TW9kZXMuYmFzZVR5cGVPZihmYWxsYmFjayk7XG4gICAgaWYgKGJhc2UgIT09IFBsb3RUeXBlLklNQUdFKSB0aGlzLmNsb3NlRGlhbG9nVG9vbCgpO1xuICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZUlkID0gZmFsbGJhY2s7XG4gICAgdGhpcy5wbG90VHlwZSA9IGJhc2U7XG4gICAgdGhpcy5pc0hlYXRtYXAgPSBiYXNlID09PSBQbG90VHlwZS5JTUFHRTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKGJhc2UpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSm9pbiB0aGUgbGl2ZSBzZXQ7IHRoZSBvbGRlc3QgbWVtYmVyIHJlbmRlcnMgdGhlIHNoYXJlZCBub3RpY2Ugb3V0bGV0cy5cbiAgICBWaXN1YWxpemVyQ29tcG9uZW50LmxpdmVJbnN0YW5jZXMuYWRkKHRoaXMpO1xuICAgIHRoaXMuc3RhdGUuc2V0RGlhZ3JhbSh0aGlzLmhvc3RIYW5kbGUpO1xuICAgIHRoaXMud2F0Y2hTcGF0aWFsRGF0YXNldCgpO1xuICAgIC8vIE9TRCBhbmQgbmFwYXJpLWpzIGVtaXQgdGhpcyBmcm9tIHRoZWlyIG93biBcImZpdCB0byB2aWV3XCI6IGRpc2FybSB0aGUgdG9vbCBvblxuICAgIC8vIHRoZSBiYWNrZW5kIHRvbywgbm90IG9ubHkgdGhlIHRvb2xiYXIncyBoaWdobGlnaHQuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldEF1dG9zY2FsZUV2ZW50KClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvb2xzLmFwcGx5KG51bGwpKTtcbiAgICAvLyBMb2FkaW5nL292ZXJsYXkgVUkgbWlycm9ycyAoc2lnbmFsczogdGhleSByZS1yZW5kZXIgdGhlIHZpZXcgdGhlbXNlbHZlcykuXG4gICAgdGhpcy5taXJyb3IodGhpcy5zdGF0ZS5pc0ltYWdlTG9hZGluZyQoKSwgKHYpID0+IHRoaXMuaW1nTG9hZGluZy5zZXQodikpO1xuICAgIHRoaXMubWlycm9yKHRoaXMucGxvdFNlcnZpY2UuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKSwgKHYpID0+IHRoaXMubG9hZGluZ1BlcmNlbnRhZ2Uuc2V0KHYpKTtcbiAgICB0aGlzLm1pcnJvcih0aGlzLnBsb3RTZXJ2aWNlLmlzU3RhY2tMb2FkaW5nKCksICh2KSA9PiB0aGlzLnN0YWNrTG9hZGluZy5zZXQodikpO1xuICAgIC8vIFRoZSBzbGljZSBlZGl0b3I6IGl0cyBzZWN0aW9ucywgYW5kIHRoZSBzbGljZSBwaWNrZWQgYnkgZHJhZ2dpbmcgdGhlIHogcGxhbmUgaW4gdGhlIHZvbHVtZS5cbiAgICBjb25zdCBzZWN0aW9ucyQgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFNlY3Rpb25WaWV3cyQ/LigpO1xuICAgIGlmIChzZWN0aW9ucyQpIHtcbiAgICAgIHRoaXMubWlycm9yKHNlY3Rpb25zJCwgKHYpID0+IHtcbiAgICAgICAgdGhpcy5zZWN0aW9ucyA9IHY7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHNsaWNlRHJhZyQgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFNsaWNlRHJhZyQ/LigpO1xuICAgIGlmIChzbGljZURyYWckKSB7XG4gICAgICB0aGlzLm1pcnJvcihzbGljZURyYWckLCAoeikgPT4ge1xuICAgICAgICB0aGlzLm9uWlNjcnViKE1hdGgubWluKHRoaXMubWF4SW5kZXgsIE1hdGgubWF4KDAsIHopKSk7XG4gICAgICAgIC8vIEZyb20gYSBET00gbGlzdGVuZXIsIG5vdCBhIHRlbXBsYXRlIGV2ZW50OiB0aGUgc2xpZGVyIGFuZCBiYWRnZSBtdXN0IGJlIG1hcmtlZCB0byBmb2xsb3cuXG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubWlycm9yKHRoaXMuc3RhdGUuZ2V0SW1hZ2VMb2FkaW5nTWVzc2FnZSQoKSwgKHYpID0+IHRoaXMubG9hZGluZ01lc3NhZ2Uuc2V0KHYpKTtcbiAgICB0aGlzLm1pcnJvcih0aGlzLnN0YXRlLmdldENhY2hlUHJvZ3Jlc3MkKCksICh2KSA9PiB0aGlzLmNhY2hlUHJvZ3Jlc3Muc2V0KHYpKTtcbiAgICB0aGlzLm1pcnJvcih0aGlzLnN0YXRlLmlzWm9vbSQoKSwgKHYpID0+IHRoaXMuem9vbS5zZXQodikpO1xuICAgIHRoaXMubWlycm9yKHRoaXMuc3RhdGUuZ2V0RmlsZW5hbWUkKCksICh2KSA9PiB7XG4gICAgICBpZiAodikgdGhpcy5maWxlTmFtZSA9IHY7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpb25BY3Rpb25zLmJpbmQodGhpcy5kZXN0cm95ZWQkLCAoKSA9PiB0aGlzLmNoYW5nZWQoKSk7XG4gICAgdGhpcy5zZWdtZW50YXRpb24uYmluZFBvaW50VG9vbCh0aGlzLnNhbVBvaW50VG9vbCwgdGhpcy5kZXN0cm95ZWQkKTtcbiAgICB0aGlzLm1pcnJvcih0aGlzLnN0YXRlLmdldFBhbmVsV2lkdGgkKCksICgpID0+IHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVsYXlvdXQoKTtcbiAgICAgIC8vIFRoZSBpbnRlbnNpdHkgaW5zZXQgaXMgYSBzZXBhcmF0ZSBjaGFydCBpbiBhIGZsb2F0aW5nIHBhbmVsOyByZWZsb3cgaXQgdG9vLlxuICAgICAgdGhpcy5pbnNldD8ucmVmbG93KCk7XG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZVxuICAgICAgLmdldEltYWdlSW5mbyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGltZ0luZm8pID0+IHtcbiAgICAgICAgICBpZiAoIWltZ0luZm8pIHtcbiAgICAgICAgICAgIHRoaXMub25JbWFnZUNsZWFyZWQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIHNlbGVjdG9yLCB0aGUgc3RhY2sgY29udHJvbHMgYW5kIHRoZSBpbnNldCBhbGwgZm9sbG93IHRoZSBpbWFnZS5cbiAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgICBpZiAoaW1nSW5mbykge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUluZm8gPSBpbWdJbmZvO1xuICAgICAgICAgICAgLy8gU3RhY2stb25seSBwbG90IHR5cGVzIChpc29zdXJmYWNlLCBzY2F0dGVyM2QpIGRlcGVuZCBvbiB3aGV0aGVyIHRoaXNcbiAgICAgICAgICAgIC8vIGZpbGUgaXMgYSBzdGFjayDigJQgcmVjb21wdXRlIHRoZSBzZWxlY3RvciBvcHRpb25zLlxuICAgICAgICAgICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgYWN0aXZlIHBsb3QgdHlwZSBpc24ndCB2YWxpZCBmb3IgdGhpcyBpbWFnZSAoZS5nLiBhIHNjYWxhclxuICAgICAgICAgICAgLy8gdHlwZSBsaWtlIENvbnRvdXIgY2FycmllZCBvdmVyIHRvIGFuIFJHQiBpbWFnZSksIGZhbGwgYmFjayB0byBJbWFnZS5cbiAgICAgICAgICAgIHRoaXMucmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZSgpO1xuICAgICAgICAgICAgLy8gUmVhZCBmcm9tIGBpbWdJbmZvYCwgdGhlIHZhbHVlIHRoaXMgZW1pc3Npb24gY2FycmllZCwgcmF0aGVyIHRoYW4gZnJvbSB0aGVcbiAgICAgICAgICAgIC8vIGZpZWxkLiBIYW5kbGluZyB0aGUgZW1wdHkgZW1pc3Npb24gbWVhbnMgdGhlIGZpZWxkIENBTiBiZSBudWxsZWQgcGFydC13YXlcbiAgICAgICAgICAgIC8vIHRocm91Z2ggdGhpcyBicmFuY2g6IGByZWNvbmNpbGVTZWxlY3RlZFBsb3RUeXBlYCBtYXkgY2FsbCBgc2V0UGxvdFR5cGVgLFxuICAgICAgICAgICAgLy8gd2hpY2ggY2FuIG1ha2UgdGhlIGhvc3QgcHVibGlzaCBhIG5ldyBpbWFnZSBzdGF0ZSwgcmUtZW50ZXJpbmcgdGhpcyB2ZXJ5XG4gICAgICAgICAgICAvLyBzdWJzY3JpcHRpb24uIFJlYWRpbmcgdGhlIGZpZWxkIHRoZW4gdGhyZXcgb24gYGlzR3JheXNjYWxlYCBhbmQgYWJvcnRlZCB0aGVcbiAgICAgICAgICAgIC8vIGhhbmRsZXIsIHNvIHRoZSBvYnNlcnZhdGlvbnMgd2VyZSBuZXZlciBkcmF3bi5cbiAgICAgICAgICAgIHRoaXMuaXNHcmF5c2NhbGVFdmVudC5lbWl0KGltZ0luZm8uaXNHcmF5c2NhbGUpO1xuICAgICAgICAgICAgdGhpcy5pc1N0YWNrRXZlbnQuZW1pdChpbWdJbmZvLmlzU3RhY2spO1xuICAgICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIGRlZmF1bHQgMkQgSW1hZ2UgdmlldyB3aGVuIGEgZGlmZmVyZW50IGltYWdlIGlzXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCB3aGlsZSBhIDNEIHR5cGUgaXMgYWN0aXZlLlxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSGVhdG1hcCAmJiBpbWdJbmZvLmZpbGVOYW1lICE9PSB0aGlzLmxvYWRlZEZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgIHRoaXMuaXNIZWF0bWFwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5wbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHRoaXMucGxvdFR5cGUpO1xuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZGVkRmlsZU5hbWUgPSBpbWdJbmZvLmZpbGVOYW1lO1xuICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRJbWFnZU1ldGEoaW1nSW5mby5pbWFnZU1ldGEsIGltZ0luZm8uZmlsZU5hbWUpO1xuICAgICAgICAgICAgLy8gQSBuZXdlciBpbWFnZSBhbHdheXMgcHJlZW1wdHMgYW4gaW4tZmxpZ2h0IHJlbmRlciAoc2VlIEltYWdlUmVuZGVyU2Vzc2lvbikuXG4gICAgICAgICAgICBpZiAoaW1nSW5mby51cmxzKSB0aGlzLnJlbmRlci5yZW5kZXIoaW1nSW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQgd2hlbiBnZXR0aW5nIGltYWdlIGluZm8nLCBlcnIpO1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgIGtleTogdGhpcy52aXpBbGVydFRvYXN0S2V5LFxuICAgICAgICAgICAgc3RpY2t5OiB0cnVlLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBzdW1tYXJ5OiAnQW4gZXJyb3Igb2NjdXJlZCcsXG4gICAgICAgICAgICBkZXRhaWw6IGBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VyZWQgd2hpbGUgZ2V0dGluZyBpbWFnZSBpbmZvOiAke21zZ30uXG4gICAgICAgICAgICAgICAgICAgUGxlYXNlIHRyeSB0byBvcGVuIHRoZSBpbWFnZSBhZ2FpbiB0aHJvdWdoIHRoZSBmaWxlIG5hdmlnYXRvci5gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgIHRoaXMucmVuZGVyLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2xsb3cgYHNvdXJjZWAgdW50aWwgZGVzdHJveS4gSG9zdCBzdHJlYW1zIGNhbiBlbWl0IG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZSAoYVxuICAgKiBzZXJ2ZXJsZXNzIGhvc3QgY2xlYXJzIGl0cyBsb2FkaW5nIGZsYWcgZnJvbSBhbiBpbWFnZSBkZWNvZGUgb3IgYW4gT3BlblNlYWRyYWdvblxuICAgKiBjYWxsYmFjayk7IHNldHRpbmcgYSBzaWduYWwgdGhlcmUgbWFya3MgdGhpcyBPblB1c2ggdmlldyBidXQgc2NoZWR1bGVzIG5vIGNoYW5nZVxuICAgKiBkZXRlY3Rpb24sIHNvIHRoZSB1cGRhdGUgaXMgYXBwbGllZCBpbnNpZGUgdGhlIHpvbmUsIGFzIHtAbGluayBjaGFuZ2VkfSBkb2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBtaXJyb3I8VD4oc291cmNlOiBPYnNlcnZhYmxlPFQ+LCBhcHBseTogKHZhbHVlOiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgc291cmNlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIGlmIChOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIGFwcGx5KHZhbHVlKTtcbiAgICAgIGVsc2UgdGhpcy5uZ1pvbmUucnVuKCgpID0+IGFwcGx5KHZhbHVlKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGUgdGhpcyB2aWV3IHNob3dzIGNoYW5nZWQgb3V0c2lkZSBvbmUgb2YgaXRzIHRlbXBsYXRlIGV2ZW50cyAoYSBzdHJlYW0sIGFcbiAgICogcmVzb2x2ZWQgcHJvbWlzZSwgYSBob3N0IGNhbGwpOiBtYXJrIHRoZSBPblB1c2ggdmlldyBmb3IgY2hlY2ssIHJlLWVudGVyaW5nIHRoZVxuICAgKiB6b25lIHdoZW4gaXQgY2hhbmdlZCBvdXRzaWRlIGl0IHNvIGEgY2hhbmdlLWRldGVjdGlvbiBwYXNzIGZvbGxvd3MuXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZWQoKTogdm9pZCB7XG4gICAgaWYgKE5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSkgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgZWxzZSB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExheSBhIG5ldyBpbWFnZSBvdXQgb25jZSB0aGUgb2xkIHZpZXcgaXMgZ29uZTogdGhlIHN0YWNrIGZsYWcsIHRoZSBzbGljZSBib3VuZHMgKG9uZVxuICAgKiB1cmwgcGVyIHNsaWNlLCBzbyB0aGUgbGFzdCBpbmRleCBpcyBsZW5ndGgtMSksIGFuZCB0aGUgb25lLXNob3QgYGluaXRpYWxaSW5kZXhgIGhpbnRcbiAgICogKGUuZy4gdGhlIGZpbGUgdGhlIHVzZXIgY2xpY2tlZCB3aXRoaW4gYSBudW1iZXJlZCBzZXJpZXMpLiBUaGUgaGludCBpcyBjb25zdW1lZCBzb1xuICAgKiByZS1kZWxpdmVyaW5nIHRoZSBzYW1lIGluZm8gKGEgcGxvdC10eXBlIHN3aXRjaCwgcmVsb2FkQW5kUGxvdCkgZG9lcyBub3QgcmVzZXQgdGhlXG4gICAqIHVzZXIncyBzY3J1YjsgdGhlIGhvc3QncyBvYmplY3QgaXMgbmV2ZXIgd3JpdHRlbiB0byAoYSBob3N0IHN0b3JlIG1heSBmcmVlemUgaXQpIOKAlFxuICAgKiB0aGUgY29tcG9uZW50IGtlZXBzIGEgY29weSB3aXRob3V0IHRoZSBoaW50LCBhbmQgcmVtZW1iZXJzIHRoZSBob3N0IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgbGF5T3V0U2xpY2VzKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICB0aGlzLnN0YWNrTG9hZGluZy5zZXQoaW5mby5pc1N0YWNrICYmIGluZm8uc2hvd1N0YWNrKTtcbiAgICB0aGlzLm1heEluZGV4ID0gaW5mby51cmxzLmxlbmd0aCA+IDEgPyBpbmZvLnVybHMubGVuZ3RoIC0gMSA6IDA7XG4gICAgaWYgKGluZm8uaW5pdGlhbFpJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXRoaXMuY29uc3VtZWRTbGljZUhpbnRzLmhhcyhpbmZvKSkge1xuICAgICAgICB0aGlzLmNvbnN1bWVkU2xpY2VIaW50cy5hZGQoaW5mbyk7XG4gICAgICAgIHRoaXMuekluZGV4ID0gaW5mby5pbml0aWFsWkluZGV4O1xuICAgICAgfVxuICAgICAgdGhpcy5pbWFnZUluZm8gPSB7IC4uLmluZm8sIGluaXRpYWxaSW5kZXg6IHVuZGVmaW5lZCB9O1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVpJbmRleCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIFdpbmRvdyBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQgT1VUU0lERSB0aGUgQW5ndWxhciB6b25lOiB6b25lLXBhdGNoZWQsIGV2ZXJ5XG4gICAgLy8gbW91c2Vtb3ZlIGFueXdoZXJlIGluIHRoZSBob3N0IGFwcCByYW4gYXBwLXdpZGUgY2hhbmdlIGRldGVjdGlvbi4gRWFjaCBoYW5kbGVyXG4gICAgLy8gcmUtZW50ZXJzIHRoZSB6b25lIChuZ1pvbmUucnVuKSBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgY2hhbmdlcyB2aWV3IHN0YXRlLlxuICAgIHRoaXMuc2hvcnRjdXRzID0gbmV3IFZpZXdlclNob3J0Y3V0cyh0aGlzLnNob3J0Y3V0SG9zdCgpLCB0aGlzLm5nWm9uZSk7XG4gICAgdGhpcy5zaG9ydGN1dHMuYXR0YWNoKCk7XG4gICAgdGhpcy53aGVuSW5Eb2N1bWVudCgoKSA9PiB0aGlzLm9uVmlld1JlYWR5KCkpO1xuICB9XG5cbiAgLyoqIFRoZSBwbG90IGRpdiBleGlzdHMgbm93OiBydW4gYW4gaW1hZ2UtbGVzcyBkcmF3IHRoYXQgYXJyaXZlZCBiZWZvcmUgaXQgZGlkLiAqL1xuICBwcml2YXRlIG9uVmlld1JlYWR5KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyLnZpZXdJc1JlYWR5KHRoaXMuc3BhdGlhbC5kYXRhc2V0LCAhIXRoaXMuaW1hZ2VJbmZvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYHJlYWR5YCBvbmNlIHRoaXMgdmlld2VyIGlzIGluIHRoZSBkb2N1bWVudC4gQSBob3N0IG1heSBjcmVhdGUgaXQgZGV0YWNoZWQg4oCUIGEgY2xvc2VkXG4gICAqIGRpYWxvZydzIHByb2plY3RlZCBjb250ZW50LCBzdWNoIGFzIGppdC11aSdzIHBpcGVsaW5lIHByZXZpZXcg4oCUIGFuZCB0aGUgYmFja2VuZHMgZmluZCB0aGVcbiAgICogcGxvdCBkaXYgYnkgaWQsIHNvIGEgZHJhdyB0aGVuIGZvdW5kIG5vIHRhcmdldCBhbmQgYWxlcnRlZCBcInRoZSByZW5kZXJlciBjb3VsZCBub3Qgc3RhcnRcIlxuICAgKiBvdmVyIGFub3RoZXIgdmlld2VyLiBVbnRpbCB0aGVuIGl0cyB2aWV3IGlzIG5vdCByZWFkeSwgYW5kIGFuIGltYWdlLWxlc3MgZHJhdyB3YWl0cy5cbiAgICovXG4gIHByaXZhdGUgd2hlbkluRG9jdW1lbnQocmVhZHk6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVsIHx8IGVsLmlzQ29ubmVjdGVkIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJlYWR5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEF0dGFjaGVkIGFuZCBsYWlkIG91dCwgaXRzIHNpemUgY2hhbmdlcyBmcm9tIG5vdGhpbmc6IHRoYXQgaXMgd2hlbiBpdCBjYW4gYmUgZHJhd24gaW50by5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoIWVsLmlzQ29ubmVjdGVkKSByZXR1cm47XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmF0dGFjaE9ic2VydmVyID0gbnVsbDtcbiAgICAgIHRoaXMubmdab25lLnJ1bihyZWFkeSk7XG4gICAgfSk7XG4gICAgdGhpcy5hdHRhY2hPYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIG9ic2VydmVyLm9ic2VydmUoZWwpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGtleWJvYXJkLCB3aGVlbCBhbmQgY29udGV4dC1tZW51IHNob3J0Y3V0cyBhY3Qgb24uIFRoZWlyIGxpc3RlbmVycyBsaXZlXG4gICAqICBvdXRzaWRlIHRoaXMgdmlldywgc28gZXZlcnkgYWN0aW9uIHRoYXQgY2hhbmdlcyB3aGF0IGl0IHNob3dzIG1hcmtzIGl0IGZvciBjaGVjay4gKi9cbiAgcHJpdmF0ZSBzaG9ydGN1dEhvc3QoKTogU2hvcnRjdXRIb3N0IHtcbiAgICBjb25zdCBtYXJrZWQgPVxuICAgICAgPEEgZXh0ZW5kcyB1bmtub3duW10+KGFjdDogKC4uLmFyZ3M6IEEpID0+IHZvaWQpID0+XG4gICAgICAoLi4uYXJnczogQSk6IHZvaWQgPT4ge1xuICAgICAgICBhY3QoLi4uYXJncyk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcGxvdERpdk5hbWU6IHRoaXMucGxvdERpdk5hbWUsXG4gICAgICBob3N0RWxlbWVudDogdGhpcy5ob3N0UmVmPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICAgICBhY3RpdmVEcmFnTW9kZTogKCkgPT4gdGhpcy5hY3RpdmVEcmFnTW9kZSxcbiAgICAgIGNhblN0ZXBTbGljZTogKCkgPT4gISF0aGlzLmltYWdlSW5mbz8uaXNTdGFjayAmJiAodGhpcy5pc0ltYWdlVmlldyB8fCB0aGlzLnNsaWNlRWRpdG9yU2hvd24pLFxuICAgICAgd2hlZWxab29tczogKCkgPT4gIXJlbmRlcmVyT3duc1doZWVsKHRoaXMuYmFzZVBsb3RUeXBlKSAmJiB0aGlzLmlzSGVhdG1hcCxcbiAgICAgIHN0ZXBTbGljZTogbWFya2VkKChkZWx0YTogbnVtYmVyKSA9PiB0aGlzLnN0ZXBTbGljZShkZWx0YSkpLFxuICAgICAgcmVzb2x2ZVNhbVByb21wdDogbWFya2VkKChjb21taXQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKGNvbW1pdCkgdGhpcy5wbG90U2VydmljZS5jb21taXRTYW1Qb2ludHMoKTtcbiAgICAgICAgZWxzZSB0aGlzLnBsb3RTZXJ2aWNlLmNsZWFyU2FtUG9pbnRzKCk7XG4gICAgICAgIHRoaXMuc2VnbWVudGF0aW9uLmhpZGUoKTsgLy8gcHJvbXB0IHJlc29sdmVkIOKGkiBkaXNtaXNzIHRoZSBzdGF0dXMgdG9hc3RcbiAgICAgIH0pLFxuICAgICAgdW5kbzogbWFya2VkKCgpID0+IHRoaXMudW5kb1JlZ2lvbigpKSxcbiAgICAgIHJlZG86IG1hcmtlZCgoKSA9PiB0aGlzLnJlZG9SZWdpb24oKSksXG4gICAgICBkZWxldGVSZWdpb246IG1hcmtlZCgoKSA9PiB0aGlzLmRlbGV0ZVJlZ2lvbigpKSxcbiAgICAgIHpvb21JbjogbWFya2VkKCgpID0+IHRoaXMuem9vbUluKCkpLFxuICAgICAgem9vbU91dDogbWFya2VkKCgpID0+IHRoaXMuem9vbU91dCgpKSxcbiAgICAgIHRvZ2dsZURyYWdNb2RlOiBtYXJrZWQoKG1vZGU6IHN0cmluZykgPT4gdGhpcy50b2dnbGVEcmFnTW9kZShtb2RlKSksXG4gICAgICBvcGVuQ29udGV4dE1lbnU6IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51SXRlbXMgPSB0aGlzLmJ1aWxkQ29udGV4dE1lbnVJdGVtcygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldmVudCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogU25hcCB0aGUgZmxvYXRpbmcgdG9vbGJhciBiYWNrIHRvIGl0cyBkb2NrZWQgcG9zaXRpb24gYWNyb3NzIHRoZSB0b3AuICovXG4gIHByb3RlY3RlZCBkb2NrVG9vbGJhcigpIHtcbiAgICB0aGlzLnRvb2xiYXJGbG9hdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIFRvb2xiYXIgXCJJbnRlbnNpdHlcIiBncm91cDogYWRkIGFub3RoZXIgbGluZSBST0kgKG5leHQgYnJpZ2h0IGNvbG91cikuICovXG4gIHByb3RlY3RlZCBhc3luYyBhZGRQcm9maWxlTGluZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWdpb24gPSBhd2FpdCB0aGlzLmluc2V0Py5hZGRQcm9maWxlTGluZSgpO1xuICAgIC8vIE9TRCBvbmx5IGRyYXdzIGEgc2VsZWN0ZWQgcmVnaW9uJ3MgaGFuZGxlcyBpbiBhbiBlZGl0IG1vZGUsIHNvIGEgbGluZSBpblxuICAgIC8vICdub25lJyBtb2RlIGxvb2tzIHVuc2VsZWN0ZWQuIFN3aXRjaCB0byAnc2VsZWN0JyBzbyB0aGUgbmV3IGxpbmUgc2hvd3MgaXRzXG4gICAgLy8gZW5kcG9pbnQgaGFuZGxlcyBhbmQgY2FuIGJlIGRyYWdnZWQvZGVsZXRlZCByaWdodCBhd2F5LlxuICAgIGlmIChyZWdpb24gJiYgdGhpcy5pc0ltYWdlVmlldyAmJiB0aGlzLmFjdGl2ZURyYWdNb2RlICE9PSAnc2VsZWN0JykgdGhpcy50b2dnbGVEcmFnTW9kZSgnc2VsZWN0Jyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmF0dGFjaE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgLy8gQSBjb250cmlidXRlZCBtb2RlJ3Mgc2Vzc2lvbiBlbmRzIGZpcnN0LCB3aGlsZSB0aGUgdmlld2VyIGl0IGRyZXcgb3ZlclxuICAgIC8vIHN0aWxsIGV4aXN0cy4gVGhlIHBhbmVsIGdvZXMgd2l0aCB0aGlzIHZpZXcsIHNvIG5vIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgdGhpcy5jb250cmlidXRpb25zLmRlc3Ryb3koKTtcbiAgICAvLyBMZWF2ZSB0aGUgbGl2ZSBzZXQgc28gdGhlIG5leHQtb2xkZXN0IHZpc3VhbGl6ZXIgcGlja3MgdXAgdGhlIG91dGxldHMg4oCUIG9uIGl0c1xuICAgIC8vIG5leHQgY2hlY2ssIHdoaWNoIGFuIE9uUHVzaCBzaWJsaW5nIG5lZWRzIGFza2luZyBmb3IuXG4gICAgVmlzdWFsaXplckNvbXBvbmVudC5saXZlSW5zdGFuY2VzLmRlbGV0ZSh0aGlzKTtcbiAgICBmb3IgKGNvbnN0IG90aGVyIG9mIFZpc3VhbGl6ZXJDb21wb25lbnQubGl2ZUluc3RhbmNlcykgb3RoZXIuY2hhbmdlZCgpO1xuICAgIHRoaXMuc3RhdGUuc2V0RGlhZ3JhbShudWxsKTtcbiAgICB0aGlzLnJlbmRlci5jYW5jZWwoKTtcbiAgICB0aGlzLnNwYXRpYWwuZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NydWJiZXIuY2FuY2VsKCk7XG4gICAgdGhpcy5zaG9ydGN1dHM/LmRldGFjaCgpO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZGV0YWNoKCk7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgaG9zdCBnZXRzIHRocm91Z2ggYHNldERpYWdyYW1gIOKAlCBzZWUge0BsaW5rIFZpc3VhbGl6ZXJIYW5kbGV9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhvc3RIYW5kbGU6IFZpc3VhbGl6ZXJIYW5kbGUgPSB7XG4gICAgdmlzdWFsaXplcjogdGhpcy5wbG90U2VydmljZSxcbiAgICBwbG90U2VydmljZTogdGhpcy5wbG90U2VydmljZSxcbiAgICBoYXNSZWdpb25zOiAoKSA9PiB0aGlzLmhhc1JlZ2lvbnMoKSxcbiAgICBnZXRSZWdpb25Qb2x5Z29uczogKCkgPT4gdGhpcy5nZXRSZWdpb25Qb2x5Z29ucygpLFxuICB9O1xuXG4gIHB1YmxpYyBoYXNSZWdpb25zKCk6IGJvb2xlYW4ge1xuICAgIC8vIFRoZSBjb250cmFjdCdzIGZyYW1ld29yay1uZXV0cmFsIHJlZ2lvbiBhY2Nlc3NvcjogdGhlIGNvbXBvbmVudCBvbmx5IG5lZWRzIHRvXG4gICAgLy8ga25vdyB3aGV0aGVyIGFueSByZWdpb24gZXhpc3RzLCBuZXZlciBhIGJhY2tlbmQncyB3aXJlIGZvcm1hdC5cbiAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudCByZWdpb25zIGFzIHBvbHlnb25zIChhbHNvIG9uIHRoZSBob3N0IGhhbmRsZSkuICovXG4gIHB1YmxpYyBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW10ge1xuICAgIHJldHVybiB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvblBvbHlnb25zKCk7XG4gIH1cblxuICAvKiogT3BlbiB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gZGlhbG9nICh0b29sYmFyIGJ1dHRvbikuICovXG4gIHByb3RlY3RlZCBvcGVuQ2hhbm5lbEhpc3RvZ3JhbSgpIHtcbiAgICB0aGlzLnNob3dDaGFubmVsSGlzdG9ncmFtID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBUb29sYmFyIOKGkiBvcGVuIHRoZSBzcGF0aWFsLW9taWNzIGNvbnRyb2xzLiAqL1xuICBwcm90ZWN0ZWQgb3BlblNwYXRpYWxDb250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dTcGF0aWFsQ29udHJvbHMgPSB0cnVlO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIFJlZ2lvbiBFZGl0b3IgZGlhbG9nICh0b29sYmFyIGJ1dHRvbikuIFRoZSBlZGl0b3Igc3RheXMgbGlua2VkIHRvXG4gICAqICB0aGlzIHBsb3R0aW5nIGluc3RhbmNlIHRocm91Z2ggdGhlIHJvb3QgUmVnaW9uU3RvcmUgc2luZ2xldG9uLCBzbyBpdCB3b3Jrc1xuICAgKiAgdGhlIHNhbWUgYXMgdGhlIGZvcm1lciByaWdodC1wYW5lbCBSZWdpb25zIHRhYi4gKi9cbiAgcHJvdGVjdGVkIG9wZW5SZWdpb25FZGl0b3IoKSB7XG4gICAgLy8gU2l6ZSB0aGUgZGlhbG9nIHRvIG1hdGNoIHRoZSBob3N0J3MgY29uZmlndXJlZCBlbGVtZW50IChlLmcuIHRoZSBhcHAnc1xuICAgIC8vIHJpZ2h0IHBhbmVsKSBhdCBvcGVuIHRpbWUuIE1lYXN1cmVkIG9uY2Ug4oCUIGl0IGludGVudGlvbmFsbHkgZG9lcyBub3RcbiAgICAvLyB0cmFjayBsYXRlciBicm93c2VyL3NwbGl0IHJlc2l6ZXMuIEZhbGxzIGJhY2sgdG8gYSBxdWFydGVyIG9mIHRoZSBwYWdlXG4gICAgLy8gd2hlbiBubyBzZWxlY3RvciBpcyBjb25maWd1cmVkIG9yIHRoZSBlbGVtZW50IGlzbid0IHByZXNlbnQuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLnZpekNvbmZpZz8ucmVnaW9uRWRpdG9yV2lkdGhTZWxlY3RvcjtcbiAgICBjb25zdCB3aWR0aCA9IHNlbGVjdG9yXG4gICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVnaW9uRWRpdG9yV2lkdGggPSB3aWR0aCAmJiB3aWR0aCA+IDAgPyBgJHtNYXRoLnJvdW5kKHdpZHRoKX1weGAgOiAnMjV2dyc7XG4gICAgdGhpcy5zaG93UmVnaW9uRWRpdG9yID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBUaGUgdG9vbGJhcidzIFNpbmdsZSBpbWFnZSAvIFN0YWNrIHRvZ2dsZS4gKi9cbiAgcHJvdGVjdGVkIHNlbGVjdFN0YWNrT3B0aW9uKHNlbGVjdGVkU3RhY2tPcHRpb246IHsgbmFtZTogc3RyaW5nOyB2YWw6IHN0cmluZyB9KSB7XG4gICAgY29uc3Qgc2hvd3N0YWNrID0gc2VsZWN0ZWRTdGFja09wdGlvbi52YWwgPT09ICd0cnVlJztcbiAgICB0aGlzLnN0YWNrTG9hZGluZy5zZXQoc2hvd3N0YWNrKTtcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyghc2hvd3N0YWNrKTtcbiAgICAvLyBTdGFjayBtb2RlIGlzIGFsd2F5cyBhIDJEIGhlYXRtYXAg4oCUIHJlc2V0IHN1cmZhY2UgbW9kZSBpZiBhY3RpdmVcbiAgICBpZiAoIXRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICB0aGlzLnBsb3RUeXBlID0gUGxvdFR5cGUuSEVBVE1BUDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZUlkID0gUGxvdFR5cGUuSEVBVE1BUDtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UGxvdFR5cGUodGhpcy5wbG90VHlwZSk7XG4gICAgfVxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2hvd1N0YWNrKHNob3dzdGFjayk7XG4gIH1cblxuICAvKiogQ2xhbXAgdGhlIHNsaWNlIGluZGV4IGludG8gWzAsIG1heEluZGV4XSBhbmQgcHVzaCBpdCB0byB0aGUgcmVuZGVyZXIuICovXG4gIHByb3RlY3RlZCB1cGRhdGVaSW5kZXgoKSB7XG4gICAgaWYgKHRoaXMuekluZGV4ID4gdGhpcy5tYXhJbmRleCkge1xuICAgICAgdGhpcy56SW5kZXggPSB0aGlzLm1heEluZGV4O1xuICAgIH1cbiAgICBpZiAodGhpcy56SW5kZXggPCAwKSB7XG4gICAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgfVxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0WkluZGV4KHRoaXMuekluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIHotc2xpY2Ugc2NydWIgZm9yIHRoZSBJbWFnZSB2aWV3OiB0aGUgcmVuZGVyZXIgc3dhcHMgdGhlIGRpc3BsYXllZFxuICAgKiBzbGljZSBpbiBwbGFjZSAobm8gcmUtbW91bnQpLCBzbyBkcmFnZ2luZyB0aGUgc2xpZGVyIHN0ZXBzIHRocm91Z2ggdGhlXG4gICAqIHN0YWNrIHRoZSBzYW1lIHdheSB0aGUgaGVhdG1hcCBmcmFtZSBzbGlkZXIgZG9lcy5cbiAgICovXG4gIHByb3RlY3RlZCBvblpTbGlkZSh6OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoeiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy56SW5kZXggPSB6O1xuICAgIHRoaXMuc2NydWJiZXIuY29tbWl0KHopO1xuICAgIC8vIEtlZXAgdGhlIGludGVuc2l0eSBpbnNldCBzYW1wbGluZyB0aGUgZGlzcGxheWVkIHNsaWNlIChJbWFnZSB2aWV3KS5cbiAgICB0aGlzLmluc2V0Py5zbGljZUNvbW1pdHRlZCh6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIChkZWJvdW5jZWQpIHNjcnViIHdoaWxlIGRyYWdnaW5nIHRoZSBJbWFnZS12aWV3IHotc2xpZGVyOiB1cGRhdGUgdGhlXG4gICAqIHNsaWNlIGFzIHRoZSB1c2VyIGRyYWdzLCBidXQgY29hbGVzY2UgcmFwaWQgY2hhbmdlcyBzbyB3ZSBkb24ndCBmaXJlIGFcbiAgICogc2xpY2Ugc3dhcCBvbiBldmVyeSBwaXhlbC4gVGhlIGZpbmFsIHZhbHVlIGFsc28gbGFuZHMgdmlhIG9uWlNsaWRlIChvblNsaWRlRW5kKS5cbiAgICovXG4gIHByb3RlY3RlZCBvblpTY3J1Yih6OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoeiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy56SW5kZXggPSB6O1xuICAgIHRoaXMuc2NydWJiZXIuc2NydWIoeik7XG4gIH1cblxuICAvKiogTW92ZSB0aGUgZGlzcGxheWVkIHNsaWNlIGJ5IGBkZWx0YWAsIGNsYW1wZWQgdG8gdGhlIHN0YWNrIGJvdW5kcy4gKi9cbiAgc3RlcFNsaWNlKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gTWF0aC5taW4odGhpcy5tYXhJbmRleCwgTWF0aC5tYXgoMCwgdGhpcy56SW5kZXggKyBkZWx0YSkpO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLnpJbmRleCkgcmV0dXJuO1xuICAgIHRoaXMub25aU2xpZGUobmV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVsb2FkQW5kUGxvdCgpIHtcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyh0cnVlKTtcbiAgICAvLyBSZS1kcml2ZSB0aGUgcmVuZGVyIHBpcGVsaW5lIGZyb20gdGhlIGN1cnJlbnQgaW1hZ2UgaW5mbyAodGhlIHNvdXJjZSBvZlxuICAgIC8vIHRydXRoLCB3aXRoIHJlYWwgdXJscy9maWxlTmFtZSkuIERvbid0IHVzZSBwbG90U2VydmljZS5yZWxvYWRBbmRQbG90KCk6XG4gICAgLy8gdGhhdCByZWJ1aWxkcyB0aGUgaW5mbyBmcm9tIHRoZSByZW5kZXJlcidzIGludGVybmFsIHN0YXRlLCB3aGljaCBjYW4gYmVcbiAgICAvLyBzdGFsZSAoZS5nLiBhZnRlciBzd2l0Y2hpbmcgcGxvdCB0eXBlIEltYWdlIC0+IEhlYXRtYXApIGFuZCByZS1lbWl0XG4gICAgLy8gZW1wdHkvb2xkIHVybHMsIGZhaWxpbmcgdG8gaGFuZCB0aGUgZGl2IG92ZXIgdG8gdGhlIG5ldyByZW5kZXJlci5cbiAgICBpZiAodGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VJbmZvKHRoaXMuaW1hZ2VJbmZvKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3BhdGlhbC5kYXRhc2V0ICYmIChpc1NwYXRpYWxPbWljcyh0aGlzLnBsb3RUeXBlKSB8fCBpc1NwYXRpYWxPbWljczNkKHRoaXMucGxvdFR5cGUpKSkge1xuICAgICAgLy8gQSBzcGF0aWFsIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2UsIG9wZW5lZCB3aXRoIG5vIGltYWdlIGxvYWRlZCAoYSBob3N0J3NcbiAgICAgIC8vIGZpcnN0IHZpZXcpOiB0aGVyZSBpcyBubyBpbWFnZSBpbmZvIHRvIHJlLWRyaXZlLCBzbyBkcmF3IHRoZSBzcGF0aWFsIG1vZGUgaXRzZWxmLlxuICAgICAgdm9pZCB0aGlzLnJlbmRlci5wbG90V2l0aG91dEltYWdlKHRoaXMuc3BhdGlhbC5kYXRhc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5yZWxvYWRBbmRQbG90KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNhbmNlbExvYWRpbmcoKSB7XG4gICAgLy8gU3RvcCBhbnkgaW4tZmxpZ2h0IGZyYW1lIHN0cmVhbWluZyAobmFwYXJpLWpzIHZvbHVtZS9zdXJmYWNlIHByZWxvYWQpIHNvIHRoZSBmZXRjaCBsb29wc1xuICAgIC8vIGFjdHVhbGx5IGFib3J0IOKAlCBjbGVhcmluZyB0aGUgZmxhZyBhbG9uZSBvbmx5IHJvdXRlZCB0byBQbG90bHkgYW5kIGxlZnQgbmFwYXJpIGZldGNoaW5nLlxuICAgIHRoaXMucGxvdFNlcnZpY2UuY2FuY2VsTG9hZGluZz8uKCk7XG4gICAgLy8gVGhlIGNhbmNlbGxlZCByZW5kZXIgaXMgc3VwZXJzZWRlZCwgbm90IGp1c3QgYWJvcnRlZDogaXRzIGFib3J0ZWQgbG9hZCBtdXN0IG5vdFxuICAgIC8vIGNvbWUgYmFjayBhcyBcIkNvdWxkIG5vdCBkcmF3IHRoZSBpbWFnZVwiLCBub3IgYXBwbHkgUk9JcyBmb3IgYW4gaW1hZ2UgbGVmdCB1bnNob3duLlxuICAgIHRoaXMucmVuZGVyLmNhbmNlbCgpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5pbWdMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh0aGlzLnpJbmRleCk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTdGFja0xvYWRpbmcoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvd25sb2FkSW1hZ2UoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5kb3dubG9hZEltYWdlKCk7XG4gIH1cblxuICBhdXRvc2NhbGVJbWFnZSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmZpdFRvVmlldygpO1xuICB9XG5cbiAgLyoqIFRvb2xiYXIgcGl4ZWwvc21vb3RoIHRvZ2dsZTogZmxpcCBzbW9vdGhpbmcgYW5kIGFwcGx5IHRvIHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlSW1hZ2VTbW9vdGhpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSAhdGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQ7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQodGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQpO1xuICB9XG5cbiAgcmVzZXRBeGVzKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXRBeGVzKCk7XG4gIH1cblxuICB0b2dnbGVEcmFnTW9kZShtb2RlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRvb2xzLnRvZ2dsZShtb2RlKTtcbiAgfVxuXG4gIC8qKiBMaXZlLXVwZGF0ZSB0aGUgaXNvc3VyZmFjZSBhcyB0aGUgcmFuZ2Ugc2xpZGVyIG1vdmVzLiBUaGUgY29udHJvbCBpcyBvbmx5XG4gICAqICBhdmFpbGFibGUgd2hlbiB0aGUgYWN0aXZlIGJhY2tlbmQgcmVuZGVycyBpc29zdXJmYWNlcyAoSVNPU1VSRkFDRSBtb2RlKS4gKi9cbiAgcHJvdGVjdGVkIG9uSXNvUmFuZ2VDaGFuZ2UodmFsdWVzOiBudW1iZXJbXSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgdGhpcy5pc29SYW5nZSA9IHZhbHVlcztcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldElzb3N1cmZhY2VDb250cm9scygpPy5zZXRJc29SYW5nZSh2YWx1ZXNbMF0sIHZhbHVlc1sxXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25XYW5kU2Vuc2l0aXZpdHlDaGFuZ2UodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudG9vbHMuc2V0V2FuZFNlbnNpdGl2aXR5KHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CcnVzaFNpemVDaGFuZ2UodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudG9vbHMuc2V0QnJ1c2hTaXplKHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WZXJ0ZXhFcmFzZXJSYWRpdXNDaGFuZ2UodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudG9vbHMuc2V0VmVydGV4RXJhc2VyUmFkaXVzKHZhbHVlKTtcbiAgfVxuXG4gIHpvb21JbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnpvb21JbigpO1xuICB9XG5cbiAgem9vbU91dCgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnpvb21PdXQoKTtcbiAgfVxuXG4gIGRlbGV0ZVJlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG4gIH1cblxuICAvKiogVW5kbyB0aGUgbW9zdCByZWNlbnQgcmVnaW9uIGFjdGlvbiAoaml0LXVpIzg1KS4gVXAgdG8gMTAgc3RlcHMgYmFjay4gKi9cbiAgcHJvdGVjdGVkIHVuZG9SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS51bmRvKCk7XG4gIH1cblxuICAvKiogUmVkbyB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbiAoaml0LXVpIzg1KS4gKi9cbiAgcHJvdGVjdGVkIHJlZG9SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZWRvKCk7XG4gIH1cblxuICAvLyDilIDilIAgUmVnaW9uIHNldC1vcGVyYXRpb25zIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzg1KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgc2VsZWN0QWxsUmVnaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFjdGlvbnMuc2VsZWN0QWxsKCk7XG4gIH1cbiAgbWVyZ2VSZWdpb25zKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQWN0aW9ucy5tZXJnZSgpO1xuICB9XG4gIHVuZ3JvdXBSZWdpb25zKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQWN0aW9ucy51bmdyb3VwKCk7XG4gIH1cbiAgaW52ZXJzZVJlZ2lvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25BY3Rpb25zLmludmVyc2UoKTtcbiAgfVxuICBzaW1wbGlmeVJlZ2lvbnModGhyZXNob2xkUHg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQWN0aW9ucy5zaW1wbGlmeSh0aHJlc2hvbGRQeCk7XG4gIH1cbiAgb3BlblNpbXBsaWZ5RGlhbG9nKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQWN0aW9ucy5vcGVuU2ltcGxpZnlEaWFsb2coKTtcbiAgfVxuXG4gIC8qKiBCb3gtcHJvbXB0ZWQgU0FNIHNlZ21lbnRhdGlvbiBvZiB0aGUgZHJhd24gcmVjdGFuZ2xlcyAoaml0LXVpIzkwKS4gQSBzdGlja3lcbiAgICogIGBzYW1gIHRvYXN0IHNob3dzIGxpdmUgc3RhdHVzICsgYSBkb3dubG9hZCBwcm9ncmVzcyBiYXIgKGZpcnN0IHJ1biBwdWxscyB0aGVcbiAgICogIGVuY29kZXIsIH4xNzAgTUIpOyBpdCBzdGF5cyBvcGVuIHVudGlsIHRoZSBydW4gZmluaXNoZXMgKGJhciBoaXRzIDEwMCUpLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2VnbWVudFJlZ2lvbnMoKSB7XG4gICAgYXdhaXQgdGhpcy5zZWdtZW50YXRpb24ucnVuKCdTQU0nLCB0aGlzLnNhbVRvb2wsICgpID0+IHRoaXMucGxvdFNlcnZpY2Uuc2VnbWVudFJlY3RhbmdsZXMoKSk7XG4gIH1cblxuICAvKiogQXV0by1zZWdtZW50IGNlbGxzIGluc2lkZSBlYWNoIGRyYXduIHJlY3RhbmdsZSB3aXRoIGNlbGxwb3NlLVNBTSwgY2xpZW50LXNpZGVcbiAgICogIChqaXQtdWkjOTApLiBFYWNoIGJveCBpcyBjcm9wcGVkIChicm93c2VyIHNsaWRlLWNyb3ApIHRoZW4gcnVuIHRocm91Z2ggdGhlXG4gICAqICBjZWxscG9zZS1qcyBtb2RlbDsgdGhlIHNhbWUgc3RpY2t5IGBzYW1gIHRvYXN0ICsgcHJvZ3Jlc3MgYmFyIGlzIHJldXNlZC4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNlZ21lbnRDZWxscG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLnNlZ21lbnRhdGlvbi5ydW4oJ0NlbGxwb3NlJywgdGhpcy5jZWxsU2VnbWVudFRvb2wsICgpID0+XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKSxcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIGNvbnRyaWJ1dGVkIHRvb2wgcGFyYW1ldGVycyAoc2VlIFRvb2xQYXJhbXNNb2RlbCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHBhcmFtc0Zvcih0b29sSWQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy50b29sUGFyYW1zLnBhcmFtc0Zvcih0b29sSWQpO1xuICB9XG4gIHByb3RlY3RlZCBvblRvb2xNb2RlbENoYW5nZShlOiB7IHRvb2xJZDogc3RyaW5nOyBtb2RlbElkOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMudG9vbFBhcmFtcy5zZXRNb2RlbChlLnRvb2xJZCwgZS5tb2RlbElkKTtcbiAgfVxuICBwcm90ZWN0ZWQgb3BlblRvb2xQYXJhbXModG9vbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2xQYXJhbXMub3Blbih0b29sSWQpO1xuICB9XG4gIHByb3RlY3RlZCBjbG9zZVRvb2xQYXJhbXMoKTogdm9pZCB7XG4gICAgdGhpcy50b29sUGFyYW1zLmNsb3NlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlc2V0VG9vbFBhcmFtcyh0b29sSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudG9vbFBhcmFtcy5yZXNldCh0b29sSWQpO1xuICB9XG5cbiAgLyoqIFJ1biBhIGNvbnRyaWJ1dGVkIHRvb2wgb3ZlciB0aGUgY3VycmVudCB2aWV3LiBObyBwcm9tcHQ6IHRoZXNlIHN3ZWVwIHRoZVxuICAgKiAgd2hvbGUgdmlldyByYXRoZXIgdGhhbiBiZWluZyBwb2ludGVkIGF0IHNvbWV0aGluZy4gUmV1c2VzIHRoZSBzaGFyZWRcbiAgICogIHNlZ21lbnRhdGlvbiB0b2FzdCBzbyBwcm9ncmVzcyByZWFkcyB0aGUgc2FtZSBhcyB0aGUgU0FNL2NlbGxwb3NlIHRvb2xzLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcnVuVG9vbCh0b29sSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRvb2wgPSB0aGlzLnRvb2xQYXJhbXMuZmluZCh0b29sSWQpO1xuICAgIGlmICghdG9vbCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMudG9vbFBhcmFtcy5ydW5QYXJhbXModG9vbCk7XG4gICAgYXdhaXQgdGhpcy5zZWdtZW50YXRpb24ucnVuKHRvb2wubGFiZWwsIHRvb2wucHJvZ3Jlc3MsICgpID0+IHRvb2wucnVuKHRoaXMucGxvdFNlcnZpY2UsIHBhcmFtcykpO1xuICB9XG5cbiAgLyoqIFBpY2sgdGhlIFNBTSBtb2RlbCB0aGUgc2VnbWVudCB0b29scyB1c2UgKGppdC11aSM5MCBQMSkuICovXG4gIHByb3RlY3RlZCBvblNhbU1vZGVsQ2hhbmdlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNhbU1vZGVsSWQgPSBpZDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNhbU1vZGVsKGlkKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHRoZSBzZWxlY3RlZCByZWdpb24gdG8gYSBzbW9vdGggYmV6aWVyIGN1cnZlLiAqL1xuICB0b0JlemllclJlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbk92ZXJsYXkoKT8uc2V0U2VsZWN0ZWRCZXppZXIodHJ1ZSk7XG4gIH1cblxuICAvKiogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uIGJhY2sgdG8gYSBzdHJhaWdodC1lZGdlZCBwb2x5Z29uLiAqL1xuICB0b1BvbHlnb25SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25PdmVybGF5KCk/LnNldFNlbGVjdGVkQmV6aWVyKGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBUaGUgcmlnaHQtY2xpY2sgbWVudSBmb3IgdGhlIGN1cnJlbnQgdmlldywgYXJtZWQgbW9kZSBhbmQgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIGJ1aWxkQ29udGV4dE1lbnVJdGVtcygpOiBNZW51SXRlbVtdIHtcbiAgICByZXR1cm4gYnVpbGRDb250ZXh0TWVudSh0aGlzLmNvbnRleHRNZW51U3RhdGUoKSwgdGhpcyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnRleHRNZW51U3RhdGUoKTogQ29udGV4dE1lbnVTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzSGVhdG1hcDogdGhpcy5pc0hlYXRtYXAsXG4gICAgICBiYXNlUGxvdFR5cGU6IHRoaXMuYmFzZVBsb3RUeXBlLFxuICAgICAgYWN0aXZlRHJhZ01vZGU6IHRoaXMuYWN0aXZlRHJhZ01vZGUsXG4gICAgICBhY3RpdmVTdXJmYWNlM2RNb2RlOiB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGUsXG4gICAgICByZWdpb25zOiB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNlbGVjdGVkSW5kaWNlczogdGhpcy5yZWdpb25BY3Rpb25zLnNlbGVjdGVkSW5kaWNlcyxcbiAgICAgIGNhblVuZ3JvdXA6IChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpLFxuICAgIH07XG4gIH1cblxuICAvKiogM0Qgc2NlbmUgaW50ZXJhY3Rpb24gbW9kZSAob3JiaXQgLyB0dXJudGFibGUgLyBwYW4gLyB6b29tKTsgbm8tb3Agb24gYSAyRC1vbmx5IGJhY2tlbmQuICovXG4gIHRvZ2dsZVN1cmZhY2UzZE1vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlID0gbW9kZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKTtcbiAgfVxuXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnJlc2V0U3VyZmFjZUNhbWVyYSgpO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgbmFwYXJpIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vICh2b2x1bWUvaXNvc3VyZmFjZSkuIE5vLW9wIG9uIGJhY2tlbmRzXG4gICAqICB0aGF0IGRvbid0IHJlbmRlciBvbmUgKHRoZSBjb250cm9sIG1ldGhvZCBpcyBvcHRpb25hbCkuICovXG4gIHByb3RlY3RlZCB0b2dnbGVBeGVzKCkge1xuICAgIHRoaXMuYXhlc1Zpc2libGUgPSAhdGhpcy5heGVzVmlzaWJsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnNldEF4ZXNWaXNpYmxlPy4odGhpcy5heGVzVmlzaWJsZSk7XG4gIH1cblxuICAvKiogVG9nZ2xlIHRoZSBuYXBhcmkgc3VyZmFjZSB3aXJlZnJhbWUgKGVkZ2VzIHZzIGZpbGxlZCkuIE5vLW9wIG9uIGJhY2tlbmRzIHdpdGhvdXQgYSBzdXJmYWNlLiAqL1xuICBwcm90ZWN0ZWQgdG9nZ2xlV2lyZWZyYW1lKCkge1xuICAgIHRoaXMud2lyZWZyYW1lQWN0aXZlID0gIXRoaXMud2lyZWZyYW1lQWN0aXZlO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0V2lyZWZyYW1lPy4odGhpcy53aXJlZnJhbWVBY3RpdmUpO1xuICB9XG5cbiAgLyoqIENoYW5nZSB0aGUgbmFwYXJpIDNEIGRlY2ltYXRlIGZhY3Rvci4gRGVjaW1hdGlvbiBjaGFuZ2VzIHRoZSBmZXRjaGVkL2Fzc2VtYmxlZCBkYXRhLCBzbyB0aGlzXG4gICAqICByZS1wbG90cyB0aGUgY3VycmVudCAzRCB0eXBlIGF0IHRoZSBuZXcgcmVzb2x1dGlvbiAodW5saWtlIGF4ZXMvd2lyZWZyYW1lLCB3aGljaCBhcmUgbGl2ZSkuICovXG4gIHByb3RlY3RlZCBzZWxlY3RSZXNvbHV0aW9uKHNjYWxlOiBudW1iZXIpIHtcbiAgICBpZiAoc2NhbGUgPT09IHRoaXMucmVzb2x1dGlvblNjYWxlKSByZXR1cm47XG4gICAgdGhpcy5yZXNvbHV0aW9uU2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJlc29sdXRpb25TY2FsZT8uKHNjYWxlKTtcbiAgICB0aGlzLnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdGhlIGFjdGl2ZSBwbG90IHR5cGUgKGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsXG4gICAqIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkuIEtlZXBzIGBpc0hlYXRtYXBgIGFzIHRoZSAyRC12cy0zRCBmbGFnIHRoZSByZXN0IG9mXG4gICAqIHRoZSB0b29sYmFyL2NvbnRleHQtbWVudSBsb2dpYyByZWxpZXMgb24sIGRlYWN0aXZhdGVzIDJELW9ubHkgdG9vbHMgd2hlblxuICAgKiBtb3ZpbmcgdG8gYSAzRCB0eXBlLCB0aGVuIHJlLXBsb3RzLlxuICAgKi9cbiAgb25TZWxlY3RQbG90VHlwZShzZWxlY3RlZDogUGxvdFR5cGVJZCkge1xuICAgIC8vIEFsc28gY2FsbGVkIGJ5IHRoZSBob3N0IGRpcmVjdGx5LCBvdXRzaWRlIHRoaXMgdmlldydzIGV2ZW50czogdGhlIHNlbGVjdG9yLCB0aGVcbiAgICAvLyB0b29sYmFyJ3MgdG9vbCBncm91cHMgYW5kIHRoZSBkaWFsb2dzIGFsbCBmb2xsb3cgdGhlIHR5cGUuXG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgLy8gQSBjb250cmlidXRlZCBpZCB3aG9zZSBwcm92aWRlciBpcyBnb25lIChlLmcuIHJlc3RvcmVkIGZyb20gYSBwcmV2aW91c1xuICAgIC8vIHNlc3Npb24pIGhhcyBub3RoaW5nIHRvIGFjdGl2YXRlIOKAlCB0YWtlIHRoZSBkZWZhdWx0IEltYWdlIHZpZXcgaW5zdGVhZC5cbiAgICBpZiAoIWlzQnVpbHRpblBsb3RUeXBlKHNlbGVjdGVkKSAmJiAhdGhpcy5wbG90TW9kZXMuZmluZChzZWxlY3RlZCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3Zpc3VhbGl6ZXJdIHVua25vd24gcGxvdCB0eXBlICcke3NlbGVjdGVkfScg4oCUIHNob3dpbmcgJyR7UGxvdFR5cGUuSU1BR0V9JyBpbnN0ZWFkLmApO1xuICAgICAgc2VsZWN0ZWQgPSBQbG90VHlwZS5JTUFHRTtcbiAgICB9XG4gICAgLy8gQW4gZXhwbGljaXQgY2hvaWNlIHJldHJpZXMgYSBtb2RlIHdob3NlIGVhcmxpZXIgY2xlYW51cCBmYWlsZWQ7IG9ubHlcbiAgICAvLyBhdXRvbWF0aWMgcmUtYWN0aXZhdGlvbnMgKHJlLXJlbmRlciwgaW1hZ2Ugc3dpdGNoKSBmYWxsIGJhY2sgZm9yIHRoYXQuXG4gICAgdGhpcy5wbG90TW9kZXMuY2xlYXJDbGVhbnVwRmFpbHVyZXMoKTtcbiAgICAvLyBXaGF0ZXZlciB3YXMgc2VsZWN0ZWQgYmVmb3JlLCBhIGNvbnRyaWJ1dGVkIHNlc3Npb24gZW5kcyBiZWZvcmUgdGhlIG5leHRcbiAgICAvLyBtb2RlIGRyYXdzLiAoUmUtc2VsZWN0aW5nIHRoZSBzYW1lIGNvbnRyaWJ1dGVkIG1vZGUgcmUtcGxvdHMsIHNvIGl0IGdldHMgYVxuICAgIC8vIGZyZXNoIHNlc3Npb24gdG9vLilcbiAgICB0aGlzLnBsb3RNb2Rlcy5kZWFjdGl2YXRlKCk7XG4gICAgLy8gRXZlcnl0aGluZyBiZWxvdyBkZWNpZGVzIGhvdyB0byBSRU5ERVIsIHNvIGl0IHdvcmtzIG9uIHRoZSBidWlsdC1pbiB0eXBlXG4gICAgLy8gdGhhdCBkcmF3cyBgc2VsZWN0ZWRgOiBhIGNvbnRyaWJ1dGVkIG1vZGUgYmVoYXZlcyBleGFjdGx5IGxpa2UgaXRzIGJhc2UuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMucGxvdE1vZGVzLmJhc2VUeXBlT2Yoc2VsZWN0ZWQpO1xuICAgIC8vIEEgZGlhbG9nIHRvb2wgZHJhd3Mgb3ZlciB0aGUgSW1hZ2UgdmlldzogbGVhdmluZyBpdCBjbG9zZXMgdGhlIGRpYWxvZy4gU3RheWluZ1xuICAgIC8vIG9uIGl0LCB0aGUgc2Vzc2lvbiBlbmRzIGhlcmUgYW5kIHJlc3RhcnRzIG9uY2UgdGhlIHJlLXBsb3QgbGFuZHMuXG4gICAgaWYgKHR5cGUgPT09IFBsb3RUeXBlLklNQUdFKSB0aGlzLmNvbnRyaWJ1dGlvbnMudG9vbERpYWxvZ3MuZGVhY3RpdmF0ZSgpO1xuICAgIGVsc2UgdGhpcy5jbG9zZURpYWxvZ1Rvb2woKTtcbiAgICB0aGlzLnBsb3RUeXBlID0gdHlwZTtcbiAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGVJZCA9IHNlbGVjdGVkO1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBpc0J1aWx0aW5QbG90VHlwZShzZWxlY3RlZClcbiAgICAgID8gdGhpcy5wbG90VHlwZU1lbnUuZmluZCgoZCkgPT4gZC50eXBlID09PSB0eXBlKVxuICAgICAgOiBnZXRQbG90VHlwZURlc2NyaXB0b3IodHlwZSk7XG4gICAgY29uc3QgaXMzZCA9IGRlc2NyaXB0b3I/LmRpbWVuc2lvbnMgPT09ICczZCc7XG4gICAgdGhpcy5pc0hlYXRtYXAgPSAhaXMzZDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHR5cGUpO1xuICAgIC8vIFN3aXRjaGluZyBwbG90IHR5cGUgY2FuY2VscyB0aGUgYWN0aXZlIHRvb2wg4oCUIG5vdCBldmVyeSB0eXBlIHN1cHBvcnRzIHRoZVxuICAgIC8vIHNhbWUgdG9vbHMgKGxpbmUvc2NhdHRlciBjaGFydHMgYW5kIDNEIHNjZW5lcyBoYXZlIG5vIGJveCB6b29tIG9yIHJlZ2lvblxuICAgIC8vIGRyYXdpbmcpLCBzbyBsZWF2aW5nIGEgdG9vbCBhcm1lZCB3b3VsZCBtaXNiZWhhdmUgb24gdGhlIG5ldyBwbG90LlxuICAgIHRoaXMudG9vbHMuZGVhY3RpdmF0ZSgpO1xuICAgIGlmIChpczNkKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgICB9XG4gICAgLy8gbmFwYXJpLWpzIHZvbHVtZS9pc29zdXJmYWNlIGFzc2VtYmxlIHRoZWlyIG93biAzRCB0ZXh0dXJlIGZyb20gdGhlIHNsaWNlIGVuZHBvaW50LCBzb1xuICAgIC8vIHRoZXkgdGFrZSB0aGUgbm9ybWFsIHJlLXBsb3QgcGF0aCDigJQgTk9UIFBsb3RseSdzIHN0YWNrLWZyYW1lIGxvYWRlciAod2hvc2UgXCJMb2FkaW5nXG4gICAgLy8gZnJhbWVzXCIgb3ZlcmxheSB3b3VsZCBuZXZlciBjbGVhciwgc2luY2UgUGxvdGx5IGlzbid0IHRoZSBhY3RpdmUgYmFja2VuZCkgKGppdC11aSMxMDIpLlxuICAgIGNvbnN0IGlzTmFwYXJpID0gdHlwZSA9PT0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFIHx8IGlzTmFwYXJpM2QodHlwZSk7XG4gICAgaWYgKGRlc2NyaXB0b3I/LnJlcXVpcmVzU3RhY2sgJiYgIWlzTmFwYXJpKSB7XG4gICAgICAvLyBWb2x1bWUgdHlwZXMgKGlzb3N1cmZhY2UsIHNjYXR0ZXIzZCkgbmVlZCB0aGUgd2hvbGUgei1zdGFjayBsb2FkZWQgYXMgYVxuICAgICAgLy8gM0QgYXJyYXksIGFuZCB0aGV5IGFsd2F5cyByZW5kZXIgb24gUGxvdGx5LiBEcml2ZSB0aGUgc3RhY2sgcmVsb2FkXG4gICAgICAvLyBkaXJlY3RseSB0aHJvdWdoIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSByYXRoZXIgdGhhbiB0aGUgYWN0aXZlIHJlbmRlcmVyJ3NcbiAgICAgIC8vIHNldFNob3dTdGFjazogd2hlbiBPcGVuU2VhZHJhZ29uIG93bnMgdGhlIEltYWdlIHZpZXcgaXRzIHNldFNob3dTdGFjayBpc1xuICAgICAgLy8gYSBuby1vcCwgc28gdGhlIHJlbG9hZCBuZXZlciBmaXJlZCBhbmQgdGhlIGxvYWRlciBzcHVuIGZvcmV2ZXIuIFdlIGFybVxuICAgICAgLy8gUGxvdGx5J3Mgc3RhY2stbG9hZGluZyBmbGFnIChrZWVwcyBpdHMgZnJhbWUtZmV0Y2ggbG9vcCBhbGl2ZSkgYW5kXG4gICAgICAvLyByZS1lbWl0IHRoZSBpbWFnZSBpbmZvIHdpdGggc2hvd1N0YWNrIG9uIHNvIHRoZSBwaXBlbGluZSByZWxvYWRzIG9uXG4gICAgICAvLyBQbG90bHkgcmVnYXJkbGVzcyBvZiB3aGljaCBiYWNrZW5kIHdhcyBvbiBzY3JlZW4uXG4gICAgICB0aGlzLnN0YWNrTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFN0YWNrTG9hZGluZyh0cnVlKTtcbiAgICAgIGlmICh0aGlzLmltYWdlSW5mbykge1xuICAgICAgICAvLyBBIGNvcHk6IHRoZSBpbWFnZSBpbmZvIG1heSBiZSB0aGUgaG9zdCdzIG93biAocG9zc2libHkgZnJvemVuKSBvYmplY3QuXG4gICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VJbmZvKHsgLi4udGhpcy5pbWFnZUluZm8sIHNob3dTdGFjazogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWxvYWRBbmRQbG90KCk7XG4gIH1cblxuICAvLyDilIDilIAgZGlhbG9nIHRvb2xzIChUT09MQkFSX1RPT0xTLCBraW5kOiAnZGlhbG9nJykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoZSB0b29sYmFyIGJ1dHRvbjogb3BlbiB0aGUgdG9vbCdzIGRpYWxvZywgb3IgY2xvc2UgaXQgaWYgaXQgaXMgb3Blbi4gKi9cbiAgcHJvdGVjdGVkIHRvZ2dsZURpYWxvZ1Rvb2woaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29udHJpYnV0aW9ucy50b2dnbGVEaWFsb2dUb29sKGlkKTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgb3BlbiBkaWFsb2cgdG9vbDogaXRzIGJvZHkgaXMgdG9ybiBkb3duLCB0aGVuIGl0cyBzZXNzaW9uIGVuZHMuICovXG4gIHByb3RlY3RlZCBjbG9zZURpYWxvZ1Rvb2woKTogdm9pZCB7XG4gICAgdGhpcy5jb250cmlidXRpb25zLmNsb3NlRGlhbG9nVG9vbCgpO1xuICB9XG5cbiAgLyoqIFdoZXJlIHRoZSBvcGVuIGRpYWxvZyB0b29sJ3MgaG9zdCBlbGVtZW50IGlzIGF0dGFjaGVkIG9uY2UgaXRzIGRpYWxvZyByZW5kZXJzLiAqL1xuICBAVmlld0NoaWxkKCd0b29sRGlhbG9nU2xvdCcpXG4gIHNldCB0b29sRGlhbG9nU2xvdChyZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5jb250cmlidXRpb25zLmF0dGFjaFRvb2xEaWFsb2dTbG90KHJlZj8ubmF0aXZlRWxlbWVudCk7XG4gIH1cbn1cbiIsIjwhLS0gU0FNIHRvYXN0OiBsaXZlIHN0YXR1cyArIGVuY29kZXItZG93bmxvYWQgcHJvZ3Jlc3MgYmFyIChqaXQtdWkjOTApLiBTdGlja3lcbiAgICAgd2hpbGUgYSBzZWdtZW50IHJ1bnM7IHN0YXlzIG9wZW4gdW50aWwgdGhlIGJhciByZWFjaGVzIDEwMCUgYW5kIHRoZSBydW4gZW5kcy4gLS0+XG48cC10b2FzdCBba2V5XT1cInNhbVRvYXN0S2V5XCIgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIj5cbiAgPG5nLXRlbXBsYXRlIGxldC1tZXNzYWdlIHBUZW1wbGF0ZT1cIm1lc3NhZ2VcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAxNnJlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBtYi0xXCI+e3sgbWVzc2FnZS5zdW1tYXJ5IH19PC9kaXY+XG4gICAgICA8ZGl2Pnt7IHNlZ21lbnRhdGlvbi5zdGF0dXMgfHwgbWVzc2FnZS5kZXRhaWwgfX08L2Rpdj5cbiAgICAgIDxwLXByb2dyZXNzQmFyXG4gICAgICAgICpuZ0lmPVwic2VnbWVudGF0aW9uLmRvd25sb2FkaW5nXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlZ21lbnRhdGlvbi5wcm9ncmVzc1wiXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJtdC0yIHNhbS1wcm9ncmVzc1wiXG4gICAgICA+PC9wLXByb2dyZXNzQmFyPlxuICAgICAgPHAtcHJvZ3Jlc3NCYXJcbiAgICAgICAgKm5nSWY9XCJzZWdtZW50YXRpb24uYnVzeSAmJiAhc2VnbWVudGF0aW9uLmRvd25sb2FkaW5nXCJcbiAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICBzdHlsZUNsYXNzPVwibXQtMlwiXG4gICAgICAgIFtzdHlsZV09XCJ7IGhlaWdodDogJzRweCcgfVwiXG4gICAgICA+PC9wLXByb2dyZXNzQmFyPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLXRvYXN0PlxuXG48IS0tIFJlc3VsdC9lcnJvciBub3RpY2VzIGZyb20gdGhlIGxpYnJhcnkgaXRzZWxmIChzZWdtZW50YXRpb24gb3V0Y29tZSwgcmVnaW9uXG4gICAgIHZhbGlkYXRpb24pLiBSZW5kZXJlZCBoZXJlIHNvIHRoZXkgZG8gbm90IGRlcGVuZCBvbiB0aGUgaG9zdCBtb3VudGluZyBhXG4gICAgIGtleWxlc3MgPHAtdG9hc3Q+IOKAlCB3aXRob3V0IHRoaXMgdGhlIG1lc3NhZ2VzIHdlbnQgbm93aGVyZSBpbiBhbnkgaG9zdCBidXRcbiAgICAgaml0LXVpLCBhbmQgYSBmYWlsZWQgcnVuIGxvb2tlZCBsaWtlIGEgYnV0dG9uIHRoYXQgZGlkIG5vdGhpbmcuIC0tPlxuPHAtdG9hc3QgW2tleV09XCJyZXN1bHRUb2FzdEtleVwiIHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+PC9wLXRvYXN0PlxuXG48IS0tIFNoYXJlZCBvdXRsZXRzIGZvciBub3RpY2VzIHJhaXNlZCB3aGVyZSB0aGVyZSBpcyBubyBwZXItaW5zdGFuY2Uga2V5IHRvIHVzZTpcbiAgICAgdGhlIHJvb3QtcHJvdmlkZWQgUGxvdGx5U2VydmljZSBhbmQgdGhlIHJlZ2lvbi1lZGl0b3IgZGlhbG9nLiBSZW5kZXJlZCBieSBhXG4gICAgIHNpbmdsZSB2aXN1YWxpemVyIChvd25zU2hhcmVkVG9hc3RzKSBzbyBhIG1lc3NhZ2UgZnJvbSB0aGUgcm9vdCBzZXJ2aWNlIGlzXG4gICAgIG5vdCBzaG93biBvbmNlIHBlciBsaXZlIHZpZXdlci4gLS0+XG48cC10b2FzdCAqbmdJZj1cIm93bnNTaGFyZWRUb2FzdHNcIiBba2V5XT1cInZpelRvYXN0S2V5XCI+PC9wLXRvYXN0PlxuPHAtdG9hc3QgKm5nSWY9XCJvd25zU2hhcmVkVG9hc3RzXCIgW2tleV09XCJ2aXpBbGVydFRvYXN0S2V5XCIgcG9zaXRpb249XCJjZW50ZXJcIj48L3AtdG9hc3Q+XG5cbjwhLS0gVG9vbGJhciBkb2NrOiBkb2NrZWQgYWNyb3NzIHRoZSB0b3AgYnkgZGVmYXVsdDsgZHJhZyB0aGUgaGFuZGxlIHRvIGRldGFjaFxuICAgICBpdCBpbnRvIGEgZmxvYXRpbmcsIG1vdmFibGUgd2luZG93IChmcmVlcyB0aGUgdG9wIHJvdyBmb3IgdGhlIGltYWdlKS4gLS0+XG48ZGl2XG4gIGNsYXNzPVwidG9vbGJhci1kb2NrXCJcbiAgW2NsYXNzLmZsb2F0aW5nXT1cInRvb2xiYXJGbG9hdGluZ1wiXG4gIFtzdHlsZS5sZWZ0LnB4XT1cInRvb2xiYXJGbG9hdGluZyA/IHRvb2xiYXJQb3MueCA6IG51bGxcIlxuICBbc3R5bGUudG9wLnB4XT1cInRvb2xiYXJGbG9hdGluZyA/IHRvb2xiYXJQb3MueSA6IG51bGxcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ0b29sYmFyLWRyYWctaGFuZGxlXCJcbiAgICBbdml6RmxvYXRpbmdEcmFnXT1cInRvb2xiYXJEcmFnT3JpZ2luXCJcbiAgICAodml6RmxvYXRpbmdEcmFnTW92ZSk9XCJ0b29sYmFyUG9zID0gJGV2ZW50XCJcbiAgICBwVG9vbHRpcD1cIkRyYWcgdG8gZmxvYXQgdGhlIHRvb2xiYXJcIlxuICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gID5cbiAgICA8aSBjbGFzcz1cInBpIHBpLWJhcnNcIj48L2k+XG4gIDwvZGl2PlxuICA8cGxvdHRpbmctdG9vbGJhclxuICAgIFtpbWFnZUluZm9dPVwiaW1hZ2VJbmZvXCJcbiAgICBbaGFzU3BhdGlhbERhdGFzZXRdPVwiaGFzU3BhdGlhbERhdGFzZXRcIlxuICAgIFtwbG90VHlwZU9wdGlvbnNdPVwicGxvdFR5cGVNZW51XCJcbiAgICBbc2VsZWN0ZWRQbG90VHlwZV09XCJzZWxlY3RlZFBsb3RUeXBlSWRcIlxuICAgIFtiYXNlUGxvdFR5cGVdPVwiYmFzZVBsb3RUeXBlXCJcbiAgICBbaXNvUmFuZ2VdPVwiaXNvUmFuZ2VcIlxuICAgIFttYXhJbmRleF09XCJtYXhJbmRleFwiXG4gICAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICAgIFtpc0hlYXRtYXBdPVwiaXNIZWF0bWFwXCJcbiAgICBbaXMzZFJlZ2lvbnNdPVwiaXNTcGF0aWFsM2RNb2RlXCJcbiAgICBbaXNWb2x1bWVWaWV3XT1cImlzVm9sdW1lVmlld1wiXG4gICAgW3NsaWNlRWRpdG9yXT1cInNsaWNlRWRpdG9yXCJcbiAgICBbYWN0aXZlRHJhZ01vZGVdPVwiYWN0aXZlRHJhZ01vZGVcIlxuICAgIFthY3RpdmVTdXJmYWNlM2RNb2RlXT1cImFjdGl2ZVN1cmZhY2UzZE1vZGVcIlxuICAgIFtheGVzVmlzaWJsZV09XCJheGVzVmlzaWJsZVwiXG4gICAgW3dpcmVmcmFtZUFjdGl2ZV09XCJ3aXJlZnJhbWVBY3RpdmVcIlxuICAgIFtyZXNvbHV0aW9uU2NhbGVdPVwicmVzb2x1dGlvblNjYWxlXCJcbiAgICBbd2FuZFNlbnNpdGl2aXR5XT1cIndhbmRTZW5zaXRpdml0eVwiXG4gICAgW2JydXNoU2l6ZV09XCJicnVzaFNpemVcIlxuICAgIFtzYW1Nb2RlbHNdPVwic2FtTW9kZWxzXCJcbiAgICBbc2FtTW9kZWxJZF09XCJzYW1Nb2RlbElkXCJcbiAgICBbY29udHJpYnV0ZWRUb29sc109XCJjb250cmlidXRlZFRvb2xzXCJcbiAgICBbZGlhbG9nVG9vbHNdPVwiZGlhbG9nVG9vbHNcIlxuICAgIFtvcGVuRGlhbG9nVG9vbElkXT1cIm9wZW5EaWFsb2dUb29sSWRcIlxuICAgICh0b2dnbGVEaWFsb2dUb29sKT1cInRvZ2dsZURpYWxvZ1Rvb2woJGV2ZW50KVwiXG4gICAgW3Rvb2xNb2RlbElkc109XCJ0b29sUGFyYW1zLnRvb2xNb2RlbElkc1wiXG4gICAgW3ZlcnRleEVyYXNlclJhZGl1c109XCJ2ZXJ0ZXhFcmFzZXJSYWRpdXNcIlxuICAgIFtjYW5VbmRvXT1cInJlZ2lvbkFjdGlvbnMuY2FuVW5kb1wiXG4gICAgW2NhblJlZG9dPVwicmVnaW9uQWN0aW9ucy5jYW5SZWRvXCJcbiAgICBbdG9vbHNdPVwidG9vbGJhclRvb2xzXCJcbiAgICBbaW1hZ2VTbW9vdGhpbmdFbmFibGVkXT1cImltYWdlU21vb3RoaW5nRW5hYmxlZFwiXG4gICAgKHNlbGVjdFBsb3RUeXBlKT1cIm9uU2VsZWN0UGxvdFR5cGUoJGV2ZW50KVwiXG4gICAgKHRvZ2dsZUltYWdlU21vb3RoaW5nKT1cIm9uVG9nZ2xlSW1hZ2VTbW9vdGhpbmcoKVwiXG4gICAgKGFkZFByb2ZpbGVMaW5lKT1cImFkZFByb2ZpbGVMaW5lKClcIlxuICAgIChpc29SYW5nZUNoYW5nZSk9XCJvbklzb1JhbmdlQ2hhbmdlKCRldmVudClcIlxuICAgIChvcGVuQ2hhbm5lbEhpc3RvZ3JhbSk9XCJvcGVuQ2hhbm5lbEhpc3RvZ3JhbSgpXCJcbiAgICAob3BlblNwYXRpYWxDb250cm9scyk9XCJvcGVuU3BhdGlhbENvbnRyb2xzKClcIlxuICAgIChvcGVuUmVnaW9uRWRpdG9yKT1cIm9wZW5SZWdpb25FZGl0b3IoKVwiXG4gICAgKHRvZ2dsZVNsaWNlRWRpdG9yKT1cInRvZ2dsZVNsaWNlRWRpdG9yKClcIlxuICAgIChzZWxlY3RTdGFja09wdGlvbik9XCJzZWxlY3RTdGFja09wdGlvbigkZXZlbnQpXCJcbiAgICAoelNjcnViKT1cIm9uWlNjcnViKCRldmVudClcIlxuICAgICh6U2xpZGUpPVwib25aU2xpZGUoJGV2ZW50KVwiXG4gICAgKHpJbmRleElucHV0KT1cInpJbmRleCA9ICRldmVudDsgdXBkYXRlWkluZGV4KClcIlxuICAgIChyZWxvYWRBbmRQbG90KT1cInJlbG9hZEFuZFBsb3QoKVwiXG4gICAgKGRvd25sb2FkSW1hZ2UpPVwiZG93bmxvYWRJbWFnZSgpXCJcbiAgICAoYXV0b3NjYWxlSW1hZ2UpPVwiYXV0b3NjYWxlSW1hZ2UoKVwiXG4gICAgKHRvZ2dsZURyYWdNb2RlKT1cInRvZ2dsZURyYWdNb2RlKCRldmVudClcIlxuICAgICh6b29tSW4pPVwiem9vbUluKClcIlxuICAgICh6b29tT3V0KT1cInpvb21PdXQoKVwiXG4gICAgKHRvZ2dsZVN1cmZhY2UzZE1vZGUpPVwidG9nZ2xlU3VyZmFjZTNkTW9kZSgkZXZlbnQpXCJcbiAgICAocmVzZXRTdXJmYWNlQ2FtZXJhKT1cInJlc2V0U3VyZmFjZUNhbWVyYSgpXCJcbiAgICAodG9nZ2xlQXhlcyk9XCJ0b2dnbGVBeGVzKClcIlxuICAgICh0b2dnbGVXaXJlZnJhbWUpPVwidG9nZ2xlV2lyZWZyYW1lKClcIlxuICAgIChzZWxlY3RSZXNvbHV0aW9uKT1cInNlbGVjdFJlc29sdXRpb24oJGV2ZW50KVwiXG4gICAgKGRlbGV0ZVJlZ2lvbik9XCJkZWxldGVSZWdpb24oKVwiXG4gICAgKHVuZG9SZWdpb24pPVwidW5kb1JlZ2lvbigpXCJcbiAgICAocmVkb1JlZ2lvbik9XCJyZWRvUmVnaW9uKClcIlxuICAgIChzZWdtZW50UmVnaW9ucyk9XCJzZWdtZW50UmVnaW9ucygpXCJcbiAgICAoc2VnbWVudENlbGxwb3NlKT1cInNlZ21lbnRDZWxscG9zZSgpXCJcbiAgICAoc2FtTW9kZWxDaGFuZ2UpPVwib25TYW1Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAocnVuVG9vbCk9XCJydW5Ub29sKCRldmVudClcIlxuICAgICh0b29sTW9kZWxDaGFuZ2UpPVwib25Ub29sTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKG9wZW5Ub29sUGFyYW1zKT1cIm9wZW5Ub29sUGFyYW1zKCRldmVudClcIlxuICAgICh3YW5kU2Vuc2l0aXZpdHlDaGFuZ2UpPVwib25XYW5kU2Vuc2l0aXZpdHlDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGJydXNoU2l6ZUNoYW5nZSk9XCJvbkJydXNoU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAodmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKT1cIm9uVmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKCRldmVudClcIlxuICA+XG4gICAgPCEtLSBIb3N0LXByb2plY3RlZCBjdXN0b20gdG9vbGJhciBidXR0b25zLCBmb3J3YXJkZWQgaW50byB0aGUgdG9vbGJhci4gLS0+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3Bsb3R0aW5nLXRvb2xiYXI+XG4gIDxwLWJ1dHRvblxuICAgICpuZ0lmPVwidG9vbGJhckZsb2F0aW5nXCJcbiAgICBjbGFzcz1cInRvb2xiYXItZG9jay1idG5cIlxuICAgIGljb249XCJwaSBwaS10aHVtYnRhY2tcIlxuICAgIHNpemU9XCJzbWFsbFwiXG4gICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgcFRvb2x0aXA9XCJEb2NrIHRvIHRvcFwiXG4gICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAob25DbGljayk9XCJkb2NrVG9vbGJhcigpXCJcbiAgPlxuICA8L3AtYnV0dG9uPlxuPC9kaXY+XG5cbjxwLWNvbnRleHRNZW51ICNjbSBbbW9kZWxdPVwiY29udGV4dE1lbnVJdGVtc1wiIGFwcGVuZFRvPVwiYm9keVwiPjwvcC1jb250ZXh0TWVudT5cbjwhLS0gTm8gYGgtZnVsbGAgaGVyZTogUHJpbWVGbGV4J3MgaGVpZ2h0OjEwMCUgIWltcG9ydGFudCBtYWRlICNwbG90IGFzIHRhbGwgYXNcbiAgICAgdGhlIHdob2xlIGhvc3QsIHNvIHVuZGVyIHRoZSBkb2NrZWQgdG9vbGJhciBpdHMgYm90dG9tIHRvb2xiYXItaGVpZ2h0IHN0cmlwXG4gICAgIChpbmNsLiB0aGUgT1NEIHNjYWxlIGJhciBhdCBib3R0b20tbGVmdCkgd2FzIGNsaXBwZWQgYnkgdGhlIGhvc3Qnc1xuICAgICBvdmVyZmxvdzpoaWRkZW4uIFRoZSBjb21wb25lbnQgc3R5bGVzaGVldCBzaXplcyBpdCAoLnZpei1wbG90IHsgZmxleDogMSB9KS4gLS0+XG48IS0tIFRoZSBwbG90LCBhbmQgd2hpbGUgYSB2b2x1bWUgdmlldyBpcyBzcGxpdCwgdGhlIHNsaWNlIGVkaXRvcidzIHBhbmUgb24gaXRzIGxlZnQgKGl0cyBvd25cbiAgICAgdmlld2VyLCB3aXRoIGV2ZXJ5IHJlZ2lvbiB0b29sKSB3aXRoIGEgZGl2aWRlciB0byByZXNpemUgdGhlIHR3by4gVGhlIHBsb3QgZGl2IGtlZXBzIGl0c1xuICAgICBwbGFjZSBpbiB0aGUgRE9NIGVpdGhlciB3YXk6IHRoZSBiYWNrZW5kcyBmaW5kIGl0IGJ5IGlkLCBhbmQgYSB2aWV3ZXIgbW91bnRlZCBpbiBpdCBzdGF5cy4gLS0+XG48ZGl2XG4gIGNsYXNzPVwidml6LXBhbmVzXCJcbiAgW2NsYXNzLnZpei1xdWFkXT1cInNsaWNlRWRpdG9yU2hvd25cIlxuICBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXT1cInNsaWNlRWRpdG9yU2hvd24gPyBzcGxpdFggKyAnJSA2cHggbWlubWF4KDAsIDFmciknIDogbnVsbFwiXG4gIFtzdHlsZS5ncmlkLXRlbXBsYXRlLXJvd3NdPVwic2xpY2VFZGl0b3JTaG93biA/IHNwbGl0WSArICclIDZweCBtaW5tYXgoMCwgMWZyKScgOiBudWxsXCJcbj5cbiAgPCEtLSBUaGUgc2xpY2UgZWRpdG9yOiB0aGUgdm9sdW1lICh0aGUgcGxvdCkgdG9wIGxlZnQsIHRoZSBzbGljZSBiZWluZyBlZGl0ZWQgKFopIHRvcCByaWdodCxcbiAgICAgICB0aGUgc2VjdGlvbnMgdGhyb3VnaCB4IGFuZCB5IGJlbG93LCBpbiB0aGVpciBheGlzIGNvbG91cnMuIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2xpY2VFZGl0b3JTaG93blwiPlxuICAgIDxkaXYgY2xhc3M9XCJ2aXotY2VsbCB2aXotY2VsbC16XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidml6LXNsaWNlLXBhbmVcIiBbaWRdPVwic2xpY2VEaXZOYW1lXCI+PC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cInZpei1wYW5lLWJhZGdlIHZpei1wYW5lLWJhZGdlLXpcIj5aIMK3IHNsaWNlIHt7IHpJbmRleCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidml6LWNlbGwgdml6LWNlbGwteFwiPlxuICAgICAgPHZpei1zZWN0aW9uLXBhbmUgYXhpcz1cInhcIiBbdmlld109XCJzZWN0aW9ucy54XCIgKHBpY2spPVwib25TZWN0aW9uUGljaygneCcsICRldmVudClcIj48L3Zpei1zZWN0aW9uLXBhbmU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInZpei1jZWxsIHZpei1jZWxsLXlcIj5cbiAgICAgIDx2aXotc2VjdGlvbi1wYW5lIGF4aXM9XCJ5XCIgW3ZpZXddPVwic2VjdGlvbnMueVwiIChwaWNrKT1cIm9uU2VjdGlvblBpY2soJ3knLCAkZXZlbnQpXCI+PC92aXotc2VjdGlvbi1wYW5lPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidml6LXBhbmUtZGl2aWRlciB2aXotcGFuZS1kaXZpZGVyLXZcIlxuICAgICAgcm9sZT1cInNlcGFyYXRvclwiXG4gICAgICBhcmlhLW9yaWVudGF0aW9uPVwidmVydGljYWxcIlxuICAgICAgYXJpYS1sYWJlbD1cIlJlc2l6ZSB0aGUgcGFuZXMgYWNyb3NzXCJcbiAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwic3BsaXRYXCJcbiAgICAgIGFyaWEtdmFsdWVtaW49XCIyMFwiXG4gICAgICBhcmlhLXZhbHVlbWF4PVwiODBcIlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgIChwb2ludGVyZG93bik9XCJzdGFydFBhbmVSZXNpemUoJGV2ZW50LCAneCcpXCJcbiAgICAgIChrZXlkb3duKT1cIm51ZGdlUGFuZVNpemUoJGV2ZW50LCAneCcpXCJcbiAgICA+PC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ2aXotcGFuZS1kaXZpZGVyIHZpei1wYW5lLWRpdmlkZXItaFwiXG4gICAgICByb2xlPVwic2VwYXJhdG9yXCJcbiAgICAgIGFyaWEtb3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJSZXNpemUgdGhlIHBhbmVzIGRvd25cIlxuICAgICAgW2F0dHIuYXJpYS12YWx1ZW5vd109XCJzcGxpdFlcIlxuICAgICAgYXJpYS12YWx1ZW1pbj1cIjIwXCJcbiAgICAgIGFyaWEtdmFsdWVtYXg9XCI4MFwiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgKHBvaW50ZXJkb3duKT1cInN0YXJ0UGFuZVJlc2l6ZSgkZXZlbnQsICd5JylcIlxuICAgICAgKGtleWRvd24pPVwibnVkZ2VQYW5lU2l6ZSgkZXZlbnQsICd5JylcIlxuICAgID48L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcmVsYXRpdmUgdml6LXBsb3RcIiBbaWRdPVwicGxvdERpdk5hbWVcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiaW1nTG9hZGluZygpIHx8IHN0YWNrTG9hZGluZygpIHx8IGlzQ2FjaGluZygpXCIgY2xhc3M9XCJsb2FkaW5nLW92ZXJsYXlcIj5cbiAgICAgIDwhLS0gRGV0ZXJtaW5hdGUgc3RhY2svdm9sdW1lIHByb2dyZXNzIHRha2VzIHByZWNlZGVuY2U6IHdoaWxlIGl0J3MgYWN0aXZlIHNob3cgT05MWSB0aGVcbiAgICAgICAgIHByb2dyZXNzIGJhciArIFwiTG9hZGluZyBmcmFtZXMuLi5cIiwgbm90IHRoZSBnZW5lcmljIHNwaW5uZXIvXCJMb2FkaW5nIGltYWdlLi4uXCIgb24gdG9wIG9mXG4gICAgICAgICBpdCAoYm90aCB3ZXJlIHJlbmRlcmluZyBhdCBvbmNlIGZvciBuYXBhcmkgdm9sdW1lL2lzb3N1cmZhY2UgbG9hZHMpLiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGFja0xvYWRpbmcoKTsgZWxzZSBpbWdMb2FkaW5nVHBsXCI+XG4gICAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwibG9hZGluZ1BlcmNlbnRhZ2UoKVwiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj5Mb2FkaW5nIGZyYW1lcy4uLjwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNpbWdMb2FkaW5nVHBsPlxuICAgICAgICA8IS0tIENhY2hlLWNvcHkgcHJvZ3Jlc3MgaXMgc2hvd24gd2hlbmV2ZXIgYSBjYWNoZSBkb3dubG9hZCBpcyBhY3RpdmUgKGlzQ2FjaGluZyksIGluZGVwZW5kZW50XG4gICAgICAgICAgIG9mIGBpbWdMb2FkaW5nYCwgc28gaXQncyBuZXZlciBkcm9wcGVkL21hc2tlZCBtaWQtZG93bmxvYWQuIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDYWNoaW5nKCk7IGVsc2Ugc3Bpbm5lckxvYWRpbmdcIj5cbiAgICAgICAgICA8IS0tIFN0YWdlLWF3YXJlIG1lc3NhZ2UgY29tZXMgZnJvbSBDYWNoZVByb2dyZXNzU2VydmljZSB1cGRhdGluZ1xuICAgICAgICAgICAgIGltYWdlTG9hZGluZ01lc3NhZ2UkIChcIkNhY2hpbmcgaW1hZ2UuLi5cIiBkdXJpbmcgdGhlIEdDUyBkb3dubG9hZCxcbiAgICAgICAgICAgICB0aGVuIFwiR2VuZXJhdGluZyBwcmV2aWV3Li4uXCIgZHVyaW5nIHBlci1zbGljZSB0aHVtYm5haWwgZ2VuKS4gT25jZSB0aGVcbiAgICAgICAgICAgICBkb3dubG9hZCBoaXRzIDEwMCUgdGhlIHJlbWFpbmluZyB3b3JrIChzZXJ2ZXIgcHJldmlldy90aWxlIGdlbmVyYXRpb24pXG4gICAgICAgICAgICAgaGFzIG5vIGRldGVybWluYXRlIHByb2dyZXNzLCBzbyBmYWxsIHRocm91Z2ggdG8gdGhlIHNwaW5uZXIgdGVtcGxhdGVcbiAgICAgICAgICAgICByYXRoZXIgdGhhbiBwYXJraW5nIGEgZnVsbCBiYXIgdW5kZXIgXCJMb2FkaW5nIGltYWdlLi4uXCIuIC0tPlxuICAgICAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwiY2FjaGVQcm9ncmVzcygpXCI+PC9wLXByb2dyZXNzQmFyPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+e3sgbG9hZGluZ01lc3NhZ2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc3Bpbm5lckxvYWRpbmc+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImltZ0xvYWRpbmcoKVwiIGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nTG9hZGluZygpICYmICF6b29tKClcIiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPnt7IGxvYWRpbmdNZXNzYWdlKCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJpbWdMb2FkaW5nKCkgJiYgem9vbSgpXCIgY2xhc3M9XCJ6b29tLXRleHQtbG9hZGluZ1wiPnt7IGxvYWRpbmdNZXNzYWdlKCkgfX08L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic3RhY2tMb2FkaW5nKCkgfHwgaW1nTG9hZGluZygpXCJcbiAgICAgICAgY2xhc3M9XCJjYW5jZWwtbG9hZGluZ1wiXG4gICAgICAgIGxhYmVsPVwiQ2FuY2VsXCJcbiAgICAgICAgKG9uQ2xpY2spPVwiY2FuY2VsTG9hZGluZygpXCJcbiAgICAgID5cbiAgICAgIDwvcC1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBUcmFuc2x1Y2VudCBcInNoYXJwZW5pbmdcIiBvdmVybGF5IHNob3duIGFmdGVyIHRoZSBzbWFsbC10aWVyIHByZXZpZXcgaXNcbiAgICAgICBvbiBzY3JlZW4gd2hpbGUgdGhlIGxhcmdlLXRpZXIgcmVuZGVyIGlzIHN0aWxsIGxvYWRpbmcgaW4gdGhlXG4gICAgICAgYmFja2dyb3VuZC4gTGV0cyB0aGUgdXNlciBzZWUgdGhlIGJsdXJyeSBpbWFnZSB1bmRlcm5lYXRoIGJ1dCBtYWtlc1xuICAgICAgIGl0IGNsZWFyIHNvbWV0aGluZyBpcyBzdGlsbCBsb2FkaW5nIHNvIHRoZXkgZG9uJ3QgbWlzdGFrZSB0aGVcbiAgICAgICBsb3ctcmVzIHJlbmRlciBmb3IgdGhlIGZpbmFsIGltYWdlLiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyLnNoYXJwZW5pbmcgJiYgIWltZ0xvYWRpbmcoKSAmJiAhc3RhY2tMb2FkaW5nKCkgJiYgIWlzQ2FjaGluZygpXCIgY2xhc3M9XCJzaGFycGVuaW5nLW92ZXJsYXlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPlNoYXJwZW5pbmcgcHJldmlldy4uLjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBGbG9hdGluZywgZHJhZ2dhYmxlIGludGVuc2l0eS1wcm9maWxlIGluc2V0LCBzaG93biB3aGlsZSBhbnkgaW50ZW5zaXR5IGxpbmVcbiAgICAgZXhpc3RzLiBLZXB0IE9VVFNJREUgdGhlIHBsb3QgZGl2IGFuZCBmaXhlZCB0byB0aGUgdmlld3BvcnQsIHNvIGl0IGZsb2F0cyBvdmVyXG4gICAgIHRoZSB3aG9sZSBwYWdlIHJhdGhlciB0aGFuIGJlaW5nIGNsaXBwZWQgdG8gdGhlIGNhbnZhcy4gLS0+XG48dml6LWludGVuc2l0eS1pbnNldFxuICBbZGl2SWRdPVwiaW50ZW5zaXR5SW5zZXREaXZcIlxuICBbcGxvdERpdk5hbWVdPVwicGxvdERpdk5hbWVcIlxuICBbekluZGV4XT1cInpJbmRleFwiXG4gIFtpbWFnZVZpZXddPVwiaXNJbWFnZVZpZXdcIlxuICBbaW1hZ2VJbmZvXT1cImltYWdlSW5mb1wiXG4+PC92aXotaW50ZW5zaXR5LWluc2V0PlxuXG48IS0tIENoYW5uZWxzICYgSGlzdG9ncmFtOiBub24tbW9kYWwgZmxvYXRpbmcgZGlhbG9nIG9wZW5lZCBmcm9tIHRoZSB0b29sYmFyLiAtLT5cbjxjaGFubmVsLWhpc3RvZ3JhbSBbKHZpc2libGUpXT1cInNob3dDaGFubmVsSGlzdG9ncmFtXCI+PC9jaGFubmVsLWhpc3RvZ3JhbT5cblxuPCEtLSBTcGF0aWFsLW9taWNzIGNvbnRyb2xzLiBSZW5kZXJzIGl0cyBvd24gZW1wdHkgc3RhdGUgd2hlbiBubyBkYXRhc2V0IChvciBub1xuICAgICBTUEFUSUFMX0RBVEFfUE9SVCkgaXMgcHJlc2VudCwgc28gaXQgaXMgYWx3YXlzIHNhZmUgdG8gaG9zdC4gLS0+XG48c3BhdGlhbC1jb250cm9scyBbKHZpc2libGUpXT1cInNob3dTcGF0aWFsQ29udHJvbHNcIiBbaXMzZF09XCJpc1NwYXRpYWwzZE1vZGVcIj48L3NwYXRpYWwtY29udHJvbHM+XG5cbjwhLS0gU2lkZSBwYW5lbCBvZiB0aGUgYWN0aXZlIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZSAoUExPVF9UWVBFX0NPTlRSSUJVVElPTlMpLFxuICAgICBpbiB0aGUgc2FtZSByaWdodC1oYW5kIGFyZWEgYXMgdGhlIHNwYXRpYWwgY29udHJvbHMgYW5kIHRoZSBSZWdpb24gRWRpdG9yLlxuICAgICBFeGlzdHMgb25seSB3aGlsZSB0aGUgbW9kZSdzIHNlc3Npb24gaXMgbGl2ZTsgdGhlcmUgaXMgbm8gY2xvc2UgYnV0dG9uLFxuICAgICBiZWNhdXNlIGxlYXZpbmcgdGhlIG1vZGUgaXMgd2hhdCBlbmRzIGl0LiBBIGNvbXBvbmVudCBwYW5lbCBnZXRzXG4gICAgIFBMT1RfTU9ERV9DT05URVhUIC8gUExPVF9NT0RFX1NFU1NJT04gZnJvbSBpdHMgaW5qZWN0b3I7IGEgYG1vdW50YCBwYW5lbCdzXG4gICAgIGhvc3QgZWxlbWVudCBpcyBhdHRhY2hlZCB0byB0aGUgc2xvdCBiZWxvdyAoc2VlIHBsb3RNb2RlUGFuZWxTbG90KS4gLS0+XG48cC1kaWFsb2dcbiAgKm5nSWY9XCJwbG90TW9kZVBhbmVsIGFzIHBhbmVsXCJcbiAgW2hlYWRlcl09XCJwYW5lbC50aXRsZVwiXG4gIFt2aXNpYmxlXT1cInRydWVcIlxuICBbbW9kYWxdPVwiZmFsc2VcIlxuICBbY2xvc2FibGVdPVwiZmFsc2VcIlxuICBbcmVzaXphYmxlXT1cInRydWVcIlxuICBbZHJhZ2dhYmxlXT1cInRydWVcIlxuICBhcHBlbmRUbz1cImJvZHlcIlxuICBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgc3R5bGVDbGFzcz1cInBsb3QtbW9kZS1wYW5lbFwiXG4gIFtzdHlsZV09XCJ7IHdpZHRoOiAnMjJyZW0nLCBtYXhIZWlnaHQ6ICc4NXZoJyB9XCJcbiAgW2NvbnRlbnRTdHlsZV09XCJ7IG92ZXJmbG93OiAnYXV0bycgfVwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5jb21wb25lbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cInBhbmVsLmNvbXBvbmVudDsgaW5qZWN0b3I6IHBhbmVsLmluamVjdG9yID8/IHVuZGVmaW5lZFwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiAqbmdJZj1cInBhbmVsLmhvc3RcIiAjcGxvdE1vZGVQYW5lbFNsb3QgY2xhc3M9XCJwbG90LW1vZGUtcGFuZWwtc2xvdFwiPjwvZGl2PlxuPC9wLWRpYWxvZz5cblxuPCEtLSBBbiBvcGVuIGRpYWxvZyB0b29sIChUT09MQkFSX1RPT0xTLCBraW5kOiAnZGlhbG9nJykuIE5vbi1tb2RhbCBzbyB0aGUgdXNlciBjYW5cbiAgICAga2VlcCB3b3JraW5nIG9uIHRoZSBpbWFnZSwgZS5nLiBwYWludGluZyB3aXRoIHRoZSBicnVzaCB0aGUgdG9vbCBhcm1lZC4gVGhlXG4gICAgIHRvb2wgcmVuZGVycyBpdHMgYm9keSBpbnRvIGEgaG9zdCBlbGVtZW50IGF0dGFjaGVkIHRvIHRoZSBzbG90IGJlbG93IChzZWVcbiAgICAgdG9vbERpYWxvZ1Nsb3QpOyBjbG9zaW5nIHRoZSBkaWFsb2cgZW5kcyB0aGUgdG9vbCdzIHNlc3Npb24uIC0tPlxuPHAtZGlhbG9nXG4gICpuZ0lmPVwidG9vbERpYWxvZyBhcyBkbGdcIlxuICBbaGVhZGVyXT1cImRsZy50aXRsZVwiXG4gIFt2aXNpYmxlXT1cInRydWVcIlxuICAodmlzaWJsZUNoYW5nZSk9XCIkZXZlbnQgfHwgY2xvc2VEaWFsb2dUb29sKClcIlxuICBbbW9kYWxdPVwiZmFsc2VcIlxuICBbY2xvc2FibGVdPVwidHJ1ZVwiXG4gIFtyZXNpemFibGVdPVwidHJ1ZVwiXG4gIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gIGFwcGVuZFRvPVwiYm9keVwiXG4gIHBvc2l0aW9uPVwicmlnaHRcIlxuICBzdHlsZUNsYXNzPVwidG9vbC1kaWFsb2dcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogZGxnLndpZHRoLCBtYXhIZWlnaHQ6ICc4NXZoJyB9XCJcbiAgW2NvbnRlbnRTdHlsZV09XCJ7IG92ZXJmbG93OiAnYXV0bycgfVwiXG4+XG4gIDxkaXYgI3Rvb2xEaWFsb2dTbG90IGNsYXNzPVwidG9vbC1kaWFsb2ctc2xvdFwiPjwvZGl2PlxuPC9wLWRpYWxvZz5cblxuPCEtLSBSZWdpb24gRWRpdG9yOiBub24tbW9kYWwsIGRyYWdnYWJsZSwgcmVzaXphYmxlIGZsb2F0aW5nIGRpYWxvZyBvcGVuZWQgZnJvbVxuICAgICB0aGUgdG9vbGJhciAoZm9ybWVybHkgdGhlIHJpZ2h0LXBhbmVsIFJlZ2lvbnMgdGFiKS4gTW9kZWxlc3Mgc28gcmVnaW9ucyBjYW5cbiAgICAgc3RpbGwgYmUgZHJhd24vc2VsZWN0ZWQgb24gdGhlIHBsb3Qgd2hpbGUgaXQncyBvcGVuOyBzdGF5cyBsaW5rZWQgdG8gdGhpc1xuICAgICBwbG90dGluZyBpbnN0YW5jZSB2aWEgdGhlIHJvb3QgUmVnaW9uU3RvcmUgc2luZ2xldG9uLiBPcGVucyBvdmVyIHRoZSByaWdodFxuICAgICBzaWRlIG9mIHRoZSB2aWV3LiAtLT5cbjxwLWRpYWxvZ1xuICBoZWFkZXI9XCJSZWdpb24gRWRpdG9yXCJcbiAgWyh2aXNpYmxlKV09XCJzaG93UmVnaW9uRWRpdG9yXCJcbiAgW21vZGFsXT1cImZhbHNlXCJcbiAgW3Jlc2l6YWJsZV09XCJ0cnVlXCJcbiAgW2RyYWdnYWJsZV09XCJ0cnVlXCJcbiAgW21heGltaXphYmxlXT1cInRydWVcIlxuICBhcHBlbmRUbz1cImJvZHlcIlxuICBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6IHJlZ2lvbkVkaXRvcldpZHRoLCBoZWlnaHQ6ICc4NXZoJyB9XCJcbiAgW2NvbnRlbnRTdHlsZV09XCJ7IG92ZXJmbG93OiAnYXV0bycgfVwiXG4+XG4gIDxyZWdpb24tZWRpdG9yIFthY3RpdmVdPVwic2hvd1JlZ2lvbkVkaXRvclwiPjwvcmVnaW9uLWVkaXRvcj5cbjwvcC1kaWFsb2c+XG5cbjwhLS0gU2ltcGxpZnkgKERvdWdsYXPigJNQZXVja2VyKTogY3VzdG9tIHB4LXRocmVzaG9sZCBwaWNrZXIgZm9yIHRoZSBzZWxlY3RlZFxuICAgICByZWdpb24ocyksIG9wZW5lZCBmcm9tIHRoZSByaWdodC1jbGljayBcIlNpbXBsaWZ5IOKWuCBDdXN0b23igKZcIiBhY3Rpb24uIC0tPlxuPHAtZGlhbG9nXG4gIGhlYWRlcj1cIlNpbXBsaWZ5IHJlZ2lvbihzKVwiXG4gIFsodmlzaWJsZSldPVwiZGlzcGxheVNpbXBsaWZ5RGlhbG9nXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogJzIycmVtJyB9XCJcbiAgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gIFtyZXNpemFibGVdPVwiZmFsc2VcIlxuPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiPlxuICAgIDxzcGFuXG4gICAgICA+QWx0aXR1ZGUgdGhyZXNob2xkOiA8Yj57eyByZWdpb25BY3Rpb25zLnNpbXBsaWZ5VGhyZXNob2xkIH19IHB4PC9iPjwvc3BhblxuICAgID5cbiAgICA8cC1zbGlkZXIgWyhuZ01vZGVsKV09XCJyZWdpb25BY3Rpb25zLnNpbXBsaWZ5VGhyZXNob2xkXCIgW21pbl09XCIxXCIgW21heF09XCIyMFwiIFtzdGVwXT1cIjFcIj48L3Atc2xpZGVyPlxuICAgIDxzbWFsbD5WZXJ0aWNlcyB3aXRoaW4gdGhpcyBkaXN0YW5jZSBvZiB0aGUgbGluZSBiZXR3ZWVuIHRoZWlyIG5laWdoYm91cnMgYXJlIHJlbW92ZWQuPC9zbWFsbD5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gbGFiZWw9XCJDYW5jZWxcIiBbdGV4dF09XCJ0cnVlXCIgKG9uQ2xpY2spPVwiZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2VcIj48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgbGFiZWw9XCJBcHBseVwiXG4gICAgICBpY29uPVwicGkgcGktY2hlY2tcIlxuICAgICAgKG9uQ2xpY2spPVwic2ltcGxpZnlSZWdpb25zKHJlZ2lvbkFjdGlvbnMuc2ltcGxpZnlUaHJlc2hvbGQpXCJcbiAgICA+PC9wLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1kaWFsb2c+XG5cbjwhLS0gUGFyYW1ldGVycyBmb3Igd2hpY2hldmVyIGNvbnRyaWJ1dGVkIHRvb2wgaXMgb3Blbi4gT25lIGRpYWxvZyBmb3IgYWxsIG9mXG4gICAgIHRoZW06IGEgdG9vbCBkZWNsYXJlcyBpdHMgZmllbGRzIChUb29sUGFyYW1TcGVjKSBhbmQgdGhpcyByZW5kZXJzIHRoZW0sIHNvXG4gICAgIHRoZSB0b29sYmFyIGNhbiBsYXkgZXZlcnkgdG9vbCBvdXQgdGhlIHNhbWUgd2F5IGFuZCBhIHBsdWdpbiBuZWVkcyBub1xuICAgICBQcmltZU5HIG9mIGl0cyBvd24uIERlZmF1bHRzIGNvbWUgZnJvbSB0aGUgYWN0aXZlIGNoZWNrcG9pbnQsIHNpbmNlIHRoZXlcbiAgICAgZW5jb2RlIHdoYXQgaXQgd2FzIHRyYWluZWQgZm9yLiAtLT5cbjxwLWRpYWxvZ1xuICAqbmdJZj1cInRvb2xQYXJhbXMub3BlblBhcmFtcyBhcyBvcGVuXCJcbiAgW2hlYWRlcl09XCJvcGVuLnRvb2wubGFiZWwgKyAnIHBhcmFtZXRlcnMnXCJcbiAgW3Zpc2libGVdPVwidHJ1ZVwiXG4gICh2aXNpYmxlQ2hhbmdlKT1cImNsb3NlVG9vbFBhcmFtcygpXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogJzMwcmVtJyB9XCJcbiAgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gIFtyZXNpemFibGVdPVwiZmFsc2VcIlxuICBhcHBlbmRUbz1cImJvZHlcIlxuPlxuICA8ZGl2IGNsYXNzPVwiZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZiBvZiBvcGVuLmZpZWxkc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCIgW25nQ2xhc3NdPVwiZi5zcGVjLnR5cGUgPT09ICdib29sZWFuJyA/ICdjb2wtMTInIDogJ2NvbC02J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZi5udW1iZXIgYXMgblwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIiBbcFRvb2x0aXBdPVwibi50b29sdGlwIHx8ICcnXCI+e3sgbi5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgPHAtaW5wdXROdW1iZXJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wZW4udmFsdWVzW24uaWRdXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9wZW4udmFsdWVzW24uaWRdID0gJGV2ZW50XCJcbiAgICAgICAgICAgIFttaW5dPVwibi5taW5cIlxuICAgICAgICAgICAgW21heF09XCJuLm1heFwiXG4gICAgICAgICAgICBbc3RlcF09XCJuLnN0ZXBcIlxuICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIm4uZnJhY3Rpb25EaWdpdHNcIlxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cInRydWVcIlxuICAgICAgICAgID48L3AtaW5wdXROdW1iZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmLnNlbGVjdCBhcyBzZWxcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCIgW3BUb29sdGlwXT1cInNlbC50b29sdGlwIHx8ICcnXCI+e3sgc2VsLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsLm9wdGlvbnNcIlxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wZW4udmFsdWVzW3NlbC5pZF1cIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib3Blbi52YWx1ZXNbc2VsLmlkXSA9ICRldmVudFwiXG4gICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQ2hlY2tib3ggbGFiZWwgc2l0cyBiZXNpZGUgdGhlIGJveCBhbmQgbWF5IHJ1biB0byBhIHNlbnRlbmNlLCBzb1xuICAgICAgICAgICAgIGl0IGRvZXMgbm90IGdldCB0aGUgc3RhY2tlZCBsYWJlbCB0aGUgb3RoZXIgdHlwZXMgdXNlLiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImYuc3BlYy50eXBlID09PSAnYm9vbGVhbidcIiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgPHAtY2hlY2tib3hcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wZW4udmFsdWVzW2Yuc3BlYy5pZF1cIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib3Blbi52YWx1ZXNbZi5zcGVjLmlkXSA9ICRldmVudFwiXG4gICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgW2lucHV0SWRdPVwib3Blbi50b29sLmlkICsgJy0nICsgZi5zcGVjLmlkXCJcbiAgICAgICAgICA+PC9wLWNoZWNrYm94PlxuICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIm9wZW4udG9vbC5pZCArICctJyArIGYuc3BlYy5pZFwiIGNsYXNzPVwidGV4dC1zbSBtYi0wXCIgW3BUb29sdGlwXT1cImYuc3BlYy50b29sdGlwIHx8ICcnXCI+e3tcbiAgICAgICAgICAgIGYuc3BlYy5sYWJlbFxuICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b25cbiAgICAgIGxhYmVsPVwiUmVzZXQgdG8gbW9kZWwgZGVmYXVsdHNcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgKG9uQ2xpY2spPVwicmVzZXRUb29sUGFyYW1zKG9wZW4udG9vbC5pZClcIlxuICAgID48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkNsb3NlXCIgc2l6ZT1cInNtYWxsXCIgKG9uQ2xpY2spPVwiY2xvc2VUb29sUGFyYW1zKClcIj48L3AtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cbiJdfQ==
|