@jax-data-science/sci-image-visualizer 0.15.0 → 0.17.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 (47) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +2 -1
  2. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  3. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  4. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +10 -8
  5. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +226 -39
  6. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +269 -0
  7. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  8. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +6 -7
  9. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -1
  10. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +33 -8
  11. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +6 -2
  12. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +10 -6
  13. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +9 -5
  14. package/esm2022/lib/spatial/spatial-controls.facade.mjs +7 -4
  15. package/esm2022/lib/spatial/spatial-encoding.mjs +18 -1
  16. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  17. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +7 -3
  18. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  19. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +67 -19
  20. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +61 -8
  21. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +3 -3
  22. package/esm2022/lib/toolbar/toolbar.component.mjs +13 -4
  23. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +7 -7
  24. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs} +795 -165
  25. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +1 -0
  26. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs} +2 -2
  27. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map} +1 -1
  28. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  29. package/lib/contracts/display-types.d.ts +9 -2
  30. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  31. package/lib/implementations/napari-js/napari-scene.d.ts +2 -0
  32. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +3 -3
  33. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +82 -9
  34. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +62 -0
  35. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  36. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +5 -6
  37. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +16 -3
  38. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +1 -1
  39. package/lib/spatial/spatial-encoding.d.ts +10 -0
  40. package/lib/spatial-controls/spatial-controls.component.d.ts +2 -0
  41. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  42. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +25 -0
  43. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +14 -3
  44. package/lib/toolbar/toolbar.component.d.ts +6 -0
  45. package/lib/toolbar/view-controls/view-controls.component.d.ts +3 -3
  46. package/package.json +2 -2
  47. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { firstValueFrom, of } from 'rxjs';
2
2
  import { isSpatialOmics3d } from '../contracts/plot-type';
3
3
  import { isCategoricalColumn, } from '../contracts/spatial-dataset.contract';
4
- import { resolveCategoryColors } from './spatial-encoding';
4
+ import { categoryColorsFor } from './spatial-encoding';
5
5
  import { sectionsOf } from './spatial-sections';
6
6
  import { observationsInSlice, volumeImageRef } from './spatial-volume-image';
7
7
  import { emptySelection, selectByCategory, selectByIndices, selectInClassVolumes, selectInRegions, selectInRegionsProjected, } from './spatial-selection';
@@ -42,6 +42,9 @@ export class SpatialControlsFacade {
42
42
  // The gene filter names the old dataset's genes: kept, it could hide every observation.
43
43
  if (current.observationGenes?.length)
44
44
  ctx.store.setSpatialView({ observationGenes: [] });
45
+ // Group colours are chosen for this dataset's groupings; another's same-named column is not them.
46
+ if (Object.keys(current.groupColors ?? {}).length)
47
+ ctx.store.setSpatialView({ groupColors: {} });
45
48
  });
46
49
  this.controls = this.build();
47
50
  }
@@ -124,7 +127,7 @@ export class SpatialControlsFacade {
124
127
  }
125
128
  // Resolved by the SAME function the renderer uses, so a legend swatch
126
129
  // can never disagree with the colour on screen.
127
- return resolveCategoryColors(column.meta);
130
+ return categoryColorsFor(name, column.meta, this.ctx.store.currentSpatialView().groupColors);
128
131
  },
129
132
  continuousValues: async (source) => {
130
133
  if (source.kind === 'feature')
@@ -143,7 +146,7 @@ export class SpatialControlsFacade {
143
146
  return {
144
147
  name,
145
148
  categories: column.meta.categories,
146
- colors: resolveCategoryColors(column.meta),
149
+ colors: categoryColorsFor(name, column.meta, this.ctx.store.currentSpatialView().groupColors),
147
150
  codes: column.codes,
148
151
  };
149
152
  },
@@ -252,4 +255,4 @@ function canColorBy(dataset, by) {
252
255
  const names = dataset.features?.names;
253
256
  return !!dataset.features && (!names || names.includes(by.name));
254
257
  }
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jb250cm9scy5mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBYyxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBWSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3BFLE9BQU8sRUFJTCxtQkFBbUIsR0FDcEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUsvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdFLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLHdCQUF3QixHQUN6QixNQUFNLHFCQUFxQixDQUFDO0FBNkI3Qjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBVWhDLFlBQ21CLElBQXFCLEVBQ3JCLEdBQTJCO1FBRDNCLFNBQUksR0FBSixJQUFJLENBQWlCO1FBQ3JCLFFBQUcsR0FBSCxHQUFHLENBQXdCO1FBVDlDO29GQUM0RTtRQUNwRSxZQUFPLEdBQTBCLElBQUksQ0FBQztRQUU5Qyx1RkFBdUY7UUFDL0UsZUFBVSxHQUFHLENBQUMsQ0FBQztRQU1yQixpRkFBaUY7UUFDakYsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxFQUFFLEtBQUssSUFB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QUM7SUFDakYsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFDdEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFBsb3RUeXBlLCBpc1NwYXRpYWxPbWljczNkIH0gZnJvbSAnLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQgeyBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgU3BhdGlhbENvbG9yQnkgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgSVNwYXRpYWxDb250cm9scywgUm9pU2VsZWN0aW9uTW9kZSB9IGZyb20gJy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzIH0gZnJvbSAnLi9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IHNlY3Rpb25zT2YgfSBmcm9tICcuL3NwYXRpYWwtc2VjdGlvbnMnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TbGljZSwgdm9sdW1lSW1hZ2VSZWYgfSBmcm9tICcuL3NwYXRpYWwtdm9sdW1lLWltYWdlJztcbmltcG9ydCB7XG4gIGVtcHR5U2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxuICBzZWxlY3RCeUluZGljZXMsXG4gIHNlbGVjdEluQ2xhc3NWb2x1bWVzLFxuICBzZWxlY3RJblJlZ2lvbnMsXG4gIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZCxcbn0gZnJvbSAnLi9zcGF0aWFsLXNlbGVjdGlvbic7XG5cbi8qKiBUaGUgcmVuZGVyZXItc2lkZSBzcGF0aWFsIHJlYWRvdXRzIHRoZSBjb250cm9scyBzdXJmYWNlICh0aGUgbmFwYXJpLWpzIGJhY2tlbmQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsUmVuZGVyZXJGZWVkcyB7XG4gIHJlYWRvbmx5IHRyYW5zY3JpcHRFc3RpbWF0ZSQ6IHsgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8eyBwb2ludHM6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsPiB9O1xuICByZWFkb25seSBkZW5zaXR5U3RhdHMkOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIHJlYWRvbmx5IGdlbmVGaWx0ZXJGYWlsZWQkPzogeyBhc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB9O1xuICAvKiogT2JzZXJ2YXRpb25zIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZSAzRCBjYW1lcmEsIG9yIG51bGwgd2hlbiB0aGUgY2xvdWQgaXMgbm90IG1vdW50ZWQuICovXG4gIGdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGw7XG4gIC8qKiBUaGUgaWRzIG9mIHRoZSByZWdpb25zIGRyYXduIG92ZXIgdGhlIDNEIGNsb3VkIGluIHNjcmVlbiBzcGFjZSAoaXRzIGxhc3NvcykuICovXG4gIGdldFNwYXRpYWxMYXNzb0lkcygpOiBudW1iZXJbXTtcbiAgLyoqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgdm9sdW1lIHRoZSByZWdpb24gc3VyZmFjZXMgc2l0IGluOyBudWxsIHdoZW4gdGhlIHBsb3R0ZWQgaW1hZ2UgaXNcbiAgICogIG5vdCBhIHZvbHVtZSdzIHN0YWNrICh0aGUgcmVnaW9ucyBhcmUgdGhlbiBub3QgaW4gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBncmlkKS4gKi9cbiAgcmVnaW9uVm94ZWxTdGVwKCk6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKiBXaGF0IHRoZSBmYWNhZGUgd29ya3Mgb3ZlcjogdGhlIHNoYXJlZCBzdG9yZXMsIHRoZSByZW5kZXJlciBmZWVkcyBhbmQgdGhlIHJvdXRlcidzIHZpZXcgc3RhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxDb250cm9sc0NvbnRleHQge1xuICByZWFkb25seSBzdG9yZTogVmlzdWFsaXplclN0b3JlO1xuICByZWFkb25seSByZWdpb25TdG9yZTogUmVnaW9uU3RvcmU7XG4gIHJlYWRvbmx5IHNlbGVjdGlvblN0b3JlOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmU7XG4gIHJlYWRvbmx5IG5hcGFyaTogU3BhdGlhbFJlbmRlcmVyRmVlZHM7XG4gIC8qKiBUaGUgcGxvdCB0eXBlIG9uIHNjcmVlbiAodGhlIDNEIGNsb3VkIHNlbGVjdHMgaW4gc2NyZWVuIHNwYWNlKS4gKi9cbiAgcGxvdFR5cGUoKTogUGxvdFR5cGU7XG4gIC8qKiBUaGUgZGlzcGxheWVkIHNsaWNlIChhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCBzZWxlY3RzIHdpdGhpbiBvbmUgc2VjdGlvbikuICovXG4gIHpJbmRleCgpOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHNwYXRpYWwtb21pY3MgY29udHJvbHMgKGBJU3BhdGlhbENvbnRyb2xzYCkgb3ZlciBhIGhvc3QncyBgU1BBVElBTF9EQVRBX1BPUlRgLlxuICpcbiAqIEJhY2tlbmQtbmV1dHJhbDogdGhlIHZpZXcgc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBgVmlzdWFsaXplclN0b3JlYCAobGlrZSB0aGVcbiAqIGNvbG9ybWFwKSBhbmQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgYFNwYXRpYWxTZWxlY3Rpb25TdG9yZWAsIHNvIHRoZSBjb250cm9scyBrZWVwXG4gKiB3b3JraW5nIGFjcm9zcyBhIHBsb3QtdHlwZSBzd2l0Y2ggYW5kIGEgaG9zdCBjYW4gZHJpdmUgdGhlbSBiZWZvcmUgYW55IGJhY2tlbmQgaGFzXG4gKiBtb3VudGVkLiBPd25zIGl0cyBtaXJyb3Igb2YgdGhlIHBvcnQncyBkYXRhc2V0IOKAlCBkcm9wcGluZyBhIHN0YWxlIHNlbGVjdGlvbiBhbmQgYW5cbiAqIHVuc2F0aXNmaWFibGUgY29sb3VyIHNvdXJjZSB3aGVuIHRoZSBkYXRhc2V0IGNoYW5nZXMg4oCUIGFuZCB0aGUgc3Vic2NyaXB0aW9uIGJlaGluZFxuICogaXQsIHJlbGVhc2VkIGJ5IHtAbGluayBkaXNwb3NlfSAocmV2aWV3IENPUkUtMzApLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbENvbnRyb2xzRmFjYWRlIHtcbiAgLyoqIFRoZSBjb250cm9sczsgb25lIG9iamVjdCBmb3IgdGhlIGZhY2FkZSdzIGxpZmUsIHNvIGNvbnN1bWVycyBjYW4gaG9sZCBpdC4gKi9cbiAgcmVhZG9ubHkgY29udHJvbHM6IElTcGF0aWFsQ29udHJvbHM7XG4gIC8qKiBMYXRlc3QgZGF0YXNldCwgbWlycm9yZWQgc28gYHNlbGVjdEZyb21SZWdpb25zKClgIGFuc3dlcnMgZnJvbSB0aGUgZGF0YXNldCBvblxuICAgKiAgc2NyZWVuIOKAlCBpdCBydW5zIGZyb20gYSBidXR0b24gY2xpY2sgYW5kIG11c3Qgbm90IGF3YWl0IGEgcm91bmQtdHJpcC4gKi9cbiAgcHJpdmF0ZSBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YjogU3Vic2NyaXB0aW9uO1xuICAvKiogQnVtcGVkIHBlciBjbGFzcy12b2x1bWUgc2VsZWN0aW9uIChhbmQgb24gZGlzcG9zZSk6IG9ubHkgdGhlIGxhdGVzdCBtYXkgcHVibGlzaC4gKi9cbiAgcHJpdmF0ZSByb2lSZXF1ZXN0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnQ6IFNwYXRpYWxEYXRhUG9ydCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN0eDogU3BhdGlhbENvbnRyb2xzQ29udGV4dCxcbiAgKSB7XG4gICAgLy8gTWlycm9yIHRoZSBkYXRhc2V0IChhbmQgZHJvcCBhIHN0YWxlIHNlbGVjdGlvbiB3aGVuIGl0IGNoYW5nZXMg4oCUIHRoZSBtYXNrcyBhcmVcbiAgICAvLyBpbmRleC1iYXNlZCwgc28gdGhleSBhcmUgbWVhbmluZ2xlc3MgYWdhaW5zdCBkaWZmZXJlbnQgb2JzZXJ2YXRpb25zKS5cbiAgICB0aGlzLnN1YiA9IHBvcnQuZ2V0RGF0YXNldCQoKS5zdWJzY3JpYmUoKGRhdGFzZXQpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWQgPSBkYXRhc2V0Py5pZCAhPT0gdGhpcy5kYXRhc2V0Py5pZDtcbiAgICAgIHRoaXMuZGF0YXNldCA9IGRhdGFzZXQ7XG4gICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAgIGN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoZW1wdHlTZWxlY3Rpb24oZGF0YXNldD8ub2JzZXJ2YXRpb25zLmNvdW50ID8/IDApKTtcbiAgICAgIC8vIEEgY29sb3VyIHNvdXJjZSB0aGUgbmV3IGRhdGFzZXQgY2Fubm90IHNhdGlzZnkgd291bGQgbGVhdmUgdGhlIG1hcCBmbGF0IHdoaWxlXG4gICAgICAvLyB0aGUgcGFuZWwgYW5kIHRoZSBjaGFydHMga2VwdCBuYW1pbmcgdGhlIG9sZCBjb2x1bW4g4oCUIHNvIGRyb3AgaXQsIGFuZCBvbmx5IGl0OlxuICAgICAgLy8gcG9pbnQgc2l6ZSwgb3BhY2l0eSBhbmQgdGhlIHJlc3QgYXJlIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMuXG4gICAgICBjb25zdCBjdXJyZW50ID0gY3R4LnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpO1xuICAgICAgY29uc3QgYnkgPSBjdXJyZW50LmNvbG9yQnk7XG4gICAgICBpZiAoYnkgJiYgIWNhbkNvbG9yQnkoZGF0YXNldCwgYnkpKSBjdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pO1xuICAgICAgLy8gVGhlIGdlbmUgZmlsdGVyIG5hbWVzIHRoZSBvbGQgZGF0YXNldCdzIGdlbmVzOiBrZXB0LCBpdCBjb3VsZCBoaWRlIGV2ZXJ5IG9ic2VydmF0aW9uLlxuICAgICAgaWYgKGN1cnJlbnQub2JzZXJ2YXRpb25HZW5lcz8ubGVuZ3RoKSBjdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBvYnNlcnZhdGlvbkdlbmVzOiBbXSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5idWlsZCgpO1xuICB9XG5cbiAgLyoqIFJlbGVhc2UgdGhlIHBvcnQgc3Vic2NyaXB0aW9uICh0aGUgcm91dGVyJ3MgaW5qZWN0b3IgaXMgYmVpbmcgZGVzdHJveWVkKS4gKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1Yi51bnN1YnNjcmliZSgpO1xuICAgIC8vIEEgY2xhc3Mtdm9sdW1lIHNlbGVjdGlvbiBzdGlsbCByZWFkaW5nIGl0cyBvdXRsaW5lcyBwdWJsaXNoZXMgbm90aGluZy5cbiAgICB0aGlzLnJvaVJlcXVlc3QrKztcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgXCJTZWxlY3QgZnJvbSBST0lzXCIgc2VsZWN0cyBub3cg4oCUIHRoZSBvbmUgcnVsZSBpdHMgZXhlY3V0b3IgYW5kIHRoZSBwYW5lbCdzIGRlc2NyaXB0aW9uXG4gICAqIHNoYXJlOiBpbnNpZGUgdGhlIHBpY2tlZCBjbGFzc2VzJyB2b2x1bWVzIGluIHRoZSAzRCBjbG91ZCwgd2hlbiB0aGUgZGF0YXNldCBoYXMgYSByZWZlcmVuY2VcbiAgICogdm9sdW1lIChhbmQgbm8gdGlzc3VlIGltYWdlKSBhbmQgdGhlIHBsb3R0ZWQgaW1hZ2UgaXMgdGhhdCB2b2x1bWUncyBzdGFjaywgc28gdGhlIHJlZ2lvbnMgc2l0XG4gICAqIGluIGl0cyBncmlkOyBieSB0aGUgZHJhd24gcmVnaW9ucyBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIHJvaVNlbGVjdGlvbk1vZGUoKTogUm9pU2VsZWN0aW9uTW9kZSB7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZGF0YXNldDtcbiAgICBjb25zdCBlbGlnaWJsZSA9XG4gICAgICAhIWRhdGFzZXQ/LnZvbHVtZSAmJlxuICAgICAgIWRhdGFzZXQuaW1hZ2VSZWYgJiZcbiAgICAgIGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdHgucGxvdFR5cGUoKSkgJiZcbiAgICAgIHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMoKS5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLmN0eC5uYXBhcmkucmVnaW9uVm94ZWxTdGVwKCkgIT09IG51bGw7XG4gICAgcmV0dXJuIGVsaWdpYmxlID8gJ2NsYXNzLXZvbHVtZXMnIDogJ3JlZ2lvbnMnO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZCgpOiBJU3BhdGlhbENvbnRyb2xzIHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5wb3J0O1xuICAgIHJldHVybiB7XG4gICAgICBnZXREYXRhc2V0JDogKCkgPT4gcG9ydC5nZXREYXRhc2V0JCgpLFxuICAgICAgZ2V0Vmlld1N0YXRlJDogKCkgPT4gdGhpcy5jdHguc3RvcmUuZ2V0U3BhdGlhbFZpZXckKCksXG4gICAgICB2aWV3U3RhdGU6ICgpID0+IHRoaXMuY3R4LnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpLFxuICAgICAgc2V0Vmlld1N0YXRlOiAocGFydGlhbCkgPT4gdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcocGFydGlhbCksXG4gICAgICAvLyBUaGUgaGludCBTRUVEUyB0aGUgdG9nZ2xlIHdoZW4gdGhlIHNvdXJjZSBjaGFuZ2VzLCBhbmQgbm90aGluZyBjb25zdWx0cyBpdFxuICAgICAgLy8gYWZ0ZXJ3YXJkcy4gSXQgdXNlZCB0byBiZSBPUmVkIGluIGF0IHJlbmRlciB0aW1lLCB3aGljaCBtZWFudCBhbiB1bmNoZWNrZWRcbiAgICAgIC8vIGJveCBjb3VsZCBub3QgdHVybiBsb2cgc2NhbGluZyBvZmYgZm9yIGEgaGludGVkIGNvbHVtbiDigJQgYW5kIHRoZSBsaW5rZWRcbiAgICAgIC8vIGNoYXJ0LCB3aGljaCByZWFkcyBgbG9nU2NhbGVgIGFsb25lLCBkaXNhZ3JlZWQgd2l0aCB0aGUgbWFwIGFib3V0IHdoYXQgaXRcbiAgICAgIC8vIHdhcyBzaG93aW5nLiBPbmUgYXV0aG9yaXR5LCBzZXQgb25jZSBwZXIgc291cmNlLlxuICAgICAgY29sb3JCeUNvbHVtbjogKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIGNvbnN0IGhpbnQgPSBtZXRhPy5raW5kID09PSAnY29udGludW91cycgPyAhIW1ldGEubG9nU2NhbGVIaW50IDogZmFsc2U7XG4gICAgICAgIHRoaXMuY3R4LnN0b3JlLnNldFNwYXRpYWxWaWV3KHsgY29sb3JCeTogeyBraW5kOiAnY29sdW1uJywgbmFtZSB9LCBsb2dTY2FsZTogaGludCB9KTtcbiAgICAgIH0sXG4gICAgICBjb2xvckJ5RmVhdHVyZTogKG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoe1xuICAgICAgICAgIGNvbG9yQnk6IHsga2luZDogJ2ZlYXR1cmUnLCBuYW1lIH0sXG4gICAgICAgICAgbG9nU2NhbGU6ICEhdGhpcy5kYXRhc2V0Py5mZWF0dXJlcz8ubG9nU2NhbGVIaW50LFxuICAgICAgICB9KSxcbiAgICAgIGNsZWFyQ29sb3JCeTogKCkgPT4gdGhpcy5jdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pLFxuICAgICAgc2VhcmNoRmVhdHVyZXM6IGFzeW5jIChxdWVyeTogc3RyaW5nLCBsaW1pdCA9IDUwKSA9PiB7XG4gICAgICAgIC8vIFByZWZlciB0aGUgcG9ydCdzIHNlYXJjaCAoYSAzMWstZ2VuZSBkYXRhc2V0IGRvZXMgbm90IHNoaXAgaXRzIG5hbWVzKTtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZpbHRlciB3aGF0ZXZlciB0aGUgbWFuaWZlc3QgaW5saW5lZC5cbiAgICAgICAgaWYgKHBvcnQuc2VhcmNoRmVhdHVyZXMpIHJldHVybiBwb3J0LnNlYXJjaEZlYXR1cmVzKHF1ZXJ5LCBsaW1pdCk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShwb3J0LmdldERhdGFzZXQkKCkpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGRhdGFzZXQ/LmZlYXR1cmVzPy5uYW1lcyA/PyBbXTtcbiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBuYW1lcy5maWx0ZXIoKG4pID0+IG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgfSxcbiAgICAgIC4uLihwb3J0LmltcG9ydEdyb3Vwc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIGltcG9ydEdyb3VwczogKGxhYmVsOiBzdHJpbmcsIHRhYmxlOiBzdHJpbmcpID0+IHBvcnQuaW1wb3J0R3JvdXBzIShsYWJlbCwgdGFibGUpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4ocG9ydC5nZXRUcmFuc2NyaXB0Q291bnRzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHJhbnNjcmlwdENvdW50czogKGdlbmVzOiBzdHJpbmdbXSkgPT4gcG9ydC5nZXRUcmFuc2NyaXB0Q291bnRzIShnZW5lcyksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihwb3J0LmdldE1hcmtlckdlbmVzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbWFya2VyR2VuZXM6IChjb2x1bW46IHN0cmluZywgcGVyR3JvdXA/OiBudW1iZXIpID0+IHBvcnQuZ2V0TWFya2VyR2VuZXMhKGNvbHVtbiwgcGVyR3JvdXApLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBnZXRUcmFuc2NyaXB0RXN0aW1hdGUkOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkudHJhbnNjcmlwdEVzdGltYXRlJC5hc09ic2VydmFibGUoKSxcbiAgICAgIGdldEdlbmVDb3VudHNJblZpZXckOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkuZ2VuZUNvdW50c0luVmlldyQuYXNPYnNlcnZhYmxlKCksXG4gICAgICBnZXREZW5zaXR5U3RhdHMkOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkuZGVuc2l0eVN0YXRzJC5hc09ic2VydmFibGUoKSxcbiAgICAgIGdldEdlbmVGaWx0ZXJGYWlsZWQkOiAoKSA9PiB0aGlzLmN0eC5uYXBhcmkuZ2VuZUZpbHRlckZhaWxlZCQ/LmFzT2JzZXJ2YWJsZSgpID8/IG9mKGZhbHNlKSxcbiAgICAgIGNhdGVnb3J5Q29sb3JzOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKG5hbWUpO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7bmFtZX1cIiBpcyBjb250aW51b3VzIOKAlCBpdCBoYXMgbm8gY2F0ZWdvcmllc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc29sdmVkIGJ5IHRoZSBTQU1FIGZ1bmN0aW9uIHRoZSByZW5kZXJlciB1c2VzLCBzbyBhIGxlZ2VuZCBzd2F0Y2hcbiAgICAgICAgLy8gY2FuIG5ldmVyIGRpc2FncmVlIHdpdGggdGhlIGNvbG91ciBvbiBzY3JlZW4uXG4gICAgICAgIHJldHVybiByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29sdW1uLm1ldGEpO1xuICAgICAgfSxcblxuICAgICAgY29udGludW91c1ZhbHVlczogYXN5bmMgKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlLmtpbmQgPT09ICdmZWF0dXJlJykgcmV0dXJuIHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihzb3VyY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKHNvdXJjZS5uYW1lKTtcbiAgICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7c291cmNlLm5hbWV9XCIgaXMgY2F0ZWdvcmljYWwg4oCUIGl0IGhhcyBubyB2YWx1ZXMgdG8gY2hhcnRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1uLnZhbHVlcztcbiAgICAgIH0sXG5cbiAgICAgIGNhdGVnb3JpY2FsVmlldzogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihuYW1lKTtcbiAgICAgICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSBjb2x1bW4gXCIke25hbWV9XCIgaXMgY29udGludW91cyDigJQgaXQgaGFzIG5vIGNhdGVnb3JpZXNgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgY2F0ZWdvcmllczogY29sdW1uLm1ldGEuY2F0ZWdvcmllcyxcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFNwcmVhZCByYXRoZXIgdGhhbiBhbHdheXMgZGVmaW5lZDogYGdldEVtYmVkZGluZ2AgaXMgb3B0aW9uYWwgb24gYm90aCB0aGUgcG9ydFxuICAgICAgLy8gYW5kIHRoaXMgZmFjYWRlLCBhbmQgYSBwYW5lbCBjaGVja3MgZm9yIGl0cyBwcmVzZW5jZSB0byBkZWNpZGUgd2hldGhlciB0aGUgdmlld1xuICAgICAgLy8gaXMgb2ZmZXJlZCBhdCBhbGwuIERlZmluaW5nIGl0IGFzIGEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHdvdWxkIG1ha2UgYW5cbiAgICAgIC8vIGVtYmVkZGluZy1sZXNzIHNvdXJjZSBsb29rIGxpa2UgYSBicm9rZW4gb25lLlxuICAgICAgLi4uKHBvcnQuZ2V0RW1iZWRkaW5nID8geyBnZXRFbWJlZGRpbmc6IChuYW1lOiBzdHJpbmcpID0+IHBvcnQuZ2V0RW1iZWRkaW5nIShuYW1lKSB9IDoge30pLFxuXG4gICAgICBjYXRlZ29yaWNhbENvbHVtbnM6ICgpID0+XG4gICAgICAgICh0aGlzLmRhdGFzZXQ/LmNvbHVtbnMgPz8gW10pLmZpbHRlcigoYykgPT4gYy5raW5kID09PSAnY2F0ZWdvcmljYWwnKS5tYXAoKGMpID0+IGMubmFtZSksXG5cbiAgICAgIC8vIE1lbW9pemVkIG9uIHRoZSBvYnNlcnZhdGlvbnMgb2JqZWN0LCBzbyB0aGUgcmVuZGVyZXIncyBvd24gbG9va3VwIGFuZFxuICAgICAgLy8gdGhpcyBvbmUgYXJlIHRoZSBzYW1lIHNpbmdsZSBzY2FuIG9mIHVwIHRvIDMuN00geiB2YWx1ZXMuXG4gICAgICBzYW1wbGVkU2VjdGlvbnM6ICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzID0gdGhpcy5kYXRhc2V0Py5vYnNlcnZhdGlvbnM7XG4gICAgICAgIHJldHVybiBvYnMgPyBzZWN0aW9uc09mKG9icykgOiBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0aW9uJDogKCkgPT4gdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuZ2V0U2VsZWN0aW9uJCgpLFxuXG4gICAgICBzZWxlY3RGcm9tUmVnaW9uczogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5kYXRhc2V0O1xuICAgICAgICBpZiAoIWRhdGFzZXQpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBpczNkID0gaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN0eC5wbG90VHlwZSgpKTtcbiAgICAgICAgY29uc3Qgdm9sdW1lID0gIWRhdGFzZXQuaW1hZ2VSZWYgPyBkYXRhc2V0LnZvbHVtZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gSW4gdGhlIDNEIGNsb3VkLCByZWdpb24gY2xhc3NlcyBwaWNrZWQgaW4gdGhlIFJlZ2lvbiBFZGl0b3IgKGEgY2xhc3NcbiAgICAgICAgLy8gdHJlZSBub2RlIHdpdGggaXRzIHN1YmNsYXNzZXMsIGEgc3VyZmFjZSBjbGlja2VkIGluIDNEKSBzZWxlY3QgdGhlXG4gICAgICAgIC8vIGNlbGxzIGluc2lkZSB0aGVpciB2b2x1bWVzIOKAlCB0aGUgc3RydWN0dXJlcyBzaG93biBhbW9uZyB0aGUgY2VsbHMuXG4gICAgICAgIGlmICh2b2x1bWUgJiYgdGhpcy5yb2lTZWxlY3Rpb25Nb2RlKCkgPT09ICdjbGFzcy12b2x1bWVzJykge1xuICAgICAgICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLmN0eC5yZWdpb25TdG9yZS5nZXRQaWNrZWRDbGFzc2VzKCk7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5yb2lSZXF1ZXN0O1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uID0gdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUucmV2aXNpb24oKTtcbiAgICAgICAgICBjb25zdCBvdXRsaW5lcyA9IGF3YWl0IHRoaXMuY3R4LnJlZ2lvblN0b3JlLmNsYXNzU2xpY2VPdXRsaW5lcyhjbGFzc2VzKTtcbiAgICAgICAgICAvLyBTdXBlcnNlZGVkIHdoaWxlIHRoZSBvdXRsaW5lcyB3ZXJlIHJlYWQ6IGEgbmV3ZXIgcmVxdWVzdCwgYW55IG5ld2VyIHNlbGVjdGlvblxuICAgICAgICAgIC8vIChhIENsZWFyLCBhIGxlZ2VuZCBjbGljaywgYSBsaW5rZWQgY2hhcnQncyBicnVzaCksIGFub3RoZXIgZGF0YXNldCwgdmlldyBvciBwaWNrLFxuICAgICAgICAgIC8vIG9yIHRoZSBmYWNhZGUgZGlzcG9zZWQuIEl0cyBtYXNrIHdvdWxkIG92ZXJ3cml0ZSB3aGF0IHRoZSB1c2VyIGRpZCBzaW5jZS5cbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UGlja2VkQ2xhc3NlcygpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlcXVlc3QgIT09IHRoaXMucm9pUmVxdWVzdCB8fFxuICAgICAgICAgICAgcmV2aXNpb24gIT09IHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnJldmlzaW9uKCkgfHxcbiAgICAgICAgICAgIHRoaXMuZGF0YXNldCAhPT0gZGF0YXNldCB8fFxuICAgICAgICAgICAgdGhpcy5yb2lTZWxlY3Rpb25Nb2RlKCkgIT09ICdjbGFzcy12b2x1bWVzJyB8fFxuICAgICAgICAgICAgY3VycmVudC5sZW5ndGggIT09IGNsYXNzZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBjdXJyZW50LnNvbWUoKGMsIGkpID0+IGMgIT09IGNsYXNzZXNbaV0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0SW5DbGFzc1ZvbHVtZXMoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgb3V0bGluZXMpO1xuICAgICAgICAgIHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSB1bmlvbiBvZiBldmVyeSBkcmF3biByZWdpb24g4oCUIHNvIGV2ZXJ5IFJPSSB0b29sIHRoZVxuICAgICAgICAvLyBsaWJyYXJ5IGFscmVhZHkgaGFzIGRvdWJsZXMgYXMgYSBzcGF0aWFsIHNlbGVjdGlvbiB0b29sLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJbiB0aGUgM0QgY2xvdWQgdGhlcmUgaXMgbm8gZGF0YS1zcGFjZSBhZmZpbmUgdG8gcHVzaCBhIGRyYXduIHNoYXBlXG4gICAgICAgIC8vIHRocm91Z2gsIHNvIHRoZSBvYnNlcnZhdGlvbnMgYXJlIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZVxuICAgICAgICAvLyByZW5kZXJlciAod2hpY2ggb3ducyB0aGUgY2FtZXJhKSBhbmQgdGVzdGVkIGluIHNjcmVlbiBzcGFjZSBpbnN0ZWFkIOKAlFxuICAgICAgICAvLyBhZ2FpbnN0IHRoZSBsYXNzb3MgZHJhd24gdGhlcmUgb25seTogZXZlcnkgb3RoZXIgcmVnaW9uIGlzIGluIGltYWdlXG4gICAgICAgIC8vIHNwYWNlLiBGYWxscyBiYWNrIHRvIHRoZSAyRCBwYXRoIHdoZW5ldmVyIHRoZSBjbG91ZCBpcyBub3QgbW91bnRlZC5cbiAgICAgICAgY29uc3QgcHJvamVjdGVkID0gaXMzZCA/IHRoaXMuY3R4Lm5hcGFyaS5nZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbihkYXRhc2V0Lm9ic2VydmF0aW9ucykgOiBudWxsO1xuICAgICAgICBsZXQgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzaztcbiAgICAgICAgaWYgKHByb2plY3RlZCkge1xuICAgICAgICAgIGNvbnN0IGxhc3NvcyA9IG5ldyBTZXQodGhpcy5jdHgubmFwYXJpLmdldFNwYXRpYWxMYXNzb0lkcygpKTtcbiAgICAgICAgICBjb25zdCByZWdpb25zID0gdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gbGFzc29zLmhhcyhyLmlkKSk7XG4gICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0SW5SZWdpb25zUHJvamVjdGVkKHByb2plY3RlZCwgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIHJlZ2lvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEluIHRoZSAyRCB2aWV3IG9mIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkVcbiAgICAgICAgICAvLyBzZWN0aW9uLCBpbiB0aGUgdm9sdW1lJ3MgcGl4ZWwgZ3JpZDogaXQgc2VsZWN0cyB0aGUgY2VsbHMgb2YgdGhhdFxuICAgICAgICAgIC8vIHNlY3Rpb24sIG5vdCB0aGUgd2hvbGUgZGVwdGggb2YgYnJhaW4gc3RhbmRpbmcgYmVoaW5kIHRoZW0uXG4gICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0SW5SZWdpb25zKFxuICAgICAgICAgICAgZGF0YXNldC5vYnNlcnZhdGlvbnMsXG4gICAgICAgICAgICB2b2x1bWUgPyB2b2x1bWVJbWFnZVJlZih2b2x1bWUsIGRhdGFzZXQubWljcm9uc1BlclVuaXQpIDogZGF0YXNldC5pbWFnZVJlZixcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgICAgICAgIHZvbHVtZSA/IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgdGhpcy5jdHguekluZGV4KCkpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuc2V0KHNlbGVjdGlvbik7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICB9LFxuXG4gICAgICByb2lTZWxlY3Rpb25Nb2RlOiAoKSA9PiB0aGlzLnJvaVNlbGVjdGlvbk1vZGUoKSxcblxuICAgICAgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyQ6ICgpID0+IHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMkKCksXG5cbiAgICAgIHNlbGVjdENhdGVnb3J5OiBhc3luYyAoY29sdW1uOiBzdHJpbmcsIGNhdGVnb3J5SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4obG9hZGVkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7Y29sdW1ufVwiIGlzIGNvbnRpbnVvdXMg4oCUIGl0IGhhcyBubyBjYXRlZ29yaWVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0QnlDYXRlZ29yeShsb2FkZWQuY29kZXMsIGNhdGVnb3J5SW5kZXgpO1xuICAgICAgICB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5jb3VudDtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEluZGljZXM6IChpbmRpY2VzOiBJdGVyYWJsZTxudW1iZXI+KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXRhc2V0Py5vYnNlcnZhdGlvbnMuY291bnQgPz8gMDtcbiAgICAgICAgaWYgKGNvdW50ID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0QnlJbmRpY2VzKGluZGljZXMsIGNvdW50KTtcbiAgICAgICAgdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuc2V0KHNlbGVjdGlvbik7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbjogKCkgPT4gdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuY2xlYXIoKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBgZGF0YXNldGAgY2FuIGFuc3dlciB0aGlzIGNvbG91ciBzb3VyY2UuIEEgY29sdW1uIGlzIGNoZWNrYWJsZSBhZ2FpbnN0IHRoZVxuICogZGVjbGFyZWQgbGlzdC4gQSBnZW5lIGlzIGNoZWNrYWJsZSBvbmx5IHdoZW4gdGhlIGRhdGFzZXQgaW5saW5lcyBpdHMgZmVhdHVyZSBuYW1lcyDigJRcbiAqIGEgZGF0YXNldCB0b28gd2lkZSB0byBpbmxpbmUgdGhlbSAodHlwZWFoZWFkLW9ubHkpIGtlZXBzIHRoZSBzb3VyY2UsIGFuZCBhIG5hbWUgdGhhdFxuICogdHVybnMgb3V0IG5vdCB0byBleGlzdCBzdXJmYWNlcyBhcyB0aGUgY2hhcnQncyBcImNvdWxkIG5vdCBiZSBjaGFydGVkXCIgcmF0aGVyIHRoYW4gYXNcbiAqIGEgc2lsZW50IHJlc2V0LlxuICovXG5mdW5jdGlvbiBjYW5Db2xvckJ5KGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgYnk6IFNwYXRpYWxDb2xvckJ5KTogYm9vbGVhbiB7XG4gIGlmICghZGF0YXNldCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYnkua2luZCA9PT0gJ2NvbHVtbicpIHJldHVybiBkYXRhc2V0LmNvbHVtbnMuc29tZSgoYykgPT4gYy5uYW1lID09PSBieS5uYW1lKTtcbiAgY29uc3QgbmFtZXMgPSBkYXRhc2V0LmZlYXR1cmVzPy5uYW1lcztcbiAgcmV0dXJuICEhZGF0YXNldC5mZWF0dXJlcyAmJiAoIW5hbWVzIHx8IG5hbWVzLmluY2x1ZGVzKGJ5Lm5hbWUpKTtcbn1cbiJdfQ==
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jb250cm9scy5mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBYyxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBWSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3BFLE9BQU8sRUFJTCxtQkFBbUIsR0FDcEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUsvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdFLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLHdCQUF3QixHQUN6QixNQUFNLHFCQUFxQixDQUFDO0FBNkI3Qjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBVWhDLFlBQ21CLElBQXFCLEVBQ3JCLEdBQTJCO1FBRDNCLFNBQUksR0FBSixJQUFJLENBQWlCO1FBQ3JCLFFBQUcsR0FBSCxHQUFHLENBQXdCO1FBVDlDO29GQUM0RTtRQUNwRSxZQUFPLEdBQTBCLElBQUksQ0FBQztRQUU5Qyx1RkFBdUY7UUFDL0UsZUFBVSxHQUFHLENBQUMsQ0FBQztRQU1yQixpRkFBaUY7UUFDakYsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxFQUFFLEtBQUssSUFB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RyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUU7U0FDdEQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsVUFBVSxDQUFDLE9BQThCLEVBQUUsRUFBa0I7SUFDcEUsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ25FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBQbG90VHlwZSwgaXNTcGF0aWFsT21pY3MzZCB9IGZyb20gJy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7IFNwYXRpYWxDb2xvckJ5IH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICBpc0NhdGVnb3JpY2FsQ29sdW1uLFxufSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IElTcGF0aWFsQ29udHJvbHMsIFJvaVNlbGVjdGlvbk1vZGUgfSBmcm9tICcuLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB9IGZyb20gJy4uL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGNhdGVnb3J5Q29sb3JzRm9yIH0gZnJvbSAnLi9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IHNlY3Rpb25zT2YgfSBmcm9tICcuL3NwYXRpYWwtc2VjdGlvbnMnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TbGljZSwgdm9sdW1lSW1hZ2VSZWYgfSBmcm9tICcuL3NwYXRpYWwtdm9sdW1lLWltYWdlJztcbmltcG9ydCB7XG4gIGVtcHR5U2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxuICBzZWxlY3RCeUluZGljZXMsXG4gIHNlbGVjdEluQ2xhc3NWb2x1bWVzLFxuICBzZWxlY3RJblJlZ2lvbnMsXG4gIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZCxcbn0gZnJvbSAnLi9zcGF0aWFsLXNlbGVjdGlvbic7XG5cbi8qKiBUaGUgcmVuZGVyZXItc2lkZSBzcGF0aWFsIHJlYWRvdXRzIHRoZSBjb250cm9scyBzdXJmYWNlICh0aGUgbmFwYXJpLWpzIGJhY2tlbmQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsUmVuZGVyZXJGZWVkcyB7XG4gIHJlYWRvbmx5IHRyYW5zY3JpcHRFc3RpbWF0ZSQ6IHsgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8eyBwb2ludHM6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsPiB9O1xuICByZWFkb25seSBkZW5zaXR5U3RhdHMkOiB7IGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+IH07XG4gIHJlYWRvbmx5IGdlbmVGaWx0ZXJGYWlsZWQkPzogeyBhc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB9O1xuICAvKiogT2JzZXJ2YXRpb25zIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZSAzRCBjYW1lcmEsIG9yIG51bGwgd2hlbiB0aGUgY2xvdWQgaXMgbm90IG1vdW50ZWQuICovXG4gIGdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGw7XG4gIC8qKiBUaGUgaWRzIG9mIHRoZSByZWdpb25zIGRyYXduIG92ZXIgdGhlIDNEIGNsb3VkIGluIHNjcmVlbiBzcGFjZSAoaXRzIGxhc3NvcykuICovXG4gIGdldFNwYXRpYWxMYXNzb0lkcygpOiBudW1iZXJbXTtcbiAgLyoqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgdm9sdW1lIHRoZSByZWdpb24gc3VyZmFjZXMgc2l0IGluOyBudWxsIHdoZW4gdGhlIHBsb3R0ZWQgaW1hZ2UgaXNcbiAgICogIG5vdCBhIHZvbHVtZSdzIHN0YWNrICh0aGUgcmVnaW9ucyBhcmUgdGhlbiBub3QgaW4gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBncmlkKS4gKi9cbiAgcmVnaW9uVm94ZWxTdGVwKCk6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKiBXaGF0IHRoZSBmYWNhZGUgd29ya3Mgb3ZlcjogdGhlIHNoYXJlZCBzdG9yZXMsIHRoZSByZW5kZXJlciBmZWVkcyBhbmQgdGhlIHJvdXRlcidzIHZpZXcgc3RhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxDb250cm9sc0NvbnRleHQge1xuICByZWFkb25seSBzdG9yZTogVmlzdWFsaXplclN0b3JlO1xuICByZWFkb25seSByZWdpb25TdG9yZTogUmVnaW9uU3RvcmU7XG4gIHJlYWRvbmx5IHNlbGVjdGlvblN0b3JlOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmU7XG4gIHJlYWRvbmx5IG5hcGFyaTogU3BhdGlhbFJlbmRlcmVyRmVlZHM7XG4gIC8qKiBUaGUgcGxvdCB0eXBlIG9uIHNjcmVlbiAodGhlIDNEIGNsb3VkIHNlbGVjdHMgaW4gc2NyZWVuIHNwYWNlKS4gKi9cbiAgcGxvdFR5cGUoKTogUGxvdFR5cGU7XG4gIC8qKiBUaGUgZGlzcGxheWVkIHNsaWNlIChhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCBzZWxlY3RzIHdpdGhpbiBvbmUgc2VjdGlvbikuICovXG4gIHpJbmRleCgpOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHNwYXRpYWwtb21pY3MgY29udHJvbHMgKGBJU3BhdGlhbENvbnRyb2xzYCkgb3ZlciBhIGhvc3QncyBgU1BBVElBTF9EQVRBX1BPUlRgLlxuICpcbiAqIEJhY2tlbmQtbmV1dHJhbDogdGhlIHZpZXcgc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBgVmlzdWFsaXplclN0b3JlYCAobGlrZSB0aGVcbiAqIGNvbG9ybWFwKSBhbmQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgYFNwYXRpYWxTZWxlY3Rpb25TdG9yZWAsIHNvIHRoZSBjb250cm9scyBrZWVwXG4gKiB3b3JraW5nIGFjcm9zcyBhIHBsb3QtdHlwZSBzd2l0Y2ggYW5kIGEgaG9zdCBjYW4gZHJpdmUgdGhlbSBiZWZvcmUgYW55IGJhY2tlbmQgaGFzXG4gKiBtb3VudGVkLiBPd25zIGl0cyBtaXJyb3Igb2YgdGhlIHBvcnQncyBkYXRhc2V0IOKAlCBkcm9wcGluZyBhIHN0YWxlIHNlbGVjdGlvbiBhbmQgYW5cbiAqIHVuc2F0aXNmaWFibGUgY29sb3VyIHNvdXJjZSB3aGVuIHRoZSBkYXRhc2V0IGNoYW5nZXMg4oCUIGFuZCB0aGUgc3Vic2NyaXB0aW9uIGJlaGluZFxuICogaXQsIHJlbGVhc2VkIGJ5IHtAbGluayBkaXNwb3NlfSAocmV2aWV3IENPUkUtMzApLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbENvbnRyb2xzRmFjYWRlIHtcbiAgLyoqIFRoZSBjb250cm9sczsgb25lIG9iamVjdCBmb3IgdGhlIGZhY2FkZSdzIGxpZmUsIHNvIGNvbnN1bWVycyBjYW4gaG9sZCBpdC4gKi9cbiAgcmVhZG9ubHkgY29udHJvbHM6IElTcGF0aWFsQ29udHJvbHM7XG4gIC8qKiBMYXRlc3QgZGF0YXNldCwgbWlycm9yZWQgc28gYHNlbGVjdEZyb21SZWdpb25zKClgIGFuc3dlcnMgZnJvbSB0aGUgZGF0YXNldCBvblxuICAgKiAgc2NyZWVuIOKAlCBpdCBydW5zIGZyb20gYSBidXR0b24gY2xpY2sgYW5kIG11c3Qgbm90IGF3YWl0IGEgcm91bmQtdHJpcC4gKi9cbiAgcHJpdmF0ZSBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YjogU3Vic2NyaXB0aW9uO1xuICAvKiogQnVtcGVkIHBlciBjbGFzcy12b2x1bWUgc2VsZWN0aW9uIChhbmQgb24gZGlzcG9zZSk6IG9ubHkgdGhlIGxhdGVzdCBtYXkgcHVibGlzaC4gKi9cbiAgcHJpdmF0ZSByb2lSZXF1ZXN0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnQ6IFNwYXRpYWxEYXRhUG9ydCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN0eDogU3BhdGlhbENvbnRyb2xzQ29udGV4dCxcbiAgKSB7XG4gICAgLy8gTWlycm9yIHRoZSBkYXRhc2V0IChhbmQgZHJvcCBhIHN0YWxlIHNlbGVjdGlvbiB3aGVuIGl0IGNoYW5nZXMg4oCUIHRoZSBtYXNrcyBhcmVcbiAgICAvLyBpbmRleC1iYXNlZCwgc28gdGhleSBhcmUgbWVhbmluZ2xlc3MgYWdhaW5zdCBkaWZmZXJlbnQgb2JzZXJ2YXRpb25zKS5cbiAgICB0aGlzLnN1YiA9IHBvcnQuZ2V0RGF0YXNldCQoKS5zdWJzY3JpYmUoKGRhdGFzZXQpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWQgPSBkYXRhc2V0Py5pZCAhPT0gdGhpcy5kYXRhc2V0Py5pZDtcbiAgICAgIHRoaXMuZGF0YXNldCA9IGRhdGFzZXQ7XG4gICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAgIGN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoZW1wdHlTZWxlY3Rpb24oZGF0YXNldD8ub2JzZXJ2YXRpb25zLmNvdW50ID8/IDApKTtcbiAgICAgIC8vIEEgY29sb3VyIHNvdXJjZSB0aGUgbmV3IGRhdGFzZXQgY2Fubm90IHNhdGlzZnkgd291bGQgbGVhdmUgdGhlIG1hcCBmbGF0IHdoaWxlXG4gICAgICAvLyB0aGUgcGFuZWwgYW5kIHRoZSBjaGFydHMga2VwdCBuYW1pbmcgdGhlIG9sZCBjb2x1bW4g4oCUIHNvIGRyb3AgaXQsIGFuZCBvbmx5IGl0OlxuICAgICAgLy8gcG9pbnQgc2l6ZSwgb3BhY2l0eSBhbmQgdGhlIHJlc3QgYXJlIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMuXG4gICAgICBjb25zdCBjdXJyZW50ID0gY3R4LnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpO1xuICAgICAgY29uc3QgYnkgPSBjdXJyZW50LmNvbG9yQnk7XG4gICAgICBpZiAoYnkgJiYgIWNhbkNvbG9yQnkoZGF0YXNldCwgYnkpKSBjdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pO1xuICAgICAgLy8gVGhlIGdlbmUgZmlsdGVyIG5hbWVzIHRoZSBvbGQgZGF0YXNldCdzIGdlbmVzOiBrZXB0LCBpdCBjb3VsZCBoaWRlIGV2ZXJ5IG9ic2VydmF0aW9uLlxuICAgICAgaWYgKGN1cnJlbnQub2JzZXJ2YXRpb25HZW5lcz8ubGVuZ3RoKSBjdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBvYnNlcnZhdGlvbkdlbmVzOiBbXSB9KTtcbiAgICAgIC8vIEdyb3VwIGNvbG91cnMgYXJlIGNob3NlbiBmb3IgdGhpcyBkYXRhc2V0J3MgZ3JvdXBpbmdzOyBhbm90aGVyJ3Mgc2FtZS1uYW1lZCBjb2x1bW4gaXMgbm90IHRoZW0uXG4gICAgICBpZiAoT2JqZWN0LmtleXMoY3VycmVudC5ncm91cENvbG9ycyA/PyB7fSkubGVuZ3RoKSBjdHguc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBncm91cENvbG9yczoge30gfSk7XG4gICAgfSk7XG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMuYnVpbGQoKTtcbiAgfVxuXG4gIC8qKiBSZWxlYXNlIHRoZSBwb3J0IHN1YnNjcmlwdGlvbiAodGhlIHJvdXRlcidzIGluamVjdG9yIGlzIGJlaW5nIGRlc3Ryb3llZCkuICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICAvLyBBIGNsYXNzLXZvbHVtZSBzZWxlY3Rpb24gc3RpbGwgcmVhZGluZyBpdHMgb3V0bGluZXMgcHVibGlzaGVzIG5vdGhpbmcuXG4gICAgdGhpcy5yb2lSZXF1ZXN0Kys7XG4gIH1cblxuICAvKipcbiAgICogSG93IFwiU2VsZWN0IGZyb20gUk9Jc1wiIHNlbGVjdHMgbm93IOKAlCB0aGUgb25lIHJ1bGUgaXRzIGV4ZWN1dG9yIGFuZCB0aGUgcGFuZWwncyBkZXNjcmlwdGlvblxuICAgKiBzaGFyZTogaW5zaWRlIHRoZSBwaWNrZWQgY2xhc3Nlcycgdm9sdW1lcyBpbiB0aGUgM0QgY2xvdWQsIHdoZW4gdGhlIGRhdGFzZXQgaGFzIGEgcmVmZXJlbmNlXG4gICAqIHZvbHVtZSAoYW5kIG5vIHRpc3N1ZSBpbWFnZSkgYW5kIHRoZSBwbG90dGVkIGltYWdlIGlzIHRoYXQgdm9sdW1lJ3Mgc3RhY2ssIHNvIHRoZSByZWdpb25zIHNpdFxuICAgKiBpbiBpdHMgZ3JpZDsgYnkgdGhlIGRyYXduIHJlZ2lvbnMgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJpdmF0ZSByb2lTZWxlY3Rpb25Nb2RlKCk6IFJvaVNlbGVjdGlvbk1vZGUge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmRhdGFzZXQ7XG4gICAgY29uc3QgZWxpZ2libGUgPVxuICAgICAgISFkYXRhc2V0Py52b2x1bWUgJiZcbiAgICAgICFkYXRhc2V0LmltYWdlUmVmICYmXG4gICAgICBpc1NwYXRpYWxPbWljczNkKHRoaXMuY3R4LnBsb3RUeXBlKCkpICYmXG4gICAgICB0aGlzLmN0eC5yZWdpb25TdG9yZS5nZXRQaWNrZWRDbGFzc2VzKCkubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5jdHgubmFwYXJpLnJlZ2lvblZveGVsU3RlcCgpICE9PSBudWxsO1xuICAgIHJldHVybiBlbGlnaWJsZSA/ICdjbGFzcy12b2x1bWVzJyA6ICdyZWdpb25zJztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGQoKTogSVNwYXRpYWxDb250cm9scyB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMucG9ydDtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0RGF0YXNldCQ6ICgpID0+IHBvcnQuZ2V0RGF0YXNldCQoKSxcbiAgICAgIGdldFZpZXdTdGF0ZSQ6ICgpID0+IHRoaXMuY3R4LnN0b3JlLmdldFNwYXRpYWxWaWV3JCgpLFxuICAgICAgdmlld1N0YXRlOiAoKSA9PiB0aGlzLmN0eC5zdG9yZS5jdXJyZW50U3BhdGlhbFZpZXcoKSxcbiAgICAgIHNldFZpZXdTdGF0ZTogKHBhcnRpYWwpID0+IHRoaXMuY3R4LnN0b3JlLnNldFNwYXRpYWxWaWV3KHBhcnRpYWwpLFxuICAgICAgLy8gVGhlIGhpbnQgU0VFRFMgdGhlIHRvZ2dsZSB3aGVuIHRoZSBzb3VyY2UgY2hhbmdlcywgYW5kIG5vdGhpbmcgY29uc3VsdHMgaXRcbiAgICAgIC8vIGFmdGVyd2FyZHMuIEl0IHVzZWQgdG8gYmUgT1JlZCBpbiBhdCByZW5kZXIgdGltZSwgd2hpY2ggbWVhbnQgYW4gdW5jaGVja2VkXG4gICAgICAvLyBib3ggY291bGQgbm90IHR1cm4gbG9nIHNjYWxpbmcgb2ZmIGZvciBhIGhpbnRlZCBjb2x1bW4g4oCUIGFuZCB0aGUgbGlua2VkXG4gICAgICAvLyBjaGFydCwgd2hpY2ggcmVhZHMgYGxvZ1NjYWxlYCBhbG9uZSwgZGlzYWdyZWVkIHdpdGggdGhlIG1hcCBhYm91dCB3aGF0IGl0XG4gICAgICAvLyB3YXMgc2hvd2luZy4gT25lIGF1dGhvcml0eSwgc2V0IG9uY2UgcGVyIHNvdXJjZS5cbiAgICAgIGNvbG9yQnlDb2x1bW46IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZGF0YXNldD8uY29sdW1ucy5maW5kKChjKSA9PiBjLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICBjb25zdCBoaW50ID0gbWV0YT8ua2luZCA9PT0gJ2NvbnRpbnVvdXMnID8gISFtZXRhLmxvZ1NjYWxlSGludCA6IGZhbHNlO1xuICAgICAgICB0aGlzLmN0eC5zdG9yZS5zZXRTcGF0aWFsVmlldyh7IGNvbG9yQnk6IHsga2luZDogJ2NvbHVtbicsIG5hbWUgfSwgbG9nU2NhbGU6IGhpbnQgfSk7XG4gICAgICB9LFxuICAgICAgY29sb3JCeUZlYXR1cmU6IChuYW1lOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuY3R4LnN0b3JlLnNldFNwYXRpYWxWaWV3KHtcbiAgICAgICAgICBjb2xvckJ5OiB7IGtpbmQ6ICdmZWF0dXJlJywgbmFtZSB9LFxuICAgICAgICAgIGxvZ1NjYWxlOiAhIXRoaXMuZGF0YXNldD8uZmVhdHVyZXM/LmxvZ1NjYWxlSGludCxcbiAgICAgICAgfSksXG4gICAgICBjbGVhckNvbG9yQnk6ICgpID0+IHRoaXMuY3R4LnN0b3JlLnNldFNwYXRpYWxWaWV3KHsgY29sb3JCeTogbnVsbCB9KSxcbiAgICAgIHNlYXJjaEZlYXR1cmVzOiBhc3luYyAocXVlcnk6IHN0cmluZywgbGltaXQgPSA1MCkgPT4ge1xuICAgICAgICAvLyBQcmVmZXIgdGhlIHBvcnQncyBzZWFyY2ggKGEgMzFrLWdlbmUgZGF0YXNldCBkb2VzIG5vdCBzaGlwIGl0cyBuYW1lcyk7XG4gICAgICAgIC8vIG90aGVyd2lzZSBmaWx0ZXIgd2hhdGV2ZXIgdGhlIG1hbmlmZXN0IGlubGluZWQuXG4gICAgICAgIGlmIChwb3J0LnNlYXJjaEZlYXR1cmVzKSByZXR1cm4gcG9ydC5zZWFyY2hGZWF0dXJlcyhxdWVyeSwgbGltaXQpO1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20ocG9ydC5nZXREYXRhc2V0JCgpKTtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBkYXRhc2V0Py5mZWF0dXJlcz8ubmFtZXMgPz8gW107XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gbmFtZXMuZmlsdGVyKChuKSA9PiBuLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpLnNsaWNlKDAsIGxpbWl0KTtcbiAgICAgIH0sXG4gICAgICAuLi4ocG9ydC5pbXBvcnRHcm91cHNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbXBvcnRHcm91cHM6IChsYWJlbDogc3RyaW5nLCB0YWJsZTogc3RyaW5nKSA9PiBwb3J0LmltcG9ydEdyb3VwcyEobGFiZWwsIHRhYmxlKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKHBvcnQuZ2V0VHJhbnNjcmlwdENvdW50c1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHRyYW5zY3JpcHRDb3VudHM6IChnZW5lczogc3RyaW5nW10pID0+IHBvcnQuZ2V0VHJhbnNjcmlwdENvdW50cyEoZ2VuZXMpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4ocG9ydC5nZXRNYXJrZXJHZW5lc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIG1hcmtlckdlbmVzOiAoY29sdW1uOiBzdHJpbmcsIHBlckdyb3VwPzogbnVtYmVyKSA9PiBwb3J0LmdldE1hcmtlckdlbmVzIShjb2x1bW4sIHBlckdyb3VwKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgZ2V0VHJhbnNjcmlwdEVzdGltYXRlJDogKCkgPT4gdGhpcy5jdHgubmFwYXJpLnRyYW5zY3JpcHRFc3RpbWF0ZSQuYXNPYnNlcnZhYmxlKCksXG4gICAgICBnZXRHZW5lQ291bnRzSW5WaWV3JDogKCkgPT4gdGhpcy5jdHgubmFwYXJpLmdlbmVDb3VudHNJblZpZXckLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgZ2V0RGVuc2l0eVN0YXRzJDogKCkgPT4gdGhpcy5jdHgubmFwYXJpLmRlbnNpdHlTdGF0cyQuYXNPYnNlcnZhYmxlKCksXG4gICAgICBnZXRHZW5lRmlsdGVyRmFpbGVkJDogKCkgPT4gdGhpcy5jdHgubmFwYXJpLmdlbmVGaWx0ZXJGYWlsZWQkPy5hc09ic2VydmFibGUoKSA/PyBvZihmYWxzZSksXG4gICAgICBjYXRlZ29yeUNvbG9yczogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihuYW1lKTtcbiAgICAgICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSBjb2x1bW4gXCIke25hbWV9XCIgaXMgY29udGludW91cyDigJQgaXQgaGFzIG5vIGNhdGVnb3JpZXNgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNvbHZlZCBieSB0aGUgU0FNRSBmdW5jdGlvbiB0aGUgcmVuZGVyZXIgdXNlcywgc28gYSBsZWdlbmQgc3dhdGNoXG4gICAgICAgIC8vIGNhbiBuZXZlciBkaXNhZ3JlZSB3aXRoIHRoZSBjb2xvdXIgb24gc2NyZWVuLlxuICAgICAgICByZXR1cm4gY2F0ZWdvcnlDb2xvcnNGb3IobmFtZSwgY29sdW1uLm1ldGEsIHRoaXMuY3R4LnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpLmdyb3VwQ29sb3JzKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbnRpbnVvdXNWYWx1ZXM6IGFzeW5jIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZS5raW5kID09PSAnZmVhdHVyZScpIHJldHVybiBwb3J0LmdldEZlYXR1cmVWZWN0b3Ioc291cmNlLm5hbWUpO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihzb3VyY2UubmFtZSk7XG4gICAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwiIGlzIGNhdGVnb3JpY2FsIOKAlCBpdCBoYXMgbm8gdmFsdWVzIHRvIGNoYXJ0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbi52YWx1ZXM7XG4gICAgICB9LFxuXG4gICAgICBjYXRlZ29yaWNhbFZpZXc6IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4obmFtZSk7XG4gICAgICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gY29sdW1uIFwiJHtuYW1lfVwiIGlzIGNvbnRpbnVvdXMg4oCUIGl0IGhhcyBubyBjYXRlZ29yaWVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGNhdGVnb3JpZXM6IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMsXG4gICAgICAgICAgY29sb3JzOiBjYXRlZ29yeUNvbG9yc0ZvcihuYW1lLCBjb2x1bW4ubWV0YSwgdGhpcy5jdHguc3RvcmUuY3VycmVudFNwYXRpYWxWaWV3KCkuZ3JvdXBDb2xvcnMpLFxuICAgICAgICAgIGNvZGVzOiBjb2x1bW4uY29kZXMsXG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICAvLyBTcHJlYWQgcmF0aGVyIHRoYW4gYWx3YXlzIGRlZmluZWQ6IGBnZXRFbWJlZGRpbmdgIGlzIG9wdGlvbmFsIG9uIGJvdGggdGhlIHBvcnRcbiAgICAgIC8vIGFuZCB0aGlzIGZhY2FkZSwgYW5kIGEgcGFuZWwgY2hlY2tzIGZvciBpdHMgcHJlc2VuY2UgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHZpZXdcbiAgICAgIC8vIGlzIG9mZmVyZWQgYXQgYWxsLiBEZWZpbmluZyBpdCBhcyBhIGZ1bmN0aW9uIHRoYXQgcmVqZWN0cyB3b3VsZCBtYWtlIGFuXG4gICAgICAvLyBlbWJlZGRpbmctbGVzcyBzb3VyY2UgbG9vayBsaWtlIGEgYnJva2VuIG9uZS5cbiAgICAgIC4uLihwb3J0LmdldEVtYmVkZGluZyA/IHsgZ2V0RW1iZWRkaW5nOiAobmFtZTogc3RyaW5nKSA9PiBwb3J0LmdldEVtYmVkZGluZyEobmFtZSkgfSA6IHt9KSxcblxuICAgICAgY2F0ZWdvcmljYWxDb2x1bW5zOiAoKSA9PlxuICAgICAgICAodGhpcy5kYXRhc2V0Py5jb2x1bW5zID8/IFtdKS5maWx0ZXIoKGMpID0+IGMua2luZCA9PT0gJ2NhdGVnb3JpY2FsJykubWFwKChjKSA9PiBjLm5hbWUpLFxuXG4gICAgICAvLyBNZW1vaXplZCBvbiB0aGUgb2JzZXJ2YXRpb25zIG9iamVjdCwgc28gdGhlIHJlbmRlcmVyJ3Mgb3duIGxvb2t1cCBhbmRcbiAgICAgIC8vIHRoaXMgb25lIGFyZSB0aGUgc2FtZSBzaW5nbGUgc2NhbiBvZiB1cCB0byAzLjdNIHogdmFsdWVzLlxuICAgICAgc2FtcGxlZFNlY3Rpb25zOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9icyA9IHRoaXMuZGF0YXNldD8ub2JzZXJ2YXRpb25zO1xuICAgICAgICByZXR1cm4gb2JzID8gc2VjdGlvbnNPZihvYnMpIDogbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldFNlbGVjdGlvbiQ6ICgpID0+IHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLmdldFNlbGVjdGlvbiQoKSxcblxuICAgICAgc2VsZWN0RnJvbVJlZ2lvbnM6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZGF0YXNldDtcbiAgICAgICAgaWYgKCFkYXRhc2V0KSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdHgucGxvdFR5cGUoKSk7XG4gICAgICAgIGNvbnN0IHZvbHVtZSA9ICFkYXRhc2V0LmltYWdlUmVmID8gZGF0YXNldC52b2x1bWUgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEluIHRoZSAzRCBjbG91ZCwgcmVnaW9uIGNsYXNzZXMgcGlja2VkIGluIHRoZSBSZWdpb24gRWRpdG9yIChhIGNsYXNzXG4gICAgICAgIC8vIHRyZWUgbm9kZSB3aXRoIGl0cyBzdWJjbGFzc2VzLCBhIHN1cmZhY2UgY2xpY2tlZCBpbiAzRCkgc2VsZWN0IHRoZVxuICAgICAgICAvLyBjZWxscyBpbnNpZGUgdGhlaXIgdm9sdW1lcyDigJQgdGhlIHN0cnVjdHVyZXMgc2hvd24gYW1vbmcgdGhlIGNlbGxzLlxuICAgICAgICBpZiAodm9sdW1lICYmIHRoaXMucm9pU2VsZWN0aW9uTW9kZSgpID09PSAnY2xhc3Mtdm9sdW1lcycpIHtcbiAgICAgICAgICBjb25zdCBjbGFzc2VzID0gdGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UGlja2VkQ2xhc3NlcygpO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSArK3RoaXMucm9pUmVxdWVzdDtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbiA9IHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnJldmlzaW9uKCk7XG4gICAgICAgICAgY29uc3Qgb3V0bGluZXMgPSBhd2FpdCB0aGlzLmN0eC5yZWdpb25TdG9yZS5jbGFzc1NsaWNlT3V0bGluZXMoY2xhc3Nlcyk7XG4gICAgICAgICAgLy8gU3VwZXJzZWRlZCB3aGlsZSB0aGUgb3V0bGluZXMgd2VyZSByZWFkOiBhIG5ld2VyIHJlcXVlc3QsIGFueSBuZXdlciBzZWxlY3Rpb25cbiAgICAgICAgICAvLyAoYSBDbGVhciwgYSBsZWdlbmQgY2xpY2ssIGEgbGlua2VkIGNoYXJ0J3MgYnJ1c2gpLCBhbm90aGVyIGRhdGFzZXQsIHZpZXcgb3IgcGljayxcbiAgICAgICAgICAvLyBvciB0aGUgZmFjYWRlIGRpc3Bvc2VkLiBJdHMgbWFzayB3b3VsZCBvdmVyd3JpdGUgd2hhdCB0aGUgdXNlciBkaWQgc2luY2UuXG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICByZXF1ZXN0ICE9PSB0aGlzLnJvaVJlcXVlc3QgfHxcbiAgICAgICAgICAgIHJldmlzaW9uICE9PSB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5yZXZpc2lvbigpIHx8XG4gICAgICAgICAgICB0aGlzLmRhdGFzZXQgIT09IGRhdGFzZXQgfHxcbiAgICAgICAgICAgIHRoaXMucm9pU2VsZWN0aW9uTW9kZSgpICE9PSAnY2xhc3Mtdm9sdW1lcycgfHxcbiAgICAgICAgICAgIGN1cnJlbnQubGVuZ3RoICE9PSBjbGFzc2VzLmxlbmd0aCB8fFxuICAgICAgICAgICAgY3VycmVudC5zb21lKChjLCBpKSA9PiBjICE9PSBjbGFzc2VzW2ldKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHNlbGVjdEluQ2xhc3NWb2x1bWVzKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB2b2x1bWUsIG91dGxpbmVzKTtcbiAgICAgICAgICB0aGlzLmN0eC5zZWxlY3Rpb25TdG9yZS5zZXQoc2VsZWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSB0aGUgdW5pb24gb2YgZXZlcnkgZHJhd24gcmVnaW9uIOKAlCBzbyBldmVyeSBST0kgdG9vbCB0aGVcbiAgICAgICAgLy8gbGlicmFyeSBhbHJlYWR5IGhhcyBkb3VibGVzIGFzIGEgc3BhdGlhbCBzZWxlY3Rpb24gdG9vbC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSW4gdGhlIDNEIGNsb3VkIHRoZXJlIGlzIG5vIGRhdGEtc3BhY2UgYWZmaW5lIHRvIHB1c2ggYSBkcmF3biBzaGFwZVxuICAgICAgICAvLyB0aHJvdWdoLCBzbyB0aGUgb2JzZXJ2YXRpb25zIGFyZSBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGVcbiAgICAgICAgLy8gcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSkgYW5kIHRlc3RlZCBpbiBzY3JlZW4gc3BhY2UgaW5zdGVhZCDigJRcbiAgICAgICAgLy8gYWdhaW5zdCB0aGUgbGFzc29zIGRyYXduIHRoZXJlIG9ubHk6IGV2ZXJ5IG90aGVyIHJlZ2lvbiBpcyBpbiBpbWFnZVxuICAgICAgICAvLyBzcGFjZS4gRmFsbHMgYmFjayB0byB0aGUgMkQgcGF0aCB3aGVuZXZlciB0aGUgY2xvdWQgaXMgbm90IG1vdW50ZWQuXG4gICAgICAgIGNvbnN0IHByb2plY3RlZCA9IGlzM2QgPyB0aGlzLmN0eC5uYXBhcmkuZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24oZGF0YXNldC5vYnNlcnZhdGlvbnMpIDogbnVsbDtcbiAgICAgICAgbGV0IHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2s7XG4gICAgICAgIGlmIChwcm9qZWN0ZWQpIHtcbiAgICAgICAgICBjb25zdCBsYXNzb3MgPSBuZXcgU2V0KHRoaXMuY3R4Lm5hcGFyaS5nZXRTcGF0aWFsTGFzc29JZHMoKSk7XG4gICAgICAgICAgY29uc3QgcmVnaW9ucyA9IHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+IGxhc3Nvcy5oYXMoci5pZCkpO1xuICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZChwcm9qZWN0ZWQsIGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50LCByZWdpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJbiB0aGUgMkQgdmlldyBvZiBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGUgc2hhcGUgd2FzIGRyYXduIG92ZXIgT05FXG4gICAgICAgICAgLy8gc2VjdGlvbiwgaW4gdGhlIHZvbHVtZSdzIHBpeGVsIGdyaWQ6IGl0IHNlbGVjdHMgdGhlIGNlbGxzIG9mIHRoYXRcbiAgICAgICAgICAvLyBzZWN0aW9uLCBub3QgdGhlIHdob2xlIGRlcHRoIG9mIGJyYWluIHN0YW5kaW5nIGJlaGluZCB0aGVtLlxuICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdEluUmVnaW9ucyhcbiAgICAgICAgICAgIGRhdGFzZXQub2JzZXJ2YXRpb25zLFxuICAgICAgICAgICAgdm9sdW1lID8gdm9sdW1lSW1hZ2VSZWYodm9sdW1lLCBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0KSA6IGRhdGFzZXQuaW1hZ2VSZWYsXG4gICAgICAgICAgICB0aGlzLmN0eC5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICAgICAgICB2b2x1bWUgPyBvYnNlcnZhdGlvbnNJblNsaWNlKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB2b2x1bWUsIHRoaXMuY3R4LnpJbmRleCgpKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgfSxcblxuICAgICAgcm9pU2VsZWN0aW9uTW9kZTogKCkgPT4gdGhpcy5yb2lTZWxlY3Rpb25Nb2RlKCksXG5cbiAgICAgIGdldFBpY2tlZFJlZ2lvbkNsYXNzZXMkOiAoKSA9PiB0aGlzLmN0eC5yZWdpb25TdG9yZS5nZXRQaWNrZWRDbGFzc2VzJCgpLFxuXG4gICAgICBzZWxlY3RDYXRlZ29yeTogYXN5bmMgKGNvbHVtbjogc3RyaW5nLCBjYXRlZ29yeUluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sdW1uKTtcbiAgICAgICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGxvYWRlZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSBjb2x1bW4gXCIke2NvbHVtbn1cIiBpcyBjb250aW51b3VzIOKAlCBpdCBoYXMgbm8gY2F0ZWdvcmllc2ApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHNlbGVjdEJ5Q2F0ZWdvcnkobG9hZGVkLmNvZGVzLCBjYXRlZ29yeUluZGV4KTtcbiAgICAgICAgdGhpcy5jdHguc2VsZWN0aW9uU3RvcmUuc2V0KHNlbGVjdGlvbik7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICB9LFxuXG4gICAgICBzZWxlY3RJbmRpY2VzOiAoaW5kaWNlczogSXRlcmFibGU8bnVtYmVyPikgPT4ge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuZGF0YXNldD8ub2JzZXJ2YXRpb25zLmNvdW50ID8/IDA7XG4gICAgICAgIGlmIChjb3VudCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHNlbGVjdEJ5SW5kaWNlcyhpbmRpY2VzLCBjb3VudCk7XG4gICAgICAgIHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb246ICgpID0+IHRoaXMuY3R4LnNlbGVjdGlvblN0b3JlLmNsZWFyKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYGRhdGFzZXRgIGNhbiBhbnN3ZXIgdGhpcyBjb2xvdXIgc291cmNlLiBBIGNvbHVtbiBpcyBjaGVja2FibGUgYWdhaW5zdCB0aGVcbiAqIGRlY2xhcmVkIGxpc3QuIEEgZ2VuZSBpcyBjaGVja2FibGUgb25seSB3aGVuIHRoZSBkYXRhc2V0IGlubGluZXMgaXRzIGZlYXR1cmUgbmFtZXMg4oCUXG4gKiBhIGRhdGFzZXQgdG9vIHdpZGUgdG8gaW5saW5lIHRoZW0gKHR5cGVhaGVhZC1vbmx5KSBrZWVwcyB0aGUgc291cmNlLCBhbmQgYSBuYW1lIHRoYXRcbiAqIHR1cm5zIG91dCBub3QgdG8gZXhpc3Qgc3VyZmFjZXMgYXMgdGhlIGNoYXJ0J3MgXCJjb3VsZCBub3QgYmUgY2hhcnRlZFwiIHJhdGhlciB0aGFuIGFzXG4gKiBhIHNpbGVudCByZXNldC5cbiAqL1xuZnVuY3Rpb24gY2FuQ29sb3JCeShkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIGJ5OiBTcGF0aWFsQ29sb3JCeSk6IGJvb2xlYW4ge1xuICBpZiAoIWRhdGFzZXQpIHJldHVybiBmYWxzZTtcbiAgaWYgKGJ5LmtpbmQgPT09ICdjb2x1bW4nKSByZXR1cm4gZGF0YXNldC5jb2x1bW5zLnNvbWUoKGMpID0+IGMubmFtZSA9PT0gYnkubmFtZSk7XG4gIGNvbnN0IG5hbWVzID0gZGF0YXNldC5mZWF0dXJlcz8ubmFtZXM7XG4gIHJldHVybiAhIWRhdGFzZXQuZmVhdHVyZXMgJiYgKCFuYW1lcyB8fCBuYW1lcy5pbmNsdWRlcyhieS5uYW1lKSk7XG59XG4iXX0=
@@ -52,6 +52,23 @@ export function resolveCategoryColors(meta, palette = DEFAULT_CATEGORICAL_PALETT
52
52
  return fallbackColorFor(name, palette);
53
53
  });
54
54
  }
55
+ /**
56
+ * Categorical column `column`'s colours ({@link resolveCategoryColors}) with the user's choices
57
+ * for its groups over them. Every place a grouping is coloured goes through this, so a group
58
+ * recoloured in the list is that colour on the cells, the markers, the legend and the charts.
59
+ */
60
+ export function categoryColorsFor(column, meta, overrides) {
61
+ const base = resolveCategoryColors(meta);
62
+ const own = overrides?.[column];
63
+ if (!own)
64
+ return base;
65
+ return meta.categories.map((name, i) => own[name] || base[i]);
66
+ }
67
+ /** What a cache keyed on a grouping's colours must include of the user's choices for it. */
68
+ export function groupColorsKey(column, overrides) {
69
+ const own = column ? overrides?.[column] : undefined;
70
+ return own ? JSON.stringify(own) : '';
71
+ }
55
72
  /** Categorical column → flat per-point RGBA (length `4 * codes.length`). */
56
73
  export function encodeCategorical(codes, opts) {
57
74
  const n = codes.length;
@@ -173,4 +190,4 @@ export function spatialContinuousLut(colormapValue, reverse = false, override) {
173
190
  const lut = lutFor(colormapValue, reverse);
174
191
  return isGrayscaleLut(lut) ? buildColormapLut('Viridis', reverse) : lut;
175
192
  }
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQXlCLFdBQVcsRUFBdUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUVoSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUE0QjNDLGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWxELHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUFFMUM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBYTtJQUNuRCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0NBQ1YsQ0FBQztBQWdDRjtzR0FDc0c7QUFDdEcsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFXO0lBQ2xDLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBUyxFQUFFLElBQWlCO0lBQzNDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUkscUJBQXFCLENB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QUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLGFBQXNCLEVBQ3RCLE9BQU8sR0FBRyxLQUFLLEVBQ2YsUUFBK0I7SUFFL0IseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUN4RixJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJnYiwgYnVpbGRDb2xvcm1hcEx1dCB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgcGFyc2VDc3NDb2xvciB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcic7XG5pbXBvcnQgeyBmYWxsYmFja0NvbG9yRm9yIH0gZnJvbSAnLi4vc3RvcmUvY2xhc3MtY29sb3IudXRpbCc7XG5pbXBvcnQgeyBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIE5PX0NBVEVHT1JZLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcFZhbHVlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgcGVyY2VudGlsZVdpbmRvdyB9IGZyb20gJy4vc3RhdHMnO1xuXG4vKipcbiAqIFR1cm5pbmcgc3BhdGlhbC1vbWljcyBjb2x1bW5zIGludG8gcGVyLXBvaW50IHZpc3VhbCBhdHRyaWJ1dGVzLlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIHJlbmRlcmVyIOKAlCBsaWtlIGBwbG90bHktdHJhY2UtYnVpbGRlcnMudHNgLCBzb1xuICogdGhlIGVuY29kaW5ncyBhcmUgdGVzdGFibGUgb24gdGhlaXIgb3duIGFuZCBzaGFyZWQgYnkgYW55IGJhY2tlbmQgdGhhdCBncm93c1xuICogYSBzcGF0aWFsIG1vZGUuXG4gKlxuICogVGhlIHJ1bGVzIGhlcmUgYXJlIHRoZSBvbmVzIHRoZSBDb3NNeCBhbmFseXNpcyBndWlkYW5jZSBwcmVzY3JpYmVzLCBtYWRlXG4gKiBleHBsaWNpdCByYXRoZXIgdGhhbiBsZWZ0IHRvIGVhY2ggY2FsbCBzaXRlOlxuICogIC0gY291bnQtbGlrZSBjb2x1bW5zIHJlYWQgb24gYSAqKmxvZyoqIHNjYWxlIChsaW5lYXIgY29sbGFwc2VzIHRoZW0gYWdhaW5zdCBhXG4gKiAgICBmZXcgYnJpZ2h0IG91dGxpZXJzKTtcbiAqICAtIGNvbnRyYXN0IHdpbmRvd3MgY29tZSBmcm9tICoqcGVyY2VudGlsZXMqKiwgbm90IG1pbi9tYXgsIHNvIGEgc2luZ2xlXG4gKiAgICBzYXR1cmF0ZWQgc3BvdCBkb2Vzbid0IGZsYXR0ZW4gZXZlcnl0aGluZyBlbHNlO1xuICogIC0gY29udGV4dCBpcyBrZXB0IGJ5ICoqbXV0aW5nKiogcmF0aGVyIHRoYW4gaGlkaW5nIOKAlCBiYWNrZ3JvdW5kIHBvaW50cyBzdGF5XG4gKiAgICB2aXNpYmxlIGF0IGxvdyBhbHBoYSBzbyB0aGUgdGlzc3VlIHNoYXBlIHN1cnZpdmVzLlxuICpcbiAqIENPTE9VUiBSRVBSRVNFTlRBVElPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFdmVyeXRoaW5nIGlzIGEgZmxhdCBgRmxvYXQzMkFycmF5YCBvZiBgW3IsZyxiLGEsIOKApl1gIGluIDAuLjEg4oCUIG9uZVxuICogYWxsb2NhdGlvbiBmb3IgTiBwb2ludHMsIEdQVS11cGxvYWQgc2hhcGVkLiBuYXBhcmktanMgKOKJpSAwLjE1KVxuICogYFBvaW50c0xheWVyLmZhY2VDb2xvcmAgYW5kIGBQb2ludHMzRExheWVyLmNvbG9yc2AgdGFrZSBpdCBhcyBpcy5cbiAqL1xuXG4vKiogT25lIFJHQkEgY29sb3VyLCByLCBnLCBiLCBhIGluIDAuLjEgKG5hcGFyaS1qcydzIGJyb2FkY2FzdCBjb2xvdXIpLiAqL1xuZXhwb3J0IHR5cGUgUkdCQSA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogTmV1dHJhbCBncmV5IGZvciBvYnNlcnZhdGlvbnMgd2l0aCBubyB2YWx1ZSAoTmFOLCBvciB7QGxpbmsgTk9fQ0FURUdPUll9KS4gKi9cbmV4cG9ydCBjb25zdCBNSVNTSU5HX0NPTE9SOiBSZ2IgPSBbMTUwLCAxNTAsIDE1MF07XG5cbi8qKiBEZWZhdWx0IGFscGhhIGZvciBtdXRlZCAoYmFja2dyb3VuZCAvIHVuc2VsZWN0ZWQpIHBvaW50cyDigJQgQ29zTXgtc3R5bGUgY29udGV4dC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01VVEVEX09QQUNJVFkgPSAwLjE1O1xuXG4vKipcbiAqIEZhbGxiYWNrIGNhdGVnb3JpY2FsIHBhbGV0dGUuIENvbG91ci1ibGluZC1zYWZlIGFuZCBzdGFibGUsIHNvIGEgY2F0ZWdvcnlcbiAqIHdpdGhvdXQgYW4gYXV0aG9yZWQgY29sb3VyIHN0aWxsIGxhbmRzIHNvbWV3aGVyZSBzZW5zaWJsZSBhbmQgbGFuZHMgdGhlcmVcbiAqIGV2ZXJ5IHJ1biAoYGZhbGxiYWNrQ29sb3JGb3JgIGhhc2hlcyB0aGUgbmFtZSDigJQgc2FtZSBuYW1lLCBzYW1lIGNvbG91cikuXG4gKiBPa2FiZeKAk0l0bywgcGx1cyB0d28gZ3JleXMgZm9yIGxvbmcgdGFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEU6IHN0cmluZ1tdID0gW1xuICAnIzAwNzJCMicsXG4gICcjRTY5RjAwJyxcbiAgJyMwMDlFNzMnLFxuICAnI0NDNzlBNycsXG4gICcjNTZCNEU5JyxcbiAgJyNENTVFMDAnLFxuICAnI0YwRTQ0MicsXG4gICcjMDAwMDAwJyxcbiAgJyM3RjdGN0YnLFxuICAnI0JGQkZCRicsXG5dO1xuXG5pbnRlcmZhY2UgTXV0ZU9wdGlvbnMge1xuICAvKiogQWxwaGEgZm9yIHBvaW50cyB0aGF0IGFyZSBub3QgbXV0ZWQuIERlZmF1bHQgMS4gKi9cbiAgb3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIEFscGhhIGZvciBtdXRlZCBwb2ludHMuIERlZmF1bHQge0BsaW5rIERFRkFVTFRfTVVURURfT1BBQ0lUWX0uICovXG4gIG11dGVkT3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIGAxYCBhdCBpbmRleCBpIG11dGVzIG9ic2VydmF0aW9uIGkuIEFic2VudCDih5Igbm90aGluZyBpcyBtdXRlZC4gKi9cbiAgbXV0ZWQ/OiBVaW50OEFycmF5IHwgbnVsbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBlbmNvZGVDYXRlZ29yaWNhbH06IGEgY29sb3VyIHBlciBjYXRlZ29yeSwgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRW5jb2RpbmdPcHRpb25zIGV4dGVuZHMgTXV0ZU9wdGlvbnMge1xuICAvKiogUGVyLWNhdGVnb3J5IGAjcnJnZ2JiYCwgaW5kZXgtYWxpZ25lZCB3aXRoIHRoZSBjb2x1bW4ncyBjYXRlZ29yaWVzLiAqL1xuICBjb2xvcnM6IHN0cmluZ1tdO1xuICAvKiogQ29sb3VyIGZvciB7QGxpbmsgTk9fQ0FURUdPUll9LiBEZWZhdWx0IHtAbGluayBNSVNTSU5HX0NPTE9SfS4gKi9cbiAgbWlzc2luZ0NvbG9yPzogUmdiO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGVuY29kZUNvbnRpbnVvdXN9OiBhIGNvbG9ybWFwLCBhIGNvbnRyYXN0IHdpbmRvdyBhbmQgc2NhbGluZywgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMgZXh0ZW5kcyBNdXRlT3B0aW9ucyB7XG4gIC8qKiAyNTYtZW50cnkgUkdCIHRhYmxlIGZyb20ge0BsaW5rIGJ1aWxkQ29sb3JtYXBMdXR9LiAqL1xuICBsdXQ6IFJnYltdO1xuICAvKiogQ29udHJhc3Qgd2luZG93IGluIFZBTFVFIHVuaXRzIChwcmUtbG9nKS4gKi9cbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xuICAvKiogQXBwbHkgYGxvZzFwYCB0byB0aGUgdmFsdWUgYW5kIHRoZSB3aW5kb3cgYmVmb3JlIG5vcm1hbGlzaW5nLiAqL1xuICBsb2c/OiBib29sZWFuO1xuICAvKiogQ29sb3VyIGZvciBgTmFOYC4gRGVmYXVsdCB7QGxpbmsgTUlTU0lOR19DT0xPUn0uICovXG4gIG1pc3NpbmdDb2xvcj86IFJnYjtcbn1cblxuLyoqIFBhcnNlIGEgQ1NTIGNvbG91ciAoYCNyZ2JgIC8gYCNycmdnYmJgLCBzZWUge0BsaW5rIHBhcnNlQ3NzQ29sb3J9KSB0byAw4oCTMjU1IFJHQjsgdW5wYXJzZWFibGVcbiAqICBpbnB1dCBmYWxscyBiYWNrIHRvIGdyZXkuIEV4cG9ydGVkIHNvIHRoZSB0aWxlIGxheWVycyBwYXJzZSBwYWxldHRlcyBleGFjdGx5IGFzIHRoZSBtYXJrZXJzIGRvLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGV4KGhleDogc3RyaW5nKTogUmdiIHtcbiAgcmV0dXJuIHBhcnNlQ3NzQ29sb3IoaGV4KSA/PyBNSVNTSU5HX0NPTE9SO1xufVxuXG5mdW5jdGlvbiBhbHBoYUF0KGk6IG51bWJlciwgb3B0czogTXV0ZU9wdGlvbnMpOiBudW1iZXIge1xuICBjb25zdCBvbiA9IG9wdHMub3BhY2l0eSA/PyAxO1xuICBjb25zdCBvZmYgPSBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gIHJldHVybiBvcHRzLm11dGVkICYmIG9wdHMubXV0ZWRbaV0gPyBvZmYgOiBvbjtcbn1cblxuLyoqXG4gKiBQZXItY2F0ZWdvcnkgY29sb3VyczogdGhlIGNvbHVtbidzIGF1dGhvcmVkIGBjb2xvcnNgIHdoZXJlIHByZXNlbnQgKHNvIHRoZVxuICogdmlld2VyIG1hdGNoZXMgdGhlIGZpZ3VyZXMgdGhlIHNhbWUgYW5hbHlzaXMgcHJvZHVjZWQgZWxzZXdoZXJlKSwgb3RoZXJ3aXNlXG4gKiB0aGUgcGFsZXR0ZSBieSBwb3NpdGlvbiwgd3JhcHBpbmcgdGhyb3VnaCBhIG5hbWUtaGFzaCBwYXN0IGl0cyBlbmQgc28gYVxuICogNDAtY2x1c3RlciBjb2x1bW4gc3RpbGwgZ2V0cyBzdGFibGUsIGRpc3RpbmN0LWlzaCBjb2xvdXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKFxuICBtZXRhOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIHBhbGV0dGU6IHN0cmluZ1tdID0gREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhdXRob3JlZCA9IG1ldGEuY29sb3JzO1xuICByZXR1cm4gbWV0YS5jYXRlZ29yaWVzLm1hcCgobmFtZSwgaSkgPT4ge1xuICAgIGNvbnN0IGdpdmVuID0gYXV0aG9yZWQ/LltpXTtcbiAgICBpZiAoZ2l2ZW4pIHJldHVybiBnaXZlbjtcbiAgICBpZiAoaSA8IHBhbGV0dGUubGVuZ3RoKSByZXR1cm4gcGFsZXR0ZVtpXTtcbiAgICByZXR1cm4gZmFsbGJhY2tDb2xvckZvcihuYW1lLCBwYWxldHRlKTtcbiAgfSk7XG59XG5cbi8qKiBDYXRlZ29yaWNhbCBjb2x1bW4g4oaSIGZsYXQgcGVyLXBvaW50IFJHQkEgKGxlbmd0aCBgNCAqIGNvZGVzLmxlbmd0aGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUNhdGVnb3JpY2FsKGNvZGVzOiBVaW50MTZBcnJheSwgb3B0czogQ2F0ZWdvcmljYWxFbmNvZGluZ09wdGlvbnMpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBuID0gY29kZXMubGVuZ3RoO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG4gKiA0KTtcbiAgLy8gUmVzb2x2ZSBlYWNoIGNhdGVnb3J5IG9uY2Ug4oCUIHBhcnNpbmcgYSBoZXggc3RyaW5nIHBlciBwb2ludCB3b3VsZCBkb21pbmF0ZS5cbiAgY29uc3QgcmdiID0gb3B0cy5jb2xvcnMubWFwKHBhcnNlSGV4KTtcbiAgY29uc3QgbWlzc2luZyA9IG9wdHMubWlzc2luZ0NvbG9yID8/IE1JU1NJTkdfQ09MT1I7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IGNvZGVzW2ldO1xuICAgIGNvbnN0IGMgPSBjb2RlID09PSBOT19DQVRFR09SWSB8fCBjb2RlID49IHJnYi5sZW5ndGggPyBtaXNzaW5nIDogcmdiW2NvZGVdO1xuICAgIGNvbnN0IG8gPSBpICogNDtcbiAgICBvdXRbb10gPSBjWzBdIC8gMjU1O1xuICAgIG91dFtvICsgMV0gPSBjWzFdIC8gMjU1O1xuICAgIG91dFtvICsgMl0gPSBjWzJdIC8gMjU1O1xuICAgIC8vIEEgcG9pbnQgd2l0aCBubyBjYXRlZ29yeSBpcyBiYWNrZ3JvdW5kIGJ5IGRlZmluaXRpb24g4oCUIG5ldmVyIGVtcGhhc2lzZWQuXG4gICAgb3V0W28gKyAzXSA9XG4gICAgICBjb2RlID09PSBOT19DQVRFR09SWVxuICAgICAgICA/IE1hdGgubWluKGFscGhhQXQoaSwgb3B0cyksIG9wdHMubXV0ZWRPcGFjaXR5ID8/IERFRkFVTFRfTVVURURfT1BBQ0lUWSlcbiAgICAgICAgOiBhbHBoYUF0KGksIG9wdHMpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBDb250aW51b3VzIGNvbHVtbiAvIGdlbmUgdmVjdG9yIOKGkiBmbGF0IHBlci1wb2ludCBSR0JBLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUNvbnRpbnVvdXModmFsdWVzOiBGbG9hdDMyQXJyYXksIG9wdHM6IENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShuICogNCk7XG4gIGNvbnN0IG1pc3NpbmcgPSBvcHRzLm1pc3NpbmdDb2xvciA/PyBNSVNTSU5HX0NPTE9SO1xuICBjb25zdCBsdXQgPSBvcHRzLmx1dDtcbiAgY29uc3QgbG8gPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgb3B0cy5taW4pKSA6IG9wdHMubWluO1xuICBjb25zdCBoaSA9IG9wdHMubG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCBvcHRzLm1heCkpIDogb3B0cy5tYXg7XG4gIC8vIEEgZGVnZW5lcmF0ZSB3aW5kb3cgKGFsbCB2YWx1ZXMgZXF1YWwpIG1hcHMgZXZlcnl0aGluZyB0byB0aGUgTFVUIG1pZHBvaW50XG4gIC8vIHJhdGhlciB0aGFuIGRpdmlkaW5nIGJ5IHplcm8uXG4gIGNvbnN0IHNwYW4gPSBoaSAtIGxvO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHJhdyA9IHZhbHVlc1tpXTtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmF3KSkge1xuICAgICAgb3V0W29dID0gbWlzc2luZ1swXSAvIDI1NTtcbiAgICAgIG91dFtvICsgMV0gPSBtaXNzaW5nWzFdIC8gMjU1O1xuICAgICAgb3V0W28gKyAyXSA9IG1pc3NpbmdbMl0gLyAyNTU7XG4gICAgICBvdXRbbyArIDNdID0gb3B0cy5tdXRlZE9wYWNpdHkgPz8gREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHYgPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgcmF3KSkgOiByYXc7XG4gICAgY29uc3QgdCA9IHNwYW4gPiAwID8gKHYgLSBsbykgLyBzcGFuIDogMC41O1xuICAgIGNvbnN0IGlkeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0ICogMjU1KSkpO1xuICAgIGNvbnN0IGMgPSBsdXRbaWR4XSA/PyBtaXNzaW5nO1xuICAgIG91dFtvXSA9IGNbMF0gLyAyNTU7XG4gICAgb3V0W28gKyAxXSA9IGNbMV0gLyAyNTU7XG4gICAgb3V0W28gKyAyXSA9IGNbMl0gLyAyNTU7XG4gICAgb3V0W28gKyAzXSA9IGFscGhhQXQoaSwgb3B0cyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb250cmFzdCB3aW5kb3cgZnJvbSBwZXJjZW50aWxlcyBvZiB0aGUgZmluaXRlIHZhbHVlcyDigJQgdGhlIENvc014XG4gKiBcImNhcCBvdXRsaWVycyBhdCBwZXJjZW50aWxlcyB0byBpbXByb3ZlIGNvbnRyYXN0XCIgcnVsZS4gYGxvYC9gaGlgIGFyZVxuICogZnJhY3Rpb25zICgwLjAxIC8gMC45OSBjbGlwcyB0aGUgZXh0cmVtZSAxJSBhdCBlYWNoIGVuZCkuXG4gKlxuICogUmV0dXJucyBgWzAsIDFdYCBmb3IgYW4gZW1wdHkgb3IgYWxsLW1pc3NpbmcgdmVjdG9yIHNvIGNhbGxlcnMgYWx3YXlzIGdldCBhXG4gKiB1c2FibGUgd2luZG93LiBBIGxhcmdlIHZlY3RvciBpcyB3aW5kb3dlZCBmcm9tIGFuIGV2ZW4gc2FtcGxlIG9mIGl0IOKAlCBzZWVcbiAqIGBzcGF0aWFsL3N0YXRzLnRzYCDigJQgYmVjYXVzZSB0aGlzIHJ1bnMgb24gZXZlcnkgcmVjb2xvdXIsIGFuZCBzb3J0aW5nIG1pbGxpb25zXG4gKiBvZiB2YWx1ZXMgZWFjaCB0aW1lIGNvc3QgbW9zdCBvZiBhIHNlY29uZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0V2luZG93KHZhbHVlczogRmxvYXQzMkFycmF5LCBsbyA9IDAuMDEsIGhpID0gMC45OSk6IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gcGVyY2VudGlsZVdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG59XG5cbi8qKlxuICogTWFya2VyIHNpemVzIGZvciB0aGUgcG9pbnRzIGxheWVyLiBuYXBhcmktanMgYFBvaW50c0xheWVyLnNpemVgIGlzIGFcbiAqICoqZGlhbWV0ZXIqKiBpbiBkYXRhIHVuaXRzIHdoaWxlIGBTcGF0aWFsT2JzZXJ2YXRpb25zLnJhZGl1c2AgaXMgYSByYWRpdXMg4oCUXG4gKiB0aGUgZG91YmxpbmcgbGl2ZXMgaGVyZSBzbyBubyBjYWxsIHNpdGUgaGFzIHRvIHJlbWVtYmVyIGl0LlxuICpcbiAqIGBmYWxsYmFja1JhZGl1c2AgY292ZXJzIGEgZGF0YXNldCB0aGF0IGRlY2xhcmVzIG5vIHJhZGl1cyAoc2VnbWVudGVkIGNlbGxzXG4gKiBvZnRlbiBkb24ndCk7IGl0IGlzIGluIGltYWdlIHBpeGVscywgbGlrZSBldmVyeXRoaW5nIGVsc2UgaW4gdGhpcyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckRpYW1ldGVycyhvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIGZhbGxiYWNrUmFkaXVzID0gNCk6IG51bWJlciB8IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IHIgPSBvYnNlcnZhdGlvbnMucmFkaXVzO1xuICBpZiAodHlwZW9mIHIgPT09ICdudW1iZXInKSByZXR1cm4gciAqIDI7XG4gIGlmIChyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShyLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSByW2ldICogMjtcbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIHJldHVybiBmYWxsYmFja1JhZGl1cyAqIDI7XG59XG5cbi8qKiBDb252ZW5pZW5jZTogYSAyNTYtZW50cnkgTFVUIGZvciBhIGNvbG9ybWFwIHZhbHVlLCBmYWxsaW5nIGJhY2sgdG8gVmlyaWRpcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdXRGb3IoY29sb3JtYXBWYWx1ZTogdW5rbm93biwgcmV2ZXJzZSA9IGZhbHNlKTogUmdiW10ge1xuICByZXR1cm4gYnVpbGRDb2xvcm1hcEx1dChjb2xvcm1hcFZhbHVlLCByZXZlcnNlKSA/PyBidWlsZENvbG9ybWFwTHV0KCdWaXJpZGlzJywgcmV2ZXJzZSkhO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGV2ZXJ5IGVudHJ5IG9mIGEgTFVUIGlzIGEgbmV1dHJhbCBncmV5LiBUZXN0ZWQgb24gdGhlIFZBTFVFUyByYXRoZXJcbiAqICB0aGFuIHRoZSBjb2xvcm1hcCdzIG5hbWUsIHNvIGEgcmV2ZXJzZWQgb3IgcmVuYW1lZCBncmV5IHJhbXAgc3RpbGwgY291bnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR3JheXNjYWxlTHV0KGx1dDogcmVhZG9ubHkgUmdiW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGx1dC5ldmVyeSgoW3IsIGcsIGJdKSA9PiByID09PSBnICYmIGcgPT09IGIpO1xufVxuXG4vKipcbiAqIExVVCBmb3IgYSBzcGF0aWFsIENPTlRJTlVPVVMgZW5jb2Rpbmcg4oCUIGEgZ2VuZSwgYSBudW1lcmljIGNvbHVtbi5cbiAqXG4gKiBgb3ZlcnJpZGVgIGlzIHRoZSBjYWxsZXIncyBleHBsaWNpdCBjaG9pY2UgYW5kIHdpbnMgb3V0cmlnaHQsIGdyZXkgaW5jbHVkZWQ6IGFcbiAqIGdyZXkgcmFtcCBwaWNrZWQgRk9SIHRoZSBkYXRhIGlzIGEgZGVjaXNpb24sIG5vdCB0aGUgaW1hZ2UncyBjb2xvcm1hcCBsZWFraW5nXG4gKiBpbi5cbiAqXG4gKiBXaXRob3V0IG9uZSwgdGhlIGRpc3BsYXkgY29sb3JtYXAg4oCUIHVubGVzcyB0aGF0IGNvbG9ybWFwIGlzIGdyYXlzY2FsZS4gVGhlXG4gKiB0aXNzdWUgdW5kZXJuZWF0aCBpcyBncmF5c2NhbGUsIHNvIGEgZ3JleSBvdmVybGF5IG9mIGEgbWVhc3VyZW1lbnQgaXNcbiAqIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGFuYXRvbXkgaXQgaXMgZHJhd24gb3ZlciwgYW5kIHRoZSByZWFkZXIgY2Fubm90IHRlbGxcbiAqIHdoaWNoIGNoYW5uZWwgYSBicmlnaHQgcGl4ZWwgYmVsb25ncyB0by4gVmlyaWRpcyBpcyB0aGVuIHRoZSBmYWxsYmFjaywgd2hpY2ggaXNcbiAqIHdoYXQgdGhlIENvc014IGd1aWRhbmNlIHByZXNjcmliZXMgZm9yIGNvbnRpbnVvdXMgdmFsdWVzIGFueXdheS5cbiAqXG4gKiBTaGFyZWQgYnkgdGhlIG1hcmtlcnMsIGJvdGggZ2VuZSBtYXBzIGFuZCB0aGUgcGFuZWwncyBjb2xvdXIgYmFyLCBzbyBub25lIG9mXG4gKiB0aGVtIGNhbiBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLCB3aGljaGV2ZXIgd2F5IHRoZSBjaG9pY2UgZmFsbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF0aWFsQ29udGludW91c0x1dChcbiAgY29sb3JtYXBWYWx1ZTogdW5rbm93bixcbiAgcmV2ZXJzZSA9IGZhbHNlLFxuICBvdmVycmlkZT86IENvbG9ybWFwVmFsdWUgfCBudWxsLFxuKTogUmdiW10ge1xuICAvLyBBbiBpbmxpbmUgc2NhbGUgaXMgYW4gYXJyYXksIHNvIGVtcHRpbmVzcyBoYXMgdG8gYmUgY2hlY2tlZCBhcyB3ZWxsIGFzXG4gIC8vIHByZXNlbmNlOiBgW11gIGlzIHRydXRoeSBhbmQgd291bGQgcmVzb2x2ZSB0byB0aGUgZmFsbGJhY2sgTFVUIHNpbGVudGx5LlxuICBjb25zdCBjaG9zZW4gPSBBcnJheS5pc0FycmF5KG92ZXJyaWRlKSA/IChvdmVycmlkZS5sZW5ndGggPyBvdmVycmlkZSA6IG51bGwpIDogb3ZlcnJpZGU7XG4gIGlmIChjaG9zZW4pIHJldHVybiBsdXRGb3IoY2hvc2VuLCByZXZlcnNlKTtcbiAgY29uc3QgbHV0ID0gbHV0Rm9yKGNvbG9ybWFwVmFsdWUsIHJldmVyc2UpO1xuICByZXR1cm4gaXNHcmF5c2NhbGVMdXQobHV0KSA/IGJ1aWxkQ29sb3JtYXBMdXQoJ1ZpcmlkaXMnLCByZXZlcnNlKSEgOiBsdXQ7XG59XG4iXX0=
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQXlCLFdBQVcsRUFBdUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUVoSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUE0QjNDLGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWxELHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUFFMUM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBYTtJQUNuRCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0NBQ1YsQ0FBQztBQWdDRjtzR0FDc0c7QUFDdEcsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFXO0lBQ2xDLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBUyxFQUFFLElBQWlCO0lBQzNDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUkscUJBQXFCLENB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RixJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJnYiwgYnVpbGRDb2xvcm1hcEx1dCB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgcGFyc2VDc3NDb2xvciB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcic7XG5pbXBvcnQgeyBmYWxsYmFja0NvbG9yRm9yIH0gZnJvbSAnLi4vc3RvcmUvY2xhc3MtY29sb3IudXRpbCc7XG5pbXBvcnQgeyBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIE5PX0NBVEVHT1JZLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcFZhbHVlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgcGVyY2VudGlsZVdpbmRvdyB9IGZyb20gJy4vc3RhdHMnO1xuXG4vKipcbiAqIFR1cm5pbmcgc3BhdGlhbC1vbWljcyBjb2x1bW5zIGludG8gcGVyLXBvaW50IHZpc3VhbCBhdHRyaWJ1dGVzLlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIHJlbmRlcmVyIOKAlCBsaWtlIGBwbG90bHktdHJhY2UtYnVpbGRlcnMudHNgLCBzb1xuICogdGhlIGVuY29kaW5ncyBhcmUgdGVzdGFibGUgb24gdGhlaXIgb3duIGFuZCBzaGFyZWQgYnkgYW55IGJhY2tlbmQgdGhhdCBncm93c1xuICogYSBzcGF0aWFsIG1vZGUuXG4gKlxuICogVGhlIHJ1bGVzIGhlcmUgYXJlIHRoZSBvbmVzIHRoZSBDb3NNeCBhbmFseXNpcyBndWlkYW5jZSBwcmVzY3JpYmVzLCBtYWRlXG4gKiBleHBsaWNpdCByYXRoZXIgdGhhbiBsZWZ0IHRvIGVhY2ggY2FsbCBzaXRlOlxuICogIC0gY291bnQtbGlrZSBjb2x1bW5zIHJlYWQgb24gYSAqKmxvZyoqIHNjYWxlIChsaW5lYXIgY29sbGFwc2VzIHRoZW0gYWdhaW5zdCBhXG4gKiAgICBmZXcgYnJpZ2h0IG91dGxpZXJzKTtcbiAqICAtIGNvbnRyYXN0IHdpbmRvd3MgY29tZSBmcm9tICoqcGVyY2VudGlsZXMqKiwgbm90IG1pbi9tYXgsIHNvIGEgc2luZ2xlXG4gKiAgICBzYXR1cmF0ZWQgc3BvdCBkb2Vzbid0IGZsYXR0ZW4gZXZlcnl0aGluZyBlbHNlO1xuICogIC0gY29udGV4dCBpcyBrZXB0IGJ5ICoqbXV0aW5nKiogcmF0aGVyIHRoYW4gaGlkaW5nIOKAlCBiYWNrZ3JvdW5kIHBvaW50cyBzdGF5XG4gKiAgICB2aXNpYmxlIGF0IGxvdyBhbHBoYSBzbyB0aGUgdGlzc3VlIHNoYXBlIHN1cnZpdmVzLlxuICpcbiAqIENPTE9VUiBSRVBSRVNFTlRBVElPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFdmVyeXRoaW5nIGlzIGEgZmxhdCBgRmxvYXQzMkFycmF5YCBvZiBgW3IsZyxiLGEsIOKApl1gIGluIDAuLjEg4oCUIG9uZVxuICogYWxsb2NhdGlvbiBmb3IgTiBwb2ludHMsIEdQVS11cGxvYWQgc2hhcGVkLiBuYXBhcmktanMgKOKJpSAwLjE1KVxuICogYFBvaW50c0xheWVyLmZhY2VDb2xvcmAgYW5kIGBQb2ludHMzRExheWVyLmNvbG9yc2AgdGFrZSBpdCBhcyBpcy5cbiAqL1xuXG4vKiogT25lIFJHQkEgY29sb3VyLCByLCBnLCBiLCBhIGluIDAuLjEgKG5hcGFyaS1qcydzIGJyb2FkY2FzdCBjb2xvdXIpLiAqL1xuZXhwb3J0IHR5cGUgUkdCQSA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogTmV1dHJhbCBncmV5IGZvciBvYnNlcnZhdGlvbnMgd2l0aCBubyB2YWx1ZSAoTmFOLCBvciB7QGxpbmsgTk9fQ0FURUdPUll9KS4gKi9cbmV4cG9ydCBjb25zdCBNSVNTSU5HX0NPTE9SOiBSZ2IgPSBbMTUwLCAxNTAsIDE1MF07XG5cbi8qKiBEZWZhdWx0IGFscGhhIGZvciBtdXRlZCAoYmFja2dyb3VuZCAvIHVuc2VsZWN0ZWQpIHBvaW50cyDigJQgQ29zTXgtc3R5bGUgY29udGV4dC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01VVEVEX09QQUNJVFkgPSAwLjE1O1xuXG4vKipcbiAqIEZhbGxiYWNrIGNhdGVnb3JpY2FsIHBhbGV0dGUuIENvbG91ci1ibGluZC1zYWZlIGFuZCBzdGFibGUsIHNvIGEgY2F0ZWdvcnlcbiAqIHdpdGhvdXQgYW4gYXV0aG9yZWQgY29sb3VyIHN0aWxsIGxhbmRzIHNvbWV3aGVyZSBzZW5zaWJsZSBhbmQgbGFuZHMgdGhlcmVcbiAqIGV2ZXJ5IHJ1biAoYGZhbGxiYWNrQ29sb3JGb3JgIGhhc2hlcyB0aGUgbmFtZSDigJQgc2FtZSBuYW1lLCBzYW1lIGNvbG91cikuXG4gKiBPa2FiZeKAk0l0bywgcGx1cyB0d28gZ3JleXMgZm9yIGxvbmcgdGFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEU6IHN0cmluZ1tdID0gW1xuICAnIzAwNzJCMicsXG4gICcjRTY5RjAwJyxcbiAgJyMwMDlFNzMnLFxuICAnI0NDNzlBNycsXG4gICcjNTZCNEU5JyxcbiAgJyNENTVFMDAnLFxuICAnI0YwRTQ0MicsXG4gICcjMDAwMDAwJyxcbiAgJyM3RjdGN0YnLFxuICAnI0JGQkZCRicsXG5dO1xuXG5pbnRlcmZhY2UgTXV0ZU9wdGlvbnMge1xuICAvKiogQWxwaGEgZm9yIHBvaW50cyB0aGF0IGFyZSBub3QgbXV0ZWQuIERlZmF1bHQgMS4gKi9cbiAgb3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIEFscGhhIGZvciBtdXRlZCBwb2ludHMuIERlZmF1bHQge0BsaW5rIERFRkFVTFRfTVVURURfT1BBQ0lUWX0uICovXG4gIG11dGVkT3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIGAxYCBhdCBpbmRleCBpIG11dGVzIG9ic2VydmF0aW9uIGkuIEFic2VudCDih5Igbm90aGluZyBpcyBtdXRlZC4gKi9cbiAgbXV0ZWQ/OiBVaW50OEFycmF5IHwgbnVsbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBlbmNvZGVDYXRlZ29yaWNhbH06IGEgY29sb3VyIHBlciBjYXRlZ29yeSwgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRW5jb2RpbmdPcHRpb25zIGV4dGVuZHMgTXV0ZU9wdGlvbnMge1xuICAvKiogUGVyLWNhdGVnb3J5IGAjcnJnZ2JiYCwgaW5kZXgtYWxpZ25lZCB3aXRoIHRoZSBjb2x1bW4ncyBjYXRlZ29yaWVzLiAqL1xuICBjb2xvcnM6IHN0cmluZ1tdO1xuICAvKiogQ29sb3VyIGZvciB7QGxpbmsgTk9fQ0FURUdPUll9LiBEZWZhdWx0IHtAbGluayBNSVNTSU5HX0NPTE9SfS4gKi9cbiAgbWlzc2luZ0NvbG9yPzogUmdiO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGVuY29kZUNvbnRpbnVvdXN9OiBhIGNvbG9ybWFwLCBhIGNvbnRyYXN0IHdpbmRvdyBhbmQgc2NhbGluZywgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMgZXh0ZW5kcyBNdXRlT3B0aW9ucyB7XG4gIC8qKiAyNTYtZW50cnkgUkdCIHRhYmxlIGZyb20ge0BsaW5rIGJ1aWxkQ29sb3JtYXBMdXR9LiAqL1xuICBsdXQ6IFJnYltdO1xuICAvKiogQ29udHJhc3Qgd2luZG93IGluIFZBTFVFIHVuaXRzIChwcmUtbG9nKS4gKi9cbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xuICAvKiogQXBwbHkgYGxvZzFwYCB0byB0aGUgdmFsdWUgYW5kIHRoZSB3aW5kb3cgYmVmb3JlIG5vcm1hbGlzaW5nLiAqL1xuICBsb2c/OiBib29sZWFuO1xuICAvKiogQ29sb3VyIGZvciBgTmFOYC4gRGVmYXVsdCB7QGxpbmsgTUlTU0lOR19DT0xPUn0uICovXG4gIG1pc3NpbmdDb2xvcj86IFJnYjtcbn1cblxuLyoqIFBhcnNlIGEgQ1NTIGNvbG91ciAoYCNyZ2JgIC8gYCNycmdnYmJgLCBzZWUge0BsaW5rIHBhcnNlQ3NzQ29sb3J9KSB0byAw4oCTMjU1IFJHQjsgdW5wYXJzZWFibGVcbiAqICBpbnB1dCBmYWxscyBiYWNrIHRvIGdyZXkuIEV4cG9ydGVkIHNvIHRoZSB0aWxlIGxheWVycyBwYXJzZSBwYWxldHRlcyBleGFjdGx5IGFzIHRoZSBtYXJrZXJzIGRvLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGV4KGhleDogc3RyaW5nKTogUmdiIHtcbiAgcmV0dXJuIHBhcnNlQ3NzQ29sb3IoaGV4KSA/PyBNSVNTSU5HX0NPTE9SO1xufVxuXG5mdW5jdGlvbiBhbHBoYUF0KGk6IG51bWJlciwgb3B0czogTXV0ZU9wdGlvbnMpOiBudW1iZXIge1xuICBjb25zdCBvbiA9IG9wdHMub3BhY2l0eSA/PyAxO1xuICBjb25zdCBvZmYgPSBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gIHJldHVybiBvcHRzLm11dGVkICYmIG9wdHMubXV0ZWRbaV0gPyBvZmYgOiBvbjtcbn1cblxuLyoqXG4gKiBQZXItY2F0ZWdvcnkgY29sb3VyczogdGhlIGNvbHVtbidzIGF1dGhvcmVkIGBjb2xvcnNgIHdoZXJlIHByZXNlbnQgKHNvIHRoZVxuICogdmlld2VyIG1hdGNoZXMgdGhlIGZpZ3VyZXMgdGhlIHNhbWUgYW5hbHlzaXMgcHJvZHVjZWQgZWxzZXdoZXJlKSwgb3RoZXJ3aXNlXG4gKiB0aGUgcGFsZXR0ZSBieSBwb3NpdGlvbiwgd3JhcHBpbmcgdGhyb3VnaCBhIG5hbWUtaGFzaCBwYXN0IGl0cyBlbmQgc28gYVxuICogNDAtY2x1c3RlciBjb2x1bW4gc3RpbGwgZ2V0cyBzdGFibGUsIGRpc3RpbmN0LWlzaCBjb2xvdXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKFxuICBtZXRhOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIHBhbGV0dGU6IHN0cmluZ1tdID0gREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhdXRob3JlZCA9IG1ldGEuY29sb3JzO1xuICByZXR1cm4gbWV0YS5jYXRlZ29yaWVzLm1hcCgobmFtZSwgaSkgPT4ge1xuICAgIGNvbnN0IGdpdmVuID0gYXV0aG9yZWQ/LltpXTtcbiAgICBpZiAoZ2l2ZW4pIHJldHVybiBnaXZlbjtcbiAgICBpZiAoaSA8IHBhbGV0dGUubGVuZ3RoKSByZXR1cm4gcGFsZXR0ZVtpXTtcbiAgICByZXR1cm4gZmFsbGJhY2tDb2xvckZvcihuYW1lLCBwYWxldHRlKTtcbiAgfSk7XG59XG5cbi8qKiBUaGUgdXNlcidzIGdyb3VwIGNvbG91cnM6IGJ5IGNvbHVtbiBuYW1lLCB0aGVuIGNhdGVnb3J5IChzZWUgYFNwYXRpYWxWaWV3U3RhdGUuZ3JvdXBDb2xvcnNgKS4gKi9cbmV4cG9ydCB0eXBlIEdyb3VwQ29sb3JPdmVycmlkZXMgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj4+O1xuXG4vKipcbiAqIENhdGVnb3JpY2FsIGNvbHVtbiBgY29sdW1uYCdzIGNvbG91cnMgKHtAbGluayByZXNvbHZlQ2F0ZWdvcnlDb2xvcnN9KSB3aXRoIHRoZSB1c2VyJ3MgY2hvaWNlc1xuICogZm9yIGl0cyBncm91cHMgb3ZlciB0aGVtLiBFdmVyeSBwbGFjZSBhIGdyb3VwaW5nIGlzIGNvbG91cmVkIGdvZXMgdGhyb3VnaCB0aGlzLCBzbyBhIGdyb3VwXG4gKiByZWNvbG91cmVkIGluIHRoZSBsaXN0IGlzIHRoYXQgY29sb3VyIG9uIHRoZSBjZWxscywgdGhlIG1hcmtlcnMsIHRoZSBsZWdlbmQgYW5kIHRoZSBjaGFydHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeUNvbG9yc0ZvcihcbiAgY29sdW1uOiBzdHJpbmcsXG4gIG1ldGE6IENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgb3ZlcnJpZGVzPzogR3JvdXBDb2xvck92ZXJyaWRlcyB8IG51bGwsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGJhc2UgPSByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMobWV0YSk7XG4gIGNvbnN0IG93biA9IG92ZXJyaWRlcz8uW2NvbHVtbl07XG4gIGlmICghb3duKSByZXR1cm4gYmFzZTtcbiAgcmV0dXJuIG1ldGEuY2F0ZWdvcmllcy5tYXAoKG5hbWUsIGkpID0+IG93bltuYW1lXSB8fCBiYXNlW2ldKTtcbn1cblxuLyoqIFdoYXQgYSBjYWNoZSBrZXllZCBvbiBhIGdyb3VwaW5nJ3MgY29sb3VycyBtdXN0IGluY2x1ZGUgb2YgdGhlIHVzZXIncyBjaG9pY2VzIGZvciBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cENvbG9yc0tleShjb2x1bW46IHN0cmluZyB8IG51bGwsIG92ZXJyaWRlcz86IEdyb3VwQ29sb3JPdmVycmlkZXMgfCBudWxsKTogc3RyaW5nIHtcbiAgY29uc3Qgb3duID0gY29sdW1uID8gb3ZlcnJpZGVzPy5bY29sdW1uXSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG93biA/IEpTT04uc3RyaW5naWZ5KG93bikgOiAnJztcbn1cblxuLyoqIENhdGVnb3JpY2FsIGNvbHVtbiDihpIgZmxhdCBwZXItcG9pbnQgUkdCQSAobGVuZ3RoIGA0ICogY29kZXMubGVuZ3RoYCkuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQ2F0ZWdvcmljYWwoY29kZXM6IFVpbnQxNkFycmF5LCBvcHRzOiBDYXRlZ29yaWNhbEVuY29kaW5nT3B0aW9ucyk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IG4gPSBjb2Rlcy5sZW5ndGg7XG4gIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIDQpO1xuICAvLyBSZXNvbHZlIGVhY2ggY2F0ZWdvcnkgb25jZSDigJQgcGFyc2luZyBhIGhleCBzdHJpbmcgcGVyIHBvaW50IHdvdWxkIGRvbWluYXRlLlxuICBjb25zdCByZ2IgPSBvcHRzLmNvbG9ycy5tYXAocGFyc2VIZXgpO1xuICBjb25zdCBtaXNzaW5nID0gb3B0cy5taXNzaW5nQ29sb3IgPz8gTUlTU0lOR19DT0xPUjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCBjb2RlID0gY29kZXNbaV07XG4gICAgY29uc3QgYyA9IGNvZGUgPT09IE5PX0NBVEVHT1JZIHx8IGNvZGUgPj0gcmdiLmxlbmd0aCA/IG1pc3NpbmcgOiByZ2JbY29kZV07XG4gICAgY29uc3QgbyA9IGkgKiA0O1xuICAgIG91dFtvXSA9IGNbMF0gLyAyNTU7XG4gICAgb3V0W28gKyAxXSA9IGNbMV0gLyAyNTU7XG4gICAgb3V0W28gKyAyXSA9IGNbMl0gLyAyNTU7XG4gICAgLy8gQSBwb2ludCB3aXRoIG5vIGNhdGVnb3J5IGlzIGJhY2tncm91bmQgYnkgZGVmaW5pdGlvbiDigJQgbmV2ZXIgZW1waGFzaXNlZC5cbiAgICBvdXRbbyArIDNdID1cbiAgICAgIGNvZGUgPT09IE5PX0NBVEVHT1JZXG4gICAgICAgID8gTWF0aC5taW4oYWxwaGFBdChpLCBvcHRzKSwgb3B0cy5tdXRlZE9wYWNpdHkgPz8gREVGQVVMVF9NVVRFRF9PUEFDSVRZKVxuICAgICAgICA6IGFscGhhQXQoaSwgb3B0cyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIENvbnRpbnVvdXMgY29sdW1uIC8gZ2VuZSB2ZWN0b3Ig4oaSIGZsYXQgcGVyLXBvaW50IFJHQkEuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQ29udGludW91cyh2YWx1ZXM6IEZsb2F0MzJBcnJheSwgb3B0czogQ29udGludW91c0VuY29kaW5nT3B0aW9ucyk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG4gKiA0KTtcbiAgY29uc3QgbWlzc2luZyA9IG9wdHMubWlzc2luZ0NvbG9yID8/IE1JU1NJTkdfQ09MT1I7XG4gIGNvbnN0IGx1dCA9IG9wdHMubHV0O1xuICBjb25zdCBsbyA9IG9wdHMubG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCBvcHRzLm1pbikpIDogb3B0cy5taW47XG4gIGNvbnN0IGhpID0gb3B0cy5sb2cgPyBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIG9wdHMubWF4KSkgOiBvcHRzLm1heDtcbiAgLy8gQSBkZWdlbmVyYXRlIHdpbmRvdyAoYWxsIHZhbHVlcyBlcXVhbCkgbWFwcyBldmVyeXRoaW5nIHRvIHRoZSBMVVQgbWlkcG9pbnRcbiAgLy8gcmF0aGVyIHRoYW4gZGl2aWRpbmcgYnkgemVyby5cbiAgY29uc3Qgc3BhbiA9IGhpIC0gbG87XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgcmF3ID0gdmFsdWVzW2ldO1xuICAgIGNvbnN0IG8gPSBpICogNDtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyYXcpKSB7XG4gICAgICBvdXRbb10gPSBtaXNzaW5nWzBdIC8gMjU1O1xuICAgICAgb3V0W28gKyAxXSA9IG1pc3NpbmdbMV0gLyAyNTU7XG4gICAgICBvdXRbbyArIDJdID0gbWlzc2luZ1syXSAvIDI1NTtcbiAgICAgIG91dFtvICsgM10gPSBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdiA9IG9wdHMubG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCByYXcpKSA6IHJhdztcbiAgICBjb25zdCB0ID0gc3BhbiA+IDAgPyAodiAtIGxvKSAvIHNwYW4gOiAwLjU7XG4gICAgY29uc3QgaWR4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHQgKiAyNTUpKSk7XG4gICAgY29uc3QgYyA9IGx1dFtpZHhdID8/IG1pc3Npbmc7XG4gICAgb3V0W29dID0gY1swXSAvIDI1NTtcbiAgICBvdXRbbyArIDFdID0gY1sxXSAvIDI1NTtcbiAgICBvdXRbbyArIDJdID0gY1syXSAvIDI1NTtcbiAgICBvdXRbbyArIDNdID0gYWxwaGFBdChpLCBvcHRzKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvbnRyYXN0IHdpbmRvdyBmcm9tIHBlcmNlbnRpbGVzIG9mIHRoZSBmaW5pdGUgdmFsdWVzIOKAlCB0aGUgQ29zTXhcbiAqIFwiY2FwIG91dGxpZXJzIGF0IHBlcmNlbnRpbGVzIHRvIGltcHJvdmUgY29udHJhc3RcIiBydWxlLiBgbG9gL2BoaWAgYXJlXG4gKiBmcmFjdGlvbnMgKDAuMDEgLyAwLjk5IGNsaXBzIHRoZSBleHRyZW1lIDElIGF0IGVhY2ggZW5kKS5cbiAqXG4gKiBSZXR1cm5zIGBbMCwgMV1gIGZvciBhbiBlbXB0eSBvciBhbGwtbWlzc2luZyB2ZWN0b3Igc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAqIHVzYWJsZSB3aW5kb3cuIEEgbGFyZ2UgdmVjdG9yIGlzIHdpbmRvd2VkIGZyb20gYW4gZXZlbiBzYW1wbGUgb2YgaXQg4oCUIHNlZVxuICogYHNwYXRpYWwvc3RhdHMudHNgIOKAlCBiZWNhdXNlIHRoaXMgcnVucyBvbiBldmVyeSByZWNvbG91ciwgYW5kIHNvcnRpbmcgbWlsbGlvbnNcbiAqIG9mIHZhbHVlcyBlYWNoIHRpbWUgY29zdCBtb3N0IG9mIGEgc2Vjb25kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJhc3RXaW5kb3codmFsdWVzOiBGbG9hdDMyQXJyYXksIGxvID0gMC4wMSwgaGkgPSAwLjk5KTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBwZXJjZW50aWxlV2luZG93KHZhbHVlcywgbG8sIGhpKTtcbn1cblxuLyoqXG4gKiBNYXJrZXIgc2l6ZXMgZm9yIHRoZSBwb2ludHMgbGF5ZXIuIG5hcGFyaS1qcyBgUG9pbnRzTGF5ZXIuc2l6ZWAgaXMgYVxuICogKipkaWFtZXRlcioqIGluIGRhdGEgdW5pdHMgd2hpbGUgYFNwYXRpYWxPYnNlcnZhdGlvbnMucmFkaXVzYCBpcyBhIHJhZGl1cyDigJRcbiAqIHRoZSBkb3VibGluZyBsaXZlcyBoZXJlIHNvIG5vIGNhbGwgc2l0ZSBoYXMgdG8gcmVtZW1iZXIgaXQuXG4gKlxuICogYGZhbGxiYWNrUmFkaXVzYCBjb3ZlcnMgYSBkYXRhc2V0IHRoYXQgZGVjbGFyZXMgbm8gcmFkaXVzIChzZWdtZW50ZWQgY2VsbHNcbiAqIG9mdGVuIGRvbid0KTsgaXQgaXMgaW4gaW1hZ2UgcGl4ZWxzLCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGlzIHNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyRGlhbWV0ZXJzKG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucywgZmFsbGJhY2tSYWRpdXMgPSA0KTogbnVtYmVyIHwgRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgciA9IG9ic2VydmF0aW9ucy5yYWRpdXM7XG4gIGlmICh0eXBlb2YgciA9PT0gJ251bWJlcicpIHJldHVybiByICogMjtcbiAgaWYgKHIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KHIubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIG91dFtpXSA9IHJbaV0gKiAyO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrUmFkaXVzICogMjtcbn1cblxuLyoqIENvbnZlbmllbmNlOiBhIDI1Ni1lbnRyeSBMVVQgZm9yIGEgY29sb3JtYXAgdmFsdWUsIGZhbGxpbmcgYmFjayB0byBWaXJpZGlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx1dEZvcihjb2xvcm1hcFZhbHVlOiB1bmtub3duLCByZXZlcnNlID0gZmFsc2UpOiBSZ2JbXSB7XG4gIHJldHVybiBidWlsZENvbG9ybWFwTHV0KGNvbG9ybWFwVmFsdWUsIHJldmVyc2UpID8/IGJ1aWxkQ29sb3JtYXBMdXQoJ1ZpcmlkaXMnLCByZXZlcnNlKSE7XG59XG5cbi8qKiBUcnVlIHdoZW4gZXZlcnkgZW50cnkgb2YgYSBMVVQgaXMgYSBuZXV0cmFsIGdyZXkuIFRlc3RlZCBvbiB0aGUgVkFMVUVTIHJhdGhlclxuICogIHRoYW4gdGhlIGNvbG9ybWFwJ3MgbmFtZSwgc28gYSByZXZlcnNlZCBvciByZW5hbWVkIGdyZXkgcmFtcCBzdGlsbCBjb3VudHMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmF5c2NhbGVMdXQobHV0OiByZWFkb25seSBSZ2JbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbHV0LmV2ZXJ5KChbciwgZywgYl0pID0+IHIgPT09IGcgJiYgZyA9PT0gYik7XG59XG5cbi8qKlxuICogTFVUIGZvciBhIHNwYXRpYWwgQ09OVElOVU9VUyBlbmNvZGluZyDigJQgYSBnZW5lLCBhIG51bWVyaWMgY29sdW1uLlxuICpcbiAqIGBvdmVycmlkZWAgaXMgdGhlIGNhbGxlcidzIGV4cGxpY2l0IGNob2ljZSBhbmQgd2lucyBvdXRyaWdodCwgZ3JleSBpbmNsdWRlZDogYVxuICogZ3JleSByYW1wIHBpY2tlZCBGT1IgdGhlIGRhdGEgaXMgYSBkZWNpc2lvbiwgbm90IHRoZSBpbWFnZSdzIGNvbG9ybWFwIGxlYWtpbmdcbiAqIGluLlxuICpcbiAqIFdpdGhvdXQgb25lLCB0aGUgZGlzcGxheSBjb2xvcm1hcCDigJQgdW5sZXNzIHRoYXQgY29sb3JtYXAgaXMgZ3JheXNjYWxlLiBUaGVcbiAqIHRpc3N1ZSB1bmRlcm5lYXRoIGlzIGdyYXlzY2FsZSwgc28gYSBncmV5IG92ZXJsYXkgb2YgYSBtZWFzdXJlbWVudCBpc1xuICogaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgYW5hdG9teSBpdCBpcyBkcmF3biBvdmVyLCBhbmQgdGhlIHJlYWRlciBjYW5ub3QgdGVsbFxuICogd2hpY2ggY2hhbm5lbCBhIGJyaWdodCBwaXhlbCBiZWxvbmdzIHRvLiBWaXJpZGlzIGlzIHRoZW4gdGhlIGZhbGxiYWNrLCB3aGljaCBpc1xuICogd2hhdCB0aGUgQ29zTXggZ3VpZGFuY2UgcHJlc2NyaWJlcyBmb3IgY29udGludW91cyB2YWx1ZXMgYW55d2F5LlxuICpcbiAqIFNoYXJlZCBieSB0aGUgbWFya2VycywgYm90aCBnZW5lIG1hcHMgYW5kIHRoZSBwYW5lbCdzIGNvbG91ciBiYXIsIHNvIG5vbmUgb2ZcbiAqIHRoZW0gY2FuIGRpc2FncmVlIGFib3V0IHdoYXQgYSBjb2xvdXIgbWVhbnMsIHdoaWNoZXZlciB3YXkgdGhlIGNob2ljZSBmYWxscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXRpYWxDb250aW51b3VzTHV0KFxuICBjb2xvcm1hcFZhbHVlOiB1bmtub3duLFxuICByZXZlcnNlID0gZmFsc2UsXG4gIG92ZXJyaWRlPzogQ29sb3JtYXBWYWx1ZSB8IG51bGwsXG4pOiBSZ2JbXSB7XG4gIC8vIEFuIGlubGluZSBzY2FsZSBpcyBhbiBhcnJheSwgc28gZW1wdGluZXNzIGhhcyB0byBiZSBjaGVja2VkIGFzIHdlbGwgYXNcbiAgLy8gcHJlc2VuY2U6IGBbXWAgaXMgdHJ1dGh5IGFuZCB3b3VsZCByZXNvbHZlIHRvIHRoZSBmYWxsYmFjayBMVVQgc2lsZW50bHkuXG4gIGNvbnN0IGNob3NlbiA9IEFycmF5LmlzQXJyYXkob3ZlcnJpZGUpID8gKG92ZXJyaWRlLmxlbmd0aCA/IG92ZXJyaWRlIDogbnVsbCkgOiBvdmVycmlkZTtcbiAgaWYgKGNob3NlbikgcmV0dXJuIGx1dEZvcihjaG9zZW4sIHJldmVyc2UpO1xuICBjb25zdCBsdXQgPSBsdXRGb3IoY29sb3JtYXBWYWx1ZSwgcmV2ZXJzZSk7XG4gIHJldHVybiBpc0dyYXlzY2FsZUx1dChsdXQpID8gYnVpbGRDb2xvcm1hcEx1dCgnVmlyaWRpcycsIHJldmVyc2UpISA6IGx1dDtcbn1cbiJdfQ==