@jax-data-science/sci-image-visualizer 0.4.0 → 0.6.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.
Files changed (32) hide show
  1. package/README.md +109 -0
  2. package/esm2022/index.mjs +2 -1
  3. package/esm2022/lib/contracts/display-types.mjs +1 -1
  4. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +66 -0
  5. package/esm2022/lib/contracts/plot-type.mjs +6 -1
  6. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +46 -4
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -3
  9. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +70 -7
  10. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +8 -1
  11. package/esm2022/lib/implementations/plotly/plotly.service.mjs +2 -3
  12. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +329 -0
  13. package/esm2022/lib/routing-visualizer.service.mjs +6 -1
  14. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +44 -3
  15. package/esm2022/lib/toolbar/toolbar.component.mjs +50 -21
  16. package/esm2022/lib/visualizer.component.mjs +479 -43
  17. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1092 -75
  18. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  19. package/index.d.ts +1 -0
  20. package/lib/contracts/display-types.d.ts +10 -0
  21. package/lib/contracts/plot-type-contribution.contract.d.ts +199 -0
  22. package/lib/contracts/plot-type.d.ts +10 -0
  23. package/lib/contracts/toolbar-tool.contract.d.ts +84 -5
  24. package/lib/contracts/visualizer.contract.d.ts +5 -0
  25. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +21 -0
  26. package/lib/implementations/osd/osd-coordinate-transform.d.ts +6 -0
  27. package/lib/plot-mode/plot-mode-controller.d.ts +130 -0
  28. package/lib/routing-visualizer.service.d.ts +4 -0
  29. package/lib/toolbar/brush/brush-tool.service.d.ts +21 -0
  30. package/lib/toolbar/toolbar.component.d.ts +28 -8
  31. package/lib/visualizer.component.d.ts +121 -8
  32. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { Injectable, Inject, Optional } from '@angular/core';
2
2
  import { HttpClient } from '@angular/common/http';
3
- import { BehaviorSubject, Subject, combineLatest, firstValueFrom, of } from 'rxjs';
4
- import { timeout } from 'rxjs/operators';
3
+ import { BehaviorSubject, Subject, combineLatest, defer, firstValueFrom, of } from 'rxjs';
4
+ import { startWith, timeout } from 'rxjs/operators';
5
5
  import { OSD } from './osd-lib';
6
6
  import { OSD_ZOOM_PER_SCROLL } from './osd-zoom';
7
7
  import { VisualizerStore } from '../../store/visualizer-store.service';
@@ -231,6 +231,11 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
231
231
  /** Visible image region (full-image pixel coords) emitted when the view
232
232
  * settles, so the intensity inset can re-sample at the current zoom level. */
233
233
  this.viewportChange$ = new Subject();
234
+ /** The visible rect on every redraw, coalesced to one emission per animation
235
+ * frame. Feeds {@link PlotModeViewport.frame$}. */
236
+ this.frame$ = new Subject();
237
+ this.frameRaf = null;
238
+ this.plotModeViewport = null;
234
239
  // Region state (regions, selection, the update event) lives in the shared
235
240
  // RegionStore; the IRegionStore methods below delegate to it.
236
241
  this.intensityProfile$ = new Subject();
@@ -922,6 +927,9 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
922
927
  // Tell listeners (the intensity inset) the visible image region whenever
923
928
  // the view settles, so they can re-sample at the current zoom resolution.
924
929
  this.viewer.addHandler('animation-finish', () => this.emitViewportChange());
930
+ // Every redraw (pan/zoom animation frames, resize) — for a contributed
931
+ // plot mode's overlay, which has to move with the image, not after it.
932
+ this.viewer.addHandler('update-viewport', () => this.scheduleFrame());
925
933
  // Chrome compositor bug: after an OSD zoom the docked toolbar (a sibling of
926
934
  // #plot in the <visualizer> host) is left laid-out-but-unpainted and
927
935
  // vanishes — confirmed via DevTools (DOM intact, region simply not painted).
@@ -1099,6 +1107,10 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
1099
1107
  }
1100
1108
  destroyViewer() {
1101
1109
  this.cache.cancelBackgroundLoad();
1110
+ if (this.frameRaf !== null) {
1111
+ cancelAnimationFrame(this.frameRaf);
1112
+ this.frameRaf = null;
1113
+ }
1102
1114
  // Tear down any active tool overlays (shared singletons).
1103
1115
  this.wandTool.setMode(false);
1104
1116
  this.brushTool.setMode(false);
@@ -1401,9 +1413,16 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
1401
1413
  /** Compute the current viewport's image-pixel rectangle (clamped to the image)
1402
1414
  * and broadcast it. */
1403
1415
  emitViewportChange() {
1416
+ const rect = this.visibleImageRect();
1417
+ if (rect)
1418
+ this.viewportChange$.next(rect);
1419
+ }
1420
+ /** The current viewport's image-pixel rectangle, clamped to the image, or
1421
+ * null when there is no laid-out viewport. */
1422
+ visibleImageRect() {
1404
1423
  const vp = this.viewer?.viewport;
1405
1424
  if (!vp || !this.descriptor)
1406
- return;
1425
+ return null;
1407
1426
  try {
1408
1427
  // Route through world item 0 (osd-coords): vp.viewportToImageRectangle is
1409
1428
  // inaccurate and warns when the world holds multiple images (per-channel
@@ -1414,12 +1433,56 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
1414
1433
  const y = Math.max(0, Math.min(ih, r.y));
1415
1434
  const width = Math.max(1, Math.min(iw - x, r.width));
1416
1435
  const height = Math.max(1, Math.min(ih - y, r.height));
1417
- this.viewportChange$.next({ x, y, width, height });
1436
+ return { x, y, width, height };
1418
1437
  }
1419
1438
  catch {
1420
- /* viewport not ready */
1439
+ return null; /* viewport not ready */
1421
1440
  }
1422
1441
  }
1442
+ /** Coalesce redraws into one {@link frame$} emission per animation frame.
1443
+ * Skipped entirely while nothing listens. */
1444
+ scheduleFrame() {
1445
+ if (this.frameRaf !== null || !this.frame$.observed)
1446
+ return;
1447
+ this.frameRaf = requestAnimationFrame(() => {
1448
+ this.frameRaf = null;
1449
+ const rect = this.visibleImageRect();
1450
+ if (rect)
1451
+ this.frame$.next(rect);
1452
+ });
1453
+ }
1454
+ /**
1455
+ * The viewport a contributed plot mode draws over. One stable object per
1456
+ * service: every method reads the CURRENT viewer, so it stays valid across a
1457
+ * viewer rebuild and reports `isReady() === false` while none is mounted
1458
+ * (conversions then return NaN rather than throwing).
1459
+ */
1460
+ getPlotModeViewport() {
1461
+ if (this.plotModeViewport)
1462
+ return this.plotModeViewport;
1463
+ const nan = { x: NaN, y: NaN };
1464
+ const ready = () => !!this.coordTransform?.isReady();
1465
+ this.plotModeViewport = {
1466
+ getOverlayContainer: () => this.getOverlayContainer(),
1467
+ dataToClient: (x, y) => (ready() ? this.coordTransform.dataToClient(x, y) : nan),
1468
+ clientToData: (cx, cy) => (ready() ? this.coordTransform.clientToData(cx, cy) : nan),
1469
+ dataLengthToScreen: (len) => (ready() ? this.coordTransform.dataLengthToScreen(len) : NaN),
1470
+ isReady: ready,
1471
+ // Both start with the current visible rect when the viewport is ready: a mode
1472
+ // activates after the base render has gone idle, so without it an overlay
1473
+ // following `frame$.subscribe(redraw)` would stay blank until the next pan/zoom.
1474
+ frame$: this.withCurrentRect(this.frame$, ready),
1475
+ settled$: this.withCurrentRect(this.viewportChange$, ready),
1476
+ };
1477
+ return this.plotModeViewport;
1478
+ }
1479
+ /** `source`, preceded by the current visible rect for each subscriber (when ready). */
1480
+ withCurrentRect(source, ready) {
1481
+ return defer(() => {
1482
+ const rect = ready() ? this.visibleImageRect() : null;
1483
+ return rect ? source.pipe(startWith(rect)) : source.asObservable();
1484
+ });
1485
+ }
1423
1486
  /** OSD targets the image display; the scalar/3D plot types belong to Plotly. */
1424
1487
  getPlotTypeDescriptors() {
1425
1488
  return [PLOT_TYPE_DESCRIPTORS[PlotType.HEATMAP]];
@@ -1473,7 +1536,7 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
1473
1536
  this.brushTool.setMode(true, (options ?? {}));
1474
1537
  }
1475
1538
  setBrushOptions(options) {
1476
- this.brushTool.setSize(options?.size ?? 0);
1539
+ this.brushTool.setOptions((options ?? {}));
1477
1540
  }
1478
1541
  setVertexEraserMode(active) {
1479
1542
  if (active) {
@@ -2036,4 +2099,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
2036
2099
  type: Inject,
2037
2100
  args: [VIZ_CONFIG]
2038
2101
  }] }] });
2039
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFL0QsT0FBTyxFQUFrQixnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFzQixNQUFNLDJCQUEyQixDQUFDO0FBRWhHLE9BQU8sRUFBc0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsc0JBQXNCLEVB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RCxDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OEdBdjFEVSw4QkFBOEIsNENBNEkvQixnQkFBZ0IsbUxBTUosY0FBYyw0TUFNMUIsVUFBVTtrSEF4SlQsOEJBQThCLGNBRGpCLE1BQU07OzJGQUNuQiw4QkFBOEI7a0JBRDFDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkE2STdCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFNdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjOzswQkFNakMsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBmaXJzdFZhbHVlRnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCAqIGFzIE9wZW5TZWFkcmFnb24gZnJvbSAnb3BlbnNlYWRyYWdvbic7XG5pbXBvcnQgeyBPU0QgfSBmcm9tICcuL29zZC1saWInO1xuaW1wb3J0IHsgT1NEX1pPT01fUEVSX1NDUk9MTCB9IGZyb20gJy4vb3NkLXpvb20nO1xuXG5cbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgVGlsZUFjY2Vzc1BvcnQsIFRJTEVfQUNDRVNTX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBWaXpDb25maWcsIFZJWl9DT05GSUcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90VHlwZSwgUExPVF9UWVBFX0RFU0NSSVBUT1JTLCBQbG90VHlwZURlc2NyaXB0b3IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IElWaXN1YWxpemVyLCBQaXhlbERhdGEsIEludGVuc2l0eVByb2ZpbGUsIElJc29zdXJmYWNlQ29udHJvbHMsIElJbnRlbnNpdHlDb250cm9scywgSVN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzLCBWaWV3ZXJGZWF0dXJlLCBjYXBhYmlsaXRpZXNPZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgT3NkUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vb3NkLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE9zZFNjYWxlQmFyIH0gZnJvbSAnLi9vc2Qtc2NhbGUtYmFyJztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5LCBSZWdpb25Ub29sTW9kZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi9vc2QtY29vcmRpbmF0ZS10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgZWxlbWVudFRvSW1hZ2UsIGltYWdlUmVjdFRvVmlld3BvcnQsIHZpZXdwb3J0UmVjdFRvSW1hZ2UgfSBmcm9tICcuL29zZC1jb29yZHMnO1xuaW1wb3J0IHsgYnVpbGRUaWxlVXJsLCBmZXRjaFRpbGVCaXRtYXAgfSBmcm9tICcuL3RpbGUtY2xpZW50JztcbmltcG9ydCB7IFNsaWNlQ2FjaGUgfSBmcm9tICcuL3NsaWNlLWNhY2hlJztcbmltcG9ydCB7IERpc3BsYXlQaXBlbGluZSB9IGZyb20gJy4vZGlzcGxheS1waXBlbGluZSc7XG5pbXBvcnQgeyBIaXN0b2dyYW1TYW1wbGVyIH0gZnJvbSAnLi9oaXN0b2dyYW0tc2FtcGxlcic7XG5pbXBvcnQgeyBCYXNlU3RvcmVWaXN1YWxpemVyIH0gZnJvbSAnLi4vYmFzZS1zdG9yZS12aXN1YWxpemVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIFdhbmRUb29sU2VydmljZSwgV2FuZFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IEJydXNoVG9vbFNlcnZpY2UsIEJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvYnJ1c2gvYnJ1c2gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsIFZlcnRleEVyYXNlclRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci92ZXJ0ZXgtZXJhc2VyL3ZlcnRleC1lcmFzZXItdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFpvb21Ub0JveFRvb2xTZXJ2aWNlLCBab29tVG9Cb3hUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IElDaGFubmVsU3RhdGUsIElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG4vKipcbiAqIFF1aWV0IE9wZW5TZWFkcmFnb24ncyBcIltWaWV3cG9ydC4qXSBpcyBub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZVwiIGFkdmlzb3JpZXMuXG4gKiBBIG11bHRpY2hhbm5lbCBpbWFnZSBpcyBjb21wb3NpdGVkIGZyb20gb25lIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwg4oCUIGEgbGVnaXRpbWF0ZVxuICogbXVsdGktaW1hZ2Ugd29ybGQg4oCUIGFuZCBPU0QgbG9ncyB0aGF0IGFkdmlzb3J5IChhdCBlcnJvciBsZXZlbCkgZnJvbSBpdHMgb3duXG4gKiBuYXZpZ2F0b3Ivb3ZlcnZpZXcgcmVuZGVyaW5nIG9uIGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSwgZmxvb2RpbmcgdGhlIGNvbnNvbGUuIE91clxuICogb3duIGltYWdlPC0+dmlld3BvcnQgY29udmVyc2lvbnMgYWxyZWFkeSByb3V0ZSB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAoc2VlXG4gKiBvc2QtY29vcmRzKSwgc28gdGhlIHJlbWFpbmluZyBhZHZpc29yaWVzIGFyZSBPU0QtaW50ZXJuYWwgYW5kIG9ubHkgYWZmZWN0IHRoZVxuICogbWluaW1hcCdzIGJveCBhY2N1cmFjeSAoY29zbWV0aWMpLiBUaGlzIHdyYXBzIE9TRCdzIGxvZ2dlciBpbiBhIFByb3h5IHRoYXQgZHJvcHNcbiAqIG9ubHkgdGhhdCBvbmUgbWVzc2FnZSBzdHJpbmcgYW5kIGZvcndhcmRzIGV2ZXJ5IG90aGVyIGxvZyB1bnRvdWNoZWQuIElkZW1wb3RlbnQuXG4gKi9cbmZ1bmN0aW9uIHNpbGVuY2VPc2RNdWx0aUltYWdlQWR2aXNvcnkoKTogdm9pZCB7XG4gIGNvbnN0IG9zZDogYW55ID0gT1NEIGFzIGFueTtcbiAgaWYgKG9zZC5fX211bHRpSW1hZ2VGaWx0ZXJJbnN0YWxsZWQpIHJldHVybjtcbiAgY29uc3QgYmFzZTogYW55ID0gKG9zZC5jb25zb2xlICYmIHR5cGVvZiBvc2QuY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICA/IG9zZC5jb25zb2xlXG4gICAgOiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnID8gY29uc29sZSA6IG51bGwpO1xuICBpZiAoIWJhc2UpIHJldHVybjtcbiAgY29uc3QgaXNBZHZpc29yeSA9IChhOiB1bmtub3duKSA9PlxuICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiBhLmluZGV4T2YoJ25vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlJykgIT09IC0xO1xuICBvc2QuY29uc29sZSA9IG5ldyBQcm94eShiYXNlLCB7XG4gICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSB0YXJnZXRbcHJvcF07XG4gICAgICBpZiAoKHByb3AgPT09ICdlcnJvcicgfHwgcHJvcCA9PT0gJ3dhcm4nKSAmJiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7IGlmIChpc0Fkdmlzb3J5KGFyZ3NbMF0pKSByZXR1cm47IG9yaWcuYXBwbHkodGFyZ2V0LCBhcmdzKTsgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJyA/IG9yaWcuYmluZCh0YXJnZXQpIDogb3JpZztcbiAgICB9LFxuICB9KTtcbiAgb3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCA9IHRydWU7XG59XG5cbi8qKiBPbmUgcHlyYW1pZCBsZXZlbCBmcm9tIGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7IHJlczogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgfVxuXG4vKiogVGlsZS1zb3VyY2UgZGVzY3JpcHRvciByZXR1cm5lZCBieSBgR0VUIC90aWxlcy9pbmZvYC4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIC8qKiBUcnVlIG9ubHkgZm9yIGdlbnVpbmUgbXVsdGktY2hhbm5lbCBjb21wb3NpdGVzIChpbmRleGVkL0xVVC1iZWFyaW5nXG4gICAqICBmbHVvcmVzY2VuY2Ugc3RhY2tzKSB0aGUgY2xpZW50IHNob3VsZCBzcGxpdCBpbnRvIHBlci1jaGFubmVsIGxheWVycy4gVGhlXG4gICAqICBzZXJ2ZXIgc2V0cyBpdDsgYW4gUkdCIHBob3RvIHJlYWQgYXMgc2VwYXJhdGVkIHBsYW5lcyBoYXMgY2hhbm5lbHM+MSBidXRcbiAgICogIG11bHRpY2hhbm5lbD1mYWxzZSwgc28gaXQgc3RheXMgYSBzaW5nbGUgY29tcG9zaXRlIHRpbGUgc291cmNlLiAqL1xuICBtdWx0aWNoYW5uZWw/OiBib29sZWFuO1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHRoZSByZW1haW5pbmdcbiAgICogIGxldmVscyBhcmUgc3ludGhldGljIGNvbXBvc2l0ZWQgb3ZlcnZpZXdzIChubyBwZXItY2hhbm5lbCB0aWxlcykuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSAobmFtZS9jb2xvci9iaXREZXB0aC9taW4tbWF4QWxsb3dlZCkgZm9yIG5hdGl2ZSAxNi1iaXRcbiAgICogIHdpbmRvd2luZyArIGhpc3RvZ3JhbTsgbnVsbCBmb3IgcGxhaW4gOC1iaXQvUkdCIHNvdXJjZXMuICovXG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7IGNvbG9yPzogc3RyaW5nOyBiaXREZXB0aD86IG51bWJlcjsgbWluQWxsb3dlZD86IG51bWJlcjsgbWF4QWxsb3dlZD86IG51bWJlcjtcbiAgfT4gfCBudWxsO1xuICBsZXZlbHM6IFRpbGVMZXZlbFtdO1xuICAvKiogUGh5c2ljYWwgcGl4ZWwgc2l6ZSBpbiDCtW0gKDAgd2hlbiB0aGUgZm9ybWF0IGRvZXNuJ3QgcmVwb3J0IGl0KS4gKi9cbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQgYGxvYWQoKWAgaGFuZHMgdG8gYHBsb3QoKWAuICovXG5pbnRlcmZhY2UgT3NkTG9hZGVkIHtcbiAgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsO1xuICBpbmZvQjY0OiBzdHJpbmc7XG4gIHo6IG51bWJlcjtcbiAgLyoqIE1pcnJvcnMgdGhlIGxvYWRlZCBpbWFnZSdzIGZpbGVuYW1lIOKAlCB0aGUgZGlhZ3JhbSdzIHJlbmRlciBwaXBlbGluZVxuICAgKiAgZ3VhcmRzIG9uIGBsb2FkZWQuZmlsZW5hbWUgPT09IHBoYXNlSW5mby5maWxlTmFtZWAgYmVmb3JlIGNhbGxpbmcgcGxvdCgpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogU2ltcGxlIChub24tdGlsZWQpIGltYWdlOiBgcGxvdCgpYCBvcGVucyB7QGxpbmsgdXJsfSBkaXJlY3RseSB2aWEgT1NEJ3NcbiAgICogIHNpbmdsZS1pbWFnZSBzb3VyY2Ug4oCUIG5vIHRpbGUgcHlyYW1pZCwgbm8gc2VydmVyLiBTZXQgd2hlbiB0aGUgaW1hZ2VcbiAgICogIGNhcnJpZXMgYHRpbGVkID09PSBmYWxzZWAgKHNlZSB7QGxpbmsgSUltYWdlSW5mby50aWxlZH0pLiAqL1xuICBzaW1wbGU/OiBib29sZWFuO1xuICAvKiogVGhlIGRpcmVjdGx5LWxvYWRhYmxlIGltYWdlIFVSTCAoYGJsb2I6YC9gZGF0YTpgL2BodHRwYCkgZm9yIHNpbXBsZSBtb2RlLiAqL1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3BlblNlYWRyYWdvbiB2aXN1YWxpemF0aW9uIGJhY2tlbmQuXG4gKlxuICogUmVuZGVycyB0aGUgKmltYWdlKiBwbG90IHR5cGUgYXMgYSBuYXRpdmVseS10aWxlZCwgem9vbWFibGUgcmFzdGVyLCBiYWNrZWQgYnlcbiAqIHRoZSBqaXQtc2VydmljZSB0aWxlIGVuZHBvaW50cyAoYEdFVCAvdGlsZXMvaW5mb2AgKyBgR0VUIC90aWxlYCwgd2hpY2ggcmV1c2VcbiAqIHRoZSBCaW8tRm9ybWF0cyBST0kgcmVuZGVyZXIpLiBQbG90bHkga2VlcHMgdGhlIHNjaWVudGlmaWMvZGF0YSBwbG90IHR5cGVzXG4gKiAoc2NhbGFyIGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkg4oCUXG4gKiBoZW5jZSB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBvbmx5IGBJbWFnZURpc3BsYXlgLlxuICpcbiAqIFdpcmVkOiBsb2FkIOKGkiBkZXNjcmlwdG9yLCBwbG90IOKGkiBtb3VudCB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSxcbiAqIHpvb20vcGFuIOKGkiB2aWV3cG9ydCBBUEkuIE5PVCB3aXJlZCB5ZXQgKGZvbGxvdy11cHMpOiByZWdpb24gb3ZlcmxheXMgKyB0b29sc1xuICogKGEgcG9zaXRpb25lZCBjYW52YXMvU1ZHIG92ZXJsYXkgb3IgQW5ub3RvcmlvdXMpLCBwaXhlbCByZWFkYmFjaywgYW5kIHRoZVxuICogcGVyLXRpbGUgTFVUL2NvbnRyYXN0IHBhcmFtcy4gTm90IHJlZ2lzdGVyZWQgaW4gREkgcHJvdmlkZXJzIOKAlCBgUGxvdGx5U2VydmljZWBcbiAqIGlzIHN0aWxsIHRoZSBvbmx5IGFjdGl2ZSBiYWNrZW5kOyB0aGlzIHByb3ZlcyB0aGUgY29udHJhY3Qgc3VwcG9ydHMgYSBzZWNvbmRcbiAqIGltcGxlbWVudGF0aW9uIGFnYWluc3QgcmVhbCBlbmRwb2ludHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JlVmlzdWFsaXplciBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcbiAgLyoqIE9TRCdzIHN0cmVuZ3RoIGlzIGRpc3BsYXlpbmcgYSBsYXJnZSB6b29tYWJsZSBpbWFnZSDigJQgbm90aGluZyBlbHNlIGhlcmUuICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1ZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5XSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcbiAgcHJpdmF0ZSB2aWV3ZXI6IE9wZW5TZWFkcmFnb24uVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb3ZlcmxheTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsZUJhcjogT3NkU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICAvKiogQmFzZTY0IFJhd0ZpbGVJbmZvICsgY3VycmVudCB6LXNsaWNlLCBrZXB0IHNvIHNldFpJbmRleCBjYW4gcmVidWlsZCB0aGVcbiAgICogIHRpbGUgc291cmNlIGFuZCBzd2FwIHNsaWNlcyBsaXZlIChzdGFjayBuYXZpZ2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbmZvQjY0ID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFogPSAwO1xuICAvKiogVHJ1ZSB3aGlsZSB0aGUgY3VycmVudCBpbWFnZSBpcyBcInNpbXBsZVwiICh0aWxlZDpmYWxzZSDigJQgc2VsZi1jb250YWluZWRcbiAgICogIHBlci1zbGljZSBVUkxzLCBubyB0aWxlIHNlcnZlcjsgZS5nLiBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWRcbiAgICogIGNsaWVudC1zaWRlIGludG8gYSBzdGFjaykuIHNldFpJbmRleCBzd2FwcyB0aGUgc2luZ2xlLWltYWdlIHNvdXJjZSBmb3JcbiAgICogIHRoZSBuZXcgc2xpY2UncyBVUkwgaW5zdGVhZCBvZiB1cGRhdGluZyBhIHRpbGVkIHotcGFyYW0uICovXG4gIHByaXZhdGUgc2ltcGxlTW9kZSA9IGZhbHNlO1xuICAvKiogdXJsc1tdIGZvciB0aGUgY3VycmVudCBzaW1wbGUtbW9kZSBpbWFnZSwgc28gc2V0WkluZGV4IGNhbiBsb29rIHVwIHRoZVxuICAgKiAgc2xpY2UgYmVpbmcgc2NydWJiZWQgdG8gKHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLnVybEZvcn0pLlxuICAgKiAgVW51c2VkIChhbmQgbGVmdCBzdGFsZSwgaGFybWxlc3NseSkgaW4gdGlsZWQgbW9kZS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVVcmxzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogcHJldmlldyBibG9iIFVSTCDihpIgZnVsbC1yZXMgdXBzY2FsZWQgYmxvYiBVUkwgKHNlZSB0b0Z1bGxSZXNVcmwpLCBzb1xuICAgKiAgcmUtdmlzaXRpbmcgYSBzaW1wbGUtbW9kZSBzbGljZSBkb2Vzbid0IHJlLXVwc2NhbGUuIFJldm9rZWQgb24gZmlsZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlRnVsbFJlc1VybHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogU0VSVkVSTEVTUyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbENvdW50PjEpOiB0aGUgc3RhY2snc1xuICAgKiAgcGVyLXNsaWNlIHBlci1jaGFubmVsIHBsYW5lIFVSTHMsIHRoZSBjdXJyZW50IHNsaWNlJ3MgZGVjb2RlZCBwbGFuZXMsIGFuZFxuICAgKiAgdGhlIGxhc3QgY29tcG9zaXRlIGJsb2IgVVJMLiBDb21wb3NpdGVkIGNsaWVudC1zaWRlIHZpYSBkaXNwbGF5LmNoYW5uZWxSZ2JMdXRcbiAgICogIChubyB0aWxlIHNlcnZlcik7IGtlcHQgT0ZGIHRoZSB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoLiAqL1xuICBwcml2YXRlIHNpbXBsZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICBwcml2YXRlIHNpbXBsZUNoYW5uZWxVcmxzOiBzdHJpbmdbXVtdID0gW107XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDb21wb3NpdGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2tpcCB0aGUgZnVsbC1yZXMgdXBzY2FsZSBhYm92ZSB0aGlzIGxvbmdlc3Qtc2lkZSBkaW1lbnNpb24g4oCUIGEgZm9sZGVyXG4gICAqICBzdGFjayBpcyBwZXItZmlsZSBwcmV2aWV3cyAod2VsbCB1bmRlciB0aGlzKTsgdGhpcyBvbmx5IGd1YXJkcyBhZ2FpbnN0IGFuXG4gICAqICBhY2NpZGVudGFsIGVub3Jtb3VzIGNhbnZhcyBhbGxvY2F0aW9uLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IFNJTVBMRV9VUFNDQUxFX01BWF9ESU0gPSA4MTkyO1xuICBwcml2YXRlIGNvb3JkVHJhbnNmb3JtOiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdhbmRIb3N0ITogV2FuZFRvb2xIb3N0O1xuICBwcml2YXRlIGVyYXNlckhvc3QhOiBWZXJ0ZXhFcmFzZXJUb29sSG9zdDtcbiAgLyoqIFdhbmQgc2FtcGxpbmcgbWF0cml4IHJlYWQgYmFjayBmcm9tIHRoZSByZW5kZXJlZCB2aWV3cG9ydDsgY2FjaGVkIHVudGlsXG4gICAqICB0aGUgdmlld3BvcnQgY2hhbmdlcyAoc2VlIHJlYWRiYWNrVmlld3BvcnQpLiAqL1xuICBwcml2YXRlIHZpZXdwb3J0UGl4ZWxzOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBET00gaWQgb2YgdGhlIGVsZW1lbnQgT1NEIGlzIG1vdW50ZWQgaW4gKHNoYXJlZCB3aXRoIFBsb3RseSk7IHRoZVxuICAgKiAgb24tY2FudmFzIHRvb2xzIGF0dGFjaCB0aGVpciBvdmVybGF5cyBoZXJlLiAqL1xuICBwcml2YXRlIHBsb3REaXYgPSAnJztcbiAgLyoqIEN1cnJlbnQgZmlsZSBuYW1lLCB0YWdnZWQgb250byB3YW5kLWNyZWF0ZWQgc2hhcGVzLiAqL1xuICBwcml2YXRlIGN1cnJlbnRGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogMjU2LWVudHJ5IFJHQiBMVVQgZm9yIHRoZSBhY3RpdmUgY29sb3JtYXAsIGFwcGxpZWQgdG8gZ3JheXNjYWxlIHRpbGVzIHZpYVxuICAgKiAgdGhlIHRpbGUtaW52YWxpZGF0ZWQgcGl4ZWwgcGlwZWxpbmUgKG1pcnJvcnMgUGxvdGx5J3MgaGVhdG1hcCBjb2xvcnNjYWxlKS5cbiAgICogIE51bGwgd2hpbGUgb3B0aW9ucyByZXNvbHZlOyByZWNvbG9yaW5nIGlzIHNraXBwZWQgdW50aWwgaXQncyBidWlsdC4gKi9cbiAgcHJpdmF0ZSBjb2xvckx1dDogUmdiW10gfCBudWxsID0gbnVsbDtcbiAgLyoqIE9ubHkgZ3JheXNjYWxlIGltYWdlcyBnZXQgYSBjb2xvcm1hcCAoUkdCIHRpbGVzIHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQpLiAqL1xuICBwcml2YXRlIGlzR3JheXNjYWxlSW1hZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb2xvcm1hcFN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgYnkgZXZlcnkgZGlzcGxheSBpbnZhbGlkYXRpb24uIEEgcmVjb2xvciByb3VuZCBjYXB0dXJlcyBpdCBhbmQsIGFmdGVyXG4gICAqICBlYWNoIGBhd2FpdGAsIGFiYW5kb25zIHRoZSB0aWxlIG9uY2UgYSBuZXdlciByb3VuZCBoYXMgc3RhcnRlZC4gV3JpdGluZyBhXG4gICAqICBzdXBlcnNlZGVkIGNvbnRleHQgYmFjayBpcyBub3QgbWVyZWx5IHdhc3RlZCB3b3JrOiBPU0QncyBjb252ZXJzaW9uIHNlZXMgYVxuICAgKiAgY2FudmFzIHRoZSBuZXdlciByb3VuZCBhbHJlYWR5IHJlcGxhY2VkLCB0aHJvd3MgYERPTUV4Y2VwdGlvbmAsIGFuZFxuICAgKiAgYF9oYW5kbGVDb252ZXJzaW9uRXJyb3JgIERFU1RST1lTIHRoZSBjYWNoZSByZWNvcmQgYW5kIHVubG9hZHMgdGhlIHRpbGVcbiAgICogICh1bmxpa2UgdGhlIGRyYXdlcidzIHJhc3RlckJsb2IgcGF0aCwgaXQgZG9lcyBub3QgcmUtcHJlcGFyZSkuIEVub3VnaCBvZlxuICAgKiAgdGhvc2UgYW5kIHRoZSB2aWV3ZXIgZ29lcyB3aGl0ZSBtaWQtZHJhZy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5VG9rZW4gPSAwO1xuICAvKiogUGVuZGluZyBjb2FsZXNjZWQgaW52YWxpZGF0aW9uIChzZWUge0BsaW5rIHNjaGVkdWxlSW52YWxpZGF0ZX0pLiAqL1xuICBwcml2YXRlIGludmFsaWRhdGVIYW5kbGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogTGF0ZXN0IHBlci1jaGFubmVsIGRpc3BsYXkgc3RhdGUgKHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5KSBmcm9tIHRoZSBzdG9yZSxcbiAgICogIHJlYWQgc3luY2hyb25vdXNseSBieSByZWNvbG9yVGlsZS4gQ2hhbm5lbCAwIGRyaXZlcyBncmF5c2NhbGUgd2luZG93aW5nO1xuICAgKiAgUi9HL0IgKGluZGljZXMgMC0yKSBkcml2ZSBSR0IgcGVyLWNoYW5uZWwgd2luZG93aW5nLiAqL1xuICBwcml2YXRlIGNoYW5uZWxTdGF0ZXM6IElDaGFubmVsU3RhdGVbXSA9IFtdO1xuICAvKiogVHJ1ZSBmb3IgbXVsdGljaGFubmVsIGZsdW9yZXNjZW5jZSAoY2hhbm5lbENvdW50ID4gMSwgbm90IFJHQik6IHRpbGVzIGFyZVxuICAgKiAgY29tcG9zaXRlZCBjbGllbnQtc2lkZSBmcm9tIHBlci1jaGFubmVsIHNpbmdsZS1iYW5kIGZldGNoZXMgKHNlZVxuICAgKiAgcmVjb2xvck11bHRpQ2hhbm5lbFRpbGUpIHJhdGhlciB0aGFuIHJlY29sb3JlZCBpbiBwbGFjZS4gKi9cbiAgcHJpdmF0ZSBpc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAvKiogQ291bnQgb2YgcmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyAocGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seVxuICAgKiAgaGVyZSkuIEZvciBtdWx0aWNoYW5uZWwgaW1hZ2VzIHRoZSB0aWxlIHNvdXJjZSBpcyBidWlsdCBmcm9tIHRoZXNlIGFsb25lIHNvXG4gICAqICBldmVyeSBkaXNwbGF5ZWQgdGlsZSBzdXBwb3J0cyBhIHBlci1jaGFubmVsIGZldGNoLiAqL1xuICBwcml2YXRlIHJlYWxMZXZlbHMgPSAwO1xuICAvKiogSW52ZXJ0ZWQgYmFja2dyb3VuZCAod2hpdGUgPSB6ZXJvKTogaW52ZXJ0cyB0aGUgZGlzcGxheSB2YWx1ZSBiZWZvcmUgdGhlXG4gICAqICBMVVQgKGdyYXlzY2FsZSkgLyBwZXIgY2hhbm5lbCAoUkdCKS4gKi9cbiAgcHJpdmF0ZSBpbnZlcnRCZyA9IGZhbHNlO1xuICAvKiogQmVhcmVyIHRva2VuIGZvciBPU0QncyBvd24gdGlsZSBmZXRjaGVzIChIdHRwQ2xpZW50IGNhbGxzIGdldCBpdCB2aWEgdGhlXG4gICAqICBpbnRlcmNlcHRvcjsgT1NEJ3MgbG9hZGVyIGRvZXMgbm90LCBzbyB3ZSBwYXNzIGl0IGFzIGFuIGFqYXggaGVhZGVyKS4gKi9cbiAgcHJpdmF0ZSBhdXRoSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvKiogV2hldGhlciB0aGUgb3ZlcnZpZXcgbmF2aWdhdG9yIChtaW5pbWFwKSBpcyBzaG93bi4gUmVhZCBhdCB2aWV3ZXIgY3JlYXRpb247XG4gICAqICBhIGNvbnN1bWVyIHRoYXQgZG9lc24ndCB3YW50IGl0IChlLmcuIGEgc21hbGwgZW1iZWRkZWQgcHJldmlldykgc2V0cyBpdCBvZmZcbiAgICogIHZpYSB7QGxpbmsgc2V0TmF2aWdhdG9yVmlzaWJsZX0gYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yVmlzaWJsZSA9IHRydWU7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKS4gYGZhbHNlYCDihpIgbmVhcmVzdC1uZWlnaGJvdXIsIHNvIHpvb21lZC1pbiBwaXhlbHNcbiAgICogIHJlbmRlciBhcyBjcmlzcCBibG9ja3MgKHBpeGVsIGluc3BlY3Rpb24pLiBEZWZhdWx0cyB0byBgZmFsc2VgIHNvIHRoZSBpbWFnZVxuICAgKiAgb3BlbnMgc2hvd2luZyByYXcgcGl4ZWxzLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjsgdG9nZ2xlZCB2aWFcbiAgICogIHtAbGluayBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWR9LiAqL1xuICBwcml2YXRlIHNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuICAvKiogT3ZlcmFsbCBkZWFkbGluZSBmb3IgdGhlIC90aWxlcy9pbmZvIHBvbGwgbG9vcC4gQW4gdW5jYWNoZWQgd2hvbGUtc2xpZGVcbiAgICogIGltYWdlIChlLmcuIC5uZHBpKSBpcyBjYWNoZWQgc2VydmVyLXNpZGUgZmlyc3QgKEdDUy0+UFZDKSwgd2hpY2ggY2FuIHRha2VcbiAgICogIHNldmVyYWwgbWludXRlcyDigJQgd2UgcG9sbCAoc2hvcnQgcmVxdWVzdHM7IHRoZSBjYWNoZS1wcm9ncmVzcyBvdmVybGF5XG4gICAqICBzaG93cyB0aGUgd2FpdCkgdW50aWwgaXQncyByZWFkeS4gR2VuZXJvdXMgYmVjYXVzZSBlYWNoIHBvbGwgaXMgY2hlYXA7IG9uXG4gICAqICBleHBpcnkgdGhlIHJlbmRlciBwaXBlbGluZSBnaXZlcyB1cCBhbmQgdGhlIHJvdXRlciBmYWxscyBiYWNrIHRvIFBsb3RseS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0aWxlc0luZm9UaW1lb3V0TXMgPSA2MDAwMDA7IC8vIDEwIG1pblxuXG4gIC8qKiBQZXItY2hhbm5lbCBmaXQtdmlldyB0aWxlIGJ1ZGdldCAodGlsZXMgYXQgdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgw5cgY2hhbm5lbHMpLlxuICAgKiAgQWJvdmUgaXQsIGEgbXVsdGljaGFubmVsIGltYWdlIHJlbmRlcnMgc2VydmVyLWNvbXBvc2l0ZWQgaW5zdGVhZCBvZiBwZXItY2hhbm5lbFxuICAgKiAg4oCUIGl0cyBmdWxsLXJlcyByZWFkcyAoaXQgaGFzIG5vIG92ZXJ2aWV3IHB5cmFtaWQpIHdvdWxkIGJlIHRvbyBtYW55IMOXIE4gY2hhbm5lbHMuXG4gICAqICA2NCAoZS5nLiBhIDR4NCBzaW5nbGUtRk9WIHotc3RhY2sgw5cgNGNoKSBzdGF5cyBwZXItY2hhbm5lbDsgYSB3aG9sZS1zbGlkZVxuICAgKiAgKGh1bmRyZWRz4oCTdGhvdXNhbmRzKSBmYWxscyBiYWNrLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTID0gMjU2O1xuXG4gIC8qKiBQaXhlbCBkaXNwbGF5IHBpcGVsaW5lICh3aW5kb3cvZ2FtbWEvaW52ZXJ0L2NvbG9ybWFwICsgYWRkaXRpdmUgdGludCkg4oCUXG4gICAqICBzaGFyZWQgYnkgdGlsZSByZWNvbG9yaW5nIGFuZCB0aGUgY29tcG9zaXRlIGV4cG9ydCBzbyB0aGV5IHN0YXkgaWRlbnRpY2FsXG4gICAqICAoc2VlIERpc3BsYXlQaXBlbGluZSkuIEhvc3QgY2xvc3VyZXMgcmVhZCB0aGUgc2VydmljZSdzIGxpdmUgZmllbGRzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXkgPSBuZXcgRGlzcGxheVBpcGVsaW5lKHtcbiAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgIGNvbG9yTHV0OiAoKSA9PiB0aGlzLmNvbG9yTHV0LFxuICAgIGNoYW5uZWxTdGF0ZXM6ICgpID0+IHRoaXMuY2hhbm5lbFN0YXRlcyxcbiAgICBpbnZlcnRCZzogKCkgPT4gdGhpcy5pbnZlcnRCZyxcbiAgfSk7XG5cbiAgLyoqIEhpc3RvZ3JhbSArIGF1dG8td2luZG93IHNhbXBsaW5nIChzZWUgSGlzdG9ncmFtU2FtcGxlcikuIENvbnN0cnVjdGVkIGluXG4gICAqICB0aGUgY3RvciBib2R5IGJlY2F1c2UgaXQgY2FwdHVyZXMgdGhlIHJlc29sdmVkIEFQSSBiYXNlIFVSTC4gKi9cbiAgcHJpdmF0ZSBzYW1wbGVyITogSGlzdG9ncmFtU2FtcGxlcjtcblxuICAvKiogU3RhY2stc2xpY2UgY2FjaGUgKyBiYWNrZ3JvdW5kIHByZWxvYWRlciAoc2VlIFNsaWNlQ2FjaGUg4oCUIHJlZmFjdG9yaW5nXG4gICAqICBwbGFuIFN0ZXAgMykuIFRoZSBob3N0IGFjY2Vzc29ycyBhcmUgbGl2ZSBjbG9zdXJlcywgc28gdGhlIGNhY2hlIGFsd2F5c1xuICAgKiAgcmVhZHMgdGhlIHNlcnZpY2UncyBjdXJyZW50IHZpZXdlci9kZXNjcmlwdG9yL3og4oCUIGV4YWN0bHkgdGhlIGZpZWxkcyB0aGVcbiAgICogIG1vdmVkIGNvZGUgdXNlZCB0byByZWFkIGRpcmVjdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFNsaWNlQ2FjaGUoe1xuICAgIHZpZXdlcjogKCkgPT4gdGhpcy52aWV3ZXIsXG4gICAgaGFzSW1hZ2U6ICgpID0+ICEhKHRoaXMudmlld2VyICYmIHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmluZm9CNjQpLFxuICAgIHNsaWNlQ291bnQ6ICgpID0+IHRoaXMuZGVzY3JpcHRvcj8ueiA/PyAxLFxuICAgIGN1cnJlbnRaOiAoKSA9PiB0aGlzLmN1cnJlbnRaLFxuICAgIGlzTXVsdGlDaGFubmVsOiAoKSA9PiB0aGlzLmlzTXVsdGlDaGFubmVsLFxuICAgIGNoYW5uZWxDb3VudDogKCkgPT4gTWF0aC5tYXgoMSwgdGhpcy5jaGFubmVsU3RhdGVzLmxlbmd0aCB8fCAodGhpcy5kZXNjcmlwdG9yPy5jaGFubmVscyA/PyAxKSksXG4gICAgY2hhbm5lbFZpc2libGU6IChjOiBudW1iZXIpID0+IHRoaXMuY2hhbm5lbFN0YXRlc1tjXT8udmlzaWJsZSAhPT0gZmFsc2UsXG4gICAgYnVpbGRUaWxlU291cmNlOiAoejogbnVtYmVyLCBjaGFubmVsPzogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5idWlsZFRpbGVTb3VyY2UodGhpcy5kZXNjcmlwdG9yISwgdGhpcy5pbmZvQjY0LCB6LCBjaGFubmVsKSxcbiAgICBvbkNvbXBvc2l0ZVNsaWNlQWRkZWQ6ICh6OiBudW1iZXIpID0+IHRoaXMuc2FtcGxlci5jb21wdXRlSW1hZ2VXaW5kb3codGhpcy5kZXNjcmlwdG9yISwgdGhpcy5pbmZvQjY0LCB6KSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgcHJpdmF0ZSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FtVG9vbDogU2FtVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZWxsU2VnbWVudFRvb2w6IENlbGxTZWdtZW50VG9vbFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChDRUxMX1NFR01FTlRFUikgcHJpdmF0ZSBjZWxsU2VnbWVudGVyOiBJQ2VsbFNlZ21lbnRlciB8IG51bGwsXG4gICAgcHJpdmF0ZSBlcmFzZXJUb29sOiBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHpvb21Ub0JveFRvb2w6IFpvb21Ub0JveFRvb2xTZXJ2aWNlLFxuICAgIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgICB0aGlzLnNhbXBsZXIgPSBuZXcgSGlzdG9ncmFtU2FtcGxlcih0aGlzLmh0dHAsIHRoaXMuYXBpLCB7XG4gICAgICByZWFsTGV2ZWxzOiAoKSA9PiB0aGlzLnJlYWxMZXZlbHMsXG4gICAgICBjaGFubmVsQ291bnQ6IChkKSA9PiB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8IChkLmNoYW5uZWxzID8/IDEpLFxuICAgICAgaXNHcmF5c2NhbGU6ICgpID0+IHRoaXMuaXNHcmF5c2NhbGVJbWFnZSxcbiAgICAgIC8vIE51ZGdlIHRoZSBjaGFubmVsLXN0YXRlcyBzdHJlYW0gc28gdGhlIHBhbmUgcmUtcmVhZHMgZ2V0SGlzdG9ncmFtIG5vdyxcbiAgICAgIC8vIGluIGNhc2UgaXRzIGJvdW5kZWQgcmV0cnkgd2luZG93IGFscmVhZHkgbGFwc2VkLlxuICAgICAgb25DaGFubmVsSGlzdG9ncmFtc1NhbXBsZWQ6ICgpID0+IHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlcyh0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCkpLFxuICAgICAgb25HcmF5V2luZG93U2FtcGxlZDogKG1pbiwgbWF4KSA9PiB0aGlzLnNlZWRHcmF5V2luZG93KG1pbiwgbWF4KSxcbiAgICB9KTtcbiAgICB0aGlzLmVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAvKiogVmlzaWJsZSBpbWFnZSByZWdpb24gKGZ1bGwtaW1hZ2UgcGl4ZWwgY29vcmRzKSBlbWl0dGVkIHdoZW4gdGhlIHZpZXdcbiAgICogIHNldHRsZXMsIHNvIHRoZSBpbnRlbnNpdHkgaW5zZXQgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdwb3J0Q2hhbmdlJCA9IG5ldyBTdWJqZWN0PHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+KCk7XG4gIC8vIFJlZ2lvbiBzdGF0ZSAocmVnaW9ucywgc2VsZWN0aW9uLCB0aGUgdXBkYXRlIGV2ZW50KSBsaXZlcyBpbiB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlOyB0aGUgSVJlZ2lvblN0b3JlIG1ldGhvZHMgYmVsb3cgZGVsZWdhdGUgdG8gaXQuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZW5zaXR5UHJvZmlsZSQgPSBuZXcgU3ViamVjdDxJbnRlbnNpdHlQcm9maWxlW10+KCk7XG4gIC8vIEltYWdlIG1ldGFkYXRhIGFuZCBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUuXG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSBjb2xvcm1hcC9yZXZlcnNlIHNvIE9TRCByZWNvbG9ycyBpblxuICAgKiBsb2NrLXN0ZXAgd2l0aCBQbG90bHkuIElkZW1wb3RlbnQgYW5kIHNlbGYtaGVhbGluZzogdGhpcyBzZXJ2aWNlIGlzIGEgcm9vdFxuICAgKiBzaW5nbGV0b24sIGJ1dCBgdW5zdWJzY3JpYmUoKWAgKGNhbGxlZCBvbiBWaXN1YWxpemVyQ29tcG9uZW50IGRlc3Ryb3kpXG4gICAqIHRlYXJzIHRoZSBzdWJzY3JpcHRpb24gZG93biDigJQgYW5kIHRoZSBjb25zdHJ1Y3RvciBuZXZlciBydW5zIGFnYWluLiBTb1xuICAgKiBgcGxvdCgpYCBjYWxscyB0aGlzIHRvIHJlLWVzdGFibGlzaCBpdCBhZnRlciBhIGNvbXBvbmVudCB0ZWFyZG93bi9yZWNyZWF0ZVxuICAgKiAoZS5nLiBzd2l0Y2hpbmcgaW1hZ2VzKSwgb3RoZXJ3aXNlIGNvbG9ybWFwIGNoYW5nZXMgd291bGQgYmUgc2lsZW50bHlcbiAgICogZHJvcHBlZCBvbiBldmVyeSBpbWFnZSBhZnRlciB0aGUgZmlyc3Qgc3dpdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVDb2xvcm1hcFN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb2xvcm1hcFN1YikgcmV0dXJuO1xuICAgIC8vIENvbG9ybWFwL3JldmVyc2UgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSDigJQgdGhlIHNpbmdsZSBzb3VyY2VcbiAgICAvLyBvZiB0cnV0aCBmb3IgYm90aCBiYWNrZW5kcy4gUmVidWlsZCB0aGUgTFVUIGFuZCByZS1ydW4gdGhlIHBpeGVsIHBpcGVsaW5lXG4gICAgLy8gd2hlbmV2ZXIgZWl0aGVyIGNoYW5nZXMsIHNvIE9TRCByZWNvbG9ycyBpbiBsb2NrLXN0ZXAgd2l0aCBQbG90bHkuXG4gICAgLy8gQ29sb3JtYXAvcmV2ZXJzZSArIHBlci1jaGFubmVsIHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5ICsgaW52ZXJ0IGFsbCBsaXZlIGluXG4gICAgLy8gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUuIFJlYnVpbGQgdGhlIExVVCBhbmQgcmUtcnVuIHRoZSBwaXhlbCBwaXBlbGluZVxuICAgIC8vIHdoZW5ldmVyIGFueSBvZiB0aGVtIGNoYW5nZXMsIHNvIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lIHVwZGF0ZXMgdGhlXG4gICAgLy8gaW1hZ2UgbGl2ZSBhbmQgT1NEIHN0YXlzIGluIGxvY2stc3RlcCB3aXRoIFBsb3RseS5cbiAgICB0aGlzLmNvbG9ybWFwU3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NtLCByZXYsIGNoYW5uZWxzLCBpbnZlcnRdKSA9PiB7XG4gICAgICB0aGlzLmNvbG9yTHV0ID0gYnVpbGRDb2xvcm1hcEx1dChjbT8uZGF0YT8udmFsdWUsICEhcmV2KTtcbiAgICAgIHRoaXMuY2hhbm5lbFN0YXRlcyA9IGNoYW5uZWxzO1xuICAgICAgdGhpcy5pbnZlcnRCZyA9ICEhaW52ZXJ0O1xuICAgICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWw6IHJlLWNvbXBvc2l0ZSB0aGUgY3VycmVudCBzbGljZSBmcm9tIGl0cyBjYWNoZWRcbiAgICAgIC8vIHBsYW5lcyB3aXRoIHRoZSBuZXcgY2hhbm5lbCBzdGF0ZXMgKyByZS1vcGVuIChubyB0aWxlLWludmFsaWRhdGUgcGF0aCkuXG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHsgdm9pZCB0aGlzLnJlY29tcG9zaXRlQW5kT3BlbigpOyByZXR1cm47IH1cbiAgICAgIC8vIE11bHRpY2hhbm5lbDogZWFjaCBjaGFubmVsIGlzIGl0cyBvd24gVGlsZWRJbWFnZSDigJQgdmlzaWJpbGl0eSBpcyB0aGVcbiAgICAgIC8vIGltYWdlJ3Mgb3BhY2l0eSAod2luZG93L2dhbW1hL2NvbG91ciBhcmUgYXBwbGllZCBieSByZWNvbG9yQ2hhbm5lbFRpbGVcbiAgICAgIC8vIG9uIHRoZSBpbnZhbGlkYXRlIGJlbG93KS4gUmUtYXBwbHlpbmcgdGhlIGN1cnJlbnQgc2xpY2UncyByZXZlYWwgcGlja3MgdXBcbiAgICAgIC8vIHRoZSBuZXcgcGVyLWNoYW5uZWwgdmlzaWJpbGl0eSAoY2FjaGVkIHNsaWNlcyBzdGF5IGhpZGRlbikuXG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICB0aGlzLmNhY2hlLnJldmVhbENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgIH1cbiAgICAgIC8vIHJlcXVlc3RJbnZhbGlkYXRlKHRydWUpIHJlc3RvcmVzIGVhY2ggdGlsZSB0byBpdHMgb3JpZ2luYWwgZGF0YSBiZWZvcmVcbiAgICAgIC8vIHJlLXJ1bm5pbmcgcmVjb2xvclRpbGUsIHNvIGEgY2hhbmdlIGFsd2F5cyBtYXBzIGFmcmVzaCAobm8gY29tcG91bmRpbmcpLlxuICAgICAgLy8gUkdCIG5vdyByZWNvbG9ycyB0b28gKHBlci1jaGFubmVsIHdpbmRvdy92aXNpYmlsaXR5KSwgc28gZG9uJ3QgZ2F0ZSBvblxuICAgICAgLy8gZ3JheXNjYWxlLiBDb2FsZXNjZWQ6IFByaW1lTkcncyBzbGlkZXIgZmlyZXMgKG9uQ2hhbmdlKSBjb250aW51b3VzbHksIHNvXG4gICAgICAvLyBhIHNpbmdsZSBkcmFnIHdvdWxkIG90aGVyd2lzZSBxdWV1ZSBkb3plbnMgb2Ygb3ZlcmxhcHBpbmcgcmVzdG9yZSArXG4gICAgICAvLyByZS1wcm9jZXNzIHJvdW5kcyBvdmVyIGV2ZXJ5IGNoYW5uZWwgaW1hZ2UuXG4gICAgICB0aGlzLnNjaGVkdWxlSW52YWxpZGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlZWQgdGhlIEludGVuc2l0eSBjaGFubmVsIHdpdGggYSBtZWFzdXJlZCBhdXRvLXdpbmRvdyB3aGlsZSBpdCdzIHN0aWxsXG4gICAqICBhdCBmdWxsIHJhbmdlIChuZXZlciBjbG9iYmVyIHRoZSB1c2VyJ3MgbWFudWFsIHdpbmRvdyk7IGlmIHRoZSB1c2VyXG4gICAqICBhbHJlYWR5IHdpbmRvd2VkLCBqdXN0IHJlLWludmFsaWRhdGUgc28gcGFpbnRlZCB0aWxlcyBwaWNrIHRoZSBMVVQgdXAuICovXG4gIHByaXZhdGUgc2VlZEdyYXlXaW5kb3cobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY2gwID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIGlmIChjaDAgJiYgY2gwLm1pbiA9PT0gMCAmJiBjaDAubWF4ID09PSAyNTUpIHtcbiAgICAgIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKDAsIHsgbWluLCBtYXggfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmNvbG9yTHV0KSB7XG4gICAgICB0cnkge1xuICAgICAgICAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yPy53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRmV0Y2ggdGhlIHRpbGUtc291cmNlIGRlc2NyaXB0b3IgZm9yIHRoZSBzZWxlY3RlZCBmaWxlLiBUaGUgYGluZm9gIHBhcmFtIGlzXG4gICAqIHRoZSBiYXNlNjQgUmF3RmlsZUluZm8gdGhlIHJlc3Qgb2YgdGhlIEFQSSB1c2VzOyB0aGUgR0VUIGdvZXMgdGhyb3VnaCB0aGVcbiAgICogYXV0aCBpbnRlcmNlcHRvciAoQmVhcmVyKS4gV2UgYWxzbyBncmFiIGEgdG9rZW4gaGVyZSBmb3IgT1NEJ3Mgb3duIHRpbGVcbiAgICogZmV0Y2hlcyAoaXRzIGxvYWRlciBieXBhc3NlcyBIdHRwQ2xpZW50KS5cbiAgICovXG4gIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8T3NkTG9hZGVkPiB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIC8vIEEgZGlmZmVyZW50IGltYWdlIHdhcyBzZWxlY3RlZCDigJQgc3RvcCB0aGUgcHJldmlvdXMgc3RhY2sncyBiYWNrZ3JvdW5kXG4gICAgLy8gbG9hZGluZyBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGZpbmlzaCBiZWhpbmQgdGhlIG5ldyBpbWFnZS5cbiAgICBpZiAoZmlsZW5hbWUgJiYgdGhpcy5jdXJyZW50RmlsZU5hbWUgJiYgZmlsZW5hbWUgIT09IHRoaXMuY3VycmVudEZpbGVOYW1lKSB7XG4gICAgICB0aGlzLmNhY2hlLmNhbmNlbEJhY2tncm91bmRMb2FkKCk7XG4gICAgICB0aGlzLnJldm9rZVNpbXBsZUZ1bGxSZXNVcmxzKCk7XG4gICAgfVxuICAgIHRoaXMuc2ltcGxlU3RhY2subm90ZUFjdGl2ZUZpbGUoZmlsZW5hbWUpO1xuICAgIC8vIFNpbXBsZSAoaW4tbWVtb3J5IC8gbm9uLXRpbGVkKSBpbWFnZTogc2tpcCB0aGUgdGlsZSBzZXJ2ZXIgZW50aXJlbHkg4oCUIG5vXG4gICAgLy8gZ2V0U2VsZWN0ZWRJbmZvQjY0LCBubyAvdGlsZXMvaW5mbyBwb2xsLiBgdXJsc1t6SW5kZXhdYCBpcyBhIGNvbXBsZXRlIGltYWdlXG4gICAgLy8gT1NEIG9wZW5zIHZpYSBpdHMgc2luZ2xlLWltYWdlIHNvdXJjZSAoc2VlIHBsb3QoKSkuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW1hZ2VJbmZvKSkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZFNpbXBsZShpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfVxuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIHsgZGVzY3JpcHRvcjogbnVsbCwgaW5mb0I2NDogJycsIHo6IHpJbmRleCB8fCAwLCBmaWxlbmFtZSB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXV0aEhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzLmdldEF1dGhIZWFkZXJzKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmF1dGhIZWFkZXJzID0ge307IC8vIGZhbGwgYmFjayB0byBjb29raWUgYXV0aCAoYWpheFdpdGhDcmVkZW50aWFscylcbiAgICB9XG4gICAgLy8gUG9sbCAvdGlsZXMvaW5mbzogdGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZSBmaWxlIGlzIHN0aWxsXG4gICAgLy8gYmVpbmcgY2FjaGVkIChHQ1MtPlBWQykg4oCUIGl0IGtpY2tzIHRoZSBkb3dubG9hZCBvZmYgaW4gdGhlIGJhY2tncm91bmQsIHNvXG4gICAgLy8gZWFjaCByZXF1ZXN0IGlzIHNob3J0IChubyBsb25nLWhlbGQgY29ubmVjdGlvbiB0byB0cmlwIGluZ3Jlc3MvcHJveHkgb3JcbiAgICAvLyBjbGllbnQgdGltZW91dHMpLCBhbmQgMjAwIHdpdGggdGhlIGRlc2NyaXB0b3Igb25jZSBpdCdzIHJlYWR5LiBUaGVcbiAgICAvLyBjYWNoZS1wcm9ncmVzcyBvdmVybGF5IHNob3dzIHByb2dyZXNzIGR1cmluZyB0aGUgd2FpdC4gV2UgZ2l2ZSB1cCBhZnRlclxuICAgIC8vIHRpbGVzSW5mb1RpbWVvdXRNcyBzbyB0aGUgcmVuZGVyIHBpcGVsaW5lIG5ldmVyIGhhbmdzICh0aGUgcm91dGVyIHRoZW5cbiAgICAvLyBmYWxscyBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSkuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZXMvaW5mbz9pbmZvPSR7aW5mb0I2NH1gO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMudGlsZXNJbmZvVGltZW91dE1zO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlcy9pbmZvIG5vdCByZWFkeSBiZWZvcmUgZGVhZGxpbmUg4oCUIGZpbGUgc3RpbGwgY2FjaGluZycpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8VGlsZURlc2NyaXB0b3I+KHVybCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnIH0pLnBpcGUodGltZW91dCg0NTAwMCkpLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMCAmJiByZXNwLmJvZHkpIHtcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSByZXNwLmJvZHk7XG4gICAgICAgICAgcmV0dXJuIHsgZGVzY3JpcHRvcjogcmVzcC5ib2R5LCBpbmZvQjY0LCB6OiB6SW5kZXggfHwgMCwgZmlsZW5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyAyMDIgQWNjZXB0ZWQgKG9yIGVtcHR5IGJvZHkpIOKGkiBzdGlsbCBjYWNoaW5nOyBmYWxsIHRocm91Z2ggYW5kIHJlLXBvbGwuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gVG9sZXJhdGUgdHJhbnNpZW50IGZhaWx1cmVzIFdISUxFIHRoZSBmaWxlIGlzIGJlaW5nIHByZXBhcmVkOiBhIHNsb3dcbiAgICAgICAgLy8gbWV0YWRhdGEgcmVhZCBvbiBhIG11bHRpLUdCIGZpbGUgKElGRCB3YWxrKSwgYSA1eHggbWlkLXBpcGVsaW5lLCBhXG4gICAgICAgIC8vIHByb3h5IGhpY2N1cC4gQSBzaW5nbGUgYmFkIHBvbGwgbXVzdCBOT1QgZHJvcCB1cyB0byBQbG90bHkg4oCUIGEgbGFyZ2VcbiAgICAgICAgLy8gaW1hZ2UgYWx3YXlzIHBhc3NlcyB0aHJvdWdoIHRoaXMgYnVzeSB3aW5kb3csIHNvIGJhaWxpbmcgaGVyZSBpcyB3aHlcbiAgICAgICAgLy8gaXQgXCJhbHdheXMgZW5kcyB1cCBvbiBQbG90bHlcIi4gS2VlcCBwb2xsaW5nIHVudGlsIHJlYWR5IG9yIGRlYWRsaW5lLlxuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHRpbGVzL2luZm8gcG9sbCByZXRyeScsIGVycik7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxNTAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBgcGxvdCgpYCBwYXlsb2FkIGZvciBhIHNpbXBsZSAodGlsZWQ6ZmFsc2UpIGltYWdlOiBhIHNpbmdsZS1sZXZlbFxuICAgKiAgZGVzY3JpcHRvciBzaXplZCBmcm9tIGB0cnVlSW1hZ2VTaXplYCwgcGx1cyB0aGUgZGlyZWN0bHktbG9hZGFibGUgVVJMIOKAlFxuICAgKiAgcmVzb2x2ZWQgYW5kIGZldGNoZWQgdmlhIHtAbGluayBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2V9IChzaGFyZWQgd2l0aFxuICAgKiAgbmFwYXJpLWpzOyBzZWUgaXRzIGRvY3MgZm9yIHdoeSB0aGlzIGNhbid0IGJlIGEgcmF3IGBmZXRjaCgpYC9gPGltZz5gKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2ltcGxlKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE9zZExvYWRlZD4ge1xuICAgIGNvbnN0IHogPSB6SW5kZXggfHwgMDtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgdGhpcy5hdXRoSGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplID8/IFswLCAwXTtcbiAgICBjb25zdCBtZXRhID0gaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdO1xuICAgIC8vIFNFUlZFUkxFU1MgTVVMVElDSEFOTkVMOiBjb21wb3NpdGUgdGhlIHNsaWNlJ3MgcGVyLWNoYW5uZWwgcGxhbmVzXG4gICAgLy8gY2xpZW50LXNpZGUgKG5vIHRpbGUgc2VydmVyKSwgZHJpdmVuIGJ5IHRoZSBjaGFubmVsIHBhbmUuIEtlcHQgT0ZGIHRoZVxuICAgIC8vIHRpbGVkIGlzTXVsdGlDaGFubmVsIHBhdGggKHNlZSBjb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwpLlxuICAgIGNvbnN0IGNoVXJscyA9IGltYWdlSW5mby5jaGFubmVsVXJscztcbiAgICB0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCA9ICEhY2hVcmxzPy5sZW5ndGggJiYgKG1ldGE/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDE7XG4gICAgbGV0IHVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCkge1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsVXJscyA9IGNoVXJscyBhcyBzdHJpbmdbXVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkU2ltcGxlQ2hhbm5lbFBsYW5lcyhjaFVybHMhW3pdID8/IGNoVXJscyFbMF0pO1xuICAgICAgICB1cmwgPSBhd2FpdCB0aGlzLmNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpO1xuICAgICAgICAvLyBOQjogaGlzdG9ncmFtcyBhcmUgYmlubmVkIGluIHBsb3QoKSwgQUZURVIgZGVzdHJveVZpZXdlciBjbGVhcnMgdGhlXG4gICAgICAgIC8vIHNhbXBsZXIg4oCUIGNvbXB1dGluZyB0aGVtIGhlcmUgd291bGQgYmUgd2lwZWQgYnkgdGhhdCBjbGVhci5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZSBtdWx0aWNoYW5uZWwgY29tcG9zaXRlIGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFVybHMgPSBbXTtcbiAgICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyA9IFtdO1xuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVTdGFjay51cmxGb3IoaW1hZ2VJbmZvLCB6KTtcbiAgICAgIGlmIChyYXdVcmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwcmV2aWV3VXJsID0gYXdhaXQgdGhpcy5zaW1wbGVTdGFjay5mZXRjaEFzQmxvYlVybChyYXdVcmwpO1xuICAgICAgICAgIC8vIFVwc2NhbGUgdGhlIChkb3duc2NhbGVkKSBwcmV2aWV3IHRvIGZ1bGwgcmVzb2x1dGlvbiBzbyBPU0QncyB3b3JsZFxuICAgICAgICAgIC8vIG1hdGNoZXMgdGhlIGZ1bGwtcmVzIFJPSSBjb29yZGluYXRlIHNwYWNlIOKAlCBzZWUgdG9GdWxsUmVzVXJsLlxuICAgICAgICAgIHVybCA9IGF3YWl0IHRoaXMudG9GdWxsUmVzVXJsKHByZXZpZXdVcmwsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTm8gbG9hZGFibGUgVVJMIChlbXB0eSB1cmxzW10gb3IgdGhlIGZldGNoIGZhaWxlZCk6IHNpZ25hbCBcImNvdWxkbid0XG4gICAgLy8gbG9hZFwiIHdpdGggYSBudWxsIGRlc2NyaXB0b3Ig4oCUIHNhbWUgYXMgdGhlIHRpbGVkIHBhdGggd2hlbiB0aGVyZSdzIG5vXG4gICAgLy8gc2VsZWN0ZWQtZmlsZSBpbmZvIOKAlCBzbyBwbG90KCkgcmV0dXJucyBmYWxzZSAoaXRzIGBpZiAoIWQpYCBndWFyZCkgYW5kXG4gICAgLy8gdGhlIHJvdXRlciBjYW4gZmFsbCBiYWNrLCBpbnN0ZWFkIG9mIG1vdW50aW5nIGFuIDxpbWc+IHdpdGggYW4gdW5kZWZpbmVkXG4gICAgLy8gc3JjIHRoYXQgdGhyb3dzIGF0IHJ1bnRpbWUuXG4gICAgaWYgKCF1cmwpIHtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlLW1vZGUgc2xpY2UgaGFzIG5vIGxvYWRhYmxlIFVSTDsgc2tpcHBpbmcgT1NEIHJlbmRlcicsIGZpbGVuYW1lKTtcbiAgICAgIHJldHVybiB7IGRlc2NyaXB0b3I6IG51bGwsIGluZm9CNjQ6ICcnLCB6LCBmaWxlbmFtZSB9O1xuICAgIH1cbiAgICBjb25zdCBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciA9IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGlsZVNpemU6IDAsICAgICAgICAgICAgLy8gdW51c2VkOiBzaW1wbGUgbW9kZSBuZXZlciBjYWxscyBidWlsZFRpbGVTb3VyY2VcbiAgICAgIHo6IDEsICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBmcmFtZVxuICAgICAgY2hhbm5lbHM6IG1ldGE/LnJnYkNoYW5uZWxzID8/IChpbWFnZUluZm8uaXNHcmF5c2NhbGUgPyAxIDogMyksXG4gICAgICBtdWx0aWNoYW5uZWw6IGZhbHNlLFxuICAgICAgcmVhbExldmVsczogMSxcbiAgICAgIGxldmVsczogW3sgcmVzOiAwLCB3aWR0aCwgaGVpZ2h0IH1dLFxuICAgICAgbXBwWDogbWV0YT8ubXBwWCA/PyAwLFxuICAgICAgbXBwWTogbWV0YT8ubXBwWSA/PyAwLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0b3IsXG4gICAgICBpbmZvQjY0OiAnJyxcbiAgICAgIHosXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIHNpbXBsZTogdHJ1ZSxcbiAgICAgIHVybCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9TRCdzIGB7dHlwZTonaW1hZ2UnfWAgc291cmNlIHNpemVzIGl0cyBjb29yZGluYXRlIHdvcmxkIHRvIHRoZSBpbWFnZSdzXG4gICAqIE5BVFVSQUwgcGl4ZWxzLiBBIGZvbGRlci1zdGFjayBzbGljZSBpcyBhIHNlcnZlciBgL3ByZXZpZXdgIHdob3NlIHBpeGVsIHNpemVcbiAgICogbmVlZG4ndCBtYXRjaCB0aGUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIOKAlCBpdCBtYXkgYmUgZG93bnNjYWxlZCAobGFyZ2VcbiAgICogaW1hZ2VzKSBPUiBsYXJnZXIgdGhhbiB0aGUgZGltZW5zaW9ucyBgL21ldGFkYXRhYCByZXBvcnRzLiBFaXRoZXIgd2F5IE9TRCdzXG4gICAqIHdvcmxkIHdvdWxkIGRpZmZlciBmcm9tIHRoZSBmdWxsLXJlcyBST0kgY29vcmRpbmF0ZSBzcGFjZSAoUXVQYXRoIGdlb2pzb24sXG4gICAqIGluIGxldmVsLTAgcGl4ZWxzKTogYSBzbWFsbGVyIHByZXZpZXcgcmVuZGVycyBST0lzIG92ZXJzaXplZCwgYSBsYXJnZXIgb25lXG4gICAqIHJlbmRlcnMgdGhlbSB1bmRlcnNpemVkL29mZnNldC4gUmVzYW1wbGUgdGhlIHByZXZpZXcgdG8gRVhBQ1RMWSB0aGVcbiAgICogZnVsbC1yZXNvbHV0aW9uIGRpbWVuc2lvbnMgKGJsdXJyeSBidXQgcG9zaXRpb25hbGx5IGV4YWN0IOKAlCBzY2FsaW5nIHVwIG9yXG4gICAqIGRvd24gYXMgbmVlZGVkKSBzbyBPU0QncyB3b3JsZCBtYXRjaGVzIHRoZSBST0kgY29vcmRpbmF0ZSBzcGFjZSwgd2hpbGUgc3RpbGxcbiAgICogdXNpbmcgT1NEJ3MgcmVsaWFibGUgc2luZ2xlLWltYWdlIHJlbmRlcmVyLiBDYWNoZWQgcGVyIHByZXZpZXcgVVJMIChyZXZva2VkXG4gICAqIG9uIGZpbGUgY2hhbmdlKTsgYSBuby1vcCB3aGVuIHRoZSBwcmV2aWV3IGlzIGFscmVhZHkgZXhhY3RseSBmdWxsLXJlcyAoc21hbGxcbiAgICogaW1hZ2VzLCBpbi1tZW1vcnkgcGlwZWxpbmUgYmxvYnMpLCB3aGVuIHRoZSBkaW1zIGFyZSB1bmtub3duLCBvciB3aGVuXG4gICAqIHRoZXkncmUgaW1wbGF1c2libHkgbGFyZ2UgKGd1YXJkcyBhZ2FpbnN0IGFuIGVub3Jtb3VzIGNhbnZhcykuIChqaXQtdWkjOTMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHRvRnVsbFJlc1VybChwcmV2aWV3VXJsOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQgfHwgTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgPiB0aGlzLlNJTVBMRV9VUFNDQUxFX01BWF9ESU0pIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuZ2V0KHByZXZpZXdVcmwpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgbGV0IGltZzogSFRNTEltYWdlRWxlbWVudDtcbiAgICB0cnkge1xuICAgICAgaW1nID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VFbChwcmV2aWV3VXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBwcmV2aWV3VXJsOyAvLyBjb3VsZG4ndCBkZWNvZGUg4oCUIGxldCBPU0QgdHJ5IHRoZSBVUkwgYXMtaXNcbiAgICB9XG4gICAgLy8gQWxyZWFkeSB0aGUgZXhhY3QgZnVsbC1yZXMgd29ybGQg4oCUIG5vIHJlc2FtcGxlIG5lZWRlZC4gKEEgcHJldmlldyB0aGF0IGlzXG4gICAgLy8gbGFyZ2VyIE9SIHNtYWxsZXIgdGhhbiBmdWxsLXJlcyBtdXN0IHN0aWxsIGJlIHJlc2l6ZWQgc28gT1NEJ3Mgd29ybGQgPT1cbiAgICAvLyB0aGUgUk9JIGNvb3JkaW5hdGUgc3BhY2U7IG9ubHkgYW4gZXhhY3QgbWF0Y2ggaXMgc2tpcHBhYmxlLilcbiAgICBpZiAoaW1nLm5hdHVyYWxXaWR0aCA9PT0gd2lkdGggJiYgaW1nLm5hdHVyYWxIZWlnaHQgPT09IGhlaWdodCkgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOyAvLyBzY2FsZSBwcmV2aWV3ICh1cCBvciBkb3duKSB0byBmdWxsLXJlc1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4oKHJlc29sdmUpID0+IGNhbnZhcy50b0Jsb2IocmVzb2x2ZSkpO1xuICAgIGlmICghYmxvYikgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY29uc3QgZnVsbFJlc1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdGhpcy5zaW1wbGVGdWxsUmVzVXJscy5zZXQocHJldmlld1VybCwgZnVsbFJlc1VybCk7XG4gICAgcmV0dXJuIGZ1bGxSZXNVcmw7XG4gIH1cblxuICAvKiogU2FtcGxlIGEgU0lNUExFLW1vZGUgc2xpY2UncyBvd24gZGVjb2RlZCBwaXhlbHMgaW50byB0aGUgaGlzdG9ncmFtIOKAlCB0aGVcbiAgICogIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBzYW1wbGVycyAobm8gdGlsZSBzZXJ2ZXIpLiBGaXJlLWFuZC1mb3JnZXQ7XG4gICAqICBhIGRlY29kZSBmYWlsdXJlIGp1c3QgbGVhdmVzIHRoZSBwYW5lIGVtcHR5IHJhdGhlciB0aGFuIHRocm93aW5nLiAqL1xuICBwcml2YXRlIGFzeW5jIHNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmw6IHN0cmluZyB8IHVuZGVmaW5lZCwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF1cmwpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1nID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VFbCh1cmwpO1xuICAgICAgY29uc3QgdyA9IGltZy5uYXR1cmFsV2lkdGgsIGggPSBpbWcubmF0dXJhbEhlaWdodDtcbiAgICAgIGlmICghdyB8fCAhaCkgcmV0dXJuO1xuICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgYy53aWR0aCA9IHc7IGMuaGVpZ2h0ID0gaDtcbiAgICAgIGNvbnN0IGN0eCA9IGMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhO1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVIaXN0b2dyYW0oeiwgZGF0YSwgdGhpcy5pc0dyYXlzY2FsZUltYWdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlLW1vZGUgaGlzdG9ncmFtIHNhbXBsZSBmYWlsZWQnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBGZXRjaCArIGRlY29kZSBhIHNsaWNlJ3MgcGVyLWNoYW5uZWwgcGxhbmVzIChzaW5nbGUtYmFuZCBncmF5c2NhbGUpIGludG9cbiAgICogIHBpeGVsIGJ1ZmZlcnMsIGZvciB0aGUgU0VSVkVSTEVTUyBtdWx0aWNoYW5uZWwgY29tcG9zaXRvci4gQXV0aC1zYWZlOiBnb2VzXG4gICAqICB0aHJvdWdoIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSAoYmxvYjovZGF0YTogYXMtaXM7IGh0dHAgdmlhIEh0dHBDbGllbnQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGZvciAoY29uc3QgdSBvZiB1cmxzID8/IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcmV2aWV3VXJsID0gYXdhaXQgdGhpcy5zaW1wbGVTdGFjay5mZXRjaEFzQmxvYlVybCh1KTtcbiAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VFbChwcmV2aWV3VXJsKTtcbiAgICAgICAgY29uc3QgdyA9IGltZy5uYXR1cmFsV2lkdGgsIGggPSBpbWcubmF0dXJhbEhlaWdodDtcbiAgICAgICAgaWYgKCF3IHx8ICFoKSB7IHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pOyBjb250aW51ZTsgfVxuICAgICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGMud2lkdGggPSB3OyBjLmhlaWdodCA9IGg7XG4gICAgICAgIGNvbnN0IGN0eCA9IGMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKCFjdHgpIHsgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7IGNvbnRpbnVlOyB9XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgICAgcGxhbmVzLnB1c2goeyBkYXRhOiBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGEsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBjaGFubmVsIHBsYW5lIGRlY29kZSBmYWlsZWQnLCBlcnIpO1xuICAgICAgICBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzID0gcGxhbmVzO1xuICB9XG5cbiAgLyoqIENvbXBvc2l0ZSB0aGUgY2FjaGVkIHBlci1jaGFubmVsIHBsYW5lcyBpbnRvIE9ORSBSR0JBIGltYWdlIHVzaW5nIHRoZVxuICAgKiAgY3VycmVudCBjaGFubmVsIHN0YXRlcyAoY29sb3VyL3dpbmRvdy9nYW1tYS92aXNpYmlsaXR5KSDigJQgdGhlIGNsaWVudC1zaWRlLFxuICAgKiAgc2VydmVybGVzcyBhbmFsb2cgb2YgdGhlIHRpbGVkIHBlci1jaGFubmVsICdsaWdodGVyJyBjb21wb3NpdG9yXG4gICAqICAoc2FtZSBkaXNwbGF5LmNoYW5uZWxSZ2JMdXQgbWF0aCBhcyByZWNvbG9yQ2hhbm5lbFRpbGUsIGFwcGxpZWQgcGVyLXBsYW5lKS5cbiAgICogIFJldHVybnMgYSBibG9iOiBVUkwgb2YgdGhlIGNvbXBvc2l0ZSBQTkcsIHJldm9raW5nIHRoZSBwcmV2aW91cyBvbmUuICovXG4gIHByaXZhdGUgYXN5bmMgY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGxhbmVzID0gdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzO1xuICAgIGlmICghcGxhbmVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB3ID0gcGxhbmVzWzBdLndpZHRoLCBoID0gcGxhbmVzWzBdLmhlaWdodDtcbiAgICBpZiAoIXcgfHwgIWgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3ICogaCAqIDQpO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcGxhbmVzLmxlbmd0aDsgYysrKSB7XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1tjXTtcbiAgICAgIGlmIChzdCAmJiBzdC52aXNpYmxlID09PSBmYWxzZSkgY29udGludWU7IC8vIGhpZGRlbiBjaGFubmVsIGNvbnRyaWJ1dGVzIG5vdGhpbmdcbiAgICAgIGNvbnN0IHBsYW5lID0gcGxhbmVzW2NdO1xuICAgICAgaWYgKHBsYW5lLndpZHRoICE9PSB3IHx8IHBsYW5lLmhlaWdodCAhPT0gaCB8fCAhcGxhbmUuZGF0YS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyByLCBnLCBiIH0gPSB0aGlzLmRpc3BsYXkuY2hhbm5lbFJnYkx1dChzdCk7XG4gICAgICBjb25zdCBwZCA9IHBsYW5lLmRhdGE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBpZiAocGRbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbHVtID0gcGRbaV07IC8vIHNpbmdsZS1iYW5kIHBsYW5lIChSPUc9QilcbiAgICAgICAgb3V0W2ldICs9IHJbbHVtXTsgICAgICAgICAgLy8gVWludDhDbGFtcGVkQXJyYXkgY2xhbXBzIOKGkiBhZGRpdGl2ZSAoJ2xpZ2h0ZXInKVxuICAgICAgICBvdXRbaSArIDFdICs9IGdbbHVtXTtcbiAgICAgICAgb3V0W2kgKyAyXSArPSBiW2x1bV07XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSA0KSBvdXRbaV0gPSAyNTU7IC8vIG9wYXF1ZVxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHc7IGNhbnZhcy5oZWlnaHQgPSBoO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN0eC5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShvdXQsIHcsIGgpLCAwLCAwKTtcbiAgICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFByb21pc2U8QmxvYiB8IG51bGw+KChyZXMpID0+IGNhbnZhcy50b0Jsb2IocmVzLCAnaW1hZ2UvcG5nJykpO1xuICAgIGlmICghYmxvYikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpO1xuICAgIHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICByZXR1cm4gdGhpcy5zaW1wbGVDb21wb3NpdGVVcmw7XG4gIH1cblxuICAvKiogUmUtY29tcG9zaXRlIHRoZSBjdXJyZW50IHNsaWNlIGZyb20gaXRzIGNhY2hlZCBwbGFuZXMgKG5ldyBjaGFubmVsIHN0YXRlcylcbiAgICogIGFuZCByZS1vcGVuIOKAlCB0aGUgc2VydmVybGVzcyBhbmFsb2cgb2YgdGhlIHRpbGVkIGludmFsaWRhdGUtb24tY2hhbm5lbC1jaGFuZ2UuICovXG4gIHByaXZhdGUgYXN5bmMgcmVjb21wb3NpdGVBbmRPcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgaWYgKCF1cmwgfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgdHJ5IHsgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7IH0gY2F0Y2ggeyAvKiB2aWV3ZXIgZ29uZSAqLyB9XG4gIH1cblxuICAvKiogTG9hZCBhIFVSTCBpbnRvIGFuIEhUTUxJbWFnZUVsZW1lbnQgKHJlc29sdmVzIG9uY2UgZGVjb2RlZCkuIFVzZXNcbiAgICogIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgcmF0aGVyIHRoYW4gYG5ldyBJbWFnZSgpYCBiZWNhdXNlIHRoaXMgZmlsZSdzXG4gICAqICBgSW1hZ2VgIGltcG9ydCBpcyBpbWFnZS1qcydzIGRlY29kZXIsIG5vdCB0aGUgRE9NIGVsZW1lbnQuICovXG4gIHByaXZhdGUgbG9hZEltYWdlRWwodXJsOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICBpbWcub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWcpO1xuICAgICAgaW1nLm9uZXJyb3IgPSAoZSkgPT4gcmVqZWN0KGUpO1xuICAgICAgaW1nLnNyYyA9IHVybDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmV2b2tlU2ltcGxlRnVsbFJlc1VybHMoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB1IG9mIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMudmFsdWVzKCkpIFVSTC5yZXZva2VPYmplY3RVUkwodSk7XG4gICAgdGhpcy5zaW1wbGVGdWxsUmVzVXJscy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKTsgdGhpcy5zaW1wbGVDb21wb3NpdGVVcmwgPSBudWxsOyB9XG4gIH1cblxuICAvKiogTW91bnQgdGhlIHZpZXdlciB3aXRoIGEgY3VzdG9tIHRpbGUgc291cmNlIHBvaW50aW5nIGF0IGBHRVQgL3RpbGVgLiAqL1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogYW55LFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICBfc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgX3Bsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBpblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9hZGVkID0gaW1hZ2VMb2FkZWQgYXMgT3NkTG9hZGVkO1xuICAgIGNvbnN0IGQgPSBsb2FkZWQ/LmRlc2NyaXB0b3I7XG4gICAgaWYgKCFkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAvLyBSZS1lc3RhYmxpc2ggdGhlIGNvbG9ybWFwIHN1YnNjcmlwdGlvbiBpZiBhIHByaW9yIGNvbXBvbmVudCB0ZWFyZG93blxuICAgIC8vICh1bnN1YnNjcmliZSgpKSB0b3JlIGl0IGRvd24g4oCUIHRoaXMgc2VydmljZSBpcyBhIHJvb3Qgc2luZ2xldG9uLCBzbyB0aGVcbiAgICAvLyBjb25zdHJ1Y3RvciB3b24ndCBydW4gYWdhaW4gdG8gcmVjcmVhdGUgaXQuXG4gICAgdGhpcy5lbnN1cmVDb2xvcm1hcFN1YnNjcmlwdGlvbigpO1xuICAgIC8vIE9TRCB0aWxlcyBuYXRpdmVseSwgc28gdGhlIGluLXBsYWNlIChsYXJnZSkgcGFzcyBpcyBub3JtYWxseSBhIG5vLW9wXG4gICAgLy8gb25jZSBtb3VudGVkIOKAlCB0aGUgdGlsZSBweXJhbWlkIElTIHRoZSBmdWxsIHJlc29sdXRpb24gcmVnYXJkbGVzcyBvZlxuICAgIC8vIHdoaWNoIEltYWdlSW5mbyB0aWVyIHJlcXVlc3RlZCBpdC4gU2ltcGxlIG1vZGUgaGFzIG5vIHB5cmFtaWQgdG8gZmFsbFxuICAgIC8vIGJhY2sgb246IGl0IGRpc3BsYXlzIGxpdGVyYWxseSB3aGF0ZXZlciBVUkwgd2FzIGxhc3Qgb3BlbmVkLCBzb1xuICAgIC8vIHdpdGhvdXQgdGhpcyBzd2FwIHRoZSBzbWFsbCB0aWVyJ3MgMTI4cHggcGxhY2Vob2xkZXIgd291bGQgc3RheSBvblxuICAgIC8vIHNjcmVlbiBmb3JldmVyIChwaXhlbGF0ZWQsIG5ldmVyIFwic2hhcnBlbmluZ1wiIGxpa2UgdGhlIHRpbGVkIHBhdGgpLlxuICAgIGlmIChpblBsYWNlICYmIHRoaXMudmlld2VyKSB7XG4gICAgICBpZiAobG9hZGVkLnNpbXBsZSAmJiBsb2FkZWQudXJsKSB7XG4gICAgICAgIC8vIEFsc28gcmVmcmVzaCBzaW1wbGVVcmxzIHRvIFRISVMgcGhhc2UncyAobGFyZ2UtdGllcikgdXJsc1tdIOKAlCBpdCB3YXNcbiAgICAgICAgLy8gc2V0IGZyb20gdGhlIHNtYWxsIHRpZXIncyAxMjhweCB1cmxzIG9uIHRoZSBpbml0aWFsIG1vdW50IGJlbG93LFxuICAgICAgICAvLyB3aGljaCBuZXZlciBydW5zIGFnYWluIGZvciB0aGUgaW4tcGxhY2UgcGFzcy4gV2l0aG91dCB0aGlzLFxuICAgICAgICAvLyBzZXRaSW5kZXgncyBsYXRlciBzbGlkZXIgc2NydWJzIHdvdWxkIGtlZXAgcmVhZGluZyB0aGUgc21hbGxcbiAgICAgICAgLy8gdGllcidzIGxvdy1yZXMgVVJMcyBmb3JldmVyLCBldmVuIHRob3VnaCB0aGUgaW5pdGlhbCBzbGljZSB3YXNcbiAgICAgICAgLy8gY29ycmVjdGx5IHN3YXBwZWQgdG8gZnVsbCByZXNvbHV0aW9uIGhlcmUuXG4gICAgICAgIHRoaXMuc2ltcGxlVXJscyA9IGltYWdlSW5mbz8udXJscyA/PyB0aGlzLnNpbXBsZVVybHM7XG4gICAgICAgIHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmw6IGxvYWRlZC51cmwgfSBhcyBhbnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICB0aGlzLmN1cnJlbnRGaWxlTmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgdGhpcy5kZXNjcmlwdG9yID0gZDtcbiAgICB0aGlzLmluZm9CNjQgPSBsb2FkZWQuaW5mb0I2NDtcbiAgICB0aGlzLmN1cnJlbnRaID0gbG9hZGVkLno7XG4gICAgdGhpcy5zaW1wbGVNb2RlID0gISFsb2FkZWQuc2ltcGxlO1xuICAgIHRoaXMuc2ltcGxlVXJscyA9IGxvYWRlZC5zaW1wbGUgPyAoaW1hZ2VJbmZvPy51cmxzID8/IFtdKSA6IFtdO1xuICAgIC8vIFRoZSBkZXNjcmlwdG9yJ3MgcGh5c2ljYWwgcGl4ZWwgc2l6ZSAoc2VydmVyIEJpby1Gb3JtYXRzIGAvdGlsZXMvaW5mb2ApIGlzXG4gICAgLy8gYXV0aG9yaXRhdGl2ZSDigJQgcHVzaCBpdCBpbnRvIHRoZSBzaGFyZWQgbWV0YSBzbyB0aGUgUmVnaW9uIEVkaXRvciByZXBvcnRzXG4gICAgLy8gYXJlYXMgaW4gwrVtwrIvbW3CsiwgbWF0Y2hpbmcgdGhlIHNjYWxlIGJhciBidWlsdCBmcm9tIGBkLm1wcFhgIGJlbG93LlxuICAgIHRoaXMuc3RvcmUuc2V0UGh5c2ljYWxQaXhlbFNpemUoZC5tcHBYLCBkLm1wcFkpO1xuICAgIC8vIFVzZSB0aGUgU0FNRSBncmF5c2NhbGUgZmxhZyB0aGUgY29sb3JtYXAgZHJvcGRvd24gLyBQbG90bHkgdXNlXG4gICAgLy8gKGltYWdlSW5mby5pc0dyYXlzY2FsZSDihpAgcmdiQ2hhbm5lbHMgPT09IDEpLiBUaGUgZGVzY3JpcHRvcidzIGBjaGFubmVsc2BcbiAgICAvLyAoY2hhbm5lbENvdW50KSBkaXZlcmdlcyBmcm9tIHJnYkNoYW5uZWxzIGZvciBzdGFja3MsIHdoaWNoIGxlZnQgZ3JheXNjYWxlXG4gICAgLy8gc3RhY2tzIHVuLXJlY29sb3JlZCBldmVuIHRob3VnaCB0aGUgY29sb3JtYXAgc2VsZWN0b3Igd2FzIHNob3duLlxuICAgIHRoaXMuaXNHcmF5c2NhbGVJbWFnZSA9ICEhaW1hZ2VJbmZvPy5pc0dyYXlzY2FsZTtcbiAgICAvLyBTaW1wbGUgKG5vbi10aWxlZCwgaW4tbWVtb3J5KSBpbWFnZTogbm8gcHlyYW1pZCwgbm8gcGVyLWNoYW5uZWwgdGlsZXMsIGFuZFxuICAgIC8vIG5vIHNlcnZlci1zaWRlIGludGVuc2l0eSBzYW1wbGluZyDigJQgT1NEJ3Mgc2luZ2xlLWltYWdlIHNvdXJjZSBkZWNvZGVzXG4gICAgLy8gdXJsc1t6XSBkaXJlY3RseS4gU2tpcCB0aGUgd2hvbGUgdGlsZWQtc2V0dXAgcGF0aCBiZWxvdy5cbiAgICBjb25zdCBzaW1wbGUgPSAhIWxvYWRlZC5zaW1wbGU7XG4gICAgaWYgKHNpbXBsZSkge1xuICAgICAgdGhpcy5yZWFsTGV2ZWxzID0gMTtcbiAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FjaGUuY2xlYXJDaGFubmVsR3JvdXBzKCk7XG4gICAgICB0aGlzLmRlc3Ryb3lWaWV3ZXIoKTtcbiAgICAgIC8vIFNlcnZlcmxlc3MgaGlzdG9ncmFtIOKAlCBBRlRFUiBkZXN0cm95Vmlld2VyIChpdHMgbGFzdCBhY3QgaXMgc2FtcGxlci5jbGVhcigpKS5cbiAgICAgIC8vIE11bHRpY2hhbm5lbCBiaW5zIGVhY2ggY2FjaGVkIGNoYW5uZWwgcGxhbmU7IHNpbmdsZS1iYW5kIC8gUkdCIGJpbnMgdGhlXG4gICAgICAvLyBkZWNvZGVkIGZyYW1lJ3Mgb3duIHBpeGVscy5cbiAgICAgIGlmICh0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCkge1xuICAgICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZVNpbXBsZU11bHRpY2hhbm5lbEhpc3RvZ3JhbXMobG9hZGVkLnosIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2b2lkIHRoaXMuc2FtcGxlU2ltcGxlSGlzdG9ncmFtKGxvYWRlZC51cmwsIGxvYWRlZC56KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVsdGljaGFubmVsIGZsdW9yZXNjZW5jZSAoaW5kZXhlZC9MVVQtYmVhcmluZyBzdGFja3MpIGNvbXBvc2l0ZSBjbGllbnQtc2lkZVxuICAgICAgLy8gZnJvbSBwZXItY2hhbm5lbCB0aWxlcy4gVHJ1c3QgdGhlIHNlcnZlcidzIGV4cGxpY2l0IGBtdWx0aWNoYW5uZWxgIGZsYWcg4oCUIHRoZVxuICAgICAgLy8gb2xkIGBjaGFubmVscz4xICYmIGdyYXlzY2FsZWAgaGV1cmlzdGljIGFsc28gbWF0Y2hlZCBSR0IgcGhvdG9zIEJpby1Gb3JtYXRzXG4gICAgICAvLyByZWFkcyBhcyBzZXBhcmF0ZWQgcGxhbmVzIChjaGFubmVscz4xLCByZ2JDaGFubmVscz09MSksIHNwbGl0dGluZyB0aGVtIGludG8gTlxuICAgICAgLy8gcGVyLWNoYW5uZWwgVGlsZWRJbWFnZXMgdGhhdCBmbG9vZGVkIHRoZSB0aWxlIGVuZHBvaW50IGFuZCBodW5nIG9uIGxvYWQuXG4gICAgICB0aGlzLnJlYWxMZXZlbHMgPSBkLnJlYWxMZXZlbHMgPz8gZC5sZXZlbHMubGVuZ3RoO1xuICAgICAgLy8gVGlsZXMgdG8gY292ZXIgdGhlIHdob2xlIGltYWdlIGF0IHRoZSBjb2Fyc2VzdCBSRUFMIEJpby1Gb3JtYXRzIGxldmVsICh0aGVcbiAgICAgIC8vIHNtYWxsZXN0IGxldmVsIHRoYXQgaGFzIHJlYWwsIHBlci1jaGFubmVsLWZldGNoYWJsZSB0aWxlcyDigJQgc3ludGhldGljIG92ZXJ2aWV3XG4gICAgICAvLyBsZXZlbHMgYXJlIHNlcnZlci1jb21wb3NpdGVkIG9ubHkpLiBBIHB5cmFtaWRhbCBpbWFnZSdzIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXNcbiAgICAgIC8vIHRpbnkgKGZldyB0aWxlcyk7IGEgZmxhdC9uby1weXJhbWlkIGltYWdlJ3MgaXMgdGhlIGZ1bGwtcmVzIGdyaWQgKG1hbnkgdGlsZXMpLlxuICAgICAgY29uc3QgY29hcnNlID0gZC5sZXZlbHNbdGhpcy5yZWFsTGV2ZWxzIC0gMV0gPz8gZC5sZXZlbHNbZC5sZXZlbHMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBjb2Fyc2VXID0gY29hcnNlID8gTWF0aC5jZWlsKGNvYXJzZS53aWR0aCAvIGQudGlsZVNpemUpIDogMTtcbiAgICAgIGNvbnN0IGNvYXJzZUggPSBjb2Fyc2UgPyBNYXRoLmNlaWwoY29hcnNlLmhlaWdodCAvIGQudGlsZVNpemUpIDogMTtcbiAgICAgIGNvbnN0IGNvYXJzZVRpbGVzID0gY29hcnNlVyAqIGNvYXJzZUg7XG4gICAgICB0aGlzLmlzTXVsdGlDaGFubmVsID0gISFkLm11bHRpY2hhbm5lbDtcbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIC8vIFBlci1jaGFubmVsIHJlbmRlcmluZyBjYW4gb25seSB1c2UgdGhlIFJFQUwgbGV2ZWxzLCBzbyBPU0QgcmVxdWVzdHMgdGhlXG4gICAgICAgIC8vIGNvYXJzZXN0IHJlYWwgbGV2ZWwncyB3aG9sZSB0aWxlIGdyaWQgw5cgTiBjaGFubmVscyBhdCBmaXQuIFdoZW4gdGhhdCdzIGxhcmdlXG4gICAgICAgIC8vIChhIHdob2xlLXNsaWRlKSwgaXQncyB0b28gbWFueSAob2Z0ZW4gc2xvdywgcHlyYW1pZC1sZXNzKSBmdWxsLXJlcyByZWFkcyDigJRcbiAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBzaW5nbGUgc2VydmVyLWNvbXBvc2l0ZWQgc291cmNlICh3aGljaCBrZWVwcyB0aGUgZmFzdFxuICAgICAgICAvLyBzeW50aGV0aWMgb3ZlcnZpZXdzKS4gQSBzbWFsbCBzaW5nbGUtRk9WIHotc3RhY2sgc3RheXMgcGVyLWNoYW5uZWwuIFNpemUgaW5cbiAgICAgICAgLy8gQllURVMgaXNuJ3QgdGhlIHNpZ25hbCDigJQgdGlsZSBjb3VudCBpcy5cbiAgICAgICAgY29uc3QgZml0VGlsZXMgPSBjb2Fyc2VUaWxlcyAqIE1hdGgubWF4KDEsIGQuY2hhbm5lbHMgPz8gMSk7XG4gICAgICAgIGlmIChmaXRUaWxlcyA+IHRoaXMuTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMpIHtcbiAgICAgICAgICB0aGlzLmlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1tPU0RdIG11bHRpY2hhbm5lbCBjb21wb3NpdGUgdG9vIGxhcmdlIGZvciBwZXItY2hhbm5lbCByZW5kZXJpbmc6ICcgK1xuICAgICAgICAgICAgYCR7Y29hcnNlV314JHtjb2Fyc2VIfSB0aWxlcyB4ICR7ZC5jaGFubmVsc30gY2hhbm5lbHMgPSAke2ZpdFRpbGVzfSBhdCB0aGUgY29hcnNlc3QgYCArXG4gICAgICAgICAgICBgcmVhbCBsZXZlbCAoPiAke3RoaXMuTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVN9KTsgcmVuZGVyaW5nIHNlcnZlci1jb21wb3NpdGVkIGZvciBzcGVlZC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2FjaGUuY2xlYXJDaGFubmVsR3JvdXBzKCk7XG4gICAgICAvLyBBdXRvLXJhbmdlIGdyYXlzY2FsZSB0aWxlcyB0byB0aGUgaW1hZ2UncyBhY3R1YWwgaW50ZW5zaXR5IHNwYW4gKGxpa2UgdGhlXG4gICAgICAvLyBoZWF0bWFwKSwgc2FtcGxpbmcgdGhlIGNvYXJzZXN0IHRpbGUgbGV2ZWwgc28gdGhlIHdpbmRvdyBtYXRjaGVzIHRoZSByYXdcbiAgICAgIC8vIHRpbGUgdmFsdWVzLiBGaXJlLWFuZC1mb3JnZXQ6IGl0IHJlLWludmFsaWRhdGVzIG9uY2UgdGhlIHdpbmRvdyBpcyBrbm93bjtcbiAgICAgIC8vIHRpbGVzIHBhaW50IHVud2luZG93ZWQgdW50aWwgdGhlbi4gKE11bHRpY2hhbm5lbCB3aW5kb3dzIGFyZSBwZXItY2hhbm5lbCxcbiAgICAgIC8vIGRlZmF1bHRpbmcgdG8gZnVsbCByYW5nZTsgdGhlIHVzZXIgYXV0by9lZGl0cyBlYWNoIGNoYW5uZWwuKVxuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKGQsIGxvYWRlZC5pbmZvQjY0LCBsb2FkZWQueik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZUltYWdlV2luZG93KGQsIGxvYWRlZC5pbmZvQjY0LCBsb2FkZWQueik7XG4gICAgICB9XG4gICAgICB0aGlzLmRlc3Ryb3lWaWV3ZXIoKTtcbiAgICAgIC8vIFNpemUgdGhlIHNsaWNlIGNhY2hlIGZvciB0aGlzIGltYWdlOiBMUlUgY2FwIHRvIGhvbGQgdGhlIHdob2xlIHN0YWNrXG4gICAgICAvLyAoY2FwcGVkKSBhbmQgc2tpcCBiYWNrZ3JvdW5kIHByZWxvYWRpbmcgZm9yIHN0YWNrcyB0b28gbGFyZ2UgdG8gcHJlbG9hZFxuICAgICAgLy8gKHdvdWxkIGZsb29kIGZ1bGwtcmVzIHJlYWRzKS4gTm9ybWFsIHN0YWNrcyBrZWVwIHRoZSBmbGlja2VyLWZyZWUgcHJlLWNhY2hlLlxuICAgICAgdGhpcy5jYWNoZS5jb25maWd1cmUoZC56ID8/IDEsIGNvYXJzZVRpbGVzKTtcbiAgICB9XG5cbiAgICAvLyBTaW1wbGUgbW9kZTogT1NEJ3Mgc2luZ2xlLWltYWdlIHNvdXJjZSBkZWNvZGVzIHRoZSBVUkwgKGJsb2I6L2RhdGE6L2h0dHApXG4gICAgLy8gZGlyZWN0bHkg4oCUIG5vIHB5cmFtaWQsIG5vIHNlcnZlci4gVGlsZWQgbW9kZTogdGhlIGN1c3RvbSBzZXJ2ZXItYmFja2VkIHRpbGVcbiAgICAvLyBzb3VyY2UgKG11bHRpY2hhbm5lbCBvcGVucyBvbiBjaGFubmVsIDA7IHRoZSBvcGVuIGhhbmRsZXIgdGhlbiBzd2FwcyBpbiB0aGlzXG4gICAgLy8gc2xpY2UncyBwZXItY2hhbm5lbCBncm91cCBhbmQgdGhlIGJhY2tncm91bmQgbG9hZGVyIHByZS1maWxscyB0aGUgcmVzdCkuXG4gICAgY29uc3QgdGlsZVNvdXJjZSA9IHNpbXBsZVxuICAgICAgPyB7IHR5cGU6ICdpbWFnZScsIHVybDogbG9hZGVkLnVybCB9XG4gICAgICA6IHRoaXMuYnVpbGRUaWxlU291cmNlKGQsIGxvYWRlZC5pbmZvQjY0LCBsb2FkZWQueiwgdGhpcy5pc011bHRpQ2hhbm5lbCA/IDAgOiB1bmRlZmluZWQpO1xuICAgIHNpbGVuY2VPc2RNdWx0aUltYWdlQWR2aXNvcnkoKTtcbiAgICB0aGlzLnZpZXdlciA9IChPU0QgYXMgYW55KSh7XG4gICAgICBpZDogcGxvdERpdixcbiAgICAgIC8vIFNpbXBsZS1tb2RlIHotc2NydWIgY2FsbHMgdmlld2VyLm9wZW4oKSBhZ2FpbiBwZXIgc2xpY2UgKHNlZVxuICAgICAgLy8gc2V0WkluZGV4KSDigJQgd2l0aG91dCB0aGlzIGl0IHJlc2V0cyB0byB0aGUgaG9tZSB6b29tL3BhbiBvbiBldmVyeVxuICAgICAgLy8gc2xpY2UgY2hhbmdlLiBUaWxlZCBtb2RlIG5ldmVyIHJlLW9wZW5zIChpdCB0b2dnbGVzIHByZS1hZGRlZFxuICAgICAgLy8gVGlsZWRJbWFnZXMnIG9wYWNpdHkgaW5zdGVhZCksIHNvIHRoaXMgaXMgYSBuby1vcCB0aGVyZS5cbiAgICAgIHByZXNlcnZlVmlld3BvcnQ6IHRydWUsXG4gICAgICAvLyBVc2UgdGhlIDJEIGNhbnZhcyBkcmF3ZXIsIG5vdCBXZWJHTDogY3JlYXRpbmcvZGVzdHJveWluZyBhIHZpZXdlciBvblxuICAgICAgLy8gZWFjaCBlbmdpbmUgdG9nZ2xlIC8gaW1hZ2UgbG9hZCBjaHVybnMgV2ViR0wgY29udGV4dHMgKGJyb3dzZXJzIGNhcFxuICAgICAgLy8gaG93IG1hbnkgZXhpc3QgYXQgb25jZSksIHdoaWNoIHN1cmZhY2VzIGFzIFwiV2ViR0wgY29udGV4dCB3YXMgbG9zdFwiXG4gICAgICAvLyBhbmQgYmxhbmsgdGlsZXMuIFRoZSBjYW52YXMgZHJhd2VyIGhhcyBubyBzdWNoIGxpbWl0LlxuICAgICAgZHJhd2VyOiAnY2FudmFzJyxcbiAgICAgIHNob3dOYXZpZ2F0aW9uQ29udHJvbDogZmFsc2UsIC8vIGF2b2lkcyBuZWVkaW5nIHRoZSBpY29uLWltYWdlIGFzc2V0c1xuICAgICAgLy8gT3ZlcnZpZXcgdGh1bWJuYWlsIHdpdGggdGhlIGN1cnJlbnQtdmlld3BvcnQgcmVjdGFuZ2xlLCBib3R0b20tcmlnaHQuXG4gICAgICBzaG93TmF2aWdhdG9yOiB0aGlzLm5hdmlnYXRvclZpc2libGUsXG4gICAgICAvLyBOZWFyZXN0LW5laWdoYm91ciB3aGVuIG9mZiDihpIgY3Jpc3AgcGl4ZWxzIG9uIHpvb20taW4gKHBpeGVsIGluc3BlY3Rpb24pLlxuICAgICAgaW1hZ2VTbW9vdGhpbmdFbmFibGVkOiB0aGlzLnNtb290aGluZ0VuYWJsZWQsXG4gICAgICBuYXZpZ2F0b3JQb3NpdGlvbjogJ0JPVFRPTV9SSUdIVCcsXG4gICAgICBuYXZpZ2F0b3JTaXplUmF0aW86IDAuMTYsXG4gICAgICBuYXZpZ2F0b3JBdXRvRmFkZTogZmFsc2UsXG4gICAgICBuYXZpZ2F0b3JCYWNrZ3JvdW5kOiAncmdiYSgwLDAsMCwwLjUpJyxcbiAgICAgIGxvYWRUaWxlc1dpdGhBamF4OiB0cnVlLFxuICAgICAgYWpheFdpdGhDcmVkZW50aWFsczogdHJ1ZSwgLy8gY29va2llIGF1dGggKG9hdXRoMi1wcm94eSlcbiAgICAgIGFqYXhIZWFkZXJzOiB0aGlzLmF1dGhIZWFkZXJzLCAvLyBiZWFyZXIgYXV0aCAoQXV0aDApLCB3aGVuIGF2YWlsYWJsZVxuICAgICAgY3Jvc3NPcmlnaW5Qb2xpY3k6ICdBbm9ueW1vdXMnLFxuICAgICAgLy8gR2VudGxlciB6b29tOiB0aGUgZGVmYXVsdCAoMS4yKSBmZWVscyBmYXN0IGFuZCBiaWcganVtcHMgY3Jvc3Mgc2V2ZXJhbFxuICAgICAgLy8gcHlyYW1pZCBsZXZlbHMgYXQgb25jZSwgZmlyaW5nIGEgYnVyc3Qgb2YgdGlsZSByZXF1ZXN0cy4gU2hhcmVkIHdpdGggdGhlXG4gICAgICAvLyByZWdpb24gb3ZlcmxheSwgd2hpY2ggdGFrZXMgdGhlIHdoZWVsIG92ZXIgd2hpbGUgYSB0b29sIGlzIGFjdGl2ZS5cbiAgICAgIHpvb21QZXJTY3JvbGw6IE9TRF9aT09NX1BFUl9TQ1JPTEwsXG4gICAgICAvLyBDbGljay10by16b29tIHRvd2FyZCB0aGUgY2xpY2tlZCBwb2ludCAoT3BlblNlYWRyYWdvbidzIGRlZmF1bHQgZGVtb1xuICAgICAgLy8gYmVoYXZpb3VyKS4gT25seSBhcHBsaWVzIHdoZW4gbm8gcmVnaW9uIHRvb2wgaXMgYWN0aXZlIOKAlCBhbiBhY3RpdmUgdG9vbFxuICAgICAgLy8gZGlzYWJsZXMgT1NEIG1vdXNlLW5hdiBzbyBjbGlja3MgZHJhdy9zZWxlY3QgaW5zdGVhZCBvZiB6b29taW5nLlxuICAgICAgZ2VzdHVyZVNldHRpbmdzTW91c2U6IHsgY2xpY2tUb1pvb206IHRydWUsIHNjcm9sbFRvWm9vbTogdHJ1ZSB9LFxuICAgICAgLy8gWm9vbSBsaW1pdHMgKGppdC11aSM5NCkuIERlZmF1bHQgbWluWm9vbUltYWdlUmF0aW8gKDAuOSkgc3RvcHMgeW91IGZyb21cbiAgICAgIC8vIHpvb21pbmcgdGhlIGltYWdlIHNtYWxsZXIgdGhhbiB+aG9tZTsgZHJvcCBpdCBzbyB0aGUgaW1hZ2UgY2FuIGJlIHNocnVua1xuICAgICAgLy8gZnJlZWx5IChlZmZlY3RpdmVseSBubyBtaW5pbXVtKS4gRGVmYXVsdCBtYXhab29tUGl4ZWxSYXRpbyAoMS4xKSBjYXBzXG4gICAgICAvLyB6b29tLWluIGF0IH4xIHNjcmVlbiBweCBwZXIgaW1hZ2UgcHg7IHJhaXNlIGl0IHNvIHlvdSBjYW4gem9vbSBpbiB0b1xuICAgICAgLy8gaW5zcGVjdCBpbmRpdmlkdWFsIHBpeGVscyAocGFpcmVkIHdpdGggaW1hZ2VTbW9vdGhpbmdFbmFibGVkPWZhbHNlIGZvclxuICAgICAgLy8gY3Jpc3AgbmVhcmVzdC1uZWlnaGJvdXIgYmxvY2tzKS5cbiAgICAgIG1pblpvb21JbWFnZVJhdGlvOiAwLjAxLFxuICAgICAgbWF4Wm9vbVBpeGVsUmF0aW86IDIwLFxuICAgICAgLy8gT1NEJ3Mgc3RvY2sgdmFsdWUsIHJlc3RvcmVkLiBETyBOT1QgUkFJU0UgSVQ6IHRoZSBuYW1lIHJlYWRzIGxpa2VcbiAgICAgIC8vIFwibWluaW11bSBzaGFycG5lc3NcIiBidXQgaXQgaXMgdGhlIG9wcG9zaXRlLiBGcm9tIE9TRCdzIG93blxuICAgICAgLy8gVGlsZWRJbWFnZS5fZ2V0TGV2ZWxzSW50ZXJ2YWw6XG4gICAgICAvL1xuICAgICAgLy8gICBoaWdoZXN0TGV2ZWwgPSBmbG9vciggbG9nMiggY3VycmVudFplcm9SYXRpbyAvIG1pblBpeGVsUmF0aW8gKSApXG4gICAgICAvL1xuICAgICAgLy8gbWluUGl4ZWxSYXRpbyBpcyBhIGZsb29yIG9uIGhvdyBzbWFsbCBhIHRpbGUgcGl4ZWwgbWF5IHNocmluaywgYW5kIGl0XG4gICAgICAvLyBESVZJREVTIGludG8gdGhlIHJhdGlvIC0gc28gcmFpc2luZyBpdCBsb3dlcnMgdGhlIGNob3NlbiBsZXZlbCwgaS5lLlxuICAgICAgLy8gcGlja3MgYSBDT0FSU0VSIGltYWdlLiBPU0QncyBvd24gY29tbWVudCBvbiB0aGUgZGVmYXVsdCBzYXlzIGFzIG11Y2g6XG4gICAgICAvLyBcImNsb3NlciB0byAwIGRyYXdzIHRpbGVzIG1lYW50IGZvciBhIGhpZ2hlciB6b29tIGF0IHRoaXMgem9vbVwiLlxuICAgICAgLy9cbiAgICAgIC8vIE1lYXN1cmVkIG9uIGEgZmxhdCAyMjMwNHgyNDUyOCBpbWFnZSAobGV2ZWxzIDY5Ny8xMzk0LzI3ODgvNTU3Ni8xMTE1Mi9cbiAgICAgIC8vIDIyMzA0KSwgcHJlZGljdGVkIGxldmVsIG1hdGNoaW5nIGFjdHVhbCBpbiBhbGwgbmluZSB0cmlhbHM6XG4gICAgICAvL1xuICAgICAgLy8gICAgICAgICAgICB6b29tIDIgICAgICAgIHpvb20gOCAgICAgICAgfjE6MVxuICAgICAgLy8gICAxLjAgICAgICAxLjM0eCB1cCAgICAgIDEuMzR4IHVwICAgICAgMS44NnggdXBcbiAgICAgIC8vICAgMC41ICAgICAgMC42N3ggKG5vbmUpICAwLjY3eCAobm9uZSkgIDAuOTN4IC0+IGZ1bGwgcmVzXG4gICAgICAvLyAgIDAuMjUgICAgIDAuMzN4ICAgICAgICAgMC4zM3ggICAgICAgICAwLjkzeFxuICAgICAgLy9cbiAgICAgIC8vIDAuNSBpcyB3aGF0IGdpdmVzIFwibmV2ZXIgdXBzY2FsZWQgYmVsb3cgbmF0aXZlLCBmdWxsIHJlc29sdXRpb24gYXQgMToxXCIuXG4gICAgICAvLyAwLjI1IGlzIG5vdCBiZXR0ZXIgLSBpdCBqdW1wcyB0d28gcnVuZ3MgZmluZXIgYW5kIGZldGNoZXMgfjR4IHRoZSB0aWxlc1xuICAgICAgLy8gZm9yIG5vIHZpc2libGUgZ2FpbiwgYW5kIHRpbGVzIGFyZSBub3QgY2FjaGVkIGJ5IHRoZSBpbmdyZXNzLlxuICAgICAgbWluUGl4ZWxSYXRpbzogMC41LFxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHZpZXcgdG8gc2V0dGxlIGJlZm9yZSBwdWxsaW5nIG5ldyB0aWxlcyAobGVzcyBjaHVybikuXG4gICAgICBpbW1lZGlhdGVSZW5kZXI6IGZhbHNlLFxuICAgICAgYW5pbWF0aW9uVGltZTogMC40LFxuICAgICAgLy8gUmVsZWFzZSBtZW1vcnkgYWdncmVzc2l2ZWx5OiBjYXAgdGhlIHRpbGUgY2FjaGUgc28gdGlsZXMgb3V0c2lkZSB0aGVcbiAgICAgIC8vIGN1cnJlbnQgdmlldyAoZS5nLiB0aGUgY29hcnNlciBsZXZlbHMgbGVmdCBiZWhpbmQgYWZ0ZXIgem9vbWluZyBpbikgYXJlXG4gICAgICAvLyBldmljdGVkIGluc3RlYWQgb2YgYWNjdW11bGF0aW5nLiBMYXJnZSB3aG9sZS1zbGlkZSB0aWxlcyDigJQgZG91YmxlZCB3aGVuXG4gICAgICAvLyB0aGUgY29sb3JtYXAgcGlwZWxpbmUga2VlcHMgYSByZWNvbG9yZWQgY29weSDigJQgbWFrZSBhbiB1bmJvdW5kZWQgY2FjaGVcbiAgICAgIC8vIGNvc3RseS4gVHVuYWJsZTsgbG93ZXIgPSBsZXNzIG1lbW9yeSwgbW9yZSByZS1mZXRjaCBvbiBwYW4tYmFjay5cbiAgICAgIC8vIFN0YWNrcyBrZWVwIG1hbnkgc2xpY2VzIHJlc2lkZW50ICh0aGUgd2hvbGUgc3RhY2sgaXMgYmFja2dyb3VuZC1sb2FkZWQpLFxuICAgICAgLy8gc28gdGhleSBnZXQgYSBtdWNoIGxhcmdlciB0aWxlIGJ1ZGdldCDigJQgb3RoZXJ3aXNlIHN3aXRjaGluZyBzbGljZXMgZXZpY3RzXG4gICAgICAvLyBlYWNoIG90aGVyJ3MgdGlsZXMgYW5kIHNjcnViYmluZyBiYWNrIHJlLWZldGNoZXMuIFNjYWxlZCB0byB0aGUgcmVzaWRlbnRcbiAgICAgIC8vIHNsaWNlIGNvdW50OyBzaW5nbGUgaW1hZ2VzIGtlZXAgdGhlIGxlYW4gZGVmYXVsdC5cbiAgICAgIG1heEltYWdlQ2FjaGVDb3VudDogKGQueiA/PyAxKSA+IDEgPyBNYXRoLm1pbigyNDAwLCBNYXRoLm1heCg2MDAsIHRoaXMuY2FjaGUubWF4U2xpY2VzKCkgKiA0MCkpIDogMTUwLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyBBbHdheXMgc2V0dGxlOiBpZiBPU0QgbmV2ZXIgZW1pdHMgb3Blbi9vcGVuLWZhaWxlZCAoYSBiYWQgdGlsZSBzb3VyY2UsXG4gICAgICAvLyBhIHZpZXdlciB0b3JuIGRvd24gbWlkLW9wZW4pLCB0aGUgcmVuZGVyIHBpcGVsaW5lIG11c3Qgbm90IGhhbmcg4oCUIGEgaGFuZ1xuICAgICAgLy8gbGVhdmVzIGltYWdlTG9hZGluZz10cnVlLCBzdGlja2luZyB0aGUgc3Bpbm5lciBhbmQgdGhlIDUwMG1zXG4gICAgICAvLyBjYWNoZS1wcm9ncmVzcyBwb2xsIGZvcmV2ZXIgKE5TX0JJTkRJTkdfQUJPUlRFRCBzdG9ybSkuXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IChvazogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXNldHRsZWQpIHtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKG9rKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMudmlld2VyIS5hZGRPbmNlSGFuZGxlcignb3BlbicsICgpID0+IHtcbiAgICAgICAgLy8gUmVnaW9uIG92ZXJsYXkgcmVhZHMvd3JpdGVzIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUsIHNvIHJlZ2lvbnMgc3RheVxuICAgICAgICAvLyBpbiBzeW5jIHdpdGggUGxvdGx5IGFuZCB0aGUgUmVnaW9uIEVkaXRvci4gUmVjcmVhdGUgaXQgcGVyIG9wZW4oKSBzb1xuICAgICAgICAvLyBpdCBiaW5kcyB0byB0aGUgZnJlc2hseS1vcGVuZWQgdmlld2VyJ3MgY2FudmFzL01vdXNlVHJhY2tlci5cbiAgICAgICAgdGhpcy5vdmVybGF5Py5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG5ldyBPc2RSZWdpb25PdmVybGF5KHRoaXMudmlld2VyIGFzIGFueSwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgICAgIHRoaXMuY29vcmRUcmFuc2Zvcm0gPSBuZXcgT3NkQ29vcmRpbmF0ZVRyYW5zZm9ybSh0aGlzLnZpZXdlciBhcyBhbnkpO1xuICAgICAgICB0aGlzLnNjYWxlQmFyID0gbmV3IE9zZFNjYWxlQmFyKHRoaXMudmlld2VyIGFzIGFueSwgZC5tcHBYID8/IDApO1xuICAgICAgICB0aGlzLmJ1aWxkVG9vbEhvc3RzKCk7XG4gICAgICAgIC8vIFNpbXBsZSBtb2RlIGlzIGEgc2luZ2xlLCBzZWxmLWNvbnRhaW5lZCBpbWFnZSDigJQgbm8gc2xpY2UgY2FjaGUgdG8gc2VlZC5cbiAgICAgICAgaWYgKHNpbXBsZSkge1xuICAgICAgICAgIC8qIG5vdGhpbmcgdG8gY2FjaGU6IG9uZSBmcmFtZSwgbm8gcHlyYW1pZCAqL1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgICAvLyBEcm9wIHRoZSBzaW5nbGUgb3BlbmVkIChjaGFubmVsLTApIGltYWdlIGFuZCBhZGQgdGhpcyBzbGljZSdzIGNoYW5uZWxcbiAgICAgICAgICAvLyBncm91cCB0byB0aGUgcGVyLXNsaWNlIGNhY2hlLiBUaGUgc2hhcmVkIGJhY2tncm91bmQgbG9hZGVyIC8gTFJVIHRoZW5cbiAgICAgICAgICAvLyBwcmUtZmlsbHMgdGhlIG90aGVyIHNsaWNlcycgY2hhbm5lbCBncm91cHMgc28gei1zY3J1YiBpcyBmbGlja2VyLWZyZWUuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGl0MCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICAgIGlmIChpdDApICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlbW92ZUl0ZW0oaXQwKTtcbiAgICAgICAgICB9IGNhdGNoIHsgLyogbm90aGluZyB0byByZW1vdmUgKi8gfVxuICAgICAgICAgIHRoaXMuY2FjaGUuYWRkQ2hhbm5lbFNsaWNlKHRoaXMuY3VycmVudFopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlZWQgdGhlIHNsaWNlIGNhY2hlIHdpdGggdGhlIGp1c3Qtb3BlbmVkIHNsaWNlICh3b3JsZCBpdGVtIDApLCBzb1xuICAgICAgICAgIC8vIHNjcnViYmluZyBiYWNrIHRvIGl0IGxhdGVyIGlzIGFuIGluc3RhbnQgb3BhY2l0eSB0b2dnbGUsIG5vdCBhIHJlLW9wZW4uXG4gICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgICAgICAgIGlmIChmaXJzdEl0ZW0pIHRoaXMuY2FjaGUuc2VlZENvbXBvc2l0ZSh0aGlzLmN1cnJlbnRaLCBmaXJzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlICpyZW5kZXJlZCB2aWV3cG9ydCosIHNvIGl0cyBwaXhlbCBtYXRyaXggaXMgb25seVxuICAgICAgICAvLyB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgdmlldyDigJQgZHJvcCBpdCB3aGVuZXZlciB0aGUgdmlld3BvcnQgY2hhbmdlcy5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ3ZpZXdwb3J0LWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEdyYXlzY2FsZSB0aWxlcyBnZXQgdGhlIGFjdGl2ZSBjb2xvcm1hcCB2aWEgdGhlIHBpeGVsIHBpcGVsaW5lLiBUaGVcbiAgICAgICAgLy8gaGFuZGxlciBydW5zIHBlciB0aWxlIG9uIGxvYWQgKGFuZCBvbiByZXF1ZXN0SW52YWxpZGF0ZSk7IHJlY29sb3JpbmdcbiAgICAgICAgLy8gaXMgYSBuby1vcCBmb3IgUkdCIGltYWdlcyBvciBiZWZvcmUgdGhlIExVVCByZXNvbHZlcy5cbiAgICAgICAgLy8gKGlzR3JheXNjYWxlSW1hZ2UgaXMgc2V0IGZyb20gaW1hZ2VJbmZvLmlzR3JheXNjYWxlIGluIHBsb3QoKSBhYm92ZS4pXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd0aWxlLWludmFsaWRhdGVkJywgKGV2ZW50OiBhbnkpID0+IHRoaXMucmVjb2xvclRpbGUoZXZlbnQpKTtcbiAgICAgICAgLy8gVGhlIG92ZXJ2aWV3IG5hdmlnYXRvciBpcyBhIHNlcGFyYXRlIG1pbmktdmlld2VyIHdpdGggaXRzIG93biB0aWxlcyxcbiAgICAgICAgLy8gc28gaXQgZG9lc24ndCByZWNlaXZlIHRoZSBtYWluIHZpZXdlcidzIHRpbGUtaW52YWxpZGF0ZWQgZXZlbnRzLiBBcHBseVxuICAgICAgICAvLyB0aGUgc2FtZSByZWNvbG9yIHBpcGVsaW5lIHRvIGl0IHNvIHRoZSBtaW5pbWFwIHRyYWNrcyB0aGUgbWFpbiBpbWFnZSdzXG4gICAgICAgIC8vIGNvbG9ybWFwL0xVVCBpbnN0ZWFkIG9mIHN0YXlpbmcgZ3JheXNjYWxlLlxuICAgICAgICBjb25zdCBuYXYgPSAodGhpcy52aWV3ZXIgYXMgYW55KS5uYXZpZ2F0b3I7XG4gICAgICAgIG5hdj8uYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIGlmICgodGhpcy5pc0dyYXlzY2FsZUltYWdlICYmIHRoaXMuY29sb3JMdXQpIHx8IHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmF2Py53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBQcmVmZXRjaCBhZGphY2VudCB6LXNsaWNlcyBvbmNlIHRoZSB2aWV3IHNldHRsZXMgKGFuZCBvbiBlYWNoIHNldHRsZSxcbiAgICAgICAgLy8gc28gaXQgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXdwb3J0IGFzIHRoZSB1c2VyIHBhbnMvem9vbXMpLiBTaW1wbGUgbW9kZVxuICAgICAgICAvLyBoYXMgYSBzaW5nbGUgZnJhbWUsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBwcmVmZXRjaC5cbiAgICAgICAgaWYgKCFzaW1wbGUpIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5jYWNoZS5zY2hlZHVsZVByZWZldGNoKCkpO1xuICAgICAgICAvLyBUZWxsIGxpc3RlbmVycyAodGhlIGludGVuc2l0eSBpbnNldCkgdGhlIHZpc2libGUgaW1hZ2UgcmVnaW9uIHdoZW5ldmVyXG4gICAgICAgIC8vIHRoZSB2aWV3IHNldHRsZXMsIHNvIHRoZXkgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tIHJlc29sdXRpb24uXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5lbWl0Vmlld3BvcnRDaGFuZ2UoKSk7XG4gICAgICAgIC8vIENocm9tZSBjb21wb3NpdG9yIGJ1ZzogYWZ0ZXIgYW4gT1NEIHpvb20gdGhlIGRvY2tlZCB0b29sYmFyIChhIHNpYmxpbmcgb2ZcbiAgICAgICAgLy8gI3Bsb3QgaW4gdGhlIDx2aXN1YWxpemVyPiBob3N0KSBpcyBsZWZ0IGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgYW5kXG4gICAgICAgIC8vIHZhbmlzaGVzIOKAlCBjb25maXJtZWQgdmlhIERldlRvb2xzIChET00gaW50YWN0LCByZWdpb24gc2ltcGx5IG5vdCBwYWludGVkKS5cbiAgICAgICAgLy8gQ1NTICh6LWluZGV4IC8gaXNvbGF0aW9uIC8gY29udGFpbikgYW5kIERPTS1yZXBhcmVudGluZyBkb24ndCBmaXggaXQ7IGFcbiAgICAgICAgLy8gcmVwYWludCByZWxpYWJseSBkb2VzLiBOdWRnZSBpdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSAoc28gaXQgbmV2ZXIgdmlzaWJseVxuICAgICAgICAvLyBkcm9wcykgYW5kIG9uIHNldHRsZS4gVGhlIHN5bmNocm9ub3VzIGRpc3BsYXkgdG9nZ2xlIHJlLXJhc3RlcnMgd2l0aCBub1xuICAgICAgICAvLyB2aXNpYmxlIGdvbmUtZnJhbWUgYW5kIG5vIGxheW91dCBzaGlmdC5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbicsICgpID0+IHRoaXMubnVkZ2VUb29sYmFyUmVwYWludCgpKTtcbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbi1maW5pc2gnLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLmNhY2hlLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgICAgLy8gRm9yY2UgZml0LXRvLXZpZXcgYXMgdGhlIHNwbGl0L2ZsZXggbGF5b3V0IHNldHRsZXMuIEEgdGFsbFxuICAgICAgICAvLyBub24tcHlyYW1pZGFsIGltYWdlIGNhbiBvdGhlcndpc2Ugb3BlbiB6b29tZWQtaW4gKGltYWdlIHdpZHRoIGZpbGxpbmdcbiAgICAgICAgLy8gdGhlIHZpZXdlciksIG1ha2luZyBPU0QgZGVtYW5kIHNsb3cgZnVsbC1yZXMgcmVzPTAgdGlsZXMgZm9yIHRoZVxuICAgICAgICAvLyBjZW50cmUgaW5zdGVhZCBvZiB0aGUgZmFzdCBjb2Fyc2Ugb3ZlcnZpZXcg4oaSIHdoaXRlIGNhbnZhcy4gZ29Ib21lXG4gICAgICAgIC8vIGZpdHMgdGhlIHdob2xlIGltYWdlIHNvIE9TRCBzZWxlY3RzIHRoZSBjb2Fyc2Ugc3ludGhldGljIGxldmVsLiBSZXRyeVxuICAgICAgICAvLyBhY3Jvc3MgYSBmZXcgZnJhbWVzIGJlY2F1c2UgdGhlIGNvbnRhaW5lciBtYXkgbm90IGhhdmUgaXRzIGZpbmFsIHNpemVcbiAgICAgICAgLy8gb24gdGhlIGZpcnN0IGZyYW1lIGFmdGVyICdvcGVuJy5cbiAgICAgICAgY29uc3QgcmVmaXQgPSAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBUaGUgbmF2aWdhdG9yIHdhcyBzaXplZCBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBCRUZPUkUgdGhlXG4gICAgICAgICAgICAvLyBsYXlvdXQgc2V0dGxlZCDigJQgc28gaXRzIGVsZW1lbnQgY2FuIGNhcnJ5IGEgc3RhbGUgKGV2ZW5cbiAgICAgICAgICAgIC8vIHdyb25nLWFzcGVjdCkgc2l6ZSB0aGF0IGZsb2F0cyB0aGUgdmlzaWJsZSBtaW5pbWFwIGFib3ZlIHRoZVxuICAgICAgICAgICAgLy8gY29ybmVyLiBSZS1zaXplIGl0IGZyb20gdGhlIHNldHRsZWQgY29udGFpbmVyLlxuICAgICAgICAgICAgdGhpcy5yZXNpemVOYXZpZ2F0b3IoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIHRvcm4gZG93biAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlZml0KTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgMTUwKTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgNDAwKTtcbiAgICAgICAgLy8gVGhlIHRpbWVkIHJldHJpZXMgYWJvdmUgbWlzcyB0aGUgY2FzZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIFNUSUxMXG4gICAgICAgIC8vIHplcm8tc2l6ZSBhdCA0MDBtcyDigJQgd2hpY2ggaGFwcGVucyB3aGVuIHRoZSByZW5kZXIgc3RhcnRzIHdoaWxlIHRoZVxuICAgICAgICAvLyBmaWxlIHZpZXdlciBpcyBtaWQtc3dpdGNoIGZyb20gdGhlIGZvbGRlciB2aWV3IHRvIHRoZSBkaWFncmFtIChlLmcuXG4gICAgICAgIC8vIFwiTG9hZCBhcyBTdGFja1wiIGZyb20gYSBmb2xkZXIsIHdpdGggbm8gaW1hZ2Ugb3BlbiBmaXJzdCkuIEJlY2F1c2VcbiAgICAgICAgLy8gcHJlc2VydmVWaWV3cG9ydCBzdXBwcmVzc2VzIE9TRCdzIG93biBvcGVuLXRpbWUgZml0LCB0aGUgaW1hZ2Ugd291bGRcbiAgICAgICAgLy8gdGhlbiBiZSBsZWZ0IHVuLWZpdHRlZCBhdCB0aGUgdG9wLWxlZnQgKFwiYSB0aWxlXCIpLiBBIG9uZS1zaG90XG4gICAgICAgIC8vIFJlc2l6ZU9ic2VydmVyIGZpdHMgdGhlIGluc3RhbnQgdGhlIGNvbnRhaW5lciBmaXJzdCBoYXMgYSByZWFsIHNpemUsXG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgcmVuZGVyIGJlZ2FuIChqaXQtdWkjMTA2KS5cbiAgICAgICAgdGhpcy5maXRXaGVuQ29udGFpbmVyU2l6ZWQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdiksIHJlZml0KTtcbiAgICAgICAgLy8gS2VlcCB0aGUgbmF2aWdhdG9yIHNpemVkIHRvIHRoZSBjb250YWluZXIgYXMgdGhlIHBhbmVsIHJlc2l6ZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZU5hdmlnYXRvcigpKTtcbiAgICAgICAgZG9uZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3ZXIhLmFkZE9uY2VIYW5kbGVyKCdvcGVuLWZhaWxlZCcsIChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBvcGVuLWZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgIGRvbmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSBjb25zb2xlLndhcm4oJ1tPU0RdIHZpZXdlciBvcGVuIHRpbWVkIG91dCcpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0sIDgwMDApO1xuICAgICAgdGhpcy52aWV3ZXIhLm9wZW4odGlsZVNvdXJjZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdC10by1ob21lIG9uY2UgYGVsYCBmaXJzdCBoYXMgYSBub24temVybyBzaXplLiBJZiBpdCdzIGFscmVhZHkgc2l6ZWQgd2VcbiAgICogcmVseSBvbiB0aGUgdGltZWQgcmVmaXRzIHRoZSBjYWxsZXIgc2NoZWR1bGVkOyBvdGhlcndpc2UgYSBvbmUtc2hvdFxuICAgKiBSZXNpemVPYnNlcnZlciBydW5zIGByZWZpdGAgdGhlIG1vbWVudCB0aGUgY29udGFpbmVyIGlzIGxhaWQgb3V0ICh0aGVuXG4gICAqIGRpc2Nvbm5lY3RzKSwgc28gdGhlIGluaXRpYWwgZml0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSByZW5kZXIncyBzdGFydCB0aW1lXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBkaWFncmFtIGNvbnRhaW5lcidzIGxheW91dC4gTm8tb3Agd2l0aG91dCBhIGNvbnRhaW5lciBvclxuICAgKiBSZXNpemVPYnNlcnZlciAodGhlIHRpbWVkIHJlZml0cyByZW1haW4gdGhlIGZhbGxiYWNrKS4gT25lLXNob3QgKyBvbmx5XG4gICAqIGF0dGFjaGVkIG9uIGEgZnJlc2ggbW91bnQsIHNvIHNsaWNlLXNjcnViIHJlLW9wZW5zIGtlZXAgdGhlIHVzZXIncyB6b29tLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXRXaGVuQ29udGFpbmVyU2l6ZWQoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmVmaXQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIWVsIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHJldHVybjsgLy8gYWxyZWFkeSBzaXplZCDigJQgdGltZWQgcmVmaXRzIHN1ZmZpY2VcbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgcm8uZGlzY29ubmVjdCgpO1xuICAgICAgICByZWZpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJvLm9ic2VydmUoZWwpO1xuICAgIC8vIFNhZmV0eSBuZXQ6IHN0b3Agb2JzZXJ2aW5nIGV2ZW4gaWYgaXQgbmV2ZXIgZ2FpbnMgYSBzaXplLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcm8uZGlzY29ubmVjdCgpLCA1MDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gdGlsZSBzb3VyY2UgYnVpbHQgZnJvbSB0aGUgZGVzY3JpcHRvci4gT1NEIG51bWJlcnMgbGV2ZWxzXG4gICAqIGNvYXJzZXN0LWZpcnN0OyB0aGUgYmFja2VuZCBudW1iZXJzIHJlc29sdXRpb25zIGZ1bGwtcmVzLWZpcnN0LCBzb1xuICAgKiBgcmVzID0gKGxldmVscy0xKSAtIG9zZExldmVsYC4gT3ZlcnJpZGluZyBnZXRMZXZlbFNjYWxlL2dldE51bVRpbGVzIGxldHMgdXNcbiAgICogaG9ub3VyIEJpby1Gb3JtYXRzJyBhY3R1YWwgcGVyLWxldmVsIGRpbWVuc2lvbnMgKG5vdCBhc3N1bWUgcG93ZXItb2YtdHdvKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUaWxlU291cmNlKGQ6IFRpbGVEZXNjcmlwdG9yLCBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IGFueSB7XG4gICAgLy8gTXVsdGljaGFubmVsIGltYWdlcyBjb21wb3NpdGUgZnJvbSBwZXItY2hhbm5lbCB0aWxlcywgd2hpY2ggb25seSBleGlzdCBhdFxuICAgIC8vIHJlYWwgQmlvLUZvcm1hdHMgcmVzb2x1dGlvbnMg4oCUIHNvIGRyaXZlIE9TRCBvZmYgdGhlIHJlYWwgbGV2ZWxzIGFsb25lIGFuZFxuICAgIC8vIHNraXAgdGhlIHN5bnRoZXRpYyAoc2VydmVyLWNvbXBvc2l0ZWQpIG92ZXJ2aWV3cy4gRXZlcnkgZGlzcGxheWVkIHRpbGUgaXNcbiAgICAvLyB0aGVuIHBlci1jaGFubmVsLWZldGNoYWJsZSBhdCBhbnkgem9vbS5cbiAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmlzTXVsdGlDaGFubmVsID8gZC5sZXZlbHMuc2xpY2UoMCwgdGhpcy5yZWFsTGV2ZWxzKSA6IGQubGV2ZWxzO1xuICAgIGNvbnN0IG4gPSBsZXZlbHMubGVuZ3RoO1xuICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaTtcblxuICAgIC8vIE9TRCBsZXZlbCBpICgwID0gY29hcnNlc3QpIDwtPiBiYWNrZW5kIHJlc29sdXRpb24gKG4tMS1pKSAocmVzIDAgPSBmdWxsKS5cbiAgICAvLyBUaGUgYmFja2VuZCBweXJhbWlkIGlzIE5PVCBuZWNlc3NhcmlseSBwb3dlci1vZi10d28sIHNvIHdlIGRyaXZlIE9TRCBvZmZcbiAgICAvLyB0aGUgYmFja2VuZCdzIHJlYWwgcGVyLWxldmVsIGRpbWVuc2lvbnMuIFdlIG92ZXJyaWRlIE9OTFkgZ2V0TGV2ZWxTY2FsZTpcbiAgICAvLyBPU0QgZGVyaXZlcyBnZXROdW1UaWxlcywgZ2V0VGlsZUJvdW5kcyBBTkQgaXRzIHBlci16b29tIGxldmVsIHNlbGVjdGlvblxuICAgIC8vIGZyb20gZ2V0TGV2ZWxTY2FsZSwgc28gdGhleSBhbGwgc3RheSBjb25zaXN0ZW50IOKAlCByZXF1ZXN0aW5nIGV4YWN0bHkgdGhlXG4gICAgLy8gdGlsZXMgZWFjaCByZXNvbHV0aW9uIGFjdHVhbGx5IGhhcyAobm8gb3V0LW9mLXJhbmdlIDQwMHMsIG5vIGZsb29kKS5cbiAgICBjb25zdCByZXNGb3JMZXZlbCA9IChsZXZlbDogbnVtYmVyKSA9PiBuIC0gMSAtIGxldmVsO1xuICAgIGNvbnN0IHRzOiBhbnkgPSBuZXcgKE9TRCBhcyBhbnkpLlRpbGVTb3VyY2Uoe1xuICAgICAgd2lkdGg6IGQud2lkdGgsXG4gICAgICBoZWlnaHQ6IGQuaGVpZ2h0LFxuICAgICAgdGlsZVNpemU6IHQsXG4gICAgICB0aWxlT3ZlcmxhcDogMCxcbiAgICAgIG1pbkxldmVsOiAwLFxuICAgICAgbWF4TGV2ZWw6IG4gLSAxLFxuICAgIH0pO1xuICAgIHRzLmdldExldmVsU2NhbGUgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICByZXR1cm4gbHZsID8gbHZsLndpZHRoIC8gZC53aWR0aCA6IDE7XG4gICAgfTtcbiAgICAvLyBEcml2ZSB0aGUgdGlsZSBDT1VOVCBvZmYgZWFjaCBsZXZlbCdzIG93biAoaW5kZXBlbmRlbnRseS1yb3VuZGVkKSBkaW1lbnNpb25zLFxuICAgIC8vIG5vdCBPU0QncyBkZWZhdWx0IGBjZWlsKHNjYWxlICogZnVsbERpbWVuc2lvbiAvIHRpbGVTaXplKWAuIFN5bnRoZXRpYyBBTkQgcmVhbFxuICAgIC8vIEJpby1Gb3JtYXRzIGxldmVscyBhcmVuJ3QgZXhhY3QgcHJvcG9ydGlvbmFsIHNjYWxlcyBvZiB0aGUgZnVsbCBpbWFnZSwgc29cbiAgICAvLyBgc2NhbGUgKiBmdWxsSGVpZ2h0YCBjYW4gcm91bmQgdXAgdG8gb25lIG1vcmUgcm93IChvciBjb2x1bW4pIHRoYW4gdGhlIGxldmVsXG4gICAgLy8gYWN0dWFsbHkgaGFzIOKAlCBPU0QgdGhlbiByZXF1ZXN0cyBhbiBvdXQtb2YtcmFuZ2UgdGlsZSB0aGF0IHRoZSBzZXJ2ZXIgNDAwc1xuICAgIC8vIChcIlRpbGUgKGNvbCxyb3cpIG91dCBvZiByYW5nZVwiKS4gVXNpbmcgdGhlIGxldmVsJ3MgcmVhbCB3L2ggbWF0Y2hlcyB0aGVcbiAgICAvLyBzZXJ2ZXIncyBvd24gYm91bmRzIGNoZWNrIGV4YWN0bHkuXG4gICAgY29uc3QgUG9pbnQgPSAoT1NEIGFzIGFueSkuUG9pbnQ7XG4gICAgdHMuZ2V0TnVtVGlsZXMgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICBpZiAoIWx2bCkgcmV0dXJuIG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUG9pbnQoTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICB9O1xuICAgIHRzLmdldFRpbGVVcmwgPSAobGV2ZWw6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XG4gICAgICBidWlsZFRpbGVVcmwoYmFzZSwgaW5mb0I2NCwgeyByZXM6IHJlc0ZvckxldmVsKGxldmVsKSwgY29sOiB4LCByb3c6IHksIHosIHRpbGVTaXplOiB0LCBjaGFubmVsIH0pO1xuICAgIHJldHVybiB0cztcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgZGlzcGxheSBwaXBlbGluZSAod2luZG93L2dhbW1hL2NvbG91ci9pbnZlcnQpIGFmdGVyIGEgc3RhdGUgY2hhbmdlLlxuICAgKiAgTXVsdGljaGFubmVsIGludmFsaWRhdGVzIE9OTFkgdGhlIHZpc2libGUgc2xpY2UncyBjaGFubmVsIGltYWdlcyDigJQgaW52YWxpZGF0aW5nXG4gICAqICB0aGUgd2hvbGUgd29ybGQgd291bGQgcmUtcHJvY2VzcyBldmVyeSBoaWRkZW4vcHJlbG9hZGVkIHNsaWNlJ3MgdGlsZXMgKGh1bmRyZWRzKSxcbiAgICogIGZsb29kaW5nIE9TRCB3aXRoIFwiW0NhY2hlUmVjb3JkXSDigKYgSW52YWxpZFN0YXRlRXJyb3JcIiBhbmQgd2FzdGluZyB3b3JrIG9uIHRpbGVzXG4gICAqICB0aGF0IGFyZW4ndCBvbiBzY3JlZW4uIFRoZSBvdGhlciBjYWNoZWQgc2xpY2VzIGFyZSBtYXJrZWQgc3RhbGUgYW5kIHJlLXRpbnRlZFxuICAgKiAgbGF6aWx5IHdoZW4gcmV2ZWFsZWQuIENvbXBvc2l0ZS9ncmF5c2NhbGUgaW52YWxpZGF0ZSB0aGUgd29ybGQgYXMgYmVmb3JlLiAqL1xuICAvKiogQ29sbGFwc2UgYSBidXJzdCBvZiBkaXNwbGF5LXN0YXRlIGNoYW5nZXMgaW50byBPTkUgaW52YWxpZGF0aW9uIG9uIHRoZSBuZXh0XG4gICAqICBmcmFtZS4gRHJhZ2dpbmcgYSB3aW5kb3cgc2xpZGVyIGVtaXRzIHBlciBwaXhlbCBvZiB0cmF2ZWwsIGFuZCBlYWNoIHJvdW5kXG4gICAqICByZXN0b3JlcyBhbmQgcmUtcHJvY2Vzc2VzIGV2ZXJ5IHRpbGUgb2YgZXZlcnkgY2hhbm5lbCDigJQgc28gdGhlIGJ1cnN0IGlzIGJvdGhcbiAgICogIHdhc3RlZCB3b3JrIGFuZCB0aGUgcmFjZSB0aGF0IGJyZWFrcyBjYWNoZSByZWNvcmRzIChzZWUge0BsaW5rIGRpc3BsYXlUb2tlbn0pLlxuICAgKiAgVGhlIHN0b3JlIHdyaXRlIHN0YXlzIGxpdmUsIHNvIHRoZSBwYW5lIGl0c2VsZiByZW1haW5zIHJlc3BvbnNpdmUuICovXG4gIHByaXZhdGUgc2NoZWR1bGVJbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHJldHVybjsgLy8gYWxyZWFkeSBxdWV1ZWQgZm9yIHRoaXMgZnJhbWVcbiAgICBjb25zdCByYWYgPVxuICAgICAgdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA6IChjYjogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IHNldFRpbWVvdXQoKCkgPT4gY2IoMCksIDE2KSBhcyB1bmtub3duIGFzIG51bWJlcjtcbiAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSByYWYoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZURpc3BsYXkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZURpc3BsYXkoKTogdm9pZCB7XG4gICAgLy8gU3VwZXJzZWRlIGFueSBpbi1mbGlnaHQgcmVjb2xvciByb3VuZCBiZWZvcmUgcmVzdGFydGluZyBvbmUgKHNlZSBkaXNwbGF5VG9rZW4pLlxuICAgIHRoaXMuZGlzcGxheVRva2VuKys7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2FjaGUuaW52YWxpZGF0ZUNoYW5uZWxEaXNwbGF5KHRoaXMuY3VycmVudFopO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkgeyB2LndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICAgIHRyeSB7IHYubmF2aWdhdG9yPy53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7IH0gY2F0Y2ggeyAvKiBuby1vcCAqLyB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaWV3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgIC8vIFRlYXIgZG93biBhbnkgYWN0aXZlIHRvb2wgb3ZlcmxheXMgKHNoYXJlZCBzaW5nbGV0b25zKS5cbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICBpZiAodGhpcy5vdmVybGF5KSB7XG4gICAgICB0aGlzLm92ZXJsYXkuZGVzdHJveSgpO1xuICAgICAgdGhpcy5vdmVybGF5ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2NhbGVCYXIpIHtcbiAgICAgIHRoaXMuc2NhbGVCYXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdlcikge1xuICAgICAgdGhpcy52aWV3ZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy52aWV3ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlLnJlc2V0KCk7XG4gICAgdGhpcy5zYW1wbGVyLmNsZWFyKCk7XG4gIH1cblxuICAvKiogVGhpcyBiYWNrZW5kJ3MgcmVnaW9uIHJlbmRlcmVyICh0aGUgU1ZHIG92ZXJsYXkpLCBvbmNlIGEgcGxvdCBpcyBtb3VudGVkLiAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheTtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyBpc29zdXJmYWNlLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyAzRCBzY2VuZXMsIHNvIG5vIGNvbnRyb2xzLiAqL1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyBMSU5FIGludGVuc2l0eSBST0lzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHRvT3ZlcmxheU1vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiBSZWdpb25Ub29sTW9kZSB7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlICdkcmF3cmVjdCc6XG4gICAgICAgIHJldHVybiAnZHJhd3JlY3QnO1xuICAgICAgY2FzZSAnZHJhd2Nsb3NlZHBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdjbG9zZWRwYXRoJztcbiAgICAgIGNhc2UgJ2RyYXdvcGVucGF0aCc6XG4gICAgICAgIHJldHVybiAnZHJhd29wZW5wYXRoJztcbiAgICAgIGNhc2UgJ2RyYXdwb2x5Z29uJzpcbiAgICAgICAgcmV0dXJuICdkcmF3cG9seWdvbic7XG4gICAgICBjYXNlICdhZGRwb2ludCc6XG4gICAgICAgIHJldHVybiAnYWRkcG9pbnQnO1xuICAgICAgY2FzZSAnZGVsZXRlcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2RlbGV0ZXBvaW50JztcbiAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICByZXR1cm4gJ21vdmUnO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuICdzZWxlY3QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdub25lJztcbiAgICB9XG4gIH1cblxuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIGhvc3QgcmUtZHJpdmVzIHBsb3QoKSB2aWEgdGhlIGltYWdlLWluZm8gc3RyZWFtICovXG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gIH1cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IHZwID0gdGhpcy52aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghdnApIHJldHVybjtcbiAgICAvLyBLZWVwIHRoZSB1c2VyJ3MgY3VycmVudCB2aWV3IGFjcm9zcyBhIGNvbnRhaW5lci9zcGxpdCByZXNpemUgaW5zdGVhZCBvZlxuICAgIC8vIHNuYXBwaW5nIGhvbWUuIFZpZXdwb3J0IGJvdW5kcyBhcmUgaW1hZ2UtcmVsYXRpdmUgKGltYWdlIHdpZHRoID0gMSksIHNvXG4gICAgLy8gdGhleSdyZSBpbmRlcGVuZGVudCBvZiB0aGUgY29udGFpbmVyJ3MgcGl4ZWwgc2l6ZSDigJQgY2FwdHVyZSB0aGUgdmlzaWJsZVxuICAgIC8vIHJlZ2lvbiBub3cgYW5kIHJlLWZpdCBpdCBvbmNlIHRoZSBuZXcgc2l6ZSBoYXMgc2V0dGxlZC4gT1NEJ3MgYXV0b1Jlc2l6ZVxuICAgIC8vIGZpcmVzIGFzeW5jaHJvbm91c2x5IGFuZCB0aGUgYW5ndWxhci1zcGxpdCB0cmFuc2l0aW9uIGFuaW1hdGVzIHRoZSB3aWR0aFxuICAgIC8vIG92ZXIgYSBmZXcgaHVuZHJlZCBtcywgc28gcmVzdG9yZSBvbiB0aGUgbmV4dCBmcmFtZSBhbmQgYWdhaW4gYWZ0ZXIgdGhlXG4gICAgLy8gdHJhbnNpdGlvbiBjb21wbGV0ZXMuXG4gICAgY29uc3QgYm91bmRzID0gdnAuZ2V0Qm91bmRzKHRydWUpO1xuICAgIGNvbnN0IHJlc3RvcmUgPSAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZml0Qm91bmRzKGJvdW5kcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIHZpZXdlciB0b3JuIGRvd24gKi9cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXN0b3JlKTtcbiAgICBzZXRUaW1lb3V0KHJlc3RvcmUsIDM1MCk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgfVxuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmdvSG9tZSgpO1xuICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQkLm5leHQoJ2F1dG9zY2FsZScpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEuMyk7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmFwcGx5Q29uc3RyYWludHMoKTtcbiAgfVxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC56b29tQnkoMSAvIDEuMyk7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmFwcGx5Q29uc3RyYWludHMoKTtcbiAgfVxuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIC8vIFJlY3RhbmdsZS9wb2x5Z29uIGRyYXdpbmcgcnVuIG9uIHRoZSBTVkcgb3ZlcmxheTsgd2FuZC9lcmFzZXIvem9vbS1ib3hcbiAgICAvLyAoY3VzdG9tIFBsb3RseSBvdmVybGF5cykgYXJlIHJvdXRlZCB0byBQbG90bHkgYnkgdGhlIHJvdXRlciBhbmQgYXJlbid0XG4gICAgLy8gaGFuZGxlZCBoZXJlIHlldC5cbiAgICB0aGlzLm92ZXJsYXk/LnNldE1vZGUodGhpcy50b092ZXJsYXlNb2RlKG1vZGUpKTtcbiAgfVxuXG4gIHNldFNob3dTdGFjayhfc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogT1NEIG5hdmlnYXRlcyB0aGUgc3RhY2sgdmlhIHRoZSB6LXNsaWRlciAtPiBzZXRaSW5kZXggKi9cbiAgfVxuXG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvci4gU3RvcmVkIGZvciB0aGUgbmV4dCB2aWV3ZXIgY3JlYXRpb24sIGFuZFxuICAgKiAgYXBwbGllZCBsaXZlIHdoZW4gYSB2aWV3ZXIgaXMgYWxyZWFkeSBtb3VudGVkIChoaWRlcy9yZXZlYWxzIGl0cyBlbGVtZW50IOKAlFxuICAgKiAgdGhlIG5hdmlnYXRvciBpbnN0YW5jZSBpdHNlbGYgb25seSBleGlzdHMgd2hlbiBjcmVhdGVkIHdpdGggc2hvd05hdmlnYXRvcikuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XG4gICAgY29uc3QgbmF2RWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/Lm5hdmlnYXRvcj8uZWxlbWVudDtcbiAgICBpZiAobmF2RWwpIG5hdkVsLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICAvKiogVG9nZ2xlIGJpbGluZWFyIHNtb290aGluZyB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzKS4gU3RvcmVkIGZvciB0aGVcbiAgICogIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmQgYXBwbGllZCBsaXZlICh3aXRoIGEgcmVkcmF3KSB0byBhIG1vdW50ZWQgdmlld2VyLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc21vb3RoaW5nRW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgY29uc3QgZHJhd2VyOiBhbnkgPSAodGhpcy52aWV3ZXIgYXMgYW55KT8uZHJhd2VyO1xuICAgIGlmIChkcmF3ZXI/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCkge1xuICAgICAgZHJhd2VyLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICAgIHRoaXMudmlld2VyPy5mb3JjZVJlZHJhdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHRoZSBkaXNwbGF5ZWQgei1zbGljZSBsaXZlLiBTbGljZXMgYXJlIGtlcHQgYXMgc2VwYXJhdGUgdGlsZWQgaW1hZ2VzIGluXG4gICAqIHRoZSB3b3JsZCwgc28gc3dpdGNoaW5nIGlzIGp1c3QgYW4gb3BhY2l0eSB0b2dnbGU6IGEgcHJldmlvdXNseS12aXNpdGVkIHNsaWNlXG4gICAqIHNob3dzIGluc3RhbnRseSAoaXRzIGRlY29kZWQgKyByZWNvbG9yZWQgdGlsZXMgYXJlIHN0aWxsIHJlc2lkZW50KSwgYW5kIGFcbiAgICogbmV2ZXItc2VlbiBzbGljZSBpcyBhZGRlZCBvbmNlLiBUaGUgcmVnaW9uIG92ZXJsYXksIGNvb3JkaW5hdGUgdHJhbnNmb3JtLFxuICAgKiBzY2FsZSBiYXIsIGNvbG9ybWFwIHBpcGVsaW5lIGFuZCBjdXJyZW50IHpvb20vcGFuIGFsbCBwZXJzaXN0IOKAlCB0aGUgeC95XG4gICAqIGdlb21ldHJ5IGlzIGlkZW50aWNhbCBhY3Jvc3Mgc2xpY2VzLlxuICAgKlxuICAgKiBTaW1wbGUgbW9kZSAodGlsZWQ6ZmFsc2Ug4oCUIGEgbnVtYmVyZWQgaW1hZ2Ugc2VyaWVzIGFzc2VtYmxlZCBjbGllbnQtc2lkZSxcbiAgICogZWFjaCBzbGljZSBpdHMgb3duIGNvbXBsZXRlIGltYWdlIHdpdGggbm8gc2hhcmVkIHRpbGUgc2VydmVyKSBoYXMgbm9cbiAgICogcHlyYW1pZCB0byB0b2dnbGUgb3BhY2l0eSBvbiwgc28gaXQgcmUtb3BlbnMgdGhlIHZpZXdlciBvbiB0aGUgbmV3XG4gICAqIHNsaWNlJ3MgVVJMIGluc3RlYWQuIHByZXNlcnZlVmlld3BvcnQgKHZpZXdlciBvcHRpb24sIHNlZSBwbG90KCkpIGtlZXBzXG4gICAqIHRoZSBjdXJyZW50IHpvb20vcGFuIGFjcm9zcyB0aGF0IHJlb3Blbi5cbiAgICovXG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHogPSB6SW5kZXggfHwgMDtcbiAgICBpZiAoeiA9PT0gdGhpcy5jdXJyZW50WikgcmV0dXJuO1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodGhpcy5zaW1wbGVNb2RlKSB7XG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgY29uc3QgdXJscyA9IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbel0gPz8gdGhpcy5zaW1wbGVDaGFubmVsVXJsc1swXTtcbiAgICAgICAgaWYgKCF1cmxzKSByZXR1cm47XG4gICAgICAgIHRoaXMuY3VycmVudFogPSB6O1xuICAgICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFNpbXBsZUNoYW5uZWxQbGFuZXModXJscyk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVNdWx0aWNoYW5uZWxIaXN0b2dyYW1zKHosIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyk7XG4gICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50WiAhPT0geiB8fCAhdGhpcy52aWV3ZXIgfHwgIXVybCkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmwgfSBhcyBhbnkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByYXdVcmwgPSB0aGlzLnNpbXBsZVVybHNbel0gPz8gdGhpcy5zaW1wbGVVcmxzWzBdO1xuICAgICAgaWYgKCFyYXdVcmwpIHJldHVybjtcbiAgICAgIHRoaXMuY3VycmVudFogPSB6O1xuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAvLyBGZXRjaGVkIHZpYSBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgKGF1dGggaW50ZXJjZXB0b3IgYXBwbGllcykgdGhlblxuICAgICAgLy8gdXBzY2FsZWQgdG8gZnVsbC1yZXMgKHNhbWUgYXMgdGhlIGluaXRpYWwgbG9hZCDigJQgc2VlIHRvRnVsbFJlc1VybCkgc29cbiAgICAgIC8vIHRoZSB3b3JsZCBzdGF5cyBmdWxsLXJlcyBhY3Jvc3Mgc2xpY2VzIGFuZCBST0lzIGtlZXAgYWxpZ25pbmcuIEd1YXJkXG4gICAgICAvLyBhZ2FpbnN0IGEgbmV3ZXIgc2NydWIgbGFuZGluZyBmaXJzdC5cbiAgICAgIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwocmF3VXJsKVxuICAgICAgICAudGhlbigocHJldmlld1VybCkgPT5cbiAgICAgICAgICB0aGlzLnRvRnVsbFJlc1VybChwcmV2aWV3VXJsLCB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IDAsIHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IDApLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKCh1cmwpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50WiAhPT0geiB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5hZGRPbmNlSGFuZGxlcignb3Blbi1mYWlsZWQnLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIHJlLW9wZW4gZmFpbGVkJywgZT8ubWVzc2FnZSA/PyBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgICB2b2lkIHRoaXMuc2FtcGxlU2ltcGxlSGlzdG9ncmFtKHVybCwgeik7IC8vIHJlLWJpbiB0aGUgc2NydWJiZWQgc2xpY2VcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUud2FybignW09TRF0gc2xpY2UgZmV0Y2ggZmFpbGVkJywgZXJyKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kZXNjcmlwdG9yIHx8ICF0aGlzLmluZm9CNjQpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDsgLy8gd2FuZCByZWFkYmFjayBpcyBzbGljZS1zcGVjaWZpY1xuICAgIHRoaXMuY2FjaGUuc2hvd1NsaWNlKHopO1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXModGhpcy5kZXNjcmlwdG9yLCB0aGlzLmluZm9CNjQsIHopO1xuICAgIH1cbiAgfVxuXG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChzdGFja0xvYWRpbmcpO1xuICB9XG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3IgPyB7IHdpZHRoOiB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGhlaWdodDogdGhpcy5kZXNjcmlwdG9yLmhlaWdodCB9IDogbnVsbDtcbiAgfVxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHBpeGVscyDigJQgdGhlIHJlbmRlcmVkIHZpZXdwb3J0ICh3aGF0IHRoZSB1c2VyIHNlZXMsXG4gICAqIGluY2x1ZGluZyB0aGUgY3VycmVudCB6b29tIGFuZCBhbnkgY29sb3JtYXAgcmVjb2xvciksIGFzIFJHQkEuIEZlZWRzIHRoZVxuICAgKiBwcm9jZXNzaW5nLXBpcGVsaW5lIGRpYWxvZydzIFwidXNlIGN1cnJlbnQgdmlld1wiLiBSZXR1cm5zIG51bGwgdW50aWwgdGlsZXNcbiAgICogYXJlIGRyYXduLlxuICAgKi9cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQgPSAodGhpcy52aWV3ZXIgYXMgYW55KT8uZHJhd2VyPy5jYW52YXM7XG4gICAgaWYgKCFjYW52YXMgfHwgIWNhbnZhcy53aWR0aCB8fCAhY2FudmFzLmhlaWdodCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY2FudmFzO1xuICAgIGNvbnN0IGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHM6IDQsIGRhdGE6IGltZy5kYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogSW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlIHRoZSBkcmF3ZXIgY2FudmFzICh3aGF0IHtAbGluayBnZXREaXNwbGF5ZWRQaXhlbERhdGF9XG4gICAqIHJlYWRzKSBjdXJyZW50bHkgY292ZXJzLiBVbmxpa2Uge0BsaW5rIGVtaXRWaWV3cG9ydENoYW5nZX0sIHRoaXMgaXMgTk9UXG4gICAqIGNsYW1wZWQgdG8gdGhlIGltYWdlIGJvdW5kczogdGhlIGNhbnZhcyBtYXBzIDE6MSB0byB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlLFxuICAgKiBzbyBsZWF2aW5nIGl0IHVuY2xhbXBlZCBrZWVwcyBgY2FudmFzUHggLT4gaW1hZ2VQeGAgYW4gZXhhY3QgYWZmaW5lIG1hcFxuICAgKiAoY2xhbXBpbmcgd291bGQgc2tldyBjb29yZGluYXRlcyBuZWFyIHRoZSBpbWFnZSBlZGdlcykuIFJvdXRlZCB0aHJvdWdoIHdvcmxkXG4gICAqIGl0ZW0gMCAoc2VlIHtAbGluayB2aWV3cG9ydFJlY3RUb0ltYWdlfSkgZm9yIG11bHRpLWxheWVyIGFjY3VyYWN5LlxuICAgKi9cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdnA6IGFueSA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwIHx8ICF0aGlzLmRlc2NyaXB0b3IpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gdmlld3BvcnRSZWN0VG9JbWFnZSh0aGlzLnZpZXdlciwgdnAuZ2V0Qm91bmRzKHRydWUpKTtcbiAgICAgIHJldHVybiB7IHg6IHIueCwgeTogci55LCB3aWR0aDogci53aWR0aCwgaGVpZ2h0OiByLmhlaWdodCB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkIHtcbiAgICAvLyBTbmFwc2hvdCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIE9TRCB2aWV3IGFzIGEgUE5HIChXWVNJV1lHKSDigJQgdGhlIHBhcmFsbGVsXG4gICAgLy8gdG8gUGxvdGx5J3MgZG93bmxvYWRJbWFnZS4gT1NEIHVzZXMgdGhlIDJEIGNhbnZhcyBkcmF3ZXIgYW5kIGJha2VzIHRoZVxuICAgIC8vIGFjdGl2ZSBkaXNwbGF5IHNldHRpbmdzICh3aW5kb3cgLyBnYW1tYSAvIGNvbG9ybWFwIC8gcGVyLWNoYW5uZWwgY29sb3VycyAvXG4gICAgLy8gaW52ZXJ0KSBpbnRvIHRoZSB0aWxlcyB2aWEgdGhlIHJlY29sb3IgcGlwZWxpbmUsIHNvIHRoZSBkcmF3ZXIgY2FudmFzXG4gICAgLy8gYWxyZWFkeSByZWZsZWN0cyBleGFjdGx5IHdoYXQncyBvbiBzY3JlZW4gYXQgdGhlIGN1cnJlbnQgem9vbS9wYW4uIFRoZVxuICAgIC8vIGZ1bGwtcmVzb2x1dGlvbiBzdGl0Y2hlZCBleHBvcnQgbGl2ZXMgaW4gZXhwb3J0Q29tcG9zaXRlKCkgKENoYW5uZWxzICZcbiAgICAvLyBIaXN0b2dyYW0gZGlhbG9nKS5cbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybjtcbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19LnBuZ2ApO1xuICAgIH0sICdpbWFnZS9wbmcnKTtcbiAgfVxuXG4gIHNldFBsb3RUeXBlKF9wbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICAvKiBPU0Qgb25seSByZW5kZXJzIHRoZSBpbWFnZSB0eXBlICovXG4gIH1cbiAgc2V0U3VyZmFjZURyYWdNb2RlKF9tb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvKiAzRCBub3Qgc3VwcG9ydGVkIGJ5IE9TRCAqL1xuICB9XG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICAvKiAzRCBub3Qgc3VwcG9ydGVkIGJ5IE9TRCAqL1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRvc2NhbGVFdmVudCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogVmlzaWJsZSBpbWFnZSByZWdpb24gKGZ1bGwtaW1hZ2UgcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3XG4gICAqICBzZXR0bGVzLiBUaGUgaW50ZW5zaXR5IGluc2V0IHJlLXNhbXBsZXMgdGhpcyByZWdpb24gYXQgdGhlIHpvb20gcmVzb2x1dGlvbi4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBpbnRlbnNpdHkgc2FtcGxpbmcgbGl2ZXMgaW4gdGhlIFBsb3RseVxuICAgKiAgYmFja2VuZCAoaXQgb3ducyBwaXhlbCByZWFkYmFjaykuIE9TRCBmZWVkcyBpdCBvbmx5IHZpYSBnZXRWaWV3cG9ydENoYW5nZSQ7XG4gICAqICB0aGUgc2FtcGxpbmctY2FjaGUgcHJpbWluZyBpdHNlbGYgaXMgYSBuby1vcCBoZXJlLiAqL1xuICBhc3luYyBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhfaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCBfekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIHtAbGluayBJSW50ZW5zaXR5U2FtcGxpbmd9IHN0dWIg4oCUIHNlZSB7QGxpbmsgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmd9LiAqL1xuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF96SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8qIG5vLW9wOiBQbG90bHkgb3ducyBpbnRlbnNpdHkgc2FtcGxpbmcgKHNlZSBJSW50ZW5zaXR5U2FtcGxpbmcpICovXG4gIH1cblxuICAvKiogQ29tcHV0ZSB0aGUgY3VycmVudCB2aWV3cG9ydCdzIGltYWdlLXBpeGVsIHJlY3RhbmdsZSAoY2xhbXBlZCB0byB0aGUgaW1hZ2UpXG4gICAqICBhbmQgYnJvYWRjYXN0IGl0LiAqL1xuICBwcml2YXRlIGVtaXRWaWV3cG9ydENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2cDogYW55ID0gdGhpcy52aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghdnAgfHwgIXRoaXMuZGVzY3JpcHRvcikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAob3NkLWNvb3Jkcyk6IHZwLnZpZXdwb3J0VG9JbWFnZVJlY3RhbmdsZSBpc1xuICAgICAgLy8gaW5hY2N1cmF0ZSBhbmQgd2FybnMgd2hlbiB0aGUgd29ybGQgaG9sZHMgbXVsdGlwbGUgaW1hZ2VzIChwZXItY2hhbm5lbFxuICAgICAgLy8gbXVsdGljaGFubmVsIGxheWVycyksIHdoaWNoIGZlZCB0aGUgaW50ZW5zaXR5IGluc2V0IGEgd3JvbmcgUk9JLlxuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICBjb25zdCBpdyA9IHRoaXMuZGVzY3JpcHRvci53aWR0aCwgaWggPSB0aGlzLmRlc2NyaXB0b3IuaGVpZ2h0O1xuICAgICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGl3LCByLngpKTtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpaCwgci55KSk7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGl3IC0geCwgci53aWR0aCkpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oaWggLSB5LCByLmhlaWdodCkpO1xuICAgICAgdGhpcy52aWV3cG9ydENoYW5nZSQubmV4dCh7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiB2aWV3cG9ydCBub3QgcmVhZHkgKi9cbiAgICB9XG4gIH1cblxuICAvKiogT1NEIHRhcmdldHMgdGhlIGltYWdlIGRpc3BsYXk7IHRoZSBzY2FsYXIvM0QgcGxvdCB0eXBlcyBiZWxvbmcgdG8gUGxvdGx5LiAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdIHtcbiAgICByZXR1cm4gW1BMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5IRUFUTUFQXSFdO1xuICB9XG5cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICAvKiogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZTsgdGhlIExJTkUgaW50ZW5zaXR5IGluc2V0IGlzIFBsb3RseS1vbmx5LiAqL1xuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBubyBMSU5FIG1vZGUgb24gT1NEICovXG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gbmFwYXJpLWpzKS4gVGhlIE9TRCByZWdpb25cbiAgLy8gb3ZlcmxheSAoY29uc3RydWN0ZWQgaW4gcGxvdCgpKSByZWFkcy93cml0ZXMgdGhhdCBzYW1lIHN0b3JlLCBzbyByZWdpb25zXG4gIC8vIHN0YXkgaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3I7IE9TRCByZW5kZXJzIHRoZW0gYXMgYW4gU1ZHXG4gIC8vIG92ZXJsYXkgcmF0aGVyIHRoYW4gY2FycnlpbmcgUGxvdGx5IHNoYXBlIGRpY3RzLlxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFdhbmQgKyB2ZXJ0ZXggZXJhc2VyIHJ1biBvdmVyIE9TRCB2aWEgSUNvb3JkaW5hdGVUcmFuc2Zvcm0uIFRoZXkgc2hhcmUgdGhlXG4gIC8vIHNpbmdsZXRvbiB0b29sIHNlcnZpY2VzIHdpdGggUGxvdGx5LCBzbyB3ZSByZS1iaW5kIHRvIG91ciBob3N0cyBvbiBhY3RpdmF0ZS5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogYW55KTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRha2UgdGhlIHBvaW50ZXIgZnJvbSBPU0Qgc28gdGhlIGRyYWcgZHJhd3MgaW5zdGVhZCBvZiBwYW5uaW5nLiAoTmF2IGlzXG4gICAgLy8gcmUtZW5hYmxlZCB3aGVuIHRoZSByZWdpb24gb3ZlcmxheSByZXR1cm5zIHRvICdub25lJyBvbiB0b29sIHN3aXRjaC4pXG4gICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7XG4gICAgLy8gVGhlIHdhbmQgc2FtcGxlcyB0aGUgcmVuZGVyZWQgdmlld3BvcnQg4oCUIHJlYWQgYmFjayBsYXppbHkgb24gZmlyc3QgdXNlLlxuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgIHRoaXMud2FuZFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKHRydWUsIChvcHRpb25zID8/IHt9KSBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRPcHRpb25zKG9wdGlvbnMgYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIGNsZWFyQWN0aXZlV2FuZFJlZ2lvbigpOiB2b2lkIHtcbiAgICB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCk7XG4gIH1cbiAgc2V0QnJ1c2hNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGFrZSB0aGUgcG9pbnRlciBmcm9tIE9TRCBzbyB0aGUgZHJhZyBwYWludHMgaW5zdGVhZCBvZiBwYW5uaW5nLlxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSBicnVzaCB3b3JrcyBpbiB0aGUgcmVuZGVyZWQtdmlld3BvcnQgY29vcmRpbmF0ZSBmcmFtZSDigJQgcmVhZCBpdCBiYWNrXG4gICAgLy8gbGF6aWx5IG9uIGZpcnN0IHVzZSwgbGlrZSB0aGUgd2FuZC4gSXQgc2hhcmVzIHRoZSB3YW5kJ3MgaG9zdC5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLmJydXNoVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKHRydWUsIChvcHRpb25zID8/IHt9KSBhcyBCcnVzaE9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRTaXplKChvcHRpb25zIGFzIEJydXNoT3B0aW9ucyk/LnNpemUgPz8gMCk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gdG9vbCB0YWtlcyB0aGUgcG9pbnRlclxuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICB0aGlzLmVyYXNlclRvb2wuYmluZEhvc3QodGhpcy5lcmFzZXJIb3N0KTtcbiAgICB9XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0UmFkaXVzKHJhZGl1cyk7XG4gIH1cbiAgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gdGhlIGJveCBkcmFnIG11c3Qgbm90IHBhblxuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gICAgaWYgKCFhY3RpdmUpIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQodHJ1ZSk7XG4gIH1cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU06IHNlZ21lbnQgdGhlIGRyYXduIHJlY3RhbmdsZXMuIFRoZSBTQU0gdG9vbCByZXVzZXMgdGhlXG4gICAqICB3YW5kIGhvc3QgKHZpZXdwb3J0IHJlYWRiYWNrICsgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyByZWdpb24gc3RvcmUpLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsOyAvLyBzZWdtZW50IGFnYWluc3QgdGhlIGN1cnJlbnQgdmlld3BvcnQgcmVhZGJhY2tcbiAgICB0aGlzLnNhbVRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgcmV0dXJuIHRoaXMuc2FtVG9vbC5zZWdtZW50Qm94ZXMoKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmNlbGxTZWdtZW50ZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIGNyb3AgYWdhaW5zdCB0aGUgY3VycmVudCB2aWV3cG9ydCByZWFkYmFja1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpOyAvLyBjbGlja3MgYWRkIHBvaW50cywgZG9uJ3QgcGFuXG4gICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIH1cbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jb21taXQoKTsgfVxuICBjbGVhclNhbVBvaW50cygpOiB2b2lkIHsgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTsgfVxuXG4gIC8qKiBCdWlsZCB0aGUgd2FuZC9lcmFzZXIgaG9zdCBvYmplY3RzIGJvdW5kIHRvIHRoaXMgYmFja2VuZC4gQm90aCB0b29scyBydW5cbiAgICogIG92ZXIgT1NEIHZpYSB0aGUgc2hhcmVkIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgYSB2aWV3cG9ydCBwaXhlbCByZWFkYmFjayxcbiAgICogIGFuZCByZWFkL3dyaXRlIHJlZ2lvbnMgZGlyZWN0bHkgb24gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSAobmV1dHJhbCBtb2RlbCkuICovXG4gIHByaXZhdGUgYnVpbGRUb29sSG9zdHMoKTogdm9pZCB7XG4gICAgdGhpcy53YW5kSG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHJlZ2lvbnMpID0+IHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zKSxcbiAgICAgIGdldENhY2hlZEltYWdlRGF0YTogKCkgPT4gdGhpcy5yZWFkYmFja1ZpZXdwb3J0KCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5nZXRPdmVybGF5Q29udGFpbmVyKCksXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMuY3VycmVudEZpbGVOYW1lLFxuICAgICAgZ2V0U2hhcGVDb2xvcjogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksXG4gICAgfTtcbiAgICB0aGlzLmVyYXNlckhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyZWdpb25zKSA9PiB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucyksXG4gICAgICBpbnZhbGlkYXRlV2FuZFJlZ2lvbjogKCkgPT4gdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5nZXRPdmVybGF5Q29udGFpbmVyKCksXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5yZWFkYmFja1ZpZXdwb3J0KCk/LnJhdGlvc1swXSA/PyAxLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIGVsZW1lbnQgdGhlIG9uLWNhbnZhcyB0b29sIG92ZXJsYXlzIGF0dGFjaCB0byAoT1NEIGlzIG1vdW50ZWQgaGVyZSkuICovXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBsb3REaXYgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBTaXplIHRoZSBuYXZpZ2F0b3IgZnJvbSB0aGUgQ1VSUkVOVCBjb250YWluZXIgKG5hdmlnYXRvclNpemVSYXRpbyBvZiB0aGVcbiAgICogIHZpZXdlciBlbGVtZW50KSBhbmQga2VlcCBpdCBwaW5uZWQgdG8gdGhlIGNvcm5lci4gT1NEIGNvbXB1dGVzIHRoZSBzaXplXG4gICAqICBvbmNlIGluIHRoZSBWaWV3ZXIgY29uc3RydWN0b3Ig4oCUIGJlZm9yZSB0aGUgaG9zdCBmbGV4IGxheW91dCBzZXR0bGVzIOKAlFxuICAgKiAgYW5kIG5ldmVyIGNvcnJlY3RzIGl0LCBsZWF2aW5nIGEgc3RhbGUtc2l6ZSBlbGVtZW50IHdob3NlIHZpc2libGUgbWluaW1hcFxuICAgKiAgZmxvYXRzIGFib3ZlIHRoZSBib3R0b20tcmlnaHQgY29ybmVyLiAqL1xuICBwcml2YXRlIHJlc2l6ZU5hdmlnYXRvcigpOiB2b2lkIHtcbiAgICBjb25zdCB2OiBhbnkgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBuYXYgPSB2Py5uYXZpZ2F0b3I7XG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdj8uZWxlbWVudDtcbiAgICBpZiAoIW5hdj8uZWxlbWVudCB8fCAhZWw/LmNsaWVudFdpZHRoIHx8ICFlbD8uY2xpZW50SGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3QgdyA9IE1hdGgucm91bmQoZWwuY2xpZW50V2lkdGggKiAwLjE2KTtcbiAgICBjb25zdCBoID0gTWF0aC5yb3VuZChlbC5jbGllbnRIZWlnaHQgKiAwLjE2KTtcbiAgICBpZiAobmF2LmVsZW1lbnQuc3R5bGUud2lkdGggIT09IGAke3d9cHhgIHx8IG5hdi5lbGVtZW50LnN0eWxlLmhlaWdodCAhPT0gYCR7aH1weGApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5hdi5zZXRXaWR0aCh3KTtcbiAgICAgICAgbmF2LnNldEhlaWdodChoKTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBuYXZpZ2F0b3IgdG9ybiBkb3duICovIH1cbiAgICB9XG4gICAgLy8gTm9ybWFsaXplIE9TRCdzIGNvbnRyb2wtY29ybmVyIHN0YWNrIHNvIHRoZSBtaW5pbWFwIHNpdHMgZmx1c2ggaW4gdGhlXG4gICAgLy8gY29ybmVyLCBpbnNldCAxMnB4IHRvIGxpbmUgdXAgd2l0aCB0aGUgc2NhbGUgYmFyOlxuICAgIC8vICAtIHRoZSBpbmxpbmUtYmxvY2sgd3JhcHBlciBjYXJyaWVzIGxpbmUtYm94IHN0cnV0cyBhbmQgY2FuIHJldGFpbiBzdGFsZVxuICAgIC8vICAgIHNpemluZyDihpIgbWFrZSBpdCBhIHRpZ2h0IGJsb2NrO1xuICAgIC8vICAtIGFueXRoaW5nIGVsc2UgT1NEIGxlZnQgaW4gdGhlIGNvcm5lciB3b3VsZCBzdGFjayBiZWxvdyB0aGUgbmF2aWdhdG9yXG4gICAgLy8gICAgYW5kIGZsb2F0IGl0IHVwIOKGkiBoaWRlIGl0O1xuICAgIC8vICAtIGluc2V0IHRoZSBjb3JuZXIgaXRzZWxmIChib3R0b20vcmlnaHQgMTJweCksIGtlZXBpbmcgdGhlIGVsZW1lbnQgaW5cbiAgICAvLyAgICBub3JtYWwgZmxvdy5cbiAgICBjb25zdCB3cmFwcGVyID0gbmF2LmVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgY29ybmVyID0gd3JhcHBlcj8ucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHdyYXBwZXIgJiYgY29ybmVyKSB7XG4gICAgICB3cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgd3JhcHBlci5zdHlsZS5saW5lSGVpZ2h0ID0gJzAnO1xuICAgICAgd3JhcHBlci5zdHlsZS5mb250U2l6ZSA9ICcwJztcbiAgICAgIC8vIFRoZSB3cmFwcGVyIGtlZXBzIHRoZSBuYXZpZ2F0b3IncyBzdGFsZSBwcmUtc2V0dGxlIGhlaWdodCBhcyBhblxuICAgICAgLy8gZXhwbGljaXQgc2l6ZSAodGhlIG5hdiB3YXMgMC4xNnggdGhlIFVOU0VUVExFRCBjb250YWluZXIgYXQgY3JlYXRpb24pLFxuICAgICAgLy8gbGVhdmluZyBhbiBlbXB0eSBiYW5kIHVuZGVyIHRoZSByZXNpemVkIG1pbmltYXAg4oCUIG1lYXN1cmVkIGxpdmU6XG4gICAgICAvLyBuYXZIPTg3IGluc2lkZSB3cmFwSD0xNjcuIEZvcmNlIGl0IHRvIGh1ZyBpdHMgY29udGVudC5cbiAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgd3JhcHBlci5zdHlsZS53aWR0aCA9ICdhdXRvJztcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbShjb3JuZXIuY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W10pIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSB3cmFwcGVyKSBjaGlsZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKHdyYXBwZXIuY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W10pIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSBuYXYuZWxlbWVudCkgY2hpbGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICAgIGNvcm5lci5zdHlsZS5ib3R0b20gPSAnMTJweCc7XG4gICAgICBjb3JuZXIuc3R5bGUucmlnaHQgPSAnMTJweCc7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24obmF2LmVsZW1lbnQuc3R5bGUsIHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHRvcDogJycsIGxlZnQ6ICcnLCBib3R0b206ICcnLCByaWdodDogJycsIG1hcmdpbjogJzAnIH0pO1xuICAgIC8vIFRPRE8oZGVidWcpOiByZW1vdmUgYWZ0ZXIgdmVyaWZpY2F0aW9uXG4gICAgY29uc3QgbmVyID0gbmF2LmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd3IgPSB3cmFwcGVyPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjciA9IGNvcm5lcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcGVyID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc29sZS53YXJuKGBbdml6Om5hdl0gbmF2Qm90dG9tPSR7TWF0aC5yb3VuZChuZXIuYm90dG9tKX0gd3JhcEJvdHRvbT0ke01hdGgucm91bmQod3I/LmJvdHRvbSA/PyAtMSl9IGAgK1xuICAgICAgYGNvcm5lckJvdHRvbT0ke01hdGgucm91bmQoY3I/LmJvdHRvbSA/PyAtMSl9IHBsb3RCb3R0b209JHtNYXRoLnJvdW5kKHBlci5ib3R0b20pfSBgICtcbiAgICAgIGBuYXZIPSR7TWF0aC5yb3VuZChuZXIuaGVpZ2h0KX0gd3JhcEg9JHtNYXRoLnJvdW5kKHdyPy5oZWlnaHQgPz8gLTEpfSBjb3JuZXJIPSR7TWF0aC5yb3VuZChjcj8uaGVpZ2h0ID8/IC0xKX1gKTtcbiAgfVxuXG4gIC8qKiBGb3JjZSB0aGUgZG9ja2VkIHRvb2xiYXIgdG8gcmVwYWludCBhZnRlciBhbiBPU0Qgem9vbS4gQ2hyb21lIGxlYXZlcyBpdFxuICAgKiAgbGFpZC1vdXQtYnV0LXVucGFpbnRlZCAodGhlIGNhbnZhcydzIGNvbXBvc2l0aW5nIGNodXJuIHN0cmFuZHMgdGhlIHRvb2xiYXInc1xuICAgKiAgcmFzdGVyKS4gQSBzeW5jaHJvbm91cyBkaXNwbGF5IHRvZ2dsZSByZS1yYXN0ZXJzIGl0IHdpdGggbm8gdmlzaWJsZSBnb25lLWZyYW1lXG4gICAqICBhbmQgbm8gbGF5b3V0IHNoaWZ0LiBMb2NhdGVkIHZpYSB0aGUgRE9NIHNpbmNlIHRoaXMgc2VydmljZSBkb2Vzbid0IG93biB0aGVcbiAgICogIHRvb2xiYXI7IGEgbm8tb3Agd2hlbiB0aGVyZSdzIG5vIHRvb2xiYXIgKGUuZy4gZW1iZWRkZWQgd2l0aG91dCBvbmUpLiAqL1xuICBwcml2YXRlIG51ZGdlVG9vbGJhclJlcGFpbnQoKTogdm9pZCB7XG4gICAgY29uc3QgcGxvdEVsID0gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG4gICAgY29uc3QgZG9jayA9IHBsb3RFbD8uY2xvc2VzdCgndmlzdWFsaXphdGlvbicpPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnRvb2xiYXItZG9jaycpO1xuICAgIGlmICghZG9jaykgcmV0dXJuO1xuICAgIGNvbnN0IHByZXYgPSBkb2NrLnN0eWxlLmRpc3BsYXk7XG4gICAgZG9jay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHZvaWQgZG9jay5vZmZzZXRIZWlnaHQ7IC8vIHJlZmxvdyBzbyB0aGUgdG9nZ2xlIHJlLXJhc3RlcnMgb24gdGhlIG5leHQgcGFpbnRcbiAgICBkb2NrLnN0eWxlLmRpc3BsYXkgPSBwcmV2O1xuICB9XG5cbiAgLyoqIEhvc3QgZm9yIHRoZSAoc2hhcmVkKSB6b29tLXRvLWJveCB0b29sOiBjb252ZXJ0IG92ZXJsYXkgcGl4ZWxzIHRvIGltYWdlXG4gICAqICBjb29yZHMgdmlhIHRoZSB2aWV3cG9ydCwgYW5kIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGNob3NlbiByZWN0YW5nbGUuICovXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXYsXG4gICAgICBwaXhlbFRvRGF0YTogKHB4OiBudW1iZXIsIHB5OiBudW1iZXIpID0+IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBweCwgcHkpLFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHM6IG51bWJlcltdKSA9PiB0aGlzLmFwcGx5Wm9vbVRvQm94KGNvb3JkcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBGaXQgdGhlIE9TRCB2aWV3cG9ydCB0byBhbiBpbWFnZS1zcGFjZSByZWN0YW5nbGUgKGNvb3JkcyBvcmRlcmVkXG4gICAqICBbeE1pbiwgeE1heCwgeU1heCwgeU1pbl0pLiAqL1xuICBwcml2YXRlIGFwcGx5Wm9vbVRvQm94KGNvb3JkaW5hdGVzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFthLCBiLCBjLCBkXSA9IGNvb3JkaW5hdGVzO1xuICAgIGNvbnN0IHggPSBNYXRoLm1pbihhLCBiKTtcbiAgICBjb25zdCB3ID0gTWF0aC5hYnMoYiAtIGEpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihjLCBkKTtcbiAgICBjb25zdCBoID0gTWF0aC5hYnMoYyAtIGQpO1xuICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IGltYWdlUmVjdFRvVmlld3BvcnQodGhpcy52aWV3ZXIsIHgsIHksIHcsIGgpO1xuICAgIHRoaXMudmlld2VyLnZpZXdwb3J0LmZpdEJvdW5kcyhyZWN0LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBiYWNrIHRoZSAqY3VycmVudGx5IHJlbmRlcmVkKiBPU0QgY2FudmFzIGFzIHRoZSB3YW5kJ3MgcGl4ZWwgbWF0cml4LlxuICAgKiBUaGUgbWF0cml4IGNvdmVycyBvbmx5IHRoZSB2aXNpYmxlIHZpZXdwb3J0IGF0IHNjcmVlbiByZXNvbHV0aW9uLCBzbyB3aGVuXG4gICAqIHRoZSB1c2VyIGlzIHpvb21lZCBpbnRvIGEgc3ViLXJlZ2lvbiB0aGUgd2FuZCBzYW1wbGVzIHRoYXQgcmVnaW9uJ3MgZGV0YWlsXG4gICAqIChyYXRoZXIgdGhhbiB0aGUgd2hvbGUgaW1hZ2UgYXQgcHJldmlldyByZXNvbHV0aW9uKS4gYG9yaWdpblgvb3JpZ2luWWAgYW5kXG4gICAqIGByYXRpb3NgIG1hcCBpbWFnZSBjb29yZHMgPC0+IHJlYWRiYWNrLXBpeGVsIGNvb3JkcyBmb3IgdGhlIHdhbmQnc1xuICAgKiBkYXRhL3JhdGlvL29yaWdpbiBtb2RlbC4gQ2FjaGVkIHVudGlsIHRoZSB2aWV3cG9ydCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkYmFja1ZpZXdwb3J0KCk6IENhY2hlZEltYWdlRGF0YSB8IG51bGwge1xuICAgIGlmICh0aGlzLnZpZXdwb3J0UGl4ZWxzKSByZXR1cm4gdGhpcy52aWV3cG9ydFBpeGVscztcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlciBhcyBhbnk7XG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9IHZpZXdlcj8uZHJhd2VyPy5jYW52YXM7XG4gICAgY29uc3QgdnAgPSB2aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQgfHwgIXZwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB3ID0gY2FudmFzLndpZHRoOyAvLyBkZXZpY2UgcGl4ZWxzXG4gICAgY29uc3QgaCA9IGNhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTsgLy8gUkdCQSwgcm93LW1ham9yXG4gICAgLy8gQnVpbGQgdGhlIFt5XVt4XSA9IFtyLGcsYl0gbWF0cml4IHRoZSB3YW5kIGV4cGVjdHMgZm9yIFJHQiBmcmFtZXMuXG4gICAgY29uc3QgbWF0cml4OiBudW1iZXJbXVtdW10gPSBuZXcgQXJyYXkoaCk7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoOyB5KyspIHtcbiAgICAgIGNvbnN0IHJvdzogbnVtYmVyW11bXSA9IG5ldyBBcnJheSh3KTtcbiAgICAgIGNvbnN0IGJhc2UgPSB5ICogdyAqIDQ7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHc7IHgrKykge1xuICAgICAgICBjb25zdCBvID0gYmFzZSArIHggKiA0O1xuICAgICAgICByb3dbeF0gPSBbZGF0YVtvXSwgZGF0YVtvICsgMV0sIGRhdGFbbyArIDJdXTtcbiAgICAgIH1cbiAgICAgIG1hdHJpeFt5XSA9IHJvdztcbiAgICB9XG5cbiAgICAvLyBJbWFnZS1jb29yZCBzcGFuIHRoZSByZWFkYmFjayBjb3ZlcnMgKENTUyBweCBpbiwgaW1hZ2UgY29vcmRzIG91dCkuIFJvdXRlXG4gICAgLy8gdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpIHNvIGl0IHN0YXlzIGFjY3VyYXRlIOKAlCBhbmQgcXVpZXQg4oCUIHdoZW5cbiAgICAvLyB0aGUgd29ybGQgaG9sZHMgbXVsdGlwbGUgaW1hZ2VzIChwZXItY2hhbm5lbCBtdWx0aWNoYW5uZWwgbGF5ZXJzKS5cbiAgICBjb25zdCBlbFcgPSBjYW52YXMuY2xpZW50V2lkdGggfHwgdztcbiAgICBjb25zdCBlbEggPSBjYW52YXMuY2xpZW50SGVpZ2h0IHx8IGg7XG4gICAgY29uc3QgdGwgPSBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgMCwgMCk7XG4gICAgY29uc3QgYnIgPSBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgZWxXLCBlbEgpO1xuICAgIGNvbnN0IHJhdGlvWCA9IChici54IC0gdGwueCkgLyB3OyAvLyBpbWFnZSBweCBwZXIgcmVhZGJhY2sgcHhcbiAgICBjb25zdCByYXRpb1kgPSAoYnIueSAtIHRsLnkpIC8gaDtcblxuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyYXRpb1gsIHJhdGlvWV0sXG4gICAgICBpc0dyYXlzY2FsZTogZmFsc2UsIC8vIGNhbnZhcyByZWFkYmFjayBpcyBhbHdheXMgUkdCQVxuICAgICAgb3JpZ2luWDogdGwueCxcbiAgICAgIG9yaWdpblk6IHRsLnksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydFBpeGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbG9yIGEgZ3JheXNjYWxlIHRpbGUgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIExVVCwgdXNpbmcgT1NEJ3NcbiAgICogdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAoT1NEIDUrLzYpLiBNYXBzIGVhY2ggcGl4ZWwncyBncmF5c2NhbGVcbiAgICogdmFsdWUgKHI9PWc9PWIpIHRvIHRoZSBMVVQncyBSR0IuIE5vLW9wIGZvciBSR0IgaW1hZ2VzIG9yIHVudGlsIHRoZSBMVVQgaXNcbiAgICogYnVpbHQuIEhhbmRsZXIgaXMgYXN5bmMg4oCUIE9TRCBhd2FpdHMgaXQgKHJhaXNlRXZlbnRBd2FpdGluZykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29sb3JUaWxlKGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWNvbG9yQ2hhbm5lbFRpbGUoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZGlzcGxheVRva2VuO1xuICAgIGNvbnN0IGdyYXkgPSB0aGlzLmlzR3JheXNjYWxlSW1hZ2U7XG4gICAgaWYgKGdyYXkpIHtcbiAgICAgIGlmICghdGhpcy5jb2xvckx1dCkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzcGxheS5yZ2JOZWVkc1JlY29sb3IoKSkge1xuICAgICAgcmV0dXJuOyAvLyBSR0IgYXQgZGVmYXVsdCAoYWxsIHZpc2libGUsIGZ1bGwgd2luZG93LCDOsz0xLCBubyBpbnZlcnQpIOKGkiBwYXNzdGhyb3VnaFxuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHRpbGUncyBwaXhlbHMuIFByZWZlciB0aGUgcmVuZGVyaW5nIGNvbnRleHQsIGJ1dCBzb21lIHRpbGUgY2FjaGVzXG4gICAgLy8gKGFqYXggUE5HIGJsb2JzKSBjb252ZXJ0IHRvIGFuICplbXB0eSogY29udGV4dDJkIOKAlCByZWNvbG9yaW5nIHRoYXQgd291bGRcbiAgICAvLyBibGFuayB0aGUgdGlsZSAod2hpdGUgY2FudmFzKS4gU28gaWYgdGhlIGNvbnRleHQgaGFzIG5vIG9wYXF1ZSBwaXhlbHMsIGRyYXdcbiAgICAvLyB0aGUgdGlsZSdzIG93biBiaXRtYXAvaW1hZ2UgYW5kIHJlY29sb3IgdGhhdCBpbnN0ZWFkLiBXZSBuZXZlciB3cml0ZSBiYWNrXG4gICAgLy8gdW5sZXNzIHdlIGFjdHVhbGx5IHJlY29sb3JlZCBzb21ldGhpbmcsIHNvIGEgdGlsZSBpcyBuZXZlciBibGFua2VkLlxuICAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjdHggPSBhd2FpdCBldmVudC5nZXREYXRhKCdjb250ZXh0MmQnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHRyeSBiaXRtYXAgYmVsb3cgKi9cbiAgICB9XG4gICAgbGV0IGltZzogSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGN0eCAmJiBjdHguY2FudmFzICYmIGN0eC5jYW52YXMud2lkdGggJiYgY3R4LmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGltZyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaW1nIHx8ICF0aGlzLmhhc09wYXF1ZShpbWcuZGF0YSkpIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgdGlsZSdzIGRlY29kZWQgaW1hZ2UvYml0bWFwLlxuICAgICAgbGV0IHNyYzogYW55ID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlQml0bWFwJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm9uZSAqL1xuICAgICAgfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlJyk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8qIG5vbmUgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkgcmV0dXJuOyAvLyBjYW4ndCBnZXQgcGl4ZWxzIOKAlCBsZWF2ZSB0aGUgdGlsZSB1bnRvdWNoZWRcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSBzcmMud2lkdGg7XG4gICAgICBjLmhlaWdodCA9IHNyYy5oZWlnaHQ7XG4gICAgICBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShzcmMsIDAsIDApO1xuICAgICAgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRpc3BsYXkuYXBwbHlUb1JnYmEoaW1nLmRhdGEpIHx8ICFjdHgpIHJldHVybjsgLy8gbm90aGluZyBvcGFxdWVcbiAgICAvLyBBIG5ld2VyIGRpc3BsYXkgcm91bmQgaGFzIGFscmVhZHkgcmVzdG9yZWQgdGhpcyB0aWxlIOKAlCB3cml0aW5nIG5vdyB3b3VsZFxuICAgIC8vIGhhbmQgT1NEIGEgc3VwZXJzZWRlZCBjYW52YXMgYW5kIGRlc3Ryb3kgdGhlIGNhY2hlIHJlY29yZC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuZGlzcGxheVRva2VuKSByZXR1cm47XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApO1xuICAgIC8vIFRoZSB0aWxlJ3MgY2FjaGUgY2FuIHN0aWxsIGJlIGV2aWN0ZWQgYmV0d2VlbiB0aGUgYXdhaXRzIGFib3ZlIGFuZCBoZXJlIChhXG4gICAgLy8gc2xpY2UgY2hhbmdlKSwgbWFraW5nIHNldERhdGEgdGhyb3cgYSBET01FeGNlcHRpb24gb24gYSBkZWFkIGNhbnZhcy5cbiAgICAvLyBTd2FsbG93IGl0IOKAlCB0aGUgdGlsZSBpcyBnb25lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcmVjb2xvci5cbiAgICB0cnkgeyBhd2FpdCBldmVudC5zZXREYXRhKGN0eCwgJ2NvbnRleHQyZCcpOyB9IGNhdGNoIHsgLyogdGlsZSBldmljdGVkICovIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaW50IGEgc2luZ2xlIGNoYW5uZWwncyB0aWxlIGluIHBsYWNlLiBFYWNoIGNoYW5uZWwgaXMgaXRzIG93biBPcGVuU2VhZHJhZ29uXG4gICAqIFRpbGVkSW1hZ2UgKGEgc2luZ2xlLWJhbmQgZ3JheXNjYWxlIHRpbGUpOyBPU0QgY29tcG9zaXRlcyB0aGUgTiBpbWFnZXNcbiAgICogYWRkaXRpdmVseSAoJ2xpZ2h0ZXInKSBpbiBpdHMgZHJhd2VyIOKAlCBzbyB0aGlzIGp1c3QgbWFwcyB0aGUgdGlsZSdzIGludGVuc2l0eVxuICAgKiB0aHJvdWdoIHRoZSBjaGFubmVsJ3Mgd2luZG93L2dhbW1hIGFuZCBpdHMgcHNldWRvLWNvbG91ci4gU3luY2hyb25vdXMgKG5vXG4gICAqIGNyb3NzLXRpbGUgZmV0Y2gpIOKGkiBubyByYWNlLCBubyBzZWFtcy4gQ2hhbm5lbCBpcyBwYXJzZWQgZnJvbSB0aGUgdGlsZSBVUkwuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29sb3JDaGFubmVsVGlsZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmRpc3BsYXlUb2tlbjtcbiAgICBjb25zdCB0aWxlID0gZXZlbnQ/LnRpbGU7XG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSAodGlsZSAmJiAodHlwZW9mIHRpbGUuZ2V0VXJsID09PSAnZnVuY3Rpb24nID8gdGlsZS5nZXRVcmwoKSA6IHRpbGUudXJsKSkgfHwgJyc7XG4gICAgY29uc3QgbSA9IC9bPyZdY2hhbm5lbD0oXFxkKykvLmV4ZWModXJsKTtcbiAgICBjb25zdCBjaCA9IG0gPyBwYXJzZUludChtWzFdLCAxMCkgOiAwO1xuICAgIGNvbnN0IHN0ID0gdGhpcy5jaGFubmVsU3RhdGVzW2NoXTtcblxuICAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7IGN0eCA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2NvbnRleHQyZCcpOyB9IGNhdGNoIHsgLyogZmFsbGJhY2sgYmVsb3cgKi8gfVxuICAgIGxldCBpbWc6IEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdHggJiYgY3R4LmNhbnZhcyAmJiBjdHguY2FudmFzLndpZHRoICYmIGN0eC5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICB0cnkgeyBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsgfSBjYXRjaCB7IGltZyA9IG51bGw7IH1cbiAgICB9XG4gICAgaWYgKCFpbWcgfHwgIXRoaXMuaGFzT3BhcXVlKGltZy5kYXRhKSkge1xuICAgICAgbGV0IHNyYzogYW55ID0gbnVsbDtcbiAgICAgIHRyeSB7IHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlQml0bWFwJyk7IH0gY2F0Y2ggeyAvKiBub25lICovIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHsgdHJ5IHsgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2UnKTsgfSBjYXRjaCB7IC8qIG5vbmUgKi8gfSB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSByZXR1cm47XG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gc3JjLndpZHRoOyBjLmhlaWdodCA9IHNyYy5oZWlnaHQ7XG4gICAgICBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShzcmMsIDAsIDApO1xuICAgICAgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XG4gICAgfVxuICAgIGlmICghY3R4KSByZXR1cm47XG5cbiAgICAvLyBQcmVjb21wdXRlIGx1bSgwLi4yNTUpIOKGkiB0aW50ZWQgUkdCIG9uY2UsIHRoZW4gbWFwIGVhY2ggcGl4ZWwgYnkgbG9va3VwIOKAlFxuICAgIC8vIHRoZSBjaGFubmVsIHRpbGUgaXMgc2luZ2xlLWJhbmQsIHNvIHRoaXMgdHVybnMgfjI2MmsgcGVyLXBpeGVsXG4gICAgLy8gY2hhbm5lbEludGVuc2l0eSgpICh3aXRoIE1hdGgucG93IGZvciBnYW1tYSkgY2FsbHMgaW50byAyNTYg4oCUIHRoZSBkaWZmZXJlbmNlXG4gICAgLy8gYmV0d2VlbiBhIHNuYXBweSBhbmQgYSBzbHVnZ2lzaCBzbGlkZXIgb24gYSA0LWNoYW5uZWwgc3RhY2suXG4gICAgY29uc3QgeyByOiByTCwgZzogZ0wsIGI6IGJMIH0gPSB0aGlzLmRpc3BsYXkuY2hhbm5lbFJnYkx1dChzdCk7XG4gICAgY29uc3QgZCA9IGltZy5kYXRhO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBpZiAoZFtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3QgciA9IGRbaV0sIGcgPSBkW2kgKyAxXSwgYiA9IGRbaSArIDJdO1xuICAgICAgY29uc3QgbHVtID0gciA+PSBnID8gKHIgPj0gYiA/IHIgOiBiKSA6IGcgPj0gYiA/IGcgOiBiOyAvLyBzaW5nbGUtYmFuZCDihpIgbWF4XG4gICAgICBkW2ldID0gckxbbHVtXTtcbiAgICAgIGRbaSArIDFdID0gZ0xbbHVtXTtcbiAgICAgIGRbaSArIDJdID0gYkxbbHVtXTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAvLyBBIG5ld2VyIGRpc3BsYXkgcm91bmQgKHRoZSBuZXh0IHRpY2sgb2YgYSBzbGlkZXIgZHJhZykgaGFzIGFscmVhZHkgcmVzdG9yZWRcbiAgICAvLyB0aGlzIHRpbGUuIFdyaXRpbmcgYSBzdXBlcnNlZGVkIGNvbnRleHQgYmFjayBtYWtlcyBPU0QncyBjb252ZXJzaW9uIHRocm93XG4gICAgLy8gRE9NRXhjZXB0aW9uLCB3aGljaCBkZXN0cm95cyB0aGUgY2FjaGUgcmVjb3JkIGFuZCB1bmxvYWRzIHRoZSB0aWxlIOKAlCBkb1xuICAgIC8vIG5vdGhpbmcgYW5kIGxldCB0aGUgbmV3ZXIgcm91bmQgcmVwYWludCBpdC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuZGlzcGxheVRva2VuKSByZXR1cm47XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApO1xuICAgIC8vIFNlZSByZWNvbG9yVGlsZTogdGhlIHRpbGUgY2FjaGUgY2FuIHN0aWxsIGRpZSBiZXR3ZWVuIHRoZSBhd2FpdHMgYW5kIGhlcmUuXG4gICAgdHJ5IHsgYXdhaXQgZXZlbnQuc2V0RGF0YShjdHgsICdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIHRpbGUgZXZpY3RlZCAqLyB9XG4gIH1cblxuICAvKiogUGVyLWNoYW5uZWwgaGlzdG9ncmFtIGZvciB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSwgZnJvbSB0aGUgY3VycmVudFxuICAgKiAgc2xpY2UncyBzYW1wbGVkIHRpbGVzIChncmF5c2NhbGUg4oaSIGNoYW5uZWwgMDsgUkdCIOKGkiBSL0cvQikuIE51bGwgdW50aWwgdGhlXG4gICAqICBhc3luYyBzYW1wbGluZyByZXNvbHZlcyBvciBpZiBpdCB3YXMgc2tpcHBlZC4gKi9cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBfYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNhbXBsZXIuZ2V0KHRoaXMuY3VycmVudFosIGNoYW5uZWxJbmRleCk7XG4gIH1cblxuICAvKiogTmF0aXZlIGJpdCBkZXB0aCBvZiBhIGNoYW5uZWwgZnJvbSB0aGUgdGlsZSBkZXNjcmlwdG9yICg4IHdoZW4gdW5rbm93bikuICovXG4gIHByaXZhdGUgY2hhbm5lbEJpdERlcHRoKGNoYW5uZWxJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMgaGlzdG9ncmFtIGZvciB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZS4gRm9yID44LWJpdCBpbWFnZXMgaXRcbiAgICogZmV0Y2hlcyB0aGUgKipuYXRpdmUqKiBkaXN0cmlidXRpb24gZnJvbSB0aGUgc2VydmVyIGAvaGlzdG9ncmFtYCBlbmRwb2ludFxuICAgKiAodGhlIDgtYml0IGNhbnZhcyB0aWxlcyBjYW4ndCBjYXJyeSAxNi1iaXQgdmFsdWVzKSBhbmQgY2FjaGVzIGl0IHBlclxuICAgKiBzbGljZStjaGFubmVsOyBmb3IgOC1iaXQvUkdCIGl0IHJldHVybnMgdGhlIGV4aXN0aW5nIGNsaWVudC1zYW1wbGVkIDgtYml0XG4gICAqIGhpc3RvZ3JhbS4gUmVhZC1vbmx5IOKAlCBpdCBuZXZlciB0b3VjaGVzIHRoZSB0aWxlL2Rpc3BsYXkgcGlwZWxpbmUuXG4gICAqL1xuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuY2hhbm5lbEJpdERlcHRoKGNoYW5uZWxJbmRleCkgPD0gOCB8fCAhdGhpcy5pbmZvQjY0KSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNhbXBsZXIubmF0aXZlJCh0aGlzLmluZm9CNjQsIHRoaXMuY3VycmVudFosIGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHRoZSB1bmRlcmx5aW5nIGltYWdlIGRhdGEgYXMgYSBkYXRhLXByZXNlcnZpbmcgbXVsdGktYmFuZCBUSUZGIGF0XG4gICAqIG5hdGl2ZSBiaXQgZGVwdGggdmlhIGBHRVQgL2V4cG9ydC90aWZmYCAodGhlIHNlcnZlciByZWFkcyB0aGUgcmF3IDE2LWJpdFxuICAgKiBwbGFuZXMg4oCUIHRoZSBjbGllbnQgbmV2ZXIgc2VlcyB0aGVtKS4gU2VuZHMgb25seSB0aGUgdmlzaWJsZSBjaGFubmVsczsgdGhlXG4gICAqIGV4aXN0aW5nIDgtYml0IGNvbXBvc2l0ZSBQTkcgZXhwb3J0IGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBhc3luYyBleHBvcnREYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuY2hhbm5lbFN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoO1xuICAgIC8vIE9taXQgYGNoYW5uZWxzYCB3aGVuIGV2ZXJ5IGNoYW5uZWwgaXMgdmlzaWJsZSAoc2VydmVyIGRlZmF1bHQgPSBhbGwpLlxuICAgIGNvbnN0IGNoUGFyYW0gPVxuICAgICAgdmlzaWJsZS5sZW5ndGggJiYgdmlzaWJsZS5sZW5ndGggPCBhbGwgPyBgJmNoYW5uZWxzPSR7dmlzaWJsZS5qb2luKCcsJyl9YCA6ICcnO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWV4cG9ydC90aWZmP2luZm89JHt0aGlzLmluZm9CNjR9Jno9JHt0aGlzLmN1cnJlbnRafSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5jdXJyZW50RmlsZU5hbWUgfHwgJ2ltYWdlJykucmVwbGFjZSgvXFwuW14uXSskLywgJycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgIC5nZXQodXJsLCB7IG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pXG4gICAgICAgICAgLnBpcGUodGltZW91dCg2MDAwMDApKSwgLy8gbGFyZ2UgZXhwb3J0cyBzdHJlYW0gc2xvd2x5OyBnZW5lcm91cyBkZWFkbGluZVxuICAgICAgKTtcbiAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gMTYtYml0IGV4cG9ydDogZmlsZSBzdGlsbCBjYWNoaW5nIOKAlCB0cnkgYWdhaW4gc2hvcnRseS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYmxvYiA9IHJlc3AuYm9keTtcbiAgICAgIGlmIChibG9iKSBzYXZlQXMoYmxvYiwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHRoZSBjdXJyZW50IHNsaWNlIGFzIGEgcHVibGljYXRpb24tcmVhZHkgUE5HIGNvbXBvc2l0ZWQgd2l0aCB0aGVcbiAgICogYWN0aXZlIGRpc3BsYXkgc2V0dGluZ3MgKHdpbmRvdyAvIGdhbW1hIC8gY29sb3JtYXAgb3IgcGVyLWNoYW5uZWwgcHNldWRvLVxuICAgKiBjb2xvdXJzIC8gaW52ZXJ0KS4gUGlja3MgdGhlIGxhcmdlc3QgcHlyYW1pZCBsZXZlbCB1bmRlciBhIHBpeGVsIGNhcCAodGhlXG4gICAqIGNvYXJzZXIgb3ZlcnZpZXcgZm9yIGh1Z2Ugd2hvbGUtc2xpZGVzKSwgZmV0Y2hlcyB0aGF0IGxldmVsJ3MgdGlsZSBncmlkLFxuICAgKiBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMsIHJ1bnMgdGhlIHNoYXJlZCBkaXNwbGF5IHBpcGVsaW5lLCBhbmQgc2F2ZXMgaXQuXG4gICAqL1xuICBhc3luYyBleHBvcnRDb21wb3NpdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVzYyA9IHRoaXMuZGVzY3JpcHRvcjtcbiAgICBjb25zdCBsZXZlbHMgPSBkZXNjPy5sZXZlbHMgPz8gW107XG4gICAgaWYgKCFkZXNjIHx8ICF0aGlzLmluZm9CNjQgfHwgIWxldmVscy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBDQVAgPSAzMl8wMDBfMDAwOyAvLyB+MzIgTVAg4oCUIGJvdW5kcyBtZW1vcnkgZm9yIHdob2xlLXNsaWRlIGltYWdlc1xuICAgIGxldCByZXMgPSBsZXZlbHMubGVuZ3RoIC0gMTsgLy8gY29hcnNlc3QgZmFsbGJhY2tcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxldmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxldmVsc1tpXS53aWR0aCAqIGxldmVsc1tpXS5oZWlnaHQgPD0gQ0FQKSB7IHJlcyA9IGk7IGJyZWFrOyB9XG4gICAgfVxuICAgIGNvbnN0IGx3ID0gbGV2ZWxzW3Jlc10ud2lkdGg7XG4gICAgY29uc3QgbGggPSBsZXZlbHNbcmVzXS5oZWlnaHQ7XG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemU7XG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsdyAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGxoIC8gdCkpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IGx3O1xuICAgIGNhbnZhcy5oZWlnaHQgPSBsaDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIGNvbnN0IHogPSB0aGlzLmN1cnJlbnRaO1xuICAgIGNvbnN0IGpvYnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykge1xuICAgICAgICBjb25zdCB1cmwgPSBidWlsZFRpbGVVcmwodGhpcy5hcGksIHRoaXMuaW5mb0I2NCwgeyByZXMsIGNvbCwgcm93LCB6LCB0aWxlU2l6ZTogdCB9KTtcbiAgICAgICAgam9icy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGVCaXRtYXAodGhpcy5odHRwLCB1cmwsIDMwMDAwKTtcbiAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgYSBmYWlsZWQgdGlsZSDigJQgdGhlIGV4cG9ydGVkIGNvbXBvc2l0ZSBoYXMgYSBnYXAgdGhlcmUuXG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignW3ZpejpleHBvcnRdIGNvbXBvc2l0ZSB0aWxlIGZldGNoIGZhaWxlZCwgc2tpcHBpbmcnLCB1cmwsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoam9icyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgbHcsIGxoKTtcbiAgICAgIGlmICh0aGlzLmRpc3BsYXkuYXBwbHlUb1JnYmEoaW1hZ2VEYXRhLmRhdGEpKSBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBLZWVwIHRoZSB1bi1yZWNvbG9yZWQgY29tcG9zaXRlIGlmIHJlYWRiYWNrIGZhaWxzIOKAlCBidXQgc2F5IHdoeS5cbiAgICAgIGNvbnNvbGUud2FybignW3ZpejpleHBvcnRdIGNvbXBvc2l0ZSByZWNvbG9yIHJlYWRiYWNrIGZhaWxlZCDigJQgZXhwb3J0aW5nIHJhdyB0aWxlcycsIGVycik7XG4gICAgfVxuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5jdXJyZW50RmlsZU5hbWUgfHwgJ2ltYWdlJykucmVwbGFjZSgvXFwuW14uXSskLywgJycpO1xuICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgIGlmIChibG9iKSBzYXZlQXMoYmxvYiwgYCR7c3RlbX1fY29tcG9zaXRlLnBuZ2ApO1xuICAgIH0sICdpbWFnZS9wbmcnKTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBwaXhlbCBpbiB0aGUgUkdCQSBidWZmZXIgaXMgbm9uLXRyYW5zcGFyZW50LiAqL1xuICBwcml2YXRlIGhhc09wYXF1ZShkOiBVaW50OENsYW1wZWRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRbaV0gIT09IDApIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyDilIDilIAgSURpc3BsYXlPcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gVmlzdWFsaXplclN0b3JlLCBzbyBPU0QgYW5kIFBsb3RseSBzdGF5IGluIGxvY2stc3RlcC4gT1NEIGFwcGxpZXMgdGhlXG4gIC8vIGNvbG9ybWFwIHRvIGdyYXlzY2FsZSB0aWxlcyB2aWEgdGhlIExVVCByZWFjdGl2ZWx5IChzZWUgdGhlIGNvbnN0cnVjdG9yJ3NcbiAgLy8gY29sb3JtYXAgc3Vic2NyaXB0aW9uKSwgbm90IGluIHNldENvbG9ybWFwLlxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xvcm1hcFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNvbG9ybWFwU3ViID0gbnVsbDtcbiAgICAvLyBEcm9wIGEgcXVldWVkIGludmFsaWRhdGlvbiBzbyBpdCBjYW4ndCBmaXJlIGFnYWluc3QgYSB0b3JuLWRvd24gdmlld2VyLlxuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaW52YWxpZGF0ZUhhbmRsZSk7XG4gICAgICBlbHNlIGNsZWFyVGltZW91dCh0aGlzLmludmFsaWRhdGVIYW5kbGUgYXMgdW5rbm93biBhcyBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pik7XG4gICAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3lWaWV3ZXIoKTtcbiAgfVxufVxuIl19
2102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEcsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlD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QUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsc0VBQXNFO0lBQ3RFLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsOENBQThDO0lBRTlDLHdFQUF3RTtJQUN4RSxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QiwwRUFBMEU7UUFDMUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkMsSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVU7Z0JBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7O2dCQUN2RixZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUE0RCxDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OEdBdDVEVSw4QkFBOEIsNENBNEkvQixnQkFBZ0IsbUxBTUosY0FBYyw0TUFNMUIsVUFBVTtrSEF4SlQsOEJBQThCLGNBRGpCLE1BQU07OzJGQUNuQiw4QkFBOEI7a0JBRDFDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkE2STdCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFNdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjOzswQkFNakMsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBkZWZlciwgZmlyc3RWYWx1ZUZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCAqIGFzIE9wZW5TZWFkcmFnb24gZnJvbSAnb3BlbnNlYWRyYWdvbic7XG5pbXBvcnQgeyBPU0QgfSBmcm9tICcuL29zZC1saWInO1xuaW1wb3J0IHsgT1NEX1pPT01fUEVSX1NDUk9MTCB9IGZyb20gJy4vb3NkLXpvb20nO1xuXG5cbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgVGlsZUFjY2Vzc1BvcnQsIFRJTEVfQUNDRVNTX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBWaXpDb25maWcsIFZJWl9DT05GSUcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90VHlwZSwgUExPVF9UWVBFX0RFU0NSSVBUT1JTLCBQbG90VHlwZURlc2NyaXB0b3IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IElWaXN1YWxpemVyLCBQaXhlbERhdGEsIEludGVuc2l0eVByb2ZpbGUsIElJc29zdXJmYWNlQ29udHJvbHMsIElJbnRlbnNpdHlDb250cm9scywgSVN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzLCBWaWV3ZXJGZWF0dXJlLCBjYXBhYmlsaXRpZXNPZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgT3NkUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vb3NkLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE9zZFNjYWxlQmFyIH0gZnJvbSAnLi9vc2Qtc2NhbGUtYmFyJztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5LCBSZWdpb25Ub29sTW9kZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi9vc2QtY29vcmRpbmF0ZS10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgUGxvdE1vZGVSZWN0LCBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuaW1wb3J0IHsgZWxlbWVudFRvSW1hZ2UsIGltYWdlUmVjdFRvVmlld3BvcnQsIHZpZXdwb3J0UmVjdFRvSW1hZ2UgfSBmcm9tICcuL29zZC1jb29yZHMnO1xuaW1wb3J0IHsgYnVpbGRUaWxlVXJsLCBmZXRjaFRpbGVCaXRtYXAgfSBmcm9tICcuL3RpbGUtY2xpZW50JztcbmltcG9ydCB7IFNsaWNlQ2FjaGUgfSBmcm9tICcuL3NsaWNlLWNhY2hlJztcbmltcG9ydCB7IERpc3BsYXlQaXBlbGluZSB9IGZyb20gJy4vZGlzcGxheS1waXBlbGluZSc7XG5pbXBvcnQgeyBIaXN0b2dyYW1TYW1wbGVyIH0gZnJvbSAnLi9oaXN0b2dyYW0tc2FtcGxlcic7XG5pbXBvcnQgeyBCYXNlU3RvcmVWaXN1YWxpemVyIH0gZnJvbSAnLi4vYmFzZS1zdG9yZS12aXN1YWxpemVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIFdhbmRUb29sU2VydmljZSwgV2FuZFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IEJydXNoVG9vbFNlcnZpY2UsIEJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvYnJ1c2gvYnJ1c2gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsIFZlcnRleEVyYXNlclRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci92ZXJ0ZXgtZXJhc2VyL3ZlcnRleC1lcmFzZXItdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFpvb21Ub0JveFRvb2xTZXJ2aWNlLCBab29tVG9Cb3hUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IElDaGFubmVsU3RhdGUsIElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG4vKipcbiAqIFF1aWV0IE9wZW5TZWFkcmFnb24ncyBcIltWaWV3cG9ydC4qXSBpcyBub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZVwiIGFkdmlzb3JpZXMuXG4gKiBBIG11bHRpY2hhbm5lbCBpbWFnZSBpcyBjb21wb3NpdGVkIGZyb20gb25lIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwg4oCUIGEgbGVnaXRpbWF0ZVxuICogbXVsdGktaW1hZ2Ugd29ybGQg4oCUIGFuZCBPU0QgbG9ncyB0aGF0IGFkdmlzb3J5IChhdCBlcnJvciBsZXZlbCkgZnJvbSBpdHMgb3duXG4gKiBuYXZpZ2F0b3Ivb3ZlcnZpZXcgcmVuZGVyaW5nIG9uIGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSwgZmxvb2RpbmcgdGhlIGNvbnNvbGUuIE91clxuICogb3duIGltYWdlPC0+dmlld3BvcnQgY29udmVyc2lvbnMgYWxyZWFkeSByb3V0ZSB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAoc2VlXG4gKiBvc2QtY29vcmRzKSwgc28gdGhlIHJlbWFpbmluZyBhZHZpc29yaWVzIGFyZSBPU0QtaW50ZXJuYWwgYW5kIG9ubHkgYWZmZWN0IHRoZVxuICogbWluaW1hcCdzIGJveCBhY2N1cmFjeSAoY29zbWV0aWMpLiBUaGlzIHdyYXBzIE9TRCdzIGxvZ2dlciBpbiBhIFByb3h5IHRoYXQgZHJvcHNcbiAqIG9ubHkgdGhhdCBvbmUgbWVzc2FnZSBzdHJpbmcgYW5kIGZvcndhcmRzIGV2ZXJ5IG90aGVyIGxvZyB1bnRvdWNoZWQuIElkZW1wb3RlbnQuXG4gKi9cbmZ1bmN0aW9uIHNpbGVuY2VPc2RNdWx0aUltYWdlQWR2aXNvcnkoKTogdm9pZCB7XG4gIGNvbnN0IG9zZDogYW55ID0gT1NEIGFzIGFueTtcbiAgaWYgKG9zZC5fX211bHRpSW1hZ2VGaWx0ZXJJbnN0YWxsZWQpIHJldHVybjtcbiAgY29uc3QgYmFzZTogYW55ID0gKG9zZC5jb25zb2xlICYmIHR5cGVvZiBvc2QuY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICA/IG9zZC5jb25zb2xlXG4gICAgOiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnID8gY29uc29sZSA6IG51bGwpO1xuICBpZiAoIWJhc2UpIHJldHVybjtcbiAgY29uc3QgaXNBZHZpc29yeSA9IChhOiB1bmtub3duKSA9PlxuICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiBhLmluZGV4T2YoJ25vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlJykgIT09IC0xO1xuICBvc2QuY29uc29sZSA9IG5ldyBQcm94eShiYXNlLCB7XG4gICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSB0YXJnZXRbcHJvcF07XG4gICAgICBpZiAoKHByb3AgPT09ICdlcnJvcicgfHwgcHJvcCA9PT0gJ3dhcm4nKSAmJiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7IGlmIChpc0Fkdmlzb3J5KGFyZ3NbMF0pKSByZXR1cm47IG9yaWcuYXBwbHkodGFyZ2V0LCBhcmdzKTsgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJyA/IG9yaWcuYmluZCh0YXJnZXQpIDogb3JpZztcbiAgICB9LFxuICB9KTtcbiAgb3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCA9IHRydWU7XG59XG5cbi8qKiBPbmUgcHlyYW1pZCBsZXZlbCBmcm9tIGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7IHJlczogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgfVxuXG4vKiogVGlsZS1zb3VyY2UgZGVzY3JpcHRvciByZXR1cm5lZCBieSBgR0VUIC90aWxlcy9pbmZvYC4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIC8qKiBUcnVlIG9ubHkgZm9yIGdlbnVpbmUgbXVsdGktY2hhbm5lbCBjb21wb3NpdGVzIChpbmRleGVkL0xVVC1iZWFyaW5nXG4gICAqICBmbHVvcmVzY2VuY2Ugc3RhY2tzKSB0aGUgY2xpZW50IHNob3VsZCBzcGxpdCBpbnRvIHBlci1jaGFubmVsIGxheWVycy4gVGhlXG4gICAqICBzZXJ2ZXIgc2V0cyBpdDsgYW4gUkdCIHBob3RvIHJlYWQgYXMgc2VwYXJhdGVkIHBsYW5lcyBoYXMgY2hhbm5lbHM+MSBidXRcbiAgICogIG11bHRpY2hhbm5lbD1mYWxzZSwgc28gaXQgc3RheXMgYSBzaW5nbGUgY29tcG9zaXRlIHRpbGUgc291cmNlLiAqL1xuICBtdWx0aWNoYW5uZWw/OiBib29sZWFuO1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHRoZSByZW1haW5pbmdcbiAgICogIGxldmVscyBhcmUgc3ludGhldGljIGNvbXBvc2l0ZWQgb3ZlcnZpZXdzIChubyBwZXItY2hhbm5lbCB0aWxlcykuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSAobmFtZS9jb2xvci9iaXREZXB0aC9taW4tbWF4QWxsb3dlZCkgZm9yIG5hdGl2ZSAxNi1iaXRcbiAgICogIHdpbmRvd2luZyArIGhpc3RvZ3JhbTsgbnVsbCBmb3IgcGxhaW4gOC1iaXQvUkdCIHNvdXJjZXMuICovXG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7IGNvbG9yPzogc3RyaW5nOyBiaXREZXB0aD86IG51bWJlcjsgbWluQWxsb3dlZD86IG51bWJlcjsgbWF4QWxsb3dlZD86IG51bWJlcjtcbiAgfT4gfCBudWxsO1xuICBsZXZlbHM6IFRpbGVMZXZlbFtdO1xuICAvKiogUGh5c2ljYWwgcGl4ZWwgc2l6ZSBpbiDCtW0gKDAgd2hlbiB0aGUgZm9ybWF0IGRvZXNuJ3QgcmVwb3J0IGl0KS4gKi9cbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQgYGxvYWQoKWAgaGFuZHMgdG8gYHBsb3QoKWAuICovXG5pbnRlcmZhY2UgT3NkTG9hZGVkIHtcbiAgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsO1xuICBpbmZvQjY0OiBzdHJpbmc7XG4gIHo6IG51bWJlcjtcbiAgLyoqIE1pcnJvcnMgdGhlIGxvYWRlZCBpbWFnZSdzIGZpbGVuYW1lIOKAlCB0aGUgZGlhZ3JhbSdzIHJlbmRlciBwaXBlbGluZVxuICAgKiAgZ3VhcmRzIG9uIGBsb2FkZWQuZmlsZW5hbWUgPT09IHBoYXNlSW5mby5maWxlTmFtZWAgYmVmb3JlIGNhbGxpbmcgcGxvdCgpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogU2ltcGxlIChub24tdGlsZWQpIGltYWdlOiBgcGxvdCgpYCBvcGVucyB7QGxpbmsgdXJsfSBkaXJlY3RseSB2aWEgT1NEJ3NcbiAgICogIHNpbmdsZS1pbWFnZSBzb3VyY2Ug4oCUIG5vIHRpbGUgcHlyYW1pZCwgbm8gc2VydmVyLiBTZXQgd2hlbiB0aGUgaW1hZ2VcbiAgICogIGNhcnJpZXMgYHRpbGVkID09PSBmYWxzZWAgKHNlZSB7QGxpbmsgSUltYWdlSW5mby50aWxlZH0pLiAqL1xuICBzaW1wbGU/OiBib29sZWFuO1xuICAvKiogVGhlIGRpcmVjdGx5LWxvYWRhYmxlIGltYWdlIFVSTCAoYGJsb2I6YC9gZGF0YTpgL2BodHRwYCkgZm9yIHNpbXBsZSBtb2RlLiAqL1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3BlblNlYWRyYWdvbiB2aXN1YWxpemF0aW9uIGJhY2tlbmQuXG4gKlxuICogUmVuZGVycyB0aGUgKmltYWdlKiBwbG90IHR5cGUgYXMgYSBuYXRpdmVseS10aWxlZCwgem9vbWFibGUgcmFzdGVyLCBiYWNrZWQgYnlcbiAqIHRoZSBqaXQtc2VydmljZSB0aWxlIGVuZHBvaW50cyAoYEdFVCAvdGlsZXMvaW5mb2AgKyBgR0VUIC90aWxlYCwgd2hpY2ggcmV1c2VcbiAqIHRoZSBCaW8tRm9ybWF0cyBST0kgcmVuZGVyZXIpLiBQbG90bHkga2VlcHMgdGhlIHNjaWVudGlmaWMvZGF0YSBwbG90IHR5cGVzXG4gKiAoc2NhbGFyIGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkg4oCUXG4gKiBoZW5jZSB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBvbmx5IGBJbWFnZURpc3BsYXlgLlxuICpcbiAqIFdpcmVkOiBsb2FkIOKGkiBkZXNjcmlwdG9yLCBwbG90IOKGkiBtb3VudCB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSxcbiAqIHpvb20vcGFuIOKGkiB2aWV3cG9ydCBBUEkuIE5PVCB3aXJlZCB5ZXQgKGZvbGxvdy11cHMpOiByZWdpb24gb3ZlcmxheXMgKyB0b29sc1xuICogKGEgcG9zaXRpb25lZCBjYW52YXMvU1ZHIG92ZXJsYXkgb3IgQW5ub3RvcmlvdXMpLCBwaXhlbCByZWFkYmFjaywgYW5kIHRoZVxuICogcGVyLXRpbGUgTFVUL2NvbnRyYXN0IHBhcmFtcy4gTm90IHJlZ2lzdGVyZWQgaW4gREkgcHJvdmlkZXJzIOKAlCBgUGxvdGx5U2VydmljZWBcbiAqIGlzIHN0aWxsIHRoZSBvbmx5IGFjdGl2ZSBiYWNrZW5kOyB0aGlzIHByb3ZlcyB0aGUgY29udHJhY3Qgc3VwcG9ydHMgYSBzZWNvbmRcbiAqIGltcGxlbWVudGF0aW9uIGFnYWluc3QgcmVhbCBlbmRwb2ludHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JlVmlzdWFsaXplciBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcbiAgLyoqIE9TRCdzIHN0cmVuZ3RoIGlzIGRpc3BsYXlpbmcgYSBsYXJnZSB6b29tYWJsZSBpbWFnZSDigJQgbm90aGluZyBlbHNlIGhlcmUuICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1ZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5XSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcbiAgcHJpdmF0ZSB2aWV3ZXI6IE9wZW5TZWFkcmFnb24uVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb3ZlcmxheTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsZUJhcjogT3NkU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICAvKiogQmFzZTY0IFJhd0ZpbGVJbmZvICsgY3VycmVudCB6LXNsaWNlLCBrZXB0IHNvIHNldFpJbmRleCBjYW4gcmVidWlsZCB0aGVcbiAgICogIHRpbGUgc291cmNlIGFuZCBzd2FwIHNsaWNlcyBsaXZlIChzdGFjayBuYXZpZ2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbmZvQjY0ID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFogPSAwO1xuICAvKiogVHJ1ZSB3aGlsZSB0aGUgY3VycmVudCBpbWFnZSBpcyBcInNpbXBsZVwiICh0aWxlZDpmYWxzZSDigJQgc2VsZi1jb250YWluZWRcbiAgICogIHBlci1zbGljZSBVUkxzLCBubyB0aWxlIHNlcnZlcjsgZS5nLiBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWRcbiAgICogIGNsaWVudC1zaWRlIGludG8gYSBzdGFjaykuIHNldFpJbmRleCBzd2FwcyB0aGUgc2luZ2xlLWltYWdlIHNvdXJjZSBmb3JcbiAgICogIHRoZSBuZXcgc2xpY2UncyBVUkwgaW5zdGVhZCBvZiB1cGRhdGluZyBhIHRpbGVkIHotcGFyYW0uICovXG4gIHByaXZhdGUgc2ltcGxlTW9kZSA9IGZhbHNlO1xuICAvKiogdXJsc1tdIGZvciB0aGUgY3VycmVudCBzaW1wbGUtbW9kZSBpbWFnZSwgc28gc2V0WkluZGV4IGNhbiBsb29rIHVwIHRoZVxuICAgKiAgc2xpY2UgYmVpbmcgc2NydWJiZWQgdG8gKHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLnVybEZvcn0pLlxuICAgKiAgVW51c2VkIChhbmQgbGVmdCBzdGFsZSwgaGFybWxlc3NseSkgaW4gdGlsZWQgbW9kZS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVVcmxzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogcHJldmlldyBibG9iIFVSTCDihpIgZnVsbC1yZXMgdXBzY2FsZWQgYmxvYiBVUkwgKHNlZSB0b0Z1bGxSZXNVcmwpLCBzb1xuICAgKiAgcmUtdmlzaXRpbmcgYSBzaW1wbGUtbW9kZSBzbGljZSBkb2Vzbid0IHJlLXVwc2NhbGUuIFJldm9rZWQgb24gZmlsZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlRnVsbFJlc1VybHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogU0VSVkVSTEVTUyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbENvdW50PjEpOiB0aGUgc3RhY2snc1xuICAgKiAgcGVyLXNsaWNlIHBlci1jaGFubmVsIHBsYW5lIFVSTHMsIHRoZSBjdXJyZW50IHNsaWNlJ3MgZGVjb2RlZCBwbGFuZXMsIGFuZFxuICAgKiAgdGhlIGxhc3QgY29tcG9zaXRlIGJsb2IgVVJMLiBDb21wb3NpdGVkIGNsaWVudC1zaWRlIHZpYSBkaXNwbGF5LmNoYW5uZWxSZ2JMdXRcbiAgICogIChubyB0aWxlIHNlcnZlcik7IGtlcHQgT0ZGIHRoZSB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoLiAqL1xuICBwcml2YXRlIHNpbXBsZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICBwcml2YXRlIHNpbXBsZUNoYW5uZWxVcmxzOiBzdHJpbmdbXVtdID0gW107XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDb21wb3NpdGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2tpcCB0aGUgZnVsbC1yZXMgdXBzY2FsZSBhYm92ZSB0aGlzIGxvbmdlc3Qtc2lkZSBkaW1lbnNpb24g4oCUIGEgZm9sZGVyXG4gICAqICBzdGFjayBpcyBwZXItZmlsZSBwcmV2aWV3cyAod2VsbCB1bmRlciB0aGlzKTsgdGhpcyBvbmx5IGd1YXJkcyBhZ2FpbnN0IGFuXG4gICAqICBhY2NpZGVudGFsIGVub3Jtb3VzIGNhbnZhcyBhbGxvY2F0aW9uLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IFNJTVBMRV9VUFNDQUxFX01BWF9ESU0gPSA4MTkyO1xuICBwcml2YXRlIGNvb3JkVHJhbnNmb3JtOiBPc2RDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3QhOiBXYW5kVG9vbEhvc3Q7XG4gIHByaXZhdGUgZXJhc2VySG9zdCE6IFZlcnRleEVyYXNlclRvb2xIb3N0O1xuICAvKiogV2FuZCBzYW1wbGluZyBtYXRyaXggcmVhZCBiYWNrIGZyb20gdGhlIHJlbmRlcmVkIHZpZXdwb3J0OyBjYWNoZWQgdW50aWxcbiAgICogIHRoZSB2aWV3cG9ydCBjaGFuZ2VzIChzZWUgcmVhZGJhY2tWaWV3cG9ydCkuICovXG4gIHByaXZhdGUgdmlld3BvcnRQaXhlbHM6IENhY2hlZEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIERPTSBpZCBvZiB0aGUgZWxlbWVudCBPU0QgaXMgbW91bnRlZCBpbiAoc2hhcmVkIHdpdGggUGxvdGx5KTsgdGhlXG4gICAqICBvbi1jYW52YXMgdG9vbHMgYXR0YWNoIHRoZWlyIG92ZXJsYXlzIGhlcmUuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogQ3VycmVudCBmaWxlIG5hbWUsIHRhZ2dlZCBvbnRvIHdhbmQtY3JlYXRlZCBzaGFwZXMuICovXG4gIHByaXZhdGUgY3VycmVudEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiAyNTYtZW50cnkgUkdCIExVVCBmb3IgdGhlIGFjdGl2ZSBjb2xvcm1hcCwgYXBwbGllZCB0byBncmF5c2NhbGUgdGlsZXMgdmlhXG4gICAqICB0aGUgdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAobWlycm9ycyBQbG90bHkncyBoZWF0bWFwIGNvbG9yc2NhbGUpLlxuICAgKiAgTnVsbCB3aGlsZSBvcHRpb25zIHJlc29sdmU7IHJlY29sb3JpbmcgaXMgc2tpcHBlZCB1bnRpbCBpdCdzIGJ1aWx0LiAqL1xuICBwcml2YXRlIGNvbG9yTHV0OiBSZ2JbXSB8IG51bGwgPSBudWxsO1xuICAvKiogT25seSBncmF5c2NhbGUgaW1hZ2VzIGdldCBhIGNvbG9ybWFwIChSR0IgdGlsZXMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCkuICovXG4gIHByaXZhdGUgaXNHcmF5c2NhbGVJbWFnZSA9IGZhbHNlO1xuICBwcml2YXRlIGNvbG9ybWFwU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBieSBldmVyeSBkaXNwbGF5IGludmFsaWRhdGlvbi4gQSByZWNvbG9yIHJvdW5kIGNhcHR1cmVzIGl0IGFuZCwgYWZ0ZXJcbiAgICogIGVhY2ggYGF3YWl0YCwgYWJhbmRvbnMgdGhlIHRpbGUgb25jZSBhIG5ld2VyIHJvdW5kIGhhcyBzdGFydGVkLiBXcml0aW5nIGFcbiAgICogIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIGlzIG5vdCBtZXJlbHkgd2FzdGVkIHdvcms6IE9TRCdzIGNvbnZlcnNpb24gc2VlcyBhXG4gICAqICBjYW52YXMgdGhlIG5ld2VyIHJvdW5kIGFscmVhZHkgcmVwbGFjZWQsIHRocm93cyBgRE9NRXhjZXB0aW9uYCwgYW5kXG4gICAqICBgX2hhbmRsZUNvbnZlcnNpb25FcnJvcmAgREVTVFJPWVMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZVxuICAgKiAgKHVubGlrZSB0aGUgZHJhd2VyJ3MgcmFzdGVyQmxvYiBwYXRoLCBpdCBkb2VzIG5vdCByZS1wcmVwYXJlKS4gRW5vdWdoIG9mXG4gICAqICB0aG9zZSBhbmQgdGhlIHZpZXdlciBnb2VzIHdoaXRlIG1pZC1kcmFnLiAqL1xuICBwcml2YXRlIGRpc3BsYXlUb2tlbiA9IDA7XG4gIC8qKiBQZW5kaW5nIGNvYWxlc2NlZCBpbnZhbGlkYXRpb24gKHNlZSB7QGxpbmsgc2NoZWR1bGVJbnZhbGlkYXRlfSkuICovXG4gIHByaXZhdGUgaW52YWxpZGF0ZUhhbmRsZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgcGVyLWNoYW5uZWwgZGlzcGxheSBzdGF0ZSAod2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIGZyb20gdGhlIHN0b3JlLFxuICAgKiAgcmVhZCBzeW5jaHJvbm91c2x5IGJ5IHJlY29sb3JUaWxlLiBDaGFubmVsIDAgZHJpdmVzIGdyYXlzY2FsZSB3aW5kb3dpbmc7XG4gICAqICBSL0cvQiAoaW5kaWNlcyAwLTIpIGRyaXZlIFJHQiBwZXItY2hhbm5lbCB3aW5kb3dpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUcnVlIGZvciBtdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChjaGFubmVsQ291bnQgPiAxLCBub3QgUkdCKTogdGlsZXMgYXJlXG4gICAqICBjb21wb3NpdGVkIGNsaWVudC1zaWRlIGZyb20gcGVyLWNoYW5uZWwgc2luZ2xlLWJhbmQgZmV0Y2hlcyAoc2VlXG4gICAqICByZWNvbG9yTXVsdGlDaGFubmVsVGlsZSkgcmF0aGVyIHRoYW4gcmVjb2xvcmVkIGluIHBsYWNlLiAqL1xuICBwcml2YXRlIGlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gIC8qKiBDb3VudCBvZiByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5XG4gICAqICBoZXJlKS4gRm9yIG11bHRpY2hhbm5lbCBpbWFnZXMgdGhlIHRpbGUgc291cmNlIGlzIGJ1aWx0IGZyb20gdGhlc2UgYWxvbmUgc29cbiAgICogIGV2ZXJ5IGRpc3BsYXllZCB0aWxlIHN1cHBvcnRzIGEgcGVyLWNoYW5uZWwgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhbExldmVscyA9IDA7XG4gIC8qKiBJbnZlcnRlZCBiYWNrZ3JvdW5kICh3aGl0ZSA9IHplcm8pOiBpbnZlcnRzIHRoZSBkaXNwbGF5IHZhbHVlIGJlZm9yZSB0aGVcbiAgICogIExVVCAoZ3JheXNjYWxlKSAvIHBlciBjaGFubmVsIChSR0IpLiAqL1xuICBwcml2YXRlIGludmVydEJnID0gZmFsc2U7XG4gIC8qKiBCZWFyZXIgdG9rZW4gZm9yIE9TRCdzIG93biB0aWxlIGZldGNoZXMgKEh0dHBDbGllbnQgY2FsbHMgZ2V0IGl0IHZpYSB0aGVcbiAgICogIGludGVyY2VwdG9yOyBPU0QncyBsb2FkZXIgZG9lcyBub3QsIHNvIHdlIHBhc3MgaXQgYXMgYW4gYWpheCBoZWFkZXIpLiAqL1xuICBwcml2YXRlIGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKG1pbmltYXApIGlzIHNob3duLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjtcbiAgICogIGEgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhbnQgaXQgKGUuZy4gYSBzbWFsbCBlbWJlZGRlZCBwcmV2aWV3KSBzZXRzIGl0IG9mZlxuICAgKiAgdmlhIHtAbGluayBzZXROYXZpZ2F0b3JWaXNpYmxlfSBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIpLiBgZmFsc2VgIOKGkiBuZWFyZXN0LW5laWdoYm91ciwgc28gem9vbWVkLWluIHBpeGVsc1xuICAgKiAgcmVuZGVyIGFzIGNyaXNwIGJsb2NrcyAocGl4ZWwgaW5zcGVjdGlvbikuIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gdGhlIGltYWdlXG4gICAqICBvcGVucyBzaG93aW5nIHJhdyBwaXhlbHMuIFJlYWQgYXQgdmlld2VyIGNyZWF0aW9uOyB0b2dnbGVkIHZpYVxuICAgKiAge0BsaW5rIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZH0uICovXG4gIHByaXZhdGUgc21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVyYWxsIGRlYWRsaW5lIGZvciB0aGUgL3RpbGVzL2luZm8gcG9sbCBsb29wLiBBbiB1bmNhY2hlZCB3aG9sZS1zbGlkZVxuICAgKiAgaW1hZ2UgKGUuZy4gLm5kcGkpIGlzIGNhY2hlZCBzZXJ2ZXItc2lkZSBmaXJzdCAoR0NTLT5QVkMpLCB3aGljaCBjYW4gdGFrZVxuICAgKiAgc2V2ZXJhbCBtaW51dGVzIOKAlCB3ZSBwb2xsIChzaG9ydCByZXF1ZXN0czsgdGhlIGNhY2hlLXByb2dyZXNzIG92ZXJsYXlcbiAgICogIHNob3dzIHRoZSB3YWl0KSB1bnRpbCBpdCdzIHJlYWR5LiBHZW5lcm91cyBiZWNhdXNlIGVhY2ggcG9sbCBpcyBjaGVhcDsgb25cbiAgICogIGV4cGlyeSB0aGUgcmVuZGVyIHBpcGVsaW5lIGdpdmVzIHVwIGFuZCB0aGUgcm91dGVyIGZhbGxzIGJhY2sgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbGVzSW5mb1RpbWVvdXRNcyA9IDYwMDAwMDsgLy8gMTAgbWluXG5cbiAgLyoqIFBlci1jaGFubmVsIGZpdC12aWV3IHRpbGUgYnVkZ2V0ICh0aWxlcyBhdCB0aGUgY29hcnNlc3QgcmVhbCBsZXZlbCDDlyBjaGFubmVscykuXG4gICAqICBBYm92ZSBpdCwgYSBtdWx0aWNoYW5uZWwgaW1hZ2UgcmVuZGVycyBzZXJ2ZXItY29tcG9zaXRlZCBpbnN0ZWFkIG9mIHBlci1jaGFubmVsXG4gICAqICDigJQgaXRzIGZ1bGwtcmVzIHJlYWRzIChpdCBoYXMgbm8gb3ZlcnZpZXcgcHlyYW1pZCkgd291bGQgYmUgdG9vIG1hbnkgw5cgTiBjaGFubmVscy5cbiAgICogIDY0IChlLmcuIGEgNHg0IHNpbmdsZS1GT1Ygei1zdGFjayDDlyA0Y2gpIHN0YXlzIHBlci1jaGFubmVsOyBhIHdob2xlLXNsaWRlXG4gICAqICAoaHVuZHJlZHPigJN0aG91c2FuZHMpIGZhbGxzIGJhY2suICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMgPSAyNTY7XG5cbiAgLyoqIFBpeGVsIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9pbnZlcnQvY29sb3JtYXAgKyBhZGRpdGl2ZSB0aW50KSDigJRcbiAgICogIHNoYXJlZCBieSB0aWxlIHJlY29sb3JpbmcgYW5kIHRoZSBjb21wb3NpdGUgZXhwb3J0IHNvIHRoZXkgc3RheSBpZGVudGljYWxcbiAgICogIChzZWUgRGlzcGxheVBpcGVsaW5lKS4gSG9zdCBjbG9zdXJlcyByZWFkIHRoZSBzZXJ2aWNlJ3MgbGl2ZSBmaWVsZHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheSA9IG5ldyBEaXNwbGF5UGlwZWxpbmUoe1xuICAgIGlzR3JheXNjYWxlOiAoKSA9PiB0aGlzLmlzR3JheXNjYWxlSW1hZ2UsXG4gICAgY29sb3JMdXQ6ICgpID0+IHRoaXMuY29sb3JMdXQsXG4gICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5jaGFubmVsU3RhdGVzLFxuICAgIGludmVydEJnOiAoKSA9PiB0aGlzLmludmVydEJnLFxuICB9KTtcblxuICAvKiogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgKHNlZSBIaXN0b2dyYW1TYW1wbGVyKS4gQ29uc3RydWN0ZWQgaW5cbiAgICogIHRoZSBjdG9yIGJvZHkgYmVjYXVzZSBpdCBjYXB0dXJlcyB0aGUgcmVzb2x2ZWQgQVBJIGJhc2UgVVJMLiAqL1xuICBwcml2YXRlIHNhbXBsZXIhOiBIaXN0b2dyYW1TYW1wbGVyO1xuXG4gIC8qKiBTdGFjay1zbGljZSBjYWNoZSArIGJhY2tncm91bmQgcHJlbG9hZGVyIChzZWUgU2xpY2VDYWNoZSDigJQgcmVmYWN0b3JpbmdcbiAgICogIHBsYW4gU3RlcCAzKS4gVGhlIGhvc3QgYWNjZXNzb3JzIGFyZSBsaXZlIGNsb3N1cmVzLCBzbyB0aGUgY2FjaGUgYWx3YXlzXG4gICAqICByZWFkcyB0aGUgc2VydmljZSdzIGN1cnJlbnQgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgZXhhY3RseSB0aGUgZmllbGRzIHRoZVxuICAgKiAgbW92ZWQgY29kZSB1c2VkIHRvIHJlYWQgZGlyZWN0bHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgU2xpY2VDYWNoZSh7XG4gICAgdmlld2VyOiAoKSA9PiB0aGlzLnZpZXdlcixcbiAgICBoYXNJbWFnZTogKCkgPT4gISEodGhpcy52aWV3ZXIgJiYgdGhpcy5kZXNjcmlwdG9yICYmIHRoaXMuaW5mb0I2NCksXG4gICAgc2xpY2VDb3VudDogKCkgPT4gdGhpcy5kZXNjcmlwdG9yPy56ID8/IDEsXG4gICAgY3VycmVudFo6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgaXNNdWx0aUNoYW5uZWw6ICgpID0+IHRoaXMuaXNNdWx0aUNoYW5uZWwsXG4gICAgY2hhbm5lbENvdW50OiAoKSA9PiBNYXRoLm1heCgxLCB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8ICh0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxzID8/IDEpKSxcbiAgICBjaGFubmVsVmlzaWJsZTogKGM6IG51bWJlcikgPT4gdGhpcy5jaGFubmVsU3RhdGVzW2NdPy52aXNpYmxlICE9PSBmYWxzZSxcbiAgICBidWlsZFRpbGVTb3VyY2U6ICh6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpID0+XG4gICAgICB0aGlzLmJ1aWxkVGlsZVNvdXJjZSh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHosIGNoYW5uZWwpLFxuICAgIG9uQ29tcG9zaXRlU2xpY2VBZGRlZDogKHo6IG51bWJlcikgPT4gdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHopLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICBwcml2YXRlIHdhbmRUb29sOiBXYW5kVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBicnVzaFRvb2w6IEJydXNoVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzaW1wbGVTdGFjazogU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgY29uZmlnOiBWaXpDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHJlZ2lvblN0b3JlLCBzdG9yZSk7XG4gICAgdGhpcy5hcGkgPSBjb25maWcuc2xpZGVDcm9wU2VydmVyO1xuICAgIHRoaXMuc2FtcGxlciA9IG5ldyBIaXN0b2dyYW1TYW1wbGVyKHRoaXMuaHR0cCwgdGhpcy5hcGksIHtcbiAgICAgIHJlYWxMZXZlbHM6ICgpID0+IHRoaXMucmVhbExldmVscyxcbiAgICAgIGNoYW5uZWxDb3VudDogKGQpID0+IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGggfHwgKGQuY2hhbm5lbHMgPz8gMSksXG4gICAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgICAgLy8gTnVkZ2UgdGhlIGNoYW5uZWwtc3RhdGVzIHN0cmVhbSBzbyB0aGUgcGFuZSByZS1yZWFkcyBnZXRIaXN0b2dyYW0gbm93LFxuICAgICAgLy8gaW4gY2FzZSBpdHMgYm91bmRlZCByZXRyeSB3aW5kb3cgYWxyZWFkeSBsYXBzZWQuXG4gICAgICBvbkNoYW5uZWxIaXN0b2dyYW1zU2FtcGxlZDogKCkgPT4gdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGVzKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSksXG4gICAgICBvbkdyYXlXaW5kb3dTYW1wbGVkOiAobWluLCBtYXgpID0+IHRoaXMuc2VlZEdyYXlXaW5kb3cobWluLCBtYXgpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvc2NhbGVFdmVudCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIC8qKiBWaXNpYmxlIGltYWdlIHJlZ2lvbiAoZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMpIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcywgc28gdGhlIGludGVuc2l0eSBpbnNldCBjYW4gcmUtc2FtcGxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oKTtcbiAgLyoqIFRoZSB2aXNpYmxlIHJlY3Qgb24gZXZlcnkgcmVkcmF3LCBjb2FsZXNjZWQgdG8gb25lIGVtaXNzaW9uIHBlciBhbmltYXRpb25cbiAgICogIGZyYW1lLiBGZWVkcyB7QGxpbmsgUGxvdE1vZGVWaWV3cG9ydC5mcmFtZSR9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZyYW1lJCA9IG5ldyBTdWJqZWN0PFBsb3RNb2RlUmVjdD4oKTtcbiAgcHJpdmF0ZSBmcmFtZVJhZjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGxvdE1vZGVWaWV3cG9ydDogUGxvdE1vZGVWaWV3cG9ydCB8IG51bGwgPSBudWxsO1xuICAvLyBSZWdpb24gc3RhdGUgKHJlZ2lvbnMsIHNlbGVjdGlvbiwgdGhlIHVwZGF0ZSBldmVudCkgbGl2ZXMgaW4gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZTsgdGhlIElSZWdpb25TdG9yZSBtZXRob2RzIGJlbG93IGRlbGVnYXRlIHRvIGl0LlxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVByb2ZpbGUkID0gbmV3IFN1YmplY3Q8SW50ZW5zaXR5UHJvZmlsZVtdPigpO1xuICAvLyBJbWFnZSBtZXRhZGF0YSBhbmQgY2xhc3NpZmljYXRpb24gY29sb3VycyBsaXZlIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlLlxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgY29sb3JtYXAvcmV2ZXJzZSBzbyBPU0QgcmVjb2xvcnMgaW5cbiAgICogbG9jay1zdGVwIHdpdGggUGxvdGx5LiBJZGVtcG90ZW50IGFuZCBzZWxmLWhlYWxpbmc6IHRoaXMgc2VydmljZSBpcyBhIHJvb3RcbiAgICogc2luZ2xldG9uLCBidXQgYHVuc3Vic2NyaWJlKClgIChjYWxsZWQgb24gVmlzdWFsaXplckNvbXBvbmVudCBkZXN0cm95KVxuICAgKiB0ZWFycyB0aGUgc3Vic2NyaXB0aW9uIGRvd24g4oCUIGFuZCB0aGUgY29uc3RydWN0b3IgbmV2ZXIgcnVucyBhZ2Fpbi4gU29cbiAgICogYHBsb3QoKWAgY2FsbHMgdGhpcyB0byByZS1lc3RhYmxpc2ggaXQgYWZ0ZXIgYSBjb21wb25lbnQgdGVhcmRvd24vcmVjcmVhdGVcbiAgICogKGUuZy4gc3dpdGNoaW5nIGltYWdlcyksIG90aGVyd2lzZSBjb2xvcm1hcCBjaGFuZ2VzIHdvdWxkIGJlIHNpbGVudGx5XG4gICAqIGRyb3BwZWQgb24gZXZlcnkgaW1hZ2UgYWZ0ZXIgdGhlIGZpcnN0IHN3aXRjaC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29sb3JtYXBTdWIpIHJldHVybjtcbiAgICAvLyBDb2xvcm1hcC9yZXZlcnNlIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUg4oCUIHRoZSBzaW5nbGUgc291cmNlXG4gICAgLy8gb2YgdHJ1dGggZm9yIGJvdGggYmFja2VuZHMuIFJlYnVpbGQgdGhlIExVVCBhbmQgcmUtcnVuIHRoZSBwaXhlbCBwaXBlbGluZVxuICAgIC8vIHdoZW5ldmVyIGVpdGhlciBjaGFuZ2VzLCBzbyBPU0QgcmVjb2xvcnMgaW4gbG9jay1zdGVwIHdpdGggUGxvdGx5LlxuICAgIC8vIENvbG9ybWFwL3JldmVyc2UgKyBwZXItY2hhbm5lbCB3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSArIGludmVydCBhbGwgbGl2ZSBpblxuICAgIC8vIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlLiBSZWJ1aWxkIHRoZSBMVVQgYW5kIHJlLXJ1biB0aGUgcGl4ZWwgcGlwZWxpbmVcbiAgICAvLyB3aGVuZXZlciBhbnkgb2YgdGhlbSBjaGFuZ2VzLCBzbyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSB1cGRhdGVzIHRoZVxuICAgIC8vIGltYWdlIGxpdmUgYW5kIE9TRCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aCBQbG90bHkuXG4gICAgdGhpcy5jb2xvcm1hcFN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjbSwgcmV2LCBjaGFubmVscywgaW52ZXJ0XSkgPT4ge1xuICAgICAgdGhpcy5jb2xvckx1dCA9IGJ1aWxkQ29sb3JtYXBMdXQoY20/LmRhdGE/LnZhbHVlLCAhIXJldik7XG4gICAgICB0aGlzLmNoYW5uZWxTdGF0ZXMgPSBjaGFubmVscztcbiAgICAgIHRoaXMuaW52ZXJ0QmcgPSAhIWludmVydDtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsOiByZS1jb21wb3NpdGUgdGhlIGN1cnJlbnQgc2xpY2UgZnJvbSBpdHMgY2FjaGVkXG4gICAgICAvLyBwbGFuZXMgd2l0aCB0aGUgbmV3IGNoYW5uZWwgc3RhdGVzICsgcmUtb3BlbiAobm8gdGlsZS1pbnZhbGlkYXRlIHBhdGgpLlxuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7IHZvaWQgdGhpcy5yZWNvbXBvc2l0ZUFuZE9wZW4oKTsgcmV0dXJuOyB9XG4gICAgICAvLyBNdWx0aWNoYW5uZWw6IGVhY2ggY2hhbm5lbCBpcyBpdHMgb3duIFRpbGVkSW1hZ2Ug4oCUIHZpc2liaWxpdHkgaXMgdGhlXG4gICAgICAvLyBpbWFnZSdzIG9wYWNpdHkgKHdpbmRvdy9nYW1tYS9jb2xvdXIgYXJlIGFwcGxpZWQgYnkgcmVjb2xvckNoYW5uZWxUaWxlXG4gICAgICAvLyBvbiB0aGUgaW52YWxpZGF0ZSBiZWxvdykuIFJlLWFwcGx5aW5nIHRoZSBjdXJyZW50IHNsaWNlJ3MgcmV2ZWFsIHBpY2tzIHVwXG4gICAgICAvLyB0aGUgbmV3IHBlci1jaGFubmVsIHZpc2liaWxpdHkgKGNhY2hlZCBzbGljZXMgc3RheSBoaWRkZW4pLlxuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5yZXZlYWxDaGFubmVsU2xpY2UodGhpcy5jdXJyZW50Wik7XG4gICAgICB9XG4gICAgICAvLyByZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKSByZXN0b3JlcyBlYWNoIHRpbGUgdG8gaXRzIG9yaWdpbmFsIGRhdGEgYmVmb3JlXG4gICAgICAvLyByZS1ydW5uaW5nIHJlY29sb3JUaWxlLCBzbyBhIGNoYW5nZSBhbHdheXMgbWFwcyBhZnJlc2ggKG5vIGNvbXBvdW5kaW5nKS5cbiAgICAgIC8vIFJHQiBub3cgcmVjb2xvcnMgdG9vIChwZXItY2hhbm5lbCB3aW5kb3cvdmlzaWJpbGl0eSksIHNvIGRvbid0IGdhdGUgb25cbiAgICAgIC8vIGdyYXlzY2FsZS4gQ29hbGVzY2VkOiBQcmltZU5HJ3Mgc2xpZGVyIGZpcmVzIChvbkNoYW5nZSkgY29udGludW91c2x5LCBzb1xuICAgICAgLy8gYSBzaW5nbGUgZHJhZyB3b3VsZCBvdGhlcndpc2UgcXVldWUgZG96ZW5zIG9mIG92ZXJsYXBwaW5nIHJlc3RvcmUgK1xuICAgICAgLy8gcmUtcHJvY2VzcyByb3VuZHMgb3ZlciBldmVyeSBjaGFubmVsIGltYWdlLlxuICAgICAgdGhpcy5zY2hlZHVsZUludmFsaWRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZWVkIHRoZSBJbnRlbnNpdHkgY2hhbm5lbCB3aXRoIGEgbWVhc3VyZWQgYXV0by13aW5kb3cgd2hpbGUgaXQncyBzdGlsbFxuICAgKiAgYXQgZnVsbCByYW5nZSAobmV2ZXIgY2xvYmJlciB0aGUgdXNlcidzIG1hbnVhbCB3aW5kb3cpOyBpZiB0aGUgdXNlclxuICAgKiAgYWxyZWFkeSB3aW5kb3dlZCwganVzdCByZS1pbnZhbGlkYXRlIHNvIHBhaW50ZWQgdGlsZXMgcGljayB0aGUgTFVUIHVwLiAqL1xuICBwcml2YXRlIHNlZWRHcmF5V2luZG93KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNoMCA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKVswXTtcbiAgICBpZiAoY2gwICYmIGNoMC5taW4gPT09IDAgJiYgY2gwLm1heCA9PT0gMjU1KSB7XG4gICAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZSgwLCB7IG1pbiwgbWF4IH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWV3ZXIgJiYgdGhpcy5jb2xvckx1dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLm5hdmlnYXRvcj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vLW9wICovXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIElEYXRhUmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSB0aWxlLXNvdXJjZSBkZXNjcmlwdG9yIGZvciB0aGUgc2VsZWN0ZWQgZmlsZS4gVGhlIGBpbmZvYCBwYXJhbSBpc1xuICAgKiB0aGUgYmFzZTY0IFJhd0ZpbGVJbmZvIHRoZSByZXN0IG9mIHRoZSBBUEkgdXNlczsgdGhlIEdFVCBnb2VzIHRocm91Z2ggdGhlXG4gICAqIGF1dGggaW50ZXJjZXB0b3IgKEJlYXJlcikuIFdlIGFsc28gZ3JhYiBhIHRva2VuIGhlcmUgZm9yIE9TRCdzIG93biB0aWxlXG4gICAqIGZldGNoZXMgKGl0cyBsb2FkZXIgYnlwYXNzZXMgSHR0cENsaWVudCkuXG4gICAqL1xuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE9zZExvYWRlZD4ge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICAvLyBBIGRpZmZlcmVudCBpbWFnZSB3YXMgc2VsZWN0ZWQg4oCUIHN0b3AgdGhlIHByZXZpb3VzIHN0YWNrJ3MgYmFja2dyb3VuZFxuICAgIC8vIGxvYWRpbmcgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBmaW5pc2ggYmVoaW5kIHRoZSBuZXcgaW1hZ2UuXG4gICAgaWYgKGZpbGVuYW1lICYmIHRoaXMuY3VycmVudEZpbGVOYW1lICYmIGZpbGVuYW1lICE9PSB0aGlzLmN1cnJlbnRGaWxlTmFtZSkge1xuICAgICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgICAgdGhpcy5yZXZva2VTaW1wbGVGdWxsUmVzVXJscygpO1xuICAgIH1cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGZpbGVuYW1lKTtcbiAgICAvLyBTaW1wbGUgKGluLW1lbW9yeSAvIG5vbi10aWxlZCkgaW1hZ2U6IHNraXAgdGhlIHRpbGUgc2VydmVyIGVudGlyZWx5IOKAlCBub1xuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCwgbm8gL3RpbGVzL2luZm8gcG9sbC4gYHVybHNbekluZGV4XWAgaXMgYSBjb21wbGV0ZSBpbWFnZVxuICAgIC8vIE9TRCBvcGVucyB2aWEgaXRzIHNpbmdsZS1pbWFnZSBzb3VyY2UgKHNlZSBwbG90KCkpLlxuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGltYWdlSW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRTaW1wbGUoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybiB7IGRlc2NyaXB0b3I6IG51bGwsIGluZm9CNjQ6ICcnLCB6OiB6SW5kZXggfHwgMCwgZmlsZW5hbWUgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1dGhIZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlcy5nZXRBdXRoSGVhZGVycygpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5hdXRoSGVhZGVycyA9IHt9OyAvLyBmYWxsIGJhY2sgdG8gY29va2llIGF1dGggKGFqYXhXaXRoQ3JlZGVudGlhbHMpXG4gICAgfVxuICAgIC8vIFBvbGwgL3RpbGVzL2luZm86IHRoZSBiYWNrZW5kIHJldHVybnMgMjAyIHdoaWxlIHRoZSBzb3VyY2UgZmlsZSBpcyBzdGlsbFxuICAgIC8vIGJlaW5nIGNhY2hlZCAoR0NTLT5QVkMpIOKAlCBpdCBraWNrcyB0aGUgZG93bmxvYWQgb2ZmIGluIHRoZSBiYWNrZ3JvdW5kLCBzb1xuICAgIC8vIGVhY2ggcmVxdWVzdCBpcyBzaG9ydCAobm8gbG9uZy1oZWxkIGNvbm5lY3Rpb24gdG8gdHJpcCBpbmdyZXNzL3Byb3h5IG9yXG4gICAgLy8gY2xpZW50IHRpbWVvdXRzKSwgYW5kIDIwMCB3aXRoIHRoZSBkZXNjcmlwdG9yIG9uY2UgaXQncyByZWFkeS4gVGhlXG4gICAgLy8gY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSBzaG93cyBwcm9ncmVzcyBkdXJpbmcgdGhlIHdhaXQuIFdlIGdpdmUgdXAgYWZ0ZXJcbiAgICAvLyB0aWxlc0luZm9UaW1lb3V0TXMgc28gdGhlIHJlbmRlciBwaXBlbGluZSBuZXZlciBoYW5ncyAodGhlIHJvdXRlciB0aGVuXG4gICAgLy8gZmFsbHMgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UpLlxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfXRpbGVzL2luZm8/aW5mbz0ke2luZm9CNjR9YDtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLnRpbGVzSW5mb1RpbWVvdXRNcztcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGlsZXMvaW5mbyBub3QgcmVhZHkgYmVmb3JlIGRlYWRsaW5lIOKAlCBmaWxlIHN0aWxsIGNhY2hpbmcnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PFRpbGVEZXNjcmlwdG9yPih1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKHRpbWVvdXQoNDUwMDApKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDAgJiYgcmVzcC5ib2R5KSB7XG4gICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gcmVzcC5ib2R5O1xuICAgICAgICAgIHJldHVybiB7IGRlc2NyaXB0b3I6IHJlc3AuYm9keSwgaW5mb0I2NCwgejogekluZGV4IHx8IDAsIGZpbGVuYW1lIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gMjAyIEFjY2VwdGVkIChvciBlbXB0eSBib2R5KSDihpIgc3RpbGwgY2FjaGluZzsgZmFsbCB0aHJvdWdoIGFuZCByZS1wb2xsLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIFRvbGVyYXRlIHRyYW5zaWVudCBmYWlsdXJlcyBXSElMRSB0aGUgZmlsZSBpcyBiZWluZyBwcmVwYXJlZDogYSBzbG93XG4gICAgICAgIC8vIG1ldGFkYXRhIHJlYWQgb24gYSBtdWx0aS1HQiBmaWxlIChJRkQgd2FsayksIGEgNXh4IG1pZC1waXBlbGluZSwgYVxuICAgICAgICAvLyBwcm94eSBoaWNjdXAuIEEgc2luZ2xlIGJhZCBwb2xsIG11c3QgTk9UIGRyb3AgdXMgdG8gUGxvdGx5IOKAlCBhIGxhcmdlXG4gICAgICAgIC8vIGltYWdlIGFsd2F5cyBwYXNzZXMgdGhyb3VnaCB0aGlzIGJ1c3kgd2luZG93LCBzbyBiYWlsaW5nIGhlcmUgaXMgd2h5XG4gICAgICAgIC8vIGl0IFwiYWx3YXlzIGVuZHMgdXAgb24gUGxvdGx5XCIuIEtlZXAgcG9sbGluZyB1bnRpbCByZWFkeSBvciBkZWFkbGluZS5cbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTUwMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgYHBsb3QoKWAgcGF5bG9hZCBmb3IgYSBzaW1wbGUgKHRpbGVkOmZhbHNlKSBpbWFnZTogYSBzaW5nbGUtbGV2ZWxcbiAgICogIGRlc2NyaXB0b3Igc2l6ZWQgZnJvbSBgdHJ1ZUltYWdlU2l6ZWAsIHBsdXMgdGhlIGRpcmVjdGx5LWxvYWRhYmxlIFVSTCDigJRcbiAgICogIHJlc29sdmVkIGFuZCBmZXRjaGVkIHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlfSAoc2hhcmVkIHdpdGhcbiAgICogIG5hcGFyaS1qczsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIHJhdyBgZmV0Y2goKWAvYDxpbWc+YCkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNpbXBsZShpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxPc2RMb2FkZWQ+IHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMuYXV0aEhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZSA/PyBbMCwgMF07XG4gICAgY29uc3QgbWV0YSA9IGltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICAvLyBTRVJWRVJMRVNTIE1VTFRJQ0hBTk5FTDogY29tcG9zaXRlIHRoZSBzbGljZSdzIHBlci1jaGFubmVsIHBsYW5lc1xuICAgIC8vIGNsaWVudC1zaWRlIChubyB0aWxlIHNlcnZlciksIGRyaXZlbiBieSB0aGUgY2hhbm5lbCBwYW5lLiBLZXB0IE9GRiB0aGVcbiAgICAvLyB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoIChzZWUgY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKS5cbiAgICBjb25zdCBjaFVybHMgPSBpbWFnZUluZm8uY2hhbm5lbFVybHM7XG4gICAgdGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwgPSAhIWNoVXJscz8ubGVuZ3RoICYmIChtZXRhPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGxldCB1cmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFVybHMgPSBjaFVybHMgYXMgc3RyaW5nW11bXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFNpbXBsZUNoYW5uZWxQbGFuZXMoY2hVcmxzIVt6XSA/PyBjaFVybHMhWzBdKTtcbiAgICAgICAgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICAgICAgLy8gTkI6IGhpc3RvZ3JhbXMgYXJlIGJpbm5lZCBpbiBwbG90KCksIEFGVEVSIGRlc3Ryb3lWaWV3ZXIgY2xlYXJzIHRoZVxuICAgICAgICAvLyBzYW1wbGVyIOKAlCBjb21wdXRpbmcgdGhlbSBoZXJlIHdvdWxkIGJlIHdpcGVkIGJ5IHRoYXQgY2xlYXIuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUgbXVsdGljaGFubmVsIGNvbXBvc2l0ZSBmYWlsZWQnLCBlcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzID0gW107XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMgPSBbXTtcbiAgICAgIGNvbnN0IHJhd1VybCA9IHRoaXMuc2ltcGxlU3RhY2sudXJsRm9yKGltYWdlSW5mbywgeik7XG4gICAgICBpZiAocmF3VXJsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcHJldmlld1VybCA9IGF3YWl0IHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwocmF3VXJsKTtcbiAgICAgICAgICAvLyBVcHNjYWxlIHRoZSAoZG93bnNjYWxlZCkgcHJldmlldyB0byBmdWxsIHJlc29sdXRpb24gc28gT1NEJ3Mgd29ybGRcbiAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBmdWxsLXJlcyBST0kgY29vcmRpbmF0ZSBzcGFjZSDigJQgc2VlIHRvRnVsbFJlc1VybC5cbiAgICAgICAgICB1cmwgPSBhd2FpdCB0aGlzLnRvRnVsbFJlc1VybChwcmV2aWV3VXJsLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBzbGljZSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vIGxvYWRhYmxlIFVSTCAoZW1wdHkgdXJsc1tdIG9yIHRoZSBmZXRjaCBmYWlsZWQpOiBzaWduYWwgXCJjb3VsZG4ndFxuICAgIC8vIGxvYWRcIiB3aXRoIGEgbnVsbCBkZXNjcmlwdG9yIOKAlCBzYW1lIGFzIHRoZSB0aWxlZCBwYXRoIHdoZW4gdGhlcmUncyBub1xuICAgIC8vIHNlbGVjdGVkLWZpbGUgaW5mbyDigJQgc28gcGxvdCgpIHJldHVybnMgZmFsc2UgKGl0cyBgaWYgKCFkKWAgZ3VhcmQpIGFuZFxuICAgIC8vIHRoZSByb3V0ZXIgY2FuIGZhbGwgYmFjaywgaW5zdGVhZCBvZiBtb3VudGluZyBhbiA8aW1nPiB3aXRoIGFuIHVuZGVmaW5lZFxuICAgIC8vIHNyYyB0aGF0IHRocm93cyBhdCBydW50aW1lLlxuICAgIGlmICghdXJsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIHNsaWNlIGhhcyBubyBsb2FkYWJsZSBVUkw7IHNraXBwaW5nIE9TRCByZW5kZXInLCBmaWxlbmFtZSk7XG4gICAgICByZXR1cm4geyBkZXNjcmlwdG9yOiBudWxsLCBpbmZvQjY0OiAnJywgeiwgZmlsZW5hbWUgfTtcbiAgICB9XG4gICAgY29uc3QgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgPSB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpbGVTaXplOiAwLCAgICAgICAgICAgIC8vIHVudXNlZDogc2ltcGxlIG1vZGUgbmV2ZXIgY2FsbHMgYnVpbGRUaWxlU291cmNlXG4gICAgICB6OiAxLCAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZnJhbWVcbiAgICAgIGNoYW5uZWxzOiBtZXRhPy5yZ2JDaGFubmVscyA/PyAoaW1hZ2VJbmZvLmlzR3JheXNjYWxlID8gMSA6IDMpLFxuICAgICAgbXVsdGljaGFubmVsOiBmYWxzZSxcbiAgICAgIHJlYWxMZXZlbHM6IDEsXG4gICAgICBsZXZlbHM6IFt7IHJlczogMCwgd2lkdGgsIGhlaWdodCB9XSxcbiAgICAgIG1wcFg6IG1ldGE/Lm1wcFggPz8gMCxcbiAgICAgIG1wcFk6IG1ldGE/Lm1wcFkgPz8gMCxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgaW5mb0I2NDogJycsXG4gICAgICB6LFxuICAgICAgZmlsZW5hbWUsXG4gICAgICBzaW1wbGU6IHRydWUsXG4gICAgICB1cmwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0QncyBge3R5cGU6J2ltYWdlJ31gIHNvdXJjZSBzaXplcyBpdHMgY29vcmRpbmF0ZSB3b3JsZCB0byB0aGUgaW1hZ2Unc1xuICAgKiBOQVRVUkFMIHBpeGVscy4gQSBmb2xkZXItc3RhY2sgc2xpY2UgaXMgYSBzZXJ2ZXIgYC9wcmV2aWV3YCB3aG9zZSBwaXhlbCBzaXplXG4gICAqIG5lZWRuJ3QgbWF0Y2ggdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSDigJQgaXQgbWF5IGJlIGRvd25zY2FsZWQgKGxhcmdlXG4gICAqIGltYWdlcykgT1IgbGFyZ2VyIHRoYW4gdGhlIGRpbWVuc2lvbnMgYC9tZXRhZGF0YWAgcmVwb3J0cy4gRWl0aGVyIHdheSBPU0Qnc1xuICAgKiB3b3JsZCB3b3VsZCBkaWZmZXIgZnJvbSB0aGUgZnVsbC1yZXMgUk9JIGNvb3JkaW5hdGUgc3BhY2UgKFF1UGF0aCBnZW9qc29uLFxuICAgKiBpbiBsZXZlbC0wIHBpeGVscyk6IGEgc21hbGxlciBwcmV2aWV3IHJlbmRlcnMgUk9JcyBvdmVyc2l6ZWQsIGEgbGFyZ2VyIG9uZVxuICAgKiByZW5kZXJzIHRoZW0gdW5kZXJzaXplZC9vZmZzZXQuIFJlc2FtcGxlIHRoZSBwcmV2aWV3IHRvIEVYQUNUTFkgdGhlXG4gICAqIGZ1bGwtcmVzb2x1dGlvbiBkaW1lbnNpb25zIChibHVycnkgYnV0IHBvc2l0aW9uYWxseSBleGFjdCDigJQgc2NhbGluZyB1cCBvclxuICAgKiBkb3duIGFzIG5lZWRlZCkgc28gT1NEJ3Mgd29ybGQgbWF0Y2hlcyB0aGUgUk9JIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWxlIHN0aWxsXG4gICAqIHVzaW5nIE9TRCdzIHJlbGlhYmxlIHNpbmdsZS1pbWFnZSByZW5kZXJlci4gQ2FjaGVkIHBlciBwcmV2aWV3IFVSTCAocmV2b2tlZFxuICAgKiBvbiBmaWxlIGNoYW5nZSk7IGEgbm8tb3Agd2hlbiB0aGUgcHJldmlldyBpcyBhbHJlYWR5IGV4YWN0bHkgZnVsbC1yZXMgKHNtYWxsXG4gICAqIGltYWdlcywgaW4tbWVtb3J5IHBpcGVsaW5lIGJsb2JzKSwgd2hlbiB0aGUgZGltcyBhcmUgdW5rbm93biwgb3Igd2hlblxuICAgKiB0aGV5J3JlIGltcGxhdXNpYmx5IGxhcmdlIChndWFyZHMgYWdhaW5zdCBhbiBlbm9ybW91cyBjYW52YXMpLiAoaml0LXVpIzkzKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0b0Z1bGxSZXNVcmwocHJldmlld1VybDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0IHx8IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpID4gdGhpcy5TSU1QTEVfVVBTQ0FMRV9NQVhfRElNKSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLmdldChwcmV2aWV3VXJsKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwocHJldmlld1VybCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gcHJldmlld1VybDsgLy8gY291bGRuJ3QgZGVjb2RlIOKAlCBsZXQgT1NEIHRyeSB0aGUgVVJMIGFzLWlzXG4gICAgfVxuICAgIC8vIEFscmVhZHkgdGhlIGV4YWN0IGZ1bGwtcmVzIHdvcmxkIOKAlCBubyByZXNhbXBsZSBuZWVkZWQuIChBIHByZXZpZXcgdGhhdCBpc1xuICAgIC8vIGxhcmdlciBPUiBzbWFsbGVyIHRoYW4gZnVsbC1yZXMgbXVzdCBzdGlsbCBiZSByZXNpemVkIHNvIE9TRCdzIHdvcmxkID09XG4gICAgLy8gdGhlIFJPSSBjb29yZGluYXRlIHNwYWNlOyBvbmx5IGFuIGV4YWN0IG1hdGNoIGlzIHNraXBwYWJsZS4pXG4gICAgaWYgKGltZy5uYXR1cmFsV2lkdGggPT09IHdpZHRoICYmIGltZy5uYXR1cmFsSGVpZ2h0ID09PSBoZWlnaHQpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsgLy8gc2NhbGUgcHJldmlldyAodXAgb3IgZG93bikgdG8gZnVsbC1yZXNcbiAgICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFByb21pc2U8QmxvYiB8IG51bGw+KChyZXNvbHZlKSA9PiBjYW52YXMudG9CbG9iKHJlc29sdmUpKTtcbiAgICBpZiAoIWJsb2IpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGZ1bGxSZXNVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuc2V0KHByZXZpZXdVcmwsIGZ1bGxSZXNVcmwpO1xuICAgIHJldHVybiBmdWxsUmVzVXJsO1xuICB9XG5cbiAgLyoqIFNhbXBsZSBhIFNJTVBMRS1tb2RlIHNsaWNlJ3Mgb3duIGRlY29kZWQgcGl4ZWxzIGludG8gdGhlIGhpc3RvZ3JhbSDigJQgdGhlXG4gICAqICBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgc2FtcGxlcnMgKG5vIHRpbGUgc2VydmVyKS4gRmlyZS1hbmQtZm9yZ2V0O1xuICAgKiAgYSBkZWNvZGUgZmFpbHVyZSBqdXN0IGxlYXZlcyB0aGUgcGFuZSBlbXB0eSByYXRoZXIgdGhhbiB0aHJvd2luZy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzYW1wbGVTaW1wbGVIaXN0b2dyYW0odXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwodXJsKTtcbiAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoLCBoID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICBpZiAoIXcgfHwgIWgpIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSB3OyBjLmhlaWdodCA9IGg7XG4gICAgICBjb25zdCBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTtcbiAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlSGlzdG9ncmFtKHosIGRhdGEsIHRoaXMuaXNHcmF5c2NhbGVJbWFnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIGhpc3RvZ3JhbSBzYW1wbGUgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogRmV0Y2ggKyBkZWNvZGUgYSBzbGljZSdzIHBlci1jaGFubmVsIHBsYW5lcyAoc2luZ2xlLWJhbmQgZ3JheXNjYWxlKSBpbnRvXG4gICAqICBwaXhlbCBidWZmZXJzLCBmb3IgdGhlIFNFUlZFUkxFU1MgbXVsdGljaGFubmVsIGNvbXBvc2l0b3IuIEF1dGgtc2FmZTogZ29lc1xuICAgKiAgdGhyb3VnaCBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgKGJsb2I6L2RhdGE6IGFzLWlzOyBodHRwIHZpYSBIdHRwQ2xpZW50KS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2ltcGxlQ2hhbm5lbFBsYW5lcyh1cmxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdXJscyA/PyBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJldmlld1VybCA9IGF3YWl0IHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwodSk7XG4gICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwocHJldmlld1VybCk7XG4gICAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoLCBoID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIGlmICghdyB8fCAhaCkgeyBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTsgY29udGludWU7IH1cbiAgICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjLndpZHRoID0gdzsgYy5oZWlnaHQgPSBoO1xuICAgICAgICBjb25zdCBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICAgIGlmICghY3R4KSB7IHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pOyBjb250aW51ZTsgfVxuICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgIHBsYW5lcy5wdXNoKHsgZGF0YTogY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhLCB3aWR0aDogdywgaGVpZ2h0OiBoIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gY2hhbm5lbCBwbGFuZSBkZWNvZGUgZmFpbGVkJywgZXJyKTtcbiAgICAgICAgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyA9IHBsYW5lcztcbiAgfVxuXG4gIC8qKiBDb21wb3NpdGUgdGhlIGNhY2hlZCBwZXItY2hhbm5lbCBwbGFuZXMgaW50byBPTkUgUkdCQSBpbWFnZSB1c2luZyB0aGVcbiAgICogIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgKGNvbG91ci93aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSkg4oCUIHRoZSBjbGllbnQtc2lkZSxcbiAgICogIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBwZXItY2hhbm5lbCAnbGlnaHRlcicgY29tcG9zaXRvclxuICAgKiAgKHNhbWUgZGlzcGxheS5jaGFubmVsUmdiTHV0IG1hdGggYXMgcmVjb2xvckNoYW5uZWxUaWxlLCBhcHBsaWVkIHBlci1wbGFuZSkuXG4gICAqICBSZXR1cm5zIGEgYmxvYjogVVJMIG9mIHRoZSBjb21wb3NpdGUgUE5HLCByZXZva2luZyB0aGUgcHJldmlvdXMgb25lLiAqL1xuICBwcml2YXRlIGFzeW5jIGNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcztcbiAgICBpZiAoIXBsYW5lcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdyA9IHBsYW5lc1swXS53aWR0aCwgaCA9IHBsYW5lc1swXS5oZWlnaHQ7XG4gICAgaWYgKCF3IHx8ICFoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodyAqIGggKiA0KTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IHBsYW5lcy5sZW5ndGg7IGMrKykge1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbY107XG4gICAgICBpZiAoc3QgJiYgc3QudmlzaWJsZSA9PT0gZmFsc2UpIGNvbnRpbnVlOyAvLyBoaWRkZW4gY2hhbm5lbCBjb250cmlidXRlcyBub3RoaW5nXG4gICAgICBjb25zdCBwbGFuZSA9IHBsYW5lc1tjXTtcbiAgICAgIGlmIChwbGFuZS53aWR0aCAhPT0gdyB8fCBwbGFuZS5oZWlnaHQgIT09IGggfHwgIXBsYW5lLmRhdGEubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgciwgZywgYiB9ID0gdGhpcy5kaXNwbGF5LmNoYW5uZWxSZ2JMdXQoc3QpO1xuICAgICAgY29uc3QgcGQgPSBwbGFuZS5kYXRhO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgaWYgKHBkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGx1bSA9IHBkW2ldOyAvLyBzaW5nbGUtYmFuZCBwbGFuZSAoUj1HPUIpXG4gICAgICAgIG91dFtpXSArPSByW2x1bV07ICAgICAgICAgIC8vIFVpbnQ4Q2xhbXBlZEFycmF5IGNsYW1wcyDihpIgYWRkaXRpdmUgKCdsaWdodGVyJylcbiAgICAgICAgb3V0W2kgKyAxXSArPSBnW2x1bV07XG4gICAgICAgIG91dFtpICsgMl0gKz0gYltsdW1dO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IG91dC5sZW5ndGg7IGkgKz0gNCkgb3V0W2ldID0gMjU1OyAvLyBvcGFxdWVcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3OyBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEob3V0LCB3LCBoKSwgMCwgMCk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzKSA9PiBjYW52YXMudG9CbG9iKHJlcywgJ2ltYWdlL3BuZycpKTtcbiAgICBpZiAoIWJsb2IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKSBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKTtcbiAgICB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgcmV0dXJuIHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsO1xuICB9XG5cbiAgLyoqIFJlLWNvbXBvc2l0ZSB0aGUgY3VycmVudCBzbGljZSBmcm9tIGl0cyBjYWNoZWQgcGxhbmVzIChuZXcgY2hhbm5lbCBzdGF0ZXMpXG4gICAqICBhbmQgcmUtb3BlbiDigJQgdGhlIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBpbnZhbGlkYXRlLW9uLWNoYW5uZWwtY2hhbmdlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29tcG9zaXRlQW5kT3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpO1xuICAgIGlmICghdXJsIHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIHRyeSB7IHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmwgfSBhcyBhbnkpOyB9IGNhdGNoIHsgLyogdmlld2VyIGdvbmUgKi8gfVxuICB9XG5cbiAgLyoqIExvYWQgYSBVUkwgaW50byBhbiBIVE1MSW1hZ2VFbGVtZW50IChyZXNvbHZlcyBvbmNlIGRlY29kZWQpLiBVc2VzXG4gICAqICBkb2N1bWVudC5jcmVhdGVFbGVtZW50IHJhdGhlciB0aGFuIGBuZXcgSW1hZ2UoKWAgYmVjYXVzZSB0aGlzIGZpbGUnc1xuICAgKiAgYEltYWdlYCBpbXBvcnQgaXMgaW1hZ2UtanMncyBkZWNvZGVyLCBub3QgdGhlIERPTSBlbGVtZW50LiAqL1xuICBwcml2YXRlIGxvYWRJbWFnZUVsKHVybDogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICAgIGltZy5vbmVycm9yID0gKGUpID0+IHJlamVjdChlKTtcbiAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJldm9rZVNpbXBsZUZ1bGxSZXNVcmxzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdSBvZiB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLnZhbHVlcygpKSBVUkwucmV2b2tlT2JqZWN0VVJMKHUpO1xuICAgIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpIHsgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCk7IHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsID0gbnVsbDsgfVxuICB9XG5cbiAgLyoqIE1vdW50IHRoZSB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSBwb2ludGluZyBhdCBgR0VUIC90aWxlYC4gKi9cbiAgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IGFueSxcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgX3NjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIF9wbG90VHlwZTogUGxvdFR5cGUsXG4gICAgaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGltYWdlTG9hZGVkIGFzIE9zZExvYWRlZDtcbiAgICBjb25zdCBkID0gbG9hZGVkPy5kZXNjcmlwdG9yO1xuICAgIGlmICghZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgLy8gUmUtZXN0YWJsaXNoIHRoZSBjb2xvcm1hcCBzdWJzY3JpcHRpb24gaWYgYSBwcmlvciBjb21wb25lbnQgdGVhcmRvd25cbiAgICAvLyAodW5zdWJzY3JpYmUoKSkgdG9yZSBpdCBkb3duIOKAlCB0aGlzIHNlcnZpY2UgaXMgYSByb290IHNpbmdsZXRvbiwgc28gdGhlXG4gICAgLy8gY29uc3RydWN0b3Igd29uJ3QgcnVuIGFnYWluIHRvIHJlY3JlYXRlIGl0LlxuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgICAvLyBPU0QgdGlsZXMgbmF0aXZlbHksIHNvIHRoZSBpbi1wbGFjZSAobGFyZ2UpIHBhc3MgaXMgbm9ybWFsbHkgYSBuby1vcFxuICAgIC8vIG9uY2UgbW91bnRlZCDigJQgdGhlIHRpbGUgcHlyYW1pZCBJUyB0aGUgZnVsbCByZXNvbHV0aW9uIHJlZ2FyZGxlc3Mgb2ZcbiAgICAvLyB3aGljaCBJbWFnZUluZm8gdGllciByZXF1ZXN0ZWQgaXQuIFNpbXBsZSBtb2RlIGhhcyBubyBweXJhbWlkIHRvIGZhbGxcbiAgICAvLyBiYWNrIG9uOiBpdCBkaXNwbGF5cyBsaXRlcmFsbHkgd2hhdGV2ZXIgVVJMIHdhcyBsYXN0IG9wZW5lZCwgc29cbiAgICAvLyB3aXRob3V0IHRoaXMgc3dhcCB0aGUgc21hbGwgdGllcidzIDEyOHB4IHBsYWNlaG9sZGVyIHdvdWxkIHN0YXkgb25cbiAgICAvLyBzY3JlZW4gZm9yZXZlciAocGl4ZWxhdGVkLCBuZXZlciBcInNoYXJwZW5pbmdcIiBsaWtlIHRoZSB0aWxlZCBwYXRoKS5cbiAgICBpZiAoaW5QbGFjZSAmJiB0aGlzLnZpZXdlcikge1xuICAgICAgaWYgKGxvYWRlZC5zaW1wbGUgJiYgbG9hZGVkLnVybCkge1xuICAgICAgICAvLyBBbHNvIHJlZnJlc2ggc2ltcGxlVXJscyB0byBUSElTIHBoYXNlJ3MgKGxhcmdlLXRpZXIpIHVybHNbXSDigJQgaXQgd2FzXG4gICAgICAgIC8vIHNldCBmcm9tIHRoZSBzbWFsbCB0aWVyJ3MgMTI4cHggdXJscyBvbiB0aGUgaW5pdGlhbCBtb3VudCBiZWxvdyxcbiAgICAgICAgLy8gd2hpY2ggbmV2ZXIgcnVucyBhZ2FpbiBmb3IgdGhlIGluLXBsYWNlIHBhc3MuIFdpdGhvdXQgdGhpcyxcbiAgICAgICAgLy8gc2V0WkluZGV4J3MgbGF0ZXIgc2xpZGVyIHNjcnVicyB3b3VsZCBrZWVwIHJlYWRpbmcgdGhlIHNtYWxsXG4gICAgICAgIC8vIHRpZXIncyBsb3ctcmVzIFVSTHMgZm9yZXZlciwgZXZlbiB0aG91Z2ggdGhlIGluaXRpYWwgc2xpY2Ugd2FzXG4gICAgICAgIC8vIGNvcnJlY3RseSBzd2FwcGVkIHRvIGZ1bGwgcmVzb2x1dGlvbiBoZXJlLlxuICAgICAgICB0aGlzLnNpbXBsZVVybHMgPSBpbWFnZUluZm8/LnVybHMgPz8gdGhpcy5zaW1wbGVVcmxzO1xuICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsOiBsb2FkZWQudXJsIH0gYXMgYW55KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5jdXJyZW50RmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRvciA9IGQ7XG4gICAgdGhpcy5pbmZvQjY0ID0gbG9hZGVkLmluZm9CNjQ7XG4gICAgdGhpcy5jdXJyZW50WiA9IGxvYWRlZC56O1xuICAgIHRoaXMuc2ltcGxlTW9kZSA9ICEhbG9hZGVkLnNpbXBsZTtcbiAgICB0aGlzLnNpbXBsZVVybHMgPSBsb2FkZWQuc2ltcGxlID8gKGltYWdlSW5mbz8udXJscyA/PyBbXSkgOiBbXTtcbiAgICAvLyBUaGUgZGVzY3JpcHRvcidzIHBoeXNpY2FsIHBpeGVsIHNpemUgKHNlcnZlciBCaW8tRm9ybWF0cyBgL3RpbGVzL2luZm9gKSBpc1xuICAgIC8vIGF1dGhvcml0YXRpdmUg4oCUIHB1c2ggaXQgaW50byB0aGUgc2hhcmVkIG1ldGEgc28gdGhlIFJlZ2lvbiBFZGl0b3IgcmVwb3J0c1xuICAgIC8vIGFyZWFzIGluIMK1bcKyL21twrIsIG1hdGNoaW5nIHRoZSBzY2FsZSBiYXIgYnVpbHQgZnJvbSBgZC5tcHBYYCBiZWxvdy5cbiAgICB0aGlzLnN0b3JlLnNldFBoeXNpY2FsUGl4ZWxTaXplKGQubXBwWCwgZC5tcHBZKTtcbiAgICAvLyBVc2UgdGhlIFNBTUUgZ3JheXNjYWxlIGZsYWcgdGhlIGNvbG9ybWFwIGRyb3Bkb3duIC8gUGxvdGx5IHVzZVxuICAgIC8vIChpbWFnZUluZm8uaXNHcmF5c2NhbGUg4oaQIHJnYkNoYW5uZWxzID09PSAxKS4gVGhlIGRlc2NyaXB0b3IncyBgY2hhbm5lbHNgXG4gICAgLy8gKGNoYW5uZWxDb3VudCkgZGl2ZXJnZXMgZnJvbSByZ2JDaGFubmVscyBmb3Igc3RhY2tzLCB3aGljaCBsZWZ0IGdyYXlzY2FsZVxuICAgIC8vIHN0YWNrcyB1bi1yZWNvbG9yZWQgZXZlbiB0aG91Z2ggdGhlIGNvbG9ybWFwIHNlbGVjdG9yIHdhcyBzaG93bi5cbiAgICB0aGlzLmlzR3JheXNjYWxlSW1hZ2UgPSAhIWltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgLy8gU2ltcGxlIChub24tdGlsZWQsIGluLW1lbW9yeSkgaW1hZ2U6IG5vIHB5cmFtaWQsIG5vIHBlci1jaGFubmVsIHRpbGVzLCBhbmRcbiAgICAvLyBubyBzZXJ2ZXItc2lkZSBpbnRlbnNpdHkgc2FtcGxpbmcg4oCUIE9TRCdzIHNpbmdsZS1pbWFnZSBzb3VyY2UgZGVjb2Rlc1xuICAgIC8vIHVybHNbel0gZGlyZWN0bHkuIFNraXAgdGhlIHdob2xlIHRpbGVkLXNldHVwIHBhdGggYmVsb3cuXG4gICAgY29uc3Qgc2ltcGxlID0gISFsb2FkZWQuc2ltcGxlO1xuICAgIGlmIChzaW1wbGUpIHtcbiAgICAgIHRoaXMucmVhbExldmVscyA9IDE7XG4gICAgICB0aGlzLmlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gICAgICB0aGlzLmNhY2hlLmNsZWFyQ2hhbm5lbEdyb3VwcygpO1xuICAgICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIGhpc3RvZ3JhbSDigJQgQUZURVIgZGVzdHJveVZpZXdlciAoaXRzIGxhc3QgYWN0IGlzIHNhbXBsZXIuY2xlYXIoKSkuXG4gICAgICAvLyBNdWx0aWNoYW5uZWwgYmlucyBlYWNoIGNhY2hlZCBjaGFubmVsIHBsYW5lOyBzaW5nbGUtYmFuZCAvIFJHQiBiaW5zIHRoZVxuICAgICAgLy8gZGVjb2RlZCBmcmFtZSdzIG93biBwaXhlbHMuXG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVNdWx0aWNoYW5uZWxIaXN0b2dyYW1zKGxvYWRlZC56LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbShsb2FkZWQudXJsLCBsb2FkZWQueik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UgKGluZGV4ZWQvTFVULWJlYXJpbmcgc3RhY2tzKSBjb21wb3NpdGUgY2xpZW50LXNpZGVcbiAgICAgIC8vIGZyb20gcGVyLWNoYW5uZWwgdGlsZXMuIFRydXN0IHRoZSBzZXJ2ZXIncyBleHBsaWNpdCBgbXVsdGljaGFubmVsYCBmbGFnIOKAlCB0aGVcbiAgICAgIC8vIG9sZCBgY2hhbm5lbHM+MSAmJiBncmF5c2NhbGVgIGhldXJpc3RpYyBhbHNvIG1hdGNoZWQgUkdCIHBob3RvcyBCaW8tRm9ybWF0c1xuICAgICAgLy8gcmVhZHMgYXMgc2VwYXJhdGVkIHBsYW5lcyAoY2hhbm5lbHM+MSwgcmdiQ2hhbm5lbHM9PTEpLCBzcGxpdHRpbmcgdGhlbSBpbnRvIE5cbiAgICAgIC8vIHBlci1jaGFubmVsIFRpbGVkSW1hZ2VzIHRoYXQgZmxvb2RlZCB0aGUgdGlsZSBlbmRwb2ludCBhbmQgaHVuZyBvbiBsb2FkLlxuICAgICAgdGhpcy5yZWFsTGV2ZWxzID0gZC5yZWFsTGV2ZWxzID8/IGQubGV2ZWxzLmxlbmd0aDtcbiAgICAgIC8vIFRpbGVzIHRvIGNvdmVyIHRoZSB3aG9sZSBpbWFnZSBhdCB0aGUgY29hcnNlc3QgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbCAodGhlXG4gICAgICAvLyBzbWFsbGVzdCBsZXZlbCB0aGF0IGhhcyByZWFsLCBwZXItY2hhbm5lbC1mZXRjaGFibGUgdGlsZXMg4oCUIHN5bnRoZXRpYyBvdmVydmlld1xuICAgICAgLy8gbGV2ZWxzIGFyZSBzZXJ2ZXItY29tcG9zaXRlZCBvbmx5KS4gQSBweXJhbWlkYWwgaW1hZ2UncyBjb2Fyc2VzdCByZWFsIGxldmVsIGlzXG4gICAgICAvLyB0aW55IChmZXcgdGlsZXMpOyBhIGZsYXQvbm8tcHlyYW1pZCBpbWFnZSdzIGlzIHRoZSBmdWxsLXJlcyBncmlkIChtYW55IHRpbGVzKS5cbiAgICAgIGNvbnN0IGNvYXJzZSA9IGQubGV2ZWxzW3RoaXMucmVhbExldmVscyAtIDFdID8/IGQubGV2ZWxzW2QubGV2ZWxzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgY29hcnNlVyA9IGNvYXJzZSA/IE1hdGguY2VpbChjb2Fyc2Uud2lkdGggLyBkLnRpbGVTaXplKSA6IDE7XG4gICAgICBjb25zdCBjb2Fyc2VIID0gY29hcnNlID8gTWF0aC5jZWlsKGNvYXJzZS5oZWlnaHQgLyBkLnRpbGVTaXplKSA6IDE7XG4gICAgICBjb25zdCBjb2Fyc2VUaWxlcyA9IGNvYXJzZVcgKiBjb2Fyc2VIO1xuICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9ICEhZC5tdWx0aWNoYW5uZWw7XG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICAvLyBQZXItY2hhbm5lbCByZW5kZXJpbmcgY2FuIG9ubHkgdXNlIHRoZSBSRUFMIGxldmVscywgc28gT1NEIHJlcXVlc3RzIHRoZVxuICAgICAgICAvLyBjb2Fyc2VzdCByZWFsIGxldmVsJ3Mgd2hvbGUgdGlsZSBncmlkIMOXIE4gY2hhbm5lbHMgYXQgZml0LiBXaGVuIHRoYXQncyBsYXJnZVxuICAgICAgICAvLyAoYSB3aG9sZS1zbGlkZSksIGl0J3MgdG9vIG1hbnkgKG9mdGVuIHNsb3csIHB5cmFtaWQtbGVzcykgZnVsbC1yZXMgcmVhZHMg4oCUXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgc2luZ2xlIHNlcnZlci1jb21wb3NpdGVkIHNvdXJjZSAod2hpY2gga2VlcHMgdGhlIGZhc3RcbiAgICAgICAgLy8gc3ludGhldGljIG92ZXJ2aWV3cykuIEEgc21hbGwgc2luZ2xlLUZPViB6LXN0YWNrIHN0YXlzIHBlci1jaGFubmVsLiBTaXplIGluXG4gICAgICAgIC8vIEJZVEVTIGlzbid0IHRoZSBzaWduYWwg4oCUIHRpbGUgY291bnQgaXMuXG4gICAgICAgIGNvbnN0IGZpdFRpbGVzID0gY29hcnNlVGlsZXMgKiBNYXRoLm1heCgxLCBkLmNoYW5uZWxzID8/IDEpO1xuICAgICAgICBpZiAoZml0VGlsZXMgPiB0aGlzLk1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTKSB7XG4gICAgICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbT1NEXSBtdWx0aWNoYW5uZWwgY29tcG9zaXRlIHRvbyBsYXJnZSBmb3IgcGVyLWNoYW5uZWwgcmVuZGVyaW5nOiAnICtcbiAgICAgICAgICAgIGAke2NvYXJzZVd9eCR7Y29hcnNlSH0gdGlsZXMgeCAke2QuY2hhbm5lbHN9IGNoYW5uZWxzID0gJHtmaXRUaWxlc30gYXQgdGhlIGNvYXJzZXN0IGAgK1xuICAgICAgICAgICAgYHJlYWwgbGV2ZWwgKD4gJHt0aGlzLk1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTfSk7IHJlbmRlcmluZyBzZXJ2ZXItY29tcG9zaXRlZCBmb3Igc3BlZWQuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlLmNsZWFyQ2hhbm5lbEdyb3VwcygpO1xuICAgICAgLy8gQXV0by1yYW5nZSBncmF5c2NhbGUgdGlsZXMgdG8gdGhlIGltYWdlJ3MgYWN0dWFsIGludGVuc2l0eSBzcGFuIChsaWtlIHRoZVxuICAgICAgLy8gaGVhdG1hcCksIHNhbXBsaW5nIHRoZSBjb2Fyc2VzdCB0aWxlIGxldmVsIHNvIHRoZSB3aW5kb3cgbWF0Y2hlcyB0aGUgcmF3XG4gICAgICAvLyB0aWxlIHZhbHVlcy4gRmlyZS1hbmQtZm9yZ2V0OiBpdCByZS1pbnZhbGlkYXRlcyBvbmNlIHRoZSB3aW5kb3cgaXMga25vd247XG4gICAgICAvLyB0aWxlcyBwYWludCB1bndpbmRvd2VkIHVudGlsIHRoZW4uIChNdWx0aWNoYW5uZWwgd2luZG93cyBhcmUgcGVyLWNoYW5uZWwsXG4gICAgICAvLyBkZWZhdWx0aW5nIHRvIGZ1bGwgcmFuZ2U7IHRoZSB1c2VyIGF1dG8vZWRpdHMgZWFjaCBjaGFubmVsLilcbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlTXVsdGlDaGFubmVsSGlzdG9ncmFtcyhkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyhkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnopO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gICAgICAvLyBTaXplIHRoZSBzbGljZSBjYWNoZSBmb3IgdGhpcyBpbWFnZTogTFJVIGNhcCB0byBob2xkIHRoZSB3aG9sZSBzdGFja1xuICAgICAgLy8gKGNhcHBlZCkgYW5kIHNraXAgYmFja2dyb3VuZCBwcmVsb2FkaW5nIGZvciBzdGFja3MgdG9vIGxhcmdlIHRvIHByZWxvYWRcbiAgICAgIC8vICh3b3VsZCBmbG9vZCBmdWxsLXJlcyByZWFkcykuIE5vcm1hbCBzdGFja3Mga2VlcCB0aGUgZmxpY2tlci1mcmVlIHByZS1jYWNoZS5cbiAgICAgIHRoaXMuY2FjaGUuY29uZmlndXJlKGQueiA/PyAxLCBjb2Fyc2VUaWxlcyk7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIG1vZGU6IE9TRCdzIHNpbmdsZS1pbWFnZSBzb3VyY2UgZGVjb2RlcyB0aGUgVVJMIChibG9iOi9kYXRhOi9odHRwKVxuICAgIC8vIGRpcmVjdGx5IOKAlCBubyBweXJhbWlkLCBubyBzZXJ2ZXIuIFRpbGVkIG1vZGU6IHRoZSBjdXN0b20gc2VydmVyLWJhY2tlZCB0aWxlXG4gICAgLy8gc291cmNlIChtdWx0aWNoYW5uZWwgb3BlbnMgb24gY2hhbm5lbCAwOyB0aGUgb3BlbiBoYW5kbGVyIHRoZW4gc3dhcHMgaW4gdGhpc1xuICAgIC8vIHNsaWNlJ3MgcGVyLWNoYW5uZWwgZ3JvdXAgYW5kIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBwcmUtZmlsbHMgdGhlIHJlc3QpLlxuICAgIGNvbnN0IHRpbGVTb3VyY2UgPSBzaW1wbGVcbiAgICAgID8geyB0eXBlOiAnaW1hZ2UnLCB1cmw6IGxvYWRlZC51cmwgfVxuICAgICAgOiB0aGlzLmJ1aWxkVGlsZVNvdXJjZShkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnosIHRoaXMuaXNNdWx0aUNoYW5uZWwgPyAwIDogdW5kZWZpbmVkKTtcbiAgICBzaWxlbmNlT3NkTXVsdGlJbWFnZUFkdmlzb3J5KCk7XG4gICAgdGhpcy52aWV3ZXIgPSAoT1NEIGFzIGFueSkoe1xuICAgICAgaWQ6IHBsb3REaXYsXG4gICAgICAvLyBTaW1wbGUtbW9kZSB6LXNjcnViIGNhbGxzIHZpZXdlci5vcGVuKCkgYWdhaW4gcGVyIHNsaWNlIChzZWVcbiAgICAgIC8vIHNldFpJbmRleCkg4oCUIHdpdGhvdXQgdGhpcyBpdCByZXNldHMgdG8gdGhlIGhvbWUgem9vbS9wYW4gb24gZXZlcnlcbiAgICAgIC8vIHNsaWNlIGNoYW5nZS4gVGlsZWQgbW9kZSBuZXZlciByZS1vcGVucyAoaXQgdG9nZ2xlcyBwcmUtYWRkZWRcbiAgICAgIC8vIFRpbGVkSW1hZ2VzJyBvcGFjaXR5IGluc3RlYWQpLCBzbyB0aGlzIGlzIGEgbm8tb3AgdGhlcmUuXG4gICAgICBwcmVzZXJ2ZVZpZXdwb3J0OiB0cnVlLFxuICAgICAgLy8gVXNlIHRoZSAyRCBjYW52YXMgZHJhd2VyLCBub3QgV2ViR0w6IGNyZWF0aW5nL2Rlc3Ryb3lpbmcgYSB2aWV3ZXIgb25cbiAgICAgIC8vIGVhY2ggZW5naW5lIHRvZ2dsZSAvIGltYWdlIGxvYWQgY2h1cm5zIFdlYkdMIGNvbnRleHRzIChicm93c2VycyBjYXBcbiAgICAgIC8vIGhvdyBtYW55IGV4aXN0IGF0IG9uY2UpLCB3aGljaCBzdXJmYWNlcyBhcyBcIldlYkdMIGNvbnRleHQgd2FzIGxvc3RcIlxuICAgICAgLy8gYW5kIGJsYW5rIHRpbGVzLiBUaGUgY2FudmFzIGRyYXdlciBoYXMgbm8gc3VjaCBsaW1pdC5cbiAgICAgIGRyYXdlcjogJ2NhbnZhcycsXG4gICAgICBzaG93TmF2aWdhdGlvbkNvbnRyb2w6IGZhbHNlLCAvLyBhdm9pZHMgbmVlZGluZyB0aGUgaWNvbi1pbWFnZSBhc3NldHNcbiAgICAgIC8vIE92ZXJ2aWV3IHRodW1ibmFpbCB3aXRoIHRoZSBjdXJyZW50LXZpZXdwb3J0IHJlY3RhbmdsZSwgYm90dG9tLXJpZ2h0LlxuICAgICAgc2hvd05hdmlnYXRvcjogdGhpcy5uYXZpZ2F0b3JWaXNpYmxlLFxuICAgICAgLy8gTmVhcmVzdC1uZWlnaGJvdXIgd2hlbiBvZmYg4oaSIGNyaXNwIHBpeGVscyBvbiB6b29tLWluIChwaXhlbCBpbnNwZWN0aW9uKS5cbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogdGhpcy5zbW9vdGhpbmdFbmFibGVkLFxuICAgICAgbmF2aWdhdG9yUG9zaXRpb246ICdCT1RUT01fUklHSFQnLFxuICAgICAgbmF2aWdhdG9yU2l6ZVJhdGlvOiAwLjE2LFxuICAgICAgbmF2aWdhdG9yQXV0b0ZhZGU6IGZhbHNlLFxuICAgICAgbmF2aWdhdG9yQmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsMC41KScsXG4gICAgICBsb2FkVGlsZXNXaXRoQWpheDogdHJ1ZSxcbiAgICAgIGFqYXhXaXRoQ3JlZGVudGlhbHM6IHRydWUsIC8vIGNvb2tpZSBhdXRoIChvYXV0aDItcHJveHkpXG4gICAgICBhamF4SGVhZGVyczogdGhpcy5hdXRoSGVhZGVycywgLy8gYmVhcmVyIGF1dGggKEF1dGgwKSwgd2hlbiBhdmFpbGFibGVcbiAgICAgIGNyb3NzT3JpZ2luUG9saWN5OiAnQW5vbnltb3VzJyxcbiAgICAgIC8vIEdlbnRsZXIgem9vbTogdGhlIGRlZmF1bHQgKDEuMikgZmVlbHMgZmFzdCBhbmQgYmlnIGp1bXBzIGNyb3NzIHNldmVyYWxcbiAgICAgIC8vIHB5cmFtaWQgbGV2ZWxzIGF0IG9uY2UsIGZpcmluZyBhIGJ1cnN0IG9mIHRpbGUgcmVxdWVzdHMuIFNoYXJlZCB3aXRoIHRoZVxuICAgICAgLy8gcmVnaW9uIG92ZXJsYXksIHdoaWNoIHRha2VzIHRoZSB3aGVlbCBvdmVyIHdoaWxlIGEgdG9vbCBpcyBhY3RpdmUuXG4gICAgICB6b29tUGVyU2Nyb2xsOiBPU0RfWk9PTV9QRVJfU0NST0xMLFxuICAgICAgLy8gQ2xpY2stdG8tem9vbSB0b3dhcmQgdGhlIGNsaWNrZWQgcG9pbnQgKE9wZW5TZWFkcmFnb24ncyBkZWZhdWx0IGRlbW9cbiAgICAgIC8vIGJlaGF2aW91cikuIE9ubHkgYXBwbGllcyB3aGVuIG5vIHJlZ2lvbiB0b29sIGlzIGFjdGl2ZSDigJQgYW4gYWN0aXZlIHRvb2xcbiAgICAgIC8vIGRpc2FibGVzIE9TRCBtb3VzZS1uYXYgc28gY2xpY2tzIGRyYXcvc2VsZWN0IGluc3RlYWQgb2Ygem9vbWluZy5cbiAgICAgIGdlc3R1cmVTZXR0aW5nc01vdXNlOiB7IGNsaWNrVG9ab29tOiB0cnVlLCBzY3JvbGxUb1pvb206IHRydWUgfSxcbiAgICAgIC8vIFpvb20gbGltaXRzIChqaXQtdWkjOTQpLiBEZWZhdWx0IG1pblpvb21JbWFnZVJhdGlvICgwLjkpIHN0b3BzIHlvdSBmcm9tXG4gICAgICAvLyB6b29taW5nIHRoZSBpbWFnZSBzbWFsbGVyIHRoYW4gfmhvbWU7IGRyb3AgaXQgc28gdGhlIGltYWdlIGNhbiBiZSBzaHJ1bmtcbiAgICAgIC8vIGZyZWVseSAoZWZmZWN0aXZlbHkgbm8gbWluaW11bSkuIERlZmF1bHQgbWF4Wm9vbVBpeGVsUmF0aW8gKDEuMSkgY2Fwc1xuICAgICAgLy8gem9vbS1pbiBhdCB+MSBzY3JlZW4gcHggcGVyIGltYWdlIHB4OyByYWlzZSBpdCBzbyB5b3UgY2FuIHpvb20gaW4gdG9cbiAgICAgIC8vIGluc3BlY3QgaW5kaXZpZHVhbCBwaXhlbHMgKHBhaXJlZCB3aXRoIGltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZSBmb3JcbiAgICAgIC8vIGNyaXNwIG5lYXJlc3QtbmVpZ2hib3VyIGJsb2NrcykuXG4gICAgICBtaW5ab29tSW1hZ2VSYXRpbzogMC4wMSxcbiAgICAgIG1heFpvb21QaXhlbFJhdGlvOiAyMCxcbiAgICAgIC8vIE9TRCdzIHN0b2NrIHZhbHVlLCByZXN0b3JlZC4gRE8gTk9UIFJBSVNFIElUOiB0aGUgbmFtZSByZWFkcyBsaWtlXG4gICAgICAvLyBcIm1pbmltdW0gc2hhcnBuZXNzXCIgYnV0IGl0IGlzIHRoZSBvcHBvc2l0ZS4gRnJvbSBPU0QncyBvd25cbiAgICAgIC8vIFRpbGVkSW1hZ2UuX2dldExldmVsc0ludGVydmFsOlxuICAgICAgLy9cbiAgICAgIC8vICAgaGlnaGVzdExldmVsID0gZmxvb3IoIGxvZzIoIGN1cnJlbnRaZXJvUmF0aW8gLyBtaW5QaXhlbFJhdGlvICkgKVxuICAgICAgLy9cbiAgICAgIC8vIG1pblBpeGVsUmF0aW8gaXMgYSBmbG9vciBvbiBob3cgc21hbGwgYSB0aWxlIHBpeGVsIG1heSBzaHJpbmssIGFuZCBpdFxuICAgICAgLy8gRElWSURFUyBpbnRvIHRoZSByYXRpbyAtIHNvIHJhaXNpbmcgaXQgbG93ZXJzIHRoZSBjaG9zZW4gbGV2ZWwsIGkuZS5cbiAgICAgIC8vIHBpY2tzIGEgQ09BUlNFUiBpbWFnZS4gT1NEJ3Mgb3duIGNvbW1lbnQgb24gdGhlIGRlZmF1bHQgc2F5cyBhcyBtdWNoOlxuICAgICAgLy8gXCJjbG9zZXIgdG8gMCBkcmF3cyB0aWxlcyBtZWFudCBmb3IgYSBoaWdoZXIgem9vbSBhdCB0aGlzIHpvb21cIi5cbiAgICAgIC8vXG4gICAgICAvLyBNZWFzdXJlZCBvbiBhIGZsYXQgMjIzMDR4MjQ1MjggaW1hZ2UgKGxldmVscyA2OTcvMTM5NC8yNzg4LzU1NzYvMTExNTIvXG4gICAgICAvLyAyMjMwNCksIHByZWRpY3RlZCBsZXZlbCBtYXRjaGluZyBhY3R1YWwgaW4gYWxsIG5pbmUgdHJpYWxzOlxuICAgICAgLy9cbiAgICAgIC8vICAgICAgICAgICAgem9vbSAyICAgICAgICB6b29tIDggICAgICAgIH4xOjFcbiAgICAgIC8vICAgMS4wICAgICAgMS4zNHggdXAgICAgICAxLjM0eCB1cCAgICAgIDEuODZ4IHVwXG4gICAgICAvLyAgIDAuNSAgICAgIDAuNjd4IChub25lKSAgMC42N3ggKG5vbmUpICAwLjkzeCAtPiBmdWxsIHJlc1xuICAgICAgLy8gICAwLjI1ICAgICAwLjMzeCAgICAgICAgIDAuMzN4ICAgICAgICAgMC45M3hcbiAgICAgIC8vXG4gICAgICAvLyAwLjUgaXMgd2hhdCBnaXZlcyBcIm5ldmVyIHVwc2NhbGVkIGJlbG93IG5hdGl2ZSwgZnVsbCByZXNvbHV0aW9uIGF0IDE6MVwiLlxuICAgICAgLy8gMC4yNSBpcyBub3QgYmV0dGVyIC0gaXQganVtcHMgdHdvIHJ1bmdzIGZpbmVyIGFuZCBmZXRjaGVzIH40eCB0aGUgdGlsZXNcbiAgICAgIC8vIGZvciBubyB2aXNpYmxlIGdhaW4sIGFuZCB0aWxlcyBhcmUgbm90IGNhY2hlZCBieSB0aGUgaW5ncmVzcy5cbiAgICAgIG1pblBpeGVsUmF0aW86IDAuNSxcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB2aWV3IHRvIHNldHRsZSBiZWZvcmUgcHVsbGluZyBuZXcgdGlsZXMgKGxlc3MgY2h1cm4pLlxuICAgICAgaW1tZWRpYXRlUmVuZGVyOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvblRpbWU6IDAuNCxcbiAgICAgIC8vIFJlbGVhc2UgbWVtb3J5IGFnZ3Jlc3NpdmVseTogY2FwIHRoZSB0aWxlIGNhY2hlIHNvIHRpbGVzIG91dHNpZGUgdGhlXG4gICAgICAvLyBjdXJyZW50IHZpZXcgKGUuZy4gdGhlIGNvYXJzZXIgbGV2ZWxzIGxlZnQgYmVoaW5kIGFmdGVyIHpvb21pbmcgaW4pIGFyZVxuICAgICAgLy8gZXZpY3RlZCBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZy4gTGFyZ2Ugd2hvbGUtc2xpZGUgdGlsZXMg4oCUIGRvdWJsZWQgd2hlblxuICAgICAgLy8gdGhlIGNvbG9ybWFwIHBpcGVsaW5lIGtlZXBzIGEgcmVjb2xvcmVkIGNvcHkg4oCUIG1ha2UgYW4gdW5ib3VuZGVkIGNhY2hlXG4gICAgICAvLyBjb3N0bHkuIFR1bmFibGU7IGxvd2VyID0gbGVzcyBtZW1vcnksIG1vcmUgcmUtZmV0Y2ggb24gcGFuLWJhY2suXG4gICAgICAvLyBTdGFja3Mga2VlcCBtYW55IHNsaWNlcyByZXNpZGVudCAodGhlIHdob2xlIHN0YWNrIGlzIGJhY2tncm91bmQtbG9hZGVkKSxcbiAgICAgIC8vIHNvIHRoZXkgZ2V0IGEgbXVjaCBsYXJnZXIgdGlsZSBidWRnZXQg4oCUIG90aGVyd2lzZSBzd2l0Y2hpbmcgc2xpY2VzIGV2aWN0c1xuICAgICAgLy8gZWFjaCBvdGhlcidzIHRpbGVzIGFuZCBzY3J1YmJpbmcgYmFjayByZS1mZXRjaGVzLiBTY2FsZWQgdG8gdGhlIHJlc2lkZW50XG4gICAgICAvLyBzbGljZSBjb3VudDsgc2luZ2xlIGltYWdlcyBrZWVwIHRoZSBsZWFuIGRlZmF1bHQuXG4gICAgICBtYXhJbWFnZUNhY2hlQ291bnQ6IChkLnogPz8gMSkgPiAxID8gTWF0aC5taW4oMjQwMCwgTWF0aC5tYXgoNjAwLCB0aGlzLmNhY2hlLm1heFNsaWNlcygpICogNDApKSA6IDE1MCxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gQWx3YXlzIHNldHRsZTogaWYgT1NEIG5ldmVyIGVtaXRzIG9wZW4vb3Blbi1mYWlsZWQgKGEgYmFkIHRpbGUgc291cmNlLFxuICAgICAgLy8gYSB2aWV3ZXIgdG9ybiBkb3duIG1pZC1vcGVuKSwgdGhlIHJlbmRlciBwaXBlbGluZSBtdXN0IG5vdCBoYW5nIOKAlCBhIGhhbmdcbiAgICAgIC8vIGxlYXZlcyBpbWFnZUxvYWRpbmc9dHJ1ZSwgc3RpY2tpbmcgdGhlIHNwaW5uZXIgYW5kIHRoZSA1MDBtc1xuICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3MgcG9sbCBmb3JldmVyIChOU19CSU5ESU5HX0FCT1JURUQgc3Rvcm0pLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSAob2s6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShvayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnZpZXdlciEuYWRkT25jZUhhbmRsZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlZ2lvbiBvdmVybGF5IHJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyByZWdpb25zIHN0YXlcbiAgICAgICAgLy8gaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3IuIFJlY3JlYXRlIGl0IHBlciBvcGVuKCkgc29cbiAgICAgICAgLy8gaXQgYmluZHMgdG8gdGhlIGZyZXNobHktb3BlbmVkIHZpZXdlcidzIGNhbnZhcy9Nb3VzZVRyYWNrZXIuXG4gICAgICAgIHRoaXMub3ZlcmxheT8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgT3NkUmVnaW9uT3ZlcmxheSh0aGlzLnZpZXdlciBhcyBhbnksIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0odGhpcy52aWV3ZXIgYXMgYW55KTtcbiAgICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBPc2RTY2FsZUJhcih0aGlzLnZpZXdlciBhcyBhbnksIGQubXBwWCA/PyAwKTtcbiAgICAgICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgICAgICAvLyBTaW1wbGUgbW9kZSBpcyBhIHNpbmdsZSwgc2VsZi1jb250YWluZWQgaW1hZ2Ug4oCUIG5vIHNsaWNlIGNhY2hlIHRvIHNlZWQuXG4gICAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAvKiBub3RoaW5nIHRvIGNhY2hlOiBvbmUgZnJhbWUsIG5vIHB5cmFtaWQgKi9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgLy8gRHJvcCB0aGUgc2luZ2xlIG9wZW5lZCAoY2hhbm5lbC0wKSBpbWFnZSBhbmQgYWRkIHRoaXMgc2xpY2UncyBjaGFubmVsXG4gICAgICAgICAgLy8gZ3JvdXAgdG8gdGhlIHBlci1zbGljZSBjYWNoZS4gVGhlIHNoYXJlZCBiYWNrZ3JvdW5kIGxvYWRlciAvIExSVSB0aGVuXG4gICAgICAgICAgLy8gcHJlLWZpbGxzIHRoZSBvdGhlciBzbGljZXMnIGNoYW5uZWwgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpdDAgPSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZD8uZ2V0SXRlbUF0Py4oMCk7XG4gICAgICAgICAgICBpZiAoaXQwKSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZW1vdmVJdGVtKGl0MCk7XG4gICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovIH1cbiAgICAgICAgICB0aGlzLmNhY2hlLmFkZENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZWVkIHRoZSBzbGljZSBjYWNoZSB3aXRoIHRoZSBqdXN0LW9wZW5lZCBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICAgICAgICAvLyBzY3J1YmJpbmcgYmFjayB0byBpdCBsYXRlciBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlLCBub3QgYSByZS1vcGVuLlxuICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICBpZiAoZmlyc3RJdGVtKSB0aGlzLmNhY2hlLnNlZWRDb21wb3NpdGUodGhpcy5jdXJyZW50WiwgZmlyc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgd2FuZCBzYW1wbGVzIHRoZSAqcmVuZGVyZWQgdmlld3BvcnQqLCBzbyBpdHMgcGl4ZWwgbWF0cml4IGlzIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgZm9yIHRoZSBjdXJyZW50IHZpZXcg4oCUIGRyb3AgaXQgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd2aWV3cG9ydC1jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmF5c2NhbGUgdGlsZXMgZ2V0IHRoZSBhY3RpdmUgY29sb3JtYXAgdmlhIHRoZSBwaXhlbCBwaXBlbGluZS4gVGhlXG4gICAgICAgIC8vIGhhbmRsZXIgcnVucyBwZXIgdGlsZSBvbiBsb2FkIChhbmQgb24gcmVxdWVzdEludmFsaWRhdGUpOyByZWNvbG9yaW5nXG4gICAgICAgIC8vIGlzIGEgbm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgYmVmb3JlIHRoZSBMVVQgcmVzb2x2ZXMuXG4gICAgICAgIC8vIChpc0dyYXlzY2FsZUltYWdlIGlzIHNldCBmcm9tIGltYWdlSW5mby5pc0dyYXlzY2FsZSBpbiBwbG90KCkgYWJvdmUuKVxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIC8vIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgaXMgYSBzZXBhcmF0ZSBtaW5pLXZpZXdlciB3aXRoIGl0cyBvd24gdGlsZXMsXG4gICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgcmVjZWl2ZSB0aGUgbWFpbiB2aWV3ZXIncyB0aWxlLWludmFsaWRhdGVkIGV2ZW50cy4gQXBwbHlcbiAgICAgICAgLy8gdGhlIHNhbWUgcmVjb2xvciBwaXBlbGluZSB0byBpdCBzbyB0aGUgbWluaW1hcCB0cmFja3MgdGhlIG1haW4gaW1hZ2Unc1xuICAgICAgICAvLyBjb2xvcm1hcC9MVVQgaW5zdGVhZCBvZiBzdGF5aW5nIGdyYXlzY2FsZS5cbiAgICAgICAgY29uc3QgbmF2ID0gKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yO1xuICAgICAgICBuYXY/LmFkZEhhbmRsZXIoJ3RpbGUtaW52YWxpZGF0ZWQnLCAoZXZlbnQ6IGFueSkgPT4gdGhpcy5yZWNvbG9yVGlsZShldmVudCkpO1xuICAgICAgICBpZiAoKHRoaXMuaXNHcmF5c2NhbGVJbWFnZSAmJiB0aGlzLmNvbG9yTHV0KSB8fCB0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5hdj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJlZmV0Y2ggYWRqYWNlbnQgei1zbGljZXMgb25jZSB0aGUgdmlldyBzZXR0bGVzIChhbmQgb24gZWFjaCBzZXR0bGUsXG4gICAgICAgIC8vIHNvIGl0IHRyYWNrcyB0aGUgY3VycmVudCB2aWV3cG9ydCBhcyB0aGUgdXNlciBwYW5zL3pvb21zKS4gU2ltcGxlIG1vZGVcbiAgICAgICAgLy8gaGFzIGEgc2luZ2xlIGZyYW1lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcHJlZmV0Y2guXG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuY2FjaGUuc2NoZWR1bGVQcmVmZXRjaCgpKTtcbiAgICAgICAgLy8gVGVsbCBsaXN0ZW5lcnMgKHRoZSBpbnRlbnNpdHkgaW5zZXQpIHRoZSB2aXNpYmxlIGltYWdlIHJlZ2lvbiB3aGVuZXZlclxuICAgICAgICAvLyB0aGUgdmlldyBzZXR0bGVzLCBzbyB0aGV5IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSByZXNvbHV0aW9uLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuZW1pdFZpZXdwb3J0Q2hhbmdlKCkpO1xuICAgICAgICAvLyBFdmVyeSByZWRyYXcgKHBhbi96b29tIGFuaW1hdGlvbiBmcmFtZXMsIHJlc2l6ZSkg4oCUIGZvciBhIGNvbnRyaWJ1dGVkXG4gICAgICAgIC8vIHBsb3QgbW9kZSdzIG92ZXJsYXksIHdoaWNoIGhhcyB0byBtb3ZlIHdpdGggdGhlIGltYWdlLCBub3QgYWZ0ZXIgaXQuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd1cGRhdGUtdmlld3BvcnQnLCAoKSA9PiB0aGlzLnNjaGVkdWxlRnJhbWUoKSk7XG4gICAgICAgIC8vIENocm9tZSBjb21wb3NpdG9yIGJ1ZzogYWZ0ZXIgYW4gT1NEIHpvb20gdGhlIGRvY2tlZCB0b29sYmFyIChhIHNpYmxpbmcgb2ZcbiAgICAgICAgLy8gI3Bsb3QgaW4gdGhlIDx2aXN1YWxpemVyPiBob3N0KSBpcyBsZWZ0IGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgYW5kXG4gICAgICAgIC8vIHZhbmlzaGVzIOKAlCBjb25maXJtZWQgdmlhIERldlRvb2xzIChET00gaW50YWN0LCByZWdpb24gc2ltcGx5IG5vdCBwYWludGVkKS5cbiAgICAgICAgLy8gQ1NTICh6LWluZGV4IC8gaXNvbGF0aW9uIC8gY29udGFpbikgYW5kIERPTS1yZXBhcmVudGluZyBkb24ndCBmaXggaXQ7IGFcbiAgICAgICAgLy8gcmVwYWludCByZWxpYWJseSBkb2VzLiBOdWRnZSBpdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSAoc28gaXQgbmV2ZXIgdmlzaWJseVxuICAgICAgICAvLyBkcm9wcykgYW5kIG9uIHNldHRsZS4gVGhlIHN5bmNocm9ub3VzIGRpc3BsYXkgdG9nZ2xlIHJlLXJhc3RlcnMgd2l0aCBub1xuICAgICAgICAvLyB2aXNpYmxlIGdvbmUtZnJhbWUgYW5kIG5vIGxheW91dCBzaGlmdC5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbicsICgpID0+IHRoaXMubnVkZ2VUb29sYmFyUmVwYWludCgpKTtcbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbi1maW5pc2gnLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLmNhY2hlLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgICAgLy8gRm9yY2UgZml0LXRvLXZpZXcgYXMgdGhlIHNwbGl0L2ZsZXggbGF5b3V0IHNldHRsZXMuIEEgdGFsbFxuICAgICAgICAvLyBub24tcHlyYW1pZGFsIGltYWdlIGNhbiBvdGhlcndpc2Ugb3BlbiB6b29tZWQtaW4gKGltYWdlIHdpZHRoIGZpbGxpbmdcbiAgICAgICAgLy8gdGhlIHZpZXdlciksIG1ha2luZyBPU0QgZGVtYW5kIHNsb3cgZnVsbC1yZXMgcmVzPTAgdGlsZXMgZm9yIHRoZVxuICAgICAgICAvLyBjZW50cmUgaW5zdGVhZCBvZiB0aGUgZmFzdCBjb2Fyc2Ugb3ZlcnZpZXcg4oaSIHdoaXRlIGNhbnZhcy4gZ29Ib21lXG4gICAgICAgIC8vIGZpdHMgdGhlIHdob2xlIGltYWdlIHNvIE9TRCBzZWxlY3RzIHRoZSBjb2Fyc2Ugc3ludGhldGljIGxldmVsLiBSZXRyeVxuICAgICAgICAvLyBhY3Jvc3MgYSBmZXcgZnJhbWVzIGJlY2F1c2UgdGhlIGNvbnRhaW5lciBtYXkgbm90IGhhdmUgaXRzIGZpbmFsIHNpemVcbiAgICAgICAgLy8gb24gdGhlIGZpcnN0IGZyYW1lIGFmdGVyICdvcGVuJy5cbiAgICAgICAgY29uc3QgcmVmaXQgPSAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBUaGUgbmF2aWdhdG9yIHdhcyBzaXplZCBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBCRUZPUkUgdGhlXG4gICAgICAgICAgICAvLyBsYXlvdXQgc2V0dGxlZCDigJQgc28gaXRzIGVsZW1lbnQgY2FuIGNhcnJ5IGEgc3RhbGUgKGV2ZW5cbiAgICAgICAgICAgIC8vIHdyb25nLWFzcGVjdCkgc2l6ZSB0aGF0IGZsb2F0cyB0aGUgdmlzaWJsZSBtaW5pbWFwIGFib3ZlIHRoZVxuICAgICAgICAgICAgLy8gY29ybmVyLiBSZS1zaXplIGl0IGZyb20gdGhlIHNldHRsZWQgY29udGFpbmVyLlxuICAgICAgICAgICAgdGhpcy5yZXNpemVOYXZpZ2F0b3IoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIHRvcm4gZG93biAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlZml0KTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgMTUwKTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgNDAwKTtcbiAgICAgICAgLy8gVGhlIHRpbWVkIHJldHJpZXMgYWJvdmUgbWlzcyB0aGUgY2FzZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIFNUSUxMXG4gICAgICAgIC8vIHplcm8tc2l6ZSBhdCA0MDBtcyDigJQgd2hpY2ggaGFwcGVucyB3aGVuIHRoZSByZW5kZXIgc3RhcnRzIHdoaWxlIHRoZVxuICAgICAgICAvLyBmaWxlIHZpZXdlciBpcyBtaWQtc3dpdGNoIGZyb20gdGhlIGZvbGRlciB2aWV3IHRvIHRoZSBkaWFncmFtIChlLmcuXG4gICAgICAgIC8vIFwiTG9hZCBhcyBTdGFja1wiIGZyb20gYSBmb2xkZXIsIHdpdGggbm8gaW1hZ2Ugb3BlbiBmaXJzdCkuIEJlY2F1c2VcbiAgICAgICAgLy8gcHJlc2VydmVWaWV3cG9ydCBzdXBwcmVzc2VzIE9TRCdzIG93biBvcGVuLXRpbWUgZml0LCB0aGUgaW1hZ2Ugd291bGRcbiAgICAgICAgLy8gdGhlbiBiZSBsZWZ0IHVuLWZpdHRlZCBhdCB0aGUgdG9wLWxlZnQgKFwiYSB0aWxlXCIpLiBBIG9uZS1zaG90XG4gICAgICAgIC8vIFJlc2l6ZU9ic2VydmVyIGZpdHMgdGhlIGluc3RhbnQgdGhlIGNvbnRhaW5lciBmaXJzdCBoYXMgYSByZWFsIHNpemUsXG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgcmVuZGVyIGJlZ2FuIChqaXQtdWkjMTA2KS5cbiAgICAgICAgdGhpcy5maXRXaGVuQ29udGFpbmVyU2l6ZWQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdiksIHJlZml0KTtcbiAgICAgICAgLy8gS2VlcCB0aGUgbmF2aWdhdG9yIHNpemVkIHRvIHRoZSBjb250YWluZXIgYXMgdGhlIHBhbmVsIHJlc2l6ZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZU5hdmlnYXRvcigpKTtcbiAgICAgICAgZG9uZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3ZXIhLmFkZE9uY2VIYW5kbGVyKCdvcGVuLWZhaWxlZCcsIChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBvcGVuLWZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgIGRvbmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSBjb25zb2xlLndhcm4oJ1tPU0RdIHZpZXdlciBvcGVuIHRpbWVkIG91dCcpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0sIDgwMDApO1xuICAgICAgdGhpcy52aWV3ZXIhLm9wZW4odGlsZVNvdXJjZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdC10by1ob21lIG9uY2UgYGVsYCBmaXJzdCBoYXMgYSBub24temVybyBzaXplLiBJZiBpdCdzIGFscmVhZHkgc2l6ZWQgd2VcbiAgICogcmVseSBvbiB0aGUgdGltZWQgcmVmaXRzIHRoZSBjYWxsZXIgc2NoZWR1bGVkOyBvdGhlcndpc2UgYSBvbmUtc2hvdFxuICAgKiBSZXNpemVPYnNlcnZlciBydW5zIGByZWZpdGAgdGhlIG1vbWVudCB0aGUgY29udGFpbmVyIGlzIGxhaWQgb3V0ICh0aGVuXG4gICAqIGRpc2Nvbm5lY3RzKSwgc28gdGhlIGluaXRpYWwgZml0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSByZW5kZXIncyBzdGFydCB0aW1lXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBkaWFncmFtIGNvbnRhaW5lcidzIGxheW91dC4gTm8tb3Agd2l0aG91dCBhIGNvbnRhaW5lciBvclxuICAgKiBSZXNpemVPYnNlcnZlciAodGhlIHRpbWVkIHJlZml0cyByZW1haW4gdGhlIGZhbGxiYWNrKS4gT25lLXNob3QgKyBvbmx5XG4gICAqIGF0dGFjaGVkIG9uIGEgZnJlc2ggbW91bnQsIHNvIHNsaWNlLXNjcnViIHJlLW9wZW5zIGtlZXAgdGhlIHVzZXIncyB6b29tLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXRXaGVuQ29udGFpbmVyU2l6ZWQoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmVmaXQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIWVsIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHJldHVybjsgLy8gYWxyZWFkeSBzaXplZCDigJQgdGltZWQgcmVmaXRzIHN1ZmZpY2VcbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgcm8uZGlzY29ubmVjdCgpO1xuICAgICAgICByZWZpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJvLm9ic2VydmUoZWwpO1xuICAgIC8vIFNhZmV0eSBuZXQ6IHN0b3Agb2JzZXJ2aW5nIGV2ZW4gaWYgaXQgbmV2ZXIgZ2FpbnMgYSBzaXplLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcm8uZGlzY29ubmVjdCgpLCA1MDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gdGlsZSBzb3VyY2UgYnVpbHQgZnJvbSB0aGUgZGVzY3JpcHRvci4gT1NEIG51bWJlcnMgbGV2ZWxzXG4gICAqIGNvYXJzZXN0LWZpcnN0OyB0aGUgYmFja2VuZCBudW1iZXJzIHJlc29sdXRpb25zIGZ1bGwtcmVzLWZpcnN0LCBzb1xuICAgKiBgcmVzID0gKGxldmVscy0xKSAtIG9zZExldmVsYC4gT3ZlcnJpZGluZyBnZXRMZXZlbFNjYWxlL2dldE51bVRpbGVzIGxldHMgdXNcbiAgICogaG9ub3VyIEJpby1Gb3JtYXRzJyBhY3R1YWwgcGVyLWxldmVsIGRpbWVuc2lvbnMgKG5vdCBhc3N1bWUgcG93ZXItb2YtdHdvKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUaWxlU291cmNlKGQ6IFRpbGVEZXNjcmlwdG9yLCBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IGFueSB7XG4gICAgLy8gTXVsdGljaGFubmVsIGltYWdlcyBjb21wb3NpdGUgZnJvbSBwZXItY2hhbm5lbCB0aWxlcywgd2hpY2ggb25seSBleGlzdCBhdFxuICAgIC8vIHJlYWwgQmlvLUZvcm1hdHMgcmVzb2x1dGlvbnMg4oCUIHNvIGRyaXZlIE9TRCBvZmYgdGhlIHJlYWwgbGV2ZWxzIGFsb25lIGFuZFxuICAgIC8vIHNraXAgdGhlIHN5bnRoZXRpYyAoc2VydmVyLWNvbXBvc2l0ZWQpIG92ZXJ2aWV3cy4gRXZlcnkgZGlzcGxheWVkIHRpbGUgaXNcbiAgICAvLyB0aGVuIHBlci1jaGFubmVsLWZldGNoYWJsZSBhdCBhbnkgem9vbS5cbiAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmlzTXVsdGlDaGFubmVsID8gZC5sZXZlbHMuc2xpY2UoMCwgdGhpcy5yZWFsTGV2ZWxzKSA6IGQubGV2ZWxzO1xuICAgIGNvbnN0IG4gPSBsZXZlbHMubGVuZ3RoO1xuICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaTtcblxuICAgIC8vIE9TRCBsZXZlbCBpICgwID0gY29hcnNlc3QpIDwtPiBiYWNrZW5kIHJlc29sdXRpb24gKG4tMS1pKSAocmVzIDAgPSBmdWxsKS5cbiAgICAvLyBUaGUgYmFja2VuZCBweXJhbWlkIGlzIE5PVCBuZWNlc3NhcmlseSBwb3dlci1vZi10d28sIHNvIHdlIGRyaXZlIE9TRCBvZmZcbiAgICAvLyB0aGUgYmFja2VuZCdzIHJlYWwgcGVyLWxldmVsIGRpbWVuc2lvbnMuIFdlIG92ZXJyaWRlIE9OTFkgZ2V0TGV2ZWxTY2FsZTpcbiAgICAvLyBPU0QgZGVyaXZlcyBnZXROdW1UaWxlcywgZ2V0VGlsZUJvdW5kcyBBTkQgaXRzIHBlci16b29tIGxldmVsIHNlbGVjdGlvblxuICAgIC8vIGZyb20gZ2V0TGV2ZWxTY2FsZSwgc28gdGhleSBhbGwgc3RheSBjb25zaXN0ZW50IOKAlCByZXF1ZXN0aW5nIGV4YWN0bHkgdGhlXG4gICAgLy8gdGlsZXMgZWFjaCByZXNvbHV0aW9uIGFjdHVhbGx5IGhhcyAobm8gb3V0LW9mLXJhbmdlIDQwMHMsIG5vIGZsb29kKS5cbiAgICBjb25zdCByZXNGb3JMZXZlbCA9IChsZXZlbDogbnVtYmVyKSA9PiBuIC0gMSAtIGxldmVsO1xuICAgIGNvbnN0IHRzOiBhbnkgPSBuZXcgKE9TRCBhcyBhbnkpLlRpbGVTb3VyY2Uoe1xuICAgICAgd2lkdGg6IGQud2lkdGgsXG4gICAgICBoZWlnaHQ6IGQuaGVpZ2h0LFxuICAgICAgdGlsZVNpemU6IHQsXG4gICAgICB0aWxlT3ZlcmxhcDogMCxcbiAgICAgIG1pbkxldmVsOiAwLFxuICAgICAgbWF4TGV2ZWw6IG4gLSAxLFxuICAgIH0pO1xuICAgIHRzLmdldExldmVsU2NhbGUgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICByZXR1cm4gbHZsID8gbHZsLndpZHRoIC8gZC53aWR0aCA6IDE7XG4gICAgfTtcbiAgICAvLyBEcml2ZSB0aGUgdGlsZSBDT1VOVCBvZmYgZWFjaCBsZXZlbCdzIG93biAoaW5kZXBlbmRlbnRseS1yb3VuZGVkKSBkaW1lbnNpb25zLFxuICAgIC8vIG5vdCBPU0QncyBkZWZhdWx0IGBjZWlsKHNjYWxlICogZnVsbERpbWVuc2lvbiAvIHRpbGVTaXplKWAuIFN5bnRoZXRpYyBBTkQgcmVhbFxuICAgIC8vIEJpby1Gb3JtYXRzIGxldmVscyBhcmVuJ3QgZXhhY3QgcHJvcG9ydGlvbmFsIHNjYWxlcyBvZiB0aGUgZnVsbCBpbWFnZSwgc29cbiAgICAvLyBgc2NhbGUgKiBmdWxsSGVpZ2h0YCBjYW4gcm91bmQgdXAgdG8gb25lIG1vcmUgcm93IChvciBjb2x1bW4pIHRoYW4gdGhlIGxldmVsXG4gICAgLy8gYWN0dWFsbHkgaGFzIOKAlCBPU0QgdGhlbiByZXF1ZXN0cyBhbiBvdXQtb2YtcmFuZ2UgdGlsZSB0aGF0IHRoZSBzZXJ2ZXIgNDAwc1xuICAgIC8vIChcIlRpbGUgKGNvbCxyb3cpIG91dCBvZiByYW5nZVwiKS4gVXNpbmcgdGhlIGxldmVsJ3MgcmVhbCB3L2ggbWF0Y2hlcyB0aGVcbiAgICAvLyBzZXJ2ZXIncyBvd24gYm91bmRzIGNoZWNrIGV4YWN0bHkuXG4gICAgY29uc3QgUG9pbnQgPSAoT1NEIGFzIGFueSkuUG9pbnQ7XG4gICAgdHMuZ2V0TnVtVGlsZXMgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICBpZiAoIWx2bCkgcmV0dXJuIG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUG9pbnQoTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICB9O1xuICAgIHRzLmdldFRpbGVVcmwgPSAobGV2ZWw6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XG4gICAgICBidWlsZFRpbGVVcmwoYmFzZSwgaW5mb0I2NCwgeyByZXM6IHJlc0ZvckxldmVsKGxldmVsKSwgY29sOiB4LCByb3c6IHksIHosIHRpbGVTaXplOiB0LCBjaGFubmVsIH0pO1xuICAgIHJldHVybiB0cztcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgZGlzcGxheSBwaXBlbGluZSAod2luZG93L2dhbW1hL2NvbG91ci9pbnZlcnQpIGFmdGVyIGEgc3RhdGUgY2hhbmdlLlxuICAgKiAgTXVsdGljaGFubmVsIGludmFsaWRhdGVzIE9OTFkgdGhlIHZpc2libGUgc2xpY2UncyBjaGFubmVsIGltYWdlcyDigJQgaW52YWxpZGF0aW5nXG4gICAqICB0aGUgd2hvbGUgd29ybGQgd291bGQgcmUtcHJvY2VzcyBldmVyeSBoaWRkZW4vcHJlbG9hZGVkIHNsaWNlJ3MgdGlsZXMgKGh1bmRyZWRzKSxcbiAgICogIGZsb29kaW5nIE9TRCB3aXRoIFwiW0NhY2hlUmVjb3JkXSDigKYgSW52YWxpZFN0YXRlRXJyb3JcIiBhbmQgd2FzdGluZyB3b3JrIG9uIHRpbGVzXG4gICAqICB0aGF0IGFyZW4ndCBvbiBzY3JlZW4uIFRoZSBvdGhlciBjYWNoZWQgc2xpY2VzIGFyZSBtYXJrZWQgc3RhbGUgYW5kIHJlLXRpbnRlZFxuICAgKiAgbGF6aWx5IHdoZW4gcmV2ZWFsZWQuIENvbXBvc2l0ZS9ncmF5c2NhbGUgaW52YWxpZGF0ZSB0aGUgd29ybGQgYXMgYmVmb3JlLiAqL1xuICAvKiogQ29sbGFwc2UgYSBidXJzdCBvZiBkaXNwbGF5LXN0YXRlIGNoYW5nZXMgaW50byBPTkUgaW52YWxpZGF0aW9uIG9uIHRoZSBuZXh0XG4gICAqICBmcmFtZS4gRHJhZ2dpbmcgYSB3aW5kb3cgc2xpZGVyIGVtaXRzIHBlciBwaXhlbCBvZiB0cmF2ZWwsIGFuZCBlYWNoIHJvdW5kXG4gICAqICByZXN0b3JlcyBhbmQgcmUtcHJvY2Vzc2VzIGV2ZXJ5IHRpbGUgb2YgZXZlcnkgY2hhbm5lbCDigJQgc28gdGhlIGJ1cnN0IGlzIGJvdGhcbiAgICogIHdhc3RlZCB3b3JrIGFuZCB0aGUgcmFjZSB0aGF0IGJyZWFrcyBjYWNoZSByZWNvcmRzIChzZWUge0BsaW5rIGRpc3BsYXlUb2tlbn0pLlxuICAgKiAgVGhlIHN0b3JlIHdyaXRlIHN0YXlzIGxpdmUsIHNvIHRoZSBwYW5lIGl0c2VsZiByZW1haW5zIHJlc3BvbnNpdmUuICovXG4gIHByaXZhdGUgc2NoZWR1bGVJbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHJldHVybjsgLy8gYWxyZWFkeSBxdWV1ZWQgZm9yIHRoaXMgZnJhbWVcbiAgICBjb25zdCByYWYgPVxuICAgICAgdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA6IChjYjogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IHNldFRpbWVvdXQoKCkgPT4gY2IoMCksIDE2KSBhcyB1bmtub3duIGFzIG51bWJlcjtcbiAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSByYWYoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZURpc3BsYXkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZURpc3BsYXkoKTogdm9pZCB7XG4gICAgLy8gU3VwZXJzZWRlIGFueSBpbi1mbGlnaHQgcmVjb2xvciByb3VuZCBiZWZvcmUgcmVzdGFydGluZyBvbmUgKHNlZSBkaXNwbGF5VG9rZW4pLlxuICAgIHRoaXMuZGlzcGxheVRva2VuKys7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2FjaGUuaW52YWxpZGF0ZUNoYW5uZWxEaXNwbGF5KHRoaXMuY3VycmVudFopO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkgeyB2LndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICAgIHRyeSB7IHYubmF2aWdhdG9yPy53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7IH0gY2F0Y2ggeyAvKiBuby1vcCAqLyB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaWV3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgIGlmICh0aGlzLmZyYW1lUmFmICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lUmFmKTtcbiAgICAgIHRoaXMuZnJhbWVSYWYgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUZWFyIGRvd24gYW55IGFjdGl2ZSB0b29sIG92ZXJsYXlzIChzaGFyZWQgc2luZ2xldG9ucykuXG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYWxlQmFyKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgIHRoaXMudmlld2VyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5yZXNldCgpO1xuICAgIHRoaXMuc2FtcGxlci5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAodGhlIFNWRyBvdmVybGF5KSwgb25jZSBhIHBsb3QgaXMgbW91bnRlZC4gKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXk7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gaXNvc3VyZmFjZSwgc28gbm8gY29udHJvbHMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gM0Qgc2NlbmVzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gTElORSBpbnRlbnNpdHkgUk9Jcywgc28gbm8gY29udHJvbHMuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB0b092ZXJsYXlNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogUmVnaW9uVG9vbE1vZGUge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnZHJhd3JlY3QnOlxuICAgICAgICByZXR1cm4gJ2RyYXdyZWN0JztcbiAgICAgIGNhc2UgJ2RyYXdjbG9zZWRwYXRoJzpcbiAgICAgICAgcmV0dXJuICdkcmF3Y2xvc2VkcGF0aCc7XG4gICAgICBjYXNlICdkcmF3b3BlbnBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdvcGVucGF0aCc7XG4gICAgICBjYXNlICdkcmF3cG9seWdvbic6XG4gICAgICAgIHJldHVybiAnZHJhd3BvbHlnb24nO1xuICAgICAgY2FzZSAnYWRkcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2FkZHBvaW50JztcbiAgICAgIGNhc2UgJ2RlbGV0ZXBvaW50JzpcbiAgICAgICAgcmV0dXJuICdkZWxldGVwb2ludCc7XG4gICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgcmV0dXJuICdtb3ZlJztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBob3N0IHJlLWRyaXZlcyBwbG90KCkgdmlhIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSAqL1xuICB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2cCA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwKSByZXR1cm47XG4gICAgLy8gS2VlcCB0aGUgdXNlcidzIGN1cnJlbnQgdmlldyBhY3Jvc3MgYSBjb250YWluZXIvc3BsaXQgcmVzaXplIGluc3RlYWQgb2ZcbiAgICAvLyBzbmFwcGluZyBob21lLiBWaWV3cG9ydCBib3VuZHMgYXJlIGltYWdlLXJlbGF0aXZlIChpbWFnZSB3aWR0aCA9IDEpLCBzb1xuICAgIC8vIHRoZXkncmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbnRhaW5lcidzIHBpeGVsIHNpemUg4oCUIGNhcHR1cmUgdGhlIHZpc2libGVcbiAgICAvLyByZWdpb24gbm93IGFuZCByZS1maXQgaXQgb25jZSB0aGUgbmV3IHNpemUgaGFzIHNldHRsZWQuIE9TRCdzIGF1dG9SZXNpemVcbiAgICAvLyBmaXJlcyBhc3luY2hyb25vdXNseSBhbmQgdGhlIGFuZ3VsYXItc3BsaXQgdHJhbnNpdGlvbiBhbmltYXRlcyB0aGUgd2lkdGhcbiAgICAvLyBvdmVyIGEgZmV3IGh1bmRyZWQgbXMsIHNvIHJlc3RvcmUgb24gdGhlIG5leHQgZnJhbWUgYW5kIGFnYWluIGFmdGVyIHRoZVxuICAgIC8vIHRyYW5zaXRpb24gY29tcGxldGVzLlxuICAgIGNvbnN0IGJvdW5kcyA9IHZwLmdldEJvdW5kcyh0cnVlKTtcbiAgICBjb25zdCByZXN0b3JlID0gKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmZpdEJvdW5kcyhib3VuZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuYXBwbHlDb25zdHJhaW50cyh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiB2aWV3ZXIgdG9ybiBkb3duICovXG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzdG9yZSk7XG4gICAgc2V0VGltZW91dChyZXN0b3JlLCAzNTApO1xuICB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKCk7XG4gIH1cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgICB0aGlzLmF1dG9zY2FsZUV2ZW50JC5uZXh0KCdhdXRvc2NhbGUnKTtcbiAgfVxuICB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0Lnpvb21CeSgxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEgLyAxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBSZWN0YW5nbGUvcG9seWdvbiBkcmF3aW5nIHJ1biBvbiB0aGUgU1ZHIG92ZXJsYXk7IHdhbmQvZXJhc2VyL3pvb20tYm94XG4gICAgLy8gKGN1c3RvbSBQbG90bHkgb3ZlcmxheXMpIGFyZSByb3V0ZWQgdG8gUGxvdGx5IGJ5IHRoZSByb3V0ZXIgYW5kIGFyZW4ndFxuICAgIC8vIGhhbmRsZWQgaGVyZSB5ZXQuXG4gICAgdGhpcy5vdmVybGF5Py5zZXRNb2RlKHRoaXMudG9PdmVybGF5TW9kZShtb2RlKSk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIE9TRCBuYXZpZ2F0ZXMgdGhlIHN0YWNrIHZpYSB0aGUgei1zbGlkZXIgLT4gc2V0WkluZGV4ICovXG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IuIFN0b3JlZCBmb3IgdGhlIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmRcbiAgICogIGFwcGxpZWQgbGl2ZSB3aGVuIGEgdmlld2VyIGlzIGFscmVhZHkgbW91bnRlZCAoaGlkZXMvcmV2ZWFscyBpdHMgZWxlbWVudCDigJRcbiAgICogIHRoZSBuYXZpZ2F0b3IgaW5zdGFuY2UgaXRzZWxmIG9ubHkgZXhpc3RzIHdoZW4gY3JlYXRlZCB3aXRoIHNob3dOYXZpZ2F0b3IpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIGNvbnN0IG5hdkVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5uYXZpZ2F0b3I/LmVsZW1lbnQ7XG4gICAgaWYgKG5hdkVsKSBuYXZFbC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSBiaWxpbmVhciBzbW9vdGhpbmcgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscykuIFN0b3JlZCBmb3IgdGhlXG4gICAqICBuZXh0IHZpZXdlciBjcmVhdGlvbiwgYW5kIGFwcGxpZWQgbGl2ZSAod2l0aCBhIHJlZHJhdykgdG8gYSBtb3VudGVkIHZpZXdlci4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSBlbmFibGVkO1xuICAgIGNvbnN0IGRyYXdlcjogYW55ID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcjtcbiAgICBpZiAoZHJhd2VyPy5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQpIHtcbiAgICAgIGRyYXdlci5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICB0aGlzLnZpZXdlcj8uZm9yY2VSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0aGUgZGlzcGxheWVkIHotc2xpY2UgbGl2ZS4gU2xpY2VzIGFyZSBrZXB0IGFzIHNlcGFyYXRlIHRpbGVkIGltYWdlcyBpblxuICAgKiB0aGUgd29ybGQsIHNvIHN3aXRjaGluZyBpcyBqdXN0IGFuIG9wYWNpdHkgdG9nZ2xlOiBhIHByZXZpb3VzbHktdmlzaXRlZCBzbGljZVxuICAgKiBzaG93cyBpbnN0YW50bHkgKGl0cyBkZWNvZGVkICsgcmVjb2xvcmVkIHRpbGVzIGFyZSBzdGlsbCByZXNpZGVudCksIGFuZCBhXG4gICAqIG5ldmVyLXNlZW4gc2xpY2UgaXMgYWRkZWQgb25jZS4gVGhlIHJlZ2lvbiBvdmVybGF5LCBjb29yZGluYXRlIHRyYW5zZm9ybSxcbiAgICogc2NhbGUgYmFyLCBjb2xvcm1hcCBwaXBlbGluZSBhbmQgY3VycmVudCB6b29tL3BhbiBhbGwgcGVyc2lzdCDigJQgdGhlIHgveVxuICAgKiBnZW9tZXRyeSBpcyBpZGVudGljYWwgYWNyb3NzIHNsaWNlcy5cbiAgICpcbiAgICogU2ltcGxlIG1vZGUgKHRpbGVkOmZhbHNlIOKAlCBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsXG4gICAqIGVhY2ggc2xpY2UgaXRzIG93biBjb21wbGV0ZSBpbWFnZSB3aXRoIG5vIHNoYXJlZCB0aWxlIHNlcnZlcikgaGFzIG5vXG4gICAqIHB5cmFtaWQgdG8gdG9nZ2xlIG9wYWNpdHkgb24sIHNvIGl0IHJlLW9wZW5zIHRoZSB2aWV3ZXIgb24gdGhlIG5ld1xuICAgKiBzbGljZSdzIFVSTCBpbnN0ZWFkLiBwcmVzZXJ2ZVZpZXdwb3J0ICh2aWV3ZXIgb3B0aW9uLCBzZWUgcGxvdCgpKSBrZWVwc1xuICAgKiB0aGUgY3VycmVudCB6b29tL3BhbiBhY3Jvc3MgdGhhdCByZW9wZW4uXG4gICAqL1xuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgaWYgKHogPT09IHRoaXMuY3VycmVudFopIHJldHVybjtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2ltcGxlTW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzW3pdID8/IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbMF07XG4gICAgICAgIGlmICghdXJscykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHMpO1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRaICE9PSB6IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyh6LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyIHx8ICF1cmwpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVVcmxzW3pdID8/IHRoaXMuc2ltcGxlVXJsc1swXTtcbiAgICAgIGlmICghcmF3VXJsKSByZXR1cm47XG4gICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgLy8gRmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChhdXRoIGludGVyY2VwdG9yIGFwcGxpZXMpIHRoZW5cbiAgICAgIC8vIHVwc2NhbGVkIHRvIGZ1bGwtcmVzIChzYW1lIGFzIHRoZSBpbml0aWFsIGxvYWQg4oCUIHNlZSB0b0Z1bGxSZXNVcmwpIHNvXG4gICAgICAvLyB0aGUgd29ybGQgc3RheXMgZnVsbC1yZXMgYWNyb3NzIHNsaWNlcyBhbmQgUk9JcyBrZWVwIGFsaWduaW5nLiBHdWFyZFxuICAgICAgLy8gYWdhaW5zdCBhIG5ld2VyIHNjcnViIGxhbmRpbmcgZmlyc3QuXG4gICAgICB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybClcbiAgICAgICAgLnRoZW4oKHByZXZpZXdVcmwpID0+XG4gICAgICAgICAgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyAwLCB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyAwKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy52aWV3ZXIuYWRkT25jZUhhbmRsZXIoJ29wZW4tZmFpbGVkJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzbGljZSByZS1vcGVuIGZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7XG4gICAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmwsIHopOyAvLyByZS1iaW4gdGhlIHNjcnViYmVkIHNsaWNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGVzY3JpcHRvciB8fCAhdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50WiA9IHo7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHdhbmQgcmVhZGJhY2sgaXMgc2xpY2Utc3BlY2lmaWNcbiAgICB0aGlzLmNhY2hlLnNob3dTbGljZSh6KTtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKHRoaXMuZGVzY3JpcHRvciwgdGhpcy5pbmZvQjY0LCB6KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yID8geyB3aWR0aDogdGhpcy5kZXNjcmlwdG9yLndpZHRoLCBoZWlnaHQ6IHRoaXMuZGVzY3JpcHRvci5oZWlnaHQgfSA6IG51bGw7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCBwaXhlbHMg4oCUIHRoZSByZW5kZXJlZCB2aWV3cG9ydCAod2hhdCB0aGUgdXNlciBzZWVzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgem9vbSBhbmQgYW55IGNvbG9ybWFwIHJlY29sb3IpLCBhcyBSR0JBLiBGZWVkcyB0aGVcbiAgICogcHJvY2Vzc2luZy1waXBlbGluZSBkaWFsb2cncyBcInVzZSBjdXJyZW50IHZpZXdcIi4gUmV0dXJucyBudWxsIHVudGlsIHRpbGVzXG4gICAqIGFyZSBkcmF3bi5cbiAgICovXG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNhbnZhcztcbiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiA0LCBkYXRhOiBpbWcuZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlLXBpeGVsIHJlY3RhbmdsZSB0aGUgZHJhd2VyIGNhbnZhcyAod2hhdCB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfVxuICAgKiByZWFkcykgY3VycmVudGx5IGNvdmVycy4gVW5saWtlIHtAbGluayBlbWl0Vmlld3BvcnRDaGFuZ2V9LCB0aGlzIGlzIE5PVFxuICAgKiBjbGFtcGVkIHRvIHRoZSBpbWFnZSBib3VuZHM6IHRoZSBjYW52YXMgbWFwcyAxOjEgdG8gdGhlIHZpZXdwb3J0IHJlY3RhbmdsZSxcbiAgICogc28gbGVhdmluZyBpdCB1bmNsYW1wZWQga2VlcHMgYGNhbnZhc1B4IC0+IGltYWdlUHhgIGFuIGV4YWN0IGFmZmluZSBtYXBcbiAgICogKGNsYW1waW5nIHdvdWxkIHNrZXcgY29vcmRpbmF0ZXMgbmVhciB0aGUgaW1hZ2UgZWRnZXMpLiBSb3V0ZWQgdGhyb3VnaCB3b3JsZFxuICAgKiBpdGVtIDAgKHNlZSB7QGxpbmsgdmlld3BvcnRSZWN0VG9JbWFnZX0pIGZvciBtdWx0aS1sYXllciBhY2N1cmFjeS5cbiAgICovXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICByZXR1cm4geyB4OiByLngsIHk6IHIueSwgd2lkdGg6IHIud2lkdGgsIGhlaWdodDogci5oZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgLy8gU25hcHNob3QgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBPU0QgdmlldyBhcyBhIFBORyAoV1lTSVdZRykg4oCUIHRoZSBwYXJhbGxlbFxuICAgIC8vIHRvIFBsb3RseSdzIGRvd25sb2FkSW1hZ2UuIE9TRCB1c2VzIHRoZSAyRCBjYW52YXMgZHJhd2VyIGFuZCBiYWtlcyB0aGVcbiAgICAvLyBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCAvIHBlci1jaGFubmVsIGNvbG91cnMgL1xuICAgIC8vIGludmVydCkgaW50byB0aGUgdGlsZXMgdmlhIHRoZSByZWNvbG9yIHBpcGVsaW5lLCBzbyB0aGUgZHJhd2VyIGNhbnZhc1xuICAgIC8vIGFscmVhZHkgcmVmbGVjdHMgZXhhY3RseSB3aGF0J3Mgb24gc2NyZWVuIGF0IHRoZSBjdXJyZW50IHpvb20vcGFuLiBUaGVcbiAgICAvLyBmdWxsLXJlc29sdXRpb24gc3RpdGNoZWQgZXhwb3J0IGxpdmVzIGluIGV4cG9ydENvbXBvc2l0ZSgpIChDaGFubmVscyAmXG4gICAgLy8gSGlzdG9ncmFtIGRpYWxvZykuXG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICBzZXRQbG90VHlwZShfcGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgLyogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZSAqL1xuICB9XG4gIHNldFN1cmZhY2VEcmFnTW9kZShfbW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUgaW1hZ2UgcmVnaW9uIChmdWxsLWltYWdlIHBpeGVsIGNvb3JkcyksIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcy4gVGhlIGludGVuc2l0eSBpbnNldCByZS1zYW1wbGVzIHRoaXMgcmVnaW9uIGF0IHRoZSB6b29tIHJlc29sdXRpb24uICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydENoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKioge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgaW50ZW5zaXR5IHNhbXBsaW5nIGxpdmVzIGluIHRoZSBQbG90bHlcbiAgICogIGJhY2tlbmQgKGl0IG93bnMgcGl4ZWwgcmVhZGJhY2spLiBPU0QgZmVlZHMgaXQgb25seSB2aWEgZ2V0Vmlld3BvcnRDaGFuZ2UkO1xuICAgKiAgdGhlIHNhbXBsaW5nLWNhY2hlIHByaW1pbmcgaXRzZWxmIGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgYXN5bmMgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoX2ltYWdlSW5mbzogSUltYWdlSW5mbywgX3pJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogbm8tb3A6IFBsb3RseSBvd25zIGludGVuc2l0eSBzYW1wbGluZyAoc2VlIElJbnRlbnNpdHlTYW1wbGluZykgKi9cbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBzZWUge0BsaW5rIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nfS4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIENvbXB1dGUgdGhlIGN1cnJlbnQgdmlld3BvcnQncyBpbWFnZS1waXhlbCByZWN0YW5nbGUgKGNsYW1wZWQgdG8gdGhlIGltYWdlKVxuICAgKiAgYW5kIGJyb2FkY2FzdCBpdC4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnRDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudmlzaWJsZUltYWdlUmVjdCgpO1xuICAgIGlmIChyZWN0KSB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHJlY3QpO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50IHZpZXdwb3J0J3MgaW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlLCBjbGFtcGVkIHRvIHRoZSBpbWFnZSwgb3JcbiAgICogIG51bGwgd2hlbiB0aGVyZSBpcyBubyBsYWlkLW91dCB2aWV3cG9ydC4gKi9cbiAgcHJpdmF0ZSB2aXNpYmxlSW1hZ2VSZWN0KCk6IFBsb3RNb2RlUmVjdCB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgLy8gUm91dGUgdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpOiB2cC52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUgaXNcbiAgICAgIC8vIGluYWNjdXJhdGUgYW5kIHdhcm5zIHdoZW4gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWxcbiAgICAgIC8vIG11bHRpY2hhbm5lbCBsYXllcnMpLCB3aGljaCBmZWQgdGhlIGludGVuc2l0eSBpbnNldCBhIHdyb25nIFJPSS5cbiAgICAgIGNvbnN0IHIgPSB2aWV3cG9ydFJlY3RUb0ltYWdlKHRoaXMudmlld2VyLCB2cC5nZXRCb3VuZHModHJ1ZSkpO1xuICAgICAgY29uc3QgaXcgPSB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGloID0gdGhpcy5kZXNjcmlwdG9yLmhlaWdodDtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpdywgci54KSk7XG4gICAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaWgsIHIueSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihpdyAtIHgsIHIud2lkdGgpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGloIC0geSwgci5oZWlnaHQpKTtcbiAgICAgIHJldHVybiB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsOyAvKiB2aWV3cG9ydCBub3QgcmVhZHkgKi9cbiAgICB9XG4gIH1cblxuICAvKiogQ29hbGVzY2UgcmVkcmF3cyBpbnRvIG9uZSB7QGxpbmsgZnJhbWUkfSBlbWlzc2lvbiBwZXIgYW5pbWF0aW9uIGZyYW1lLlxuICAgKiAgU2tpcHBlZCBlbnRpcmVseSB3aGlsZSBub3RoaW5nIGxpc3RlbnMuICovXG4gIHByaXZhdGUgc2NoZWR1bGVGcmFtZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mcmFtZVJhZiAhPT0gbnVsbCB8fCAhdGhpcy5mcmFtZSQub2JzZXJ2ZWQpIHJldHVybjtcbiAgICB0aGlzLmZyYW1lUmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuZnJhbWVSYWYgPSBudWxsO1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMudmlzaWJsZUltYWdlUmVjdCgpO1xuICAgICAgaWYgKHJlY3QpIHRoaXMuZnJhbWUkLm5leHQocmVjdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0IGEgY29udHJpYnV0ZWQgcGxvdCBtb2RlIGRyYXdzIG92ZXIuIE9uZSBzdGFibGUgb2JqZWN0IHBlclxuICAgKiBzZXJ2aWNlOiBldmVyeSBtZXRob2QgcmVhZHMgdGhlIENVUlJFTlQgdmlld2VyLCBzbyBpdCBzdGF5cyB2YWxpZCBhY3Jvc3MgYVxuICAgKiB2aWV3ZXIgcmVidWlsZCBhbmQgcmVwb3J0cyBgaXNSZWFkeSgpID09PSBmYWxzZWAgd2hpbGUgbm9uZSBpcyBtb3VudGVkXG4gICAqIChjb252ZXJzaW9ucyB0aGVuIHJldHVybiBOYU4gcmF0aGVyIHRoYW4gdGhyb3dpbmcpLlxuICAgKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHtcbiAgICBpZiAodGhpcy5wbG90TW9kZVZpZXdwb3J0KSByZXR1cm4gdGhpcy5wbG90TW9kZVZpZXdwb3J0O1xuICAgIGNvbnN0IG5hbiA9IHsgeDogTmFOLCB5OiBOYU4gfTtcbiAgICBjb25zdCByZWFkeSA9ICgpID0+ICEhdGhpcy5jb29yZFRyYW5zZm9ybT8uaXNSZWFkeSgpO1xuICAgIHRoaXMucGxvdE1vZGVWaWV3cG9ydCA9IHtcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZGF0YVRvQ2xpZW50OiAoeCwgeSkgPT4gKHJlYWR5KCkgPyB0aGlzLmNvb3JkVHJhbnNmb3JtIS5kYXRhVG9DbGllbnQoeCwgeSkgOiBuYW4pLFxuICAgICAgY2xpZW50VG9EYXRhOiAoY3gsIGN5KSA9PiAocmVhZHkoKSA/IHRoaXMuY29vcmRUcmFuc2Zvcm0hLmNsaWVudFRvRGF0YShjeCwgY3kpIDogbmFuKSxcbiAgICAgIGRhdGFMZW5ndGhUb1NjcmVlbjogKGxlbikgPT4gKHJlYWR5KCkgPyB0aGlzLmNvb3JkVHJhbnNmb3JtIS5kYXRhTGVuZ3RoVG9TY3JlZW4obGVuKSA6IE5hTiksXG4gICAgICBpc1JlYWR5OiByZWFkeSxcbiAgICAgIC8vIEJvdGggc3RhcnQgd2l0aCB0aGUgY3VycmVudCB2aXNpYmxlIHJlY3Qgd2hlbiB0aGUgdmlld3BvcnQgaXMgcmVhZHk6IGEgbW9kZVxuICAgICAgLy8gYWN0aXZhdGVzIGFmdGVyIHRoZSBiYXNlIHJlbmRlciBoYXMgZ29uZSBpZGxlLCBzbyB3aXRob3V0IGl0IGFuIG92ZXJsYXlcbiAgICAgIC8vIGZvbGxvd2luZyBgZnJhbWUkLnN1YnNjcmliZShyZWRyYXcpYCB3b3VsZCBzdGF5IGJsYW5rIHVudGlsIHRoZSBuZXh0IHBhbi96b29tLlxuICAgICAgZnJhbWUkOiB0aGlzLndpdGhDdXJyZW50UmVjdCh0aGlzLmZyYW1lJCwgcmVhZHkpLFxuICAgICAgc2V0dGxlZCQ6IHRoaXMud2l0aEN1cnJlbnRSZWN0KHRoaXMudmlld3BvcnRDaGFuZ2UkLCByZWFkeSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wbG90TW9kZVZpZXdwb3J0O1xuICB9XG5cbiAgLyoqIGBzb3VyY2VgLCBwcmVjZWRlZCBieSB0aGUgY3VycmVudCB2aXNpYmxlIHJlY3QgZm9yIGVhY2ggc3Vic2NyaWJlciAod2hlbiByZWFkeSkuICovXG4gIHByaXZhdGUgd2l0aEN1cnJlbnRSZWN0KHNvdXJjZTogU3ViamVjdDxQbG90TW9kZVJlY3Q+LCByZWFkeTogKCkgPT4gYm9vbGVhbik6IE9ic2VydmFibGU8UGxvdE1vZGVSZWN0PiB7XG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWFkeSgpID8gdGhpcy52aXNpYmxlSW1hZ2VSZWN0KCkgOiBudWxsO1xuICAgICAgcmV0dXJuIHJlY3QgPyBzb3VyY2UucGlwZShzdGFydFdpdGgocmVjdCkpIDogc291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIE9TRCB0YXJnZXRzIHRoZSBpbWFnZSBkaXNwbGF5OyB0aGUgc2NhbGFyLzNEIHBsb3QgdHlwZXMgYmVsb25nIHRvIFBsb3RseS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIFtQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuSEVBVE1BUF0hXTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgLyoqIE9TRCBvbmx5IHJlbmRlcnMgdGhlIGltYWdlIHR5cGU7IHRoZSBMSU5FIGludGVuc2l0eSBpbnNldCBpcyBQbG90bHktb25seS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoX2RpdklkOiBzdHJpbmcsIF9wcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgLyogbm8gTElORSBtb2RlIG9uIE9TRCAqL1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZSArIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZSAvIFZpc3VhbGl6ZXJTdG9yZSAoaWRlbnRpY2FsIHRvIG5hcGFyaS1qcykuIFRoZSBPU0QgcmVnaW9uXG4gIC8vIG92ZXJsYXkgKGNvbnN0cnVjdGVkIGluIHBsb3QoKSkgcmVhZHMvd3JpdGVzIHRoYXQgc2FtZSBzdG9yZSwgc28gcmVnaW9uc1xuICAvLyBzdGF5IGluIHN5bmMgd2l0aCBQbG90bHkgYW5kIHRoZSBSZWdpb24gRWRpdG9yOyBPU0QgcmVuZGVycyB0aGVtIGFzIGFuIFNWR1xuICAvLyBvdmVybGF5IHJhdGhlciB0aGFuIGNhcnJ5aW5nIFBsb3RseSBzaGFwZSBkaWN0cy5cblxuICAvLyDilIDilIAgSVRvb2xDb250cm9sbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBXYW5kICsgdmVydGV4IGVyYXNlciBydW4gb3ZlciBPU0QgdmlhIElDb29yZGluYXRlVHJhbnNmb3JtLiBUaGV5IHNoYXJlIHRoZVxuICAvLyBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB3aXRoIFBsb3RseSwgc28gd2UgcmUtYmluZCB0byBvdXIgaG9zdHMgb24gYWN0aXZhdGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUYWtlIHRoZSBwb2ludGVyIGZyb20gT1NEIHNvIHRoZSBkcmFnIGRyYXdzIGluc3RlYWQgb2YgcGFubmluZy4gKE5hdiBpc1xuICAgIC8vIHJlLWVuYWJsZWQgd2hlbiB0aGUgcmVnaW9uIG92ZXJsYXkgcmV0dXJucyB0byAnbm9uZScgb24gdG9vbCBzd2l0Y2guKVxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlIHJlbmRlcmVkIHZpZXdwb3J0IOKAlCByZWFkIGJhY2sgbGF6aWx5IG9uIGZpcnN0IHVzZS5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRha2UgdGhlIHBvaW50ZXIgZnJvbSBPU0Qgc28gdGhlIGRyYWcgcGFpbnRzIGluc3RlYWQgb2YgcGFubmluZy5cbiAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTtcbiAgICAvLyBUaGUgYnJ1c2ggd29ya3MgaW4gdGhlIHJlbmRlcmVkLXZpZXdwb3J0IGNvb3JkaW5hdGUgZnJhbWUg4oCUIHJlYWQgaXQgYmFja1xuICAgIC8vIGxhemlseSBvbiBmaXJzdCB1c2UsIGxpa2UgdGhlIHdhbmQuIEl0IHNoYXJlcyB0aGUgd2FuZCdzIGhvc3QuXG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0T3B0aW9ucygob3B0aW9ucyA/PyB7fSkgYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpOyAvLyB0b29sIHRha2VzIHRoZSBwb2ludGVyXG4gICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgIHRoaXMuZXJhc2VyVG9vbC5iaW5kSG9zdCh0aGlzLmVyYXNlckhvc3QpO1xuICAgIH1cbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICB9XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRSYWRpdXMocmFkaXVzKTtcbiAgfVxuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpOyAvLyB0aGUgYm94IGRyYWcgbXVzdCBub3QgcGFuXG4gICAgICB0aGlzLnpvb21Ub0JveFRvb2wuYmluZEhvc3QodGhpcy56b29tQm94SG9zdCgpKTtcbiAgICB9XG4gICAgdGhpcy56b29tVG9Cb3hUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgICBpZiAoIWFjdGl2ZSkgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZCh0cnVlKTtcbiAgfVxuICAvKiogQm94LXByb21wdGVkIFNBTTogc2VnbWVudCB0aGUgZHJhd24gcmVjdGFuZ2xlcy4gVGhlIFNBTSB0b29sIHJldXNlcyB0aGVcbiAgICogIHdhbmQgaG9zdCAodmlld3BvcnQgcmVhZGJhY2sgKyBjb29yZGluYXRlIHRyYW5zZm9ybSArIHJlZ2lvbiBzdG9yZSkuICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHNlZ21lbnQgYWdhaW5zdCB0aGUgY3VycmVudCB2aWV3cG9ydCByZWFkYmFja1xuICAgIHRoaXMuc2FtVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5zYW1Ub29sLnNlZ21lbnRCb3hlcygpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtcbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDsgLy8gY3JvcCBhZ2FpbnN0IHRoZSBjdXJyZW50IHZpZXdwb3J0IHJlYWRiYWNrXG4gICAgdGhpcy5jZWxsU2VnbWVudFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFNlZ21lbnRUb29sLnNlZ21lbnRCb3hlcyh0aGlzLmNlbGxTZWdtZW50ZXIpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvb2wuc2V0TW9kZWwoaWQpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGVsKGlkKTtcbiAgfVxuICBzZXRTYW1Qb2ludE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7IC8vIGNsaWNrcyBhZGQgcG9pbnRzLCBkb24ndCBwYW5cbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNvbW1pdCgpOyB9XG4gIGNsZWFyU2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jbGVhcigpOyB9XG5cbiAgLyoqIEJ1aWxkIHRoZSB3YW5kL2VyYXNlciBob3N0IG9iamVjdHMgYm91bmQgdG8gdGhpcyBiYWNrZW5kLiBCb3RoIHRvb2xzIHJ1blxuICAgKiAgb3ZlciBPU0QgdmlhIHRoZSBzaGFyZWQgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyBhIHZpZXdwb3J0IHBpeGVsIHJlYWRiYWNrLFxuICAgKiAgYW5kIHJlYWQvd3JpdGUgcmVnaW9ucyBkaXJlY3RseSBvbiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlIChuZXV0cmFsIG1vZGVsKS4gKi9cbiAgcHJpdmF0ZSBidWlsZFRvb2xIb3N0cygpOiB2b2lkIHtcbiAgICB0aGlzLndhbmRIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VEYXRhOiAoKSA9PiB0aGlzLnJlYWRiYWNrVmlld3BvcnQoKSxcbiAgICAgIGdldEFjdGl2ZUZyYW1lSW5kZXg6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuY29vcmRUcmFuc2Zvcm0gYXMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG4gICAgICBnZXRGaWxlTmFtZTogKCkgPT4gdGhpcy5jdXJyZW50RmlsZU5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHJlZ2lvbnMpID0+IHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuY29vcmRUcmFuc2Zvcm0gYXMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG4gICAgICBnZXRDYWNoZWRJbWFnZVJhdGlvOiAoKSA9PiB0aGlzLnJlYWRiYWNrVmlld3BvcnQoKT8ucmF0aW9zWzBdID8/IDEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgZWxlbWVudCB0aGUgb24tY2FudmFzIHRvb2wgb3ZlcmxheXMgYXR0YWNoIHRvIChPU0QgaXMgbW91bnRlZCBoZXJlKS4gKi9cbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICB9XG5cbiAgLyoqIFNpemUgdGhlIG5hdmlnYXRvciBmcm9tIHRoZSBDVVJSRU5UIGNvbnRhaW5lciAobmF2aWdhdG9yU2l6ZVJhdGlvIG9mIHRoZVxuICAgKiAgdmlld2VyIGVsZW1lbnQpIGFuZCBrZWVwIGl0IHBpbm5lZCB0byB0aGUgY29ybmVyLiBPU0QgY29tcHV0ZXMgdGhlIHNpemVcbiAgICogIG9uY2UgaW4gdGhlIFZpZXdlciBjb25zdHJ1Y3RvciDigJQgYmVmb3JlIHRoZSBob3N0IGZsZXggbGF5b3V0IHNldHRsZXMg4oCUXG4gICAqICBhbmQgbmV2ZXIgY29ycmVjdHMgaXQsIGxlYXZpbmcgYSBzdGFsZS1zaXplIGVsZW1lbnQgd2hvc2UgdmlzaWJsZSBtaW5pbWFwXG4gICAqICBmbG9hdHMgYWJvdmUgdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIuICovXG4gIHByaXZhdGUgcmVzaXplTmF2aWdhdG9yKCk6IHZvaWQge1xuICAgIGNvbnN0IHY6IGFueSA9IHRoaXMudmlld2VyO1xuICAgIGNvbnN0IG5hdiA9IHY/Lm5hdmlnYXRvcjtcbiAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB2Py5lbGVtZW50O1xuICAgIGlmICghbmF2Py5lbGVtZW50IHx8ICFlbD8uY2xpZW50V2lkdGggfHwgIWVsPy5jbGllbnRIZWlnaHQpIHJldHVybjtcbiAgICBjb25zdCB3ID0gTWF0aC5yb3VuZChlbC5jbGllbnRXaWR0aCAqIDAuMTYpO1xuICAgIGNvbnN0IGggPSBNYXRoLnJvdW5kKGVsLmNsaWVudEhlaWdodCAqIDAuMTYpO1xuICAgIGlmIChuYXYuZWxlbWVudC5zdHlsZS53aWR0aCAhPT0gYCR7d31weGAgfHwgbmF2LmVsZW1lbnQuc3R5bGUuaGVpZ2h0ICE9PSBgJHtofXB4YCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmF2LnNldFdpZHRoKHcpO1xuICAgICAgICBuYXYuc2V0SGVpZ2h0KGgpO1xuICAgICAgfSBjYXRjaCB7IC8qIG5hdmlnYXRvciB0b3JuIGRvd24gKi8gfVxuICAgIH1cbiAgICAvLyBOb3JtYWxpemUgT1NEJ3MgY29udHJvbC1jb3JuZXIgc3RhY2sgc28gdGhlIG1pbmltYXAgc2l0cyBmbHVzaCBpbiB0aGVcbiAgICAvLyBjb3JuZXIsIGluc2V0IDEycHggdG8gbGluZSB1cCB3aXRoIHRoZSBzY2FsZSBiYXI6XG4gICAgLy8gIC0gdGhlIGlubGluZS1ibG9jayB3cmFwcGVyIGNhcnJpZXMgbGluZS1ib3ggc3RydXRzIGFuZCBjYW4gcmV0YWluIHN0YWxlXG4gICAgLy8gICAgc2l6aW5nIOKGkiBtYWtlIGl0IGEgdGlnaHQgYmxvY2s7XG4gICAgLy8gIC0gYW55dGhpbmcgZWxzZSBPU0QgbGVmdCBpbiB0aGUgY29ybmVyIHdvdWxkIHN0YWNrIGJlbG93IHRoZSBuYXZpZ2F0b3JcbiAgICAvLyAgICBhbmQgZmxvYXQgaXQgdXAg4oaSIGhpZGUgaXQ7XG4gICAgLy8gIC0gaW5zZXQgdGhlIGNvcm5lciBpdHNlbGYgKGJvdHRvbS9yaWdodCAxMnB4KSwga2VlcGluZyB0aGUgZWxlbWVudCBpblxuICAgIC8vICAgIG5vcm1hbCBmbG93LlxuICAgIGNvbnN0IHdyYXBwZXIgPSBuYXYuZWxlbWVudC5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBjb3JuZXIgPSB3cmFwcGVyPy5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAod3JhcHBlciAmJiBjb3JuZXIpIHtcbiAgICAgIHdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB3cmFwcGVyLnN0eWxlLmxpbmVIZWlnaHQgPSAnMCc7XG4gICAgICB3cmFwcGVyLnN0eWxlLmZvbnRTaXplID0gJzAnO1xuICAgICAgLy8gVGhlIHdyYXBwZXIga2VlcHMgdGhlIG5hdmlnYXRvcidzIHN0YWxlIHByZS1zZXR0bGUgaGVpZ2h0IGFzIGFuXG4gICAgICAvLyBleHBsaWNpdCBzaXplICh0aGUgbmF2IHdhcyAwLjE2eCB0aGUgVU5TRVRUTEVEIGNvbnRhaW5lciBhdCBjcmVhdGlvbiksXG4gICAgICAvLyBsZWF2aW5nIGFuIGVtcHR5IGJhbmQgdW5kZXIgdGhlIHJlc2l6ZWQgbWluaW1hcCDigJQgbWVhc3VyZWQgbGl2ZTpcbiAgICAgIC8vIG5hdkg9ODcgaW5zaWRlIHdyYXBIPTE2Ny4gRm9yY2UgaXQgdG8gaHVnIGl0cyBjb250ZW50LlxuICAgICAgd3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICB3cmFwcGVyLnN0eWxlLndpZHRoID0gJ2F1dG8nO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKGNvcm5lci5jaGlsZHJlbikgYXMgSFRNTEVsZW1lbnRbXSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IHdyYXBwZXIpIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIEFycmF5LmZyb20od3JhcHBlci5jaGlsZHJlbikgYXMgSFRNTEVsZW1lbnRbXSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IG5hdi5lbGVtZW50KSBjaGlsZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgICAgY29ybmVyLnN0eWxlLmJvdHRvbSA9ICcxMnB4JztcbiAgICAgIGNvcm5lci5zdHlsZS5yaWdodCA9ICcxMnB4JztcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihuYXYuZWxlbWVudC5zdHlsZSwgeyBwb3NpdGlvbjogJ3JlbGF0aXZlJywgdG9wOiAnJywgbGVmdDogJycsIGJvdHRvbTogJycsIHJpZ2h0OiAnJywgbWFyZ2luOiAnMCcgfSk7XG4gICAgLy8gVE9ETyhkZWJ1Zyk6IHJlbW92ZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICBjb25zdCBuZXIgPSBuYXYuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB3ciA9IHdyYXBwZXI/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNyID0gY29ybmVyPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwZXIgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zb2xlLndhcm4oYFt2aXo6bmF2XSBuYXZCb3R0b209JHtNYXRoLnJvdW5kKG5lci5ib3R0b20pfSB3cmFwQm90dG9tPSR7TWF0aC5yb3VuZCh3cj8uYm90dG9tID8/IC0xKX0gYCArXG4gICAgICBgY29ybmVyQm90dG9tPSR7TWF0aC5yb3VuZChjcj8uYm90dG9tID8/IC0xKX0gcGxvdEJvdHRvbT0ke01hdGgucm91bmQocGVyLmJvdHRvbSl9IGAgK1xuICAgICAgYG5hdkg9JHtNYXRoLnJvdW5kKG5lci5oZWlnaHQpfSB3cmFwSD0ke01hdGgucm91bmQod3I/LmhlaWdodCA/PyAtMSl9IGNvcm5lckg9JHtNYXRoLnJvdW5kKGNyPy5oZWlnaHQgPz8gLTEpfWApO1xuICB9XG5cbiAgLyoqIEZvcmNlIHRoZSBkb2NrZWQgdG9vbGJhciB0byByZXBhaW50IGFmdGVyIGFuIE9TRCB6b29tLiBDaHJvbWUgbGVhdmVzIGl0XG4gICAqICBsYWlkLW91dC1idXQtdW5wYWludGVkICh0aGUgY2FudmFzJ3MgY29tcG9zaXRpbmcgY2h1cm4gc3RyYW5kcyB0aGUgdG9vbGJhcidzXG4gICAqICByYXN0ZXIpLiBBIHN5bmNocm9ub3VzIGRpc3BsYXkgdG9nZ2xlIHJlLXJhc3RlcnMgaXQgd2l0aCBubyB2aXNpYmxlIGdvbmUtZnJhbWVcbiAgICogIGFuZCBubyBsYXlvdXQgc2hpZnQuIExvY2F0ZWQgdmlhIHRoZSBET00gc2luY2UgdGhpcyBzZXJ2aWNlIGRvZXNuJ3Qgb3duIHRoZVxuICAgKiAgdG9vbGJhcjsgYSBuby1vcCB3aGVuIHRoZXJlJ3Mgbm8gdG9vbGJhciAoZS5nLiBlbWJlZGRlZCB3aXRob3V0IG9uZSkuICovXG4gIHByaXZhdGUgbnVkZ2VUb29sYmFyUmVwYWludCgpOiB2b2lkIHtcbiAgICBjb25zdCBwbG90RWwgPSB0aGlzLnBsb3REaXYgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIDogbnVsbDtcbiAgICBjb25zdCBkb2NrID0gcGxvdEVsPy5jbG9zZXN0KCd2aXN1YWxpemF0aW9uJyk/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcudG9vbGJhci1kb2NrJyk7XG4gICAgaWYgKCFkb2NrKSByZXR1cm47XG4gICAgY29uc3QgcHJldiA9IGRvY2suc3R5bGUuZGlzcGxheTtcbiAgICBkb2NrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdm9pZCBkb2NrLm9mZnNldEhlaWdodDsgLy8gcmVmbG93IHNvIHRoZSB0b2dnbGUgcmUtcmFzdGVycyBvbiB0aGUgbmV4dCBwYWludFxuICAgIGRvY2suc3R5bGUuZGlzcGxheSA9IHByZXY7XG4gIH1cblxuICAvKiogSG9zdCBmb3IgdGhlIChzaGFyZWQpIHpvb20tdG8tYm94IHRvb2w6IGNvbnZlcnQgb3ZlcmxheSBwaXhlbHMgdG8gaW1hZ2VcbiAgICogIGNvb3JkcyB2aWEgdGhlIHZpZXdwb3J0LCBhbmQgZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgY2hvc2VuIHJlY3RhbmdsZS4gKi9cbiAgcHJpdmF0ZSB6b29tQm94SG9zdCgpOiBab29tVG9Cb3hUb29sSG9zdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFBsb3REaXY6ICgpID0+IHRoaXMucGxvdERpdixcbiAgICAgIHBpeGVsVG9EYXRhOiAocHg6IG51bWJlciwgcHk6IG51bWJlcikgPT4gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIHB4LCBweSksXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkczogbnVtYmVyW10pID0+IHRoaXMuYXBwbHlab29tVG9Cb3goY29vcmRzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEZpdCB0aGUgT1NEIHZpZXdwb3J0IHRvIGFuIGltYWdlLXNwYWNlIHJlY3RhbmdsZSAoY29vcmRzIG9yZGVyZWRcbiAgICogIFt4TWluLCB4TWF4LCB5TWF4LCB5TWluXSkuICovXG4gIHByaXZhdGUgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW2EsIGIsIGMsIGRdID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgeCA9IE1hdGgubWluKGEsIGIpO1xuICAgIGNvbnN0IHcgPSBNYXRoLmFicyhiIC0gYSk7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKGMsIGQpO1xuICAgIGNvbnN0IGggPSBNYXRoLmFicyhjIC0gZCk7XG4gICAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gaW1hZ2VSZWN0VG9WaWV3cG9ydCh0aGlzLnZpZXdlciwgeCwgeSwgdywgaCk7XG4gICAgdGhpcy52aWV3ZXIudmlld3BvcnQuZml0Qm91bmRzKHJlY3QsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGJhY2sgdGhlICpjdXJyZW50bHkgcmVuZGVyZWQqIE9TRCBjYW52YXMgYXMgdGhlIHdhbmQncyBwaXhlbCBtYXRyaXguXG4gICAqIFRoZSBtYXRyaXggY292ZXJzIG9ubHkgdGhlIHZpc2libGUgdmlld3BvcnQgYXQgc2NyZWVuIHJlc29sdXRpb24sIHNvIHdoZW5cbiAgICogdGhlIHVzZXIgaXMgem9vbWVkIGludG8gYSBzdWItcmVnaW9uIHRoZSB3YW5kIHNhbXBsZXMgdGhhdCByZWdpb24ncyBkZXRhaWxcbiAgICogKHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpbWFnZSBhdCBwcmV2aWV3IHJlc29sdXRpb24pLiBgb3JpZ2luWC9vcmlnaW5ZYCBhbmRcbiAgICogYHJhdGlvc2AgbWFwIGltYWdlIGNvb3JkcyA8LT4gcmVhZGJhY2stcGl4ZWwgY29vcmRzIGZvciB0aGUgd2FuZCdzXG4gICAqIGRhdGEvcmF0aW8vb3JpZ2luIG1vZGVsLiBDYWNoZWQgdW50aWwgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRiYWNrVmlld3BvcnQoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMudmlld3BvcnRQaXhlbHMpIHJldHVybiB0aGlzLnZpZXdwb3J0UGl4ZWxzO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMudmlld2VyIGFzIGFueTtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gdmlld2VyPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBjb25zdCB2cCA9IHZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCFjYW52YXMgfHwgIWNhbnZhcy53aWR0aCB8fCAhY2FudmFzLmhlaWdodCB8fCAhdnApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHcgPSBjYW52YXMud2lkdGg7IC8vIGRldmljZSBwaXhlbHNcbiAgICBjb25zdCBoID0gY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhOyAvLyBSR0JBLCByb3ctbWFqb3JcbiAgICAvLyBCdWlsZCB0aGUgW3ldW3hdID0gW3IsZyxiXSBtYXRyaXggdGhlIHdhbmQgZXhwZWN0cyBmb3IgUkdCIGZyYW1lcy5cbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW11bXSA9IG5ldyBBcnJheShoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgY29uc3Qgcm93OiBudW1iZXJbXVtdID0gbmV3IEFycmF5KHcpO1xuICAgICAgY29uc3QgYmFzZSA9IHkgKiB3ICogNDtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgIGNvbnN0IG8gPSBiYXNlICsgeCAqIDQ7XG4gICAgICAgIHJvd1t4XSA9IFtkYXRhW29dLCBkYXRhW28gKyAxXSwgZGF0YVtvICsgMl1dO1xuICAgICAgfVxuICAgICAgbWF0cml4W3ldID0gcm93O1xuICAgIH1cblxuICAgIC8vIEltYWdlLWNvb3JkIHNwYW4gdGhlIHJlYWRiYWNrIGNvdmVycyAoQ1NTIHB4IGluLCBpbWFnZSBjb29yZHMgb3V0KS4gUm91dGVcbiAgICAvLyB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAob3NkLWNvb3Jkcykgc28gaXQgc3RheXMgYWNjdXJhdGUg4oCUIGFuZCBxdWlldCDigJQgd2hlblxuICAgIC8vIHRoZSB3b3JsZCBob2xkcyBtdWx0aXBsZSBpbWFnZXMgKHBlci1jaGFubmVsIG11bHRpY2hhbm5lbCBsYXllcnMpLlxuICAgIGNvbnN0IGVsVyA9IGNhbnZhcy5jbGllbnRXaWR0aCB8fCB3O1xuICAgIGNvbnN0IGVsSCA9IGNhbnZhcy5jbGllbnRIZWlnaHQgfHwgaDtcbiAgICBjb25zdCB0bCA9IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCAwLCAwKTtcbiAgICBjb25zdCBiciA9IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBlbFcsIGVsSCk7XG4gICAgY29uc3QgcmF0aW9YID0gKGJyLnggLSB0bC54KSAvIHc7IC8vIGltYWdlIHB4IHBlciByZWFkYmFjayBweFxuICAgIGNvbnN0IHJhdGlvWSA9IChici55IC0gdGwueSkgLyBoO1xuXG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IHtcbiAgICAgIGZyYW1lczogW21hdHJpeF0sXG4gICAgICB3aWR0aDogdyxcbiAgICAgIGhlaWdodDogaCxcbiAgICAgIHJhdGlvczogW3JhdGlvWCwgcmF0aW9ZXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSwgLy8gY2FudmFzIHJlYWRiYWNrIGlzIGFsd2F5cyBSR0JBXG4gICAgICBvcmlnaW5YOiB0bC54LFxuICAgICAgb3JpZ2luWTogdGwueSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0UGl4ZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29sb3IgYSBncmF5c2NhbGUgdGlsZSB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgTFVULCB1c2luZyBPU0Qnc1xuICAgKiB0aWxlLWludmFsaWRhdGVkIHBpeGVsIHBpcGVsaW5lIChPU0QgNSsvNikuIE1hcHMgZWFjaCBwaXhlbCdzIGdyYXlzY2FsZVxuICAgKiB2YWx1ZSAocj09Zz09YikgdG8gdGhlIExVVCdzIFJHQi4gTm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgdW50aWwgdGhlIExVVCBpc1xuICAgKiBidWlsdC4gSGFuZGxlciBpcyBhc3luYyDigJQgT1NEIGF3YWl0cyBpdCAocmFpc2VFdmVudEF3YWl0aW5nKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjb2xvclRpbGUoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlY29sb3JDaGFubmVsVGlsZShldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gdGhpcy5kaXNwbGF5VG9rZW47XG4gICAgY29uc3QgZ3JheSA9IHRoaXMuaXNHcmF5c2NhbGVJbWFnZTtcbiAgICBpZiAoZ3JheSkge1xuICAgICAgaWYgKCF0aGlzLmNvbG9yTHV0KSByZXR1cm47XG4gICAgfSBlbHNlIGlmICghdGhpcy5kaXNwbGF5LnJnYk5lZWRzUmVjb2xvcigpKSB7XG4gICAgICByZXR1cm47IC8vIFJHQiBhdCBkZWZhdWx0IChhbGwgdmlzaWJsZSwgZnVsbCB3aW5kb3csIM6zPTEsIG5vIGludmVydCkg4oaSIHBhc3N0aHJvdWdoXG4gICAgfVxuXG4gICAgLy8gUmVhZCB0aGUgdGlsZSdzIHBpeGVscy4gUHJlZmVyIHRoZSByZW5kZXJpbmcgY29udGV4dCwgYnV0IHNvbWUgdGlsZSBjYWNoZXNcbiAgICAvLyAoYWpheCBQTkcgYmxvYnMpIGNvbnZlcnQgdG8gYW4gKmVtcHR5KiBjb250ZXh0MmQg4oCUIHJlY29sb3JpbmcgdGhhdCB3b3VsZFxuICAgIC8vIGJsYW5rIHRoZSB0aWxlICh3aGl0ZSBjYW52YXMpLiBTbyBpZiB0aGUgY29udGV4dCBoYXMgbm8gb3BhcXVlIHBpeGVscywgZHJhd1xuICAgIC8vIHRoZSB0aWxlJ3Mgb3duIGJpdG1hcC9pbWFnZSBhbmQgcmVjb2xvciB0aGF0IGluc3RlYWQuIFdlIG5ldmVyIHdyaXRlIGJhY2tcbiAgICAvLyB1bmxlc3Mgd2UgYWN0dWFsbHkgcmVjb2xvcmVkIHNvbWV0aGluZywgc28gYSB0aWxlIGlzIG5ldmVyIGJsYW5rZWQuXG4gICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGN0eCA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2NvbnRleHQyZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogdHJ5IGJpdG1hcCBiZWxvdyAqL1xuICAgIH1cbiAgICBsZXQgaW1nOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY3R4ICYmIGN0eC5jYW52YXMgJiYgY3R4LmNhbnZhcy53aWR0aCAmJiBjdHguY2FudmFzLmhlaWdodCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgaW1nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpbWcgfHwgIXRoaXMuaGFzT3BhcXVlKGltZy5kYXRhKSkge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSB0aWxlJ3MgZGVjb2RlZCBpbWFnZS9iaXRtYXAuXG4gICAgICBsZXQgc3JjOiBhbnkgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2VCaXRtYXAnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBub25lICovXG4gICAgICB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2UnKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogbm9uZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSByZXR1cm47IC8vIGNhbid0IGdldCBwaXhlbHMg4oCUIGxlYXZlIHRoZSB0aWxlIHVudG91Y2hlZFxuICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgYy53aWR0aCA9IHNyYy53aWR0aDtcbiAgICAgIGMuaGVpZ2h0ID0gc3JjLmhlaWdodDtcbiAgICAgIGN0eCA9IGMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICBjdHguZHJhd0ltYWdlKHNyYywgMCwgMCk7XG4gICAgICBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGlzcGxheS5hcHBseVRvUmdiYShpbWcuZGF0YSkgfHwgIWN0eCkgcmV0dXJuOyAvLyBub3RoaW5nIG9wYXF1ZVxuICAgIC8vIEEgbmV3ZXIgZGlzcGxheSByb3VuZCBoYXMgYWxyZWFkeSByZXN0b3JlZCB0aGlzIHRpbGUg4oCUIHdyaXRpbmcgbm93IHdvdWxkXG4gICAgLy8gaGFuZCBPU0QgYSBzdXBlcnNlZGVkIGNhbnZhcyBhbmQgZGVzdHJveSB0aGUgY2FjaGUgcmVjb3JkLlxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5kaXNwbGF5VG9rZW4pIHJldHVybjtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gICAgLy8gVGhlIHRpbGUncyBjYWNoZSBjYW4gc3RpbGwgYmUgZXZpY3RlZCBiZXR3ZWVuIHRoZSBhd2FpdHMgYWJvdmUgYW5kIGhlcmUgKGFcbiAgICAvLyBzbGljZSBjaGFuZ2UpLCBtYWtpbmcgc2V0RGF0YSB0aHJvdyBhIERPTUV4Y2VwdGlvbiBvbiBhIGRlYWQgY2FudmFzLlxuICAgIC8vIFN3YWxsb3cgaXQg4oCUIHRoZSB0aWxlIGlzIGdvbmUsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byByZWNvbG9yLlxuICAgIHRyeSB7IGF3YWl0IGV2ZW50LnNldERhdGEoY3R4LCAnY29udGV4dDJkJyk7IH0gY2F0Y2ggeyAvKiB0aWxlIGV2aWN0ZWQgKi8gfVxuICB9XG5cbiAgLyoqXG4gICAqIFRpbnQgYSBzaW5nbGUgY2hhbm5lbCdzIHRpbGUgaW4gcGxhY2UuIEVhY2ggY2hhbm5lbCBpcyBpdHMgb3duIE9wZW5TZWFkcmFnb25cbiAgICogVGlsZWRJbWFnZSAoYSBzaW5nbGUtYmFuZCBncmF5c2NhbGUgdGlsZSk7IE9TRCBjb21wb3NpdGVzIHRoZSBOIGltYWdlc1xuICAgKiBhZGRpdGl2ZWx5ICgnbGlnaHRlcicpIGluIGl0cyBkcmF3ZXIg4oCUIHNvIHRoaXMganVzdCBtYXBzIHRoZSB0aWxlJ3MgaW50ZW5zaXR5XG4gICAqIHRocm91Z2ggdGhlIGNoYW5uZWwncyB3aW5kb3cvZ2FtbWEgYW5kIGl0cyBwc2V1ZG8tY29sb3VyLiBTeW5jaHJvbm91cyAobm9cbiAgICogY3Jvc3MtdGlsZSBmZXRjaCkg4oaSIG5vIHJhY2UsIG5vIHNlYW1zLiBDaGFubmVsIGlzIHBhcnNlZCBmcm9tIHRoZSB0aWxlIFVSTC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjb2xvckNoYW5uZWxUaWxlKGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZGlzcGxheVRva2VuO1xuICAgIGNvbnN0IHRpbGUgPSBldmVudD8udGlsZTtcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9ICh0aWxlICYmICh0eXBlb2YgdGlsZS5nZXRVcmwgPT09ICdmdW5jdGlvbicgPyB0aWxlLmdldFVybCgpIDogdGlsZS51cmwpKSB8fCAnJztcbiAgICBjb25zdCBtID0gL1s/Jl1jaGFubmVsPShcXGQrKS8uZXhlYyh1cmwpO1xuICAgIGNvbnN0IGNoID0gbSA/IHBhcnNlSW50KG1bMV0sIDEwKSA6IDA7XG4gICAgY29uc3Qgc3QgPSB0aGlzLmNoYW5uZWxTdGF0ZXNbY2hdO1xuXG4gICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHsgY3R4ID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnY29udGV4dDJkJyk7IH0gY2F0Y2ggeyAvKiBmYWxsYmFjayBiZWxvdyAqLyB9XG4gICAgbGV0IGltZzogSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGN0eCAmJiBjdHguY2FudmFzICYmIGN0eC5jYW52YXMud2lkdGggJiYgY3R4LmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgIHRyeSB7IGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOyB9IGNhdGNoIHsgaW1nID0gbnVsbDsgfVxuICAgIH1cbiAgICBpZiAoIWltZyB8fCAhdGhpcy5oYXNPcGFxdWUoaW1nLmRhdGEpKSB7XG4gICAgICBsZXQgc3JjOiBhbnkgPSBudWxsO1xuICAgICAgdHJ5IHsgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2VCaXRtYXAnKTsgfSBjYXRjaCB7IC8qIG5vbmUgKi8gfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkgeyB0cnkgeyBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZScpOyB9IGNhdGNoIHsgLyogbm9uZSAqLyB9IH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSBzcmMud2lkdGg7IGMuaGVpZ2h0ID0gc3JjLmhlaWdodDtcbiAgICAgIGN0eCA9IGMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICBjdHguZHJhd0ltYWdlKHNyYywgMCwgMCk7XG4gICAgICBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KTtcbiAgICB9XG4gICAgaWYgKCFjdHgpIHJldHVybjtcblxuICAgIC8vIFByZWNvbXB1dGUgbHVtKDAuLjI1NSkg4oaSIHRpbnRlZCBSR0Igb25jZSwgdGhlbiBtYXAgZWFjaCBwaXhlbCBieSBsb29rdXAg4oCUXG4gICAgLy8gdGhlIGNoYW5uZWwgdGlsZSBpcyBzaW5nbGUtYmFuZCwgc28gdGhpcyB0dXJucyB+MjYyayBwZXItcGl4ZWxcbiAgICAvLyBjaGFubmVsSW50ZW5zaXR5KCkgKHdpdGggTWF0aC5wb3cgZm9yIGdhbW1hKSBjYWxscyBpbnRvIDI1NiDigJQgdGhlIGRpZmZlcmVuY2VcbiAgICAvLyBiZXR3ZWVuIGEgc25hcHB5IGFuZCBhIHNsdWdnaXNoIHNsaWRlciBvbiBhIDQtY2hhbm5lbCBzdGFjay5cbiAgICBjb25zdCB7IHI6IHJMLCBnOiBnTCwgYjogYkwgfSA9IHRoaXMuZGlzcGxheS5jaGFubmVsUmdiTHV0KHN0KTtcbiAgICBjb25zdCBkID0gaW1nLmRhdGE7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICBjb25zdCByID0gZFtpXSwgZyA9IGRbaSArIDFdLCBiID0gZFtpICsgMl07XG4gICAgICBjb25zdCBsdW0gPSByID49IGcgPyAociA+PSBiID8gciA6IGIpIDogZyA+PSBiID8gZyA6IGI7IC8vIHNpbmdsZS1iYW5kIOKGkiBtYXhcbiAgICAgIGRbaV0gPSByTFtsdW1dO1xuICAgICAgZFtpICsgMV0gPSBnTFtsdW1dO1xuICAgICAgZFtpICsgMl0gPSBiTFtsdW1dO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmICghY2hhbmdlZCkgcmV0dXJuO1xuICAgIC8vIEEgbmV3ZXIgZGlzcGxheSByb3VuZCAodGhlIG5leHQgdGljayBvZiBhIHNsaWRlciBkcmFnKSBoYXMgYWxyZWFkeSByZXN0b3JlZFxuICAgIC8vIHRoaXMgdGlsZS4gV3JpdGluZyBhIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIG1ha2VzIE9TRCdzIGNvbnZlcnNpb24gdGhyb3dcbiAgICAvLyBET01FeGNlcHRpb24sIHdoaWNoIGRlc3Ryb3lzIHRoZSBjYWNoZSByZWNvcmQgYW5kIHVubG9hZHMgdGhlIHRpbGUg4oCUIGRvXG4gICAgLy8gbm90aGluZyBhbmQgbGV0IHRoZSBuZXdlciByb3VuZCByZXBhaW50IGl0LlxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5kaXNwbGF5VG9rZW4pIHJldHVybjtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gICAgLy8gU2VlIHJlY29sb3JUaWxlOiB0aGUgdGlsZSBjYWNoZSBjYW4gc3RpbGwgZGllIGJldHdlZW4gdGhlIGF3YWl0cyBhbmQgaGVyZS5cbiAgICB0cnkgeyBhd2FpdCBldmVudC5zZXREYXRhKGN0eCwgJ2NvbnRleHQyZCcpOyB9IGNhdGNoIHsgLyogdGlsZSBldmljdGVkICovIH1cbiAgfVxuXG4gIC8qKiBQZXItY2hhbm5lbCBoaXN0b2dyYW0gZm9yIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lLCBmcm9tIHRoZSBjdXJyZW50XG4gICAqICBzbGljZSdzIHNhbXBsZWQgdGlsZXMgKGdyYXlzY2FsZSDihpIgY2hhbm5lbCAwOyBSR0Ig4oaSIFIvRy9CKS4gTnVsbCB1bnRpbCB0aGVcbiAgICogIGFzeW5jIHNhbXBsaW5nIHJlc29sdmVzIG9yIGlmIGl0IHdhcyBza2lwcGVkLiAqL1xuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIF9iaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2FtcGxlci5nZXQodGhpcy5jdXJyZW50WiwgY2hhbm5lbEluZGV4KTtcbiAgfVxuXG4gIC8qKiBOYXRpdmUgYml0IGRlcHRoIG9mIGEgY2hhbm5lbCBmcm9tIHRoZSB0aWxlIGRlc2NyaXB0b3IgKDggd2hlbiB1bmtub3duKS4gKi9cbiAgcHJpdmF0ZSBjaGFubmVsQml0RGVwdGgoY2hhbm5lbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxJbmZvPy5bY2hhbm5lbEluZGV4XT8uYml0RGVwdGggPz8gODtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBoaXN0b2dyYW0gZm9yIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lLiBGb3IgPjgtYml0IGltYWdlcyBpdFxuICAgKiBmZXRjaGVzIHRoZSAqKm5hdGl2ZSoqIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSBzZXJ2ZXIgYC9oaXN0b2dyYW1gIGVuZHBvaW50XG4gICAqICh0aGUgOC1iaXQgY2FudmFzIHRpbGVzIGNhbid0IGNhcnJ5IDE2LWJpdCB2YWx1ZXMpIGFuZCBjYWNoZXMgaXQgcGVyXG4gICAqIHNsaWNlK2NoYW5uZWw7IGZvciA4LWJpdC9SR0IgaXQgcmV0dXJucyB0aGUgZXhpc3RpbmcgY2xpZW50LXNhbXBsZWQgOC1iaXRcbiAgICogaGlzdG9ncmFtLiBSZWFkLW9ubHkg4oCUIGl0IG5ldmVyIHRvdWNoZXMgdGhlIHRpbGUvZGlzcGxheSBwaXBlbGluZS5cbiAgICovXG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICBpZiAodGhpcy5jaGFubmVsQml0RGVwdGgoY2hhbm5lbEluZGV4KSA8PSA4IHx8ICF0aGlzLmluZm9CNjQpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2FtcGxlci5uYXRpdmUkKHRoaXMuaW5mb0I2NCwgdGhpcy5jdXJyZW50WiwgY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgaW1hZ2UgZGF0YSBhcyBhIGRhdGEtcHJlc2VydmluZyBtdWx0aS1iYW5kIFRJRkYgYXRcbiAgICogbmF0aXZlIGJpdCBkZXB0aCB2aWEgYEdFVCAvZXhwb3J0L3RpZmZgICh0aGUgc2VydmVyIHJlYWRzIHRoZSByYXcgMTYtYml0XG4gICAqIHBsYW5lcyDigJQgdGhlIGNsaWVudCBuZXZlciBzZWVzIHRoZW0pLiBTZW5kcyBvbmx5IHRoZSB2aXNpYmxlIGNoYW5uZWxzOyB0aGVcbiAgICogZXhpc3RpbmcgOC1iaXQgY29tcG9zaXRlIFBORyBleHBvcnQgaXMgdW5hZmZlY3RlZC5cbiAgICovXG4gIGFzeW5jIGV4cG9ydERhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5jaGFubmVsU3RhdGVzLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKS5tYXAoKGMpID0+IGMuaW5kZXgpO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGg7XG4gICAgLy8gT21pdCBgY2hhbm5lbHNgIHdoZW4gZXZlcnkgY2hhbm5lbCBpcyB2aXNpYmxlIChzZXJ2ZXIgZGVmYXVsdCA9IGFsbCkuXG4gICAgY29uc3QgY2hQYXJhbSA9XG4gICAgICB2aXNpYmxlLmxlbmd0aCAmJiB2aXNpYmxlLmxlbmd0aCA8IGFsbCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke3RoaXMuaW5mb0I2NH0mej0ke3RoaXMuY3VycmVudFp9JHtjaFBhcmFtfWA7XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLmdldCh1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSlcbiAgICAgICAgICAucGlwZSh0aW1lb3V0KDYwMDAwMCkpLCAvLyBsYXJnZSBleHBvcnRzIHN0cmVhbSBzbG93bHk7IGdlbmVyb3VzIGRlYWRsaW5lXG4gICAgICApO1xuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSAxNi1iaXQgZXhwb3J0OiBmaWxlIHN0aWxsIGNhY2hpbmcg4oCUIHRyeSBhZ2FpbiBzaG9ydGx5LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBibG9iID0gcmVzcC5ib2R5O1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfV8xNmJpdC5vbWUudGlmYCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIDE2LWJpdCBUSUZGIGV4cG9ydCBmYWlsZWQnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgdGhlIGN1cnJlbnQgc2xpY2UgYXMgYSBwdWJsaWNhdGlvbi1yZWFkeSBQTkcgY29tcG9zaXRlZCB3aXRoIHRoZVxuICAgKiBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCBvciBwZXItY2hhbm5lbCBwc2V1ZG8tXG4gICAqIGNvbG91cnMgLyBpbnZlcnQpLiBQaWNrcyB0aGUgbGFyZ2VzdCBweXJhbWlkIGxldmVsIHVuZGVyIGEgcGl4ZWwgY2FwICh0aGVcbiAgICogY29hcnNlciBvdmVydmlldyBmb3IgaHVnZSB3aG9sZS1zbGlkZXMpLCBmZXRjaGVzIHRoYXQgbGV2ZWwncyB0aWxlIGdyaWQsXG4gICAqIHN0aXRjaGVzIGl0IGludG8gb25lIGNhbnZhcywgcnVucyB0aGUgc2hhcmVkIGRpc3BsYXkgcGlwZWxpbmUsIGFuZCBzYXZlcyBpdC5cbiAgICovXG4gIGFzeW5jIGV4cG9ydENvbXBvc2l0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXNjID0gdGhpcy5kZXNjcmlwdG9yO1xuICAgIGNvbnN0IGxldmVscyA9IGRlc2M/LmxldmVscyA/PyBbXTtcbiAgICBpZiAoIWRlc2MgfHwgIXRoaXMuaW5mb0I2NCB8fCAhbGV2ZWxzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IENBUCA9IDMyXzAwMF8wMDA7IC8vIH4zMiBNUCDigJQgYm91bmRzIG1lbW9yeSBmb3Igd2hvbGUtc2xpZGUgaW1hZ2VzXG4gICAgbGV0IHJlcyA9IGxldmVscy5sZW5ndGggLSAxOyAvLyBjb2Fyc2VzdCBmYWxsYmFja1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGV2ZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGV2ZWxzW2ldLndpZHRoICogbGV2ZWxzW2ldLmhlaWdodCA8PSBDQVApIHsgcmVzID0gaTsgYnJlYWs7IH1cbiAgICB9XG4gICAgY29uc3QgbHcgPSBsZXZlbHNbcmVzXS53aWR0aDtcbiAgICBjb25zdCBsaCA9IGxldmVsc1tyZXNdLmhlaWdodDtcbiAgICBjb25zdCB0ID0gZGVzYy50aWxlU2l6ZTtcbiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx3IC8gdCkpO1xuICAgIGNvbnN0IHJvd3MgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobGggLyB0KSk7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gbHc7XG4gICAgY2FudmFzLmhlaWdodCA9IGxoO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgY29uc3QgeiA9IHRoaXMuY3VycmVudFo7XG4gICAgY29uc3Qgam9iczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGJ1aWxkVGlsZVVybCh0aGlzLmFwaSwgdGhpcy5pbmZvQjY0LCB7IHJlcywgY29sLCByb3csIHosIHRpbGVTaXplOiB0IH0pO1xuICAgICAgICBqb2JzLnB1c2goXG4gICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJtcCA9IGF3YWl0IGZldGNoVGlsZUJpdG1hcCh0aGlzLmh0dHAsIHVybCwgMzAwMDApO1xuICAgICAgICAgICAgICBjdHguZHJhd0ltYWdlKGJtcCwgY29sICogdCwgcm93ICogdCk7XG4gICAgICAgICAgICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBhIGZhaWxlZCB0aWxlIOKAlCB0aGUgZXhwb3J0ZWQgY29tcG9zaXRlIGhhcyBhIGdhcCB0aGVyZS5cbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdbdml6OmV4cG9ydF0gY29tcG9zaXRlIHRpbGUgZmV0Y2ggZmFpbGVkLCBza2lwcGluZycsIHVybCwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChqb2JzKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBsdywgbGgpO1xuICAgICAgaWYgKHRoaXMuZGlzcGxheS5hcHBseVRvUmdiYShpbWFnZURhdGEuZGF0YSkpIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEtlZXAgdGhlIHVuLXJlY29sb3JlZCBjb21wb3NpdGUgaWYgcmVhZGJhY2sgZmFpbHMg4oCUIGJ1dCBzYXkgd2h5LlxuICAgICAgY29uc29sZS53YXJuKCdbdml6OmV4cG9ydF0gY29tcG9zaXRlIHJlY29sb3IgcmVhZGJhY2sgZmFpbGVkIOKAlCBleHBvcnRpbmcgcmF3IHRpbGVzJywgZXJyKTtcbiAgICB9XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfV9jb21wb3NpdGUucG5nYCk7XG4gICAgfSwgJ2ltYWdlL3BuZycpO1xuICB9XG5cbiAgLyoqIFRydWUgaWYgYW55IHBpeGVsIGluIHRoZSBSR0JBIGJ1ZmZlciBpcyBub24tdHJhbnNwYXJlbnQuICovXG4gIHByaXZhdGUgaGFzT3BhcXVlKGQ6IFVpbnQ4Q2xhbXBlZEFycmF5KTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBpZiAoZFtpXSAhPT0gMCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUsIHNvIE9TRCBhbmQgUGxvdGx5IHN0YXkgaW4gbG9jay1zdGVwLiBPU0QgYXBwbGllcyB0aGVcbiAgLy8gY29sb3JtYXAgdG8gZ3JheXNjYWxlIHRpbGVzIHZpYSB0aGUgTFVUIHJlYWN0aXZlbHkgKHNlZSB0aGUgY29uc3RydWN0b3Inc1xuICAvLyBjb2xvcm1hcCBzdWJzY3JpcHRpb24pLCBub3QgaW4gc2V0Q29sb3JtYXAuXG5cbiAgLy8g4pSA4pSAIElWaXN1YWxpemVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9ybWFwU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY29sb3JtYXBTdWIgPSBudWxsO1xuICAgIC8vIERyb3AgYSBxdWV1ZWQgaW52YWxpZGF0aW9uIHNvIGl0IGNhbid0IGZpcmUgYWdhaW5zdCBhIHRvcm4tZG93biB2aWV3ZXIuXG4gICAgaWYgKHRoaXMuaW52YWxpZGF0ZUhhbmRsZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5pbnZhbGlkYXRlSGFuZGxlKTtcbiAgICAgIGVsc2UgY2xlYXJUaW1lb3V0KHRoaXMuaW52YWxpZGF0ZUhhbmRsZSBhcyB1bmtub3duIGFzIFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+KTtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUhhbmRsZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG59XG4iXX0=