@jax-data-science/sci-image-visualizer 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +4 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  21. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
  22. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  23. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
  24. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
  26. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
  27. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  28. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  29. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  30. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  31. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  32. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  33. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  34. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  35. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  36. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  37. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  38. package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
  39. package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
  40. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  41. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  42. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  43. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  44. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  45. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  46. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  47. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  48. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
  49. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  50. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
  51. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
  52. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  53. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  54. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  55. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  56. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  57. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  58. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  59. package/esm2022/lib/store/region-store.service.mjs +33 -2
  60. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  61. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  62. package/esm2022/lib/visualizer.component.mjs +40 -4
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
  64. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  65. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  66. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  67. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  68. package/fesm2022/region-source.worker.js +84 -2
  69. package/lib/contracts/display-types.d.ts +99 -6
  70. package/lib/contracts/image.contract.d.ts +6 -0
  71. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  72. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  73. package/lib/contracts/region-store.contract.d.ts +6 -0
  74. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  75. package/lib/contracts/visualizer.contract.d.ts +43 -1
  76. package/lib/geometry/cell-meshes.d.ts +27 -0
  77. package/lib/geometry/place.d.ts +45 -0
  78. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  79. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  80. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  81. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  82. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  83. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
  84. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
  85. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  86. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  87. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  88. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
  89. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  90. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
  91. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  92. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
  93. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  94. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  95. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  96. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  97. package/lib/region-editor/region-editor.component.d.ts +4 -0
  98. package/lib/region-source/region-source-ops.d.ts +12 -0
  99. package/lib/region-source/region-tiles.d.ts +8 -0
  100. package/lib/region-source/worker-region-source.d.ts +18 -0
  101. package/lib/routing-visualizer.service.d.ts +140 -1
  102. package/lib/spatial/observations-in-selection.d.ts +43 -0
  103. package/lib/spatial/plane-cells.d.ts +37 -0
  104. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  105. package/lib/spatial/spatial-encoding.d.ts +24 -1
  106. package/lib/spatial/spatial-hover.d.ts +23 -0
  107. package/lib/spatial/spatial-planes.d.ts +22 -0
  108. package/lib/spatial/spatial-selection.d.ts +2 -1
  109. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  110. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  111. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  112. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  113. package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
  114. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  115. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
  116. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
  117. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  118. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  119. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  120. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  121. package/lib/store/region-source-scope.d.ts +4 -0
  122. package/lib/store/region-store.service.d.ts +21 -0
  123. package/lib/toolbar/toolbar.component.d.ts +6 -1
  124. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  125. package/lib/visualizer.component.d.ts +14 -0
  126. package/package.json +2 -2
  127. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { colormapFromLut } from 'napari-js';
2
2
  import { NO_CATEGORY } from '../../contracts/spatial-dataset.contract';
3
- import { contrastWindow, encodeCategorical, encodeContinuous, resolveCategoryColors, } from '../../spatial/spatial-encoding';
3
+ import { contrastWindow, encodeCategorical, encodeContinuous, categoryColorsFor, } from '../../spatial/spatial-encoding';
4
4
  import { maskToIndices } from '../../spatial/spatial-selection';
5
5
  /**
6
6
  * The spatial scenes' pure colour and grouping math: what the 2D markers, the 3D cloud and the
@@ -14,6 +14,13 @@ export const SPATIAL_FALLBACK_RADIUS = 4;
14
14
  * 40 µm/px template, so drawing them to scale would put every cell a fifth of a pixel wide
15
15
  * and the section would come up empty. The point-size control scales up from this floor. */
16
16
  export const SPATIAL_SLICE_MIN_DIAMETER_PX = 1.5;
17
+ /**
18
+ * Smallest drawn marker diameter in the 2D view, in SCREEN pixels, at any zoom. A marker's size is
19
+ * the cell's own (data units), so zoomed out over a whole Cytos plate or Xenium section every cell
20
+ * fell below a pixel and the observations vanished; with the floor they stay a dense field of
21
+ * dots, coloured as they are, at every zoom (the GPU applies it per frame: no rebuild on zoom).
22
+ */
23
+ export const SPATIAL_MARKER_MIN_SCREEN_PX = 2;
17
24
  /** Longest side of the gene-map raster, in field pixels. A gene map is a smooth
18
25
  * field read as territory, so it gains nothing from matching a 2 Gpx slide's
19
26
  * resolution — and the estimate costs one pass over this many pixels. */
@@ -181,9 +188,9 @@ export function totalDensityGroup(selection) {
181
188
  * {@link DENSITY_MAX_CLUSTERS}, each with its legend colour — restricted to the selection when
182
189
  * there is one, so "select a region, check the box" answers which clusters live there.
183
190
  */
184
- export function rankDensityGroups(columnName, column, count, selection) {
191
+ export function rankDensityGroups(columnName, column, count, selection, groupColors) {
185
192
  const inSelection = selection.count > 0 ? selection.mask : null;
186
- const colors = resolveCategoryColors(column.meta);
193
+ const colors = categoryColorsFor(columnName, column.meta, groupColors);
187
194
  const counts = new Uint32Array(column.meta.categories.length);
188
195
  for (let i = 0; i < count; i++) {
189
196
  if (inSelection && !inSelection[i])
@@ -216,4 +223,4 @@ export function rankDensityGroups(columnName, column, count, selection) {
216
223
  };
217
224
  });
218
225
  }
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUk1QyxPQUFPLEVBQXFCLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTFGLE9BQU8sRUFDTCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixxQkFBcUIsR0FFdEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQXdCLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRGOzs7O0dBSUc7QUFFSCwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDOzs7NkZBRzZGO0FBQzdGLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQztBQUNqRDs7MEVBRTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUNyQzsrREFDK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUNsQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUN4QztpRkFDaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDO29EQUNvRDtBQUNwRCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUM7QUFDL0Msa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUV0Qzt1Q0FDdUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQXFDLENB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QUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNsQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVM7WUFDaEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNoQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29sb3JtYXBGcm9tTHV0IH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgQ29sb3JtYXAgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgeyBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IENhdGVnb3JpY2FsQ29sdW1uLCBOT19DQVRFR09SWSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIGNvbnRyYXN0V2luZG93LFxuICBlbmNvZGVDYXRlZ29yaWNhbCxcbiAgZW5jb2RlQ29udGludW91cyxcbiAgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzLFxuICB0eXBlIFJHQkEsXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uTWFzaywgbWFza1RvSW5kaWNlcyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuXG4vKipcbiAqIFRoZSBzcGF0aWFsIHNjZW5lcycgcHVyZSBjb2xvdXIgYW5kIGdyb3VwaW5nIG1hdGg6IHdoYXQgdGhlIDJEIG1hcmtlcnMsIHRoZSAzRCBjbG91ZCBhbmQgdGhlXG4gKiBkZW5zaXR5IHZvbHVtZXMgYXJlIGNvbG91cmVkIHdpdGgsIGFzIGZ1bmN0aW9ucyBvZiB0aGUgZGF0YSwgdGhlIHZpZXcgYW5kIGEgTFVULiBObyB2aWV3ZXIsIG5vXG4gKiBwb3J0LCBubyBzdG9yZSAocmV2aWV3IEFwcGVuZGl4IEIsIHN0ZXAgMSkuXG4gKi9cblxuLyoqIE1hcmtlciByYWRpdXMgKGltYWdlIHB4KSBmb3IgYSBkYXRhc2V0IHRoYXQgZGVjbGFyZXMgbm9uZSDigJQgc2VnbWVudGVkIGNlbGxzIG9mdGVuIGRvbid0LiAqL1xuZXhwb3J0IGNvbnN0IFNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTID0gNDtcbi8qKiBTbWFsbGVzdCBtYXJrZXIgRElBTUVURVIsIGluIHNsaWNlIHBpeGVscywgb3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldC4gQSBjZWxsJ3MgcmVhbFxuICogIHNpemUgaXMgaG9ub3VyZWQgd2hlcmV2ZXIgaXQgc3Vydml2ZXMgdGhlIGdyaWQ6IHRoZSBBQkMgYXRsYXMgc2VydmVzIDUgwrVtIHJhZGlpIG9uIGFcbiAqICA0MCDCtW0vcHggdGVtcGxhdGUsIHNvIGRyYXdpbmcgdGhlbSB0byBzY2FsZSB3b3VsZCBwdXQgZXZlcnkgY2VsbCBhIGZpZnRoIG9mIGEgcGl4ZWwgd2lkZVxuICogIGFuZCB0aGUgc2VjdGlvbiB3b3VsZCBjb21lIHVwIGVtcHR5LiBUaGUgcG9pbnQtc2l6ZSBjb250cm9sIHNjYWxlcyB1cCBmcm9tIHRoaXMgZmxvb3IuICovXG5leHBvcnQgY29uc3QgU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggPSAxLjU7XG4vKiogTG9uZ2VzdCBzaWRlIG9mIHRoZSBnZW5lLW1hcCByYXN0ZXIsIGluIGZpZWxkIHBpeGVscy4gQSBnZW5lIG1hcCBpcyBhIHNtb290aFxuICogIGZpZWxkIHJlYWQgYXMgdGVycml0b3J5LCBzbyBpdCBnYWlucyBub3RoaW5nIGZyb20gbWF0Y2hpbmcgYSAyIEdweCBzbGlkZSdzXG4gKiAgcmVzb2x1dGlvbiDigJQgYW5kIHRoZSBlc3RpbWF0ZSBjb3N0cyBvbmUgcGFzcyBvdmVyIHRoaXMgbWFueSBwaXhlbHMuICovXG5leHBvcnQgY29uc3QgR0VORV9NQVBfTUFYX1NJREUgPSA1MTI7XG4vKiogS2VybmVsIM+DIGluIGZpZWxkIHBpeGVscyBhdCBzbW9vdGhpbmcgMTogd2lkZSBlbm91Z2ggdG8gcmVhZCBiZXR3ZWVuIGNlbGxzLFxuICogIHRpZ2h0IGVub3VnaCB0byBrZWVwIGEgbnVjbGV1cy1zY2FsZSBzdHJ1Y3R1cmUgZGlzdGluY3QuICovXG5leHBvcnQgY29uc3QgR0VORV9NQVBfU0lHTUEgPSAyLjU7XG4vKipcbiAqIEluLXBsYW5lIGNvYXJzZW5pbmcgb2YgdGhlIDNEIGdlbmUgbWFwJ3MgbGF0dGljZSwgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZVxuICogdm9sdW1lLiBUaGUgZmllbGQgaXMgc21vb3RoLCBzbyBpdHMgZGV0YWlsIGlzIHNldCBieSB0aGUga2VybmVsIHJhdGhlciB0aGFuIHRoZVxuICogcmFzdGVyIOKAlCBhbmQgdGhlIGVzdGltYXRlIGlzIGEgcGFpciBvZiBzZXBhcmFibGUgYmx1cnMsIHdoaWNoIGF0IHRoZSB0ZW1wbGF0ZSdzXG4gKiBmdWxsIHJlc29sdXRpb24gbWVhbnMgc2Vjb25kcyBvZiB3b3JrIHBlciB0b2dnbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBHRU5FX01BUF9WT0xVTUVfU1RSSURFID0gMjtcbi8qKiBDbHVzdGVycyBkcmF3biBhcyBkZW5zaXR5IHZvbHVtZXMgYXQgb25jZS4gUGFzdCBhIGhhbmRmdWwsIGFkZGl0aXZlIHRyYW5zbHVjZW50XG4gKiAgY2xvdWRzIHN0b3AgYmVpbmcgc2VwYXJhYmxlIGJ5IGV5ZSDigJQgYW5kIGVhY2ggb25lIGlzIGEgZnVsbCByYXN0ZXJpc2F0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IERFTlNJVFlfTUFYX0NMVVNURVJTID0gNjtcbi8qKiBIb3cgbXVjaCBsYXJnZXIgYSBzZWxlY3RlZCBtYXJrZXIgaXMgZHJhd24sIHNvIGEgc21hbGwgc2VsZWN0aW9uIGlzIGZpbmRhYmxlIGluc2lkZSBhXG4gKiAgMy43TS1wb2ludCBjbG91ZCByYXRoZXIgdGhhbiBtZXJlbHkgYnJpZ2h0ZXIuICovXG5leHBvcnQgY29uc3QgU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFID0gMS42O1xuLyoqIEJhc2UgbWFya2VyIGRpYW1ldGVyIGZvciB0aGUgM0QgY2xvdWQsIGluIFNDUkVFTiBwaXhlbHMgKHRoZSBsYXllcidzIHVuaXQpLiAqL1xuZXhwb3J0IGNvbnN0IFNQQVRJQUxfM0RfQkFTRV9TSVpFID0gMztcblxuLyoqIENvbG91ciBmb3Igb2JzZXJ2YXRpb25zIHdoZW4gbm90aGluZyBpcyBzZWxlY3RlZCB0byBjb2xvdXIgYnk6IHZpc2libGUsIG5ldXRyYWwsIGFuZFxuICogIG9idmlvdXNseSBub3QgZW5jb2RpbmcgYW55dGhpbmcuICovXG5leHBvcnQgY29uc3QgU1BBVElBTF9ORVVUUkFMX0NPTE9SOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFswLjM1LCAwLjcyLCAwLjk1LCAwLjldO1xuLyoqIHtAbGluayBTUEFUSUFMX05FVVRSQUxfQ09MT1J9IGFzIGEgaGV4IGNvbG91ciAoYWxwaGEgZHJvcHBlZCksIGZvciB0aGUgZW5jb2RlcnMgYW5kIHRoZVxuICogIGRlbnNpdHktdm9sdW1lIHRpbnQuICovXG5leHBvcnQgY29uc3QgU1BBVElBTF9ORVVUUkFMX0hFWCA9IGAjJHtTUEFUSUFMX05FVVRSQUxfQ09MT1Iuc2xpY2UoMCwgMylcbiAgLm1hcCgoYykgPT5cbiAgICBNYXRoLnJvdW5kKGMgKiAyNTUpXG4gICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKSxcbiAgKVxuICAuam9pbignJyl9YDtcblxuLyoqXG4gKiBDb250cmFzdCB3aW5kb3dzIG1lbW9pc2VkIHBlciAodmFsdWVzIGFycmF5LCBsbywgaGksIGxvZykuIGBjb250cmFzdFdpbmRvd2Agc29ydHMgZXZlcnkgdmFsdWUsXG4gKiBhbmQgdGhlIHNwYXRpYWwgY29sb3VyaW5nIHJlLXJ1bnMgaXQgb24gZWFjaCBvcGFjaXR5LCBzZWxlY3Rpb24gb3IgY29sb3JtYXAgY2hhbmdlIHdoaWxlIHRoZVxuICogY29sb3VyZWQgdmVjdG9yIGl0c2VsZiBpcyB1bmNoYW5nZWQgKHJldmlldyBTUEFUSUFMLTEyKS4gS2V5ZWQgYnkgdGhlIHZlY3RvcidzIGlkZW50aXR5LCBzbyBhXG4gKiBuZXcgY29sdW1uIG9yIGdlbmUgdmVjdG9yIGlzIGEgbWlzcyBhbmQgYW4gb2xkIG9uZSBpcyBjb2xsZWN0ZWQgd2l0aCBpdHMgd2luZG93cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyYXN0V2luZG93Q2FjaGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGJ5VmVjdG9yID0gbmV3IFdlYWtNYXA8RmxvYXQzMkFycmF5LCBNYXA8c3RyaW5nLCBbbnVtYmVyLCBudW1iZXJdPj4oKTtcblxuICBnZXQoXG4gICAgdmFsdWVzOiBGbG9hdDMyQXJyYXksXG4gICAgbG86IG51bWJlcixcbiAgICBoaTogbnVtYmVyLFxuICAgIGxvZzogYm9vbGVhbixcbiAgICBjb21wdXRlOiAoKSA9PiBbbnVtYmVyLCBudW1iZXJdLFxuICApOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICBsZXQgd2luZG93cyA9IHRoaXMuYnlWZWN0b3IuZ2V0KHZhbHVlcyk7XG4gICAgaWYgKCF3aW5kb3dzKSB7XG4gICAgICB3aW5kb3dzID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5ieVZlY3Rvci5zZXQodmFsdWVzLCB3aW5kb3dzKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gYCR7bG99fCR7aGl9fCR7bG9nID8gMSA6IDB9YDtcbiAgICBsZXQgdyA9IHdpbmRvd3MuZ2V0KGtleSk7XG4gICAgaWYgKCF3KSB7XG4gICAgICB3ID0gY29tcHV0ZSgpO1xuICAgICAgd2luZG93cy5zZXQoa2V5LCB3KTtcbiAgICB9XG4gICAgcmV0dXJuIHc7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IHRoZSAzRCBwb2ludHMgbGF5ZXIgbmVlZHMgdG8gY29sb3VyIGEgY2xvdWQ6IGZvciBjb250aW51b3VzIGRhdGEsIG9uZSBzY2FsYXIgcGVyIHBvaW50LCBhXG4gKiBjb2xvcm1hcCBhbmQgdGhlIHdpbmRvdyB0aGF0IG1hcHMgc2NhbGFycyBvbnRvIGl0OyBmb3IgY2F0ZWdvcmljYWwgZGF0YSwgb25lIHBhY2tlZCBSR0JBIHBlclxuICogcG9pbnQgKGBQb2ludHMzRExheWVyLmNvbG9yc2AsIHdoaWNoIHdpbnMgb3ZlciB0aGUgc2NhbGFycykuXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXRpYWwzZEVuY29kaW5nID0gU3BhdGlhbDNkU2NhbGFycyB8IFNwYXRpYWwzZENvbG9ycztcblxuLyoqIEEgY2xvdWQgY29sb3VyZWQgdGhyb3VnaCB0aGUgY29sb3JtYXA6IHNjYWxhcnMsIGNvbG9ybWFwIGFuZCB3aW5kb3cuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWwzZFNjYWxhcnMge1xuICBraW5kOiAnc2NhbGFycyc7XG4gIHZhbHVlczogRmxvYXQzMkFycmF5O1xuICBjb2xvcm1hcDogQ29sb3JtYXA7XG4gIGNvbnRyYXN0TGltaXRzOiBbbnVtYmVyLCBudW1iZXJdO1xufVxuXG4vKiogQSBjbG91ZCBjb2xvdXJlZCBwb2ludCBieSBwb2ludDogcGFja2VkIFJHQkEsIDQgZmxvYXRzIHBlciBwb2ludC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbDNkQ29sb3JzIHtcbiAga2luZDogJ2NvbG9ycyc7XG4gIGNvbG9yczogRmxvYXQzMkFycmF5O1xufVxuXG4vKiogQSBvbmUtY29sb3VyIGNvbG9ybWFwLCBmb3IgdGhlIFwibm90aGluZyB0byBjb2xvdXIgYnlcIiBzdGF0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF0aWFsRmxhdENvbG9ybWFwKCk6IENvbG9ybWFwIHtcbiAgY29uc3QgW3IsIGcsIGJdID0gU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICBjb25zdCByZ2I6IFJnYiA9IFtNYXRoLnJvdW5kKHIgKiAyNTUpLCBNYXRoLnJvdW5kKGcgKiAyNTUpLCBNYXRoLnJvdW5kKGIgKiAyNTUpXTtcbiAgLy8gVHdvIGlkZW50aWNhbCBzdG9wczogY29sb3JtYXBGcm9tTHV0IG5lZWRzIGF0IGxlYXN0IHR3bywgYW5kIGVxdWFsIGVuZHNcbiAgLy8gbWFrZSBldmVyeSB2YWx1ZSByZXNvbHZlIHRvIHRoZSBzYW1lIGNvbG91ci5cbiAgcmV0dXJuIGNvbG9ybWFwRnJvbUx1dCgnc3BhdGlhbC1mbGF0JywgW3JnYiwgcmdiXSk7XG59XG5cbi8qKlxuICogQ2F0ZWdvcnkgY29kZXMg4oaSIG9uZSBSR0JBIHBlciBwb2ludCwgZm9yIGFueSBudW1iZXIgb2YgY2F0ZWdvcmllcy5cbiAqXG4gKiBUaGUgMkQgbWFya2VycycgZW5jb2RpbmcsIHdpdGggb25lIGRpZmZlcmVuY2U6IGEgcG9pbnQgd2l0aCBubyBjYXRlZ29yeSBzdGF5cyBvcGFxdWUgKGdyZXkpLFxuICogYXMgaXQgYWx3YXlzIGhhcyBpbiB0aGUgY2xvdWQsIHdoZXJlIHRoZSBzZWxlY3Rpb24gZGltcyB0aHJvdWdoIHRoZSBsYXllcidzIHBlci1wb2ludCBhbHBoYXNcbiAqIGluc3RlYWQuIEl0IHVzZWQgdG8gYmUgc211Z2dsZWQgdGhyb3VnaCB0aGUgc2NhbGFyIGNoYW5uZWwgYXMgYSBzdGVwcGVkIDI1Ni1lbnRyeSBMVVQsIHdoaWNoXG4gKiBrZXB0IGF0IG1vc3QgOTUgY2F0ZWdvcmllcyBhcGFydCAocmV2aWV3IFNQQVRJQUwtMTEsIE5BUEFSSS1TVkMtMTgpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwoY29kZXM6IFVpbnQxNkFycmF5LCBjb2xvcnM6IHN0cmluZ1tdKTogU3BhdGlhbDNkQ29sb3JzIHtcbiAgcmV0dXJuIHsga2luZDogJ2NvbG9ycycsIGNvbG9yczogZW5jb2RlQ2F0ZWdvcmljYWwoY29kZXMsIHsgY29sb3JzLCBtdXRlZE9wYWNpdHk6IDEgfSkgfTtcbn1cblxuLyoqIENvbnRpbnVvdXMgdmFsdWVzIOKGkiBgbHV0YCBvdmVyIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdyAobG9nMXAgZmlyc3Qgd2hlbiB0aGUgdmlldydzIGxvZ1xuICogIHNjYWxlIGlzIG9uKSwgZm9yIHRoZSAzRCBjbG91ZCdzIHNjYWxhciBjaGFubmVsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMoXG4gIHNvdXJjZTogRmxvYXQzMkFycmF5LFxuICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICBsdXQ6IFJnYltdLFxuICB3aW5kb3dzOiBDb250cmFzdFdpbmRvd0NhY2hlLFxuKTogU3BhdGlhbDNkU2NhbGFycyB7XG4gIGNvbnN0IFtsbywgaGldID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gIGNvbnN0IGxvZyA9ICEhdmlldy5sb2dTY2FsZTtcbiAgbGV0IHZhbHVlcyA9IHNvdXJjZTtcbiAgaWYgKGxvZykge1xuICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc291cmNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHZhbHVlc1tpXSA9IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgc291cmNlW2ldKSk7XG4gIH1cbiAgLy8gS2V5ZWQgYnkgdGhlIFNPVVJDRSB2ZWN0b3I6IHRoZSBsb2cgY29weSBhYm92ZSBpcyBuZXcgb24gZXZlcnkgY2FsbC5cbiAgY29uc3QgW21pbiwgbWF4XSA9IHdpbmRvd3MuZ2V0KHNvdXJjZSwgbG8sIGhpLCBsb2csICgpID0+IGNvbnRyYXN0V2luZG93KHZhbHVlcywgbG8sIGhpKSk7XG4gIHJldHVybiB7XG4gICAga2luZDogJ3NjYWxhcnMnLFxuICAgIHZhbHVlcyxcbiAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWNvbnRpbnVvdXMnLCBsdXQpLFxuICAgIC8vIEEgZGVnZW5lcmF0ZSB3aW5kb3cgd291bGQgZGl2aWRlIGJ5IHplcm8gaW4gdGhlIHNoYWRlcidzIG5vcm1hbGlzYXRpb24uXG4gICAgY29udHJhc3RMaW1pdHM6IG1heCA+IG1pbiA/IFttaW4sIG1heF0gOiBbbWluLCBtaW4gKyAxXSxcbiAgfTtcbn1cblxuLyoqIENvbnRpbnVvdXMgdmFsdWVzIOKGkiBwZXItcG9pbnQgUkdCQSB0aHJvdWdoIGBsdXRgIGFuZCBhIGNsaXBwZWQgd2luZG93IChsb2cgc2NhbGUgcGVyIHRoZVxuICogIHZpZXcpLCBmb3IgdGhlIDJEIG1hcmtlcnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gIHZhbHVlczogRmxvYXQzMkFycmF5LFxuICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICBsdXQ6IFJnYltdLFxuICB3aW5kb3dzOiBDb250cmFzdFdpbmRvd0NhY2hlLFxuICBtdXRlZDogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgW2xvLCBoaV0gPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgLy8gVGhlIHdpbmRvdyBpcyB0YWtlbiBvbiB0aGUgcmF3IHZhbHVlcyAoZW5jb2RlQ29udGludW91cyBhcHBsaWVzIHRoZSBsb2cgaXRzZWxmKS5cbiAgY29uc3QgW21pbiwgbWF4XSA9IHdpbmRvd3MuZ2V0KHZhbHVlcywgbG8sIGhpLCBmYWxzZSwgKCkgPT4gY29udHJhc3RXaW5kb3codmFsdWVzLCBsbywgaGkpKTtcbiAgcmV0dXJuIGVuY29kZUNvbnRpbnVvdXModmFsdWVzLCB7XG4gICAgbHV0LFxuICAgIG1pbixcbiAgICBtYXgsXG4gICAgbG9nOiB2aWV3LmxvZ1NjYWxlLFxuICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICBtdXRlZCxcbiAgfSk7XG59XG5cbi8qKiBNYXJrZXIgY29sb3VyczogcGFja2VkIHBlci1wb2ludCBSR0JBICg0IGZsb2F0cyBwZXIgcG9pbnQsIHRoZSBzaGFwZSBuYXBhcmktanMgY29waWVzIHN0cmFpZ2h0XG4gKiAgaW50byBpdHMgaW5zdGFuY2UgYnVmZmVyKSwgb3Igb25lIFJHQkEgYnJvYWRjYXN0IHRvIGV2ZXJ5IHBvaW50LiAqL1xuZXhwb3J0IHR5cGUgUG9pbnRDb2xvcnMgPSBGbG9hdDMyQXJyYXkgfCBSR0JBO1xuXG4vKiogV2hldGhlciBhIGNvbG91ciBpbnB1dCBpcyBvbmUgUkdCQSBwZXIgcG9pbnQgcmF0aGVyIHRoYW4gb25lIGJyb2FkY2FzdCBSR0JBLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGVyUG9pbnQoY29sb3JzOiBQb2ludENvbG9ycyk6IGNvbG9ycyBpcyBGbG9hdDMyQXJyYXkge1xuICByZXR1cm4gY29sb3JzIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5O1xufVxuXG4vKipcbiAqIGBjb2xvcnNgIHdpdGggZXZlcnkgb2JzZXJ2YXRpb24gYHNob3duYCBsZWF2ZXMgYXQgMCBtYWRlIHRyYW5zcGFyZW50OiB0aGUgb2JzZXJ2YXRpb25zIGEgZ2VuZVxuICogZmlsdGVyIGxlYXZlcyBvdXQuIEEgYnJvYWRjYXN0IGNvbG91ciBiZWNvbWVzIHBlci1wb2ludCwgc2luY2UgdGhlIHBvaW50cyBub3cgZGlmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZVVuc2hvd24oY29sb3JzOiBQb2ludENvbG9ycywgc2hvd246IFVpbnQ4QXJyYXkpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBjb3VudCA9IHNob3duLmxlbmd0aDtcbiAgbGV0IG91dDogRmxvYXQzMkFycmF5O1xuICBpZiAoaXNQZXJQb2ludChjb2xvcnMpKSB7XG4gICAgb3V0ID0gY29sb3JzLnNsaWNlKCk7IC8vIHRoZSBpbnB1dCBtYXkgYmUgaGVsZCBlbHNld2hlcmVcbiAgfSBlbHNlIHtcbiAgICBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBvdXQuc2V0KGNvbG9ycywgaSAqIDQpO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaWYgKCFzaG93bltpXSkgb3V0WzQgKiBpICsgM10gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKiogUGVyLXBvaW50IGNvbG91cnMgZm9yIHRoZSBkcmF3biBzdWJzZXQuIEEgYnJvYWRjYXN0IHR1cGxlIHN0YXlzIGJyb2FkY2FzdCDigJRcbiAqICBpdCBpcyBvbmUgY29sb3VyIGZvciBldmVyeSBwb2ludCBlaXRoZXIgd2F5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlckNvbG9ycyhjb2xvcnM6IFBvaW50Q29sb3JzLCBpbmRpY2VzPzogVWludDMyQXJyYXkpOiBQb2ludENvbG9ycyB7XG4gIGlmICghaW5kaWNlcyB8fCAhaXNQZXJQb2ludChjb2xvcnMpKSByZXR1cm4gY29sb3JzO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KGluZGljZXMubGVuZ3RoICogNCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHMgPSBpbmRpY2VzW2ldICogNDtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgb3V0W29dID0gY29sb3JzW3NdO1xuICAgIG91dFtvICsgMV0gPSBjb2xvcnNbcyArIDFdO1xuICAgIG91dFtvICsgMl0gPSBjb2xvcnNbcyArIDJdO1xuICAgIG91dFtvICsgM10gPSBjb2xvcnNbcyArIDNdO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBPbmUgZGVuc2l0eSB2b2x1bWUncyBvYnNlcnZhdGlvbnM6IGEgY2x1c3RlciAob3IgYWxsIGNlbGxzKSwgd2l0aCBpdHMgbGVnZW5kIGNvbG91ci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVuc2l0eUdyb3VwIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjb2xvcjogc3RyaW5nO1xuICBpbmRpY2VzPzogVWludDMyQXJyYXk7XG59XG5cbi8qKiBUaGUgc2luZ2xlIGdyb3VwIGRyYXduIHdoZW4gdGhlIGNvbG91cmluZyBpcyBub3QgY2F0ZWdvcmljYWw6IHRvdGFsIGNlbGwgZGVuc2l0eSwgd2l0aGluIHRoZVxuICogIHNlbGVjdGlvbiB3aGVuIHRoZXJlIGlzIG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b3RhbERlbnNpdHlHcm91cChzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogRGVuc2l0eUdyb3VwIHtcbiAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gc2VsZWN0aW9uLm1hc2sgOiBudWxsO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGluU2VsZWN0aW9uID8gJ3NlbGVjdGVkIGNlbGxzJyA6ICdhbGwgY2VsbHMnLFxuICAgIGNvbG9yOiBTUEFUSUFMX05FVVRSQUxfSEVYLFxuICAgIGluZGljZXM6IGluU2VsZWN0aW9uID8gbWFza1RvSW5kaWNlcyhpblNlbGVjdGlvbikgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGNsdXN0ZXJzIG9mIGEgY2F0ZWdvcmljYWwgY29sdW1uIHRvIHJhc3RlcmlzZSwgYmlnZ2VzdCBmaXJzdCBhbmQgY2FwcGVkIGF0XG4gKiB7QGxpbmsgREVOU0lUWV9NQVhfQ0xVU1RFUlN9LCBlYWNoIHdpdGggaXRzIGxlZ2VuZCBjb2xvdXIg4oCUIHJlc3RyaWN0ZWQgdG8gdGhlIHNlbGVjdGlvbiB3aGVuXG4gKiB0aGVyZSBpcyBvbmUsIHNvIFwic2VsZWN0IGEgcmVnaW9uLCBjaGVjayB0aGUgYm94XCIgYW5zd2VycyB3aGljaCBjbHVzdGVycyBsaXZlIHRoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua0RlbnNpdHlHcm91cHMoXG4gIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgY29sdW1uOiBDYXRlZ29yaWNhbENvbHVtbixcbiAgY291bnQ6IG51bWJlcixcbiAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbik6IERlbnNpdHlHcm91cFtdIHtcbiAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gc2VsZWN0aW9uLm1hc2sgOiBudWxsO1xuICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29sdW1uLm1ldGEpO1xuICBjb25zdCBjb3VudHMgPSBuZXcgVWludDMyQXJyYXkoY29sdW1uLm1ldGEuY2F0ZWdvcmllcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBpZiAoaW5TZWxlY3Rpb24gJiYgIWluU2VsZWN0aW9uW2ldKSBjb250aW51ZTtcbiAgICBjb25zdCBjb2RlID0gY29sdW1uLmNvZGVzW2ldO1xuICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBjb2RlIDwgY291bnRzLmxlbmd0aCkgY291bnRzW2NvZGVdKys7XG4gIH1cbiAgY29uc3QgcmFua2VkID0gQXJyYXkuZnJvbShjb3VudHMsIChuLCBjb2RlKSA9PiAoeyBjb2RlLCBuIH0pKVxuICAgIC5maWx0ZXIoKGMpID0+IGMubiA+IDApXG4gICAgLnNvcnQoKGEsIGIpID0+IGIubiAtIGEubilcbiAgICAuc2xpY2UoMCwgREVOU0lUWV9NQVhfQ0xVU1RFUlMpO1xuICBpZiAoY291bnRzLmZpbHRlcigoYykgPT4gYyA+IDApLmxlbmd0aCA+IHJhbmtlZC5sZW5ndGgpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW25hcGFyaS1qc10gJHtjb2x1bW5OYW1lfTogZHJhd2luZyB0aGUgJHtyYW5rZWQubGVuZ3RofSBsYXJnZXN0IGNsdXN0ZXJzIGFzIGRlbnNpdHkgYCArXG4gICAgICAgICd2b2x1bWVzOyBtb3JlIHRoYW4gdGhhdCBzdG9wIGJlaW5nIHNlcGFyYWJsZSBieSBleWUnLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJhbmtlZC5tYXAoKHsgY29kZSB9KSA9PiB7XG4gICAgY29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShjb3VudHNbY29kZV0pO1xuICAgIGxldCBrID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGlmIChpblNlbGVjdGlvbiAmJiAhaW5TZWxlY3Rpb25baV0pIGNvbnRpbnVlO1xuICAgICAgaWYgKGNvbHVtbi5jb2Rlc1tpXSA9PT0gY29kZSkgaW5kaWNlc1trKytdID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXNbY29kZV0sXG4gICAgICBjb2xvcjogY29sb3JzW2NvZGVdID8/ICcjODg4ODg4JyxcbiAgICAgIGluZGljZXM6IGluZGljZXMuc3ViYXJyYXkoMCwgayksXG4gICAgfTtcbiAgfSk7XG59XG4iXX0=
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUk1QyxPQUFPLEVBQXFCLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTFGLE9BQU8sRUFDTCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUVoQixpQkFBaUIsR0FFbEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQXdCLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRGOzs7O0dBSUc7QUFFSCwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDOzs7NkZBRzZGO0FBQzdGLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQztBQUNqRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsQ0FBQztBQUM5Qzs7MEVBRTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUNyQzsrREFDK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUNsQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUN4QztpRkFDaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDO29EQUNvRDtBQUNwRCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUM7QUFDL0Msa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENB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QUFDLENBQUM7Z0JBQUUsU0FBUztZQUM3QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtnQkFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU87WUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2xDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUztZQUNoQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2hDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2xvcm1hcEZyb21MdXQgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBDb2xvcm1hcCB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IFJnYiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgQ2F0ZWdvcmljYWxDb2x1bW4sIE5PX0NBVEVHT1JZIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHtcbiAgY29udHJhc3RXaW5kb3csXG4gIGVuY29kZUNhdGVnb3JpY2FsLFxuICBlbmNvZGVDb250aW51b3VzLFxuICBHcm91cENvbG9yT3ZlcnJpZGVzLFxuICBjYXRlZ29yeUNvbG9yc0ZvcixcbiAgdHlwZSBSR0JBLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvbk1hc2ssIG1hc2tUb0luZGljZXMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcblxuLyoqXG4gKiBUaGUgc3BhdGlhbCBzY2VuZXMnIHB1cmUgY29sb3VyIGFuZCBncm91cGluZyBtYXRoOiB3aGF0IHRoZSAyRCBtYXJrZXJzLCB0aGUgM0QgY2xvdWQgYW5kIHRoZVxuICogZGVuc2l0eSB2b2x1bWVzIGFyZSBjb2xvdXJlZCB3aXRoLCBhcyBmdW5jdGlvbnMgb2YgdGhlIGRhdGEsIHRoZSB2aWV3IGFuZCBhIExVVC4gTm8gdmlld2VyLCBub1xuICogcG9ydCwgbm8gc3RvcmUgKHJldmlldyBBcHBlbmRpeCBCLCBzdGVwIDEpLlxuICovXG5cbi8qKiBNYXJrZXIgcmFkaXVzIChpbWFnZSBweCkgZm9yIGEgZGF0YXNldCB0aGF0IGRlY2xhcmVzIG5vbmUg4oCUIHNlZ21lbnRlZCBjZWxscyBvZnRlbiBkb24ndC4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX0ZBTExCQUNLX1JBRElVUyA9IDQ7XG4vKiogU21hbGxlc3QgbWFya2VyIERJQU1FVEVSLCBpbiBzbGljZSBwaXhlbHMsIG92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQuIEEgY2VsbCdzIHJlYWxcbiAqICBzaXplIGlzIGhvbm91cmVkIHdoZXJldmVyIGl0IHN1cnZpdmVzIHRoZSBncmlkOiB0aGUgQUJDIGF0bGFzIHNlcnZlcyA1IMK1bSByYWRpaSBvbiBhXG4gKiAgNDAgwrVtL3B4IHRlbXBsYXRlLCBzbyBkcmF3aW5nIHRoZW0gdG8gc2NhbGUgd291bGQgcHV0IGV2ZXJ5IGNlbGwgYSBmaWZ0aCBvZiBhIHBpeGVsIHdpZGVcbiAqICBhbmQgdGhlIHNlY3Rpb24gd291bGQgY29tZSB1cCBlbXB0eS4gVGhlIHBvaW50LXNpemUgY29udHJvbCBzY2FsZXMgdXAgZnJvbSB0aGlzIGZsb29yLiAqL1xuZXhwb3J0IGNvbnN0IFNQQVRJQUxfU0xJQ0VfTUlOX0RJQU1FVEVSX1BYID0gMS41O1xuLyoqXG4gKiBTbWFsbGVzdCBkcmF3biBtYXJrZXIgZGlhbWV0ZXIgaW4gdGhlIDJEIHZpZXcsIGluIFNDUkVFTiBwaXhlbHMsIGF0IGFueSB6b29tLiBBIG1hcmtlcidzIHNpemUgaXNcbiAqIHRoZSBjZWxsJ3Mgb3duIChkYXRhIHVuaXRzKSwgc28gem9vbWVkIG91dCBvdmVyIGEgd2hvbGUgQ3l0b3MgcGxhdGUgb3IgWGVuaXVtIHNlY3Rpb24gZXZlcnkgY2VsbFxuICogZmVsbCBiZWxvdyBhIHBpeGVsIGFuZCB0aGUgb2JzZXJ2YXRpb25zIHZhbmlzaGVkOyB3aXRoIHRoZSBmbG9vciB0aGV5IHN0YXkgYSBkZW5zZSBmaWVsZCBvZlxuICogZG90cywgY29sb3VyZWQgYXMgdGhleSBhcmUsIGF0IGV2ZXJ5IHpvb20gKHRoZSBHUFUgYXBwbGllcyBpdCBwZXIgZnJhbWU6IG5vIHJlYnVpbGQgb24gem9vbSkuXG4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX01BUktFUl9NSU5fU0NSRUVOX1BYID0gMjtcbi8qKiBMb25nZXN0IHNpZGUgb2YgdGhlIGdlbmUtbWFwIHJhc3RlciwgaW4gZmllbGQgcGl4ZWxzLiBBIGdlbmUgbWFwIGlzIGEgc21vb3RoXG4gKiAgZmllbGQgcmVhZCBhcyB0ZXJyaXRvcnksIHNvIGl0IGdhaW5zIG5vdGhpbmcgZnJvbSBtYXRjaGluZyBhIDIgR3B4IHNsaWRlJ3NcbiAqICByZXNvbHV0aW9uIOKAlCBhbmQgdGhlIGVzdGltYXRlIGNvc3RzIG9uZSBwYXNzIG92ZXIgdGhpcyBtYW55IHBpeGVscy4gKi9cbmV4cG9ydCBjb25zdCBHRU5FX01BUF9NQVhfU0lERSA9IDUxMjtcbi8qKiBLZXJuZWwgz4MgaW4gZmllbGQgcGl4ZWxzIGF0IHNtb290aGluZyAxOiB3aWRlIGVub3VnaCB0byByZWFkIGJldHdlZW4gY2VsbHMsXG4gKiAgdGlnaHQgZW5vdWdoIHRvIGtlZXAgYSBudWNsZXVzLXNjYWxlIHN0cnVjdHVyZSBkaXN0aW5jdC4gKi9cbmV4cG9ydCBjb25zdCBHRU5FX01BUF9TSUdNQSA9IDIuNTtcbi8qKlxuICogSW4tcGxhbmUgY29hcnNlbmluZyBvZiB0aGUgM0QgZ2VuZSBtYXAncyBsYXR0aWNlLCByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlXG4gKiB2b2x1bWUuIFRoZSBmaWVsZCBpcyBzbW9vdGgsIHNvIGl0cyBkZXRhaWwgaXMgc2V0IGJ5IHRoZSBrZXJuZWwgcmF0aGVyIHRoYW4gdGhlXG4gKiByYXN0ZXIg4oCUIGFuZCB0aGUgZXN0aW1hdGUgaXMgYSBwYWlyIG9mIHNlcGFyYWJsZSBibHVycywgd2hpY2ggYXQgdGhlIHRlbXBsYXRlJ3NcbiAqIGZ1bGwgcmVzb2x1dGlvbiBtZWFucyBzZWNvbmRzIG9mIHdvcmsgcGVyIHRvZ2dsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUgPSAyO1xuLyoqIENsdXN0ZXJzIGRyYXduIGFzIGRlbnNpdHkgdm9sdW1lcyBhdCBvbmNlLiBQYXN0IGEgaGFuZGZ1bCwgYWRkaXRpdmUgdHJhbnNsdWNlbnRcbiAqICBjbG91ZHMgc3RvcCBiZWluZyBzZXBhcmFibGUgYnkgZXllIOKAlCBhbmQgZWFjaCBvbmUgaXMgYSBmdWxsIHJhc3RlcmlzYXRpb24uICovXG5leHBvcnQgY29uc3QgREVOU0lUWV9NQVhfQ0xVU1RFUlMgPSA2O1xuLyoqIEhvdyBtdWNoIGxhcmdlciBhIHNlbGVjdGVkIG1hcmtlciBpcyBkcmF3biwgc28gYSBzbWFsbCBzZWxlY3Rpb24gaXMgZmluZGFibGUgaW5zaWRlIGFcbiAqICAzLjdNLXBvaW50IGNsb3VkIHJhdGhlciB0aGFuIG1lcmVseSBicmlnaHRlci4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgPSAxLjY7XG4vKiogQmFzZSBtYXJrZXIgZGlhbWV0ZXIgZm9yIHRoZSAzRCBjbG91ZCwgaW4gU0NSRUVOIHBpeGVscyAodGhlIGxheWVyJ3MgdW5pdCkuICovXG5leHBvcnQgY29uc3QgU1BBVElBTF8zRF9CQVNFX1NJWkUgPSAzO1xuXG4vKiogQ29sb3VyIGZvciBvYnNlcnZhdGlvbnMgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkIHRvIGNvbG91ciBieTogdmlzaWJsZSwgbmV1dHJhbCwgYW5kXG4gKiAgb2J2aW91c2x5IG5vdCBlbmNvZGluZyBhbnl0aGluZy4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX05FVVRSQUxfQ09MT1I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAuMzUsIDAuNzIsIDAuOTUsIDAuOV07XG4vKioge0BsaW5rIFNQQVRJQUxfTkVVVFJBTF9DT0xPUn0gYXMgYSBoZXggY29sb3VyIChhbHBoYSBkcm9wcGVkKSwgZm9yIHRoZSBlbmNvZGVycyBhbmQgdGhlXG4gKiAgZGVuc2l0eS12b2x1bWUgdGludC4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX05FVVRSQUxfSEVYID0gYCMke1NQQVRJQUxfTkVVVFJBTF9DT0xPUi5zbGljZSgwLCAzKVxuICAubWFwKChjKSA9PlxuICAgIE1hdGgucm91bmQoYyAqIDI1NSlcbiAgICAgIC50b1N0cmluZygxNilcbiAgICAgIC5wYWRTdGFydCgyLCAnMCcpLFxuICApXG4gIC5qb2luKCcnKX1gO1xuXG4vKipcbiAqIENvbnRyYXN0IHdpbmRvd3MgbWVtb2lzZWQgcGVyICh2YWx1ZXMgYXJyYXksIGxvLCBoaSwgbG9nKS4gYGNvbnRyYXN0V2luZG93YCBzb3J0cyBldmVyeSB2YWx1ZSxcbiAqIGFuZCB0aGUgc3BhdGlhbCBjb2xvdXJpbmcgcmUtcnVucyBpdCBvbiBlYWNoIG9wYWNpdHksIHNlbGVjdGlvbiBvciBjb2xvcm1hcCBjaGFuZ2Ugd2hpbGUgdGhlXG4gKiBjb2xvdXJlZCB2ZWN0b3IgaXRzZWxmIGlzIHVuY2hhbmdlZCAocmV2aWV3IFNQQVRJQUwtMTIpLiBLZXllZCBieSB0aGUgdmVjdG9yJ3MgaWRlbnRpdHksIHNvIGFcbiAqIG5ldyBjb2x1bW4gb3IgZ2VuZSB2ZWN0b3IgaXMgYSBtaXNzIGFuZCBhbiBvbGQgb25lIGlzIGNvbGxlY3RlZCB3aXRoIGl0cyB3aW5kb3dzLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJhc3RXaW5kb3dDYWNoZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnlWZWN0b3IgPSBuZXcgV2Vha01hcDxGbG9hdDMyQXJyYXksIE1hcDxzdHJpbmcsIFtudW1iZXIsIG51bWJlcl0+PigpO1xuXG4gIGdldChcbiAgICB2YWx1ZXM6IEZsb2F0MzJBcnJheSxcbiAgICBsbzogbnVtYmVyLFxuICAgIGhpOiBudW1iZXIsXG4gICAgbG9nOiBib29sZWFuLFxuICAgIGNvbXB1dGU6ICgpID0+IFtudW1iZXIsIG51bWJlcl0sXG4gICk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGxldCB3aW5kb3dzID0gdGhpcy5ieVZlY3Rvci5nZXQodmFsdWVzKTtcbiAgICBpZiAoIXdpbmRvd3MpIHtcbiAgICAgIHdpbmRvd3MgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLmJ5VmVjdG9yLnNldCh2YWx1ZXMsIHdpbmRvd3MpO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBgJHtsb318JHtoaX18JHtsb2cgPyAxIDogMH1gO1xuICAgIGxldCB3ID0gd2luZG93cy5nZXQoa2V5KTtcbiAgICBpZiAoIXcpIHtcbiAgICAgIHcgPSBjb21wdXRlKCk7XG4gICAgICB3aW5kb3dzLnNldChrZXksIHcpO1xuICAgIH1cbiAgICByZXR1cm4gdztcbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgdGhlIDNEIHBvaW50cyBsYXllciBuZWVkcyB0byBjb2xvdXIgYSBjbG91ZDogZm9yIGNvbnRpbnVvdXMgZGF0YSwgb25lIHNjYWxhciBwZXIgcG9pbnQsIGFcbiAqIGNvbG9ybWFwIGFuZCB0aGUgd2luZG93IHRoYXQgbWFwcyBzY2FsYXJzIG9udG8gaXQ7IGZvciBjYXRlZ29yaWNhbCBkYXRhLCBvbmUgcGFja2VkIFJHQkEgcGVyXG4gKiBwb2ludCAoYFBvaW50czNETGF5ZXIuY29sb3JzYCwgd2hpY2ggd2lucyBvdmVyIHRoZSBzY2FsYXJzKS5cbiAqL1xuZXhwb3J0IHR5cGUgU3BhdGlhbDNkRW5jb2RpbmcgPSBTcGF0aWFsM2RTY2FsYXJzIHwgU3BhdGlhbDNkQ29sb3JzO1xuXG4vKiogQSBjbG91ZCBjb2xvdXJlZCB0aHJvdWdoIHRoZSBjb2xvcm1hcDogc2NhbGFycywgY29sb3JtYXAgYW5kIHdpbmRvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbDNkU2NhbGFycyB7XG4gIGtpbmQ6ICdzY2FsYXJzJztcbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gIGNvbG9ybWFwOiBDb2xvcm1hcDtcbiAgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKiBBIGNsb3VkIGNvbG91cmVkIHBvaW50IGJ5IHBvaW50OiBwYWNrZWQgUkdCQSwgNCBmbG9hdHMgcGVyIHBvaW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsM2RDb2xvcnMge1xuICBraW5kOiAnY29sb3JzJztcbiAgY29sb3JzOiBGbG9hdDMyQXJyYXk7XG59XG5cbi8qKiBBIG9uZS1jb2xvdXIgY29sb3JtYXAsIGZvciB0aGUgXCJub3RoaW5nIHRvIGNvbG91ciBieVwiIHN0YXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXRpYWxGbGF0Q29sb3JtYXAoKTogQ29sb3JtYXAge1xuICBjb25zdCBbciwgZywgYl0gPSBTUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gIGNvbnN0IHJnYjogUmdiID0gW01hdGgucm91bmQociAqIDI1NSksIE1hdGgucm91bmQoZyAqIDI1NSksIE1hdGgucm91bmQoYiAqIDI1NSldO1xuICAvLyBUd28gaWRlbnRpY2FsIHN0b3BzOiBjb2xvcm1hcEZyb21MdXQgbmVlZHMgYXQgbGVhc3QgdHdvLCBhbmQgZXF1YWwgZW5kc1xuICAvLyBtYWtlIGV2ZXJ5IHZhbHVlIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sb3VyLlxuICByZXR1cm4gY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWZsYXQnLCBbcmdiLCByZ2JdKTtcbn1cblxuLyoqXG4gKiBDYXRlZ29yeSBjb2RlcyDihpIgb25lIFJHQkEgcGVyIHBvaW50LCBmb3IgYW55IG51bWJlciBvZiBjYXRlZ29yaWVzLlxuICpcbiAqIFRoZSAyRCBtYXJrZXJzJyBlbmNvZGluZywgd2l0aCBvbmUgZGlmZmVyZW5jZTogYSBwb2ludCB3aXRoIG5vIGNhdGVnb3J5IHN0YXlzIG9wYXF1ZSAoZ3JleSksXG4gKiBhcyBpdCBhbHdheXMgaGFzIGluIHRoZSBjbG91ZCwgd2hlcmUgdGhlIHNlbGVjdGlvbiBkaW1zIHRocm91Z2ggdGhlIGxheWVyJ3MgcGVyLXBvaW50IGFscGhhc1xuICogaW5zdGVhZC4gSXQgdXNlZCB0byBiZSBzbXVnZ2xlZCB0aHJvdWdoIHRoZSBzY2FsYXIgY2hhbm5lbCBhcyBhIHN0ZXBwZWQgMjU2LWVudHJ5IExVVCwgd2hpY2hcbiAqIGtlcHQgYXQgbW9zdCA5NSBjYXRlZ29yaWVzIGFwYXJ0IChyZXZpZXcgU1BBVElBTC0xMSwgTkFQQVJJLVNWQy0xOCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbChjb2RlczogVWludDE2QXJyYXksIGNvbG9yczogc3RyaW5nW10pOiBTcGF0aWFsM2RDb2xvcnMge1xuICByZXR1cm4geyBraW5kOiAnY29sb3JzJywgY29sb3JzOiBlbmNvZGVDYXRlZ29yaWNhbChjb2RlcywgeyBjb2xvcnMsIG11dGVkT3BhY2l0eTogMSB9KSB9O1xufVxuXG4vKiogQ29udGludW91cyB2YWx1ZXMg4oaSIGBsdXRgIG92ZXIgYSBwZXJjZW50aWxlLWNsaXBwZWQgd2luZG93IChsb2cxcCBmaXJzdCB3aGVuIHRoZSB2aWV3J3MgbG9nXG4gKiAgc2NhbGUgaXMgb24pLCBmb3IgdGhlIDNEIGNsb3VkJ3Mgc2NhbGFyIGNoYW5uZWwuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgc291cmNlOiBGbG9hdDMyQXJyYXksXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGx1dDogUmdiW10sXG4gIHdpbmRvd3M6IENvbnRyYXN0V2luZG93Q2FjaGUsXG4pOiBTcGF0aWFsM2RTY2FsYXJzIHtcbiAgY29uc3QgW2xvLCBoaV0gPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgY29uc3QgbG9nID0gISF2aWV3LmxvZ1NjYWxlO1xuICBsZXQgdmFsdWVzID0gc291cmNlO1xuICBpZiAobG9nKSB7XG4gICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShzb3VyY2UubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgdmFsdWVzW2ldID0gTWF0aC5sb2cxcChNYXRoLm1heCgwLCBzb3VyY2VbaV0pKTtcbiAgfVxuICAvLyBLZXllZCBieSB0aGUgU09VUkNFIHZlY3RvcjogdGhlIGxvZyBjb3B5IGFib3ZlIGlzIG5ldyBvbiBldmVyeSBjYWxsLlxuICBjb25zdCBbbWluLCBtYXhdID0gd2luZG93cy5nZXQoc291cmNlLCBsbywgaGksIGxvZywgKCkgPT4gY29udHJhc3RXaW5kb3codmFsdWVzLCBsbywgaGkpKTtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiAnc2NhbGFycycsXG4gICAgdmFsdWVzLFxuICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtY29udGludW91cycsIGx1dCksXG4gICAgLy8gQSBkZWdlbmVyYXRlIHdpbmRvdyB3b3VsZCBkaXZpZGUgYnkgemVybyBpbiB0aGUgc2hhZGVyJ3Mgbm9ybWFsaXNhdGlvbi5cbiAgICBjb250cmFzdExpbWl0czogbWF4ID4gbWluID8gW21pbiwgbWF4XSA6IFttaW4sIG1pbiArIDFdLFxuICB9O1xufVxuXG4vKiogQ29udGludW91cyB2YWx1ZXMg4oaSIHBlci1wb2ludCBSR0JBIHRocm91Z2ggYGx1dGAgYW5kIGEgY2xpcHBlZCB3aW5kb3cgKGxvZyBzY2FsZSBwZXIgdGhlXG4gKiAgdmlldyksIGZvciB0aGUgMkQgbWFya2Vycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXksXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGx1dDogUmdiW10sXG4gIHdpbmRvd3M6IENvbnRyYXN0V2luZG93Q2FjaGUsXG4gIG11dGVkOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4pOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBbbG8sIGhpXSA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAvLyBUaGUgd2luZG93IGlzIHRha2VuIG9uIHRoZSByYXcgdmFsdWVzIChlbmNvZGVDb250aW51b3VzIGFwcGxpZXMgdGhlIGxvZyBpdHNlbGYpLlxuICBjb25zdCBbbWluLCBtYXhdID0gd2luZG93cy5nZXQodmFsdWVzLCBsbywgaGksIGZhbHNlLCAoKSA9PiBjb250cmFzdFdpbmRvdyh2YWx1ZXMsIGxvLCBoaSkpO1xuICByZXR1cm4gZW5jb2RlQ29udGludW91cyh2YWx1ZXMsIHtcbiAgICBsdXQsXG4gICAgbWluLFxuICAgIG1heCxcbiAgICBsb2c6IHZpZXcubG9nU2NhbGUsXG4gICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgIG11dGVkLFxuICB9KTtcbn1cblxuLyoqIE1hcmtlciBjb2xvdXJzOiBwYWNrZWQgcGVyLXBvaW50IFJHQkEgKDQgZmxvYXRzIHBlciBwb2ludCwgdGhlIHNoYXBlIG5hcGFyaS1qcyBjb3BpZXMgc3RyYWlnaHRcbiAqICBpbnRvIGl0cyBpbnN0YW5jZSBidWZmZXIpLCBvciBvbmUgUkdCQSBicm9hZGNhc3QgdG8gZXZlcnkgcG9pbnQuICovXG5leHBvcnQgdHlwZSBQb2ludENvbG9ycyA9IEZsb2F0MzJBcnJheSB8IFJHQkE7XG5cbi8qKiBXaGV0aGVyIGEgY29sb3VyIGlucHV0IGlzIG9uZSBSR0JBIHBlciBwb2ludCByYXRoZXIgdGhhbiBvbmUgYnJvYWRjYXN0IFJHQkEuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQZXJQb2ludChjb2xvcnM6IFBvaW50Q29sb3JzKTogY29sb3JzIGlzIEZsb2F0MzJBcnJheSB7XG4gIHJldHVybiBjb2xvcnMgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk7XG59XG5cbi8qKlxuICogYGNvbG9yc2Agd2l0aCBldmVyeSBvYnNlcnZhdGlvbiBgc2hvd25gIGxlYXZlcyBhdCAwIG1hZGUgdHJhbnNwYXJlbnQ6IHRoZSBvYnNlcnZhdGlvbnMgYSBnZW5lXG4gKiBmaWx0ZXIgbGVhdmVzIG91dC4gQSBicm9hZGNhc3QgY29sb3VyIGJlY29tZXMgcGVyLXBvaW50LCBzaW5jZSB0aGUgcG9pbnRzIG5vdyBkaWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRlVW5zaG93bihjb2xvcnM6IFBvaW50Q29sb3JzLCBzaG93bjogVWludDhBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IGNvdW50ID0gc2hvd24ubGVuZ3RoO1xuICBsZXQgb3V0OiBGbG9hdDMyQXJyYXk7XG4gIGlmIChpc1BlclBvaW50KGNvbG9ycykpIHtcbiAgICBvdXQgPSBjb2xvcnMuc2xpY2UoKTsgLy8gdGhlIGlucHV0IG1heSBiZSBoZWxkIGVsc2V3aGVyZVxuICB9IGVsc2Uge1xuICAgIG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiA0KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIG91dC5zZXQoY29sb3JzLCBpICogNCk7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBpZiAoIXNob3duW2ldKSBvdXRbNCAqIGkgKyAzXSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBQZXItcG9pbnQgY29sb3VycyBmb3IgdGhlIGRyYXduIHN1YnNldC4gQSBicm9hZGNhc3QgdHVwbGUgc3RheXMgYnJvYWRjYXN0IOKAlFxuICogIGl0IGlzIG9uZSBjb2xvdXIgZm9yIGV2ZXJ5IHBvaW50IGVpdGhlciB3YXkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyQ29sb3JzKGNvbG9yczogUG9pbnRDb2xvcnMsIGluZGljZXM/OiBVaW50MzJBcnJheSk6IFBvaW50Q29sb3JzIHtcbiAgaWYgKCFpbmRpY2VzIHx8ICFpc1BlclBvaW50KGNvbG9ycykpIHJldHVybiBjb2xvcnM7XG4gIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoaW5kaWNlcy5sZW5ndGggKiA0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcyA9IGluZGljZXNbaV0gKiA0O1xuICAgIGNvbnN0IG8gPSBpICogNDtcbiAgICBvdXRbb10gPSBjb2xvcnNbc107XG4gICAgb3V0W28gKyAxXSA9IGNvbG9yc1tzICsgMV07XG4gICAgb3V0W28gKyAyXSA9IGNvbG9yc1tzICsgMl07XG4gICAgb3V0W28gKyAzXSA9IGNvbG9yc1tzICsgM107XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIE9uZSBkZW5zaXR5IHZvbHVtZSdzIG9ic2VydmF0aW9uczogYSBjbHVzdGVyIChvciBhbGwgY2VsbHMpLCB3aXRoIGl0cyBsZWdlbmQgY29sb3VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW5zaXR5R3JvdXAge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbG9yOiBzdHJpbmc7XG4gIGluZGljZXM/OiBVaW50MzJBcnJheTtcbn1cblxuLyoqIFRoZSBzaW5nbGUgZ3JvdXAgZHJhd24gd2hlbiB0aGUgY29sb3VyaW5nIGlzIG5vdCBjYXRlZ29yaWNhbDogdG90YWwgY2VsbCBkZW5zaXR5LCB3aXRoaW4gdGhlXG4gKiAgc2VsZWN0aW9uIHdoZW4gdGhlcmUgaXMgb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdGFsRGVuc2l0eUdyb3VwKHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2spOiBEZW5zaXR5R3JvdXAge1xuICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBzZWxlY3Rpb24ubWFzayA6IG51bGw7XG4gIHJldHVybiB7XG4gICAgbmFtZTogaW5TZWxlY3Rpb24gPyAnc2VsZWN0ZWQgY2VsbHMnIDogJ2FsbCBjZWxscycsXG4gICAgY29sb3I6IFNQQVRJQUxfTkVVVFJBTF9IRVgsXG4gICAgaW5kaWNlczogaW5TZWxlY3Rpb24gPyBtYXNrVG9JbmRpY2VzKGluU2VsZWN0aW9uKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgY2x1c3RlcnMgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW4gdG8gcmFzdGVyaXNlLCBiaWdnZXN0IGZpcnN0IGFuZCBjYXBwZWQgYXRcbiAqIHtAbGluayBERU5TSVRZX01BWF9DTFVTVEVSU30sIGVhY2ggd2l0aCBpdHMgbGVnZW5kIGNvbG91ciDigJQgcmVzdHJpY3RlZCB0byB0aGUgc2VsZWN0aW9uIHdoZW5cbiAqIHRoZXJlIGlzIG9uZSwgc28gXCJzZWxlY3QgYSByZWdpb24sIGNoZWNrIHRoZSBib3hcIiBhbnN3ZXJzIHdoaWNoIGNsdXN0ZXJzIGxpdmUgdGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rRGVuc2l0eUdyb3VwcyhcbiAgY29sdW1uTmFtZTogc3RyaW5nLFxuICBjb2x1bW46IENhdGVnb3JpY2FsQ29sdW1uLFxuICBjb3VudDogbnVtYmVyLFxuICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICBncm91cENvbG9ycz86IEdyb3VwQ29sb3JPdmVycmlkZXMgfCBudWxsLFxuKTogRGVuc2l0eUdyb3VwW10ge1xuICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBzZWxlY3Rpb24ubWFzayA6IG51bGw7XG4gIGNvbnN0IGNvbG9ycyA9IGNhdGVnb3J5Q29sb3JzRm9yKGNvbHVtbk5hbWUsIGNvbHVtbi5tZXRhLCBncm91cENvbG9ycyk7XG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShjb2x1bW4ubWV0YS5jYXRlZ29yaWVzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGlmIChpblNlbGVjdGlvbiAmJiAhaW5TZWxlY3Rpb25baV0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvZGUgPSBjb2x1bW4uY29kZXNbaV07XG4gICAgaWYgKGNvZGUgIT09IE5PX0NBVEVHT1JZICYmIGNvZGUgPCBjb3VudHMubGVuZ3RoKSBjb3VudHNbY29kZV0rKztcbiAgfVxuICBjb25zdCByYW5rZWQgPSBBcnJheS5mcm9tKGNvdW50cywgKG4sIGNvZGUpID0+ICh7IGNvZGUsIG4gfSkpXG4gICAgLmZpbHRlcigoYykgPT4gYy5uID4gMClcbiAgICAuc29ydCgoYSwgYikgPT4gYi5uIC0gYS5uKVxuICAgIC5zbGljZSgwLCBERU5TSVRZX01BWF9DTFVTVEVSUyk7XG4gIGlmIChjb3VudHMuZmlsdGVyKChjKSA9PiBjID4gMCkubGVuZ3RoID4gcmFua2VkLmxlbmd0aCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbbmFwYXJpLWpzXSAke2NvbHVtbk5hbWV9OiBkcmF3aW5nIHRoZSAke3JhbmtlZC5sZW5ndGh9IGxhcmdlc3QgY2x1c3RlcnMgYXMgZGVuc2l0eSBgICtcbiAgICAgICAgJ3ZvbHVtZXM7IG1vcmUgdGhhbiB0aGF0IHN0b3AgYmVpbmcgc2VwYXJhYmxlIGJ5IGV5ZScsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmFua2VkLm1hcCgoeyBjb2RlIH0pID0+IHtcbiAgICBjb25zdCBpbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KGNvdW50c1tjb2RlXSk7XG4gICAgbGV0IGsgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgaWYgKGluU2VsZWN0aW9uICYmICFpblNlbGVjdGlvbltpXSkgY29udGludWU7XG4gICAgICBpZiAoY29sdW1uLmNvZGVzW2ldID09PSBjb2RlKSBpbmRpY2VzW2srK10gPSBpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogY29sdW1uLm1ldGEuY2F0ZWdvcmllc1tjb2RlXSxcbiAgICAgIGNvbG9yOiBjb2xvcnNbY29kZV0gPz8gJyM4ODg4ODgnLFxuICAgICAgaW5kaWNlczogaW5kaWNlcy5zdWJhcnJheSgwLCBrKSxcbiAgICB9O1xuICB9KTtcbn1cbiJdfQ==
@@ -1,6 +1,7 @@
1
1
  import { NO_CATEGORY, isCategoricalColumn } from '../../contracts/spatial-dataset.contract';
2
- import { sameSelection, selectByCategory } from '../../spatial/spatial-selection';
3
- import { hoverText } from '../../spatial/spatial-hover';
2
+ import { sameSelection, selectByCategory, selectByIndices } from '../../spatial/spatial-selection';
3
+ import { cellText, cellTypeText, hoverText } from '../../spatial/spatial-hover';
4
+ import { cellTypeColumnFor } from '../../spatial/lod';
4
5
  import { Supersede } from '../../util/supersede';
5
6
  import { NapariSpatialTooltip } from './napari-spatial-tooltip';
6
7
  /** Movement, in screen pixels, under which a press-release is a CLICK and not a
@@ -32,6 +33,10 @@ export class SpatialHover {
32
33
  /** What the markers are coloured by, resolved once per colour source rather than per hover. */
33
34
  this.hoverSource = null;
34
35
  this.hoverSourceKey = null;
36
+ /** In 3D: what a cell's tooltip says of it (its type, id, measurements), resolved once per dataset. */
37
+ this.cellInfo = null;
38
+ this.cellInfoKey = null;
39
+ this.cellInfoLoads = new Supersede();
35
40
  /** Latest wins within the scene: the KEY is only committed once a resolution lands, so a
36
41
  * superseded fetch cannot leave the cache claiming to hold a source it never stored. */
37
42
  this.resolutions = new Supersede();
@@ -133,6 +138,8 @@ export class SpatialHover {
133
138
  * the pointer moved would be indefensible either way.
134
139
  */
135
140
  async resolveSource(dataset, view) {
141
+ if (this.host.is3d)
142
+ void this.resolveCellInfo(dataset, view);
136
143
  const port = this.host.port;
137
144
  const colorBy = view.colorBy;
138
145
  const key = dataset && colorBy ? `${dataset.id}|${colorBy.kind}:${colorBy.name}` : null;
@@ -193,6 +200,67 @@ export class SpatialHover {
193
200
  this.hoverSourceKey = null;
194
201
  }
195
202
  }
203
+ /**
204
+ * What a 3D cell's tooltip says (see `cellText`): the cell-type column's codes, the ids, and the
205
+ * dataset's first few continuous columns. Resolved once per dataset and type column; a failure
206
+ * leaves the tooltip with what the colouring says.
207
+ */
208
+ async resolveCellInfo(dataset, view) {
209
+ const port = this.host.port;
210
+ const typeName = dataset ? cellTypeColumnFor(dataset, view) : null;
211
+ const key = dataset ? `${dataset.id}|${typeName ?? ''}` : null;
212
+ if (key === this.cellInfoKey)
213
+ return;
214
+ this.cellInfoKey = key;
215
+ const task = this.cellInfoLoads.next();
216
+ if (!dataset || !port) {
217
+ this.cellInfo = null;
218
+ return;
219
+ }
220
+ try {
221
+ const type = typeName ? await port.getColumn(typeName) : null;
222
+ const measureNames = dataset.columns
223
+ .filter((c) => c.kind === 'continuous')
224
+ .map((c) => c.name)
225
+ .slice(0, 4);
226
+ const measures = (await Promise.all(measureNames.map((n) => port.getColumn(n).catch(() => null)))).flatMap((c) => c && !isCategoricalColumn(c)
227
+ ? [{ name: c.meta.name, values: c.values, ...(c.meta.unit ? { unit: c.meta.unit } : {}) }]
228
+ : []);
229
+ if (!task())
230
+ return;
231
+ const categorical = type && isCategoricalColumn(type) ? type : null;
232
+ let counts = null;
233
+ if (categorical) {
234
+ counts = new Uint32Array(categorical.meta.categories.length);
235
+ for (const c of categorical.codes)
236
+ if (c !== NO_CATEGORY && c < counts.length)
237
+ counts[c]++;
238
+ }
239
+ this.cellInfo = {
240
+ typeName: categorical ? typeName : null,
241
+ categories: categorical?.meta.categories ?? [],
242
+ codes: categorical?.codes ?? null,
243
+ counts,
244
+ ...(dataset.observations.ids ? { ids: dataset.observations.ids } : {}),
245
+ measures,
246
+ };
247
+ }
248
+ catch {
249
+ if (!task())
250
+ return;
251
+ this.cellInfo = null;
252
+ this.cellInfoKey = null;
253
+ }
254
+ }
255
+ /** In 3D: the tooltip of the cell, or of the cell type's surface, under a client position. */
256
+ cell3dText(clientX, clientY) {
257
+ if (!this.host.is3d)
258
+ return null;
259
+ const cell = this.host.pickCell?.(clientX, clientY) ?? -1;
260
+ if (cell >= 0)
261
+ return cellText(this.cellInfo, cell, this.hoverSource);
262
+ return null;
263
+ }
196
264
  /** Hit-test the last pointer position and show or hide the tooltip. */
197
265
  update(el) {
198
266
  const tip = this.tooltip;
@@ -222,8 +290,20 @@ export class SpatialHover {
222
290
  return;
223
291
  }
224
292
  }
225
- const hit = this.host.pick(pointer.clientX, pointer.clientY, HOVER_RADIUS_PX);
226
- const lines = hoverText(this.hoverSource, hit);
293
+ // A cell drawn by itself names itself; a marker, its colouring; else a cell type's surface.
294
+ let lines = this.cell3dText(pointer.clientX, pointer.clientY);
295
+ if (!lines) {
296
+ const hit = this.host.pick(pointer.clientX, pointer.clientY, HOVER_RADIUS_PX);
297
+ lines =
298
+ hit >= 0 && this.host.is3d && this.cellInfo
299
+ ? cellText(this.cellInfo, hit, this.hoverSource)
300
+ : hoverText(this.hoverSource, hit);
301
+ if (!lines && this.host.is3d) {
302
+ const region = this.host.pickRegion?.(pointer.clientX, pointer.clientY);
303
+ if (region)
304
+ lines = cellTypeText(this.cellInfo, region.key, region.label);
305
+ }
306
+ }
227
307
  if (!lines) {
228
308
  tip.hide();
229
309
  return;
@@ -245,6 +325,16 @@ export class SpatialHover {
245
325
  const source = this.hoverSource;
246
326
  const store = this.host.selection;
247
327
  const dataset = this.host.dataset();
328
+ // A cell drawn by itself: the click selects that cell (again: clears it), whatever colours it.
329
+ const cell = this.host.pickCell?.(clientX, clientY) ?? -1;
330
+ if (cell >= 0 && store && dataset) {
331
+ const next = selectByIndices([cell], dataset.observations.count);
332
+ if (sameSelection(store.current(), next))
333
+ store.clear();
334
+ else
335
+ store.set(next);
336
+ return;
337
+ }
248
338
  // Only a categorical source has classes to select. A gene is continuous:
249
339
  // there is no set of cells that "is" a value.
250
340
  if (!store || !dataset || source?.kind !== 'categorical')
@@ -267,4 +357,4 @@ export class SpatialHover {
267
357
  store.set(next);
268
358
  }
269
359
  }
270
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtaG92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtaG92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLFdBQVcsRUFBa0IsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU1RyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEYsT0FBTyxFQUFvQixTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHaEU7OzhDQUU4QztBQUM5QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEI7c0VBQ3NFO0FBQ3RFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUN6Qjs7dURBRXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUF5QmxDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQVl2QixZQUE2QixJQUFzQjtRQUF0QixTQUFJLEdBQUosSUFBSSxDQUFrQjtRQVgzQyxZQUFPLEdBQWdDLElBQUksQ0FBQztRQUNwRCwrRkFBK0Y7UUFDdkYsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBQ3ZDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QztpR0FDeUY7UUFDeEUsZ0JBQVcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLFlBQU8sR0FBZ0QsSUFBSSxDQUFDO1FBQzVELFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixRQUFHLEdBQW1CLEVBQUUsQ0FBQztJQUVxQixDQUFDO0lBRXZEOzs7Ozs7O09BT0c7SUFD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QUUsQ0FBQztZQUNqQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBWaWV3ZXIgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgeyBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgTk9fQ0FURUdPUlksIFNwYXRpYWxEYXRhc2V0LCBpc0NhdGVnb3JpY2FsQ29sdW1uIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgc2FtZVNlbGVjdGlvbiwgc2VsZWN0QnlDYXRlZ29yeSB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgdHlwZSBIb3ZlclNvdXJjZSwgaG92ZXJUZXh0IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWhvdmVyJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRvb2x0aXAgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRvb2x0aXAnO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRpbGVzJztcblxuLyoqIE1vdmVtZW50LCBpbiBzY3JlZW4gcGl4ZWxzLCB1bmRlciB3aGljaCBhIHByZXNzLXJlbGVhc2UgaXMgYSBDTElDSyBhbmQgbm90IGFcbiAqICBkcmFnLiBBbiBvcmJpdCBvciBhIHBhbiBzdGFydHMgdGhlIHNhbWUgd2F5LCBzbyB0aGUgdHdvIGhhdmUgdG8gYmUgdG9sZFxuICogIGFwYXJ0IGJ5IGhvdyBmYXIgdGhlIHBvaW50ZXIgdHJhdmVsbGVkLiAqL1xuY29uc3QgQ0xJQ0tfU0xPUF9QWCA9IDQ7XG4vKiogTG9uZ2VzdCBwcmVzcy1yZWxlYXNlIHN0aWxsIHRyZWF0ZWQgYXMgYSBjbGljay4gQSBsb25nIHByZXNzIHdpdGggdGhlIG1vdXNlXG4gKiAgaGVsZCBzdGlsbCBpcyBtb3JlIGxpa2VseSBhbiBpbnRlcnJ1cHRlZCBkcmFnIHRoYW4gYSBzZWxlY3Rpb24uICovXG5jb25zdCBDTElDS19NQVhfTVMgPSA2MDA7XG4vKiogUG9pbnRlciBkaXN0YW5jZSwgaW4gc2NyZWVuIHBpeGVscywgdGhhdCBzdGlsbCBjb3VudHMgYXMgXCJvblwiIGEgbWFya2VyLlxuICogIEdlbmVyb3VzIHJlbGF0aXZlIHRvIGEgMS41cHggZGlzYzogdGhlIGN1cnNvciBpcyBhIGJsdW50IGluc3RydW1lbnQsIGFuZCBhXG4gKiAgdG9vbHRpcCB5b3UgaGF2ZSB0byBodW50IGZvciBpcyB3b3JzZSB0aGFuIG5vbmUuICovXG5leHBvcnQgY29uc3QgSE9WRVJfUkFESVVTX1BYID0gMTA7XG5cbi8qKiBXaGF0IHRoZSBob3ZlciByZWFkcyBmcm9tIHRoZSBzcGF0aWFsIHNjZW5lIGl0IHNlcnZlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbEhvdmVySG9zdCB7XG4gIC8qKiBUaGUgb3JiaXQgdmlldyByYXRoZXIgdGhhbiB0aGUgMkQgdmlldyAobm8gdHJhbnNjcmlwdCBtYXJrZXJzIHRvIGFzayBmaXJzdCkuICovXG4gIHJlYWRvbmx5IGlzM2Q6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZpZXdlcjogVmlld2VyO1xuICByZWFkb25seSBwb3J0OiBTcGF0aWFsRGF0YVBvcnQgfCBudWxsO1xuICByZWFkb25seSBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB8IG51bGw7XG4gIC8qKiBUaGUgZGF0YXNldCBvbiBzY3JlZW4sIGFzIHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiBsYXN0IHNhdyBpdC4gKi9cbiAgZGF0YXNldCgpOiBTcGF0aWFsRGF0YXNldCB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgT0JTRVJWQVRJT04gZHJhd24gdW5kZXIgYSBjbGllbnQgcG9zaXRpb24sIG9yIC0xIOKAlCBgc2xhY2tQeGAgc2NyZWVuIHBpeGVscyBvZiBzbGFja1xuICAgKiBhcm91bmQgdGhlIHBvaW50ZXIuIFRoZSBzY2VuZSBvd25zIHRoZSBwaWNrIChuYXBhcmktanMncywgb24gdGhlIGxheWVyIGl0IGRyZXcpIGFuZCBtYXBzIHRoZVxuICAgKiBkcmF3biBpbmRleCBiYWNrIHRvIHRoZSBvYnNlcnZhdGlvbi5cbiAgICovXG4gIHBpY2soY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIsIHNsYWNrUHg6IG51bWJlcik6IG51bWJlcjtcbiAgLyoqIFRoZSAyRCB0cmFuc2NyaXB0IG1hcmtlcnMsIHdoaWNoIHNpdCBvbiB0b3Agb2YgZXZlcnl0aGluZyBhbmQgYXJlIGFza2VkIGZpcnN0LiAqL1xuICB0aWxlcygpOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGw7XG4gIC8qKiBBIHJlZ2lvbiB0b29sIG93bnMgdGhlIHBvaW50ZXIgKHBsYWNpbmcgYSBwb2x5Z29uIHZlcnRleCBpcyBhbHNvIGEgc3RpbGwgY2xpY2spLiAqL1xuICB0b29sQWN0aXZlKCk6IGJvb2xlYW47XG4gIG91dHNpZGVab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbiAgaW5ab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbn1cblxuLyoqXG4gKiBDdXJzb3IgdG9vbHRpcCBhbmQgY2xpY2stdG8tc2VsZWN0IGZvciB0aGUgc3BhdGlhbCB2aWV3cyAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgTCk6IGhvdmVyIGFcbiAqIG1hcmtlciwgcmVhZCBpdHMgY2xhc3M7IGNsaWNrIGl0LCBzZWxlY3QgdGhlIGNsYXNzIOKAlCB0aGUgY2FudmFzIGVxdWl2YWxlbnQgb2YgdGhlIHBhbmVsJ3NcbiAqIGxlZ2VuZC4gVGhlIHRvb2x0aXAgYW5kIHRoZSBjbGljayBzaGFyZSBPTkUgaGl0LXRlc3QsIHNvIGEgY2xpY2sgc2VsZWN0cyB0aGUgY2xhc3MgdGhlIHRvb2x0aXBcbiAqIG5hbWVzIChOQVBBUkktU1ZDLTUpLlxuICpcbiAqIEEgMzQtZW50cnkgbGVnZW5kIGNhbm5vdCBiZSByZWFkIGJhY2sgZnJvbSBhIGRvdCDigJQgc2V2ZXJhbCBjbGFzc2VzIGdldCBzaW1pbGFyIGNvbG91cnMsIGFuZFxuICogbWF0Y2hpbmcgb25lIHRvIGEgc3dhdGNoIGJ5IGV5ZSBpcyBleGFjdGx5IHRoZSB0YXNrIHRoaXMgcmVtb3Zlcy4gSXQgcmVwb3J0cyB3aGF0ZXZlciB0aGUgY2xvdWRcbiAqIGlzIENVUlJFTlRMWSBjb2xvdXJlZCBieSAoe0BsaW5rIHJlc29sdmVTb3VyY2V9KSwgc28gaXQgYW5kIHRoZSBsZWdlbmQgY2FuIG5ldmVyIHNheSBkaWZmZXJlbnRcbiAqIHRoaW5ncy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwYXRpYWxIb3ZlciB7XG4gIHByaXZhdGUgdG9vbHRpcDogTmFwYXJpU3BhdGlhbFRvb2x0aXAgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoYXQgdGhlIG1hcmtlcnMgYXJlIGNvbG91cmVkIGJ5LCByZXNvbHZlZCBvbmNlIHBlciBjb2xvdXIgc291cmNlIHJhdGhlciB0aGFuIHBlciBob3Zlci4gKi9cbiAgcHJpdmF0ZSBob3ZlclNvdXJjZTogSG92ZXJTb3VyY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclNvdXJjZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3Qgd2lucyB3aXRoaW4gdGhlIHNjZW5lOiB0aGUgS0VZIGlzIG9ubHkgY29tbWl0dGVkIG9uY2UgYSByZXNvbHV0aW9uIGxhbmRzLCBzbyBhXG4gICAqICBzdXBlcnNlZGVkIGZldGNoIGNhbm5vdCBsZWF2ZSB0aGUgY2FjaGUgY2xhaW1pbmcgdG8gaG9sZCBhIHNvdXJjZSBpdCBuZXZlciBzdG9yZWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x1dGlvbnMgPSBuZXcgU3VwZXJzZWRlKCk7XG4gIHByaXZhdGUgcG9pbnRlcjogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZnJhbWUgPSAwO1xuICBwcml2YXRlIG9mZjogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFNwYXRpYWxIb3Zlckhvc3QpIHt9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBvbiBgZWxgICh0aGUgcGxvdCBob3N0KSByYXRoZXIgdGhhbiB0aGUgY2FudmFzLCBzbyBpdCBrZWVwcyB3b3JraW5nIG92ZXIgdGhlIHJlZ2lvblxuICAgKiBvdmVybGF5IChhbiBTVkcgY292ZXJpbmcgdGhlIGNhbnZhcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHN3YWxsb3cgZXZlcnkgbW92ZSksIGFuZCB0aHJvdHRsZVxuICAgKiB0byBvbmUgaGl0LXRlc3QgcGVyIGFuaW1hdGlvbiBmcmFtZTogYSBwb2ludGVybW92ZSBjYW4gZmlyZSBmYXIgbW9yZSBvZnRlbiB0aGFuIHRoYXQsIGFuZFxuICAgKiB0aGUgZmlyc3QgdGVzdCBhZnRlciBhbiBvcmJpdCByZS1wcm9qZWN0cyB0aGUgY2xvdWQuIE5vbmUgd2hpbGUgYSBidXR0b24gaXMgaGVsZDogdGhhdCBpcyBhblxuICAgKiBvcmJpdCBvciBhIHBhbiBtb3ZpbmcgdGhlIGNhbWVyYSBldmVyeSBmcmFtZSwgYW5kIGEgdGVzdCBwZXIgZnJhbWUgcmUtcHJvamVjdGVkIGFsbCBvZiBhIDMuN01cbiAgICogY2xvdWQgZWFjaCB0aW1lICjiiYgxNTAgbXMgYSBmcmFtZSk7IHRoZSBmaXJzdCBtb3ZlIGFmdGVyIHRoZSBkcmFnIHBheXMgZm9yIG9uZS5cbiAgICovXG4gIGluc3RhbGwoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgdGhpcy50b29sdGlwID0gbmV3IE5hcGFyaVNwYXRpYWxUb29sdGlwKGVsKTtcblxuICAgIGNvbnN0IG9uTW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbnMpIHtcbiAgICAgICAgdGhpcy5wb2ludGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy50b29sdGlwPy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucG9pbnRlciA9IHsgY2xpZW50WDogZS5jbGllbnRYLCBjbGllbnRZOiBlLmNsaWVudFkgfTtcbiAgICAgIGlmICh0aGlzLmZyYW1lKSByZXR1cm47XG4gICAgICB0aGlzLmZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5mcmFtZSA9IDA7XG4gICAgICAgIHRoaXMudXBkYXRlKGVsKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25MZWF2ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMucG9pbnRlciA9IG51bGw7XG4gICAgICB0aGlzLnRvb2x0aXA/LmhpZGUoKTtcbiAgICB9O1xuXG4gICAgLy8gQSBjbGljayBvbiBhIG1hcmtlciBzZWxlY3RzIGl0cyBjbGFzcywgZXhhY3RseSBhcyBjbGlja2luZyB0aGF0IGNsYXNzIGluIHRoZVxuICAgIC8vIHBhbmVsJ3MgbGVnZW5kIGRvZXMg4oCUIGluY2x1ZGluZyBjbGlja2luZyBhZ2FpbiB0byBjbGVhciwgc28gYSBjbGljayBpc1xuICAgIC8vIGFsd2F5cyByZXZlcnNpYmxlLiBUcmFja2VkIGFzIGRvd24vdXAgcmF0aGVyIHRoYW4gYm91bmQgdG8gYGNsaWNrYCBzbyBhIERSQUdcbiAgICAvLyAoYW4gb3JiaXQgaW4gM0QsIGEgcGFuIGluIDJEKSBjYW4gYmUgdG9sZCBhcGFydCBmcm9tIGEgY2xpY2s6IHRoZSBnZXN0dXJlXG4gICAgLy8gaGFzIHRvIG1vdmUgbGVzcyB0aGFuIGEgZmV3IHBpeGVscyBhbmQgYmUgb3ZlciBxdWlja2x5LlxuICAgIGxldCBkb3duOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IG9uRG93biA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBkb3duID0geyB4OiBlLmNsaWVudFgsIHk6IGUuY2xpZW50WSwgdDogRGF0ZS5ub3coKSB9O1xuICAgIH07XG4gICAgY29uc3Qgb25VcCA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IGRvd247XG4gICAgICBkb3duID0gbnVsbDtcbiAgICAgIGlmICghc3RhcnQpIHJldHVybjtcbiAgICAgIGNvbnN0IG1vdmVkID0gTWF0aC5oeXBvdChlLmNsaWVudFggLSBzdGFydC54LCBlLmNsaWVudFkgLSBzdGFydC55KTtcbiAgICAgIGlmIChtb3ZlZCA+IENMSUNLX1NMT1BfUFgpIHJldHVybjtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQudCA+IENMSUNLX01BWF9NUykgcmV0dXJuO1xuICAgICAgLy8gQSByZWdpb24gdG9vbCBvd25zIHRoZSBwb2ludGVyIHdoaWxlIGl0IGlzIGFjdGl2ZSwgYW5kIHBsYWNpbmcgYSBwb2x5Z29uXG4gICAgICAvLyB2ZXJ0ZXggaXMgYWxzbyBhIGNsaWNrIHRoYXQgZG9lcyBub3QgbW92ZS5cbiAgICAgIGlmICh0aGlzLmhvc3QudG9vbEFjdGl2ZSgpKSByZXR1cm47XG4gICAgICB0aGlzLmhvc3QuaW5ab25lKCgpID0+IHRoaXMuc2VsZWN0Q2xhc3NBdChlLmNsaWVudFgsIGUuY2xpZW50WSkpO1xuICAgIH07XG5cbiAgICAvLyBPdXRzaWRlIHRoZSB6b25lOiBhIHBvaW50ZXJtb3ZlIGZpcmVzIGZhciBtb3JlIG9mdGVuIHRoYW4gYW55dGhpbmcgaGVyZSBjaGFuZ2VzIHdoYXRcbiAgICAvLyBBbmd1bGFyIHJlbmRlcnMgKHRoZSB0b29sdGlwIGlzIHBsYWluIERPTSk7IGEgc2VsZWN0aW5nIGNsaWNrIHJlLWVudGVycyBpdC5cbiAgICB0aGlzLmhvc3Qub3V0c2lkZVpvbmUoKCkgPT4ge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvbk1vdmUpO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bik7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTtcbiAgICB9KTtcbiAgICB0aGlzLm9mZi5wdXNoKCgpID0+IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Nb3ZlKSk7XG4gICAgdGhpcy5vZmYucHVzaCgoKSA9PiBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCBvbkxlYXZlKSk7XG4gICAgdGhpcy5vZmYucHVzaCgoKSA9PiBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bikpO1xuICAgIHRoaXMub2ZmLnB1c2goKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25VcCkpO1xuICB9XG5cbiAgLyoqIEhpZGUgdGhlIHRvb2x0aXAgKHRoZSBuYXZpZ2F0b3IgaXMgYmVpbmcgZHJhZ2dlZCwgc2F5KS4gKi9cbiAgaGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXA/LmhpZGUoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBhbmQgdGhlIHRvb2x0aXAsIGFuZCBkcm9wIHRoZSBjb2xvdXIgc291cmNlLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2ZmIG9mIHRoaXMub2ZmKSBvZmYoKTtcbiAgICB0aGlzLm9mZiA9IFtdO1xuICAgIGlmICh0aGlzLmZyYW1lKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lKTtcbiAgICB0aGlzLmZyYW1lID0gMDtcbiAgICB0aGlzLnBvaW50ZXIgPSBudWxsO1xuICAgIHRoaXMudG9vbHRpcD8uZGlzcG9zZSgpO1xuICAgIHRoaXMudG9vbHRpcCA9IG51bGw7XG4gICAgdGhpcy5yZXNvbHV0aW9ucy5jYW5jZWwoKTtcbiAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSB0b29sdGlwIHNheXMsIHJlc29sdmVkIG9uY2UgcGVyIGNvbG91ciBzb3VyY2UgcmF0aGVyIHRoYW4gcGVyIGhvdmVyLlxuICAgKlxuICAgKiBGZXRjaGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgY29sb3VyaW5nIG9uIHB1cnBvc2U6IHRoZSByZWZlcmVuY2UgcG9ydCBjYWNoZXNcbiAgICogY29sdW1ucywgYnV0IGEgaG9zdCdzIG5lZWQgbm90LCBhbmQgcmUtZmV0Y2hpbmcgYSAzLjdNLWVsZW1lbnQgdmVjdG9yIGJlY2F1c2VcbiAgICogdGhlIHBvaW50ZXIgbW92ZWQgd291bGQgYmUgaW5kZWZlbnNpYmxlIGVpdGhlciB3YXkuXG4gICAqL1xuICBhc3luYyByZXNvbHZlU291cmNlKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLmhvc3QucG9ydDtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIGNvbnN0IGtleSA9IGRhdGFzZXQgJiYgY29sb3JCeSA/IGAke2RhdGFzZXQuaWR9fCR7Y29sb3JCeS5raW5kfToke2NvbG9yQnkubmFtZX1gIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmhvdmVyU291cmNlS2V5KSByZXR1cm47XG4gICAgLy8gVGhlIGtleSBpcyBjb21taXR0ZWQgb25seSB3aGVyZSBhIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gU2V0dGluZyBpdCB1cFxuICAgIC8vIGZyb250IHdvdWxkIG1lYW4gYSByZXNvbHV0aW9uIHRoYXQgbG9zZXMgdGhlIHJhY2UgbGVhdmVzIHRoZSBrZXkgY2xhaW1pbmcgYVxuICAgIC8vIHNvdXJjZSB0aGF0IHdhcyBuZXZlciBzdG9yZWQg4oCUIGFuZCBzaW5jZSBldmVyeSBsYXRlciBlbWlzc2lvbiBjYXJyaWVzIHRoZVxuICAgIC8vIHNhbWUga2V5LCBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IGhlcmUgZm9yZXZlciBhbmQgdGhlIHRvb2x0aXAgd291bGQgc3RheVxuICAgIC8vIHNpbGVudCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24uXG4gICAgY29uc3QgdGFzayA9IHRoaXMucmVzb2x1dGlvbnMubmV4dCgpO1xuICAgIC8vIE5vIGNvbG91ciBzb3VyY2UgbWVhbnMgbm90aGluZyBpcyBiZWluZyBzYWlkIGFib3V0IHRoZSBjZWxscywgc28gdGhlcmUgaXMgbm9cbiAgICAvLyBjbHVzdGVyIHRvIG5hbWUgYW5kIHRoZSB0b29sdGlwIHN0YXlzIHNpbGVudC5cbiAgICBpZiAoIWtleSB8fCAhZGF0YXNldCB8fCAhY29sb3JCeSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgICAgaWYgKCF0YXNrKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBraW5kOiAnY2F0ZWdvcmljYWwnLFxuICAgICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICAgIGNhdGVnb3JpZXM6IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMsXG4gICAgICAgICAgICAgIGNvZGVzOiBjb2x1bW4uY29kZXMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGtpbmQ6ICdjb250aW51b3VzJyxcbiAgICAgICAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICAgICAgICB2YWx1ZXM6IGNvbHVtbi52YWx1ZXMsXG4gICAgICAgICAgICAgIC4uLihjb2x1bW4ubWV0YS51bml0ID8geyB1bml0OiBjb2x1bW4ubWV0YS51bml0IH0gOiB7fSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgICB0aGlzLmhvdmVyU291cmNlID0ge1xuICAgICAgICBraW5kOiAnY29udGludW91cycsXG4gICAgICAgIG5hbWU6IGNvbG9yQnkubmFtZSxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICAuLi4oZGF0YXNldC5mZWF0dXJlcz8udW5pdCA/IHsgdW5pdDogZGF0YXNldC5mZWF0dXJlcy51bml0IH0gOiB7fSksXG4gICAgICB9O1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgICAvLyBUaGUgdG9vbHRpcCBpcyBhbiBleHRyYTsgYSBmYWlsZWQgZmV0Y2ggbXVzdCBub3QgZGlzdHVyYiB0aGUgcmVuZGVyLiBUaGVcbiAgICAgIC8vIGtleSBpcyBsZWZ0IHVuc2V0IHNvIGEgbGF0ZXIgZW1pc3Npb24gcmV0cmllcyByYXRoZXIgdGhhbiBpbmhlcml0aW5nIGFcbiAgICAgIC8vIHBlcm1hbmVudCBzaWxlbmNlLlxuICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogSGl0LXRlc3QgdGhlIGxhc3QgcG9pbnRlciBwb3NpdGlvbiBhbmQgc2hvdyBvciBoaWRlIHRoZSB0b29sdGlwLiAqL1xuICBwcml2YXRlIHVwZGF0ZShlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0aXAgPSB0aGlzLnRvb2x0aXA7XG4gICAgY29uc3QgcG9pbnRlciA9IHRoaXMucG9pbnRlcjtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5ob3N0LmRhdGFzZXQoKTtcbiAgICBpZiAoIXRpcCB8fCAhcG9pbnRlciB8fCAhZGF0YXNldCkgcmV0dXJuO1xuXG4gICAgLy8gVHJhbnNjcmlwdCBtYXJrZXJzIHNpdCBvbiB0b3Agb2YgZXZlcnl0aGluZywgc28gdGhleSBhcmUgYXNrZWQgZmlyc3QuXG4gICAgY29uc3QgdGlsZXMgPSB0aGlzLmhvc3QudGlsZXMoKTtcbiAgICBpZiAoIXRoaXMuaG9zdC5pczNkICYmIHRpbGVzKSB7XG4gICAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLmhvc3Qudmlld2VyO1xuICAgICAgY29uc3Qgd29ybGQgPSB2aWV3ZXIuY2FudmFzVG9Xb3JsZChwb2ludGVyLmNsaWVudFgsIHBvaW50ZXIuY2xpZW50WSk7XG4gICAgICBjb25zdCB6b29tID0gdmlld2VyLmNhbWVyYS56b29tO1xuICAgICAgY29uc3QgcmFkaXVzID0gSE9WRVJfUkFESVVTX1BYIC8gKHpvb20gPiAwID8gem9vbSA6IDEpO1xuICAgICAgY29uc3QgbGluZXMgPSB3b3JsZFxuICAgICAgICA/IHRpbGVzLmhvdmVyQXQod29ybGRbMF0sIHdvcmxkWzFdLCByYWRpdXMsIChkZXRhaWxzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy5wb2ludGVyO1xuICAgICAgICAgICAgaWYgKCFwIHx8ICF0aGlzLnRvb2x0aXApIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zaG93KGRldGFpbHMsIHAuY2xpZW50WCAtIHIubGVmdCwgcC5jbGllbnRZIC0gci50b3ApO1xuICAgICAgICAgIH0pXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmIChsaW5lcykge1xuICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRpcC5zaG93KGxpbmVzLCBwb2ludGVyLmNsaWVudFggLSByZWN0LmxlZnQsIHBvaW50ZXIuY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdCA9IHRoaXMuaG9zdC5waWNrKHBvaW50ZXIuY2xpZW50WCwgcG9pbnRlci5jbGllbnRZLCBIT1ZFUl9SQURJVVNfUFgpO1xuICAgIGNvbnN0IGxpbmVzID0gaG92ZXJUZXh0KHRoaXMuaG92ZXJTb3VyY2UsIGhpdCk7XG4gICAgaWYgKCFsaW5lcykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRpcC5zaG93KGxpbmVzLCBwb2ludGVyLmNsaWVudFggLSByZWN0LmxlZnQsIHBvaW50ZXIuY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGNsYXNzIG9mIHRoZSBtYXJrZXIgYXQgYSBjbGllbnQgcG9zaXRpb24g4oCUIHRoZSBjYW52YXMgZXF1aXZhbGVudCBvZlxuICAgKiBjbGlja2luZyB0aGF0IGNsYXNzIGluIHRoZSBwYW5lbCdzIGxlZ2VuZCwgYW5kIHRoZSBzYW1lIHNlbGVjdGlvbiBvYmplY3QsIHNvXG4gICAqIHRoZSB0d28gY29udHJvbHMgY2Fubm90IHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdHMuXG4gICAqXG4gICAqIENsaWNraW5nIGEgY2xhc3MgdGhhdCBpcyBhbHJlYWR5IHRoZSB3aG9sZSBzZWxlY3Rpb24gQ0xFQVJTIGl0LCB3aGljaCBpcyB3aGF0XG4gICAqIHRoZSBsZWdlbmQgZG9lcy4gQ29tcGFyZWQgYWdhaW5zdCB0aGUgc2VsZWN0aW9uIGl0c2VsZiByYXRoZXIgdGhhbiBhZ2FpbnN0IGFcbiAgICogcmVtZW1iZXJlZCBjbGljaywgc28gc2VsZWN0aW5nIGZyb20gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGUgc2FtZVxuICAgKiBjbGFzcyBvbiB0aGUgY2FudmFzIHN0aWxsIHRvZ2dsZXMuXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdENsYXNzQXQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmhvdmVyU291cmNlO1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5ob3N0LnNlbGVjdGlvbjtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5ob3N0LmRhdGFzZXQoKTtcbiAgICAvLyBPbmx5IGEgY2F0ZWdvcmljYWwgc291cmNlIGhhcyBjbGFzc2VzIHRvIHNlbGVjdC4gQSBnZW5lIGlzIGNvbnRpbnVvdXM6XG4gICAgLy8gdGhlcmUgaXMgbm8gc2V0IG9mIGNlbGxzIHRoYXQgXCJpc1wiIGEgdmFsdWUuXG4gICAgaWYgKCFzdG9yZSB8fCAhZGF0YXNldCB8fCBzb3VyY2U/LmtpbmQgIT09ICdjYXRlZ29yaWNhbCcpIHJldHVybjtcblxuICAgIC8vIFRoZSBzYW1lIHBpY2sgdGhlIHRvb2x0aXAgbWFrZXMg4oCUIGRlcHRoLWF3YXJlIGluIDNEIOKAlCBzbyBhIGNsaWNrIHNlbGVjdHMgdGhlIGNsYXNzIHRoZVxuICAgIC8vIHRvb2x0aXAgbmFtZXMsIG5vdCBhbiBvY2NsdWRlZCBtYXJrZXIncy5cbiAgICBjb25zdCBoaXQgPSB0aGlzLmhvc3QucGljayhjbGllbnRYLCBjbGllbnRZLCBIT1ZFUl9SQURJVVNfUFgpO1xuICAgIGlmIChoaXQgPCAwKSByZXR1cm47XG4gICAgY29uc3QgY29kZSA9IHNvdXJjZS5jb2Rlc1toaXRdO1xuICAgIC8vIEEgY2VsbCB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBjb3ZlciBoYXMgbm8gY2xhc3MgdG8gc2VsZWN0LlxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQgfHwgY29kZSA9PT0gTk9fQ0FURUdPUlkpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHQgPSBzZWxlY3RCeUNhdGVnb3J5KHNvdXJjZS5jb2RlcywgY29kZSk7XG4gICAgY29uc3QgY3VycmVudCA9IHN0b3JlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2FtZVNlbGVjdGlvbihjdXJyZW50LCBuZXh0KSkge1xuICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RvcmUuc2V0KG5leHQpO1xuICB9XG59XG4iXX0=
360
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtaG92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtaG92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLFdBQVcsRUFBa0IsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU1RyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25HLE9BQU8sRUFBbUMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHaEU7OzhDQUU4QztBQUM5QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEI7c0VBQ3NFO0FBQ3RFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUN6Qjs7dURBRXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFnQ2xDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQWdCdkIsWUFBNkIsSUFBc0I7UUFBdEIsU0FBSSxHQUFKLElBQUksQ0FBa0I7UUFmM0MsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDcEQsK0ZBQStGO1FBQ3ZGLGdCQUFXLEdBQXVCLElBQUksQ0FBQztRQUN2QyxtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDN0MsdUdBQXVHO1FBQy9GLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBQ2pDLGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUN6QixrQkFBYSxHQUFH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LE9BQU87UUFDcEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQiwrREFBK0Q7UUFDL0QsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxXQUFXO1lBQUUsT0FBTztRQUV2RCxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBWaWV3ZXIgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgeyBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgTk9fQ0FURUdPUlksIFNwYXRpYWxEYXRhc2V0LCBpc0NhdGVnb3JpY2FsQ29sdW1uIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgc2FtZVNlbGVjdGlvbiwgc2VsZWN0QnlDYXRlZ29yeSwgc2VsZWN0QnlJbmRpY2VzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyB0eXBlIENlbGxJbmZvLCB0eXBlIEhvdmVyU291cmNlLCBjZWxsVGV4dCwgY2VsbFR5cGVUZXh0LCBob3ZlclRleHQgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtaG92ZXInO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL2xvZCc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUb29sdGlwIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10b29sdGlwJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10aWxlcyc7XG5cbi8qKiBNb3ZlbWVudCwgaW4gc2NyZWVuIHBpeGVscywgdW5kZXIgd2hpY2ggYSBwcmVzcy1yZWxlYXNlIGlzIGEgQ0xJQ0sgYW5kIG5vdCBhXG4gKiAgZHJhZy4gQW4gb3JiaXQgb3IgYSBwYW4gc3RhcnRzIHRoZSBzYW1lIHdheSwgc28gdGhlIHR3byBoYXZlIHRvIGJlIHRvbGRcbiAqICBhcGFydCBieSBob3cgZmFyIHRoZSBwb2ludGVyIHRyYXZlbGxlZC4gKi9cbmNvbnN0IENMSUNLX1NMT1BfUFggPSA0O1xuLyoqIExvbmdlc3QgcHJlc3MtcmVsZWFzZSBzdGlsbCB0cmVhdGVkIGFzIGEgY2xpY2suIEEgbG9uZyBwcmVzcyB3aXRoIHRoZSBtb3VzZVxuICogIGhlbGQgc3RpbGwgaXMgbW9yZSBsaWtlbHkgYW4gaW50ZXJydXB0ZWQgZHJhZyB0aGFuIGEgc2VsZWN0aW9uLiAqL1xuY29uc3QgQ0xJQ0tfTUFYX01TID0gNjAwO1xuLyoqIFBvaW50ZXIgZGlzdGFuY2UsIGluIHNjcmVlbiBwaXhlbHMsIHRoYXQgc3RpbGwgY291bnRzIGFzIFwib25cIiBhIG1hcmtlci5cbiAqICBHZW5lcm91cyByZWxhdGl2ZSB0byBhIDEuNXB4IGRpc2M6IHRoZSBjdXJzb3IgaXMgYSBibHVudCBpbnN0cnVtZW50LCBhbmQgYVxuICogIHRvb2x0aXAgeW91IGhhdmUgdG8gaHVudCBmb3IgaXMgd29yc2UgdGhhbiBub25lLiAqL1xuZXhwb3J0IGNvbnN0IEhPVkVSX1JBRElVU19QWCA9IDEwO1xuXG4vKiogV2hhdCB0aGUgaG92ZXIgcmVhZHMgZnJvbSB0aGUgc3BhdGlhbCBzY2VuZSBpdCBzZXJ2ZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxIb3Zlckhvc3Qge1xuICAvKiogVGhlIG9yYml0IHZpZXcgcmF0aGVyIHRoYW4gdGhlIDJEIHZpZXcgKG5vIHRyYW5zY3JpcHQgbWFya2VycyB0byBhc2sgZmlyc3QpLiAqL1xuICByZWFkb25seSBpczNkOiBib29sZWFuO1xuICByZWFkb25seSB2aWV3ZXI6IFZpZXdlcjtcbiAgcmVhZG9ubHkgcG9ydDogU3BhdGlhbERhdGFQb3J0IHwgbnVsbDtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfCBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgb24gc2NyZWVuLCBhcyB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gbGFzdCBzYXcgaXQuICovXG4gIGRhdGFzZXQoKTogU3BhdGlhbERhdGFzZXQgfCBudWxsO1xuICAvKipcbiAgICogVGhlIE9CU0VSVkFUSU9OIGRyYXduIHVuZGVyIGEgY2xpZW50IHBvc2l0aW9uLCBvciAtMSDigJQgYHNsYWNrUHhgIHNjcmVlbiBwaXhlbHMgb2Ygc2xhY2tcbiAgICogYXJvdW5kIHRoZSBwb2ludGVyLiBUaGUgc2NlbmUgb3ducyB0aGUgcGljayAobmFwYXJpLWpzJ3MsIG9uIHRoZSBsYXllciBpdCBkcmV3KSBhbmQgbWFwcyB0aGVcbiAgICogZHJhd24gaW5kZXggYmFjayB0byB0aGUgb2JzZXJ2YXRpb24uXG4gICAqL1xuICBwaWNrKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyLCBzbGFja1B4OiBudW1iZXIpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgb2JzZXJ2YXRpb24gb2YgYW4gaW5kaXZpZHVhbCBjZWxsJ3Mgc3VyZmFjZSB1bmRlciBhIGNsaWVudCBwb3NpdGlvbiAoc3BhdGlhbCAzRCdzIGNlbGxzKSxcbiAgICogb3IgLTE6IGEgY2xpY2sgb24gb25lIHNlbGVjdHMgdGhhdCBjZWxsIHJhdGhlciB0aGFuIGl0cyBjbGFzcy4gT3B0aW9uYWwuXG4gICAqL1xuICBwaWNrQ2VsbD8oY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBudW1iZXI7XG4gIC8qKiBUaGUgcmVnaW9uIHN1cmZhY2UgKGEgY2xhc3M6IGEgY2VsbCB0eXBlJ3MsIGluIHNwYXRpYWwgM0QpIHVuZGVyIGEgY2xpZW50IHBvc2l0aW9uLCBvciBudWxsLiBPcHRpb25hbC4gKi9cbiAgcGlja1JlZ2lvbj8oY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB7IGtleTogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9IHwgbnVsbDtcbiAgLyoqIFRoZSAyRCB0cmFuc2NyaXB0IG1hcmtlcnMsIHdoaWNoIHNpdCBvbiB0b3Agb2YgZXZlcnl0aGluZyBhbmQgYXJlIGFza2VkIGZpcnN0LiAqL1xuICB0aWxlcygpOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGw7XG4gIC8qKiBBIHJlZ2lvbiB0b29sIG93bnMgdGhlIHBvaW50ZXIgKHBsYWNpbmcgYSBwb2x5Z29uIHZlcnRleCBpcyBhbHNvIGEgc3RpbGwgY2xpY2spLiAqL1xuICB0b29sQWN0aXZlKCk6IGJvb2xlYW47XG4gIG91dHNpZGVab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbiAgaW5ab25lPFQ+KGZuOiAoKSA9PiBUKTogVDtcbn1cblxuLyoqXG4gKiBDdXJzb3IgdG9vbHRpcCBhbmQgY2xpY2stdG8tc2VsZWN0IGZvciB0aGUgc3BhdGlhbCB2aWV3cyAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgTCk6IGhvdmVyIGFcbiAqIG1hcmtlciwgcmVhZCBpdHMgY2xhc3M7IGNsaWNrIGl0LCBzZWxlY3QgdGhlIGNsYXNzIOKAlCB0aGUgY2FudmFzIGVxdWl2YWxlbnQgb2YgdGhlIHBhbmVsJ3NcbiAqIGxlZ2VuZC4gVGhlIHRvb2x0aXAgYW5kIHRoZSBjbGljayBzaGFyZSBPTkUgaGl0LXRlc3QsIHNvIGEgY2xpY2sgc2VsZWN0cyB0aGUgY2xhc3MgdGhlIHRvb2x0aXBcbiAqIG5hbWVzIChOQVBBUkktU1ZDLTUpLlxuICpcbiAqIEEgMzQtZW50cnkgbGVnZW5kIGNhbm5vdCBiZSByZWFkIGJhY2sgZnJvbSBhIGRvdCDigJQgc2V2ZXJhbCBjbGFzc2VzIGdldCBzaW1pbGFyIGNvbG91cnMsIGFuZFxuICogbWF0Y2hpbmcgb25lIHRvIGEgc3dhdGNoIGJ5IGV5ZSBpcyBleGFjdGx5IHRoZSB0YXNrIHRoaXMgcmVtb3Zlcy4gSXQgcmVwb3J0cyB3aGF0ZXZlciB0aGUgY2xvdWRcbiAqIGlzIENVUlJFTlRMWSBjb2xvdXJlZCBieSAoe0BsaW5rIHJlc29sdmVTb3VyY2V9KSwgc28gaXQgYW5kIHRoZSBsZWdlbmQgY2FuIG5ldmVyIHNheSBkaWZmZXJlbnRcbiAqIHRoaW5ncy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwYXRpYWxIb3ZlciB7XG4gIHByaXZhdGUgdG9vbHRpcDogTmFwYXJpU3BhdGlhbFRvb2x0aXAgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoYXQgdGhlIG1hcmtlcnMgYXJlIGNvbG91cmVkIGJ5LCByZXNvbHZlZCBvbmNlIHBlciBjb2xvdXIgc291cmNlIHJhdGhlciB0aGFuIHBlciBob3Zlci4gKi9cbiAgcHJpdmF0ZSBob3ZlclNvdXJjZTogSG92ZXJTb3VyY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclNvdXJjZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbiAzRDogd2hhdCBhIGNlbGwncyB0b29sdGlwIHNheXMgb2YgaXQgKGl0cyB0eXBlLCBpZCwgbWVhc3VyZW1lbnRzKSwgcmVzb2x2ZWQgb25jZSBwZXIgZGF0YXNldC4gKi9cbiAgcHJpdmF0ZSBjZWxsSW5mbzogQ2VsbEluZm8gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjZWxsSW5mb0tleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2VsbEluZm9Mb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgLyoqIExhdGVzdCB3aW5zIHdpdGhpbiB0aGUgc2NlbmU6IHRoZSBLRVkgaXMgb25seSBjb21taXR0ZWQgb25jZSBhIHJlc29sdXRpb24gbGFuZHMsIHNvIGFcbiAgICogIHN1cGVyc2VkZWQgZmV0Y2ggY2Fubm90IGxlYXZlIHRoZSBjYWNoZSBjbGFpbWluZyB0byBob2xkIGEgc291cmNlIGl0IG5ldmVyIHN0b3JlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHV0aW9ucyA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgcHJpdmF0ZSBwb2ludGVyOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmcmFtZSA9IDA7XG4gIHByaXZhdGUgb2ZmOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaG9zdDogU3BhdGlhbEhvdmVySG9zdCkge31cblxuICAvKipcbiAgICogTGlzdGVuIG9uIGBlbGAgKHRoZSBwbG90IGhvc3QpIHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIHNvIGl0IGtlZXBzIHdvcmtpbmcgb3ZlciB0aGUgcmVnaW9uXG4gICAqIG92ZXJsYXkgKGFuIFNWRyBjb3ZlcmluZyB0aGUgY2FudmFzLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdyBldmVyeSBtb3ZlKSwgYW5kIHRocm90dGxlXG4gICAqIHRvIG9uZSBoaXQtdGVzdCBwZXIgYW5pbWF0aW9uIGZyYW1lOiBhIHBvaW50ZXJtb3ZlIGNhbiBmaXJlIGZhciBtb3JlIG9mdGVuIHRoYW4gdGhhdCwgYW5kXG4gICAqIHRoZSBmaXJzdCB0ZXN0IGFmdGVyIGFuIG9yYml0IHJlLXByb2plY3RzIHRoZSBjbG91ZC4gTm9uZSB3aGlsZSBhIGJ1dHRvbiBpcyBoZWxkOiB0aGF0IGlzIGFuXG4gICAqIG9yYml0IG9yIGEgcGFuIG1vdmluZyB0aGUgY2FtZXJhIGV2ZXJ5IGZyYW1lLCBhbmQgYSB0ZXN0IHBlciBmcmFtZSByZS1wcm9qZWN0ZWQgYWxsIG9mIGEgMy43TVxuICAgKiBjbG91ZCBlYWNoIHRpbWUgKOKJiDE1MCBtcyBhIGZyYW1lKTsgdGhlIGZpcnN0IG1vdmUgYWZ0ZXIgdGhlIGRyYWcgcGF5cyBmb3Igb25lLlxuICAgKi9cbiAgaW5zdGFsbChlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnRvb2x0aXAgPSBuZXcgTmFwYXJpU3BhdGlhbFRvb2x0aXAoZWwpO1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgaWYgKGUuYnV0dG9ucykge1xuICAgICAgICB0aGlzLnBvaW50ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnRvb2x0aXA/LmhpZGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5wb2ludGVyID0geyBjbGllbnRYOiBlLmNsaWVudFgsIGNsaWVudFk6IGUuY2xpZW50WSB9O1xuICAgICAgaWYgKHRoaXMuZnJhbWUpIHJldHVybjtcbiAgICAgIHRoaXMuZnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmZyYW1lID0gMDtcbiAgICAgICAgdGhpcy51cGRhdGUoZWwpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkxlYXZlID0gKCkgPT4ge1xuICAgICAgdGhpcy5wb2ludGVyID0gbnVsbDtcbiAgICAgIHRoaXMudG9vbHRpcD8uaGlkZSgpO1xuICAgIH07XG5cbiAgICAvLyBBIGNsaWNrIG9uIGEgbWFya2VyIHNlbGVjdHMgaXRzIGNsYXNzLCBleGFjdGx5IGFzIGNsaWNraW5nIHRoYXQgY2xhc3MgaW4gdGhlXG4gICAgLy8gcGFuZWwncyBsZWdlbmQgZG9lcyDigJQgaW5jbHVkaW5nIGNsaWNraW5nIGFnYWluIHRvIGNsZWFyLCBzbyBhIGNsaWNrIGlzXG4gICAgLy8gYWx3YXlzIHJldmVyc2libGUuIFRyYWNrZWQgYXMgZG93bi91cCByYXRoZXIgdGhhbiBib3VuZCB0byBgY2xpY2tgIHNvIGEgRFJBR1xuICAgIC8vIChhbiBvcmJpdCBpbiAzRCwgYSBwYW4gaW4gMkQpIGNhbiBiZSB0b2xkIGFwYXJ0IGZyb20gYSBjbGljazogdGhlIGdlc3R1cmVcbiAgICAvLyBoYXMgdG8gbW92ZSBsZXNzIHRoYW4gYSBmZXcgcGl4ZWxzIGFuZCBiZSBvdmVyIHF1aWNrbHkuXG4gICAgbGV0IGRvd246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgb25Eb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGRvd24gPSB7IHg6IGUuY2xpZW50WCwgeTogZS5jbGllbnRZLCB0OiBEYXRlLm5vdygpIH07XG4gICAgfTtcbiAgICBjb25zdCBvblVwID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gZG93bjtcbiAgICAgIGRvd24gPSBudWxsO1xuICAgICAgaWYgKCFzdGFydCkgcmV0dXJuO1xuICAgICAgY29uc3QgbW92ZWQgPSBNYXRoLmh5cG90KGUuY2xpZW50WCAtIHN0YXJ0LngsIGUuY2xpZW50WSAtIHN0YXJ0LnkpO1xuICAgICAgaWYgKG1vdmVkID4gQ0xJQ0tfU0xPUF9QWCkgcmV0dXJuO1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydC50ID4gQ0xJQ0tfTUFYX01TKSByZXR1cm47XG4gICAgICAvLyBBIHJlZ2lvbiB0b29sIG93bnMgdGhlIHBvaW50ZXIgd2hpbGUgaXQgaXMgYWN0aXZlLCBhbmQgcGxhY2luZyBhIHBvbHlnb25cbiAgICAgIC8vIHZlcnRleCBpcyBhbHNvIGEgY2xpY2sgdGhhdCBkb2VzIG5vdCBtb3ZlLlxuICAgICAgaWYgKHRoaXMuaG9zdC50b29sQWN0aXZlKCkpIHJldHVybjtcbiAgICAgIHRoaXMuaG9zdC5pblpvbmUoKCkgPT4gdGhpcy5zZWxlY3RDbGFzc0F0KGUuY2xpZW50WCwgZS5jbGllbnRZKSk7XG4gICAgfTtcblxuICAgIC8vIE91dHNpZGUgdGhlIHpvbmU6IGEgcG9pbnRlcm1vdmUgZmlyZXMgZmFyIG1vcmUgb2Z0ZW4gdGhhbiBhbnl0aGluZyBoZXJlIGNoYW5nZXMgd2hhdFxuICAgIC8vIEFuZ3VsYXIgcmVuZGVycyAodGhlIHRvb2x0aXAgaXMgcGxhaW4gRE9NKTsgYSBzZWxlY3RpbmcgY2xpY2sgcmUtZW50ZXJzIGl0LlxuICAgIHRoaXMuaG9zdC5vdXRzaWRlWm9uZSgoKSA9PiB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCBvbkxlYXZlKTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uVXApO1xuICAgIH0pO1xuICAgIHRoaXMub2ZmLnB1c2goKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvbk1vdmUpKTtcbiAgICB0aGlzLm9mZi5wdXNoKCgpID0+IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uTGVhdmUpKTtcbiAgICB0aGlzLm9mZi5wdXNoKCgpID0+IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKSk7XG4gICAgdGhpcy5vZmYucHVzaCgoKSA9PiBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKSk7XG4gIH1cblxuICAvKiogSGlkZSB0aGUgdG9vbHRpcCAodGhlIG5hdmlnYXRvciBpcyBiZWluZyBkcmFnZ2VkLCBzYXkpLiAqL1xuICBoaWRlKCk6IHZvaWQge1xuICAgIHRoaXMudG9vbHRpcD8uaGlkZSgpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIGFuZCB0aGUgdG9vbHRpcCwgYW5kIGRyb3AgdGhlIGNvbG91ciBzb3VyY2UuICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvZmYgb2YgdGhpcy5vZmYpIG9mZigpO1xuICAgIHRoaXMub2ZmID0gW107XG4gICAgaWYgKHRoaXMuZnJhbWUpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZnJhbWUpO1xuICAgIHRoaXMuZnJhbWUgPSAwO1xuICAgIHRoaXMucG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy50b29sdGlwPy5kaXNwb3NlKCk7XG4gICAgdGhpcy50b29sdGlwID0gbnVsbDtcbiAgICB0aGlzLnJlc29sdXRpb25zLmNhbmNlbCgpO1xuICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRvb2x0aXAgc2F5cywgcmVzb2x2ZWQgb25jZSBwZXIgY29sb3VyIHNvdXJjZSByYXRoZXIgdGhhbiBwZXIgaG92ZXIuXG4gICAqXG4gICAqIEZldGNoZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBjb2xvdXJpbmcgb24gcHVycG9zZTogdGhlIHJlZmVyZW5jZSBwb3J0IGNhY2hlc1xuICAgKiBjb2x1bW5zLCBidXQgYSBob3N0J3MgbmVlZCBub3QsIGFuZCByZS1mZXRjaGluZyBhIDMuN00tZWxlbWVudCB2ZWN0b3IgYmVjYXVzZVxuICAgKiB0aGUgcG9pbnRlciBtb3ZlZCB3b3VsZCBiZSBpbmRlZmVuc2libGUgZWl0aGVyIHdheS5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVTb3VyY2UoZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaG9zdC5pczNkKSB2b2lkIHRoaXMucmVzb2x2ZUNlbGxJbmZvKGRhdGFzZXQsIHZpZXcpO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLmhvc3QucG9ydDtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIGNvbnN0IGtleSA9IGRhdGFzZXQgJiYgY29sb3JCeSA/IGAke2RhdGFzZXQuaWR9fCR7Y29sb3JCeS5raW5kfToke2NvbG9yQnkubmFtZX1gIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmhvdmVyU291cmNlS2V5KSByZXR1cm47XG4gICAgLy8gVGhlIGtleSBpcyBjb21taXR0ZWQgb25seSB3aGVyZSBhIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gU2V0dGluZyBpdCB1cFxuICAgIC8vIGZyb250IHdvdWxkIG1lYW4gYSByZXNvbHV0aW9uIHRoYXQgbG9zZXMgdGhlIHJhY2UgbGVhdmVzIHRoZSBrZXkgY2xhaW1pbmcgYVxuICAgIC8vIHNvdXJjZSB0aGF0IHdhcyBuZXZlciBzdG9yZWQg4oCUIGFuZCBzaW5jZSBldmVyeSBsYXRlciBlbWlzc2lvbiBjYXJyaWVzIHRoZVxuICAgIC8vIHNhbWUga2V5LCBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IGhlcmUgZm9yZXZlciBhbmQgdGhlIHRvb2x0aXAgd291bGQgc3RheVxuICAgIC8vIHNpbGVudCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24uXG4gICAgY29uc3QgdGFzayA9IHRoaXMucmVzb2x1dGlvbnMubmV4dCgpO1xuICAgIC8vIE5vIGNvbG91ciBzb3VyY2UgbWVhbnMgbm90aGluZyBpcyBiZWluZyBzYWlkIGFib3V0IHRoZSBjZWxscywgc28gdGhlcmUgaXMgbm9cbiAgICAvLyBjbHVzdGVyIHRvIG5hbWUgYW5kIHRoZSB0b29sdGlwIHN0YXlzIHNpbGVudC5cbiAgICBpZiAoIWtleSB8fCAhZGF0YXNldCB8fCAhY29sb3JCeSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgICAgaWYgKCF0YXNrKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBraW5kOiAnY2F0ZWdvcmljYWwnLFxuICAgICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICAgIGNhdGVnb3JpZXM6IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMsXG4gICAgICAgICAgICAgIGNvZGVzOiBjb2x1bW4uY29kZXMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGtpbmQ6ICdjb250aW51b3VzJyxcbiAgICAgICAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICAgICAgICB2YWx1ZXM6IGNvbHVtbi52YWx1ZXMsXG4gICAgICAgICAgICAgIC4uLihjb2x1bW4ubWV0YS51bml0ID8geyB1bml0OiBjb2x1bW4ubWV0YS51bml0IH0gOiB7fSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgICB0aGlzLmhvdmVyU291cmNlID0ge1xuICAgICAgICBraW5kOiAnY29udGludW91cycsXG4gICAgICAgIG5hbWU6IGNvbG9yQnkubmFtZSxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICAuLi4oZGF0YXNldC5mZWF0dXJlcz8udW5pdCA/IHsgdW5pdDogZGF0YXNldC5mZWF0dXJlcy51bml0IH0gOiB7fSksXG4gICAgICB9O1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgICAvLyBUaGUgdG9vbHRpcCBpcyBhbiBleHRyYTsgYSBmYWlsZWQgZmV0Y2ggbXVzdCBub3QgZGlzdHVyYiB0aGUgcmVuZGVyLiBUaGVcbiAgICAgIC8vIGtleSBpcyBsZWZ0IHVuc2V0IHNvIGEgbGF0ZXIgZW1pc3Npb24gcmV0cmllcyByYXRoZXIgdGhhbiBpbmhlcml0aW5nIGFcbiAgICAgIC8vIHBlcm1hbmVudCBzaWxlbmNlLlxuICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIDNEIGNlbGwncyB0b29sdGlwIHNheXMgKHNlZSBgY2VsbFRleHRgKTogdGhlIGNlbGwtdHlwZSBjb2x1bW4ncyBjb2RlcywgdGhlIGlkcywgYW5kIHRoZVxuICAgKiBkYXRhc2V0J3MgZmlyc3QgZmV3IGNvbnRpbnVvdXMgY29sdW1ucy4gUmVzb2x2ZWQgb25jZSBwZXIgZGF0YXNldCBhbmQgdHlwZSBjb2x1bW47IGEgZmFpbHVyZVxuICAgKiBsZWF2ZXMgdGhlIHRvb2x0aXAgd2l0aCB3aGF0IHRoZSBjb2xvdXJpbmcgc2F5cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUNlbGxJbmZvKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLmhvc3QucG9ydDtcbiAgICBjb25zdCB0eXBlTmFtZSA9IGRhdGFzZXQgPyBjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KSA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZGF0YXNldCA/IGAke2RhdGFzZXQuaWR9fCR7dHlwZU5hbWUgPz8gJyd9YCA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5jZWxsSW5mb0tleSkgcmV0dXJuO1xuICAgIHRoaXMuY2VsbEluZm9LZXkgPSBrZXk7XG4gICAgY29uc3QgdGFzayA9IHRoaXMuY2VsbEluZm9Mb2Fkcy5uZXh0KCk7XG4gICAgaWYgKCFkYXRhc2V0IHx8ICFwb3J0KSB7XG4gICAgICB0aGlzLmNlbGxJbmZvID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlTmFtZSA/IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKHR5cGVOYW1lKSA6IG51bGw7XG4gICAgICBjb25zdCBtZWFzdXJlTmFtZXMgPSBkYXRhc2V0LmNvbHVtbnNcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5raW5kID09PSAnY29udGludW91cycpXG4gICAgICAgIC5tYXAoKGMpID0+IGMubmFtZSlcbiAgICAgICAgLnNsaWNlKDAsIDQpO1xuICAgICAgY29uc3QgbWVhc3VyZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwobWVhc3VyZU5hbWVzLm1hcCgobikgPT4gcG9ydC5nZXRDb2x1bW4obikuY2F0Y2goKCkgPT4gbnVsbCkpKSkuZmxhdE1hcChcbiAgICAgICAgKGMpID0+XG4gICAgICAgICAgYyAmJiAhaXNDYXRlZ29yaWNhbENvbHVtbihjKVxuICAgICAgICAgICAgPyBbeyBuYW1lOiBjLm1ldGEubmFtZSwgdmFsdWVzOiBjLnZhbHVlcywgLi4uKGMubWV0YS51bml0ID8geyB1bml0OiBjLm1ldGEudW5pdCB9IDoge30pIH1dXG4gICAgICAgICAgICA6IFtdLFxuICAgICAgKTtcbiAgICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgICBjb25zdCBjYXRlZ29yaWNhbCA9IHR5cGUgJiYgaXNDYXRlZ29yaWNhbENvbHVtbih0eXBlKSA/IHR5cGUgOiBudWxsO1xuICAgICAgbGV0IGNvdW50czogVWludDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChjYXRlZ29yaWNhbCkge1xuICAgICAgICBjb3VudHMgPSBuZXcgVWludDMyQXJyYXkoY2F0ZWdvcmljYWwubWV0YS5jYXRlZ29yaWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjYXRlZ29yaWNhbC5jb2RlcykgaWYgKGMgIT09IE5PX0NBVEVHT1JZICYmIGMgPCBjb3VudHMubGVuZ3RoKSBjb3VudHNbY10rKztcbiAgICAgIH1cbiAgICAgIHRoaXMuY2VsbEluZm8gPSB7XG4gICAgICAgIHR5cGVOYW1lOiBjYXRlZ29yaWNhbCA/IHR5cGVOYW1lIDogbnVsbCxcbiAgICAgICAgY2F0ZWdvcmllczogY2F0ZWdvcmljYWw/Lm1ldGEuY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgY29kZXM6IGNhdGVnb3JpY2FsPy5jb2RlcyA/PyBudWxsLFxuICAgICAgICBjb3VudHMsXG4gICAgICAgIC4uLihkYXRhc2V0Lm9ic2VydmF0aW9ucy5pZHMgPyB7IGlkczogZGF0YXNldC5vYnNlcnZhdGlvbnMuaWRzIH0gOiB7fSksXG4gICAgICAgIG1lYXN1cmVzLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgICB0aGlzLmNlbGxJbmZvID0gbnVsbDtcbiAgICAgIHRoaXMuY2VsbEluZm9LZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJbiAzRDogdGhlIHRvb2x0aXAgb2YgdGhlIGNlbGwsIG9yIG9mIHRoZSBjZWxsIHR5cGUncyBzdXJmYWNlLCB1bmRlciBhIGNsaWVudCBwb3NpdGlvbi4gKi9cbiAgcHJpdmF0ZSBjZWxsM2RUZXh0KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaG9zdC5pczNkKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjZWxsID0gdGhpcy5ob3N0LnBpY2tDZWxsPy4oY2xpZW50WCwgY2xpZW50WSkgPz8gLTE7XG4gICAgaWYgKGNlbGwgPj0gMCkgcmV0dXJuIGNlbGxUZXh0KHRoaXMuY2VsbEluZm8sIGNlbGwsIHRoaXMuaG92ZXJTb3VyY2UpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIEhpdC10ZXN0IHRoZSBsYXN0IHBvaW50ZXIgcG9zaXRpb24gYW5kIHNob3cgb3IgaGlkZSB0aGUgdG9vbHRpcC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGUoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGlwID0gdGhpcy50b29sdGlwO1xuICAgIGNvbnN0IHBvaW50ZXIgPSB0aGlzLnBvaW50ZXI7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuaG9zdC5kYXRhc2V0KCk7XG4gICAgaWYgKCF0aXAgfHwgIXBvaW50ZXIgfHwgIWRhdGFzZXQpIHJldHVybjtcblxuICAgIC8vIFRyYW5zY3JpcHQgbWFya2VycyBzaXQgb24gdG9wIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoZXkgYXJlIGFza2VkIGZpcnN0LlxuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5ob3N0LnRpbGVzKCk7XG4gICAgaWYgKCF0aGlzLmhvc3QuaXMzZCAmJiB0aWxlcykge1xuICAgICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcjtcbiAgICAgIGNvbnN0IHdvcmxkID0gdmlld2VyLmNhbnZhc1RvV29ybGQocG9pbnRlci5jbGllbnRYLCBwb2ludGVyLmNsaWVudFkpO1xuICAgICAgY29uc3Qgem9vbSA9IHZpZXdlci5jYW1lcmEuem9vbTtcbiAgICAgIGNvbnN0IHJhZGl1cyA9IEhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gd29ybGRcbiAgICAgICAgPyB0aWxlcy5ob3ZlckF0KHdvcmxkWzBdLCB3b3JsZFsxXSwgcmFkaXVzLCAoZGV0YWlscykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMucG9pbnRlcjtcbiAgICAgICAgICAgIGlmICghcCB8fCAhdGhpcy50b29sdGlwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCByID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdyhkZXRhaWxzLCBwLmNsaWVudFggLSByLmxlZnQsIHAuY2xpZW50WSAtIHIudG9wKTtcbiAgICAgICAgICB9KVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAobGluZXMpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBIGNlbGwgZHJhd24gYnkgaXRzZWxmIG5hbWVzIGl0c2VsZjsgYSBtYXJrZXIsIGl0cyBjb2xvdXJpbmc7IGVsc2UgYSBjZWxsIHR5cGUncyBzdXJmYWNlLlxuICAgIGxldCBsaW5lcyA9IHRoaXMuY2VsbDNkVGV4dChwb2ludGVyLmNsaWVudFgsIHBvaW50ZXIuY2xpZW50WSk7XG4gICAgaWYgKCFsaW5lcykge1xuICAgICAgY29uc3QgaGl0ID0gdGhpcy5ob3N0LnBpY2socG9pbnRlci5jbGllbnRYLCBwb2ludGVyLmNsaWVudFksIEhPVkVSX1JBRElVU19QWCk7XG4gICAgICBsaW5lcyA9XG4gICAgICAgIGhpdCA+PSAwICYmIHRoaXMuaG9zdC5pczNkICYmIHRoaXMuY2VsbEluZm9cbiAgICAgICAgICA/IGNlbGxUZXh0KHRoaXMuY2VsbEluZm8sIGhpdCwgdGhpcy5ob3ZlclNvdXJjZSlcbiAgICAgICAgICA6IGhvdmVyVGV4dCh0aGlzLmhvdmVyU291cmNlLCBoaXQpO1xuICAgICAgaWYgKCFsaW5lcyAmJiB0aGlzLmhvc3QuaXMzZCkge1xuICAgICAgICBjb25zdCByZWdpb24gPSB0aGlzLmhvc3QucGlja1JlZ2lvbj8uKHBvaW50ZXIuY2xpZW50WCwgcG9pbnRlci5jbGllbnRZKTtcbiAgICAgICAgaWYgKHJlZ2lvbikgbGluZXMgPSBjZWxsVHlwZVRleHQodGhpcy5jZWxsSW5mbywgcmVnaW9uLmtleSwgcmVnaW9uLmxhYmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFsaW5lcykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRpcC5zaG93KGxpbmVzLCBwb2ludGVyLmNsaWVudFggLSByZWN0LmxlZnQsIHBvaW50ZXIuY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGNsYXNzIG9mIHRoZSBtYXJrZXIgYXQgYSBjbGllbnQgcG9zaXRpb24g4oCUIHRoZSBjYW52YXMgZXF1aXZhbGVudCBvZlxuICAgKiBjbGlja2luZyB0aGF0IGNsYXNzIGluIHRoZSBwYW5lbCdzIGxlZ2VuZCwgYW5kIHRoZSBzYW1lIHNlbGVjdGlvbiBvYmplY3QsIHNvXG4gICAqIHRoZSB0d28gY29udHJvbHMgY2Fubm90IHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdHMuXG4gICAqXG4gICAqIENsaWNraW5nIGEgY2xhc3MgdGhhdCBpcyBhbHJlYWR5IHRoZSB3aG9sZSBzZWxlY3Rpb24gQ0xFQVJTIGl0LCB3aGljaCBpcyB3aGF0XG4gICAqIHRoZSBsZWdlbmQgZG9lcy4gQ29tcGFyZWQgYWdhaW5zdCB0aGUgc2VsZWN0aW9uIGl0c2VsZiByYXRoZXIgdGhhbiBhZ2FpbnN0IGFcbiAgICogcmVtZW1iZXJlZCBjbGljaywgc28gc2VsZWN0aW5nIGZyb20gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGUgc2FtZVxuICAgKiBjbGFzcyBvbiB0aGUgY2FudmFzIHN0aWxsIHRvZ2dsZXMuXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdENsYXNzQXQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmhvdmVyU291cmNlO1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5ob3N0LnNlbGVjdGlvbjtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5ob3N0LmRhdGFzZXQoKTtcbiAgICAvLyBBIGNlbGwgZHJhd24gYnkgaXRzZWxmOiB0aGUgY2xpY2sgc2VsZWN0cyB0aGF0IGNlbGwgKGFnYWluOiBjbGVhcnMgaXQpLCB3aGF0ZXZlciBjb2xvdXJzIGl0LlxuICAgIGNvbnN0IGNlbGwgPSB0aGlzLmhvc3QucGlja0NlbGw/LihjbGllbnRYLCBjbGllbnRZKSA/PyAtMTtcbiAgICBpZiAoY2VsbCA+PSAwICYmIHN0b3JlICYmIGRhdGFzZXQpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBzZWxlY3RCeUluZGljZXMoW2NlbGxdLCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCk7XG4gICAgICBpZiAoc2FtZVNlbGVjdGlvbihzdG9yZS5jdXJyZW50KCksIG5leHQpKSBzdG9yZS5jbGVhcigpO1xuICAgICAgZWxzZSBzdG9yZS5zZXQobmV4dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE9ubHkgYSBjYXRlZ29yaWNhbCBzb3VyY2UgaGFzIGNsYXNzZXMgdG8gc2VsZWN0LiBBIGdlbmUgaXMgY29udGludW91czpcbiAgICAvLyB0aGVyZSBpcyBubyBzZXQgb2YgY2VsbHMgdGhhdCBcImlzXCIgYSB2YWx1ZS5cbiAgICBpZiAoIXN0b3JlIHx8ICFkYXRhc2V0IHx8IHNvdXJjZT8ua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykgcmV0dXJuO1xuXG4gICAgLy8gVGhlIHNhbWUgcGljayB0aGUgdG9vbHRpcCBtYWtlcyDigJQgZGVwdGgtYXdhcmUgaW4gM0Qg4oCUIHNvIGEgY2xpY2sgc2VsZWN0cyB0aGUgY2xhc3MgdGhlXG4gICAgLy8gdG9vbHRpcCBuYW1lcywgbm90IGFuIG9jY2x1ZGVkIG1hcmtlcidzLlxuICAgIGNvbnN0IGhpdCA9IHRoaXMuaG9zdC5waWNrKGNsaWVudFgsIGNsaWVudFksIEhPVkVSX1JBRElVU19QWCk7XG4gICAgaWYgKGhpdCA8IDApIHJldHVybjtcbiAgICBjb25zdCBjb2RlID0gc291cmNlLmNvZGVzW2hpdF07XG4gICAgLy8gQSBjZWxsIHRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGNvdmVyIGhhcyBubyBjbGFzcyB0byBzZWxlY3QuXG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCB8fCBjb2RlID09PSBOT19DQVRFR09SWSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV4dCA9IHNlbGVjdEJ5Q2F0ZWdvcnkoc291cmNlLmNvZGVzLCBjb2RlKTtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RvcmUuY3VycmVudCgpO1xuICAgIGlmIChzYW1lU2VsZWN0aW9uKGN1cnJlbnQsIG5leHQpKSB7XG4gICAgICBzdG9yZS5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdG9yZS5zZXQobmV4dCk7XG4gIH1cbn1cbiJdfQ==
@@ -31,6 +31,10 @@ export class SpatialSession {
31
31
  this.tileLayers = null;
32
32
  this.tileOwner = null;
33
33
  }
34
+ /** Tell the panel how the 3D view's individual cells stand (null: none drawn). */
35
+ reportCells3d(status) {
36
+ this.sinks.cells3dStatus?.(status);
37
+ }
34
38
  /** Tell the panel whether the observation gene filter could be applied this rebuild. */
35
39
  reportGeneFilter(failed) {
36
40
  this.sinks.geneFilterFailed?.(failed);
@@ -123,6 +127,8 @@ export class SpatialSceneBase {
123
127
  selection: session.selection,
124
128
  dataset: () => session.latest?.[0] ?? null,
125
129
  pick: (clientX, clientY, slackPx) => this.pickObservation(clientX, clientY, slackPx),
130
+ pickCell: (clientX, clientY) => this.pickCell(clientX, clientY),
131
+ pickRegion: (clientX, clientY) => this.pickRegion(clientX, clientY),
126
132
  tiles: () => this.hoverTiles(),
127
133
  toolActive: () => !!ctx.tools.regionOverlay?.toolActive,
128
134
  outsideZone: (fn) => ctx.outsideZone(fn),
@@ -149,6 +155,14 @@ export class SpatialSceneBase {
149
155
  afterChange() {
150
156
  /* nothing by default */
151
157
  }
158
+ /** The region surface (a class) under a client position, or null (none drawn). */
159
+ pickRegion(_clientX, _clientY) {
160
+ return null;
161
+ }
162
+ /** The observation of an individual cell's surface under a client position, or -1 (none drawn). */
163
+ pickCell(_clientX, _clientY) {
164
+ return -1;
165
+ }
152
166
  hoverTiles() {
153
167
  return null;
154
168
  }
@@ -160,4 +174,4 @@ export class SpatialSceneBase {
160
174
  this.hover.dispose();
161
175
  }
162
176
  }
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTW5FLE9BQU8sRUFBd0IsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sd0JBQXdCLENBQUM7QUFnQ3JGOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFpQnpCLFlBQ1csSUFBNEIsRUFDNUIsU0FBdUMsRUFDL0IsS0FBdUI7UUFGL0IsU0FBSSxHQUFKLElBQUksQ0FBd0I7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBOEI7UUFDL0IsVUFBSyxHQUFMLEtBQUssQ0FBa0I7UUFuQjFDO29HQUM0RjtRQUM1RixXQUFNLEdBQXlCLElBQUksQ0FBQztRQUNwQyx5RkFBeUY7UUFDaEYsb0JBQWUsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDckQsMEZBQTBGO1FBQ2pGLFlBQU8sR0FBZ0MsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzRSwrQkFBK0I7UUFDdEIsa0JBQWEsR0FBc0MsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMvRSxzQkFBaUIsR0FBZ0MsSUFBSSxDQUFDO1FBQ3RELHNCQUFpQixH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Q0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7IFNwYXRpYWxEYXRhc2V0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcE5vZGUsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBFeHByZXNzaW9uRmllbGQsIEV4cHJlc3Npb25Wb2x1bWVGaWVsZCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuaW1wb3J0IHsgQ29udHJhc3RXaW5kb3dDYWNoZSB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgU3BhdGlhbEhvdmVyIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1ob3Zlcic7XG5pbXBvcnQgeyBOYXBhcmlTcGF0aWFsVGlsZUxheWVycywgVHJhbnNjcmlwdEVzdGltYXRlIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10aWxlcyc7XG5pbXBvcnQgeyBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB0eXBlIHsgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuXG4vKiogV2hhdCB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gbGFzdCBzYXc6IHRoZSBkYXRhc2V0LCB0aGUgdmlldyBzdGF0ZSBhbmQgdGhlIHNlbGVjdGlvbi4gKi9cbmV4cG9ydCB0eXBlIFNwYXRpYWxMYXRlc3QgPSBbU3BhdGlhbERhdGFzZXQgfCBudWxsLCBTcGF0aWFsVmlld1N0YXRlLCBTcGF0aWFsU2VsZWN0aW9uTWFza107XG5cbi8qKiBXaGVyZSB0aGUgc3BhdGlhbCB0aWxlIGxheWVycycgcGFuZWwgb3V0cHV0cyBnbyAodGhlIHNlcnZpY2UncyBzdWJqZWN0cyBhbmQgYmFkZ2UpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsVGlsZVNpbmtzIHtcbiAgLyoqIFRoZSBjb250aW51b3VzIExVVCB0aGUgdmlldyBpcyB1c2luZyAoc28gY2VsbHMgY29sb3VyZWQgYnkgYSBnZW5lIG1hdGNoIHRoZSBtYXJrZXJzKS4gKi9cbiAgY29udGludW91c0x1dCh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogUmdiW107XG4gIGVzdGltYXRlQ2hhbmdlZChlc3RpbWF0ZTogVHJhbnNjcmlwdEVzdGltYXRlIHwgbnVsbCk6IHZvaWQ7XG4gIGdlbmVDb3VudHNDaGFuZ2VkKGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGwpOiB2b2lkO1xuICBkZW5zaXR5Q2hhbmdlZChzdGF0czogeyBsbzogbnVtYmVyOyBoaTogbnVtYmVyOyBtYXg6IG51bWJlciB9KTogdm9pZDtcbiAgbG9hZGluZ0NoYW5nZWQobGF5ZXJzOiBzdHJpbmdbXSk6IHZvaWQ7XG4gIC8qKiBXaGV0aGVyIHRoZSBvYnNlcnZhdGlvbiBnZW5lIGZpbHRlciBjb3VsZCBiZSBhcHBsaWVkOyBzZWUge0BsaW5rIFNwYXRpYWxTZXNzaW9uLnJlcG9ydEdlbmVGaWx0ZXJ9LiAqL1xuICBnZW5lRmlsdGVyRmFpbGVkPyhmYWlsZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG4vKiogVGhlIDJEIHNjZW5lIHRoZSB0aWxlIGxheWVycyBjdXJyZW50bHkgZHJhdyBpbnRvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsVGlsZU93bmVyIHtcbiAgY2FudmFzU2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogT3V0bGluZXMgYXBwZWFyZWQgb3IgZGlzYXBwZWFyZWQ6IHRoZSBtYXJrZXJzJyB2aXNpYmlsaXR5IGZvbGxvd3MuICovXG4gIHBvbHlnb25zU2hvd25DaGFuZ2VkKCk6IHZvaWQ7XG59XG5cbi8qKiBBbiBlc3RpbWF0ZWQgZmllbGQgYW5kIHRoZSBpbnB1dHMgaXQgd2FzIGVzdGltYXRlZCBmb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkQ2FjaGU8VD4ge1xuICBrZXk6IHN0cmluZyB8IG51bGw7XG4gIGZpZWxkOiBUIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgc3BhdGlhbCBzdGF0ZSB0aGF0IG91dGxpdmVzIGEgc2NlbmUgKHJldmlldyBBcHBlbmRpeCBCKTogd2hhdCB0aGUgc3Vic2NyaXB0aW9uIGxhc3Qgc2F3LCB0aGVcbiAqIG1lbW9pc2VkIHBlcmNlbnRpbGUgd2luZG93cywgdGhlIHNlbGVjdGlvbiByZXZpc2lvbiBjb3VudGVyIGFuZCB0aGUgZXN0aW1hdGVkIGdlbmUtbWFwIEZJRUxEUyDigJRcbiAqIHZpZXdlci1pbmRlcGVuZGVudCBhbmQgZXhwZW5zaXZlLCBzbyBhIHJlLXBsb3QgcmVjb2xvdXJzIHRoZSBjYWNoZWQgZmllbGQgaW5zdGVhZCBvZiBlc3RpbWF0aW5nXG4gKiBpdCBhZ2Fpbi4gRXZlcnl0aGluZyB0aGF0IG5hbWVzIGEgbGF5ZXIgb2YgYSB2aWV3ZXIgYmVsb25ncyB0byB0aGUgc2NlbmUgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwYXRpYWxTZXNzaW9uIHtcbiAgLyoqIExhdGVzdCAoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKSB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gc2F3IOKAlCBzbyBhIHNsaWNlIGNoYW5nZSBjYW5cbiAgICogIHJlYnVpbGQgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUsIGFuZCB0aGUgdGlsZSBsYXllcnMgYW5kIHRoZSBob3ZlciBjYW4gcmVhZCBpdC4gKi9cbiAgbGF0ZXN0OiBTcGF0aWFsTGF0ZXN0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTcGF0aWFsIGNvbG91cmluZydzIHBlcmNlbnRpbGUgd2luZG93cywgbWVtb2lzZWQgcGVyIGNvbG91cmVkIHZlY3RvciAoU1BBVElBTC0xMikuICovXG4gIHJlYWRvbmx5IGNvbnRyYXN0V2luZG93cyA9IG5ldyBDb250cmFzdFdpbmRvd0NhY2hlKCk7XG4gIC8qKiBUaGUgMkQgZ2VuZSBtYXAncyBmaWVsZCAodGhlIGV4cGVuc2l2ZSBoYWxmOiBpdCBzdXJ2aXZlcyBhIHJlY29sb3VyIGFuZCBhIHJlLXBsb3QpLiAqL1xuICByZWFkb25seSBnZW5lTWFwOiBGaWVsZENhY2hlPEV4cHJlc3Npb25GaWVsZD4gPSB7IGtleTogbnVsbCwgZmllbGQ6IG51bGwgfTtcbiAgLyoqIFRoZSAzRCBnZW5lIG1hcCdzIGZpZWxkLiAqL1xuICByZWFkb25seSBnZW5lTWFwVm9sdW1lOiBGaWVsZENhY2hlPEV4cHJlc3Npb25Wb2x1bWVGaWVsZD4gPSB7IGtleTogbnVsbCwgZmllbGQ6IG51bGwgfTtcbiAgcHJpdmF0ZSBsYXN0U2VsZWN0aW9uU2VlbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25SZXZpc2lvbiA9IDA7XG4gIC8qKiBMZXZlbC1vZi1kZXRhaWwgY2VsbCBvdXRsaW5lcywgdHJhbnNjcmlwdHMgYW5kIGRlbnNpdHkgb3ZlciB0aGUgMkQgdmlldyDigJQgY3JlYXRlZCBvbiBmaXJzdFxuICAgKiAgdXNlLCBvbmx5IHdoZW4gYSBzcGF0aWFsIHBvcnQgaXMgYm91bmQsIGFuZCBrZXB0IGFjcm9zcyBzY2VuZXMgKGl0cyB0aWxlIGNhY2hlcyB3aXRoIGl0KS4gKi9cbiAgcHJpdmF0ZSB0aWxlTGF5ZXJzOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRpbGVPd25lcjogU3BhdGlhbFRpbGVPd25lciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHBvcnQ6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwsXG4gICAgcmVhZG9ubHkgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2lua3M6IFNwYXRpYWxUaWxlU2lua3MsXG4gICkge31cblxuICAvKiogVGVsbCB0aGUgcGFuZWwgd2hldGhlciB0aGUgb2JzZXJ2YXRpb24gZ2VuZSBmaWx0ZXIgY291bGQgYmUgYXBwbGllZCB0aGlzIHJlYnVpbGQuICovXG4gIHJlcG9ydEdlbmVGaWx0ZXIoZmFpbGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zaW5rcy5nZW5lRmlsdGVyRmFpbGVkPy4oZmFpbGVkKTtcbiAgfVxuXG4gIC8qKiBUaGUgdGlsZSBsYXllcnMsIGlmIHRoZXkgd2VyZSBldmVyIGJ1aWx0LiAqL1xuICBnZXQgdGlsZXMoKTogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50aWxlTGF5ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0aWxlIGxheWVycywgYnVpbHQgb24gZmlyc3QgdXNlIChudWxsIHdpdGhvdXQgYSBzcGF0aWFsIHBvcnQpLCBub3cgZHJhd2luZyBmb3IgYG93bmVyYC5cbiAgICogVGhlaXIgaG9zdCBjYWxsYmFja3MgcmVhZCB0aGUgc2Vzc2lvbidzIGxpdmUgc3RhdGUgYW5kIHRoZSBvd25lcidzIGNhbnZhcywgc28gdGhleSBuZXZlciBob2xkXG4gICAqIGEgc3RhbGUgZGF0YXNldCBvciBjb2xvcm1hcC5cbiAgICovXG4gIGNsYWltVGlsZXMob3duZXI6IFNwYXRpYWxUaWxlT3duZXIpOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGwge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgaWYgKCFwb3J0KSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnRpbGVPd25lciA9IG93bmVyO1xuICAgIGNvbnN0IHNpbmtzID0gdGhpcy5zaW5rcztcbiAgICB0aGlzLnRpbGVMYXllcnMgPz89IG5ldyBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyhwb3J0LCB7XG4gICAgICBsYXRlc3Q6ICgpID0+IHRoaXMubGF0ZXN0LFxuICAgICAgY2FudmFzU2l6ZTogKCkgPT4gdGhpcy50aWxlT3duZXI/LmNhbnZhc1NpemUoKSA/PyBbMCwgMF0sXG4gICAgICBjb250aW51b3VzTHV0OiAodmlldykgPT4gc2lua3MuY29udGludW91c0x1dCh2aWV3KSxcbiAgICAgIGVzdGltYXRlQ2hhbmdlZDogKGUpID0+IHNpbmtzLmVzdGltYXRlQ2hhbmdlZChlKSxcbiAgICAgIGdlbmVDb3VudHNDaGFuZ2VkOiAoYykgPT4gc2lua3MuZ2VuZUNvdW50c0NoYW5nZWQoYyksXG4gICAgICBsb2FkaW5nQ2hhbmdlZDogKGxheWVycykgPT4gc2lua3MubG9hZGluZ0NoYW5nZWQobGF5ZXJzKSxcbiAgICAgIGRlbnNpdHlDaGFuZ2VkOiAoZCkgPT4gc2lua3MuZGVuc2l0eUNoYW5nZWQoZCksXG4gICAgICBwb2x5Z29uc1Nob3duQ2hhbmdlZDogKCkgPT4gdGhpcy50aWxlT3duZXI/LnBvbHlnb25zU2hvd25DaGFuZ2VkKCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMudGlsZUxheWVycztcbiAgfVxuXG4gIC8qKiBgb3duZXJgJ3Mgc2NlbmUgaXMgZ29pbmcgYXdheTogdGFrZSB0aGUgdGlsZSBsYXllcnMgb2ZmIGl0cyB2aWV3ZXIuICovXG4gIHJlbGVhc2VUaWxlcyhvd25lcjogU3BhdGlhbFRpbGVPd25lcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbGVPd25lciAhPT0gb3duZXIpIHJldHVybjtcbiAgICB0aGlzLnRpbGVPd25lciA9IG51bGw7XG4gICAgdGhpcy50aWxlTGF5ZXJzPy5kZXRhY2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHJldmlzaW9uIG51bWJlciBmb3IgYSBzZWxlY3Rpb24gb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgc3RvcmUgaGFuZHMgb3V0IGEgTkVXIG1hc2sgb2JqZWN0IHBlciBjaGFuZ2UsIHNvIG9iamVjdCBpZGVudGl0eSBpcyB0aGVcbiAgICogY2hlYXAgYW5kIGV4YWN0IHdheSB0byB0ZWxsIHR3byBzZWxlY3Rpb25zIGFwYXJ0IOKAlCBhIGZpbmdlcnByaW50IG92ZXIgMy43TVxuICAgKiBtYXNrIGJ5dGVzIHdvdWxkIGJlIG5laXRoZXIuIENvdW50aW5nIHJldmlzaW9ucyBrZWVwcyB0aGUgY2FjaGUga2V5IGEgc2hvcnRcbiAgICogc3RyaW5nLlxuICAgKi9cbiAgc2VsZWN0aW9uUmV2KHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2spOiBudW1iZXIge1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHRoaXMubGFzdFNlbGVjdGlvblNlZW4pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGlvblNlZW4gPSBzZWxlY3Rpb247XG4gICAgICB0aGlzLnNlbGVjdGlvblJldmlzaW9uKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblJldmlzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5dGhpbmcgYSBzcGF0aWFsIHNjZW5lIHJlZHJhd3Mgb246IHRoZSBkYXRhc2V0LCB0aGUgdmlldyBzdGF0ZSwgdGhlIHNlbGVjdGlvbiDigJQgYW5kIHRoZVxuICAgKiBkaXNwbGF5IGNvbG9ybWFwIGFuZCByZXZlcnNlIGZsYWcsIHdoaWNoIGFyZSBpbnB1dHMgaGVyZSwgbm90IGp1c3Qgc29tZXRoaW5nIHJlYWQgYXQgYnVpbGRcbiAgICogdGltZTogYGNvbnRpbnVvdXNDb2xvcm1hcDogbnVsbGAgbWVhbnMgXCJmb2xsb3cgdGhlIGltYWdlJ3MgY29sb3JtYXBcIiwgYW5kIGEgc2V0dGluZyB0aGF0IG9ubHlcbiAgICogdGFrZXMgZWZmZWN0IGF0IHRoZSBuZXh0IHVucmVsYXRlZCByZWJ1aWxkIGlzIG5vdCBvbmUuIE51bGwgd2l0aG91dCBhIHNwYXRpYWwgcG9ydC5cbiAgICovXG4gIGNoYW5nZXMkKFxuICAgIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICk6IE9ic2VydmFibGU8W1NwYXRpYWxEYXRhc2V0IHwgbnVsbCwgU3BhdGlhbFZpZXdTdGF0ZSwgU3BhdGlhbFNlbGVjdGlvbk1hc2ssIHVua25vd24sIGJvb2xlYW5dPiB8IG51bGwge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgaWYgKCFwb3J0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzZWxlY3Rpb24kID0gdGhpcy5zZWxlY3Rpb24/LmdldFNlbGVjdGlvbiQoKSA/PyBvZihlbXB0eVNlbGVjdGlvbigpKTtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICBwb3J0LmdldERhdGFzZXQkKCksXG4gICAgICBzdG9yZS5nZXRTcGF0aWFsVmlldyQoKSxcbiAgICAgIHNlbGVjdGlvbiQsXG4gICAgICBzdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IHRoZSAyRCBhbmQgM0Qgc3BhdGlhbCBzY2VuZXMgc2hhcmU6IHRoZSBzdWJzY3JpcHRpb24gdGhhdCByZWRyYXdzIHRoZW0sIHRoZSBob3ZlciBvdmVyXG4gKiB0aGVtLCBhbmQgdGhlIGxhdGVzdC13aW5zIHNlcXVlbmNpbmcgb2YgdGhlaXIgKGFzeW5jKSByZWJ1aWxkcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNwYXRpYWxTY2VuZUJhc2Uge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG92ZXI6IFNwYXRpYWxIb3ZlcjtcbiAgLyoqIExhdGVzdCB3aW5zIHdpdGhpbiB0aGUgc2NlbmU6IGEgY29sb3VyIGZldGNoIGlzIGEgcm91bmQtdHJpcCwgc28gYSBmYXN0IHNlcXVlbmNlIG9mXG4gICAqICBjb2xvdXItYnkgY2hhbmdlcyBjYW4gcmVzb2x2ZSBvdXQgb2Ygb3JkZXIsIGFuZCBvbmx5IHRoZSBuZXdlc3QgbWF5IHRvdWNoIHRoZSBsYXllcnMuICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZWJ1aWxkcyA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgcHJpdmF0ZSBzdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3R4OiBTY2VuZUNvbnRleHQsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlc3Npb246IFNwYXRpYWxTZXNzaW9uLFxuICAgIGlzM2Q6IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMuaG92ZXIgPSBuZXcgU3BhdGlhbEhvdmVyKHtcbiAgICAgIGlzM2QsXG4gICAgICB2aWV3ZXI6IGN0eC52aWV3ZXIsXG4gICAgICBwb3J0OiBzZXNzaW9uLnBvcnQsXG4gICAgICBzZWxlY3Rpb246IHNlc3Npb24uc2VsZWN0aW9uLFxuICAgICAgZGF0YXNldDogKCkgPT4gc2Vzc2lvbi5sYXRlc3Q/LlswXSA/PyBudWxsLFxuICAgICAgcGljazogKGNsaWVudFgsIGNsaWVudFksIHNsYWNrUHgpID0+IHRoaXMucGlja09ic2VydmF0aW9uKGNsaWVudFgsIGNsaWVudFksIHNsYWNrUHgpLFxuICAgICAgdGlsZXM6ICgpID0+IHRoaXMuaG92ZXJUaWxlcygpLFxuICAgICAgdG9vbEFjdGl2ZTogKCkgPT4gISFjdHgudG9vbHMucmVnaW9uT3ZlcmxheT8udG9vbEFjdGl2ZSxcbiAgICAgIG91dHNpZGVab25lOiAoZm4pID0+IGN0eC5vdXRzaWRlWm9uZShmbiksXG4gICAgICBpblpvbmU6IChmbikgPT4gY3R4LmluWm9uZShmbiksXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVidWlsZCBvbiBldmVyeSBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24gb3IgY29sb3JtYXAgY2hhbmdlLiAqL1xuICBwcm90ZWN0ZWQgc3Vic2NyaWJlU3BhdGlhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnN1YiA9XG4gICAgICB0aGlzLnNlc3Npb24uY2hhbmdlcyQodGhpcy5jdHguc3RvcmUpPy5zdWJzY3JpYmUoKFtkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIGNvbG9ybWFwLCByZXZlcnNlXSkgPT4ge1xuICAgICAgICB0aGlzLmN0eC5kaXNwbGF5LnJlY29yZCgoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsLCAhIXJldmVyc2UpO1xuICAgICAgICAvLyBLZXB0IHNvIGEgc2xpY2UgY2hhbmdlIGNhbiByZWRyYXcgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUsIHdoaWNoXG4gICAgICAgIC8vIGFycml2ZXMgdGhyb3VnaCBzZXRaSW5kZXggcmF0aGVyIHRoYW4gdGhyb3VnaCBhbnkgb2YgdGhlc2Ugc3RyZWFtcy5cbiAgICAgICAgdGhpcy5zZXNzaW9uLmxhdGVzdCA9IFtkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb25dO1xuICAgICAgICAvLyBXaGF0IHRoZSBtYXJrZXJzIGFyZSBtYXkgaGF2ZSBjaGFuZ2VkOyB3aGVyZSB0aGV5IGFyZSBpcyB0aGUgbGF5ZXJzJyBvd24gcGljaydzXG4gICAgICAgIC8vIGJ1c2luZXNzIChpdCBmb2xsb3dzIHRoZWlyIGRhdGEgYW5kIHRoZSBjYW1lcmEpLlxuICAgICAgICB2b2lkIHRoaXMuaG92ZXIucmVzb2x2ZVNvdXJjZShkYXRhc2V0LCB2aWV3KTtcbiAgICAgICAgdm9pZCB0aGlzLnJlYnVpbGQoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5hZnRlckNoYW5nZSgpO1xuICAgICAgfSkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIHNjZW5lJ3MgbGF5ZXJzIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uPzogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSdW4gYWZ0ZXIgZWFjaCByZWJ1aWxkIGlzIHN0YXJ0ZWQgKHRoZSAyRCB0aWxlIGxheWVycyByZWZyZXNoIGhlcmUpLiAqL1xuICBwcm90ZWN0ZWQgYWZ0ZXJDaGFuZ2UoKTogdm9pZCB7XG4gICAgLyogbm90aGluZyBieSBkZWZhdWx0ICovXG4gIH1cbiAgLyoqIFRoZSBvYnNlcnZhdGlvbiBkcmF3biB1bmRlciBhIGNsaWVudCBwb3NpdGlvbiwgb3IgLTEgKHNlZSBgU3BhdGlhbEhvdmVySG9zdC5waWNrYCkuICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwaWNrT2JzZXJ2YXRpb24oY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIsIHNsYWNrUHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGhvdmVyVGlsZXMoKTogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBTdG9wIGZvbGxvd2luZyB0aGUgZGF0YSwgZHJvcCB0aGUgaG92ZXIsIGFuZCBtYWtlIGV2ZXJ5IHJlYnVpbGQgaW4gZmxpZ2h0IHN0YWxlLiAqL1xuICBwcm90ZWN0ZWQgZGlzcG9zZVNwYXRpYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdWIgPSBudWxsO1xuICAgIHRoaXMucmVidWlsZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5ob3Zlci5kaXNwb3NlKCk7XG4gIH1cbn1cbiJdfQ==
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUE0QixhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTW5FLE9BQU8sRUFBd0IsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sd0JBQXdCLENBQUM7QUFrQ3JGOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFpQnpCLFlBQ1csSUFBNEIsRUFDNUIsU0FBdUMsRUFDL0IsS0FBdUI7UUFGL0IsU0FBSSxHQUFKLElBQUksQ0FBd0I7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBOEI7UUFDL0IsVUFBSyxHQUFMLEtBQUssQ0FBa0I7UUFuQjFDO29HQUM0RjtRQUM1RixXQUFNLEdBQXlCLElBQUksQ0FBQztRQUNwQyx5RkFBeUY7UUFDaEYsb0JBQWUsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDckQsMEZBQTBGO1FBQ2pGLFlBQU8sR0FBZ0MsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzRSwrQkFBK0I7UUFDdEIsa0JBQWEsR0FBc0MsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMvRSxzQkFBaUIsR0FBZ0MsSUFBSSxDQUFDO1FBQ3RELHNCQUFpQixH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QUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2YsQ0FBQztJQVFELDJFQUEyRTtJQUNqRSxXQUFXO1FBQ25CLHdCQUF3QjtJQUMxQixDQUFDO0lBR0Qsa0ZBQWtGO0lBQ2xGLFVBQVUsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO1FBQzNDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELG1HQUFtRztJQUNuRyxRQUFRLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUN6QyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUNTLFVBQVU7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsdUZBQXVGO0lBQzdFLGNBQWM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDZWxsczNkU3RhdHVzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgU3BhdGlhbERhdGFzZXQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IENvbG9ybWFwTm9kZSwgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IEV4cHJlc3Npb25GaWVsZCwgRXhwcmVzc2lvblZvbHVtZUZpZWxkIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGVtcHR5U2VsZWN0aW9uIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBTdXBlcnNlZGUgfSBmcm9tICcuLi8uLi91dGlsL3N1cGVyc2VkZSc7XG5pbXBvcnQgeyBDb250cmFzdFdpbmRvd0NhY2hlIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBTcGF0aWFsSG92ZXIgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLWhvdmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzLCBUcmFuc2NyaXB0RXN0aW1hdGUgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IFJnYiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHR5cGUgeyBTY2VuZUNvbnRleHQgfSBmcm9tICcuL25hcGFyaS1zY2VuZSc7XG5cbi8qKiBXaGF0IHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiBsYXN0IHNhdzogdGhlIGRhdGFzZXQsIHRoZSB2aWV3IHN0YXRlIGFuZCB0aGUgc2VsZWN0aW9uLiAqL1xuZXhwb3J0IHR5cGUgU3BhdGlhbExhdGVzdCA9IFtTcGF0aWFsRGF0YXNldCB8IG51bGwsIFNwYXRpYWxWaWV3U3RhdGUsIFNwYXRpYWxTZWxlY3Rpb25NYXNrXTtcblxuLyoqIFdoZXJlIHRoZSBzcGF0aWFsIHRpbGUgbGF5ZXJzJyBwYW5lbCBvdXRwdXRzIGdvICh0aGUgc2VydmljZSdzIHN1YmplY3RzIGFuZCBiYWRnZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxUaWxlU2lua3Mge1xuICAvKiogVGhlIGNvbnRpbnVvdXMgTFVUIHRoZSB2aWV3IGlzIHVzaW5nIChzbyBjZWxscyBjb2xvdXJlZCBieSBhIGdlbmUgbWF0Y2ggdGhlIG1hcmtlcnMpLiAqL1xuICBjb250aW51b3VzTHV0KHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBSZ2JbXTtcbiAgZXN0aW1hdGVDaGFuZ2VkKGVzdGltYXRlOiBUcmFuc2NyaXB0RXN0aW1hdGUgfCBudWxsKTogdm9pZDtcbiAgZ2VuZUNvdW50c0NoYW5nZWQoY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbCk6IHZvaWQ7XG4gIGRlbnNpdHlDaGFuZ2VkKHN0YXRzOiB7IGxvOiBudW1iZXI7IGhpOiBudW1iZXI7IG1heDogbnVtYmVyIH0pOiB2b2lkO1xuICBsb2FkaW5nQ2hhbmdlZChsYXllcnM6IHN0cmluZ1tdKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIG9ic2VydmF0aW9uIGdlbmUgZmlsdGVyIGNvdWxkIGJlIGFwcGxpZWQ7IHNlZSB7QGxpbmsgU3BhdGlhbFNlc3Npb24ucmVwb3J0R2VuZUZpbHRlcn0uICovXG4gIGdlbmVGaWx0ZXJGYWlsZWQ/KGZhaWxlZDogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBIb3cgdGhlIDNEIHZpZXcncyBpbmRpdmlkdWFsIGNlbGxzIHN0YW5kOyBzZWUge0BsaW5rIFNwYXRpYWxTZXNzaW9uLnJlcG9ydENlbGxzM2R9LiAqL1xuICBjZWxsczNkU3RhdHVzPyhzdGF0dXM6IENlbGxzM2RTdGF0dXMgfCBudWxsKTogdm9pZDtcbn1cblxuLyoqIFRoZSAyRCBzY2VuZSB0aGUgdGlsZSBsYXllcnMgY3VycmVudGx5IGRyYXcgaW50by4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFRpbGVPd25lciB7XG4gIGNhbnZhc1NpemUoKTogW251bWJlciwgbnVtYmVyXTtcbiAgLyoqIE91dGxpbmVzIGFwcGVhcmVkIG9yIGRpc2FwcGVhcmVkOiB0aGUgbWFya2VycycgdmlzaWJpbGl0eSBmb2xsb3dzLiAqL1xuICBwb2x5Z29uc1Nob3duQ2hhbmdlZCgpOiB2b2lkO1xufVxuXG4vKiogQW4gZXN0aW1hdGVkIGZpZWxkIGFuZCB0aGUgaW5wdXRzIGl0IHdhcyBlc3RpbWF0ZWQgZm9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWVsZENhY2hlPFQ+IHtcbiAga2V5OiBzdHJpbmcgfCBudWxsO1xuICBmaWVsZDogVCB8IG51bGw7XG59XG5cbi8qKlxuICogVGhlIHNwYXRpYWwgc3RhdGUgdGhhdCBvdXRsaXZlcyBhIHNjZW5lIChyZXZpZXcgQXBwZW5kaXggQik6IHdoYXQgdGhlIHN1YnNjcmlwdGlvbiBsYXN0IHNhdywgdGhlXG4gKiBtZW1vaXNlZCBwZXJjZW50aWxlIHdpbmRvd3MsIHRoZSBzZWxlY3Rpb24gcmV2aXNpb24gY291bnRlciBhbmQgdGhlIGVzdGltYXRlZCBnZW5lLW1hcCBGSUVMRFMg4oCUXG4gKiB2aWV3ZXItaW5kZXBlbmRlbnQgYW5kIGV4cGVuc2l2ZSwgc28gYSByZS1wbG90IHJlY29sb3VycyB0aGUgY2FjaGVkIGZpZWxkIGluc3RlYWQgb2YgZXN0aW1hdGluZ1xuICogaXQgYWdhaW4uIEV2ZXJ5dGhpbmcgdGhhdCBuYW1lcyBhIGxheWVyIG9mIGEgdmlld2VyIGJlbG9uZ3MgdG8gdGhlIHNjZW5lIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGF0aWFsU2Vzc2lvbiB7XG4gIC8qKiBMYXRlc3QgKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbikgdGhlIHNwYXRpYWwgc3Vic2NyaXB0aW9uIHNhdyDigJQgc28gYSBzbGljZSBjaGFuZ2UgY2FuXG4gICAqICByZWJ1aWxkIHRoZSBtYXJrZXJzIGZvciB0aGUgbmV3IHBsYW5lLCBhbmQgdGhlIHRpbGUgbGF5ZXJzIGFuZCB0aGUgaG92ZXIgY2FuIHJlYWQgaXQuICovXG4gIGxhdGVzdDogU3BhdGlhbExhdGVzdCB8IG51bGwgPSBudWxsO1xuICAvKiogU3BhdGlhbCBjb2xvdXJpbmcncyBwZXJjZW50aWxlIHdpbmRvd3MsIG1lbW9pc2VkIHBlciBjb2xvdXJlZCB2ZWN0b3IgKFNQQVRJQUwtMTIpLiAqL1xuICByZWFkb25seSBjb250cmFzdFdpbmRvd3MgPSBuZXcgQ29udHJhc3RXaW5kb3dDYWNoZSgpO1xuICAvKiogVGhlIDJEIGdlbmUgbWFwJ3MgZmllbGQgKHRoZSBleHBlbnNpdmUgaGFsZjogaXQgc3Vydml2ZXMgYSByZWNvbG91ciBhbmQgYSByZS1wbG90KS4gKi9cbiAgcmVhZG9ubHkgZ2VuZU1hcDogRmllbGRDYWNoZTxFeHByZXNzaW9uRmllbGQ+ID0geyBrZXk6IG51bGwsIGZpZWxkOiBudWxsIH07XG4gIC8qKiBUaGUgM0QgZ2VuZSBtYXAncyBmaWVsZC4gKi9cbiAgcmVhZG9ubHkgZ2VuZU1hcFZvbHVtZTogRmllbGRDYWNoZTxFeHByZXNzaW9uVm9sdW1lRmllbGQ+ID0geyBrZXk6IG51bGwsIGZpZWxkOiBudWxsIH07XG4gIHByaXZhdGUgbGFzdFNlbGVjdGlvblNlZW46IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2aXNpb24gPSAwO1xuICAvKiogTGV2ZWwtb2YtZGV0YWlsIGNlbGwgb3V0bGluZXMsIHRyYW5zY3JpcHRzIGFuZCBkZW5zaXR5IG92ZXIgdGhlIDJEIHZpZXcg4oCUIGNyZWF0ZWQgb24gZmlyc3RcbiAgICogIHVzZSwgb25seSB3aGVuIGEgc3BhdGlhbCBwb3J0IGlzIGJvdW5kLCBhbmQga2VwdCBhY3Jvc3Mgc2NlbmVzIChpdHMgdGlsZSBjYWNoZXMgd2l0aCBpdCkuICovXG4gIHByaXZhdGUgdGlsZUxheWVyczogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0aWxlT3duZXI6IFNwYXRpYWxUaWxlT3duZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBwb3J0OiBTcGF0aWFsRGF0YVBvcnQgfCBudWxsLFxuICAgIHJlYWRvbmx5IHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvblN0b3JlIHwgbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNpbmtzOiBTcGF0aWFsVGlsZVNpbmtzLFxuICApIHt9XG5cbiAgLyoqIFRlbGwgdGhlIHBhbmVsIGhvdyB0aGUgM0QgdmlldydzIGluZGl2aWR1YWwgY2VsbHMgc3RhbmQgKG51bGw6IG5vbmUgZHJhd24pLiAqL1xuICByZXBvcnRDZWxsczNkKHN0YXR1czogQ2VsbHMzZFN0YXR1cyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNpbmtzLmNlbGxzM2RTdGF0dXM/LihzdGF0dXMpO1xuICB9XG5cbiAgLyoqIFRlbGwgdGhlIHBhbmVsIHdoZXRoZXIgdGhlIG9ic2VydmF0aW9uIGdlbmUgZmlsdGVyIGNvdWxkIGJlIGFwcGxpZWQgdGhpcyByZWJ1aWxkLiAqL1xuICByZXBvcnRHZW5lRmlsdGVyKGZhaWxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2lua3MuZ2VuZUZpbHRlckZhaWxlZD8uKGZhaWxlZCk7XG4gIH1cblxuICAvKiogVGhlIHRpbGUgbGF5ZXJzLCBpZiB0aGV5IHdlcmUgZXZlciBidWlsdC4gKi9cbiAgZ2V0IHRpbGVzKCk6IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudGlsZUxheWVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGlsZSBsYXllcnMsIGJ1aWx0IG9uIGZpcnN0IHVzZSAobnVsbCB3aXRob3V0IGEgc3BhdGlhbCBwb3J0KSwgbm93IGRyYXdpbmcgZm9yIGBvd25lcmAuXG4gICAqIFRoZWlyIGhvc3QgY2FsbGJhY2tzIHJlYWQgdGhlIHNlc3Npb24ncyBsaXZlIHN0YXRlIGFuZCB0aGUgb3duZXIncyBjYW52YXMsIHNvIHRoZXkgbmV2ZXIgaG9sZFxuICAgKiBhIHN0YWxlIGRhdGFzZXQgb3IgY29sb3JtYXAuXG4gICAqL1xuICBjbGFpbVRpbGVzKG93bmVyOiBTcGF0aWFsVGlsZU93bmVyKTogTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMgfCBudWxsIHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5wb3J0O1xuICAgIGlmICghcG9ydCkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy50aWxlT3duZXIgPSBvd25lcjtcbiAgICBjb25zdCBzaW5rcyA9IHRoaXMuc2lua3M7XG4gICAgdGhpcy50aWxlTGF5ZXJzID8/PSBuZXcgTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMocG9ydCwge1xuICAgICAgbGF0ZXN0OiAoKSA9PiB0aGlzLmxhdGVzdCxcbiAgICAgIGNhbnZhc1NpemU6ICgpID0+IHRoaXMudGlsZU93bmVyPy5jYW52YXNTaXplKCkgPz8gWzAsIDBdLFxuICAgICAgY29udGludW91c0x1dDogKHZpZXcpID0+IHNpbmtzLmNvbnRpbnVvdXNMdXQodmlldyksXG4gICAgICBlc3RpbWF0ZUNoYW5nZWQ6IChlKSA9PiBzaW5rcy5lc3RpbWF0ZUNoYW5nZWQoZSksXG4gICAgICBnZW5lQ291bnRzQ2hhbmdlZDogKGMpID0+IHNpbmtzLmdlbmVDb3VudHNDaGFuZ2VkKGMpLFxuICAgICAgbG9hZGluZ0NoYW5nZWQ6IChsYXllcnMpID0+IHNpbmtzLmxvYWRpbmdDaGFuZ2VkKGxheWVycyksXG4gICAgICBkZW5zaXR5Q2hhbmdlZDogKGQpID0+IHNpbmtzLmRlbnNpdHlDaGFuZ2VkKGQpLFxuICAgICAgcG9seWdvbnNTaG93bkNoYW5nZWQ6ICgpID0+IHRoaXMudGlsZU93bmVyPy5wb2x5Z29uc1Nob3duQ2hhbmdlZCgpLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnRpbGVMYXllcnM7XG4gIH1cblxuICAvKiogYG93bmVyYCdzIHNjZW5lIGlzIGdvaW5nIGF3YXk6IHRha2UgdGhlIHRpbGUgbGF5ZXJzIG9mZiBpdHMgdmlld2VyLiAqL1xuICByZWxlYXNlVGlsZXMob3duZXI6IFNwYXRpYWxUaWxlT3duZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aWxlT3duZXIgIT09IG93bmVyKSByZXR1cm47XG4gICAgdGhpcy50aWxlT3duZXIgPSBudWxsO1xuICAgIHRoaXMudGlsZUxheWVycz8uZGV0YWNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQSByZXZpc2lvbiBudW1iZXIgZm9yIGEgc2VsZWN0aW9uIG9iamVjdC5cbiAgICpcbiAgICogVGhlIHN0b3JlIGhhbmRzIG91dCBhIE5FVyBtYXNrIG9iamVjdCBwZXIgY2hhbmdlLCBzbyBvYmplY3QgaWRlbnRpdHkgaXMgdGhlXG4gICAqIGNoZWFwIGFuZCBleGFjdCB3YXkgdG8gdGVsbCB0d28gc2VsZWN0aW9ucyBhcGFydCDigJQgYSBmaW5nZXJwcmludCBvdmVyIDMuN01cbiAgICogbWFzayBieXRlcyB3b3VsZCBiZSBuZWl0aGVyLiBDb3VudGluZyByZXZpc2lvbnMga2VlcHMgdGhlIGNhY2hlIGtleSBhIHNob3J0XG4gICAqIHN0cmluZy5cbiAgICovXG4gIHNlbGVjdGlvblJldihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogbnVtYmVyIHtcbiAgICBpZiAoc2VsZWN0aW9uICE9PSB0aGlzLmxhc3RTZWxlY3Rpb25TZWVuKSB7XG4gICAgICB0aGlzLmxhc3RTZWxlY3Rpb25TZWVuID0gc2VsZWN0aW9uO1xuICAgICAgdGhpcy5zZWxlY3Rpb25SZXZpc2lvbisrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25SZXZpc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVyeXRoaW5nIGEgc3BhdGlhbCBzY2VuZSByZWRyYXdzIG9uOiB0aGUgZGF0YXNldCwgdGhlIHZpZXcgc3RhdGUsIHRoZSBzZWxlY3Rpb24g4oCUIGFuZCB0aGVcbiAgICogZGlzcGxheSBjb2xvcm1hcCBhbmQgcmV2ZXJzZSBmbGFnLCB3aGljaCBhcmUgaW5wdXRzIGhlcmUsIG5vdCBqdXN0IHNvbWV0aGluZyByZWFkIGF0IGJ1aWxkXG4gICAqIHRpbWU6IGBjb250aW51b3VzQ29sb3JtYXA6IG51bGxgIG1lYW5zIFwiZm9sbG93IHRoZSBpbWFnZSdzIGNvbG9ybWFwXCIsIGFuZCBhIHNldHRpbmcgdGhhdCBvbmx5XG4gICAqIHRha2VzIGVmZmVjdCBhdCB0aGUgbmV4dCB1bnJlbGF0ZWQgcmVidWlsZCBpcyBub3Qgb25lLiBOdWxsIHdpdGhvdXQgYSBzcGF0aWFsIHBvcnQuXG4gICAqL1xuICBjaGFuZ2VzJChcbiAgICBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICApOiBPYnNlcnZhYmxlPFtTcGF0aWFsRGF0YXNldCB8IG51bGwsIFNwYXRpYWxWaWV3U3RhdGUsIFNwYXRpYWxTZWxlY3Rpb25NYXNrLCB1bmtub3duLCBib29sZWFuXT4gfCBudWxsIHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5wb3J0O1xuICAgIGlmICghcG9ydCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2VsZWN0aW9uJCA9IHRoaXMuc2VsZWN0aW9uPy5nZXRTZWxlY3Rpb24kKCkgPz8gb2YoZW1wdHlTZWxlY3Rpb24oKSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgcG9ydC5nZXREYXRhc2V0JCgpLFxuICAgICAgc3RvcmUuZ2V0U3BhdGlhbFZpZXckKCksXG4gICAgICBzZWxlY3Rpb24kLFxuICAgICAgc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgIF0pO1xuICB9XG59XG5cbi8qKlxuICogV2hhdCB0aGUgMkQgYW5kIDNEIHNwYXRpYWwgc2NlbmVzIHNoYXJlOiB0aGUgc3Vic2NyaXB0aW9uIHRoYXQgcmVkcmF3cyB0aGVtLCB0aGUgaG92ZXIgb3ZlclxuICogdGhlbSwgYW5kIHRoZSBsYXRlc3Qtd2lucyBzZXF1ZW5jaW5nIG9mIHRoZWlyIChhc3luYykgcmVidWlsZHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTcGF0aWFsU2NlbmVCYXNlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdmVyOiBTcGF0aWFsSG92ZXI7XG4gIC8qKiBMYXRlc3Qgd2lucyB3aXRoaW4gdGhlIHNjZW5lOiBhIGNvbG91ciBmZXRjaCBpcyBhIHJvdW5kLXRyaXAsIHNvIGEgZmFzdCBzZXF1ZW5jZSBvZlxuICAgKiAgY29sb3VyLWJ5IGNoYW5nZXMgY2FuIHJlc29sdmUgb3V0IG9mIG9yZGVyLCBhbmQgb25seSB0aGUgbmV3ZXN0IG1heSB0b3VjaCB0aGUgbGF5ZXJzLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVidWlsZHMgPSBuZXcgU3VwZXJzZWRlKCk7XG4gIHByaXZhdGUgc3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN0eDogU2NlbmVDb250ZXh0LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBzZXNzaW9uOiBTcGF0aWFsU2Vzc2lvbixcbiAgICBpczNkOiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLmhvdmVyID0gbmV3IFNwYXRpYWxIb3Zlcih7XG4gICAgICBpczNkLFxuICAgICAgdmlld2VyOiBjdHgudmlld2VyLFxuICAgICAgcG9ydDogc2Vzc2lvbi5wb3J0LFxuICAgICAgc2VsZWN0aW9uOiBzZXNzaW9uLnNlbGVjdGlvbixcbiAgICAgIGRhdGFzZXQ6ICgpID0+IHNlc3Npb24ubGF0ZXN0Py5bMF0gPz8gbnVsbCxcbiAgICAgIHBpY2s6IChjbGllbnRYLCBjbGllbnRZLCBzbGFja1B4KSA9PiB0aGlzLnBpY2tPYnNlcnZhdGlvbihjbGllbnRYLCBjbGllbnRZLCBzbGFja1B4KSxcbiAgICAgIHBpY2tDZWxsOiAoY2xpZW50WCwgY2xpZW50WSkgPT4gdGhpcy5waWNrQ2VsbChjbGllbnRYLCBjbGllbnRZKSxcbiAgICAgIHBpY2tSZWdpb246IChjbGllbnRYLCBjbGllbnRZKSA9PiB0aGlzLnBpY2tSZWdpb24oY2xpZW50WCwgY2xpZW50WSksXG4gICAgICB0aWxlczogKCkgPT4gdGhpcy5ob3ZlclRpbGVzKCksXG4gICAgICB0b29sQWN0aXZlOiAoKSA9PiAhIWN0eC50b29scy5yZWdpb25PdmVybGF5Py50b29sQWN0aXZlLFxuICAgICAgb3V0c2lkZVpvbmU6IChmbikgPT4gY3R4Lm91dHNpZGVab25lKGZuKSxcbiAgICAgIGluWm9uZTogKGZuKSA9PiBjdHguaW5ab25lKGZuKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIG9uIGV2ZXJ5IGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbiBvciBjb2xvcm1hcCBjaGFuZ2UuICovXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVTcGF0aWFsKCk6IHZvaWQge1xuICAgIHRoaXMuc3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3ViID1cbiAgICAgIHRoaXMuc2Vzc2lvbi5jaGFuZ2VzJCh0aGlzLmN0eC5zdG9yZSk/LnN1YnNjcmliZSgoW2RhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbiwgY29sb3JtYXAsIHJldmVyc2VdKSA9PiB7XG4gICAgICAgIHRoaXMuY3R4LmRpc3BsYXkucmVjb3JkKChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGwsICEhcmV2ZXJzZSk7XG4gICAgICAgIC8vIEtlcHQgc28gYSBzbGljZSBjaGFuZ2UgY2FuIHJlZHJhdyB0aGUgbWFya2VycyBmb3IgdGhlIG5ldyBwbGFuZSwgd2hpY2hcbiAgICAgICAgLy8gYXJyaXZlcyB0aHJvdWdoIHNldFpJbmRleCByYXRoZXIgdGhhbiB0aHJvdWdoIGFueSBvZiB0aGVzZSBzdHJlYW1zLlxuICAgICAgICB0aGlzLnNlc3Npb24ubGF0ZXN0ID0gW2RhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbl07XG4gICAgICAgIC8vIFdoYXQgdGhlIG1hcmtlcnMgYXJlIG1heSBoYXZlIGNoYW5nZWQ7IHdoZXJlIHRoZXkgYXJlIGlzIHRoZSBsYXllcnMnIG93biBwaWNrJ3NcbiAgICAgICAgLy8gYnVzaW5lc3MgKGl0IGZvbGxvd3MgdGhlaXIgZGF0YSBhbmQgdGhlIGNhbWVyYSkuXG4gICAgICAgIHZvaWQgdGhpcy5ob3Zlci5yZXNvbHZlU291cmNlKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgICB2b2lkIHRoaXMucmVidWlsZChkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLmFmdGVyQ2hhbmdlKCk7XG4gICAgICB9KSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgc2NlbmUncyBsYXllcnMgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVidWlsZChcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb24/OiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1biBhZnRlciBlYWNoIHJlYnVpbGQgaXMgc3RhcnRlZCAodGhlIDJEIHRpbGUgbGF5ZXJzIHJlZnJlc2ggaGVyZSkuICovXG4gIHByb3RlY3RlZCBhZnRlckNoYW5nZSgpOiB2b2lkIHtcbiAgICAvKiBub3RoaW5nIGJ5IGRlZmF1bHQgKi9cbiAgfVxuICAvKiogVGhlIG9ic2VydmF0aW9uIGRyYXduIHVuZGVyIGEgY2xpZW50IHBvc2l0aW9uLCBvciAtMSAoc2VlIGBTcGF0aWFsSG92ZXJIb3N0LnBpY2tgKS4gKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBpY2tPYnNlcnZhdGlvbihjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlciwgc2xhY2tQeDogbnVtYmVyKTogbnVtYmVyO1xuICAvKiogVGhlIHJlZ2lvbiBzdXJmYWNlIChhIGNsYXNzKSB1bmRlciBhIGNsaWVudCBwb3NpdGlvbiwgb3IgbnVsbCAobm9uZSBkcmF3bikuICovXG4gIHBpY2tSZWdpb24oX2NsaWVudFg6IG51bWJlciwgX2NsaWVudFk6IG51bWJlcik6IHsga2V5OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH0gfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKiogVGhlIG9ic2VydmF0aW9uIG9mIGFuIGluZGl2aWR1YWwgY2VsbCdzIHN1cmZhY2UgdW5kZXIgYSBjbGllbnQgcG9zaXRpb24sIG9yIC0xIChub25lIGRyYXduKS4gKi9cbiAgcGlja0NlbGwoX2NsaWVudFg6IG51bWJlciwgX2NsaWVudFk6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHByb3RlY3RlZCBob3ZlclRpbGVzKCk6IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogU3RvcCBmb2xsb3dpbmcgdGhlIGRhdGEsIGRyb3AgdGhlIGhvdmVyLCBhbmQgbWFrZSBldmVyeSByZWJ1aWxkIGluIGZsaWdodCBzdGFsZS4gKi9cbiAgcHJvdGVjdGVkIGRpc3Bvc2VTcGF0aWFsKCk6IHZvaWQge1xuICAgIHRoaXMuc3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3ViID0gbnVsbDtcbiAgICB0aGlzLnJlYnVpbGRzLmNhbmNlbCgpO1xuICAgIHRoaXMuaG92ZXIuZGlzcG9zZSgpO1xuICB9XG59XG4iXX0=