@jax-data-science/sci-image-visualizer 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
  2. package/esm2022/lib/contracts/display-types.mjs +7 -1
  3. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  4. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  6. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
  7. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
  8. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
  9. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
  10. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
  11. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +4 -1
  12. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
  13. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
  14. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
  15. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
  16. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
  17. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
  18. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
  19. package/esm2022/lib/spatial/lod.mjs +6 -3
  20. package/esm2022/lib/spatial/spatial-controls.facade.mjs +8 -3
  21. package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
  22. package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
  23. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
  24. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +4 -3
  25. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
  26. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
  27. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
  28. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  29. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  30. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
  31. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
  32. package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
  33. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1064 -318
  34. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
  35. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
  36. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
  37. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  38. package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
  39. package/lib/contracts/display-types.d.ts +27 -0
  40. package/lib/contracts/image.contract.d.ts +2 -0
  41. package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
  42. package/lib/contracts/visualizer.contract.d.ts +3 -0
  43. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
  44. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
  45. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
  46. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
  47. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +2 -0
  48. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
  49. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
  50. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
  51. package/lib/spatial/lod.d.ts +3 -1
  52. package/lib/spatial/spatial-controls.facade.d.ts +3 -0
  53. package/lib/spatial/spatial-gene-filter.d.ts +44 -0
  54. package/lib/spatial/spatial-tile-merge.d.ts +17 -0
  55. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
  56. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
  57. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
  58. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
  59. package/lib/store/visualizer-store.service.d.ts +13 -0
  60. package/package.json +1 -1
  61. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs.map +0 -1
@@ -2,7 +2,7 @@ import { LruCache } from 'napari-js';
2
2
  import { ALL_GENES } from '../../../contracts/ports/spatial-data.port';
3
3
  import { tileId, tilesInRect, tilesInRectFrom, transcriptLevelFor } from '../../../spatial/lod';
4
4
  import { allGenesPlan, clipTranscripts, geneBinSize, groupTranscripts, groupedMarkerPx, quantileOf, transcriptMarkerPx, } from '../../../spatial/transcript-grouping';
5
- import { clusterMarkers, mergeTranscriptTiles } from '../../../spatial/spatial-tile-merge';
5
+ import { allGenesHidden, clusterMarkers, mergeTranscriptTiles } from '../../../spatial/spatial-tile-merge';
6
6
  /** The all-gene pyramid's finest bin (250 µm source tiles / 128) and default level count, used
7
7
  * to group a gene selection on the same ladder when a dataset has no pyramid. */
8
8
  const PYRAMID_BASE_BIN_UM = 250 / 128;
@@ -36,6 +36,8 @@ export class TranscriptJobPlanner {
36
36
  const mode = view.transcriptMode;
37
37
  if (mode !== 'circles' && mode !== 'glyphs')
38
38
  return null;
39
+ if (allGenesHidden(view))
40
+ return null;
39
41
  const geneBins = this.port.getTranscriptGeneBins && dataset.transcriptGeneBins;
40
42
  if (!this.port.getTranscriptTile && !geneBins)
41
43
  return null;
@@ -366,4 +368,4 @@ function clipWindow(rect) {
366
368
  function pxPerMicronOf(dataset, pxPerUnit) {
367
369
  return dataset.micronsPerUnit ? pxPerUnit / dataset.micronsPerUnit : undefined;
368
370
  }
369
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1qb2JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL3NwYXRpYWwtdGlsZXMvdHJhbnNjcmlwdC1qb2JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLFNBQVMsRUFBd0IsTUFBTSw0Q0FBNEMsQ0FBQztBQVE3RixPQUFPLEVBQVksTUFBTSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixVQUFVLEVBQ1Ysa0JBQWtCLEdBQ25CLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBSTNGO2tGQUNrRjtBQUNsRixNQUFNLG1CQUFtQixHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCOytDQUMrQztBQUMvQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUM7QUFDaEMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFDaEMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLCtFQUErRTtBQUMvRSxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQTBCL0I7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsWUFBNkIsSUFBcUI7UUFBckIsU0FBSSxHQUFKLElBQUksQ0FBaUI7UUFIbEQseURBQXlEO1FBQ3hDLGlCQUFZLEdBQUcsSUFBSSxRQUFRLENBQWdDLGtCQUFrQixDQUFDLENBQUM7SUFFM0MsQ0FB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QyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFVRCxTQUFTLFVBQVUsQ0FBQyxJQUFjO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE9BQU87UUFDTCxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEYsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7S0FDN0UsQ0FBQztBQUNKLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsU0FBUyxhQUFhLENBQUMsT0FBdUIsRUFBRSxTQUFpQjtJQUMvRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExydUNhY2hlIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgQUxMX0dFTkVTLCB0eXBlIFNwYXRpYWxEYXRhUG9ydCB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBTcGF0aWFsQm91bmRzLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbERlbnNpdHlSYXN0ZXIsXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbn0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBEYXRhUmVjdCwgdGlsZUlkLCB0aWxlc0luUmVjdCwgdGlsZXNJblJlY3RGcm9tLCB0cmFuc2NyaXB0TGV2ZWxGb3IgfSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL2xvZCc7XG5pbXBvcnQge1xuICBhbGxHZW5lc1BsYW4sXG4gIGNsaXBUcmFuc2NyaXB0cyxcbiAgZ2VuZUJpblNpemUsXG4gIGdyb3VwVHJhbnNjcmlwdHMsXG4gIGdyb3VwZWRNYXJrZXJQeCxcbiAgcXVhbnRpbGVPZixcbiAgdHJhbnNjcmlwdE1hcmtlclB4LFxufSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL3RyYW5zY3JpcHQtZ3JvdXBpbmcnO1xuaW1wb3J0IHsgY2x1c3Rlck1hcmtlcnMsIG1lcmdlVHJhbnNjcmlwdFRpbGVzIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGUtbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBQbGFuQ29udGV4dCB9IGZyb20gJy4vcGxhbi1jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVHJhbnNjcmlwdEJpbiwgVHJhbnNjcmlwdEtpbmQgfSBmcm9tICcuL3RyYW5zY3JpcHQtaG92ZXInO1xuXG4vKiogVGhlIGFsbC1nZW5lIHB5cmFtaWQncyBmaW5lc3QgYmluICgyNTAgwrVtIHNvdXJjZSB0aWxlcyAvIDEyOCkgYW5kIGRlZmF1bHQgbGV2ZWwgY291bnQsIHVzZWRcbiAqICB0byBncm91cCBhIGdlbmUgc2VsZWN0aW9uIG9uIHRoZSBzYW1lIGxhZGRlciB3aGVuIGEgZGF0YXNldCBoYXMgbm8gcHlyYW1pZC4gKi9cbmNvbnN0IFBZUkFNSURfQkFTRV9CSU5fVU0gPSAyNTAgLyAxMjg7XG5jb25zdCBQWVJBTUlEX0xFVkVMUyA9IDc7XG4vKiogVHJhbnNjcmlwdHMgZHJhd24gYXQgb25jZS4gUGFzdCB0aGlzIGEgc2NyZWVuIGlzIHNvbGlkIGNvbG91ciBhbnl3YXk7IHRoZSBsZXZlbFxuICogIHBvbGljeSBrZWVwcyBhIG5vcm1hbCB2aWV3IGZhciBiZWxvdyBpdC4gKi9cbmNvbnN0IE1BWF9UUkFOU0NSSVBUUyA9IDQwMF8wMDA7XG5jb25zdCBNQVhfVFJBTlNDUklQVF9USUxFUyA9IDM2O1xuY29uc3QgTUFYX0JJTl9USUxFUyA9IDY0O1xuLyoqIFN1bW1lZCBwZXItY2x1c3RlciBkZW5zaXR5IGdyaWRzIGtlcHQgKG9uZSBwZXIgY2x1c3RlciDDlyBiaW4gw5cgZGF0YXNldCkuICovXG5jb25zdCBERU5TSVRZX0NBQ0hFX1NJWkUgPSAyNTY7XG5cbi8qKiBBIHRyYW5zY3JpcHQgZmV0Y2ggdGhlIHBsYW5uZXIgY2FuIGtleSBiZWZvcmUgcnVubmluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdEpvYiB7XG4gIC8qKiBXaGF0IG9uZSBlbnRyeSBpcyDigJQgZGVjaWRlcyB3aGF0IGhvdmVyaW5nIGl0IHNheXMuICovXG4gIGtpbmQ6IFRyYW5zY3JpcHRLaW5kO1xuICAvKiogRm9yIGJpbnM6IHRoZWlyIHNpemUgYW5kIGdyaWQgb3JpZ2luLCBzbyBhIGhvdmVyZWQgYmluJ3Mgc3F1YXJlIGNhbiBiZSByZWNvdmVyZWQuICovXG4gIGJpbj86IFRyYW5zY3JpcHRCaW47XG4gIC8qKiBJZGVudGlmaWVzIHdoYXQgd2lsbCBiZSBkcmF3biwgc28gYW4gdW5jaGFuZ2VkIHBsYW4gaXMgYSBuby1vcC4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBGZXRjaCBhbmQgbWVyZ2U7IGBweGAgaXMgZWFjaCBlbnRyeSdzIG1hcmtlciBkaWFtZXRlciBpbiBzY3JlZW4gcGl4ZWxzLiBBIGpvYiBtYXlcbiAgICogIHN3aXRjaCB0byBhbm90aGVyIGtpbmQgb25jZSBpdCBzZWVzIHRoZSBkYXRhIChpbmRpdmlkdWFsIOKGkiBiaW5zKTsgaXQgdGhlbiBzYXlzIHNvLiAqL1xuICBsb2FkKGN0eDogUGxhbkNvbnRleHQpOiBQcm9taXNlPFRyYW5zY3JpcHRMb2FkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0TG9hZCB7XG4gIG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlO1xuICBweDogRmxvYXQzMkFycmF5O1xuICAvKiogRm9yIGEgZ2VuZSBzZWxlY3Rpb246IGdyb3VwIGl0IG9uIHRoaXMgYmluIGxhZGRlciBvbmNlIGhpZGRlbiBnZW5lcyBhcmUgZHJvcHBlZC4gKi9cbiAgbGFkZGVyPzogeyBiYXNlQmluOiBudW1iZXI7IGxldmVsczogbnVtYmVyOyBzdGFydDogbnVtYmVyIHwgbnVsbCB9O1xuICAvKiogQWxyZWFkeSBvbmUgbWFya2VyIHBlciBjbHVzdGVyIHBlciBiaW4gKHpvb21lZCBvdXQsIGZyb20gdGhlIGRlbnNpdHkgZ3JpZHMpOiBubyBjZWxscy4gKi9cbiAgY2x1c3RlcmVkPzogeyBncm91cDogSW50MzJBcnJheTsgbmFtZXM6IHN0cmluZ1tdOyBnZW5lczogc3RyaW5nW11bXTsgYmluOiBudW1iZXI7IG9yaWdpbjogW251bWJlciwgbnVtYmVyXSB9O1xuICBraW5kPzogVHJhbnNjcmlwdEpvYlsna2luZCddO1xuICBiaW4/OiBUcmFuc2NyaXB0Sm9iWydiaW4nXTtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoaWNoIHRyYW5zY3JpcHRzIHRoZSAyRCBzcGF0aWFsIHZpZXcgZmV0Y2hlcywgYXQgd2hpY2ggbGV2ZWwsIGZvciB0aGUgY3VycmVudFxuICogY2FtZXJhIGFuZCBzZWxlY3Rpb246IGEge0BsaW5rIFRyYW5zY3JpcHRKb2J9IHRoYXQgY2FuIGJlIGtleWVkIGJlZm9yZSBpdCBydW5zIChzbyBhblxuICogdW5jaGFuZ2VkIHBsYW4gaXMgYSBuby1vcCkgYW5kIHRoYXQgZmV0Y2hlcyBhbmQgbWVyZ2VzIHdoZW4gcnVuLlxuICpcbiAqIFB1cmUgYXBhcnQgZnJvbSB0aGUgcG9ydCwgc28gdGhlIGxldmVsIHBvbGljeSBpcyB0ZXN0YWJsZSB3aXRob3V0IGEgdmlld2VyLiBPd25zIHRoZVxuICogY2FjaGUgb2Ygc3VtbWVkIHBlci1jbHVzdGVyIGRlbnNpdHkgZ3JpZHMgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uIGlzIGRyYXduIGZyb20uXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2NyaXB0Sm9iUGxhbm5lciB7XG4gIC8qKiBTdW1tZWQgcGVyLWNsdXN0ZXIgZGVuc2l0eSBncmlkcyAoc2VlIGRlbnNpdHlGb3IpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbnNpdHlDYWNoZSA9IG5ldyBMcnVDYWNoZTxQcm9taXNlPFNwYXRpYWxEZW5zaXR5UmFzdGVyPj4oREVOU0lUWV9DQUNIRV9TSVpFKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBvcnQ6IFNwYXRpYWxEYXRhUG9ydCkge31cblxuICAvKipcbiAgICogVGhlIGpvYiB0aGF0IGRyYXdzIHRoZSB2aWV3J3MgdHJhbnNjcmlwdHMgYXMgbWFya2VycyAoY2lyY2xlcyBvciBpY29ucyksIG9yIG51bGwgd2hlbiB0aGVcbiAgICogdmlldyBkcmF3cyBub25lIG9yIHRoZSBwb3J0IGNhbm5vdCBzZXJ2ZSB0aGVtLlxuICAgKi9cbiAgam9iRm9yKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcmVjdDogRGF0YVJlY3QsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IFRyYW5zY3JpcHRKb2IgfCBudWxsIHtcbiAgICBjb25zdCBtb2RlID0gdmlldy50cmFuc2NyaXB0TW9kZTtcbiAgICBpZiAobW9kZSAhPT0gJ2NpcmNsZXMnICYmIG1vZGUgIT09ICdnbHlwaHMnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBnZW5lQmlucyA9IHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0R2VuZUJpbnMgJiYgZGF0YXNldC50cmFuc2NyaXB0R2VuZUJpbnM7XG4gICAgaWYgKCF0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFRpbGUgJiYgIWdlbmVCaW5zKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdmlldy50cmFuc2NyaXB0QWxsR2VuZXNcbiAgICAgID8gdGhpcy5hbGxHZW5lc0pvYihkYXRhc2V0LCB2aWV3LCByZWN0LCBweFBlclVuaXQpXG4gICAgICA6IHRoaXMuZ2VuZUpvYihkYXRhc2V0LCB2aWV3LCByZWN0LCBweFBlclVuaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjaG9zZW4gZ2VuZXMsIGF0IHRoZSBsZXZlbCB0aGUgem9vbSBjYWxscyBmb3Ig4oCUIG9yIGNvYXJzZXIsIHdoaWxlIHRoZSBtYXJrZXJzIGluXG4gICAqIHZpZXcgd291bGQgZXhjZWVkIHRoZSBidWRnZXQuXG4gICAqL1xuICBwcml2YXRlIGdlbmVKb2IoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICByZWN0OiBEYXRhUmVjdCxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgKTogVHJhbnNjcmlwdEpvYiB8IG51bGwge1xuICAgIGNvbnN0IG1ldGEgPSBkYXRhc2V0LnRyYW5zY3JpcHRUaWxlcztcbiAgICBjb25zdCBnZW5lcyA9IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICAgIGlmICghbWV0YSB8fCAhZ2VuZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBmaXJzdCA9IHRyYW5zY3JpcHRMZXZlbEZvcihweFBlclVuaXQsIG1ldGEubGV2ZWxzKTtcbiAgICBjb25zdCBrZXlzQXQgPSAobDogbnVtYmVyKSA9PiB0aWxlc0luUmVjdChyZWN0LCBsLCBtZXRhLmxldmVscywgbWV0YS5ib3VuZHMsIE1BWF9UUkFOU0NSSVBUX1RJTEVTKTtcbiAgICBjb25zdCBxdWVyeSA9IHsgZ2VuZXMsIHF1YWxpdHk6IHZpZXcudHJhbnNjcmlwdFF1YWxpdHkgfTtcbiAgICBjb25zdCBweFBlck1pY3JvbiA9IHB4UGVyTWljcm9uT2YoZGF0YXNldCwgcHhQZXJVbml0KTtcbiAgICBjb25zdCBjbGlwID0gY2xpcFdpbmRvdyhyZWN0KTtcbiAgICAvLyBab29tZWQgb3V0LCBlYWNoIGdlbmUncyB0cmFuc2NyaXB0cyBhcmUgZ3JvdXBlZCBvbiB0aGUgYWxsLWdlbmUgcHlyYW1pZCdzIGJpbiBsYWRkZXIsXG4gICAgLy8gc28gYSBnZW5lIHNlbGVjdGlvbiByZWFkcyBsaWtlIFwiYWxsIGdlbmVzXCIgZG9lczogb25lIG1hcmtlciBwZXIgZ2VuZSBwZXIgYXJlYSwgc2l6ZWRcbiAgICAvLyBieSBob3cgbWFueSBpdCBob2xkczsgem9vbWVkIGluIGZhciBlbm91Z2gsIGV2ZXJ5IHRyYW5zY3JpcHQgaXMgaXRzIG93biBtYXJrZXIuXG4gICAgY29uc3QgbGFkZGVyID0gZGF0YXNldC50cmFuc2NyaXB0Qmlucz8ubGV2ZWxzO1xuICAgIGNvbnN0IGJhc2VCaW4gPVxuICAgICAgbGFkZGVyPy5bMF0/LmJpblNpemUgPz8gKGRhdGFzZXQubWljcm9uc1BlclVuaXQgPyBQWVJBTUlEX0JBU0VfQklOX1VNIC8gZGF0YXNldC5taWNyb25zUGVyVW5pdCA6IDApO1xuICAgIGNvbnN0IGJpbiA9IGdlbmVCaW5TaXplKHB4UGVyVW5pdCwgYmFzZUJpbiwgbGFkZGVyPy5sZW5ndGggPz8gUFlSQU1JRF9MRVZFTFMpO1xuICAgIC8vIFpvb21lZCBvdXQgdG8gYmlucyBhcyB3aWRlIGFzIHRoZSBkZW5zaXR5IGdyaWQsIGEgc2VsZWN0aW9uIGlzIGRyYXduIGZyb20gdGhlIHBlci1nZW5lXG4gICAgLy8gZGVuc2l0eSBncmlkcyDigJQgb25lIGNhY2hlZCByZXF1ZXN0IHBlciBjbHVzdGVyIOKAlCByYXRoZXIgdGhhbiAxMHgncyBjb2Fyc2UgcGVyLWdlbmVcbiAgICAvLyB0aWxlcywgd2hpY2ggdGFrZSBtaW51dGVzIGZvciBhIGZldyBodW5kcmVkIGdlbmVzLlxuICAgIC8vIFdpdGggdGhlIHB5cmFtaWQncyBwZXItZ2VuZSBsZXZlbHMsIGV2ZXJ5IHpvb20gb2YgYSBzZWxlY3Rpb24gcmVhZHMgdGhlbTogdGhlIGxldmVsIHRoZVxuICAgIC8vIHpvb20gY2FsbHMgZm9yLCBjb2Fyc2VyIHdoaWxlIHRoZSBtYXJrZXJzIHdvdWxkIGV4Y2VlZCB0aGUgbWF4LlxuICAgIC8vIEJvdGggYXJlIGJ1aWx0IGZyb20gaGlnaC1xdWFsaXR5IGNhbGxzIG9ubHk6IHdpdGggbG93LXF1YWxpdHkgY2FsbHMgaW5jbHVkZWQsIHRoZVxuICAgIC8vIHF1YWxpdHktYXdhcmUgdGlsZXMgYmVsb3cgc2VydmUgZXZlcnkgem9vbSAoYXMgbG9uZyBhcyB0aGVyZSBhcmUgdGlsZXMgdG8gc2VydmUpLlxuICAgIGNvbnN0IGhpZ2hPbmx5ID0gdmlldy50cmFuc2NyaXB0UXVhbGl0eSAhPT0gJ2FsbCcgfHwgIXRoaXMucG9ydC5nZXRUcmFuc2NyaXB0VGlsZTtcbiAgICBjb25zdCBnZW5lQmlucyA9IGRhdGFzZXQudHJhbnNjcmlwdEdlbmVCaW5zO1xuICAgIGNvbnN0IGZyb21HZW5lQmlucyA9IGhpZ2hPbmx5ICYmIGdlbmVCaW5zICYmIHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0R2VuZUJpbnM7XG4gICAgaWYgKGZyb21HZW5lQmlucyAmJiAoYmluICE9PSBudWxsIHx8ICF0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFRpbGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lQmluc0pvYihkYXRhc2V0LCB2aWV3LCBjbGlwLCBnZW5lQmlucywgYmluID8/IGdlbmVCaW5zLmxldmVsc1swXS5iaW5TaXplKTtcbiAgICB9XG4gICAgY29uc3QgZ3JpZCA9IGRhdGFzZXQuZGVuc2l0eT8uZ3JpZFNpemVbMF0gPz8gMDtcbiAgICBpZiAoaGlnaE9ubHkgJiYgYmluICE9PSBudWxsICYmIGdyaWQgPiAwICYmIHRoaXMucG9ydC5nZXREZW5zaXR5ICYmIGJpbiA+PSBncmlkICogMC43NSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2x1c3RlckRlbnNpdHlKb2IoZGF0YXNldCwgdmlldywgY2xpcCwgcHhQZXJVbml0LCBNYXRoLm1heChiaW4sIGdyaWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdnZW5lcycsXG4gICAgICAvLyBUaGUgY2xpcCB3aW5kb3csIGluIHF1YXJ0ZXItdmlldyBzdGVwczogYSBwYW4gcGFzdCB0aGUgbWFyZ2luIHJlLWNsaXBzLlxuICAgICAga2V5OlxuICAgICAgICBgZ2VuZXN8JHtnZW5lcy5qb2luKCcsJyl9fCR7dmlldy50cmFuc2NyaXB0UXVhbGl0eX18JHt2aWV3LnRyYW5zY3JpcHRCdWRnZXR9fCR7YmluID8/ICdlYWNoJ318YCArXG4gICAgICAgIGAke2NsaXAua2V5fXwke2tleXNBdChmaXJzdCkubWFwKHRpbGVJZCl9YCxcbiAgICAgIGxvYWQ6IGFzeW5jIChjdHgpID0+IHtcbiAgICAgICAgLy8gVGhlIHpvb20ncyBvd24gbGV2ZWwgb25seTogb3ZlciB0aGUgYnVkZ2V0LCB0aGUgdHJhbnNjcmlwdHMgYXJlIGNvbWJpbmVkIGludG9cbiAgICAgICAgLy8gbGFyZ2VyIG1hcmtlcnMgKGdyb3VwU2VsZWN0aW9uKSwgbmV2ZXIgZmV0Y2hlZCBmcm9tIHNsb3dlciBjb2Fyc2UgbGV2ZWxzLlxuICAgICAgICBjb25zdCB0aWxlcyA9IGF3YWl0IGN0eC5mZXRjaEFsbChrZXlzQXQoZmlyc3QpLCAoaykgPT5cbiAgICAgICAgICB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFRpbGUhKGsubGV2ZWwsIGsuZ3gsIGsuZ3ksIHF1ZXJ5KSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gT25seSB3aGF0IGlzIG9uIHNjcmVlbiAoYW5kIGEgbWFyZ2luLCBzbyBhIHNtYWxsIHBhbiBuZWVkcyBub3RoaW5nIG5ldykgY291bnRzXG4gICAgICAgIC8vIGFnYWluc3QgdGhlIGJ1ZGdldCBhbmQgdGhlIGNhcDsgYSB0aWxlIHJlYWNoZXMgZmFyIHBhc3QgdGhlIHZpZXcuXG4gICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVHJhbnNjcmlwdFRpbGVzKFxuICAgICAgICAgIHRpbGVzLm1hcCgodCkgPT4gY2xpcFRyYW5zY3JpcHRzKHQsIGNsaXAuYXJvdW5kKSksXG4gICAgICAgICAgTUFYX1RSQU5TQ1JJUFRTLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBweCA9IEZsb2F0MzJBcnJheS5mcm9tKG1lcmdlZC53ZWlnaHQsICh3KSA9PlxuICAgICAgICAgIHRyYW5zY3JpcHRNYXJrZXJQeCh3LCB2aWV3LnRyYW5zY3JpcHRTY2FsZSwgcHhQZXJNaWNyb24pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYmFzZUJpbiA+IDBcbiAgICAgICAgICA/IHsgbWVyZ2VkLCBweCwgbGFkZGVyOiB7IGJhc2VCaW4sIGxldmVsczogbGFkZGVyPy5sZW5ndGggPz8gUFlSQU1JRF9MRVZFTFMsIHN0YXJ0OiBiaW4gfSB9XG4gICAgICAgICAgOiB7IG1lcmdlZCwgcHggfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGdlbmUgc2VsZWN0aW9uIGZyb20gdGhlIHB5cmFtaWQncyBwZXItZ2VuZSBsZXZlbHM6IHN0YXJ0aW5nIGF0IHRoZSBsZXZlbCB3aG9zZSBiaW5zIGFyZVxuICAgKiBgc3RhcnRCaW5gLCBmZXRjaCB0aGUgdmlldydzIHRpbGVzIGZvciB0aGUgc2VsZWN0ZWQgZ2VuZXMgYW5kIHN0ZXAgdG8gYSBjb2Fyc2VyIGxldmVsIHdoaWxlXG4gICAqIG9uZSBtYXJrZXIgcGVyIGNsdXN0ZXIgcGVyIGJpbiB3b3VsZCBleGNlZWQgdGhlIG1heC4gSGlkZGVuIGdlbmVzIGFyZSBmZXRjaGVkIHRvbyAodGhlaXJcbiAgICogY291bnRzIGluIHZpZXcgc3RpbGwgc2hvdykgYW5kIGRyb3BwZWQgYmVmb3JlIGRyYXdpbmc7IGdyb3VwaW5nIGJ5IGNsdXN0ZXIgaGFwcGVucyB0aGVyZS5cbiAgICovXG4gIHByaXZhdGUgZ2VuZUJpbnNKb2IoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBjbGlwOiBDbGlwV2luZG93LFxuICAgIG1ldGE6IE5vbk51bGxhYmxlPFNwYXRpYWxEYXRhc2V0Wyd0cmFuc2NyaXB0R2VuZUJpbnMnXT4sXG4gICAgc3RhcnRCaW46IG51bWJlcixcbiAgKTogVHJhbnNjcmlwdEpvYiB7XG4gICAgY29uc3QgZ2VuZXMgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcztcbiAgICBjb25zdCBsZXZlbHMgPSBtZXRhLmxldmVscztcbiAgICBsZXQgZmlyc3QgPSBsZXZlbHMuZmluZEluZGV4KChsKSA9PiBsLmJpblNpemUgPj0gc3RhcnRCaW4gKiAwLjk5OSk7XG4gICAgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBsZXZlbHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBidWRnZXQgPSBNYXRoLm1heCgxLCB2aWV3LnRyYW5zY3JpcHRCdWRnZXQpO1xuICAgIGNvbnN0IGhpZGRlbiA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICAgIGNvbnN0IGNsdXN0ZXJzID0gdGhpcy5zZWxlY3Rpb25DbHVzdGVycyh2aWV3KTtcbiAgICBjb25zdCBjbHVzdGVyT2YgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgIGNsdXN0ZXJzLmZvckVhY2goKGMsIGNpKSA9PiBjLmdlbmVzLmZvckVhY2goKGcpID0+IGNsdXN0ZXJPZi5zZXQoZ2VuZXMuaW5kZXhPZihnKSwgY2kpKSk7XG4gICAgY29uc3Qga2V5c0F0ID0gKG06IG51bWJlcikgPT5cbiAgICAgIHRpbGVzSW5SZWN0RnJvbShcbiAgICAgICAgbWV0YS5vcmlnaW4sXG4gICAgICAgIGNsaXAuYXJvdW5kLFxuICAgICAgICBtLFxuICAgICAgICBsZXZlbHMubWFwKChsKSA9PiAoeyB0aWxlU2l6ZTogbC50aWxlU2l6ZSB9KSksXG4gICAgICAgIG51bGwsXG4gICAgICAgIE1BWF9CSU5fVElMRVMsXG4gICAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnZ2VuZXMnLFxuICAgICAga2V5OlxuICAgICAgICBgZ2VuZS1iaW5zfCR7Z2VuZXMuam9pbignLCcpfXwke2J1ZGdldH18JHtmaXJzdH18JHtKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzKX18YCArIGNsaXAua2V5LFxuICAgICAgbG9hZDogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICBsZXQgbSA9IGZpcnN0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgY29uc3QgdGlsZXMgPSBhd2FpdCBjdHguZmV0Y2hBbGwoa2V5c0F0KG0pLCAoaykgPT5cbiAgICAgICAgICAgIHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0R2VuZUJpbnMhKGsubGV2ZWwsIGsuZ3gsIGsuZ3ksIGdlbmVzKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsaXBwZWQgPSB0aWxlcy5tYXAoKHQpID0+IGNsaXBUcmFuc2NyaXB0cyh0LCBjbGlwLmFyb3VuZCkpO1xuICAgICAgICAgIC8vIFBhc3QgdGhlIGNhcCBhIG1lcmdlIHdvdWxkIGRyb3Agd2hvbGUgZ2VuZXMgKHRoZSB0YWlsIG9mIGV2ZXJ5IHRpbGUpOiBnbyBjb2Fyc2VyLlxuICAgICAgICAgIGlmIChjbGlwcGVkLnJlZHVjZSgobiwgdCkgPT4gbiArIHQuY291bnQsIDApID4gTUFYX1RSQU5TQ1JJUFRTICYmIG0gPCBsZXZlbHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgbSsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVHJhbnNjcmlwdFRpbGVzKGNsaXBwZWQsIE1BWF9UUkFOU0NSSVBUUyk7XG4gICAgICAgICAgLy8gTWFya2VycyB0aGlzIGxldmVsIHdvdWxkIGRyYXc6IG9uZSBwZXIgKHZpc2libGUgY2x1c3RlciwgYmluKS5cbiAgICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgY29uc3QgYmluID0gbGV2ZWxzW21dLmJpblNpemU7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXJnZWQuY291bnQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKGhpZGRlbi5oYXMoZ2VuZXNbbWVyZ2VkLmdlbmVbaV1dKSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBjID0gY2x1c3Rlck9mLmdldChtZXJnZWQuZ2VuZVtpXSk7XG4gICAgICAgICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNlZW4uYWRkKGAke2N9fCR7TWF0aC5mbG9vcihtZXJnZWQueFtpXSAvIGJpbil9fCR7TWF0aC5mbG9vcihtZXJnZWQueVtpXSAvIGJpbil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWVuLnNpemUgPD0gYnVkZ2V0IHx8IG0gPj0gbGV2ZWxzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1lcmdlZCwgcHg6IG5ldyBGbG9hdDMyQXJyYXkobWVyZ2VkLmNvdW50KSwgbGFkZGVyOiB7IGJhc2VCaW46IGJpbiwgbGV2ZWxzOiAxLCBzdGFydDogYmluIH0gfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbSsrO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHNlbGVjdGlvbidzIGNsdXN0ZXJzOiBlYWNoIGdlbmUtdHJlZSBncm91cCdzIHZpc2libGUgZ2VuZXMsIHRoZW4gZWFjaCB1bmdyb3VwZWQgZ2VuZS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3Rpb25DbHVzdGVycyh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiBzdHJpbmdbXTsgc2xvdDogbnVtYmVyIH1bXSB7XG4gICAgY29uc3QgaGlkZGVuID0gbmV3IFNldCh2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcyk7XG4gICAgY29uc3Qgc2xvdHMgPSBuZXcgTWFwKHZpZXcudHJhbnNjcmlwdEdlbmVzLm1hcCgoZywgaSkgPT4gW2csIGldKSk7XG4gICAgY29uc3QgdGFrZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBvdXQ6IHsgbmFtZTogc3RyaW5nOyBnZW5lczogc3RyaW5nW107IHNsb3Q6IG51bWJlciB9W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGcgb2Ygdmlldy50cmFuc2NyaXB0R2VuZUdyb3Vwcykge1xuICAgICAgY29uc3QgZ2VuZXMgPSBnLmdlbmVzLmZpbHRlcigoeCkgPT4gc2xvdHMuaGFzKHgpICYmICFoaWRkZW4uaGFzKHgpICYmICF0YWtlbi5oYXMoeCkpO1xuICAgICAgZ2VuZXMuZm9yRWFjaCgoeCkgPT4gdGFrZW4uYWRkKHgpKTtcbiAgICAgIGlmIChnZW5lcy5sZW5ndGgpIG91dC5wdXNoKHsgbmFtZTogZy5uYW1lLCBnZW5lcywgc2xvdDogc2xvdHMuZ2V0KGdlbmVzWzBdKSEgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZ2VuZSBvZiB2aWV3LnRyYW5zY3JpcHRHZW5lcykge1xuICAgICAgaWYgKCF0YWtlbi5oYXMoZ2VuZSkgJiYgIWhpZGRlbi5oYXMoZ2VuZSkpIG91dC5wdXNoKHsgbmFtZTogZ2VuZSwgZ2VuZXM6IFtnZW5lXSwgc2xvdDogc2xvdHMuZ2V0KGdlbmUpISB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItZ2VuZSBkZW5zaXR5IGdyaWRzIHN1bW1lZCBmb3IgYGdlbmVzYCwgY2FjaGVkIChhIGNsdXN0ZXIgaXMgYXNrZWQgZm9yIG9uY2UgcGVyIGJpbikuXG4gICAqIEtleWVkIGJ5IGRhdGFzZXQgdG9vOiB0aGlzIG1hbmFnZXIgb3V0bGl2ZXMgYSBkYXRhc2V0LCBhbmQgYW5vdGhlciBtYXkgc2hhcmUgZ2VuZSBuYW1lcy5cbiAgICogTGVhc3QtcmVjZW50bHktVVNFRCBldmljdGlvbiwgc28gdGhlIGNsdXN0ZXJzIGluIHZpZXcgc3RheSBjYWNoZWQ7IGEgZmFpbGVkIHJlcXVlc3QgaXNcbiAgICogZHJvcHBlZCBzbyB0aGUgbmV4dCBwbGFuIGFza3MgYWdhaW4uXG4gICAqL1xuICBwcml2YXRlIGRlbnNpdHlGb3IoZGF0YXNldDogc3RyaW5nLCBnZW5lczogc3RyaW5nW10sIGJpbjogbnVtYmVyKTogUHJvbWlzZTxTcGF0aWFsRGVuc2l0eVJhc3Rlcj4ge1xuICAgIGNvbnN0IGtleSA9IGAke2RhdGFzZXR9fCR7YmlufXwke2dlbmVzLmpvaW4oJywnKX1gO1xuICAgIGxldCBwID0gdGhpcy5kZW5zaXR5Q2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKCFwKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wb3J0LmdldERlbnNpdHkhKGdlbmVzLCBiaW4pO1xuICAgICAgcmVxdWVzdC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRlbnNpdHlDYWNoZS5nZXQoa2V5KSA9PT0gcmVxdWVzdCkgdGhpcy5kZW5zaXR5Q2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVuc2l0eUNhY2hlLnNldChrZXksIHJlcXVlc3QpO1xuICAgICAgcCA9IHJlcXVlc3Q7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZ2VuZSBzZWxlY3Rpb24gem9vbWVkIG91dDogb25lIG1hcmtlciBwZXIgY2x1c3RlciBwZXIgYmluLCBmcm9tIHRoZSBwZXItZ2VuZSBkZW5zaXR5XG4gICAqIGdyaWRzLiBUaGUgYmluIHN0YXJ0cyB3aGVyZSBtYXJrZXJzIGFyZSAxNCBweCBhcGFydCBhbmQgZG91YmxlcyB1bnRpbCB0aGUgbWFya2VycyBmaXQgdGhlXG4gICAqIG1heDsgZWFjaCBtYXJrZXIgc2l0cyBhdCB0aGUgY291bnQtd2VpZ2h0ZWQgY2VudHJlIG9mIHRoZSBmaW5lciBncmlkIGluc2lkZSBpdCwgc28gbWFya2Vyc1xuICAgKiBmb2xsb3cgdGhlIHRpc3N1ZSByYXRoZXIgdGhhbiBhIGxhdHRpY2UuXG4gICAqL1xuICBwcml2YXRlIGNsdXN0ZXJEZW5zaXR5Sm9iKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgY2xpcDogQ2xpcFdpbmRvdyxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgICBzdGFydEJpbjogbnVtYmVyLFxuICApOiBUcmFuc2NyaXB0Sm9iIHtcbiAgICBjb25zdCBncmlkID0gZGF0YXNldC5kZW5zaXR5IS5ncmlkU2l6ZVswXTtcbiAgICBjb25zdCBjbHVzdGVycyA9IHRoaXMuc2VsZWN0aW9uQ2x1c3RlcnModmlldyk7XG4gICAgbGV0IGZpcnN0ID0gZ3JpZDtcbiAgICB3aGlsZSAoZmlyc3QgPCBzdGFydEJpbiAqIDAuOTk5KSBmaXJzdCAqPSAyO1xuICAgIGNvbnN0IGJ1ZGdldCA9IE1hdGgubWF4KDEsIHZpZXcudHJhbnNjcmlwdEJ1ZGdldCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdnZW5lcycsXG4gICAgICBrZXk6XG4gICAgICAgIGBjbHVzdGVyc3wke2NsdXN0ZXJzLm1hcCgoYykgPT4gYCR7Yy5uYW1lfToke2MuZ2VuZXMuam9pbignKycpfWApLmpvaW4oJzsnKX18JHtidWRnZXR9fCR7Zmlyc3R9fGAgK1xuICAgICAgICBjbGlwLmtleSxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGJpbiA9IGZpcnN0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgLy8gVGhlIGZpbmVyIGdyaWQgZ2l2ZXMgZWFjaCBtYXJrZXIgaXRzIGNlbnRyZTsgdGhlIHNlcnZlciBiaW5zIDEsIDIsIDQgb3IgOCBjZWxscy5cbiAgICAgICAgICBjb25zdCBmaW5lID0gTWF0aC5taW4oYmluID49IGdyaWQgKiAyID8gYmluIC8gMiA6IGJpbiwgZ3JpZCAqIDgpO1xuICAgICAgICAgIGNvbnN0IHJhc3RlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChjbHVzdGVycy5tYXAoKGMpID0+IHRoaXMuZGVuc2l0eUZvcihkYXRhc2V0LmlkLCBjLmdlbmVzLCBmaW5lKSkpO1xuICAgICAgICAgIGNvbnN0IG91dCA9IGNsdXN0ZXJNYXJrZXJzKFxuICAgICAgICAgICAgcmFzdGVycyxcbiAgICAgICAgICAgIGNsdXN0ZXJzLm1hcCgoYykgPT4gYy5zbG90KSxcbiAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgIGNsaXAuYXJvdW5kLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG91dC50aWxlLmNvdW50IDw9IGJ1ZGdldCB8fCBiaW4gPj0gZ3JpZCAqIDIgKiogMTIpIHtcbiAgICAgICAgICAgIGNvbnN0IHB4ID0gZ3JvdXBlZFNpemVzKG91dC50aWxlLndlaWdodCwgYmluICogcHhQZXJVbml0LCB2aWV3LnRyYW5zY3JpcHRTY2FsZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXJnZWQ6IG91dC50aWxlLFxuICAgICAgICAgICAgICBweCxcbiAgICAgICAgICAgICAga2luZDogJ2dlbmVzJyxcbiAgICAgICAgICAgICAgY2x1c3RlcmVkOiB7XG4gICAgICAgICAgICAgICAgZ3JvdXA6IG91dC5ncm91cCxcbiAgICAgICAgICAgICAgICBuYW1lczogY2x1c3RlcnMubWFwKChjKSA9PiBjLm5hbWUpLFxuICAgICAgICAgICAgICAgIGdlbmVzOiBjbHVzdGVycy5tYXAoKGMpID0+IGMuZ2VuZXMpLFxuICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICBvcmlnaW46IHJhc3RlcnNbMF0/Lm1ldGEub3JpZ2luID8/IFswLCAwXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGJpbiAqPSAyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgZ2VuZTogdGhlIHRyYW5zY3JpcHRzIHRoZW1zZWx2ZXMgb25jZSB0aGV5IGZpdCB0aGUgYnVkZ2V0LCBlbHNlIGJpbnMgb2YgdGhlXG4gICAqIGFsbC1nZW5lIHB5cmFtaWQgc2l6ZWQgYnkgaG93IG1hbnkgdHJhbnNjcmlwdHMgZWFjaCBob2xkcy5cbiAgICovXG4gIHByaXZhdGUgYWxsR2VuZXNKb2IoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICByZWN0OiBEYXRhUmVjdCxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgKTogVHJhbnNjcmlwdEpvYiB8IG51bGwge1xuICAgIGNvbnN0IGJpbnMgPSBkYXRhc2V0LnRyYW5zY3JpcHRCaW5zO1xuICAgIGNvbnN0IHRpbGVzID0gZGF0YXNldC50cmFuc2NyaXB0VGlsZXM7XG4gICAgY29uc3QgYm91bmRzID0gYmlucz8uYm91bmRzID8/IHRpbGVzPy5ib3VuZHM7XG4gICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHBsYW4gPSBhbGxHZW5lc1BsYW4oe1xuICAgICAgcmVjdCxcbiAgICAgIGJvdW5kcyxcbiAgICAgIHB4UGVyVW5pdCxcbiAgICAgIGJ1ZGdldDogdmlldy50cmFuc2NyaXB0QnVkZ2V0LFxuICAgICAgdG90YWw6IGJpbnM/LmNvdW50ID8/IHRpbGVzPy5jb3VudCA/PyAwLFxuICAgICAgbGV2ZWxzOiBiaW5zICYmIHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0QmlucyA/IGJpbnMubGV2ZWxzIDogW10sXG4gICAgICBjYW5JbmRpdmlkdWFsOiAhIXRpbGVzLFxuICAgIH0pO1xuXG4gICAgaWYgKHBsYW4ua2luZCA9PT0gJ2luZGl2aWR1YWwnICYmIHRpbGVzKSB7XG4gICAgICBjb25zdCBrZXlzID0gdGlsZXNJblJlY3QocmVjdCwgMCwgdGlsZXMubGV2ZWxzLCB0aWxlcy5ib3VuZHMsIE1BWF9UUkFOU0NSSVBUX1RJTEVTKTtcbiAgICAgIC8vIEVhY2ggdGlsZSBjbGlwcGVkIHRvIHRoZSB2aWV3LCByb3VuZGVkIG91dHdhcmQgdG8gMTAgdW5pdHMgc28gc21hbGwgcGFucyBoaXQgY2FjaGUuXG4gICAgICBjb25zdCByMTAgPSAodjogbnVtYmVyLCB1cDogYm9vbGVhbikgPT4gKHVwID8gTWF0aC5jZWlsKHYgLyAxMCkgOiBNYXRoLmZsb29yKHYgLyAxMCkpICogMTA7XG4gICAgICBjb25zdCBzaXplID0gdGlsZXMubGV2ZWxzWzBdLnRpbGVTaXplO1xuICAgICAgY29uc3QgYm94ZXMgPSBrZXlzLm1hcCgoayk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IFtcbiAgICAgICAgTWF0aC5tYXgoay5neCAqIHNpemUsIHIxMChyZWN0LngwLCBmYWxzZSkpLFxuICAgICAgICBNYXRoLm1heChrLmd5ICogc2l6ZSwgcjEwKHJlY3QueTAsIGZhbHNlKSksXG4gICAgICAgIE1hdGgubWluKChrLmd4ICsgMSkgKiBzaXplLCByMTAocmVjdC54MSwgdHJ1ZSkpLFxuICAgICAgICBNYXRoLm1pbigoay5neSArIDEpICogc2l6ZSwgcjEwKHJlY3QueTEsIHRydWUpKSxcbiAgICAgIF0pO1xuICAgICAgY29uc3QgcHhQZXJNaWNyb24gPSBweFBlck1pY3Jvbk9mKGRhdGFzZXQsIHB4UGVyVW5pdCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnaW5kaXZpZHVhbCcsXG4gICAgICAgIGtleTogYGFsbHxpbmRpdmlkdWFsfCR7dmlldy50cmFuc2NyaXB0QnVkZ2V0fXwke2JveGVzLm1hcCgoYikgPT4gYi5qb2luKCcsJykpLmpvaW4oJzsnKX1gLFxuICAgICAgICBsb2FkOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgICAgY29uc3QgZ290ID0gYXdhaXQgY3R4LmZldGNoQWxsKFxuICAgICAgICAgICAga2V5cy5tYXAoKGssIGkpID0+ICh7IC4uLmssIGJveDogYm94ZXNbaV0gfSkpLFxuICAgICAgICAgICAgKGspID0+IHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0VGlsZSEoMCwgay5neCwgay5neSwgeyBnZW5lczogW0FMTF9HRU5FU10sIGJveDogay5ib3ggfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBUaGUgcGxhbiBlc3RpbWF0ZWQgdGhlIHZpZXcgZnJvbSB0aGUgZGF0YXNldCdzIGF2ZXJhZ2UgZGVuc2l0eTsgZXhwcmVzc2lvbiBpc1xuICAgICAgICAgIC8vIHVuZXZlbiwgc28gYSBkZW5zZSB2aWV3IGNhbiBob2xkIGZhciBtb3JlLiBSYXRoZXIgdGhhbiBjdXQgdGhlIGV4Y2VzcyBvZmYsIHNob3dcbiAgICAgICAgICAvLyBpdCBncm91cGVkIOKAlCB0aGUgYmluIGxldmVsIHRoZSBwbGFubmVyIHdvdWxkIHBpY2sgaWYgaXQgaGFkIGtub3duLlxuICAgICAgICAgIGNvbnN0IGNhcCA9IE1hdGgubWF4KHZpZXcudHJhbnNjcmlwdEJ1ZGdldCAqIDEuNSwgMSk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkID0gZ290LnJlZHVjZSgobiwgdCkgPT4gbiArIHQuY291bnQsIDApO1xuICAgICAgICAgIGlmIChsb2FkZWQgPiBjYXAgJiYgYmlucyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEJpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrID0gYWxsR2VuZXNQbGFuKHtcbiAgICAgICAgICAgICAgcmVjdCxcbiAgICAgICAgICAgICAgYm91bmRzLFxuICAgICAgICAgICAgICBweFBlclVuaXQsXG4gICAgICAgICAgICAgIGJ1ZGdldDogdmlldy50cmFuc2NyaXB0QnVkZ2V0LFxuICAgICAgICAgICAgICB0b3RhbDogYmlucy5jb3VudCxcbiAgICAgICAgICAgICAgbGV2ZWxzOiBiaW5zLmxldmVscyxcbiAgICAgICAgICAgICAgY2FuSW5kaXZpZHVhbDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmYWxsYmFjay5raW5kID09PSAnYmlucycpIHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gdGhpcy5iaW5zSm9iKHZpZXcsIHJlY3QsIHB4UGVyVW5pdCwgYm91bmRzLCBiaW5zLCBmYWxsYmFjay5sZXZlbCk7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLihhd2FpdCBqb2IubG9hZChjdHgpKSwga2luZDogam9iLmtpbmQsIGJpbjogam9iLmJpbiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVRyYW5zY3JpcHRUaWxlcyhnb3QsIGNhcCk7XG4gICAgICAgICAgLy8gT25lIHRyYW5zY3JpcHQgcGVyIGVudHJ5OiBldmVyeSBtYXJrZXIgaXMgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICBjb25zdCBweCA9IG5ldyBGbG9hdDMyQXJyYXkobWVyZ2VkLmNvdW50KS5maWxsKHRyYW5zY3JpcHRNYXJrZXJQeCgxLCB2aWV3LnRyYW5zY3JpcHRTY2FsZSwgcHhQZXJNaWNyb24pKTtcbiAgICAgICAgICByZXR1cm4geyBtZXJnZWQsIHB4IH07XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChwbGFuLmtpbmQgPT09ICdiaW5zJyAmJiBiaW5zICYmIHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0Qmlucykge1xuICAgICAgcmV0dXJuIHRoaXMuYmluc0pvYih2aWV3LCByZWN0LCBweFBlclVuaXQsIGJvdW5kcywgYmlucywgcGxhbi5sZXZlbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIEJpbnMgb2YgdGhlIGFsbC1nZW5lIHB5cmFtaWQgYXQgYGxldmVsYCwgc2l6ZWQgYnkgaG93IG1hbnkgdHJhbnNjcmlwdHMgZWFjaCBob2xkcy4gKi9cbiAgcHJpdmF0ZSBiaW5zSm9iKFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcmVjdDogRGF0YVJlY3QsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICAgYm91bmRzOiBTcGF0aWFsQm91bmRzLFxuICAgIGJpbnM6IE5vbk51bGxhYmxlPFNwYXRpYWxEYXRhc2V0Wyd0cmFuc2NyaXB0QmlucyddPixcbiAgICBsZXZlbDogbnVtYmVyLFxuICApOiBUcmFuc2NyaXB0Sm9iIHtcbiAgICBjb25zdCBsdiA9IGJpbnMubGV2ZWxzW2xldmVsXTtcbiAgICBjb25zdCBrZXlzID0gdGlsZXNJblJlY3RGcm9tKFxuICAgICAgYmlucy5vcmlnaW4sXG4gICAgICByZWN0LFxuICAgICAgbGV2ZWwsXG4gICAgICBiaW5zLmxldmVscy5tYXAoKGwpID0+ICh7IHRpbGVTaXplOiBsLnRpbGVTaXplIH0pKSxcbiAgICAgIGJvdW5kcyxcbiAgICAgIE1BWF9CSU5fVElMRVMsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2JpbnMnLFxuICAgICAgYmluOiB7IHNpemU6IGx2LmJpblNpemUsIG9yaWdpbjogYmlucy5vcmlnaW4gfSxcbiAgICAgIGtleTogYGFsbHxiaW5zfCR7bGV2ZWx9fCR7dmlldy50cmFuc2NyaXB0QnVkZ2V0fXwke2tleXMubWFwKHRpbGVJZCl9YCxcbiAgICAgIGxvYWQ6IGFzeW5jIChjdHgpID0+IHtcbiAgICAgICAgY29uc3QgZ290ID0gYXdhaXQgY3R4LmZldGNoQWxsKGtleXMsIChrKSA9PiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEJpbnMhKGsubGV2ZWwsIGsuZ3gsIGsuZ3kpKTtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VUcmFuc2NyaXB0VGlsZXMoZ290LCBNYXRoLm1heCh2aWV3LnRyYW5zY3JpcHRCdWRnZXQgKiAxLjUsIDEpKTtcbiAgICAgICAgcmV0dXJuIHsgbWVyZ2VkLCBweDogZ3JvdXBlZFNpemVzKG1lcmdlZC53ZWlnaHQsIGx2LmJpblNpemUgKiBweFBlclVuaXQsIHZpZXcudHJhbnNjcmlwdFNjYWxlKSB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR3JvdXAgYSBnZW5lIHNlbGVjdGlvbiBmb3IgdGhlIHpvb206IG9uZSBtYXJrZXIgcGVyIGdlbmUtdHJlZSBjbHVzdGVyIChhIGdlbmUgaW4gbm9cbiAqIGNsdXN0ZXIgaXMgaXRzIG93bikgcGVyIGJpbiBvZiB0aGUgcHlyYW1pZCBsYWRkZXIsIHN0YXJ0aW5nIGF0IHRoZSBmaW5lc3QgYmluIHdob3NlXG4gKiBtYXJrZXJzIGFyZSAxNCBweCBhcGFydCBhbmQgc3RlcHBpbmcgdXAgd2hpbGUgdGhlIG1hcmtlcnMgd291bGQgZXhjZWVkIHRoZSBidWRnZXQuXG4gKiBOdWxsIHRvIGRyYXcgZXZlcnkgdHJhbnNjcmlwdDogem9vbWVkIGluLCB3aXRoIHRoZSBzZWxlY3Rpb24gd2l0aGluIHRoZSBidWRnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cFNlbGVjdGlvbihcbiAgdDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICBsYWRkZXI6IE5vbk51bGxhYmxlPFRyYW5zY3JpcHRMb2FkWydsYWRkZXInXT4sXG4gIHB4UGVyVW5pdDogbnVtYmVyLFxuKTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgcHg6IEZsb2F0MzJBcnJheTsgYmluOiBudW1iZXI7IGdyb3VwOiBJbnQzMkFycmF5OyBuYW1lczogc3RyaW5nW10gfSB8IG51bGwge1xuICBjb25zdCBidWRnZXQgPSBNYXRoLm1heCgxLCB2aWV3LnRyYW5zY3JpcHRCdWRnZXQpO1xuICBjb25zdCBnZW5lcyA9IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICBjb25zdCBncm91cHMgPSB2aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzO1xuICBjb25zdCBuYW1lcyA9IFsuLi5ncm91cHMubWFwKChnKSA9PiBnLm5hbWUpLCAuLi5nZW5lc107XG4gIGNvbnN0IGNsdXN0ZXJPZiA9IGdlbmVzLm1hcCgoZ2VuZSwgc2xvdCkgPT4ge1xuICAgIGNvbnN0IGcgPSBncm91cHMuZmluZEluZGV4KCh4KSA9PiB4LmdlbmVzLmluY2x1ZGVzKGdlbmUpKTtcbiAgICByZXR1cm4gZyA+PSAwID8gZyA6IGdyb3Vwcy5sZW5ndGggKyBzbG90O1xuICB9KTtcbiAgY29uc3Qga2V5T2YgPSAoc2xvdDogbnVtYmVyKSA9PiBjbHVzdGVyT2Zbc2xvdF0gPz8gZ3JvdXBzLmxlbmd0aCArIHNsb3Q7XG4gIGxldCBiaW4gPSBsYWRkZXIuc3RhcnQ7XG4gIGlmIChiaW4gPT09IG51bGwpIHtcbiAgICAvLyBFdmVyeSB0cmFuc2NyaXB0LCBpZiB0aGV5IGZpdCB0aGUgbWF4IGFuZCBub25lIHdhcyBjdXQgb2ZmIGF0IHRoZSBjYXAuXG4gICAgaWYgKHQuY291bnQgPD0gYnVkZ2V0ICYmIHQuY291bnQgPCBNQVhfVFJBTlNDUklQVFMpIHJldHVybiBudWxsO1xuICAgIGJpbiA9IGxhZGRlci5iYXNlQmluO1xuICB9XG4gIGNvbnN0IHRvcCA9IGxhZGRlci5iYXNlQmluICogMiAqKiAobGFkZGVyLmxldmVscyAtIDEpO1xuICBsZXQgZ3JvdXBlZCA9IGdyb3VwVHJhbnNjcmlwdHModCwgYmluLCBrZXlPZik7XG4gIC8vIE92ZXIgdGhlIG1heDogY29tYmluZSBpbnRvIGxhcmdlciBtYXJrZXJzLCBhIGxldmVsIGF0IGEgdGltZS5cbiAgd2hpbGUgKGdyb3VwZWQudGlsZS5jb3VudCA+IGJ1ZGdldCAmJiBiaW4gPCB0b3ApIHtcbiAgICBiaW4gKj0gMjtcbiAgICBncm91cGVkID0gZ3JvdXBUcmFuc2NyaXB0cyh0LCBiaW4sIGtleU9mKTtcbiAgfVxuICBjb25zdCBweCA9IGdyb3VwZWRTaXplcyhncm91cGVkLnRpbGUud2VpZ2h0LCBiaW4gKiBweFBlclVuaXQsIHZpZXcudHJhbnNjcmlwdFNjYWxlKTtcbiAgcmV0dXJuIHsgbWVyZ2VkOiBncm91cGVkLnRpbGUsIHB4LCBiaW4sIGdyb3VwOiBncm91cGVkLmdyb3VwLCBuYW1lcyB9O1xufVxuXG4vKiogU2NyZWVuIHNpemVzIG9mIGdyb3VwZWQgbWFya2VyczogYnkgd2VpZ2h0IGFnYWluc3QgdGhlIDk1dGgtcGVyY2VudGlsZSB3ZWlnaHQsIG92ZXIgYGJpblB4YC4gKi9cbmZ1bmN0aW9uIGdyb3VwZWRTaXplcyh3ZWlnaHQ6IFVpbnQzMkFycmF5LCBiaW5QeDogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgcmVmQ291bnQgPSBxdWFudGlsZU9mKHdlaWdodCwgMC45NSk7XG4gIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbSh3ZWlnaHQsICh3KSA9PiBncm91cGVkTWFya2VyUHgodywgcmVmQ291bnQsIGJpblB4LCBzY2FsZSkpO1xufVxuXG4vKiogV2hhdCBhIGdlbmUgc2VsZWN0aW9uJ3Mgam9iIGZldGNoZXMgYW5kIGNsaXBzIHRvOiB0aGUgdmlldyBhbmQgYSBxdWFydGVyLXZpZXcgbWFyZ2luIGVhY2ggc2lkZSxcbiAqICBzbyBhIHNtYWxsIHBhbiBuZWVkcyBub3RoaW5nIG5ldy4gKi9cbmludGVyZmFjZSBDbGlwV2luZG93IHtcbiAgYXJvdW5kOiBEYXRhUmVjdDtcbiAgLyoqIFRoZSB3aW5kb3cgaW4gcXVhcnRlci12aWV3IHN0ZXBzLCBmb3IgYSBqb2Iga2V5OiBhIHBhbiBwYXN0IHRoZSBtYXJnaW4gcmUtY2xpcHMuICovXG4gIGtleTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjbGlwV2luZG93KHJlY3Q6IERhdGFSZWN0KTogQ2xpcFdpbmRvdyB7XG4gIGNvbnN0IG14ID0gKHJlY3QueDEgLSByZWN0LngwKSAqIDAuMjU7XG4gIGNvbnN0IG15ID0gKHJlY3QueTEgLSByZWN0LnkwKSAqIDAuMjU7XG4gIHJldHVybiB7XG4gICAgYXJvdW5kOiB7IHgwOiByZWN0LngwIC0gbXgsIHkwOiByZWN0LnkwIC0gbXksIHgxOiByZWN0LngxICsgbXgsIHkxOiByZWN0LnkxICsgbXkgfSxcbiAgICBrZXk6IGAke01hdGguZmxvb3IocmVjdC54MCAvIChteCB8fCAxKSl9LCR7TWF0aC5mbG9vcihyZWN0LnkwIC8gKG15IHx8IDEpKX1gLFxuICB9O1xufVxuXG4vKiogUGh5c2ljYWwgbWFya2VyIHNpemUgbmVlZHMgwrVtOyB1bmRlZmluZWQgd2hlbiB0aGUgZGF0YXNldCdzIHVuaXQgaXMgdW5rbm93bi4gKi9cbmZ1bmN0aW9uIHB4UGVyTWljcm9uT2YoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHB4UGVyVW5pdDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGRhdGFzZXQubWljcm9uc1BlclVuaXQgPyBweFBlclVuaXQgLyBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0IDogdW5kZWZpbmVkO1xufVxuIl19
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1qb2JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL3NwYXRpYWwtdGlsZXMvdHJhbnNjcmlwdC1qb2JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLFNBQVMsRUFBd0IsTUFBTSw0Q0FBNEMsQ0FBQztBQVE3RixPQUFPLEVBQVksTUFBTSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixVQUFVLEVBQ1Ysa0JBQWtCLEdBQ25CLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUkzRztrRkFDa0Y7QUFDbEYsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QjsrQ0FDK0M7QUFDL0MsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ2hDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN6QiwrRUFBK0U7QUFDL0UsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUEwQi9COzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBSS9CLFlBQTZCLElBQXFCO1FBQXJCLFNBQUksR0FBSixJQUFJLENBQWlCO1FBSGxELHlEQUF5RDtRQUN4QyxpQkFBWSxHQUFHLElBQUksUUFBUSxDQUFnQyxrQkFBa0IsQ0FBQyxDQUFD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cyc7XG5cbmltcG9ydCB7IEFMTF9HRU5FUywgdHlwZSBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbEJvdW5kcyxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgRGF0YVJlY3QsIHRpbGVJZCwgdGlsZXNJblJlY3QsIHRpbGVzSW5SZWN0RnJvbSwgdHJhbnNjcmlwdExldmVsRm9yIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHtcbiAgYWxsR2VuZXNQbGFuLFxuICBjbGlwVHJhbnNjcmlwdHMsXG4gIGdlbmVCaW5TaXplLFxuICBncm91cFRyYW5zY3JpcHRzLFxuICBncm91cGVkTWFya2VyUHgsXG4gIHF1YW50aWxlT2YsXG4gIHRyYW5zY3JpcHRNYXJrZXJQeCxcbn0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC90cmFuc2NyaXB0LWdyb3VwaW5nJztcbmltcG9ydCB7IGFsbEdlbmVzSGlkZGVuLCBjbHVzdGVyTWFya2VycywgbWVyZ2VUcmFuc2NyaXB0VGlsZXMgfSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFBsYW5Db250ZXh0IH0gZnJvbSAnLi9wbGFuLWNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2NyaXB0QmluLCBUcmFuc2NyaXB0S2luZCB9IGZyb20gJy4vdHJhbnNjcmlwdC1ob3Zlcic7XG5cbi8qKiBUaGUgYWxsLWdlbmUgcHlyYW1pZCdzIGZpbmVzdCBiaW4gKDI1MCDCtW0gc291cmNlIHRpbGVzIC8gMTI4KSBhbmQgZGVmYXVsdCBsZXZlbCBjb3VudCwgdXNlZFxuICogIHRvIGdyb3VwIGEgZ2VuZSBzZWxlY3Rpb24gb24gdGhlIHNhbWUgbGFkZGVyIHdoZW4gYSBkYXRhc2V0IGhhcyBubyBweXJhbWlkLiAqL1xuY29uc3QgUFlSQU1JRF9CQVNFX0JJTl9VTSA9IDI1MCAvIDEyODtcbmNvbnN0IFBZUkFNSURfTEVWRUxTID0gNztcbi8qKiBUcmFuc2NyaXB0cyBkcmF3biBhdCBvbmNlLiBQYXN0IHRoaXMgYSBzY3JlZW4gaXMgc29saWQgY29sb3VyIGFueXdheTsgdGhlIGxldmVsXG4gKiAgcG9saWN5IGtlZXBzIGEgbm9ybWFsIHZpZXcgZmFyIGJlbG93IGl0LiAqL1xuY29uc3QgTUFYX1RSQU5TQ1JJUFRTID0gNDAwXzAwMDtcbmNvbnN0IE1BWF9UUkFOU0NSSVBUX1RJTEVTID0gMzY7XG5jb25zdCBNQVhfQklOX1RJTEVTID0gNjQ7XG4vKiogU3VtbWVkIHBlci1jbHVzdGVyIGRlbnNpdHkgZ3JpZHMga2VwdCAob25lIHBlciBjbHVzdGVyIMOXIGJpbiDDlyBkYXRhc2V0KS4gKi9cbmNvbnN0IERFTlNJVFlfQ0FDSEVfU0laRSA9IDI1NjtcblxuLyoqIEEgdHJhbnNjcmlwdCBmZXRjaCB0aGUgcGxhbm5lciBjYW4ga2V5IGJlZm9yZSBydW5uaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0Sm9iIHtcbiAgLyoqIFdoYXQgb25lIGVudHJ5IGlzIOKAlCBkZWNpZGVzIHdoYXQgaG92ZXJpbmcgaXQgc2F5cy4gKi9cbiAga2luZDogVHJhbnNjcmlwdEtpbmQ7XG4gIC8qKiBGb3IgYmluczogdGhlaXIgc2l6ZSBhbmQgZ3JpZCBvcmlnaW4sIHNvIGEgaG92ZXJlZCBiaW4ncyBzcXVhcmUgY2FuIGJlIHJlY292ZXJlZC4gKi9cbiAgYmluPzogVHJhbnNjcmlwdEJpbjtcbiAgLyoqIElkZW50aWZpZXMgd2hhdCB3aWxsIGJlIGRyYXduLCBzbyBhbiB1bmNoYW5nZWQgcGxhbiBpcyBhIG5vLW9wLiAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqIEZldGNoIGFuZCBtZXJnZTsgYHB4YCBpcyBlYWNoIGVudHJ5J3MgbWFya2VyIGRpYW1ldGVyIGluIHNjcmVlbiBwaXhlbHMuIEEgam9iIG1heVxuICAgKiAgc3dpdGNoIHRvIGFub3RoZXIga2luZCBvbmNlIGl0IHNlZXMgdGhlIGRhdGEgKGluZGl2aWR1YWwg4oaSIGJpbnMpOyBpdCB0aGVuIHNheXMgc28uICovXG4gIGxvYWQoY3R4OiBQbGFuQ29udGV4dCk6IFByb21pc2U8VHJhbnNjcmlwdExvYWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHRMb2FkIHtcbiAgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7XG4gIHB4OiBGbG9hdDMyQXJyYXk7XG4gIC8qKiBGb3IgYSBnZW5lIHNlbGVjdGlvbjogZ3JvdXAgaXQgb24gdGhpcyBiaW4gbGFkZGVyIG9uY2UgaGlkZGVuIGdlbmVzIGFyZSBkcm9wcGVkLiAqL1xuICBsYWRkZXI/OiB7IGJhc2VCaW46IG51bWJlcjsgbGV2ZWxzOiBudW1iZXI7IHN0YXJ0OiBudW1iZXIgfCBudWxsIH07XG4gIC8qKiBBbHJlYWR5IG9uZSBtYXJrZXIgcGVyIGNsdXN0ZXIgcGVyIGJpbiAoem9vbWVkIG91dCwgZnJvbSB0aGUgZGVuc2l0eSBncmlkcyk6IG5vIGNlbGxzLiAqL1xuICBjbHVzdGVyZWQ/OiB7IGdyb3VwOiBJbnQzMkFycmF5OyBuYW1lczogc3RyaW5nW107IGdlbmVzOiBzdHJpbmdbXVtdOyBiaW46IG51bWJlcjsgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdIH07XG4gIGtpbmQ/OiBUcmFuc2NyaXB0Sm9iWydraW5kJ107XG4gIGJpbj86IFRyYW5zY3JpcHRKb2JbJ2JpbiddO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hpY2ggdHJhbnNjcmlwdHMgdGhlIDJEIHNwYXRpYWwgdmlldyBmZXRjaGVzLCBhdCB3aGljaCBsZXZlbCwgZm9yIHRoZSBjdXJyZW50XG4gKiBjYW1lcmEgYW5kIHNlbGVjdGlvbjogYSB7QGxpbmsgVHJhbnNjcmlwdEpvYn0gdGhhdCBjYW4gYmUga2V5ZWQgYmVmb3JlIGl0IHJ1bnMgKHNvIGFuXG4gKiB1bmNoYW5nZWQgcGxhbiBpcyBhIG5vLW9wKSBhbmQgdGhhdCBmZXRjaGVzIGFuZCBtZXJnZXMgd2hlbiBydW4uXG4gKlxuICogUHVyZSBhcGFydCBmcm9tIHRoZSBwb3J0LCBzbyB0aGUgbGV2ZWwgcG9saWN5IGlzIHRlc3RhYmxlIHdpdGhvdXQgYSB2aWV3ZXIuIE93bnMgdGhlXG4gKiBjYWNoZSBvZiBzdW1tZWQgcGVyLWNsdXN0ZXIgZGVuc2l0eSBncmlkcyBhIHpvb21lZC1vdXQgZ2VuZSBzZWxlY3Rpb24gaXMgZHJhd24gZnJvbS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zY3JpcHRKb2JQbGFubmVyIHtcbiAgLyoqIFN1bW1lZCBwZXItY2x1c3RlciBkZW5zaXR5IGdyaWRzIChzZWUgZGVuc2l0eUZvcikuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVuc2l0eUNhY2hlID0gbmV3IExydUNhY2hlPFByb21pc2U8U3BhdGlhbERlbnNpdHlSYXN0ZXI+PihERU5TSVRZX0NBQ0hFX1NJWkUpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcG9ydDogU3BhdGlhbERhdGFQb3J0KSB7fVxuXG4gIC8qKlxuICAgKiBUaGUgam9iIHRoYXQgZHJhd3MgdGhlIHZpZXcncyB0cmFuc2NyaXB0cyBhcyBtYXJrZXJzIChjaXJjbGVzIG9yIGljb25zKSwgb3IgbnVsbCB3aGVuIHRoZVxuICAgKiB2aWV3IGRyYXdzIG5vbmUgb3IgdGhlIHBvcnQgY2Fubm90IHNlcnZlIHRoZW0uXG4gICAqL1xuICBqb2JGb3IoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICByZWN0OiBEYXRhUmVjdCxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgKTogVHJhbnNjcmlwdEpvYiB8IG51bGwge1xuICAgIGNvbnN0IG1vZGUgPSB2aWV3LnRyYW5zY3JpcHRNb2RlO1xuICAgIGlmIChtb2RlICE9PSAnY2lyY2xlcycgJiYgbW9kZSAhPT0gJ2dseXBocycpIHJldHVybiBudWxsO1xuICAgIGlmIChhbGxHZW5lc0hpZGRlbih2aWV3KSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZ2VuZUJpbnMgPSB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEdlbmVCaW5zICYmIGRhdGFzZXQudHJhbnNjcmlwdEdlbmVCaW5zO1xuICAgIGlmICghdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRUaWxlICYmICFnZW5lQmlucykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzXG4gICAgICA/IHRoaXMuYWxsR2VuZXNKb2IoZGF0YXNldCwgdmlldywgcmVjdCwgcHhQZXJVbml0KVxuICAgICAgOiB0aGlzLmdlbmVKb2IoZGF0YXNldCwgdmlldywgcmVjdCwgcHhQZXJVbml0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2hvc2VuIGdlbmVzLCBhdCB0aGUgbGV2ZWwgdGhlIHpvb20gY2FsbHMgZm9yIOKAlCBvciBjb2Fyc2VyLCB3aGlsZSB0aGUgbWFya2VycyBpblxuICAgKiB2aWV3IHdvdWxkIGV4Y2VlZCB0aGUgYnVkZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lSm9iKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcmVjdDogRGF0YVJlY3QsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IFRyYW5zY3JpcHRKb2IgfCBudWxsIHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC50cmFuc2NyaXB0VGlsZXM7XG4gICAgY29uc3QgZ2VuZXMgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcztcbiAgICBpZiAoIW1ldGEgfHwgIWdlbmVzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZmlyc3QgPSB0cmFuc2NyaXB0TGV2ZWxGb3IocHhQZXJVbml0LCBtZXRhLmxldmVscyk7XG4gICAgY29uc3Qga2V5c0F0ID0gKGw6IG51bWJlcikgPT4gdGlsZXNJblJlY3QocmVjdCwgbCwgbWV0YS5sZXZlbHMsIG1ldGEuYm91bmRzLCBNQVhfVFJBTlNDUklQVF9USUxFUyk7XG4gICAgY29uc3QgcXVlcnkgPSB7IGdlbmVzLCBxdWFsaXR5OiB2aWV3LnRyYW5zY3JpcHRRdWFsaXR5IH07XG4gICAgY29uc3QgcHhQZXJNaWNyb24gPSBweFBlck1pY3Jvbk9mKGRhdGFzZXQsIHB4UGVyVW5pdCk7XG4gICAgY29uc3QgY2xpcCA9IGNsaXBXaW5kb3cocmVjdCk7XG4gICAgLy8gWm9vbWVkIG91dCwgZWFjaCBnZW5lJ3MgdHJhbnNjcmlwdHMgYXJlIGdyb3VwZWQgb24gdGhlIGFsbC1nZW5lIHB5cmFtaWQncyBiaW4gbGFkZGVyLFxuICAgIC8vIHNvIGEgZ2VuZSBzZWxlY3Rpb24gcmVhZHMgbGlrZSBcImFsbCBnZW5lc1wiIGRvZXM6IG9uZSBtYXJrZXIgcGVyIGdlbmUgcGVyIGFyZWEsIHNpemVkXG4gICAgLy8gYnkgaG93IG1hbnkgaXQgaG9sZHM7IHpvb21lZCBpbiBmYXIgZW5vdWdoLCBldmVyeSB0cmFuc2NyaXB0IGlzIGl0cyBvd24gbWFya2VyLlxuICAgIGNvbnN0IGxhZGRlciA9IGRhdGFzZXQudHJhbnNjcmlwdEJpbnM/LmxldmVscztcbiAgICBjb25zdCBiYXNlQmluID1cbiAgICAgIGxhZGRlcj8uWzBdPy5iaW5TaXplID8/IChkYXRhc2V0Lm1pY3JvbnNQZXJVbml0ID8gUFlSQU1JRF9CQVNFX0JJTl9VTSAvIGRhdGFzZXQubWljcm9uc1BlclVuaXQgOiAwKTtcbiAgICBjb25zdCBiaW4gPSBnZW5lQmluU2l6ZShweFBlclVuaXQsIGJhc2VCaW4sIGxhZGRlcj8ubGVuZ3RoID8/IFBZUkFNSURfTEVWRUxTKTtcbiAgICAvLyBab29tZWQgb3V0IHRvIGJpbnMgYXMgd2lkZSBhcyB0aGUgZGVuc2l0eSBncmlkLCBhIHNlbGVjdGlvbiBpcyBkcmF3biBmcm9tIHRoZSBwZXItZ2VuZVxuICAgIC8vIGRlbnNpdHkgZ3JpZHMg4oCUIG9uZSBjYWNoZWQgcmVxdWVzdCBwZXIgY2x1c3RlciDigJQgcmF0aGVyIHRoYW4gMTB4J3MgY29hcnNlIHBlci1nZW5lXG4gICAgLy8gdGlsZXMsIHdoaWNoIHRha2UgbWludXRlcyBmb3IgYSBmZXcgaHVuZHJlZCBnZW5lcy5cbiAgICAvLyBXaXRoIHRoZSBweXJhbWlkJ3MgcGVyLWdlbmUgbGV2ZWxzLCBldmVyeSB6b29tIG9mIGEgc2VsZWN0aW9uIHJlYWRzIHRoZW06IHRoZSBsZXZlbCB0aGVcbiAgICAvLyB6b29tIGNhbGxzIGZvciwgY29hcnNlciB3aGlsZSB0aGUgbWFya2VycyB3b3VsZCBleGNlZWQgdGhlIG1heC5cbiAgICAvLyBCb3RoIGFyZSBidWlsdCBmcm9tIGhpZ2gtcXVhbGl0eSBjYWxscyBvbmx5OiB3aXRoIGxvdy1xdWFsaXR5IGNhbGxzIGluY2x1ZGVkLCB0aGVcbiAgICAvLyBxdWFsaXR5LWF3YXJlIHRpbGVzIGJlbG93IHNlcnZlIGV2ZXJ5IHpvb20gKGFzIGxvbmcgYXMgdGhlcmUgYXJlIHRpbGVzIHRvIHNlcnZlKS5cbiAgICBjb25zdCBoaWdoT25seSA9IHZpZXcudHJhbnNjcmlwdFF1YWxpdHkgIT09ICdhbGwnIHx8ICF0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFRpbGU7XG4gICAgY29uc3QgZ2VuZUJpbnMgPSBkYXRhc2V0LnRyYW5zY3JpcHRHZW5lQmlucztcbiAgICBjb25zdCBmcm9tR2VuZUJpbnMgPSBoaWdoT25seSAmJiBnZW5lQmlucyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEdlbmVCaW5zO1xuICAgIGlmIChmcm9tR2VuZUJpbnMgJiYgKGJpbiAhPT0gbnVsbCB8fCAhdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRUaWxlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZUJpbnNKb2IoZGF0YXNldCwgdmlldywgY2xpcCwgZ2VuZUJpbnMsIGJpbiA/PyBnZW5lQmlucy5sZXZlbHNbMF0uYmluU2l6ZSk7XG4gICAgfVxuICAgIGNvbnN0IGdyaWQgPSBkYXRhc2V0LmRlbnNpdHk/LmdyaWRTaXplWzBdID8/IDA7XG4gICAgaWYgKGhpZ2hPbmx5ICYmIGJpbiAhPT0gbnVsbCAmJiBncmlkID4gMCAmJiB0aGlzLnBvcnQuZ2V0RGVuc2l0eSAmJiBiaW4gPj0gZ3JpZCAqIDAuNzUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsdXN0ZXJEZW5zaXR5Sm9iKGRhdGFzZXQsIHZpZXcsIGNsaXAsIHB4UGVyVW5pdCwgTWF0aC5tYXgoYmluLCBncmlkKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnZ2VuZXMnLFxuICAgICAgLy8gVGhlIGNsaXAgd2luZG93LCBpbiBxdWFydGVyLXZpZXcgc3RlcHM6IGEgcGFuIHBhc3QgdGhlIG1hcmdpbiByZS1jbGlwcy5cbiAgICAgIGtleTpcbiAgICAgICAgYGdlbmVzfCR7Z2VuZXMuam9pbignLCcpfXwke3ZpZXcudHJhbnNjcmlwdFF1YWxpdHl9fCR7dmlldy50cmFuc2NyaXB0QnVkZ2V0fXwke2JpbiA/PyAnZWFjaCd9fGAgK1xuICAgICAgICBgJHtjbGlwLmtleX18JHtrZXlzQXQoZmlyc3QpLm1hcCh0aWxlSWQpfWAsXG4gICAgICBsb2FkOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgIC8vIFRoZSB6b29tJ3Mgb3duIGxldmVsIG9ubHk6IG92ZXIgdGhlIGJ1ZGdldCwgdGhlIHRyYW5zY3JpcHRzIGFyZSBjb21iaW5lZCBpbnRvXG4gICAgICAgIC8vIGxhcmdlciBtYXJrZXJzIChncm91cFNlbGVjdGlvbiksIG5ldmVyIGZldGNoZWQgZnJvbSBzbG93ZXIgY29hcnNlIGxldmVscy5cbiAgICAgICAgY29uc3QgdGlsZXMgPSBhd2FpdCBjdHguZmV0Y2hBbGwoa2V5c0F0KGZpcnN0KSwgKGspID0+XG4gICAgICAgICAgdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRUaWxlIShrLmxldmVsLCBrLmd4LCBrLmd5LCBxdWVyeSksXG4gICAgICAgICk7XG4gICAgICAgIC8vIE9ubHkgd2hhdCBpcyBvbiBzY3JlZW4gKGFuZCBhIG1hcmdpbiwgc28gYSBzbWFsbCBwYW4gbmVlZHMgbm90aGluZyBuZXcpIGNvdW50c1xuICAgICAgICAvLyBhZ2FpbnN0IHRoZSBidWRnZXQgYW5kIHRoZSBjYXA7IGEgdGlsZSByZWFjaGVzIGZhciBwYXN0IHRoZSB2aWV3LlxuICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVRyYW5zY3JpcHRUaWxlcyhcbiAgICAgICAgICB0aWxlcy5tYXAoKHQpID0+IGNsaXBUcmFuc2NyaXB0cyh0LCBjbGlwLmFyb3VuZCkpLFxuICAgICAgICAgIE1BWF9UUkFOU0NSSVBUUyxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHggPSBGbG9hdDMyQXJyYXkuZnJvbShtZXJnZWQud2VpZ2h0LCAodykgPT5cbiAgICAgICAgICB0cmFuc2NyaXB0TWFya2VyUHgodywgdmlldy50cmFuc2NyaXB0U2NhbGUsIHB4UGVyTWljcm9uKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGJhc2VCaW4gPiAwXG4gICAgICAgICAgPyB7IG1lcmdlZCwgcHgsIGxhZGRlcjogeyBiYXNlQmluLCBsZXZlbHM6IGxhZGRlcj8ubGVuZ3RoID8/IFBZUkFNSURfTEVWRUxTLCBzdGFydDogYmluIH0gfVxuICAgICAgICAgIDogeyBtZXJnZWQsIHB4IH07XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQSBnZW5lIHNlbGVjdGlvbiBmcm9tIHRoZSBweXJhbWlkJ3MgcGVyLWdlbmUgbGV2ZWxzOiBzdGFydGluZyBhdCB0aGUgbGV2ZWwgd2hvc2UgYmlucyBhcmVcbiAgICogYHN0YXJ0QmluYCwgZmV0Y2ggdGhlIHZpZXcncyB0aWxlcyBmb3IgdGhlIHNlbGVjdGVkIGdlbmVzIGFuZCBzdGVwIHRvIGEgY29hcnNlciBsZXZlbCB3aGlsZVxuICAgKiBvbmUgbWFya2VyIHBlciBjbHVzdGVyIHBlciBiaW4gd291bGQgZXhjZWVkIHRoZSBtYXguIEhpZGRlbiBnZW5lcyBhcmUgZmV0Y2hlZCB0b28gKHRoZWlyXG4gICAqIGNvdW50cyBpbiB2aWV3IHN0aWxsIHNob3cpIGFuZCBkcm9wcGVkIGJlZm9yZSBkcmF3aW5nOyBncm91cGluZyBieSBjbHVzdGVyIGhhcHBlbnMgdGhlcmUuXG4gICAqL1xuICBwcml2YXRlIGdlbmVCaW5zSm9iKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgY2xpcDogQ2xpcFdpbmRvdyxcbiAgICBtZXRhOiBOb25OdWxsYWJsZTxTcGF0aWFsRGF0YXNldFsndHJhbnNjcmlwdEdlbmVCaW5zJ10+LFxuICAgIHN0YXJ0QmluOiBudW1iZXIsXG4gICk6IFRyYW5zY3JpcHRKb2Ige1xuICAgIGNvbnN0IGdlbmVzID0gdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgY29uc3QgbGV2ZWxzID0gbWV0YS5sZXZlbHM7XG4gICAgbGV0IGZpcnN0ID0gbGV2ZWxzLmZpbmRJbmRleCgobCkgPT4gbC5iaW5TaXplID49IHN0YXJ0QmluICogMC45OTkpO1xuICAgIGlmIChmaXJzdCA8IDApIGZpcnN0ID0gbGV2ZWxzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgYnVkZ2V0ID0gTWF0aC5tYXgoMSwgdmlldy50cmFuc2NyaXB0QnVkZ2V0KTtcbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgU2V0KHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzKTtcbiAgICBjb25zdCBjbHVzdGVycyA9IHRoaXMuc2VsZWN0aW9uQ2x1c3RlcnModmlldyk7XG4gICAgY29uc3QgY2x1c3Rlck9mID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICBjbHVzdGVycy5mb3JFYWNoKChjLCBjaSkgPT4gYy5nZW5lcy5mb3JFYWNoKChnKSA9PiBjbHVzdGVyT2Yuc2V0KGdlbmVzLmluZGV4T2YoZyksIGNpKSkpO1xuICAgIGNvbnN0IGtleXNBdCA9IChtOiBudW1iZXIpID0+XG4gICAgICB0aWxlc0luUmVjdEZyb20oXG4gICAgICAgIG1ldGEub3JpZ2luLFxuICAgICAgICBjbGlwLmFyb3VuZCxcbiAgICAgICAgbSxcbiAgICAgICAgbGV2ZWxzLm1hcCgobCkgPT4gKHsgdGlsZVNpemU6IGwudGlsZVNpemUgfSkpLFxuICAgICAgICBudWxsLFxuICAgICAgICBNQVhfQklOX1RJTEVTLFxuICAgICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2dlbmVzJyxcbiAgICAgIGtleTpcbiAgICAgICAgYGdlbmUtYmluc3wke2dlbmVzLmpvaW4oJywnKX18JHtidWRnZXR9fCR7Zmlyc3R9fCR7SlNPTi5zdHJpbmdpZnkodmlldy50cmFuc2NyaXB0R2VuZUdyb3Vwcyl9fGAgKyBjbGlwLmtleSxcbiAgICAgIGxvYWQ6IGFzeW5jIChjdHgpID0+IHtcbiAgICAgICAgbGV0IG0gPSBmaXJzdDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHRpbGVzID0gYXdhaXQgY3R4LmZldGNoQWxsKGtleXNBdChtKSwgKGspID0+XG4gICAgICAgICAgICB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEdlbmVCaW5zIShrLmxldmVsLCBrLmd4LCBrLmd5LCBnZW5lcyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjbGlwcGVkID0gdGlsZXMubWFwKCh0KSA9PiBjbGlwVHJhbnNjcmlwdHModCwgY2xpcC5hcm91bmQpKTtcbiAgICAgICAgICAvLyBQYXN0IHRoZSBjYXAgYSBtZXJnZSB3b3VsZCBkcm9wIHdob2xlIGdlbmVzICh0aGUgdGFpbCBvZiBldmVyeSB0aWxlKTogZ28gY29hcnNlci5cbiAgICAgICAgICBpZiAoY2xpcHBlZC5yZWR1Y2UoKG4sIHQpID0+IG4gKyB0LmNvdW50LCAwKSA+IE1BWF9UUkFOU0NSSVBUUyAmJiBtIDwgbGV2ZWxzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIG0rKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVRyYW5zY3JpcHRUaWxlcyhjbGlwcGVkLCBNQVhfVFJBTlNDUklQVFMpO1xuICAgICAgICAgIC8vIE1hcmtlcnMgdGhpcyBsZXZlbCB3b3VsZCBkcmF3OiBvbmUgcGVyICh2aXNpYmxlIGNsdXN0ZXIsIGJpbikuXG4gICAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIGNvbnN0IGJpbiA9IGxldmVsc1ttXS5iaW5TaXplO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChoaWRkZW4uaGFzKGdlbmVzW21lcmdlZC5nZW5lW2ldXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgYyA9IGNsdXN0ZXJPZi5nZXQobWVyZ2VkLmdlbmVbaV0pO1xuICAgICAgICAgICAgaWYgKGMgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBzZWVuLmFkZChgJHtjfXwke01hdGguZmxvb3IobWVyZ2VkLnhbaV0gLyBiaW4pfXwke01hdGguZmxvb3IobWVyZ2VkLnlbaV0gLyBiaW4pfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vlbi5zaXplIDw9IGJ1ZGdldCB8fCBtID49IGxldmVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXJnZWQsIHB4OiBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZC5jb3VudCksIGxhZGRlcjogeyBiYXNlQmluOiBiaW4sIGxldmVsczogMSwgc3RhcnQ6IGJpbiB9IH07XG4gICAgICAgICAgfVxuICAgICAgICAgIG0rKztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBzZWxlY3Rpb24ncyBjbHVzdGVyczogZWFjaCBnZW5lLXRyZWUgZ3JvdXAncyB2aXNpYmxlIGdlbmVzLCB0aGVuIGVhY2ggdW5ncm91cGVkIGdlbmUuICovXG4gIHByaXZhdGUgc2VsZWN0aW9uQ2x1c3RlcnModmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IHsgbmFtZTogc3RyaW5nOyBnZW5lczogc3RyaW5nW107IHNsb3Q6IG51bWJlciB9W10ge1xuICAgIGNvbnN0IGhpZGRlbiA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICAgIGNvbnN0IHNsb3RzID0gbmV3IE1hcCh2aWV3LnRyYW5zY3JpcHRHZW5lcy5tYXAoKGcsIGkpID0+IFtnLCBpXSkpO1xuICAgIGNvbnN0IHRha2VuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgb3V0OiB7IG5hbWU6IHN0cmluZzsgZ2VuZXM6IHN0cmluZ1tdOyBzbG90OiBudW1iZXIgfVtdID0gW107XG4gICAgZm9yIChjb25zdCBnIG9mIHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMpIHtcbiAgICAgIGNvbnN0IGdlbmVzID0gZy5nZW5lcy5maWx0ZXIoKHgpID0+IHNsb3RzLmhhcyh4KSAmJiAhaGlkZGVuLmhhcyh4KSAmJiAhdGFrZW4uaGFzKHgpKTtcbiAgICAgIGdlbmVzLmZvckVhY2goKHgpID0+IHRha2VuLmFkZCh4KSk7XG4gICAgICBpZiAoZ2VuZXMubGVuZ3RoKSBvdXQucHVzaCh7IG5hbWU6IGcubmFtZSwgZ2VuZXMsIHNsb3Q6IHNsb3RzLmdldChnZW5lc1swXSkhIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGdlbmUgb2Ygdmlldy50cmFuc2NyaXB0R2VuZXMpIHtcbiAgICAgIGlmICghdGFrZW4uaGFzKGdlbmUpICYmICFoaWRkZW4uaGFzKGdlbmUpKSBvdXQucHVzaCh7IG5hbWU6IGdlbmUsIGdlbmVzOiBbZ2VuZV0sIHNsb3Q6IHNsb3RzLmdldChnZW5lKSEgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyLWdlbmUgZGVuc2l0eSBncmlkcyBzdW1tZWQgZm9yIGBnZW5lc2AsIGNhY2hlZCAoYSBjbHVzdGVyIGlzIGFza2VkIGZvciBvbmNlIHBlciBiaW4pLlxuICAgKiBLZXllZCBieSBkYXRhc2V0IHRvbzogdGhpcyBtYW5hZ2VyIG91dGxpdmVzIGEgZGF0YXNldCwgYW5kIGFub3RoZXIgbWF5IHNoYXJlIGdlbmUgbmFtZXMuXG4gICAqIExlYXN0LXJlY2VudGx5LVVTRUQgZXZpY3Rpb24sIHNvIHRoZSBjbHVzdGVycyBpbiB2aWV3IHN0YXkgY2FjaGVkOyBhIGZhaWxlZCByZXF1ZXN0IGlzXG4gICAqIGRyb3BwZWQgc28gdGhlIG5leHQgcGxhbiBhc2tzIGFnYWluLlxuICAgKi9cbiAgcHJpdmF0ZSBkZW5zaXR5Rm9yKGRhdGFzZXQ6IHN0cmluZywgZ2VuZXM6IHN0cmluZ1tdLCBiaW46IG51bWJlcik6IFByb21pc2U8U3BhdGlhbERlbnNpdHlSYXN0ZXI+IHtcbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0fXwke2Jpbn18JHtnZW5lcy5qb2luKCcsJyl9YDtcbiAgICBsZXQgcCA9IHRoaXMuZGVuc2l0eUNhY2hlLmdldChrZXkpO1xuICAgIGlmICghcCkge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9ydC5nZXREZW5zaXR5IShnZW5lcywgYmluKTtcbiAgICAgIHJlcXVlc3QuY2F0Y2goKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kZW5zaXR5Q2FjaGUuZ2V0KGtleSkgPT09IHJlcXVlc3QpIHRoaXMuZGVuc2l0eUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRlbnNpdHlDYWNoZS5zZXQoa2V5LCByZXF1ZXN0KTtcbiAgICAgIHAgPSByZXF1ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGdlbmUgc2VsZWN0aW9uIHpvb21lZCBvdXQ6IG9uZSBtYXJrZXIgcGVyIGNsdXN0ZXIgcGVyIGJpbiwgZnJvbSB0aGUgcGVyLWdlbmUgZGVuc2l0eVxuICAgKiBncmlkcy4gVGhlIGJpbiBzdGFydHMgd2hlcmUgbWFya2VycyBhcmUgMTQgcHggYXBhcnQgYW5kIGRvdWJsZXMgdW50aWwgdGhlIG1hcmtlcnMgZml0IHRoZVxuICAgKiBtYXg7IGVhY2ggbWFya2VyIHNpdHMgYXQgdGhlIGNvdW50LXdlaWdodGVkIGNlbnRyZSBvZiB0aGUgZmluZXIgZ3JpZCBpbnNpZGUgaXQsIHNvIG1hcmtlcnNcbiAgICogZm9sbG93IHRoZSB0aXNzdWUgcmF0aGVyIHRoYW4gYSBsYXR0aWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBjbHVzdGVyRGVuc2l0eUpvYihcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIGNsaXA6IENsaXBXaW5kb3csXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICAgc3RhcnRCaW46IG51bWJlcixcbiAgKTogVHJhbnNjcmlwdEpvYiB7XG4gICAgY29uc3QgZ3JpZCA9IGRhdGFzZXQuZGVuc2l0eSEuZ3JpZFNpemVbMF07XG4gICAgY29uc3QgY2x1c3RlcnMgPSB0aGlzLnNlbGVjdGlvbkNsdXN0ZXJzKHZpZXcpO1xuICAgIGxldCBmaXJzdCA9IGdyaWQ7XG4gICAgd2hpbGUgKGZpcnN0IDwgc3RhcnRCaW4gKiAwLjk5OSkgZmlyc3QgKj0gMjtcbiAgICBjb25zdCBidWRnZXQgPSBNYXRoLm1heCgxLCB2aWV3LnRyYW5zY3JpcHRCdWRnZXQpO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnZ2VuZXMnLFxuICAgICAga2V5OlxuICAgICAgICBgY2x1c3RlcnN8JHtjbHVzdGVycy5tYXAoKGMpID0+IGAke2MubmFtZX06JHtjLmdlbmVzLmpvaW4oJysnKX1gKS5qb2luKCc7Jyl9fCR7YnVkZ2V0fXwke2ZpcnN0fXxgICtcbiAgICAgICAgY2xpcC5rZXksXG4gICAgICBsb2FkOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBiaW4gPSBmaXJzdDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIC8vIFRoZSBmaW5lciBncmlkIGdpdmVzIGVhY2ggbWFya2VyIGl0cyBjZW50cmU7IHRoZSBzZXJ2ZXIgYmlucyAxLCAyLCA0IG9yIDggY2VsbHMuXG4gICAgICAgICAgY29uc3QgZmluZSA9IE1hdGgubWluKGJpbiA+PSBncmlkICogMiA/IGJpbiAvIDIgOiBiaW4sIGdyaWQgKiA4KTtcbiAgICAgICAgICBjb25zdCByYXN0ZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2x1c3RlcnMubWFwKChjKSA9PiB0aGlzLmRlbnNpdHlGb3IoZGF0YXNldC5pZCwgYy5nZW5lcywgZmluZSkpKTtcbiAgICAgICAgICBjb25zdCBvdXQgPSBjbHVzdGVyTWFya2VycyhcbiAgICAgICAgICAgIHJhc3RlcnMsXG4gICAgICAgICAgICBjbHVzdGVycy5tYXAoKGMpID0+IGMuc2xvdCksXG4gICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICBjbGlwLmFyb3VuZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChvdXQudGlsZS5jb3VudCA8PSBidWRnZXQgfHwgYmluID49IGdyaWQgKiAyICoqIDEyKSB7XG4gICAgICAgICAgICBjb25zdCBweCA9IGdyb3VwZWRTaXplcyhvdXQudGlsZS53ZWlnaHQsIGJpbiAqIHB4UGVyVW5pdCwgdmlldy50cmFuc2NyaXB0U2NhbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVyZ2VkOiBvdXQudGlsZSxcbiAgICAgICAgICAgICAgcHgsXG4gICAgICAgICAgICAgIGtpbmQ6ICdnZW5lcycsXG4gICAgICAgICAgICAgIGNsdXN0ZXJlZDoge1xuICAgICAgICAgICAgICAgIGdyb3VwOiBvdXQuZ3JvdXAsXG4gICAgICAgICAgICAgICAgbmFtZXM6IGNsdXN0ZXJzLm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgICAgICAgICBnZW5lczogY2x1c3RlcnMubWFwKChjKSA9PiBjLmdlbmVzKSxcbiAgICAgICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICAgICAgb3JpZ2luOiByYXN0ZXJzWzBdPy5tZXRhLm9yaWdpbiA/PyBbMCwgMF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaW4gKj0gMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGdlbmU6IHRoZSB0cmFuc2NyaXB0cyB0aGVtc2VsdmVzIG9uY2UgdGhleSBmaXQgdGhlIGJ1ZGdldCwgZWxzZSBiaW5zIG9mIHRoZVxuICAgKiBhbGwtZ2VuZSBweXJhbWlkIHNpemVkIGJ5IGhvdyBtYW55IHRyYW5zY3JpcHRzIGVhY2ggaG9sZHMuXG4gICAqL1xuICBwcml2YXRlIGFsbEdlbmVzSm9iKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcmVjdDogRGF0YVJlY3QsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IFRyYW5zY3JpcHRKb2IgfCBudWxsIHtcbiAgICBjb25zdCBiaW5zID0gZGF0YXNldC50cmFuc2NyaXB0QmlucztcbiAgICBjb25zdCB0aWxlcyA9IGRhdGFzZXQudHJhbnNjcmlwdFRpbGVzO1xuICAgIGNvbnN0IGJvdW5kcyA9IGJpbnM/LmJvdW5kcyA/PyB0aWxlcz8uYm91bmRzO1xuICAgIGlmICghYm91bmRzKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBwbGFuID0gYWxsR2VuZXNQbGFuKHtcbiAgICAgIHJlY3QsXG4gICAgICBib3VuZHMsXG4gICAgICBweFBlclVuaXQsXG4gICAgICBidWRnZXQ6IHZpZXcudHJhbnNjcmlwdEJ1ZGdldCxcbiAgICAgIHRvdGFsOiBiaW5zPy5jb3VudCA/PyB0aWxlcz8uY291bnQgPz8gMCxcbiAgICAgIGxldmVsczogYmlucyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEJpbnMgPyBiaW5zLmxldmVscyA6IFtdLFxuICAgICAgY2FuSW5kaXZpZHVhbDogISF0aWxlcyxcbiAgICB9KTtcblxuICAgIGlmIChwbGFuLmtpbmQgPT09ICdpbmRpdmlkdWFsJyAmJiB0aWxlcykge1xuICAgICAgY29uc3Qga2V5cyA9IHRpbGVzSW5SZWN0KHJlY3QsIDAsIHRpbGVzLmxldmVscywgdGlsZXMuYm91bmRzLCBNQVhfVFJBTlNDUklQVF9USUxFUyk7XG4gICAgICAvLyBFYWNoIHRpbGUgY2xpcHBlZCB0byB0aGUgdmlldywgcm91bmRlZCBvdXR3YXJkIHRvIDEwIHVuaXRzIHNvIHNtYWxsIHBhbnMgaGl0IGNhY2hlLlxuICAgICAgY29uc3QgcjEwID0gKHY6IG51bWJlciwgdXA6IGJvb2xlYW4pID0+ICh1cCA/IE1hdGguY2VpbCh2IC8gMTApIDogTWF0aC5mbG9vcih2IC8gMTApKSAqIDEwO1xuICAgICAgY29uc3Qgc2l6ZSA9IHRpbGVzLmxldmVsc1swXS50aWxlU2l6ZTtcbiAgICAgIGNvbnN0IGJveGVzID0ga2V5cy5tYXAoKGspOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiBbXG4gICAgICAgIE1hdGgubWF4KGsuZ3ggKiBzaXplLCByMTAocmVjdC54MCwgZmFsc2UpKSxcbiAgICAgICAgTWF0aC5tYXgoay5neSAqIHNpemUsIHIxMChyZWN0LnkwLCBmYWxzZSkpLFxuICAgICAgICBNYXRoLm1pbigoay5neCArIDEpICogc2l6ZSwgcjEwKHJlY3QueDEsIHRydWUpKSxcbiAgICAgICAgTWF0aC5taW4oKGsuZ3kgKyAxKSAqIHNpemUsIHIxMChyZWN0LnkxLCB0cnVlKSksXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHB4UGVyTWljcm9uID0gcHhQZXJNaWNyb25PZihkYXRhc2V0LCBweFBlclVuaXQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2luZGl2aWR1YWwnLFxuICAgICAgICBrZXk6IGBhbGx8aW5kaXZpZHVhbHwke3ZpZXcudHJhbnNjcmlwdEJ1ZGdldH18JHtib3hlcy5tYXAoKGIpID0+IGIuam9pbignLCcpKS5qb2luKCc7Jyl9YCxcbiAgICAgICAgbG9hZDogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdvdCA9IGF3YWl0IGN0eC5mZXRjaEFsbChcbiAgICAgICAgICAgIGtleXMubWFwKChrLCBpKSA9PiAoeyAuLi5rLCBib3g6IGJveGVzW2ldIH0pKSxcbiAgICAgICAgICAgIChrKSA9PiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFRpbGUhKDAsIGsuZ3gsIGsuZ3ksIHsgZ2VuZXM6IFtBTExfR0VORVNdLCBib3g6IGsuYm94IH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gVGhlIHBsYW4gZXN0aW1hdGVkIHRoZSB2aWV3IGZyb20gdGhlIGRhdGFzZXQncyBhdmVyYWdlIGRlbnNpdHk7IGV4cHJlc3Npb24gaXNcbiAgICAgICAgICAvLyB1bmV2ZW4sIHNvIGEgZGVuc2UgdmlldyBjYW4gaG9sZCBmYXIgbW9yZS4gUmF0aGVyIHRoYW4gY3V0IHRoZSBleGNlc3Mgb2ZmLCBzaG93XG4gICAgICAgICAgLy8gaXQgZ3JvdXBlZCDigJQgdGhlIGJpbiBsZXZlbCB0aGUgcGxhbm5lciB3b3VsZCBwaWNrIGlmIGl0IGhhZCBrbm93bi5cbiAgICAgICAgICBjb25zdCBjYXAgPSBNYXRoLm1heCh2aWV3LnRyYW5zY3JpcHRCdWRnZXQgKiAxLjUsIDEpO1xuICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGdvdC5yZWR1Y2UoKG4sIHQpID0+IG4gKyB0LmNvdW50LCAwKTtcbiAgICAgICAgICBpZiAobG9hZGVkID4gY2FwICYmIGJpbnMgJiYgdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRCaW5zKSB7XG4gICAgICAgICAgICBjb25zdCBmYWxsYmFjayA9IGFsbEdlbmVzUGxhbih7XG4gICAgICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgICAgIGJvdW5kcyxcbiAgICAgICAgICAgICAgcHhQZXJVbml0LFxuICAgICAgICAgICAgICBidWRnZXQ6IHZpZXcudHJhbnNjcmlwdEJ1ZGdldCxcbiAgICAgICAgICAgICAgdG90YWw6IGJpbnMuY291bnQsXG4gICAgICAgICAgICAgIGxldmVsczogYmlucy5sZXZlbHMsXG4gICAgICAgICAgICAgIGNhbkluZGl2aWR1YWw6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZmFsbGJhY2sua2luZCA9PT0gJ2JpbnMnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGpvYiA9IHRoaXMuYmluc0pvYih2aWV3LCByZWN0LCBweFBlclVuaXQsIGJvdW5kcywgYmlucywgZmFsbGJhY2subGV2ZWwpO1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgam9iLmxvYWQoY3R4KSksIGtpbmQ6IGpvYi5raW5kLCBiaW46IGpvYi5iaW4gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VUcmFuc2NyaXB0VGlsZXMoZ290LCBjYXApO1xuICAgICAgICAgIC8vIE9uZSB0cmFuc2NyaXB0IHBlciBlbnRyeTogZXZlcnkgbWFya2VyIGlzIHRoZSBzYW1lIHNpemUuXG4gICAgICAgICAgY29uc3QgcHggPSBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZC5jb3VudCkuZmlsbCh0cmFuc2NyaXB0TWFya2VyUHgoMSwgdmlldy50cmFuc2NyaXB0U2NhbGUsIHB4UGVyTWljcm9uKSk7XG4gICAgICAgICAgcmV0dXJuIHsgbWVyZ2VkLCBweCB9O1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocGxhbi5raW5kID09PSAnYmlucycgJiYgYmlucyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEJpbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmJpbnNKb2IodmlldywgcmVjdCwgcHhQZXJVbml0LCBib3VuZHMsIGJpbnMsIHBsYW4ubGV2ZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBCaW5zIG9mIHRoZSBhbGwtZ2VuZSBweXJhbWlkIGF0IGBsZXZlbGAsIHNpemVkIGJ5IGhvdyBtYW55IHRyYW5zY3JpcHRzIGVhY2ggaG9sZHMuICovXG4gIHByaXZhdGUgYmluc0pvYihcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHJlY3Q6IERhdGFSZWN0LFxuICAgIHB4UGVyVW5pdDogbnVtYmVyLFxuICAgIGJvdW5kczogU3BhdGlhbEJvdW5kcyxcbiAgICBiaW5zOiBOb25OdWxsYWJsZTxTcGF0aWFsRGF0YXNldFsndHJhbnNjcmlwdEJpbnMnXT4sXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgKTogVHJhbnNjcmlwdEpvYiB7XG4gICAgY29uc3QgbHYgPSBiaW5zLmxldmVsc1tsZXZlbF07XG4gICAgY29uc3Qga2V5cyA9IHRpbGVzSW5SZWN0RnJvbShcbiAgICAgIGJpbnMub3JpZ2luLFxuICAgICAgcmVjdCxcbiAgICAgIGxldmVsLFxuICAgICAgYmlucy5sZXZlbHMubWFwKChsKSA9PiAoeyB0aWxlU2l6ZTogbC50aWxlU2l6ZSB9KSksXG4gICAgICBib3VuZHMsXG4gICAgICBNQVhfQklOX1RJTEVTLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdiaW5zJyxcbiAgICAgIGJpbjogeyBzaXplOiBsdi5iaW5TaXplLCBvcmlnaW46IGJpbnMub3JpZ2luIH0sXG4gICAgICBrZXk6IGBhbGx8Ymluc3wke2xldmVsfXwke3ZpZXcudHJhbnNjcmlwdEJ1ZGdldH18JHtrZXlzLm1hcCh0aWxlSWQpfWAsXG4gICAgICBsb2FkOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IGdvdCA9IGF3YWl0IGN0eC5mZXRjaEFsbChrZXlzLCAoaykgPT4gdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRCaW5zIShrLmxldmVsLCBrLmd4LCBrLmd5KSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVHJhbnNjcmlwdFRpbGVzKGdvdCwgTWF0aC5tYXgodmlldy50cmFuc2NyaXB0QnVkZ2V0ICogMS41LCAxKSk7XG4gICAgICAgIHJldHVybiB7IG1lcmdlZCwgcHg6IGdyb3VwZWRTaXplcyhtZXJnZWQud2VpZ2h0LCBsdi5iaW5TaXplICogcHhQZXJVbml0LCB2aWV3LnRyYW5zY3JpcHRTY2FsZSkgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdyb3VwIGEgZ2VuZSBzZWxlY3Rpb24gZm9yIHRoZSB6b29tOiBvbmUgbWFya2VyIHBlciBnZW5lLXRyZWUgY2x1c3RlciAoYSBnZW5lIGluIG5vXG4gKiBjbHVzdGVyIGlzIGl0cyBvd24pIHBlciBiaW4gb2YgdGhlIHB5cmFtaWQgbGFkZGVyLCBzdGFydGluZyBhdCB0aGUgZmluZXN0IGJpbiB3aG9zZVxuICogbWFya2VycyBhcmUgMTQgcHggYXBhcnQgYW5kIHN0ZXBwaW5nIHVwIHdoaWxlIHRoZSBtYXJrZXJzIHdvdWxkIGV4Y2VlZCB0aGUgYnVkZ2V0LlxuICogTnVsbCB0byBkcmF3IGV2ZXJ5IHRyYW5zY3JpcHQ6IHpvb21lZCBpbiwgd2l0aCB0aGUgc2VsZWN0aW9uIHdpdGhpbiB0aGUgYnVkZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBTZWxlY3Rpb24oXG4gIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgbGFkZGVyOiBOb25OdWxsYWJsZTxUcmFuc2NyaXB0TG9hZFsnbGFkZGVyJ10+LFxuICBweFBlclVuaXQ6IG51bWJlcixcbik6IHsgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IHB4OiBGbG9hdDMyQXJyYXk7IGJpbjogbnVtYmVyOyBncm91cDogSW50MzJBcnJheTsgbmFtZXM6IHN0cmluZ1tdIH0gfCBudWxsIHtcbiAgY29uc3QgYnVkZ2V0ID0gTWF0aC5tYXgoMSwgdmlldy50cmFuc2NyaXB0QnVkZ2V0KTtcbiAgY29uc3QgZ2VuZXMgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcztcbiAgY29uc3QgZ3JvdXBzID0gdmlldy50cmFuc2NyaXB0R2VuZUdyb3VwcztcbiAgY29uc3QgbmFtZXMgPSBbLi4uZ3JvdXBzLm1hcCgoZykgPT4gZy5uYW1lKSwgLi4uZ2VuZXNdO1xuICBjb25zdCBjbHVzdGVyT2YgPSBnZW5lcy5tYXAoKGdlbmUsIHNsb3QpID0+IHtcbiAgICBjb25zdCBnID0gZ3JvdXBzLmZpbmRJbmRleCgoeCkgPT4geC5nZW5lcy5pbmNsdWRlcyhnZW5lKSk7XG4gICAgcmV0dXJuIGcgPj0gMCA/IGcgOiBncm91cHMubGVuZ3RoICsgc2xvdDtcbiAgfSk7XG4gIGNvbnN0IGtleU9mID0gKHNsb3Q6IG51bWJlcikgPT4gY2x1c3Rlck9mW3Nsb3RdID8/IGdyb3Vwcy5sZW5ndGggKyBzbG90O1xuICBsZXQgYmluID0gbGFkZGVyLnN0YXJ0O1xuICBpZiAoYmluID09PSBudWxsKSB7XG4gICAgLy8gRXZlcnkgdHJhbnNjcmlwdCwgaWYgdGhleSBmaXQgdGhlIG1heCBhbmQgbm9uZSB3YXMgY3V0IG9mZiBhdCB0aGUgY2FwLlxuICAgIGlmICh0LmNvdW50IDw9IGJ1ZGdldCAmJiB0LmNvdW50IDwgTUFYX1RSQU5TQ1JJUFRTKSByZXR1cm4gbnVsbDtcbiAgICBiaW4gPSBsYWRkZXIuYmFzZUJpbjtcbiAgfVxuICBjb25zdCB0b3AgPSBsYWRkZXIuYmFzZUJpbiAqIDIgKiogKGxhZGRlci5sZXZlbHMgLSAxKTtcbiAgbGV0IGdyb3VwZWQgPSBncm91cFRyYW5zY3JpcHRzKHQsIGJpbiwga2V5T2YpO1xuICAvLyBPdmVyIHRoZSBtYXg6IGNvbWJpbmUgaW50byBsYXJnZXIgbWFya2VycywgYSBsZXZlbCBhdCBhIHRpbWUuXG4gIHdoaWxlIChncm91cGVkLnRpbGUuY291bnQgPiBidWRnZXQgJiYgYmluIDwgdG9wKSB7XG4gICAgYmluICo9IDI7XG4gICAgZ3JvdXBlZCA9IGdyb3VwVHJhbnNjcmlwdHModCwgYmluLCBrZXlPZik7XG4gIH1cbiAgY29uc3QgcHggPSBncm91cGVkU2l6ZXMoZ3JvdXBlZC50aWxlLndlaWdodCwgYmluICogcHhQZXJVbml0LCB2aWV3LnRyYW5zY3JpcHRTY2FsZSk7XG4gIHJldHVybiB7IG1lcmdlZDogZ3JvdXBlZC50aWxlLCBweCwgYmluLCBncm91cDogZ3JvdXBlZC5ncm91cCwgbmFtZXMgfTtcbn1cblxuLyoqIFNjcmVlbiBzaXplcyBvZiBncm91cGVkIG1hcmtlcnM6IGJ5IHdlaWdodCBhZ2FpbnN0IHRoZSA5NXRoLXBlcmNlbnRpbGUgd2VpZ2h0LCBvdmVyIGBiaW5QeGAuICovXG5mdW5jdGlvbiBncm91cGVkU2l6ZXMod2VpZ2h0OiBVaW50MzJBcnJheSwgYmluUHg6IG51bWJlciwgc2NhbGU6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IHJlZkNvdW50ID0gcXVhbnRpbGVPZih3ZWlnaHQsIDAuOTUpO1xuICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20od2VpZ2h0LCAodykgPT4gZ3JvdXBlZE1hcmtlclB4KHcsIHJlZkNvdW50LCBiaW5QeCwgc2NhbGUpKTtcbn1cblxuLyoqIFdoYXQgYSBnZW5lIHNlbGVjdGlvbidzIGpvYiBmZXRjaGVzIGFuZCBjbGlwcyB0bzogdGhlIHZpZXcgYW5kIGEgcXVhcnRlci12aWV3IG1hcmdpbiBlYWNoIHNpZGUsXG4gKiAgc28gYSBzbWFsbCBwYW4gbmVlZHMgbm90aGluZyBuZXcuICovXG5pbnRlcmZhY2UgQ2xpcFdpbmRvdyB7XG4gIGFyb3VuZDogRGF0YVJlY3Q7XG4gIC8qKiBUaGUgd2luZG93IGluIHF1YXJ0ZXItdmlldyBzdGVwcywgZm9yIGEgam9iIGtleTogYSBwYW4gcGFzdCB0aGUgbWFyZ2luIHJlLWNsaXBzLiAqL1xuICBrZXk6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gY2xpcFdpbmRvdyhyZWN0OiBEYXRhUmVjdCk6IENsaXBXaW5kb3cge1xuICBjb25zdCBteCA9IChyZWN0LngxIC0gcmVjdC54MCkgKiAwLjI1O1xuICBjb25zdCBteSA9IChyZWN0LnkxIC0gcmVjdC55MCkgKiAwLjI1O1xuICByZXR1cm4ge1xuICAgIGFyb3VuZDogeyB4MDogcmVjdC54MCAtIG14LCB5MDogcmVjdC55MCAtIG15LCB4MTogcmVjdC54MSArIG14LCB5MTogcmVjdC55MSArIG15IH0sXG4gICAga2V5OiBgJHtNYXRoLmZsb29yKHJlY3QueDAgLyAobXggfHwgMSkpfSwke01hdGguZmxvb3IocmVjdC55MCAvIChteSB8fCAxKSl9YCxcbiAgfTtcbn1cblxuLyoqIFBoeXNpY2FsIG1hcmtlciBzaXplIG5lZWRzIMK1bTsgdW5kZWZpbmVkIHdoZW4gdGhlIGRhdGFzZXQncyB1bml0IGlzIHVua25vd24uICovXG5mdW5jdGlvbiBweFBlck1pY3Jvbk9mKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCBweFBlclVuaXQ6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0ID8gcHhQZXJVbml0IC8gZGF0YXNldC5taWNyb25zUGVyVW5pdCA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -5,7 +5,8 @@ import { DEFAULT_CATEGORICAL_PALETTE, parseHex, resolveCategoryColors } from '..
5
5
  import { cellTypeColumnFor } from '../../../spatial/lod';
6
6
  import { clusterColorMap } from '../../../spatial/transcript-grouping';
7
7
  import { defaultGlyphFor } from '../../../spatial/glyphs';
8
- import { filterTranscripts, hiddenGeneSlots, median } from '../../../spatial/spatial-tile-merge';
8
+ import { filterTranscripts, hiddenAllGeneCodes, hiddenGeneSlots, median, } from '../../../spatial/spatial-tile-merge';
9
+ import { geneFilterKey, hasGeneFilter } from '../../../spatial/spatial-gene-filter';
9
10
  import { groupSelection } from './transcript-jobs';
10
11
  /** Icons get a dark rim only while there are at most this many, at least this big (px). */
11
12
  const GLYPH_OUTLINE_MAX = 20_000;
@@ -50,20 +51,27 @@ function transcriptPlanKey(dataset, view, job, pxPerUnit) {
50
51
  JSON.stringify(view.transcriptGlyphs),
51
52
  pxPerUnit.toPrecision(4),
52
53
  view.hiddenGroups.join('\u0001'),
54
+ geneFilterKey(view),
53
55
  view.transcriptHiddenGenes.join(','),
56
+ view.transcriptAllGenesHidden.join(','),
54
57
  JSON.stringify(view.transcriptGeneColors),
55
58
  JSON.stringify(view.transcriptGeneGroups),
56
59
  ].join('|');
57
60
  }
58
61
  /** The view the markers are coloured by, for what was loaded. */
59
- function colorViewFor(view, kind, clustered) {
62
+ export function colorViewFor(view, kind, clustered, hasCellTypes) {
60
63
  // A bin of the all-gene pyramid mixes genes and carries none, so it cannot be coloured
61
- // by gene: colour it by its dominant cell's type until individual transcripts show.
64
+ // by gene: colour it by its dominant cell's type until individual transcripts show (with
65
+ // no cell types, that leaves every bin unassigned: one colour).
62
66
  if (kind === 'bins' && view.transcriptColorBy !== 'cellType')
63
67
  return { ...view, transcriptColorBy: 'cellType' };
64
68
  // Density-grid markers have no cell to take a type from: they take their cluster's colour.
65
69
  if (clustered && view.transcriptColorBy === 'cellType')
66
70
  return { ...view, transcriptColorBy: 'cluster' };
71
+ // No cell types to colour by (the panel then does not offer it): by gene instead.
72
+ if (!hasCellTypes && kind !== 'bins' && view.transcriptColorBy === 'cellType') {
73
+ return { ...view, transcriptColorBy: 'gene' };
74
+ }
67
75
  return view;
68
76
  }
69
77
  const UNASSIGNED_RGBA = [0.62, 0.62, 0.62, 0.55];
@@ -127,20 +135,38 @@ export class TranscriptLayers {
127
135
  const loaded = await ctx.track('Transcripts', job.load(ctx));
128
136
  if (ctx.stale())
129
137
  return;
138
+ // Markers drawn from summed density grids (zoomed out) carry no cells, so they cannot follow
139
+ // the observation gene filter: drawn, they would show the transcripts of the cells it hides.
140
+ // None while it is on; zoomed in, the cell-assigned transcripts are filtered (below).
141
+ if (loaded.clustered && hasGeneFilter(view)) {
142
+ this.groups.drop('transcripts');
143
+ this.hover.clear();
144
+ this.countSource = null;
145
+ return;
146
+ }
130
147
  // Per-gene counts in view come from what was loaded, before hidden genes are dropped:
131
148
  // a hidden gene still has transcripts there. Summed density grids (no per-gene levels,
132
149
  // zoomed out) hold clusters, not genes: no per-gene counts there, rather than a guess.
150
+ // Every gene's individual transcripts are counted by the dataset's gene list, when it has one.
151
+ const allGeneNames = dataset.transcriptTiles?.genes;
152
+ const kind = loaded.kind ?? job.kind;
133
153
  this.countSource =
134
- (loaded.kind ?? job.kind) === 'genes' && !loaded.clustered
154
+ kind === 'genes' && !loaded.clustered
135
155
  ? { merged: loaded.merged, genes: [...view.transcriptGenes] }
136
- : null;
156
+ : kind === 'individual' && allGeneNames
157
+ ? { merged: loaded.merged, genes: allGeneNames }
158
+ : null;
137
159
  const hidden = await this.lookup.hiddenCodes(dataset, view);
138
160
  if (ctx.stale())
139
161
  return;
140
162
  // Density-grid markers carry no cells and were built from the visible genes only.
141
163
  const filtered = loaded.clustered
142
164
  ? { merged: loaded.merged, px: loaded.px }
143
- : filterTranscripts(loaded.merged, loaded.px, hidden, (loaded.kind ?? job.kind) === 'genes' ? hiddenGeneSlots(view) : null);
165
+ : filterTranscripts(loaded.merged, loaded.px, hidden, kind === 'genes'
166
+ ? hiddenGeneSlots(view)
167
+ : kind === 'individual'
168
+ ? hiddenAllGeneCodes(view, allGeneNames)
169
+ : null);
144
170
  let { merged, px } = filtered;
145
171
  let selectionBin = loaded.clustered?.bin ?? null;
146
172
  let entryGroup = loaded.clustered?.group ?? null;
@@ -150,8 +176,7 @@ export class TranscriptLayers {
150
176
  if (g)
151
177
  ({ merged, px, bin: selectionBin, group: entryGroup, names: groupNames } = g);
152
178
  }
153
- const kind = loaded.kind ?? job.kind;
154
- const colorView = colorViewFor(view, kind, !!loaded.clustered);
179
+ const colorView = colorViewFor(view, kind, !!loaded.clustered, cellTypeColumnFor(dataset, view) !== null);
155
180
  // Each entry's cluster: its marker's group, or the gene-tree group its gene is in.
156
181
  const geneCluster = view.transcriptGenes.map((g) => view.transcriptGeneGroups.find((x) => x.genes.includes(g))?.name ?? g);
157
182
  const clusterOf = (i) => entryGroup && groupNames ? (groupNames[entryGroup[i]] ?? null) : (geneCluster[merged.gene[i]] ?? null);
@@ -175,7 +200,7 @@ export class TranscriptLayers {
175
200
  this.drawTranscripts(merged, diam, rgba, view, place, null, 0.18 * median(diam))
176
201
  : this.drawTranscriptGlyphs(merged, diam, rgba, view, place, pxPerUnit);
177
202
  this.hover.setDrawn({
178
- kind: loaded.kind ?? job.kind,
203
+ kind,
179
204
  bin: selectionBin
180
205
  ? { size: selectionBin, origin: loaded.clustered?.origin ?? [0, 0] }
181
206
  : loaded.kind
@@ -183,7 +208,7 @@ export class TranscriptLayers {
183
208
  : job.bin,
184
209
  merged,
185
210
  layer,
186
- genes: [...view.transcriptGenes],
211
+ genes: kind === 'individual' ? (allGeneNames ?? []) : [...view.transcriptGenes],
187
212
  ...(entryGroup && groupNames ? { entryGroup, groupNames } : {}),
188
213
  ...(loaded.clustered ? { groupGenes: loaded.clustered.genes } : {}),
189
214
  }, dataset.micronsPerUnit ?? null);
@@ -276,11 +301,13 @@ export class TranscriptLayers {
276
301
  codeOf = (i) => code[i];
277
302
  }
278
303
  else if (view.transcriptColorBy === 'gene' || view.transcriptColorBy === 'cluster') {
279
- // All genes: codes are the dataset's gene indices, folded onto the palette.
280
- const n = view.transcriptAllGenes ? DEFAULT_CATEGORICAL_PALETTE.length : view.transcriptGenes.length;
281
- rgb = Array.from({ length: n }, (_g, i) => parseHex((!view.transcriptAllGenes && view.transcriptGeneColors[view.transcriptGenes[i]]) ||
304
+ // All genes: codes are the dataset's gene indices, coloured by name when the dataset
305
+ // lists them (so a gene's chosen colour applies), else folded onto the palette.
306
+ const names = view.transcriptAllGenes ? (dataset.transcriptTiles?.genes ?? null) : view.transcriptGenes;
307
+ const n = names ? names.length : DEFAULT_CATEGORICAL_PALETTE.length;
308
+ rgb = Array.from({ length: n }, (_g, i) => parseHex((names && view.transcriptGeneColors[names[i]]) ||
282
309
  DEFAULT_CATEGORICAL_PALETTE[i % DEFAULT_CATEGORICAL_PALETTE.length]));
283
- codeOf = view.transcriptAllGenes ? (i) => t.gene[i] % n : (i) => t.gene[i];
310
+ codeOf = names ? (i) => (t.gene[i] < n ? t.gene[i] : -1) : (i) => t.gene[i] % n;
284
311
  }
285
312
  else {
286
313
  const name = cellTypeColumnFor(dataset, view);
@@ -303,4 +330,4 @@ export class TranscriptLayers {
303
330
  return rgba;
304
331
  }
305
332
  }
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1sYXllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvc3BhdGlhbC10aWxlcy90cmFuc2NyaXB0LWxheWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FHZixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqSCxPQUFPLEVBQVksaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFtQixlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBS2pHLE9BQU8sRUFBaUQsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEcsMkZBQTJGO0FBQzNGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRS9CLGdDQUFnQztBQUNoQyxNQUFNLFNBQVMsR0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWhEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQW1EO0lBQzNFLE1BQU0sRUFBRSxNQUFNO0lBQ2QsSUFBSSxFQUFFLE1BQU07SUFDWixRQUFRLEVBQUUsYUFBYTtJQUN2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QUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb2ludFN5bWJvbENvZGUgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBQb2ludFN5bWJvbCwgUG9pbnRzTGF5ZXIsIFJHQkEgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgdHlwZSB7IFJnYiB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgQUxMX0dFTkVTIH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIE5PX0NBVEVHT1JZLFxuICBOT19PQlNFUlZBVElPTixcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbn0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUsIHBhcnNlSGV4LCByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMgfSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgRGF0YVJlY3QsIGNlbGxUeXBlQ29sdW1uRm9yIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHsgY2x1c3RlckNvbG9yTWFwIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC90cmFuc2NyaXB0LWdyb3VwaW5nJztcbmltcG9ydCB7IFRyYW5zY3JpcHRHbHlwaCwgZGVmYXVsdEdseXBoRm9yIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9nbHlwaHMnO1xuaW1wb3J0IHsgZmlsdGVyVHJhbnNjcmlwdHMsIGhpZGRlbkdlbmVTbG90cywgbWVkaWFuIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGUtbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yaWNhbExvb2t1cCB9IGZyb20gJy4vY2F0ZWdvcmljYWwtbG9va3VwJztcbmltcG9ydCB0eXBlIHsgT3JkZXJlZExheWVyR3JvdXBzLCBUaWxlR3JvdXAgfSBmcm9tICcuL2xheWVyLWdyb3Vwcyc7XG5pbXBvcnQgdHlwZSB7IFBsYW5Db250ZXh0IH0gZnJvbSAnLi9wbGFuLWNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2NyaXB0SG92ZXIsIFRyYW5zY3JpcHRLaW5kIH0gZnJvbSAnLi90cmFuc2NyaXB0LWhvdmVyJztcbmltcG9ydCB7IHR5cGUgVHJhbnNjcmlwdEpvYiwgdHlwZSBUcmFuc2NyaXB0Sm9iUGxhbm5lciwgZ3JvdXBTZWxlY3Rpb24gfSBmcm9tICcuL3RyYW5zY3JpcHQtam9icyc7XG5cbi8qKiBJY29ucyBnZXQgYSBkYXJrIHJpbSBvbmx5IHdoaWxlIHRoZXJlIGFyZSBhdCBtb3N0IHRoaXMgbWFueSwgYXQgbGVhc3QgdGhpcyBiaWcgKHB4KS4gKi9cbmNvbnN0IEdMWVBIX09VVExJTkVfTUFYID0gMjBfMDAwO1xuY29uc3QgR0xZUEhfT1VUTElORV9NSU5fUFggPSA4O1xuXG4vKiogVGhlIGRhcmsgcmltIG9mIGEgbWFya2VyLiAqL1xuY29uc3QgUklNX0NPTE9SOiBSR0JBID0gWzAuMDQsIDAuMDQsIDAuMDUsIDAuOV07XG5cbi8qKlxuICogVGhlIG5hcGFyaS1qcyBwb2ludCBzeW1ib2wgZWFjaCB0cmFuc2NyaXB0IGljb24gaXMgZHJhd24gYXMuIEV2ZXJ5IGljb24gaGFzIGEgY291bnRlcnBhcnQgb2ZcbiAqIHRoZSBzYW1lIG91dGxpbmUgKGBjaXJjbGVgIGlzIG5hcGFyaSdzIGBkaXNjYCk7IHNlZSB7QGxpbmsgR0xZUEhfU0laRX0gZm9yIHRoZSBvbmUgd2hvc2Ugc2l6ZVxuICogZGlmZmVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IEdMWVBIX1NZTUJPTFM6IFJlYWRvbmx5PFJlY29yZDxUcmFuc2NyaXB0R2x5cGgsIFBvaW50U3ltYm9sPj4gPSB7XG4gIGNpcmNsZTogJ2Rpc2MnLFxuICBzdGFyOiAnc3RhcicsXG4gIHRyaWFuZ2xlOiAndHJpYW5nbGVfdXAnLFxuICBzcXVhcmU6ICdzcXVhcmUnLFxuICBkaWFtb25kOiAnZGlhbW9uZCcsXG4gIGNyb3NzOiAnY3Jvc3MnLFxuICBoZXhhZ29uOiAnaGV4YWdvbicsXG4gICd0cmlhbmdsZS1kb3duJzogJ3RyaWFuZ2xlX2Rvd24nLFxuICBwZW50YWdvbjogJ3BlbnRhZ29uJyxcbiAgeDogJ3gnLFxufTtcblxuLyoqXG4gKiBNYXJrZXIgZGlhbWV0ZXIgcGVyIGljb24sIGFzIGEgZnJhY3Rpb24gb2YgdGhlIGVudHJ5J3M6IG5hcGFyaSdzIGBzcXVhcmVgIGZpbGxzIHRoZSBtYXJrZXInc1xuICogd2hvbGUgYm94LCB3aGVyZSB0aGUgaWNvbiBpdCByZXBsYWNlcyBoYWQgYSAwLjggaGFsZi1zaWRlLCBhcyBoZWF2eSBhcyB0aGUgb3RoZXIgaWNvbnMuXG4gKi9cbmNvbnN0IEdMWVBIX1NJWkU6IFJlYWRvbmx5PFBhcnRpYWw8UmVjb3JkPFRyYW5zY3JpcHRHbHlwaCwgbnVtYmVyPj4+ID0geyBzcXVhcmU6IDAuOCB9O1xuXG4vKipcbiAqIFdoYXQgYSB0cmFuc2NyaXB0IHBsYW4gZHJhd3MsIGFzIGEga2V5OiBhbiB1bmNoYW5nZWQgb25lIGlzIGEgbm8tb3AuIE1hcmtlciBzaXplcyBmb2xsb3cgdGhlXG4gKiB6b29tLCBzbyB0aGUgem9vbSBpcyBwYXJ0IG9mIGl0OyBhIHBhbiB0aGF0IGtlZXBzIHRoZSBzYW1lIHRpbGVzIG9uIHNjcmVlbiBjaGFuZ2VzIG5vdGhpbmcuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zY3JpcHRQbGFuS2V5KFxuICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgam9iOiBUcmFuc2NyaXB0Sm9iLFxuICBweFBlclVuaXQ6IG51bWJlcixcbik6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgZGF0YXNldC5pZCxcbiAgICB2aWV3LnRyYW5zY3JpcHRNb2RlLFxuICAgIGpvYi5rZXksXG4gICAgdmlldy50cmFuc2NyaXB0Q29sb3JCeSxcbiAgICBjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KSxcbiAgICB2aWV3LnRyYW5zY3JpcHRTY2FsZSxcbiAgICB2aWV3LnRyYW5zY3JpcHRPcGFjaXR5LFxuICAgIEpTT04uc3RyaW5naWZ5KHZpZXcudHJhbnNjcmlwdEdseXBocyksXG4gICAgcHhQZXJVbml0LnRvUHJlY2lzaW9uKDQpLFxuICAgIHZpZXcuaGlkZGVuR3JvdXBzLmpvaW4oJ1xcdTAwMDEnKSxcbiAgICB2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5qb2luKCcsJyksXG4gICAgSlNPTi5zdHJpbmdpZnkodmlldy50cmFuc2NyaXB0R2VuZUNvbG9ycyksXG4gICAgSlNPTi5zdHJpbmdpZnkodmlldy50cmFuc2NyaXB0R2VuZUdyb3VwcyksXG4gIF0uam9pbignfCcpO1xufVxuXG4vKiogVGhlIHZpZXcgdGhlIG1hcmtlcnMgYXJlIGNvbG91cmVkIGJ5LCBmb3Igd2hhdCB3YXMgbG9hZGVkLiAqL1xuZnVuY3Rpb24gY29sb3JWaWV3Rm9yKHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIGtpbmQ6IFRyYW5zY3JpcHRLaW5kLCBjbHVzdGVyZWQ6IGJvb2xlYW4pOiBTcGF0aWFsVmlld1N0YXRlIHtcbiAgLy8gQSBiaW4gb2YgdGhlIGFsbC1nZW5lIHB5cmFtaWQgbWl4ZXMgZ2VuZXMgYW5kIGNhcnJpZXMgbm9uZSwgc28gaXQgY2Fubm90IGJlIGNvbG91cmVkXG4gIC8vIGJ5IGdlbmU6IGNvbG91ciBpdCBieSBpdHMgZG9taW5hbnQgY2VsbCdzIHR5cGUgdW50aWwgaW5kaXZpZHVhbCB0cmFuc2NyaXB0cyBzaG93LlxuICBpZiAoa2luZCA9PT0gJ2JpbnMnICYmIHZpZXcudHJhbnNjcmlwdENvbG9yQnkgIT09ICdjZWxsVHlwZScpIHJldHVybiB7IC4uLnZpZXcsIHRyYW5zY3JpcHRDb2xvckJ5OiAnY2VsbFR5cGUnIH07XG4gIC8vIERlbnNpdHktZ3JpZCBtYXJrZXJzIGhhdmUgbm8gY2VsbCB0byB0YWtlIGEgdHlwZSBmcm9tOiB0aGV5IHRha2UgdGhlaXIgY2x1c3RlcidzIGNvbG91ci5cbiAgaWYgKGNsdXN0ZXJlZCAmJiB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2VsbFR5cGUnKSByZXR1cm4geyAuLi52aWV3LCB0cmFuc2NyaXB0Q29sb3JCeTogJ2NsdXN0ZXInIH07XG4gIHJldHVybiB2aWV3O1xufVxuXG4vKiogV2hlcmUgYSBsYXllciBzaXRzIGluIHdvcmxkIHNwYWNlOiB0aGUgZGF0YXNldCdzIGFmZmluZSBvbnRvIGl0cyB0aXNzdWUgaW1hZ2UuICovXG5pbnRlcmZhY2UgUGxhY2VtZW50IHtcbiAgc2NhbGU6IFtudW1iZXIsIG51bWJlcl07XG4gIHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXTtcbn1cblxuY29uc3QgVU5BU1NJR05FRF9SR0JBOiBSR0JBID0gWzAuNjIsIDAuNjIsIDAuNjIsIDAuNTVdO1xuXG4vKipcbiAqIFRoZSB0cmFuc2NyaXB0IG1hcmtlcnMgb2YgdGhlIDJEIHNwYXRpYWwgdmlldzogcnVucyB0aGUgcGxhbm5lcidzIGpvYiwgZHJvcHMgaGlkZGVuIGdyb3Vwc1xuICogYW5kIGdlbmVzLCBncm91cHMgYSBzZWxlY3Rpb24gdW5kZXIgdGhlIG1hcmtlciBidWRnZXQsIGNvbG91cnMgdGhlIGVudHJpZXMgYW5kIGRyYXdzIHRoZW0gYXNcbiAqIG9uZSBwb2ludHMgbGF5ZXI6IHNpemVkIGNpcmNsZXMsIG9yIGdlbmUgaWNvbnMgYXMgcGVyLXBvaW50IHN5bWJvbHMgKHdpdGggYSBkYXJrIHJpbSB3aGlsZVxuICogdGhlcmUgYXJlIGZldyBlbm91Z2gpLlxuICpcbiAqIEhhbmRzIHdoYXQgaXQgZHJldyB0byB0aGUgaG92ZXIgb25lIHdheSAoe0BsaW5rIFRyYW5zY3JpcHRIb3Zlci5zZXREcmF3bn0pLCBhbmQga2VlcHMgdGhlXG4gKiBsb2FkZWQgcGVyLWdlbmUgdHJhbnNjcmlwdHMgdGhlIGluLXZpZXcgZ2VuZSBjb3VudHMgYXJlIHRha2VuIGZyb20uXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2NyaXB0TGF5ZXJzIHtcbiAgLyoqIFRoZSBsb2FkZWQgcGVyLWdlbmUgdHJhbnNjcmlwdHMgdGhlIGluLXZpZXcgY291bnRzIGFyZSB0YWtlbiBmcm9tLiAqL1xuICBwcml2YXRlIGNvdW50U291cmNlOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBnZW5lczogc3RyaW5nW10gfSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBzOiBPcmRlcmVkTGF5ZXJHcm91cHM8VGlsZUdyb3VwPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpvYnM6IFRyYW5zY3JpcHRKb2JQbGFubmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9va3VwOiBDYXRlZ29yaWNhbExvb2t1cCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvdmVyOiBUcmFuc2NyaXB0SG92ZXIsXG4gICkge31cblxuICAvKipcbiAgICogVHJhbnNjcmlwdHMgb2YgZWFjaCBzZWxlY3RlZCBnZW5lIGluc2lkZSBgcmVjdGA6IGVhY2ggZW50cnkgY291bnRzIGZvciB0aGUgdHJhbnNjcmlwdHMgaXRcbiAgICogc3RhbmRzIGZvciAoYW4gYWdncmVnYXRlIGF0IGEgY29hcnNlIGxldmVsIGhvbGRzIHNldmVyYWwpLiBOdWxsIHdpdGhvdXQgcGVyLWdlbmUgZGF0YS5cbiAgICovXG4gIGdlbmVDb3VudHNJbihyZWN0OiBEYXRhUmVjdCk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmNvdW50U291cmNlO1xuICAgIGlmICghc3JjKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGcgb2Ygc3JjLmdlbmVzKSBvdXRbZ10gPSAwO1xuICAgIGNvbnN0IHsgeCwgeSwgd2VpZ2h0LCBnZW5lIH0gPSBzcmMubWVyZ2VkO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLm1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBpZiAoeFtpXSA8IHJlY3QueDAgfHwgeFtpXSA+IHJlY3QueDEgfHwgeVtpXSA8IHJlY3QueTAgfHwgeVtpXSA+IHJlY3QueTEpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmFtZSA9IHNyYy5nZW5lc1tnZW5lW2ldXTtcbiAgICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIG91dFtuYW1lXSArPSB3ZWlnaHRbaV07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogVGhlIHZpZXdlciB3ZW50IGF3YXk6IG5vIGNvdW50cyB1bnRpbCB0aGUgbmV4dCBwbGFuLiAqL1xuICBkZXRhY2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50U291cmNlID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcmF3IHRoZSB2aWV3J3MgdHJhbnNjcmlwdCBtYXJrZXJzIChvciBkcm9wIHRoZW0pOyBhbiB1bmNoYW5nZWQgcGxhbiBrZXkgaXMgYSBuby1vcC4gKi9cbiAgYXN5bmMgcGxhbihcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHJlY3Q6IERhdGFSZWN0LFxuICAgIHB4UGVyVW5pdDogbnVtYmVyLFxuICAgIGN0eDogUGxhbkNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vZGUgPSB2aWV3LnRyYW5zY3JpcHRNb2RlO1xuICAgIGNvbnN0IGpvYiA9IHRoaXMuam9icy5qb2JGb3IoZGF0YXNldCwgdmlldywgcmVjdCwgcHhQZXJVbml0KTtcbiAgICBpZiAoIWpvYikge1xuICAgICAgdGhpcy5ncm91cHMuZHJvcCgndHJhbnNjcmlwdHMnKTtcbiAgICAgIHRoaXMuaG92ZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuY291bnRTb3VyY2UgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwbGFuS2V5ID0gdHJhbnNjcmlwdFBsYW5LZXkoZGF0YXNldCwgdmlldywgam9iLCBweFBlclVuaXQpO1xuICAgIGlmIChwbGFuS2V5ID09PSB0aGlzLmdyb3Vwcy5rZXkoJ3RyYW5zY3JpcHRzJykgJiYgdGhpcy5ncm91cHMuc2hvd24oJ3RyYW5zY3JpcHRzJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgY3R4LnRyYWNrKCdUcmFuc2NyaXB0cycsIGpvYi5sb2FkKGN0eCkpO1xuICAgIGlmIChjdHguc3RhbGUoKSkgcmV0dXJuO1xuICAgIC8vIFBlci1nZW5lIGNvdW50cyBpbiB2aWV3IGNvbWUgZnJvbSB3aGF0IHdhcyBsb2FkZWQsIGJlZm9yZSBoaWRkZW4gZ2VuZXMgYXJlIGRyb3BwZWQ6XG4gICAgLy8gYSBoaWRkZW4gZ2VuZSBzdGlsbCBoYXMgdHJhbnNjcmlwdHMgdGhlcmUuIFN1bW1lZCBkZW5zaXR5IGdyaWRzIChubyBwZXItZ2VuZSBsZXZlbHMsXG4gICAgLy8gem9vbWVkIG91dCkgaG9sZCBjbHVzdGVycywgbm90IGdlbmVzOiBubyBwZXItZ2VuZSBjb3VudHMgdGhlcmUsIHJhdGhlciB0aGFuIGEgZ3Vlc3MuXG4gICAgdGhpcy5jb3VudFNvdXJjZSA9XG4gICAgICAobG9hZGVkLmtpbmQgPz8gam9iLmtpbmQpID09PSAnZ2VuZXMnICYmICFsb2FkZWQuY2x1c3RlcmVkXG4gICAgICAgID8geyBtZXJnZWQ6IGxvYWRlZC5tZXJnZWQsIGdlbmVzOiBbLi4udmlldy50cmFuc2NyaXB0R2VuZXNdIH1cbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGhpZGRlbiA9IGF3YWl0IHRoaXMubG9va3VwLmhpZGRlbkNvZGVzKGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmIChjdHguc3RhbGUoKSkgcmV0dXJuO1xuICAgIC8vIERlbnNpdHktZ3JpZCBtYXJrZXJzIGNhcnJ5IG5vIGNlbGxzIGFuZCB3ZXJlIGJ1aWx0IGZyb20gdGhlIHZpc2libGUgZ2VuZXMgb25seS5cbiAgICBjb25zdCBmaWx0ZXJlZCA9IGxvYWRlZC5jbHVzdGVyZWRcbiAgICAgID8geyBtZXJnZWQ6IGxvYWRlZC5tZXJnZWQsIHB4OiBsb2FkZWQucHggfVxuICAgICAgOiBmaWx0ZXJUcmFuc2NyaXB0cyhcbiAgICAgICAgICBsb2FkZWQubWVyZ2VkLFxuICAgICAgICAgIGxvYWRlZC5weCxcbiAgICAgICAgICBoaWRkZW4sXG4gICAgICAgICAgKGxvYWRlZC5raW5kID8/IGpvYi5raW5kKSA9PT0gJ2dlbmVzJyA/IGhpZGRlbkdlbmVTbG90cyh2aWV3KSA6IG51bGwsXG4gICAgICAgICk7XG4gICAgbGV0IHsgbWVyZ2VkLCBweCB9ID0gZmlsdGVyZWQ7XG4gICAgbGV0IHNlbGVjdGlvbkJpbjogbnVtYmVyIHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/LmJpbiA/PyBudWxsO1xuICAgIGxldCBlbnRyeUdyb3VwOiBJbnQzMkFycmF5IHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/Lmdyb3VwID8/IG51bGw7XG4gICAgbGV0IGdyb3VwTmFtZXM6IHN0cmluZ1tdIHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/Lm5hbWVzID8/IG51bGw7XG4gICAgaWYgKGxvYWRlZC5sYWRkZXIpIHtcbiAgICAgIGNvbnN0IGcgPSBncm91cFNlbGVjdGlvbihtZXJnZWQsIHZpZXcsIGxvYWRlZC5sYWRkZXIsIHB4UGVyVW5pdCk7XG4gICAgICBpZiAoZykgKHsgbWVyZ2VkLCBweCwgYmluOiBzZWxlY3Rpb25CaW4sIGdyb3VwOiBlbnRyeUdyb3VwLCBuYW1lczogZ3JvdXBOYW1lcyB9ID0gZyk7XG4gICAgfVxuICAgIGNvbnN0IGtpbmQgPSBsb2FkZWQua2luZCA/PyBqb2Iua2luZDtcbiAgICBjb25zdCBjb2xvclZpZXcgPSBjb2xvclZpZXdGb3Iodmlldywga2luZCwgISFsb2FkZWQuY2x1c3RlcmVkKTtcbiAgICAvLyBFYWNoIGVudHJ5J3MgY2x1c3RlcjogaXRzIG1hcmtlcidzIGdyb3VwLCBvciB0aGUgZ2VuZS10cmVlIGdyb3VwIGl0cyBnZW5lIGlzIGluLlxuICAgIGNvbnN0IGdlbmVDbHVzdGVyID0gdmlldy50cmFuc2NyaXB0R2VuZXMubWFwKFxuICAgICAgKGcpID0+IHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMuZmluZCgoeCkgPT4geC5nZW5lcy5pbmNsdWRlcyhnKSk/Lm5hbWUgPz8gZyxcbiAgICApO1xuICAgIGNvbnN0IGNsdXN0ZXJPZiA9IChpOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsID0+XG4gICAgICBlbnRyeUdyb3VwICYmIGdyb3VwTmFtZXMgPyAoZ3JvdXBOYW1lc1tlbnRyeUdyb3VwW2ldXSA/PyBudWxsKSA6IChnZW5lQ2x1c3RlclttZXJnZWQuZ2VuZVtpXV0gPz8gbnVsbCk7XG4gICAgY29uc3QgcmdiYSA9IGF3YWl0IHRoaXMudHJhbnNjcmlwdENvbG9ycyhkYXRhc2V0LCBjb2xvclZpZXcsIG1lcmdlZCwga2luZCA9PT0gJ2dlbmVzJyA/IGNsdXN0ZXJPZiA6IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgIGNvbnN0IHR5cGVzID0gdHlwZUNvbHVtbiA/IGF3YWl0IHRoaXMubG9va3VwLmNvZGVzKHR5cGVDb2x1bW4pLmNhdGNoKCgpID0+IG51bGwpIDogbnVsbDtcbiAgICAvLyBOb3RoaW5nIGlzIHJlY29yZGVkIGJlZm9yZSB0aGUgbGFzdCBhd2FpdDogYSBzdXBlcnNlZGVkIHBsYW4gdGhhdCBoYWQgYWxyZWFkeSBrZXllZCB0aGVcbiAgICAvLyBncm91cCB3b3VsZCBtYWtlIHRoZSBuZXdlciBwbGFuIG9mIHRoZSBzYW1lIHZpZXcgdGFrZSB0aGUgb2xkIGxheWVyIGZvciBpdHMgb3duLlxuICAgIGlmIChjdHguc3RhbGUoKSkgcmV0dXJuO1xuXG4gICAgaWYgKGN0eC5pbmNvbXBsZXRlKSB0aGlzLmdyb3Vwcy5mb3JnZXRLZXkoJ3RyYW5zY3JpcHRzJyk7XG4gICAgZWxzZSB0aGlzLmdyb3Vwcy5zZXRLZXkoJ3RyYW5zY3JpcHRzJywgcGxhbktleSk7XG4gICAgY29uc3QgZGlhbSA9IHB4Lm1hcCgoZCkgPT4gZCAvIHB4UGVyVW5pdCk7XG4gICAgY29uc3QgcmVmID0gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBwbGFjZTogUGxhY2VtZW50ID0geyBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdIH07XG4gICAgY29uc3QgbGF5ZXIgPVxuICAgICAgbW9kZSA9PT0gJ2NpcmNsZXMnXG4gICAgICAgID8gLy8gQSBkYXJrIHJpbTogYSB0cmFuc2NyaXB0IGNvbG91cmVkIGJ5IGl0cyBjZWxsJ3MgdHlwZSBpcyBvdGhlcndpc2UgdGhlIHNhbWUgY29sb3VyIGFzXG4gICAgICAgICAgLy8gdGhlIGNlbGwgZmlsbCBpdCBzaXRzIG9uLCBhbmQgdmFuaXNoZXMgaW50byBpdC5cbiAgICAgICAgICB0aGlzLmRyYXdUcmFuc2NyaXB0cyhtZXJnZWQsIGRpYW0sIHJnYmEsIHZpZXcsIHBsYWNlLCBudWxsLCAwLjE4ICogbWVkaWFuKGRpYW0pKVxuICAgICAgICA6IHRoaXMuZHJhd1RyYW5zY3JpcHRHbHlwaHMobWVyZ2VkLCBkaWFtLCByZ2JhLCB2aWV3LCBwbGFjZSwgcHhQZXJVbml0KTtcbiAgICB0aGlzLmhvdmVyLnNldERyYXduKFxuICAgICAge1xuICAgICAgICBraW5kOiBsb2FkZWQua2luZCA/PyBqb2Iua2luZCxcbiAgICAgICAgYmluOiBzZWxlY3Rpb25CaW5cbiAgICAgICAgICA/IHsgc2l6ZTogc2VsZWN0aW9uQmluLCBvcmlnaW46IGxvYWRlZC5jbHVzdGVyZWQ/Lm9yaWdpbiA/PyBbMCwgMF0gfVxuICAgICAgICAgIDogbG9hZGVkLmtpbmRcbiAgICAgICAgICAgID8gbG9hZGVkLmJpblxuICAgICAgICAgICAgOiBqb2IuYmluLFxuICAgICAgICBtZXJnZWQsXG4gICAgICAgIGxheWVyLFxuICAgICAgICBnZW5lczogWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXSxcbiAgICAgICAgLi4uKGVudHJ5R3JvdXAgJiYgZ3JvdXBOYW1lcyA/IHsgZW50cnlHcm91cCwgZ3JvdXBOYW1lcyB9IDoge30pLFxuICAgICAgICAuLi4obG9hZGVkLmNsdXN0ZXJlZCA/IHsgZ3JvdXBHZW5lczogbG9hZGVkLmNsdXN0ZXJlZC5nZW5lcyB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIGRhdGFzZXQubWljcm9uc1BlclVuaXQgPz8gbnVsbCxcbiAgICApO1xuICAgIHRoaXMuaG92ZXIuc2V0VHlwZXModHlwZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmUgaWNvbnM6IGVhY2ggZW50cnkgZHJhd24gYXMgaXRzIGdlbmUncyBuYXBhcmktanMgcG9pbnQgc3ltYm9sLCBpbiB0aGUgc2FtZSBvbmUgcG9pbnRzXG4gICAqIGxheWVyIGFzIHRoZSBjaXJjbGVzLiBXaXRoIGV2ZXJ5IGdlbmUgZHJhd24gdGhlcmUgaXMgb25lIGljb24gZm9yIGFsbCBvZiB0aGVtIOKAlCAxOCwwMDBcbiAgICogc2hhcGVzIHdvdWxkIHNheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VHJhbnNjcmlwdEdseXBocyhcbiAgICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBkaWFtOiBGbG9hdDMyQXJyYXksXG4gICAgcmdiYTogRmxvYXQzMkFycmF5LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcGxhY2U6IFBsYWNlbWVudCxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgKTogUG9pbnRzTGF5ZXIge1xuICAgIGNvbnN0IGdlbmVzID0gdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgY29uc3QgZ2x5cGhGb3IgPSAoc2xvdDogbnVtYmVyKTogVHJhbnNjcmlwdEdseXBoID0+XG4gICAgICAodmlldy50cmFuc2NyaXB0R2x5cGhzW2dlbmVzW3Nsb3RdXSBhcyBUcmFuc2NyaXB0R2x5cGggfCB1bmRlZmluZWQpID8/IGRlZmF1bHRHbHlwaEZvcihzbG90KTtcbiAgICBjb25zdCBzaW5nbGUgPSB2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc1xuICAgICAgPyAoKHZpZXcudHJhbnNjcmlwdEdseXBoc1tBTExfR0VORVNdIGFzIFRyYW5zY3JpcHRHbHlwaCB8IHVuZGVmaW5lZCkgPz8gJ2NpcmNsZScpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2xvdHMgPSBzaW5nbGUgPyBbc2luZ2xlXSA6IGdlbmVzLm1hcCgoX2csIHNsb3QpID0+IGdseXBoRm9yKHNsb3QpKTtcbiAgICBjb25zdCBjb2RlcyA9IHNsb3RzLm1hcCgoZykgPT4gcG9pbnRTeW1ib2xDb2RlKEdMWVBIX1NZTUJPTFNbZ10pKTtcbiAgICBjb25zdCBzaXplcyA9IHNsb3RzLm1hcCgoZykgPT4gR0xZUEhfU0laRVtnXSA/PyAxKTtcbiAgICBjb25zdCBzeW1ib2xzID0gbmV3IFVpbnQ4QXJyYXkobWVyZ2VkLmNvdW50KTtcbiAgICBjb25zdCBzaXplID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBzaW5nbGUgPyAwIDogbWVyZ2VkLmdlbmVbaV07XG4gICAgICBzeW1ib2xzW2ldID0gY29kZXNbc2xvdF07XG4gICAgICBzaXplW2ldID0gZGlhbVtpXSAqIHNpemVzW3Nsb3RdO1xuICAgIH1cbiAgICAvLyBBIGRhcmsgcmltLCBvbmUgc2NyZWVuIHBpeGVsIHdpZGUsIGtlZXBzIGEgZmV3IGxhcmdlIGljb25zIHJlYWRhYmxlIG92ZXIgdGhlIHRpc3N1ZTsgb25cbiAgICAvLyBtYW55IHNtYWxsIG9uZXMgdGhlIHJpbXMgbWVyZ2UgaW50byBhIHNvbGlkIGRhcmsgc2hlZXQgdGhhdCBoaWRlcyBldmVyeSBjb2xvdXIsIHNvIHRoZXlcbiAgICAvLyBhcmUgbGVmdCBvZmYuXG4gICAgY29uc3QgbWVkaWFuUHggPSBtZWRpYW4oZGlhbSkgKiBweFBlclVuaXQ7XG4gICAgY29uc3QgcmltID0gbWVyZ2VkLmNvdW50ID4gR0xZUEhfT1VUTElORV9NQVggfHwgbWVkaWFuUHggPCBHTFlQSF9PVVRMSU5FX01JTl9QWCA/IDAgOiAxIC8gcHhQZXJVbml0O1xuICAgIHJldHVybiB0aGlzLmRyYXdUcmFuc2NyaXB0cyhtZXJnZWQsIHNpemUsIHJnYmEsIHZpZXcsIHBsYWNlLCBzeW1ib2xzLCByaW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbmUgdHJhbnNjcmlwdHMgbGF5ZXI6IGEgbWFya2VyIHBlciBlbnRyeSwgYHNpemVgIHNheWluZyBob3cgbWFueSB0cmFuc2NyaXB0cyBpdCBzdGFuZHNcbiAgICogZm9yLCBkcmF3biBhcyB0aGUgbGF5ZXIncyBkaXNjIG9yIGFzIGVhY2ggZW50cnkncyBgc3ltYm9sc2AgY29kZS5cbiAgICovXG4gIHByaXZhdGUgZHJhd1RyYW5zY3JpcHRzKFxuICAgIG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICAgIHNpemU6IEZsb2F0MzJBcnJheSxcbiAgICByZ2JhOiBGbG9hdDMyQXJyYXksXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICB7IHNjYWxlLCB0cmFuc2xhdGUgfTogUGxhY2VtZW50LFxuICAgIHN5bWJvbHM6IFVpbnQ4QXJyYXkgfCBudWxsLFxuICAgIGJvcmRlcldpZHRoOiBudW1iZXIsXG4gICk6IFBvaW50c0xheWVyIHtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZC5jb3VudCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIHBvc2l0aW9uc1syICogaV0gPSBtZXJnZWQueFtpXTtcbiAgICAgIHBvc2l0aW9uc1syICogaSArIDFdID0gbWVyZ2VkLnlbaV07XG4gICAgfVxuICAgIGNvbnN0IGxheWVyID0gdGhpcy5ncm91cHMudmlld2VyIS5hZGRQb2ludHMocG9zaXRpb25zLCB7XG4gICAgICBuYW1lOiAndHJhbnNjcmlwdHMnLFxuICAgICAgc2l6ZSxcbiAgICAgIGZhY2VDb2xvcjogcmdiYSxcbiAgICAgIGJvcmRlckNvbG9yOiBSSU1fQ09MT1IsXG4gICAgICBib3JkZXJXaWR0aCxcbiAgICAgIHN5bWJvbHMsXG4gICAgICBvcGFjaXR5OiB2aWV3LnRyYW5zY3JpcHRPcGFjaXR5LFxuICAgICAgc2NhbGUsXG4gICAgICB0cmFuc2xhdGUsXG4gICAgfSk7XG4gICAgdGhpcy5ncm91cHMucmVwbGFjZSgndHJhbnNjcmlwdHMnLCBsYXllcik7XG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgLyoqIFBlci1lbnRyeSBjb2xvdXJzLCBhcyBwYWNrZWQgUkdCQS4gKi9cbiAgcHJpdmF0ZSBhc3luYyB0cmFuc2NyaXB0Q29sb3JzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgdDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICAgIGNsdXN0ZXJPZj86IChpOiBudW1iZXIpID0+IHN0cmluZyB8IG51bGwsXG4gICk6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgbGV0IHJnYjogUmdiW107XG4gICAgbGV0IGNvZGVPZjogKGk6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIGlmICh2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2x1c3RlcicgJiYgY2x1c3Rlck9mKSB7XG4gICAgICAvLyBBIGNsdXN0ZXIgbmFtZWQgbGlrZSBhIGdyb3VwIG9mIHRoZSBjZWxscycgZ3JvdXBpbmcgdGFrZXMgdGhhdCBncm91cCdzIGNvbG91ciwgc28gYVxuICAgICAgLy8gY2x1c3RlcidzIHRyYW5zY3JpcHRzIGFuZCBpdHMgY2VsbHMgYWdyZWU7IGFueSBvdGhlciBjbHVzdGVyIHRha2VzIGEgcGFsZXR0ZSBjb2xvdXIuXG4gICAgICBjb25zdCBuYW1lID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgICBjb25zdCBjb2RlcyA9IG5hbWUgPyBhd2FpdCB0aGlzLmxvb2t1cC5jb2RlcyhuYW1lKS5jYXRjaCgoKSA9PiBudWxsKSA6IG51bGw7XG4gICAgICBjb25zdCBjZWxsQ29sb3IgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgaWYgKGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvZGVzLm1ldGEpO1xuICAgICAgICBjb2Rlcy5tZXRhLmNhdGVnb3JpZXMuZm9yRWFjaCgoYywgaykgPT4gY2VsbENvbG9yLnNldChjLCBjb2xvcnNba10pKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbG9ycyA9IGNsdXN0ZXJDb2xvck1hcChcbiAgICAgICAgdmlldy50cmFuc2NyaXB0R2VuZXMsXG4gICAgICAgIHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMsXG4gICAgICAgIGNlbGxDb2xvcixcbiAgICAgICAgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIGNvbnN0IGhleDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGNvZGVGb3IgPSAoY2x1c3Rlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBrID0gaW5kZXguZ2V0KGNsdXN0ZXIpO1xuICAgICAgICBpZiAoayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgayA9IGhleC5sZW5ndGg7XG4gICAgICAgICAgaW5kZXguc2V0KGNsdXN0ZXIsIGspO1xuICAgICAgICAgIGhleC5wdXNoKGNvbG9ycy5nZXQoY2x1c3RlcikgPz8gY2VsbENvbG9yLmdldChjbHVzdGVyKSA/PyBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEVbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvZGUgPSBuZXcgSW50MzJBcnJheSh0LmNvdW50KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBjbHVzdGVyT2YoaSk7XG4gICAgICAgIGNvZGVbaV0gPSBjID09PSBudWxsID8gLTEgOiBjb2RlRm9yKGMpO1xuICAgICAgfVxuICAgICAgcmdiID0gaGV4Lm1hcChwYXJzZUhleCk7XG4gICAgICBjb2RlT2YgPSAoaSkgPT4gY29kZVtpXTtcbiAgICB9IGVsc2UgaWYgKHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdnZW5lJyB8fCB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2x1c3RlcicpIHtcbiAgICAgIC8vIEFsbCBnZW5lczogY29kZXMgYXJlIHRoZSBkYXRhc2V0J3MgZ2VuZSBpbmRpY2VzLCBmb2xkZWQgb250byB0aGUgcGFsZXR0ZS5cbiAgICAgIGNvbnN0IG4gPSB2aWV3LnRyYW5zY3JpcHRBbGxHZW5lcyA/IERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURS5sZW5ndGggOiB2aWV3LnRyYW5zY3JpcHRHZW5lcy5sZW5ndGg7XG4gICAgICByZ2IgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfZywgaSkgPT5cbiAgICAgICAgcGFyc2VIZXgoXG4gICAgICAgICAgKCF2aWV3LnRyYW5zY3JpcHRBbGxHZW5lcyAmJiB2aWV3LnRyYW5zY3JpcHRHZW5lQ29sb3JzW3ZpZXcudHJhbnNjcmlwdEdlbmVzW2ldXSkgfHxcbiAgICAgICAgICAgIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVtpICUgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLmxlbmd0aF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgY29kZU9mID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXMgPyAoaSkgPT4gdC5nZW5lW2ldICUgbiA6IChpKSA9PiB0LmdlbmVbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KTtcbiAgICAgIGNvbnN0IGNvZGVzID0gbmFtZSA/IGF3YWl0IHRoaXMubG9va3VwLmNvZGVzKG5hbWUpIDogbnVsbDtcbiAgICAgIHJnYiA9IGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgPyByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29kZXMubWV0YSkubWFwKHBhcnNlSGV4KSA6IFtdO1xuICAgICAgY29kZU9mID0gKGkpID0+IHtcbiAgICAgICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgICAgIGlmICghY29kZXMgfHwgbyA9PT0gTk9fT0JTRVJWQVRJT04pIHJldHVybiAtMTtcbiAgICAgICAgY29uc3QgYyA9IGNvZGVzLmNvZGVzW29dO1xuICAgICAgICByZXR1cm4gYyA9PT0gTk9fQ0FURUdPUlkgPyAtMSA6IGM7XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZ2JhID0gbmV3IEZsb2F0MzJBcnJheSh0LmNvdW50ICogNCk7XG4gICAgY29uc3QgdHVwbGVzOiBSR0JBW10gPSByZ2IubWFwKChbciwgZywgYl0pID0+IFtyIC8gMjU1LCBnIC8gMjU1LCBiIC8gMjU1LCAxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSBjb2RlT2YoaSk7XG4gICAgICByZ2JhLnNldChjIDwgMCA/IFVOQVNTSUdORURfUkdCQSA6IHR1cGxlc1tjXSwgaSAqIDQpO1xuICAgIH1cbiAgICByZXR1cm4gcmdiYTtcbiAgfVxufVxuIl19
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1sYXllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvc3BhdGlhbC10aWxlcy90cmFuc2NyaXB0LWxheWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FHZixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqSCxPQUFPLEVBQVksaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFtQixlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsTUFBTSxHQUNQLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUtwRixPQUFPLEVBQWlELGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxHLDJGQUEyRjtBQUMzRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUUvQixnQ0FBZ0M7QUFDaEMsTUFBTSxTQUFTLEdBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVoRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFt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LENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcG9pbnRTeW1ib2xDb2RlIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRTeW1ib2wsIFBvaW50c0xheWVyLCBSR0JBIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHR5cGUgeyBSZ2IgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IEFMTF9HRU5FUyB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBOT19DQVRFR09SWSxcbiAgTk9fT0JTRVJWQVRJT04sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLCBwYXJzZUhleCwgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IERhdGFSZWN0LCBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvbG9kJztcbmltcG9ydCB7IGNsdXN0ZXJDb2xvck1hcCB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvdHJhbnNjcmlwdC1ncm91cGluZyc7XG5pbXBvcnQgeyBUcmFuc2NyaXB0R2x5cGgsIGRlZmF1bHRHbHlwaEZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvZ2x5cGhzJztcbmltcG9ydCB7XG4gIGZpbHRlclRyYW5zY3JpcHRzLFxuICBoaWRkZW5BbGxHZW5lQ29kZXMsXG4gIGhpZGRlbkdlbmVTbG90cyxcbiAgbWVkaWFuLFxufSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZSc7XG5pbXBvcnQgeyBnZW5lRmlsdGVyS2V5LCBoYXNHZW5lRmlsdGVyIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWdlbmUtZmlsdGVyJztcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcmljYWxMb29rdXAgfSBmcm9tICcuL2NhdGVnb3JpY2FsLWxvb2t1cCc7XG5pbXBvcnQgdHlwZSB7IE9yZGVyZWRMYXllckdyb3VwcywgVGlsZUdyb3VwIH0gZnJvbSAnLi9sYXllci1ncm91cHMnO1xuaW1wb3J0IHR5cGUgeyBQbGFuQ29udGV4dCB9IGZyb20gJy4vcGxhbi1jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVHJhbnNjcmlwdEhvdmVyLCBUcmFuc2NyaXB0S2luZCB9IGZyb20gJy4vdHJhbnNjcmlwdC1ob3Zlcic7XG5pbXBvcnQgeyB0eXBlIFRyYW5zY3JpcHRKb2IsIHR5cGUgVHJhbnNjcmlwdEpvYlBsYW5uZXIsIGdyb3VwU2VsZWN0aW9uIH0gZnJvbSAnLi90cmFuc2NyaXB0LWpvYnMnO1xuXG4vKiogSWNvbnMgZ2V0IGEgZGFyayByaW0gb25seSB3aGlsZSB0aGVyZSBhcmUgYXQgbW9zdCB0aGlzIG1hbnksIGF0IGxlYXN0IHRoaXMgYmlnIChweCkuICovXG5jb25zdCBHTFlQSF9PVVRMSU5FX01BWCA9IDIwXzAwMDtcbmNvbnN0IEdMWVBIX09VVExJTkVfTUlOX1BYID0gODtcblxuLyoqIFRoZSBkYXJrIHJpbSBvZiBhIG1hcmtlci4gKi9cbmNvbnN0IFJJTV9DT0xPUjogUkdCQSA9IFswLjA0LCAwLjA0LCAwLjA1LCAwLjldO1xuXG4vKipcbiAqIFRoZSBuYXBhcmktanMgcG9pbnQgc3ltYm9sIGVhY2ggdHJhbnNjcmlwdCBpY29uIGlzIGRyYXduIGFzLiBFdmVyeSBpY29uIGhhcyBhIGNvdW50ZXJwYXJ0IG9mXG4gKiB0aGUgc2FtZSBvdXRsaW5lIChgY2lyY2xlYCBpcyBuYXBhcmkncyBgZGlzY2ApOyBzZWUge0BsaW5rIEdMWVBIX1NJWkV9IGZvciB0aGUgb25lIHdob3NlIHNpemVcbiAqIGRpZmZlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBHTFlQSF9TWU1CT0xTOiBSZWFkb25seTxSZWNvcmQ8VHJhbnNjcmlwdEdseXBoLCBQb2ludFN5bWJvbD4+ID0ge1xuICBjaXJjbGU6ICdkaXNjJyxcbiAgc3RhcjogJ3N0YXInLFxuICB0cmlhbmdsZTogJ3RyaWFuZ2xlX3VwJyxcbiAgc3F1YXJlOiAnc3F1YXJlJyxcbiAgZGlhbW9uZDogJ2RpYW1vbmQnLFxuICBjcm9zczogJ2Nyb3NzJyxcbiAgaGV4YWdvbjogJ2hleGFnb24nLFxuICAndHJpYW5nbGUtZG93bic6ICd0cmlhbmdsZV9kb3duJyxcbiAgcGVudGFnb246ICdwZW50YWdvbicsXG4gIHg6ICd4Jyxcbn07XG5cbi8qKlxuICogTWFya2VyIGRpYW1ldGVyIHBlciBpY29uLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBlbnRyeSdzOiBuYXBhcmkncyBgc3F1YXJlYCBmaWxscyB0aGUgbWFya2VyJ3NcbiAqIHdob2xlIGJveCwgd2hlcmUgdGhlIGljb24gaXQgcmVwbGFjZXMgaGFkIGEgMC44IGhhbGYtc2lkZSwgYXMgaGVhdnkgYXMgdGhlIG90aGVyIGljb25zLlxuICovXG5jb25zdCBHTFlQSF9TSVpFOiBSZWFkb25seTxQYXJ0aWFsPFJlY29yZDxUcmFuc2NyaXB0R2x5cGgsIG51bWJlcj4+PiA9IHsgc3F1YXJlOiAwLjggfTtcblxuLyoqXG4gKiBXaGF0IGEgdHJhbnNjcmlwdCBwbGFuIGRyYXdzLCBhcyBhIGtleTogYW4gdW5jaGFuZ2VkIG9uZSBpcyBhIG5vLW9wLiBNYXJrZXIgc2l6ZXMgZm9sbG93IHRoZVxuICogem9vbSwgc28gdGhlIHpvb20gaXMgcGFydCBvZiBpdDsgYSBwYW4gdGhhdCBrZWVwcyB0aGUgc2FtZSB0aWxlcyBvbiBzY3JlZW4gY2hhbmdlcyBub3RoaW5nLlxuICovXG5mdW5jdGlvbiB0cmFuc2NyaXB0UGxhbktleShcbiAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGpvYjogVHJhbnNjcmlwdEpvYixcbiAgcHhQZXJVbml0OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gW1xuICAgIGRhdGFzZXQuaWQsXG4gICAgdmlldy50cmFuc2NyaXB0TW9kZSxcbiAgICBqb2Iua2V5LFxuICAgIHZpZXcudHJhbnNjcmlwdENvbG9yQnksXG4gICAgY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyksXG4gICAgdmlldy50cmFuc2NyaXB0U2NhbGUsXG4gICAgdmlldy50cmFuc2NyaXB0T3BhY2l0eSxcbiAgICBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHbHlwaHMpLFxuICAgIHB4UGVyVW5pdC50b1ByZWNpc2lvbig0KSxcbiAgICB2aWV3LmhpZGRlbkdyb3Vwcy5qb2luKCdcXHUwMDAxJyksXG4gICAgZ2VuZUZpbHRlcktleSh2aWV3KSxcbiAgICB2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5qb2luKCcsJyksXG4gICAgdmlldy50cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW4uam9pbignLCcpLFxuICAgIEpTT04uc3RyaW5naWZ5KHZpZXcudHJhbnNjcmlwdEdlbmVDb2xvcnMpLFxuICAgIEpTT04uc3RyaW5naWZ5KHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMpLFxuICBdLmpvaW4oJ3wnKTtcbn1cblxuLyoqIFRoZSB2aWV3IHRoZSBtYXJrZXJzIGFyZSBjb2xvdXJlZCBieSwgZm9yIHdoYXQgd2FzIGxvYWRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvclZpZXdGb3IoXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGtpbmQ6IFRyYW5zY3JpcHRLaW5kLFxuICBjbHVzdGVyZWQ6IGJvb2xlYW4sXG4gIGhhc0NlbGxUeXBlczogYm9vbGVhbixcbik6IFNwYXRpYWxWaWV3U3RhdGUge1xuICAvLyBBIGJpbiBvZiB0aGUgYWxsLWdlbmUgcHlyYW1pZCBtaXhlcyBnZW5lcyBhbmQgY2FycmllcyBub25lLCBzbyBpdCBjYW5ub3QgYmUgY29sb3VyZWRcbiAgLy8gYnkgZ2VuZTogY29sb3VyIGl0IGJ5IGl0cyBkb21pbmFudCBjZWxsJ3MgdHlwZSB1bnRpbCBpbmRpdmlkdWFsIHRyYW5zY3JpcHRzIHNob3cgKHdpdGhcbiAgLy8gbm8gY2VsbCB0eXBlcywgdGhhdCBsZWF2ZXMgZXZlcnkgYmluIHVuYXNzaWduZWQ6IG9uZSBjb2xvdXIpLlxuICBpZiAoa2luZCA9PT0gJ2JpbnMnICYmIHZpZXcudHJhbnNjcmlwdENvbG9yQnkgIT09ICdjZWxsVHlwZScpIHJldHVybiB7IC4uLnZpZXcsIHRyYW5zY3JpcHRDb2xvckJ5OiAnY2VsbFR5cGUnIH07XG4gIC8vIERlbnNpdHktZ3JpZCBtYXJrZXJzIGhhdmUgbm8gY2VsbCB0byB0YWtlIGEgdHlwZSBmcm9tOiB0aGV5IHRha2UgdGhlaXIgY2x1c3RlcidzIGNvbG91ci5cbiAgaWYgKGNsdXN0ZXJlZCAmJiB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2VsbFR5cGUnKSByZXR1cm4geyAuLi52aWV3LCB0cmFuc2NyaXB0Q29sb3JCeTogJ2NsdXN0ZXInIH07XG4gIC8vIE5vIGNlbGwgdHlwZXMgdG8gY29sb3VyIGJ5ICh0aGUgcGFuZWwgdGhlbiBkb2VzIG5vdCBvZmZlciBpdCk6IGJ5IGdlbmUgaW5zdGVhZC5cbiAgaWYgKCFoYXNDZWxsVHlwZXMgJiYga2luZCAhPT0gJ2JpbnMnICYmIHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdjZWxsVHlwZScpIHtcbiAgICByZXR1cm4geyAuLi52aWV3LCB0cmFuc2NyaXB0Q29sb3JCeTogJ2dlbmUnIH07XG4gIH1cbiAgcmV0dXJuIHZpZXc7XG59XG5cbi8qKiBXaGVyZSBhIGxheWVyIHNpdHMgaW4gd29ybGQgc3BhY2U6IHRoZSBkYXRhc2V0J3MgYWZmaW5lIG9udG8gaXRzIHRpc3N1ZSBpbWFnZS4gKi9cbmludGVyZmFjZSBQbGFjZW1lbnQge1xuICBzY2FsZTogW251bWJlciwgbnVtYmVyXTtcbiAgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdO1xufVxuXG5jb25zdCBVTkFTU0lHTkVEX1JHQkE6IFJHQkEgPSBbMC42MiwgMC42MiwgMC42MiwgMC41NV07XG5cbi8qKlxuICogVGhlIHRyYW5zY3JpcHQgbWFya2VycyBvZiB0aGUgMkQgc3BhdGlhbCB2aWV3OiBydW5zIHRoZSBwbGFubmVyJ3Mgam9iLCBkcm9wcyBoaWRkZW4gZ3JvdXBzXG4gKiBhbmQgZ2VuZXMsIGdyb3VwcyBhIHNlbGVjdGlvbiB1bmRlciB0aGUgbWFya2VyIGJ1ZGdldCwgY29sb3VycyB0aGUgZW50cmllcyBhbmQgZHJhd3MgdGhlbSBhc1xuICogb25lIHBvaW50cyBsYXllcjogc2l6ZWQgY2lyY2xlcywgb3IgZ2VuZSBpY29ucyBhcyBwZXItcG9pbnQgc3ltYm9scyAod2l0aCBhIGRhcmsgcmltIHdoaWxlXG4gKiB0aGVyZSBhcmUgZmV3IGVub3VnaCkuXG4gKlxuICogSGFuZHMgd2hhdCBpdCBkcmV3IHRvIHRoZSBob3ZlciBvbmUgd2F5ICh7QGxpbmsgVHJhbnNjcmlwdEhvdmVyLnNldERyYXdufSksIGFuZCBrZWVwcyB0aGVcbiAqIGxvYWRlZCBwZXItZ2VuZSB0cmFuc2NyaXB0cyB0aGUgaW4tdmlldyBnZW5lIGNvdW50cyBhcmUgdGFrZW4gZnJvbS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zY3JpcHRMYXllcnMge1xuICAvKiogVGhlIGxvYWRlZCBwZXItZ2VuZSB0cmFuc2NyaXB0cyB0aGUgaW4tdmlldyBjb3VudHMgYXJlIHRha2VuIGZyb20uICovXG4gIHByaXZhdGUgY291bnRTb3VyY2U6IHsgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdlbmVzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBncm91cHM6IE9yZGVyZWRMYXllckdyb3VwczxUaWxlR3JvdXA+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgam9iczogVHJhbnNjcmlwdEpvYlBsYW5uZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb29rdXA6IENhdGVnb3JpY2FsTG9va3VwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaG92ZXI6IFRyYW5zY3JpcHRIb3ZlcixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW5zaWRlIGByZWN0YDogZWFjaCBlbnRyeSBjb3VudHMgZm9yIHRoZSB0cmFuc2NyaXB0cyBpdFxuICAgKiBzdGFuZHMgZm9yIChhbiBhZ2dyZWdhdGUgYXQgYSBjb2Fyc2UgbGV2ZWwgaG9sZHMgc2V2ZXJhbCkuIE51bGwgd2l0aG91dCBwZXItZ2VuZSBkYXRhLlxuICAgKi9cbiAgZ2VuZUNvdW50c0luKHJlY3Q6IERhdGFSZWN0KTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMuY291bnRTb3VyY2U7XG4gICAgaWYgKCFzcmMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZyBvZiBzcmMuZ2VuZXMpIG91dFtnXSA9IDA7XG4gICAgY29uc3QgeyB4LCB5LCB3ZWlnaHQsIGdlbmUgfSA9IHNyYy5tZXJnZWQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcmMubWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIGlmICh4W2ldIDwgcmVjdC54MCB8fCB4W2ldID4gcmVjdC54MSB8fCB5W2ldIDwgcmVjdC55MCB8fCB5W2ldID4gcmVjdC55MSkgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lID0gc3JjLmdlbmVzW2dlbmVbaV1dO1xuICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgb3V0W25hbWVdICs9IHdlaWdodFtpXTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBUaGUgdmlld2VyIHdlbnQgYXdheTogbm8gY291bnRzIHVudGlsIHRoZSBuZXh0IHBsYW4uICovXG4gIGRldGFjaGVkKCk6IHZvaWQge1xuICAgIHRoaXMuY291bnRTb3VyY2UgPSBudWxsO1xuICB9XG5cbiAgLyoqIERyYXcgdGhlIHZpZXcncyB0cmFuc2NyaXB0IG1hcmtlcnMgKG9yIGRyb3AgdGhlbSk7IGFuIHVuY2hhbmdlZCBwbGFuIGtleSBpcyBhIG5vLW9wLiAqL1xuICBhc3luYyBwbGFuKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcmVjdDogRGF0YVJlY3QsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICAgY3R4OiBQbGFuQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9kZSA9IHZpZXcudHJhbnNjcmlwdE1vZGU7XG4gICAgY29uc3Qgam9iID0gdGhpcy5qb2JzLmpvYkZvcihkYXRhc2V0LCB2aWV3LCByZWN0LCBweFBlclVuaXQpO1xuICAgIGlmICgham9iKSB7XG4gICAgICB0aGlzLmdyb3Vwcy5kcm9wKCd0cmFuc2NyaXB0cycpO1xuICAgICAgdGhpcy5ob3Zlci5jbGVhcigpO1xuICAgICAgdGhpcy5jb3VudFNvdXJjZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBsYW5LZXkgPSB0cmFuc2NyaXB0UGxhbktleShkYXRhc2V0LCB2aWV3LCBqb2IsIHB4UGVyVW5pdCk7XG4gICAgaWYgKHBsYW5LZXkgPT09IHRoaXMuZ3JvdXBzLmtleSgndHJhbnNjcmlwdHMnKSAmJiB0aGlzLmdyb3Vwcy5zaG93bigndHJhbnNjcmlwdHMnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBjdHgudHJhY2soJ1RyYW5zY3JpcHRzJywgam9iLmxvYWQoY3R4KSk7XG4gICAgaWYgKGN0eC5zdGFsZSgpKSByZXR1cm47XG4gICAgLy8gTWFya2VycyBkcmF3biBmcm9tIHN1bW1lZCBkZW5zaXR5IGdyaWRzICh6b29tZWQgb3V0KSBjYXJyeSBubyBjZWxscywgc28gdGhleSBjYW5ub3QgZm9sbG93XG4gICAgLy8gdGhlIG9ic2VydmF0aW9uIGdlbmUgZmlsdGVyOiBkcmF3biwgdGhleSB3b3VsZCBzaG93IHRoZSB0cmFuc2NyaXB0cyBvZiB0aGUgY2VsbHMgaXQgaGlkZXMuXG4gICAgLy8gTm9uZSB3aGlsZSBpdCBpcyBvbjsgem9vbWVkIGluLCB0aGUgY2VsbC1hc3NpZ25lZCB0cmFuc2NyaXB0cyBhcmUgZmlsdGVyZWQgKGJlbG93KS5cbiAgICBpZiAobG9hZGVkLmNsdXN0ZXJlZCAmJiBoYXNHZW5lRmlsdGVyKHZpZXcpKSB7XG4gICAgICB0aGlzLmdyb3Vwcy5kcm9wKCd0cmFuc2NyaXB0cycpO1xuICAgICAgdGhpcy5ob3Zlci5jbGVhcigpO1xuICAgICAgdGhpcy5jb3VudFNvdXJjZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBlci1nZW5lIGNvdW50cyBpbiB2aWV3IGNvbWUgZnJvbSB3aGF0IHdhcyBsb2FkZWQsIGJlZm9yZSBoaWRkZW4gZ2VuZXMgYXJlIGRyb3BwZWQ6XG4gICAgLy8gYSBoaWRkZW4gZ2VuZSBzdGlsbCBoYXMgdHJhbnNjcmlwdHMgdGhlcmUuIFN1bW1lZCBkZW5zaXR5IGdyaWRzIChubyBwZXItZ2VuZSBsZXZlbHMsXG4gICAgLy8gem9vbWVkIG91dCkgaG9sZCBjbHVzdGVycywgbm90IGdlbmVzOiBubyBwZXItZ2VuZSBjb3VudHMgdGhlcmUsIHJhdGhlciB0aGFuIGEgZ3Vlc3MuXG4gICAgLy8gRXZlcnkgZ2VuZSdzIGluZGl2aWR1YWwgdHJhbnNjcmlwdHMgYXJlIGNvdW50ZWQgYnkgdGhlIGRhdGFzZXQncyBnZW5lIGxpc3QsIHdoZW4gaXQgaGFzIG9uZS5cbiAgICBjb25zdCBhbGxHZW5lTmFtZXMgPSBkYXRhc2V0LnRyYW5zY3JpcHRUaWxlcz8uZ2VuZXM7XG4gICAgY29uc3Qga2luZCA9IGxvYWRlZC5raW5kID8/IGpvYi5raW5kO1xuICAgIHRoaXMuY291bnRTb3VyY2UgPVxuICAgICAga2luZCA9PT0gJ2dlbmVzJyAmJiAhbG9hZGVkLmNsdXN0ZXJlZFxuICAgICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBnZW5lczogWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXSB9XG4gICAgICAgIDoga2luZCA9PT0gJ2luZGl2aWR1YWwnICYmIGFsbEdlbmVOYW1lc1xuICAgICAgICAgID8geyBtZXJnZWQ6IGxvYWRlZC5tZXJnZWQsIGdlbmVzOiBhbGxHZW5lTmFtZXMgfVxuICAgICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBoaWRkZW4gPSBhd2FpdCB0aGlzLmxvb2t1cC5oaWRkZW5Db2RlcyhkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAoY3R4LnN0YWxlKCkpIHJldHVybjtcbiAgICAvLyBEZW5zaXR5LWdyaWQgbWFya2VycyBjYXJyeSBubyBjZWxscyBhbmQgd2VyZSBidWlsdCBmcm9tIHRoZSB2aXNpYmxlIGdlbmVzIG9ubHkuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBsb2FkZWQuY2x1c3RlcmVkXG4gICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBweDogbG9hZGVkLnB4IH1cbiAgICAgIDogZmlsdGVyVHJhbnNjcmlwdHMoXG4gICAgICAgICAgbG9hZGVkLm1lcmdlZCxcbiAgICAgICAgICBsb2FkZWQucHgsXG4gICAgICAgICAgaGlkZGVuLFxuICAgICAgICAgIGtpbmQgPT09ICdnZW5lcydcbiAgICAgICAgICAgID8gaGlkZGVuR2VuZVNsb3RzKHZpZXcpXG4gICAgICAgICAgICA6IGtpbmQgPT09ICdpbmRpdmlkdWFsJ1xuICAgICAgICAgICAgICA/IGhpZGRlbkFsbEdlbmVDb2Rlcyh2aWV3LCBhbGxHZW5lTmFtZXMpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgKTtcbiAgICBsZXQgeyBtZXJnZWQsIHB4IH0gPSBmaWx0ZXJlZDtcbiAgICBsZXQgc2VsZWN0aW9uQmluOiBudW1iZXIgfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8uYmluID8/IG51bGw7XG4gICAgbGV0IGVudHJ5R3JvdXA6IEludDMyQXJyYXkgfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8uZ3JvdXAgPz8gbnVsbDtcbiAgICBsZXQgZ3JvdXBOYW1lczogc3RyaW5nW10gfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8ubmFtZXMgPz8gbnVsbDtcbiAgICBpZiAobG9hZGVkLmxhZGRlcikge1xuICAgICAgY29uc3QgZyA9IGdyb3VwU2VsZWN0aW9uKG1lcmdlZCwgdmlldywgbG9hZGVkLmxhZGRlciwgcHhQZXJVbml0KTtcbiAgICAgIGlmIChnKSAoeyBtZXJnZWQsIHB4LCBiaW46IHNlbGVjdGlvbkJpbiwgZ3JvdXA6IGVudHJ5R3JvdXAsIG5hbWVzOiBncm91cE5hbWVzIH0gPSBnKTtcbiAgICB9XG4gICAgY29uc3QgY29sb3JWaWV3ID0gY29sb3JWaWV3Rm9yKHZpZXcsIGtpbmQsICEhbG9hZGVkLmNsdXN0ZXJlZCwgY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldykgIT09IG51bGwpO1xuICAgIC8vIEVhY2ggZW50cnkncyBjbHVzdGVyOiBpdHMgbWFya2VyJ3MgZ3JvdXAsIG9yIHRoZSBnZW5lLXRyZWUgZ3JvdXAgaXRzIGdlbmUgaXMgaW4uXG4gICAgY29uc3QgZ2VuZUNsdXN0ZXIgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcy5tYXAoXG4gICAgICAoZykgPT4gdmlldy50cmFuc2NyaXB0R2VuZUdyb3Vwcy5maW5kKCh4KSA9PiB4LmdlbmVzLmluY2x1ZGVzKGcpKT8ubmFtZSA/PyBnLFxuICAgICk7XG4gICAgY29uc3QgY2x1c3Rlck9mID0gKGk6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT5cbiAgICAgIGVudHJ5R3JvdXAgJiYgZ3JvdXBOYW1lcyA/IChncm91cE5hbWVzW2VudHJ5R3JvdXBbaV1dID8/IG51bGwpIDogKGdlbmVDbHVzdGVyW21lcmdlZC5nZW5lW2ldXSA/PyBudWxsKTtcbiAgICBjb25zdCByZ2JhID0gYXdhaXQgdGhpcy50cmFuc2NyaXB0Q29sb3JzKGRhdGFzZXQsIGNvbG9yVmlldywgbWVyZ2VkLCBraW5kID09PSAnZ2VuZXMnID8gY2x1c3Rlck9mIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCB0eXBlQ29sdW1uID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgY29uc3QgdHlwZXMgPSB0eXBlQ29sdW1uID8gYXdhaXQgdGhpcy5sb29rdXAuY29kZXModHlwZUNvbHVtbikuY2F0Y2goKCkgPT4gbnVsbCkgOiBudWxsO1xuICAgIC8vIE5vdGhpbmcgaXMgcmVjb3JkZWQgYmVmb3JlIHRoZSBsYXN0IGF3YWl0OiBhIHN1cGVyc2VkZWQgcGxhbiB0aGF0IGhhZCBhbHJlYWR5IGtleWVkIHRoZVxuICAgIC8vIGdyb3VwIHdvdWxkIG1ha2UgdGhlIG5ld2VyIHBsYW4gb2YgdGhlIHNhbWUgdmlldyB0YWtlIHRoZSBvbGQgbGF5ZXIgZm9yIGl0cyBvd24uXG4gICAgaWYgKGN0eC5zdGFsZSgpKSByZXR1cm47XG5cbiAgICBpZiAoY3R4LmluY29tcGxldGUpIHRoaXMuZ3JvdXBzLmZvcmdldEtleSgndHJhbnNjcmlwdHMnKTtcbiAgICBlbHNlIHRoaXMuZ3JvdXBzLnNldEtleSgndHJhbnNjcmlwdHMnLCBwbGFuS2V5KTtcbiAgICBjb25zdCBkaWFtID0gcHgubWFwKChkKSA9PiBkIC8gcHhQZXJVbml0KTtcbiAgICBjb25zdCByZWYgPSBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IHBsYWNlOiBQbGFjZW1lbnQgPSB7IHNjYWxlOiByZWY/LnNjYWxlID8/IFsxLCAxXSwgdHJhbnNsYXRlOiByZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF0gfTtcbiAgICBjb25zdCBsYXllciA9XG4gICAgICBtb2RlID09PSAnY2lyY2xlcydcbiAgICAgICAgPyAvLyBBIGRhcmsgcmltOiBhIHRyYW5zY3JpcHQgY29sb3VyZWQgYnkgaXRzIGNlbGwncyB0eXBlIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBjb2xvdXIgYXNcbiAgICAgICAgICAvLyB0aGUgY2VsbCBmaWxsIGl0IHNpdHMgb24sIGFuZCB2YW5pc2hlcyBpbnRvIGl0LlxuICAgICAgICAgIHRoaXMuZHJhd1RyYW5zY3JpcHRzKG1lcmdlZCwgZGlhbSwgcmdiYSwgdmlldywgcGxhY2UsIG51bGwsIDAuMTggKiBtZWRpYW4oZGlhbSkpXG4gICAgICAgIDogdGhpcy5kcmF3VHJhbnNjcmlwdEdseXBocyhtZXJnZWQsIGRpYW0sIHJnYmEsIHZpZXcsIHBsYWNlLCBweFBlclVuaXQpO1xuICAgIHRoaXMuaG92ZXIuc2V0RHJhd24oXG4gICAgICB7XG4gICAgICAgIGtpbmQsXG4gICAgICAgIGJpbjogc2VsZWN0aW9uQmluXG4gICAgICAgICAgPyB7IHNpemU6IHNlbGVjdGlvbkJpbiwgb3JpZ2luOiBsb2FkZWQuY2x1c3RlcmVkPy5vcmlnaW4gPz8gWzAsIDBdIH1cbiAgICAgICAgICA6IGxvYWRlZC5raW5kXG4gICAgICAgICAgICA/IGxvYWRlZC5iaW5cbiAgICAgICAgICAgIDogam9iLmJpbixcbiAgICAgICAgbWVyZ2VkLFxuICAgICAgICBsYXllcixcbiAgICAgICAgZ2VuZXM6IGtpbmQgPT09ICdpbmRpdmlkdWFsJyA/IChhbGxHZW5lTmFtZXMgPz8gW10pIDogWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXSxcbiAgICAgICAgLi4uKGVudHJ5R3JvdXAgJiYgZ3JvdXBOYW1lcyA/IHsgZW50cnlHcm91cCwgZ3JvdXBOYW1lcyB9IDoge30pLFxuICAgICAgICAuLi4obG9hZGVkLmNsdXN0ZXJlZCA/IHsgZ3JvdXBHZW5lczogbG9hZGVkLmNsdXN0ZXJlZC5nZW5lcyB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIGRhdGFzZXQubWljcm9uc1BlclVuaXQgPz8gbnVsbCxcbiAgICApO1xuICAgIHRoaXMuaG92ZXIuc2V0VHlwZXModHlwZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmUgaWNvbnM6IGVhY2ggZW50cnkgZHJhd24gYXMgaXRzIGdlbmUncyBuYXBhcmktanMgcG9pbnQgc3ltYm9sLCBpbiB0aGUgc2FtZSBvbmUgcG9pbnRzXG4gICAqIGxheWVyIGFzIHRoZSBjaXJjbGVzLiBXaXRoIGV2ZXJ5IGdlbmUgZHJhd24gdGhlcmUgaXMgb25lIGljb24gZm9yIGFsbCBvZiB0aGVtIOKAlCAxOCwwMDBcbiAgICogc2hhcGVzIHdvdWxkIHNheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VHJhbnNjcmlwdEdseXBocyhcbiAgICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBkaWFtOiBGbG9hdDMyQXJyYXksXG4gICAgcmdiYTogRmxvYXQzMkFycmF5LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcGxhY2U6IFBsYWNlbWVudCxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgKTogUG9pbnRzTGF5ZXIge1xuICAgIGNvbnN0IGdlbmVzID0gdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgY29uc3QgZ2x5cGhGb3IgPSAoc2xvdDogbnVtYmVyKTogVHJhbnNjcmlwdEdseXBoID0+XG4gICAgICAodmlldy50cmFuc2NyaXB0R2x5cGhzW2dlbmVzW3Nsb3RdXSBhcyBUcmFuc2NyaXB0R2x5cGggfCB1bmRlZmluZWQpID8/IGRlZmF1bHRHbHlwaEZvcihzbG90KTtcbiAgICBjb25zdCBzaW5nbGUgPSB2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc1xuICAgICAgPyAoKHZpZXcudHJhbnNjcmlwdEdseXBoc1tBTExfR0VORVNdIGFzIFRyYW5zY3JpcHRHbHlwaCB8IHVuZGVmaW5lZCkgPz8gJ2NpcmNsZScpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2xvdHMgPSBzaW5nbGUgPyBbc2luZ2xlXSA6IGdlbmVzLm1hcCgoX2csIHNsb3QpID0+IGdseXBoRm9yKHNsb3QpKTtcbiAgICBjb25zdCBjb2RlcyA9IHNsb3RzLm1hcCgoZykgPT4gcG9pbnRTeW1ib2xDb2RlKEdMWVBIX1NZTUJPTFNbZ10pKTtcbiAgICBjb25zdCBzaXplcyA9IHNsb3RzLm1hcCgoZykgPT4gR0xZUEhfU0laRVtnXSA/PyAxKTtcbiAgICBjb25zdCBzeW1ib2xzID0gbmV3IFVpbnQ4QXJyYXkobWVyZ2VkLmNvdW50KTtcbiAgICBjb25zdCBzaXplID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBzaW5nbGUgPyAwIDogbWVyZ2VkLmdlbmVbaV07XG4gICAgICBzeW1ib2xzW2ldID0gY29kZXNbc2xvdF07XG4gICAgICBzaXplW2ldID0gZGlhbVtpXSAqIHNpemVzW3Nsb3RdO1xuICAgIH1cbiAgICAvLyBBIGRhcmsgcmltLCBvbmUgc2NyZWVuIHBpeGVsIHdpZGUsIGtlZXBzIGEgZmV3IGxhcmdlIGljb25zIHJlYWRhYmxlIG92ZXIgdGhlIHRpc3N1ZTsgb25cbiAgICAvLyBtYW55IHNtYWxsIG9uZXMgdGhlIHJpbXMgbWVyZ2UgaW50byBhIHNvbGlkIGRhcmsgc2hlZXQgdGhhdCBoaWRlcyBldmVyeSBjb2xvdXIsIHNvIHRoZXlcbiAgICAvLyBhcmUgbGVmdCBvZmYuXG4gICAgY29uc3QgbWVkaWFuUHggPSBtZWRpYW4oZGlhbSkgKiBweFBlclVuaXQ7XG4gICAgY29uc3QgcmltID0gbWVyZ2VkLmNvdW50ID4gR0xZUEhfT1VUTElORV9NQVggfHwgbWVkaWFuUHggPCBHTFlQSF9PVVRMSU5FX01JTl9QWCA/IDAgOiAxIC8gcHhQZXJVbml0O1xuICAgIHJldHVybiB0aGlzLmRyYXdUcmFuc2NyaXB0cyhtZXJnZWQsIHNpemUsIHJnYmEsIHZpZXcsIHBsYWNlLCBzeW1ib2xzLCByaW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbmUgdHJhbnNjcmlwdHMgbGF5ZXI6IGEgbWFya2VyIHBlciBlbnRyeSwgYHNpemVgIHNheWluZyBob3cgbWFueSB0cmFuc2NyaXB0cyBpdCBzdGFuZHNcbiAgICogZm9yLCBkcmF3biBhcyB0aGUgbGF5ZXIncyBkaXNjIG9yIGFzIGVhY2ggZW50cnkncyBgc3ltYm9sc2AgY29kZS5cbiAgICovXG4gIHByaXZhdGUgZHJhd1RyYW5zY3JpcHRzKFxuICAgIG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICAgIHNpemU6IEZsb2F0MzJBcnJheSxcbiAgICByZ2JhOiBGbG9hdDMyQXJyYXksXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICB7IHNjYWxlLCB0cmFuc2xhdGUgfTogUGxhY2VtZW50LFxuICAgIHN5bWJvbHM6IFVpbnQ4QXJyYXkgfCBudWxsLFxuICAgIGJvcmRlcldpZHRoOiBudW1iZXIsXG4gICk6IFBvaW50c0xheWVyIHtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZC5jb3VudCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIHBvc2l0aW9uc1syICogaV0gPSBtZXJnZWQueFtpXTtcbiAgICAgIHBvc2l0aW9uc1syICogaSArIDFdID0gbWVyZ2VkLnlbaV07XG4gICAgfVxuICAgIGNvbnN0IGxheWVyID0gdGhpcy5ncm91cHMudmlld2VyIS5hZGRQb2ludHMocG9zaXRpb25zLCB7XG4gICAgICBuYW1lOiAndHJhbnNjcmlwdHMnLFxuICAgICAgc2l6ZSxcbiAgICAgIGZhY2VDb2xvcjogcmdiYSxcbiAgICAgIGJvcmRlckNvbG9yOiBSSU1fQ09MT1IsXG4gICAgICBib3JkZXJXaWR0aCxcbiAgICAgIHN5bWJvbHMsXG4gICAgICBvcGFjaXR5OiB2aWV3LnRyYW5zY3JpcHRPcGFjaXR5LFxuICAgICAgc2NhbGUsXG4gICAgICB0cmFuc2xhdGUsXG4gICAgfSk7XG4gICAgdGhpcy5ncm91cHMucmVwbGFjZSgndHJhbnNjcmlwdHMnLCBsYXllcik7XG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgLyoqIFBlci1lbnRyeSBjb2xvdXJzLCBhcyBwYWNrZWQgUkdCQS4gKi9cbiAgcHJpdmF0ZSBhc3luYyB0cmFuc2NyaXB0Q29sb3JzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgdDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICAgIGNsdXN0ZXJPZj86IChpOiBudW1iZXIpID0+IHN0cmluZyB8IG51bGwsXG4gICk6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgbGV0IHJnYjogUmdiW107XG4gICAgbGV0IGNvZGVPZjogKGk6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIGlmICh2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2x1c3RlcicgJiYgY2x1c3Rlck9mKSB7XG4gICAgICAvLyBBIGNsdXN0ZXIgbmFtZWQgbGlrZSBhIGdyb3VwIG9mIHRoZSBjZWxscycgZ3JvdXBpbmcgdGFrZXMgdGhhdCBncm91cCdzIGNvbG91ciwgc28gYVxuICAgICAgLy8gY2x1c3RlcidzIHRyYW5zY3JpcHRzIGFuZCBpdHMgY2VsbHMgYWdyZWU7IGFueSBvdGhlciBjbHVzdGVyIHRha2VzIGEgcGFsZXR0ZSBjb2xvdXIuXG4gICAgICBjb25zdCBuYW1lID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgICBjb25zdCBjb2RlcyA9IG5hbWUgPyBhd2FpdCB0aGlzLmxvb2t1cC5jb2RlcyhuYW1lKS5jYXRjaCgoKSA9PiBudWxsKSA6IG51bGw7XG4gICAgICBjb25zdCBjZWxsQ29sb3IgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgaWYgKGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvZGVzLm1ldGEpO1xuICAgICAgICBjb2Rlcy5tZXRhLmNhdGVnb3JpZXMuZm9yRWFjaCgoYywgaykgPT4gY2VsbENvbG9yLnNldChjLCBjb2xvcnNba10pKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbG9ycyA9IGNsdXN0ZXJDb2xvck1hcChcbiAgICAgICAgdmlldy50cmFuc2NyaXB0R2VuZXMsXG4gICAgICAgIHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMsXG4gICAgICAgIGNlbGxDb2xvcixcbiAgICAgICAgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIGNvbnN0IGhleDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGNvZGVGb3IgPSAoY2x1c3Rlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBrID0gaW5kZXguZ2V0KGNsdXN0ZXIpO1xuICAgICAgICBpZiAoayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgayA9IGhleC5sZW5ndGg7XG4gICAgICAgICAgaW5kZXguc2V0KGNsdXN0ZXIsIGspO1xuICAgICAgICAgIGhleC5wdXNoKGNvbG9ycy5nZXQoY2x1c3RlcikgPz8gY2VsbENvbG9yLmdldChjbHVzdGVyKSA/PyBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEVbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvZGUgPSBuZXcgSW50MzJBcnJheSh0LmNvdW50KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBjbHVzdGVyT2YoaSk7XG4gICAgICAgIGNvZGVbaV0gPSBjID09PSBudWxsID8gLTEgOiBjb2RlRm9yKGMpO1xuICAgICAgfVxuICAgICAgcmdiID0gaGV4Lm1hcChwYXJzZUhleCk7XG4gICAgICBjb2RlT2YgPSAoaSkgPT4gY29kZVtpXTtcbiAgICB9IGVsc2UgaWYgKHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdnZW5lJyB8fCB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2x1c3RlcicpIHtcbiAgICAgIC8vIEFsbCBnZW5lczogY29kZXMgYXJlIHRoZSBkYXRhc2V0J3MgZ2VuZSBpbmRpY2VzLCBjb2xvdXJlZCBieSBuYW1lIHdoZW4gdGhlIGRhdGFzZXRcbiAgICAgIC8vIGxpc3RzIHRoZW0gKHNvIGEgZ2VuZSdzIGNob3NlbiBjb2xvdXIgYXBwbGllcyksIGVsc2UgZm9sZGVkIG9udG8gdGhlIHBhbGV0dGUuXG4gICAgICBjb25zdCBuYW1lcyA9IHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzID8gKGRhdGFzZXQudHJhbnNjcmlwdFRpbGVzPy5nZW5lcyA/PyBudWxsKSA6IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICAgICAgY29uc3QgbiA9IG5hbWVzID8gbmFtZXMubGVuZ3RoIDogREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLmxlbmd0aDtcbiAgICAgIHJnYiA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG4gfSwgKF9nLCBpKSA9PlxuICAgICAgICBwYXJzZUhleChcbiAgICAgICAgICAobmFtZXMgJiYgdmlldy50cmFuc2NyaXB0R2VuZUNvbG9yc1tuYW1lc1tpXV0pIHx8XG4gICAgICAgICAgICBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEVbaSAlIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURS5sZW5ndGhdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGNvZGVPZiA9IG5hbWVzID8gKGkpID0+ICh0LmdlbmVbaV0gPCBuID8gdC5nZW5lW2ldIDogLTEpIDogKGkpID0+IHQuZ2VuZVtpXSAlIG47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KTtcbiAgICAgIGNvbnN0IGNvZGVzID0gbmFtZSA/IGF3YWl0IHRoaXMubG9va3VwLmNvZGVzKG5hbWUpIDogbnVsbDtcbiAgICAgIHJnYiA9IGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgPyByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29kZXMubWV0YSkubWFwKHBhcnNlSGV4KSA6IFtdO1xuICAgICAgY29kZU9mID0gKGkpID0+IHtcbiAgICAgICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgICAgIGlmICghY29kZXMgfHwgbyA9PT0gTk9fT0JTRVJWQVRJT04pIHJldHVybiAtMTtcbiAgICAgICAgY29uc3QgYyA9IGNvZGVzLmNvZGVzW29dO1xuICAgICAgICByZXR1cm4gYyA9PT0gTk9fQ0FURUdPUlkgPyAtMSA6IGM7XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZ2JhID0gbmV3IEZsb2F0MzJBcnJheSh0LmNvdW50ICogNCk7XG4gICAgY29uc3QgdHVwbGVzOiBSR0JBW10gPSByZ2IubWFwKChbciwgZywgYl0pID0+IFtyIC8gMjU1LCBnIC8gMjU1LCBiIC8gMjU1LCAxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSBjb2RlT2YoaSk7XG4gICAgICByZ2JhLnNldChjIDwgMCA/IFVOQVNTSUdORURfUkdCQSA6IHR1cGxlc1tjXSwgaSAqIDQpO1xuICAgIH1cbiAgICByZXR1cm4gcmdiYTtcbiAgfVxufVxuIl19