@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
@@ -268,6 +268,8 @@ export class SpatialChartsComponent {
268
268
  .pipe(takeUntilDestroyed(this.destroyRef))
269
269
  .subscribe(([view, selection]) => {
270
270
  const sourceChanged = view.colorBy?.kind !== this.view.colorBy?.kind || view.colorBy?.name !== this.view.colorBy?.name;
271
+ // A group recoloured in the Cells panel: the categories are fetched again in their new colours.
272
+ const groupColorsChanged = this.primed && JSON.stringify(view.groupColors) !== JSON.stringify(this.view.groupColors);
271
273
  this.view = view;
272
274
  this.colorBy = view.colorBy;
273
275
  this.selection = selection;
@@ -276,9 +278,11 @@ export class SpatialChartsComponent {
276
278
  // needs its vector fetched first. The FIRST emission always reloads:
277
279
  // otherwise `null -> null` reads as "unchanged" and the component sits
278
280
  // with no data and no explanation until something else moves.
279
- if (!this.primed || sourceChanged) {
281
+ if (!this.primed || sourceChanged || groupColorsChanged) {
280
282
  this.primed = true;
281
283
  void this.reload();
284
+ if (groupColorsChanged && this.groupBy)
285
+ void this.onGroupBy(this.groupBy);
282
286
  }
283
287
  else {
284
288
  // A selection or log-scale change needs only a redraw of the same vector.
@@ -770,4 +774,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
770
774
  }] }], propDecorators: { active: [{
771
775
  type: Input
772
776
  }] } });
773
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jaGFydHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsLWNvbnRyb2xzL3NwYXRpYWwtY2hhcnRzL3NwYXRpYWwtY2hhcnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNoYXJ0cy9zcGF0aWFsLWNoYXJ0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVyQyxPQUFPLEVBQUUsVUFBVSxFQUFpQyxNQUFNLHFDQUFxQyxDQUFDO0FBRWhHLE9BQU8sRUFBb0Msb0JBQW9CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RyxPQUFPLEVBQXdCLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RyxPQUFPLEVBQWlCLGFB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QUFPLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDM0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7U0FDNUQsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDOzhHQTVzQlUsc0JBQXNCLGtCQXlMYixVQUFVO2tHQXpMbkIsc0JBQXNCLHdHQ3hIbkMsMjVJQWlIQSxvbURETkksWUFBWSxpV0FDWixXQUFXLDhWQUNYLGNBQWMsdXRDQUNkLGtCQUFrQix3VkFDbEIsYUFBYSxzWEFDYiwrQkFBK0IsMktBQy9CLGlDQUFpQywyUkFDakMsMkJBQTJCOzsyRkFNbEIsc0JBQXNCO2tCQWpCbEMsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLCtCQUErQjt3QkFDL0IsaUNBQWlDO3dCQUNqQywyQkFBMkI7cUJBQzVCLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNOzswQkEyTGxDLE1BQU07MkJBQUMsVUFBVTt5Q0FsTGpCLE1BQU07c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIGluamVjdCxcbiAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1hcmtGb3JDaGVja0luWm9uZSB9IGZyb20gJy4uLy4uL3V0aWwvbWFyay1mb3ItY2hlY2snO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0YnV0dG9uJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBWSVNVQUxJWkVSLCBJVmlzdWFsaXplciwgSVNwYXRpYWxDb250cm9scyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxFbWJlZGRpbmdNZXRhIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsQ29sb3JCeSwgU3BhdGlhbFZpZXdTdGF0ZSwgREVGQVVMVF9TUEFUSUFMX1ZJRVcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uTWFzaywgZW1wdHlTZWxlY3Rpb24sIG1hc2tUb0luZGljZXMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IEhlYXRtYXBNYXRyaXgsIGNlbGxzQXNHcm91cHMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtaGVhdG1hcCc7XG5pbXBvcnQgeyBjb21wdXRlSGVhdG1hcE1hdHJpeEFzeW5jIH0gZnJvbSAnLi4vLi4vd29ya2Vycy9zcGF0aWFsLW1hdGgnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuaW1wb3J0IHtcbiAgQlJPV1NFUl9UU05FX01BWF9PQlNFUlZBVElPTlMsXG4gIEVtYmVkZGluZ0NvbXB1dGVDb29yZGluYXRvcixcbiAgRW1iZWRkaW5nQ29tcHV0ZVN0YXRlLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL2VtYmVkZGluZy1jb21wdXRlLWNvb3JkaW5hdG9yJztcbmltcG9ydCB7IENoYXJ0RGF0YU1vZGVsIH0gZnJvbSAnLi9jaGFydC1kYXRhLW1vZGVsJztcbmltcG9ydCB7IEVNQkVERElOR19DT05GSUcsIFBsb3RseUNoYXJ0SG9zdCB9IGZyb20gJy4vcGxvdGx5LWNoYXJ0LWhvc3QnO1xuaW1wb3J0IHsgQ2hhcnRLaW5kT3B0aW9uLCBjaGFydEtpbmRPcHRpb25zLCBlbWJlZGRpbmdOb3RlLCBoZWF0bWFwTm90ZSwga2luZEhlbHAgfSBmcm9tICcuL2NoYXJ0LWhlbHAnO1xuaW1wb3J0IHtcbiAgT21pY3NDaGFydEtpbmQsXG4gIGJlbmVmaXRzRnJvbUdyb3VwaW5nLFxuICBidWlsZENvdW50VHJhY2VzLFxuICBidWlsZEhlYXRtYXBUcmFjZXMsXG4gIGNvdW50QnlDYXRlZ29yeSxcbiAgYnVpbGRPbWljc1RyYWNlcyxcbiAgYnVpbGRFbWJlZGRpbmdUcmFjZXMsXG4gIGNvdW50c0xheW91dCxcbiAgaGVhdG1hcExheW91dCxcbiAgb21pY3NMYXlvdXQsXG4gIGVtYmVkZGluZ0xheW91dCxcbn0gZnJvbSAnLi4vLi4vaW1wbGVtZW50YXRpb25zL3Bsb3RseS9vbWljcy10cmFjZS1idWlsZGVycyc7XG5pbXBvcnQgeyBTcGF0aWFsSGVhdG1hcENvbnRyb2xzQ29tcG9uZW50IH0gZnJvbSAnLi9zcGF0aWFsLWhlYXRtYXAtY29udHJvbHMvc3BhdGlhbC1oZWF0bWFwLWNvbnRyb2xzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTcGF0aWFsRW1iZWRkaW5nQ29udHJvbHNDb21wb25lbnQgfSBmcm9tICcuL3NwYXRpYWwtZW1iZWRkaW5nLWNvbnRyb2xzL3NwYXRpYWwtZW1iZWRkaW5nLWNvbnRyb2xzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTcGF0aWFsQ2hhcnRXaW5kb3dDb21wb25lbnQgfSBmcm9tICcuL3NwYXRpYWwtY2hhcnQtd2luZG93L3NwYXRpYWwtY2hhcnQtd2luZG93LmNvbXBvbmVudCc7XG5cbi8qKlxuICogV2lkZW4gdGhlIGhlbHAgdG9vbHRpcCwgb25jZSBwZXIgZG9jdW1lbnQuXG4gKlxuICogUHJpbWVORyBjYXBzIGAucC10b29sdGlwYCBhdCAxMi41cmVtIGFuZCBhcHBlbmRzIGl0IHRvIGA8Ym9keT5gLCBzbyBhIGNvbXBvbmVudFxuICogc3R5bGVzaGVldCBjYW5ub3QgcmVhY2ggaXQg4oCUIHRoZSBzYW1lIHJlYXNvbiB0aGUgZGV0YWNoZWQgZGlhbG9nIGlzIHNpemVkIGlubGluZS4gQXRcbiAqIDIwMCBweCB0aGUgY2hhcnQgZXhwbGFuYXRpb25zIHJlbmRlciBhcyBhIHRhbGwgdGhyZWFkIG9mIHR3by13b3JkIGxpbmVzLCB3aGljaCBpcyB3b3JzZVxuICogdGhhbiBub3Qgc2hvd2luZyB0aGVtLiBUaGUgbGlicmFyeSBzaGlwcyBubyBnbG9iYWwgc3R5bGVzaGVldCB0byBwdXQgdGhpcyBpbiwgc28gb25lXG4gKiBydWxlIGlzIGluamVjdGVkIGluc3RlYWQ6IHNjb3BlZCB0byB0aGlzIGNvbXBvbmVudCdzIG93biB0b29sdGlwIGNsYXNzLCBpZGVtcG90ZW50LCBhbmRcbiAqIHNraXBwZWQgd2hlcmUgdGhlcmUgaXMgbm8gZG9jdW1lbnQuXG4gKi9cbmNvbnN0IEhFTFBfVElQX1NUWUxFX0lEID0gJ3N4LWhlbHAtdGlwLXN0eWxlJztcbmZ1bmN0aW9uIGVuc3VyZUhlbHBUaXBTdHlsZSgpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEhFTFBfVElQX1NUWUxFX0lEKSkgcmV0dXJuO1xuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLmlkID0gSEVMUF9USVBfU1RZTEVfSUQ7XG4gIHN0eWxlLnRleHRDb250ZW50ID1cbiAgICAnLnN4LWhlbHAtdGlwIC5wLXRvb2x0aXAtdGV4dCB7IG1heC13aWR0aDogbm9uZTsgd2lkdGg6IDI0cmVtOyAnICtcbiAgICAnbGluZS1oZWlnaHQ6IDEuNDU7IH1cXG4uc3gtaGVscC10aXAgeyBtYXgtd2lkdGg6IG5vbmU7IH0nO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cblxuLyoqIFBlci1pbnN0YW5jZSBjaGFydC1kaXYgaWQgc291cmNlIOKAlCBzZWUge0BsaW5rIFNwYXRpYWxDaGFydHNDb21wb25lbnQuY2hhcnREaXZ9LiAqL1xubGV0IGNoYXJ0SW5zdGFuY2VTZXEgPSAwO1xuXG4vKipcbiAqIERpc3RyaWJ1dGlvbiBjaGFydHMgb3ZlciB0aGUgc3BhdGlhbC1vbWljcyB2YWx1ZXMg4oCUIGhpc3RvZ3JhbSwgdmlvbGluLCBib3gg4oCUXG4gKiAqKmxpbmtlZCB0byB0aGUgbWFwKio6IHRoZXkgY2hhcnQgd2hhdGV2ZXIgdGhlIG1hcCBpcyBjb2xvdXJlZCBieSwgYW5kIG5hcnJvd1xuICogdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIEVtYmVkZGVkIElOU0lERSBgPHNwYXRpYWwtY29udHJvbHM+YCByYXRoZXIgdGhhbiBvd25pbmcgYSBkaWFsb2cgb2YgaXRzIG93bjpcbiAqIHRoZSB0d28gYXJlIG9uZSB3b3JrZmxvdyAoY2hhbmdlIHRoZSBjb2xvdXIgc291cmNlLCB3YXRjaCB0aGUgZGlzdHJpYnV0aW9uXG4gKiBtb3ZlKSwgYW5kIHNwbGl0dGluZyB0aGVtIGFjcm9zcyB0d28gZmxvYXRpbmcgd2luZG93cyBtYWRlIHRoZSBsaW5rIGhhcmRlciB0b1xuICogc2VlLCBub3QgZWFzaWVyLiBJdCBzdGF5cyBhIHNlcGFyYXRlIGNvbXBvbmVudCBzbyB0aGUgcHVyZSB0cmFjZSBidWlsZGVycyBhbmRcbiAqIGl0cyBvd24gdGVzdHMga2VlcCB0aGVpciBib3VuZGFyeS5cbiAqXG4gKiBDaGFydGluZyB0aGUgYWN0aXZlIGNvbG91ciBzb3VyY2UgcmF0aGVyIHRoYW4gb2ZmZXJpbmcgaXRzIG93biB2YWx1ZSBwaWNrZXIgaXNcbiAqIGRlbGliZXJhdGU6IGl0IGtlZXBzIG9uZSBzb3VyY2Ugb2YgdHJ1dGgsIHNvIHdoYXQgeW91IHNlZSBvbiB0aGUgbWFwIGFuZCB3aGF0XG4gKiB5b3Ugc2VlIGluIHRoZSBjaGFydCBjYW5ub3QgZGlzYWdyZWUsIGFuZCBpdCBtYWtlcyB0aGUgbGluayBsZWdpYmxlIHdpdGhvdXRcbiAqIGV4cGxhaW5pbmcgaXQuXG4gKlxuICogRGVwZW5kcyBvbmx5IG9uIHtAbGluayBJU3BhdGlhbENvbnRyb2xzfSB0aHJvdWdoIHRoZSBgVklTVUFMSVpFUmAgY29udHJhY3RcbiAqIHRva2VuLCBsaWtlIGBTcGF0aWFsQ29udHJvbHNDb21wb25lbnRgLiBUcmFjZSBidWlsZGluZyBsaXZlcyBpbiB0aGUgcHVyZVxuICogYG9taWNzLXRyYWNlLWJ1aWxkZXJzYDsgdGhpcyBjb21wb25lbnQgb25seSBtb3ZlcyBkYXRhIGFuZCBvd25zIHRoZSBkaXYuXG4gKlxuICogT25QdXNoOiBpdHMgc3RhdGUgbGl2ZXMgaW4gY29sbGFib3JhdG9ycyB0aGF0IGNoYW5nZSBhc3luY2hyb25vdXNseSAodGhlIGRhdGEgbG9hZHMsXG4gKiB0aGUgdC1TTkUgcnVuLCB0aGUgcGxvdCBob3N0KSwgc28gdGhlIGNvbnRyb2xzJyBzdHJlYW1zLCB0aGUgcnVuJ3Mgc3RhdGUsIGV2ZXJ5XG4gKiBmaW5pc2hlZCBkcmF3IGFuZCBldmVyeSBsb2FkIHN0YXJ0IG1hcmsgaXQgZm9yIGNoZWNrLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcGF0aWFsLWNoYXJ0cycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgRHJvcGRvd25Nb2R1bGUsXG4gICAgU2VsZWN0QnV0dG9uTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgU3BhdGlhbEhlYXRtYXBDb250cm9sc0NvbXBvbmVudCxcbiAgICBTcGF0aWFsRW1iZWRkaW5nQ29udHJvbHNDb21wb25lbnQsXG4gICAgU3BhdGlhbENoYXJ0V2luZG93Q29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BhdGlhbC1jaGFydHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWNoYXJ0cy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3BhdGlhbENoYXJ0c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGhvc3QgcGFuZWwgaXMgb24gc2NyZWVuLiBUaGUgY2hhcnQgb25seSBkcmF3cyB3aGVuIGl0IGlzOiB0aGVcbiAgICogZW5jbG9zaW5nIGRpYWxvZyBjcmVhdGVzIGFuZCBkZXN0cm95cyBpdHMgY29udGVudCwgc28gd2l0aG91dCB0aGlzIHRoZVxuICAgKiBjb21wb25lbnQgd291bGQgbW91bnQgd2l0aCBhIGRpdiBwcmVzZW50IGJ1dCBubyBzdGF0ZSBjaGFuZ2UgdG8gdHJpZ2dlciBhXG4gICAqIGZpcnN0IGRyYXcuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgYWN0aXZlKG9uOiBib29sZWFuKSB7XG4gICAgY29uc3Qgd2FzID0gdGhpcy5pc0FjdGl2ZTtcbiAgICB0aGlzLmlzQWN0aXZlID0gb247XG4gICAgLy8gRGVmZXJyZWQgYnkgYSB0YXNrOiB3aGVuIGEgY29sbGFwc2VkIHNlY3Rpb24gZXhwYW5kcywgdGhlIGhvc3QgaXMgc3RpbGxcbiAgICAvLyBgaGlkZGVuYCBhdCB0aGUgbW9tZW50IHRoaXMgc2V0dGVyIHJ1bnMsIHNvIHBsb3R0aW5nIG5vdyB3b3VsZCBzaXplIHRoZVxuICAgIC8vIGNoYXJ0IHRvIGEgemVyby1oZWlnaHQgZGl2LlxuICAgIGlmIChvbiAmJiAhd2FzKSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5yZWxvYWQoKSwgMCk7XG4gICAgZWxzZSBpZiAob24pIHZvaWQgdGhpcy5yZWxvYWQoKTtcbiAgfVxuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWN0aXZlO1xuICB9XG4gIHByaXZhdGUgaXNBY3RpdmUgPSB0cnVlO1xuXG4gIC8qKiBPbmUgaW5jcmVtZW50IHBlciBJTlNUQU5DRSDigJQgYSBzdGF0aWMgaW5pdGlhbGl6ZXIgd291bGQgcnVuIG9uY2UgcGVyIGNsYXNzIGFuZFxuICAgKiAgaGFuZCBldmVyeSBpbnN0YW5jZSB0aGUgc2FtZSBpZCwgd2hpY2ggaXMgdGhlIGJ1ZyB0aGlzIGlkIGV4aXN0cyB0byBhdm9pZC4gRGVjbGFyZWRcbiAgICogIGJlZm9yZSB0aGUgaWRzIGJlY2F1c2UgZmllbGQgaW5pdGlhbGl6ZXJzIHJ1biBpbiBvcmRlci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZXEgPSArK2NoYXJ0SW5zdGFuY2VTZXE7XG4gIC8qKiBQZXItaW5zdGFuY2UsIGZvciB0aGUgc2FtZSByZWFzb24gdGhlIHZpc3VhbGl6ZXIncyBwbG90IGRpdiBpc1xuICAgKiAgKGB2aXN1YWxpemVyLmNvbXBvbmVudC50c2ApOiB0d28gbW91bnRlZCBjaGFydHMgc2hhcmluZyBvbmUgRE9NIGlkIG1lYW5zXG4gICAqICBgZ2V0RWxlbWVudEJ5SWRgIGhhbmRzIGJvdGggb2YgdGhlbSB0aGUgZmlyc3QgZWxlbWVudCwgc28gb25lIGluc3RhbmNlIGRyYXdzXG4gICAqICBpbnRvIOKAlCBvciBwdXJnZXMg4oCUIHRoZSBvdGhlcidzIGNhbnZhcy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYXJ0RGl2ID0gYHNwYXRpYWwtY2hhcnRzLXBsb3QtJHt0aGlzLnNlcX1gO1xuICAvKipcbiAgICogVGhlIGRpdiBpbnNpZGUgdGhlIGRldGFjaGVkIHdpbmRvdy5cbiAgICpcbiAgICogQSBzZXBhcmF0ZSBpZCByYXRoZXIgdGhhbiBtb3ZpbmcgdGhlIGV4aXN0aW5nIGRpdjogQW5ndWxhciBkZXN0cm95cyBhbmQgcmVjcmVhdGVzIGFcbiAgICogZGl2IGFjcm9zcyBhbiBgKm5nSWZgLCBzbyBQbG90bHkgd291bGQgYmUgbGVmdCBob2xkaW5nIGEgZGV0YWNoZWQgbm9kZS4gVHdvIGRpdnMgYW5kXG4gICAqIGEgcmVkcmF3IGlzIGJvdGggc2ltcGxlciBhbmQgY29ycmVjdC5cbiAgICpcbiAgICogT05FIGlzIGVub3VnaCBmb3IgZXZlcnkga2luZCwgYmVjYXVzZSBvbmx5IHRoZSBhY3RpdmUga2luZCBpcyBldmVyIHBsb3R0ZWQuIERldGFjaGluZ1xuICAgKiBpcyByZW1lbWJlcmVkIHBlciBraW5kLCBidXQgYXQgbW9zdCBvbmUgd2luZG93IGlzIG9wZW4gYXQgYSB0aW1lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRldGFjaGVkRGl2ID0gYHNwYXRpYWwtY2hhcnRzLWRldGFjaGVkLSR7dGhpcy5zZXF9YDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hhcnQgaXMgc2hvd24gaW4gaXRzIG93biB3aW5kb3cgcmF0aGVyIHRoYW4gaW5saW5lLlxuICAgKlxuICAgKiBEZXRhY2hlZCwgaXQgc2l0cyBBTE9OR1NJREUgdGhlIHNwYXRpYWwtb21pY3MgZGlhbG9nIGluc3RlYWQgb2YgaW5zaWRlIGl0IOKAlCB3aGljaCBpc1xuICAgKiB0aGUgcG9pbnQ6IHRoZXNlIGFyZSByZWFkIGFnYWluc3QgdGhlIG1hcCwgbm90IGluc3RlYWQgb2YgaXQuIFRoZSBkaWFsb2cgaXMgb25seSBzb1xuICAgKiB3aWRlLlxuICAgKlxuICAgKiBPbmUgZmxhZyBmb3IgdGhlIFBBTkVMLCBub3Qgb25lIHBlciBraW5kLiBXaGVyZSB0aGUgd2luZG93IGlzLCBpcyBhIHByb3BlcnR5IG9mIHRoZVxuICAgKiB3b3Jrc3BhY2Ugc29tZW9uZSBoYXMgYXJyYW5nZWQsIG5vdCBvZiB0aGUgdGFiIHRoZXkgaGFwcGVuIHRvIGJlIG9uOiBoYXZpbmcgcHV0IHRoZVxuICAgKiBjaGFydHMgYmVzaWRlIHRoZSBtYXAsIHN3aXRjaGluZyBmcm9tIHRoZSBoZWF0bWFwIHRvIHRoZSBjb3VudHMgc2hvdWxkIHN3YXAgd2hhdCB0aGVcbiAgICogd2luZG93IHNob3dzLCBub3QgeWFuayBpdCBiYWNrIGludG8gdGhlIGRpYWxvZyBhbmQgbWFrZSB0aGVtIGRldGFjaCBpdCBhZ2Fpbi5cbiAgICovXG4gIHByb3RlY3RlZCBkZXRhY2hlZCA9IGZhbHNlO1xuICAvKipcbiAgICogTGFyZ2VzdCBkYXRhc2V0IHRoaXMgd2lsbCBvZmZlciB0byBlbWJlZCBpbiB0aGUgYnJvd3NlciDigJQgc2VlXG4gICAqIHtAbGluayBCUk9XU0VSX1RTTkVfTUFYX09CU0VSVkFUSU9OU30uXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgQlJPV1NFUl9UU05FX01BWF9PQlNFUlZBVElPTlMgPSBCUk9XU0VSX1RTTkVfTUFYX09CU0VSVkFUSU9OUztcblxuICAvKiogVGhlIHQtU05FIGNvbXB1dGVkIGluIHRoaXMgYnJvd3Nlcjogd2hhdCB0byBvZmZlciwgdGhlIHJ1biwgaXRzIHByb2dyZXNzLCBpdHMgcmVzdWx0cy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb21wdXRlID0gbmV3IEVtYmVkZGluZ0NvbXB1dGVDb29yZGluYXRvcigpO1xuXG4gIC8qKiAwLi4xIHdoaWxlIHJ1bm5pbmcsIG9yIG51bGwgYmVmb3JlIHRoZSBmaXJzdCByZXBvcnQuIERyaXZlcyB0aGUgcHJvZ3Jlc3MgYmFyLiAqL1xuICBnZXQgY29tcHV0ZUZyYWN0aW9uKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuc3RhdGUuZnJhY3Rpb247XG4gIH1cbiAgLyoqIFdoaWNoIGJhY2tlbmQgdGhlIHdvcmtlciBnb3Qg4oCUICd3ZWJncHUnLCAnd2FzbScgb3IgJ2NwdScuIFNob3duIHdoaWxlIHJ1bm5pbmcuICovXG4gIGdldCBjb21wdXRlQmFja2VuZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLnN0YXRlLmJhY2tlbmQ7XG4gIH1cbiAgZ2V0IGNvbXB1dGVNZXNzYWdlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuc3RhdGUubWVzc2FnZTtcbiAgfVxuICBnZXQgY29tcHV0ZUVycm9yKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuc3RhdGUuZXJyb3I7XG4gIH1cbiAgLyoqIFdoZXJlIGEgY29tcHV0YXRpb24gc3RhbmRzLCBmb3IgdGhlIGVtYmVkZGluZyBjb250cm9scy4gKi9cbiAgcHJvdGVjdGVkIGdldCBjb21wdXRlU3RhdGUoKTogRW1iZWRkaW5nQ29tcHV0ZVN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLnN0YXRlO1xuICB9XG4gIC8qKiBUcnVlIHdoZW4gYSB0LVNORSBpcyBtaXNzaW5nIGJ1dCB0aGUgZGF0YXNldCBpcyB0b28gYmlnIHRvIGVtYmVkIGhlcmUuICovXG4gIHByb3RlY3RlZCBnZXQgdHNuZVRvb0xhcmdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUudG9vTGFyZ2U7XG4gIH1cblxuICAvKiogVGhlIGtpbmRzIHRoZSBBQ1RJVkUgc3ViamVjdCBjYW4gYmUgZHJhd24gYXMuIEEgY2F0ZWdvcnkgY29kZSBpcyBhIGxhYmVsLFxuICAgKiAgbm90IGEgbWFnbml0dWRlLCBzbyBhIGhpc3RvZ3JhbSBvZiBpdCB3b3VsZCBiZSBtZWFuaW5nbGVzcyDigJQgd2hhdCBhXG4gICAqICBjYXRlZ29yaWNhbCBjb2x1bW4gaGFzIGlzIGEgZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbi5cbiAgICpcbiAgICogIEJvdW5kIHRvIGEgYHAtc2VsZWN0QnV0dG9uYCwgc28gdGhlIFNBTUUgYXJyYXkgaXMgcmV0dXJuZWQgdW50aWwgd2hhdCBpdCBpcyBidWlsdFxuICAgKiAgZnJvbSBjaGFuZ2VzOiBhIGZyZXNoIGFycmF5IHBlciBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3MgbWFrZXMgUHJpbWVORyByZS1yZW5kZXIgdGhlXG4gICAqICBidXR0b25zLCBhbmQgYSBidXR0b24gcmUtcmVuZGVyZWQgdW5kZXIgdGhlIHBvaW50ZXIgc3dhbGxvd3MgdGhlIGNsaWNrLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGtpbmRPcHRpb25zKCk6IENoYXJ0S2luZE9wdGlvbltdIHtcbiAgICBjb25zdCBjYXRlZ29yaWNhbCA9IHRoaXMuZGF0YS5pc0NhdGVnb3JpY2FsO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSB0aGlzLmVtYmVkZGluZ3MubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoaXQgPSB0aGlzLmtpbmRPcHRpb25zTWVtbztcbiAgICBpZiAoaGl0ICYmIGhpdC5jYXRlZ29yaWNhbCA9PT0gY2F0ZWdvcmljYWwgJiYgaGl0LmVtYmVkZGluZ3MgPT09IGVtYmVkZGluZ3MpIHtcbiAgICAgIHJldHVybiBoaXQub3B0aW9ucztcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNoYXJ0S2luZE9wdGlvbnMoY2F0ZWdvcmljYWwsIGVtYmVkZGluZ3MpO1xuICAgIHRoaXMua2luZE9wdGlvbnNNZW1vID0geyBjYXRlZ29yaWNhbCwgZW1iZWRkaW5ncywgb3B0aW9ucyB9O1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG4gIHByaXZhdGUga2luZE9wdGlvbnNNZW1vOiB7XG4gICAgY2F0ZWdvcmljYWw6IGJvb2xlYW47XG4gICAgZW1iZWRkaW5nczogYm9vbGVhbjtcbiAgICBvcHRpb25zOiBDaGFydEtpbmRPcHRpb25bXTtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBjb250cm9sczogSVNwYXRpYWxDb250cm9scyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQga2luZDogT21pY3NDaGFydEtpbmQgPSAnaGlzdG9ncmFtJztcbiAgLyoqIFRoZSBkYXRhIGNoYXJ0ZWQsIGFuZCBpdHMgbG9hZGluZyDigJQgc2VlIHtAbGluayBDaGFydERhdGFNb2RlbH0uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBDaGFydERhdGFNb2RlbCgpO1xuXG4gIC8qKiBFbWJlZGRpbmdzIHRoZSBkYXRhc2V0IG9mZmVycywgYW5kIHdoaWNoIG9mIHRoZW0gaXMgZHJhd24uICovXG4gIHByb3RlY3RlZCBnZXQgZW1iZWRkaW5ncygpOiBTcGF0aWFsRW1iZWRkaW5nTWV0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmVtYmVkZGluZ3M7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBlbWJlZGRpbmcoKTogU3BhdGlhbEVtYmVkZGluZ01ldGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmVtYmVkZGluZztcbiAgfVxuICAvKiogR2VuZXMgdGhlIGhlYXRtYXAncyByb3dzIGFyZS4gKi9cbiAgcHJvdGVjdGVkIGdldCBoZWF0bWFwR2VuZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGEuaGVhdG1hcEdlbmVzO1xuICB9XG4gIC8qKiBUaGUgaGVhdG1hcCBnZW5lIHBpY2tlcidzIG9wdGlvbnMuICovXG4gIHByb3RlY3RlZCBnZXQgZ2VuZU9wdGlvbnMoKTogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZW5lT3B0aW9ucztcbiAgfVxuICAvKiogQ2F0ZWdvcmljYWwgY29sdW1uIHRoZSB2aW9saW4vYm94IHNwbGl0cyBieTsgbnVsbCA9IG9uZSB0cmFjZSBmb3IgYWxsLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGdyb3VwQnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5ncm91cEJ5O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgZ3JvdXBPcHRpb25zKCk6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bGwgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdyb3VwT3B0aW9ucztcbiAgfVxuICAvKiogU2V0IHdoZW4gdGhlIGFjdGl2ZSBjb2xvdXIgc291cmNlIGNhbm5vdCBiZSBjaGFydGVkLCBmb3IgYW4gaW5saW5lIGhpbnQuICovXG4gIHByb3RlY3RlZCBnZXQgbm90aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRhdGEubm90aWNlO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgbm90aWNlKHRleHQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLmRhdGEubm90aWNlID0gdGV4dDtcbiAgfVxuICAvKiogQSBsb2FkIGlzIGluIGZsaWdodC4gKi9cbiAgcHJvdGVjdGVkIGdldCBidXN5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEuYnVzeTtcbiAgfVxuICAvKiogWi1zY29yZSBlYWNoIGdlbmUgYWNyb3NzIHRoZSBncm91cHMuIE9uIGJ5IGRlZmF1bHQ6IHdpdGhvdXQgaXQgb25lIGxvdWRcbiAgICogIGdlbmUgc2F0dXJhdGVzIHRoZSBzY2FsZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhbmVsIHJlYWRzIGFzIGJsYW5rLiAqL1xuICBwcm90ZWN0ZWQgaGVhdG1hcFpTY29yZSA9IHRydWU7XG4gIC8qKiBQYXN0IHRoaXMgbWFueSBzZWxlY3RlZCBjZWxscyB0aGUgcGVyLWNlbGwgdmlldyBpcyBhIHRleHR1cmUsIG5vdCBhXG4gICAqICByZWFkYWJsZSBwYW5lbCwgc28gdGhlIGNvbHVtbnMgZ28gYmFjayB0byBiZWluZyBjbGFzc2VzLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIRUFUTUFQX0NFTExfQ09MVU1OUyA9IDIwMDtcbiAgLyoqXG4gICAqIENvbHVtbiBjYXAgZm9yIHRoZSBncm91cGVkIGhlYXRtYXAuXG4gICAqXG4gICAqIEFueSBjYXRlZ29yaWNhbCBjb2x1bW4gY2FuIGJlIHRoZSB4IGF4aXMsIGFuZCB0aGV5IGFyZSBub3QgdGhlIHNhbWUgc2l6ZTpcbiAgICogYG5ldXJvdHJhbnNtaXR0ZXJgIGhhcyA5IGNhdGVnb3JpZXMsIGBjbGFzc2AgMzQsIGBzdWJjbGFzc2AgMzM4LiBBdCAzMzggdGhlXG4gICAqIHBhbmVsIGlzIGEgdGV4dHVyZSDigJQgY29sdW1ucyBhIGNvdXBsZSBvZiBwaXhlbHMgd2lkZSwgbm8gcmVhZGFibGUgbGFiZWwg4oCUXG4gICAqIHNvIHBhc3QgdGhpcyBtYW55IHRoZSBzdHJvbmdlc3QgY29sdW1ucyBhcmUga2VwdCBhbmQgdGhlIG5vdGUgc2F5cyBob3cgbWFueVxuICAgKiB3ZXJlIGRyb3BwZWQuIFNlZSBgbWF4Q29sc2AgaW4gYHNwYXRpYWwtaGVhdG1hcC50c2AuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIRUFUTUFQX01BWF9DT0xVTU5TID0gNDA7XG4gIC8qKiBDb2x1bW5zIHRoZSBjYXAgZHJvcHBlZCBmcm9tIHRoZSBsYXN0IHJlbmRlciwgZm9yIHRoZSBub3RlLiAqL1xuICBwcml2YXRlIGhlYXRtYXBIaWRkZW4gPSAwO1xuXG4gIC8qKiBXaGF0IHRoZSBtYXAgaXMgY29sb3VyZWQgYnkg4oCUIHRoZSBjaGFydCdzIHN1YmplY3QuICovXG4gIGNvbG9yQnk6IFNwYXRpYWxDb2xvckJ5IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBzZWxlY3Rpb25Db3VudCA9IDA7XG5cbiAgcHJpdmF0ZSB2aWV3OiBTcGF0aWFsVmlld1N0YXRlID0geyAuLi5ERUZBVUxUX1NQQVRJQUxfVklFVyB9O1xuICBwcml2YXRlIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgPSBlbXB0eVNlbGVjdGlvbigpO1xuICAvKiogV2hldGhlciB0aGUgZmlyc3QgdmlldyBlbWlzc2lvbiBoYXMgYmVlbiBoYW5kbGVkLiAqL1xuICBwcml2YXRlIHByaW1lZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLyoqIFJlLXJlbmRlciB0aGlzIE9uUHVzaCB2aWV3LCByZS1lbnRlcmluZyB0aGUgem9uZSB3aGVuIHRoZSBjaGFuZ2UgY2FtZSBmcm9tIG91dHNpZGUgaXQuICovXG4gIHByaXZhdGUgY2hhbmdlZCgpOiB2b2lkIHtcbiAgICBtYXJrRm9yQ2hlY2tJblpvbmUodGhpcy5jZHIsIHRoaXMuem9uZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFZJU1VBTElaRVIpIHByaXZhdGUgcmVhZG9ubHkgdml6OiBJVmlzdWFsaXplcikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBCZWZvcmUgdGhlIHBvcnQgY2hlY2s6IHRoZSBoZWxwIGljb24gaXMgaW4gdGhlIHRlbXBsYXRlIGVpdGhlciB3YXksIGFuZCBhIHBhbmVsXG4gICAgLy8gd2l0aCBubyBkYXRhIHNvdXJjZSBpcyBleGFjdGx5IHdoZXJlIHNvbWVvbmUgcmVhZHMgaXQuXG4gICAgZW5zdXJlSGVscFRpcFN0eWxlKCk7XG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMudml6LmdldFNwYXRpYWxDb250cm9scz8uKCkgPz8gbnVsbDtcbiAgICBpZiAoIXRoaXMuY29udHJvbHMpIHJldHVybjtcblxuICAgIC8vIFRoZSBydW4ncyBwcm9ncmVzcywgYmFja2VuZCBhbmQgZXJyb3JzLCBmb3IgdGhlIGVtYmVkZGluZyBjb250cm9scy5cbiAgICB0aGlzLmNvbXB1dGUuc3RhdGUkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNoYW5nZWQoKSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmNvbnRyb2xzLmdldFZpZXdTdGF0ZSQoKSwgdGhpcy5jb250cm9scy5nZXRTZWxlY3Rpb24kKCldKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChbdmlldywgc2VsZWN0aW9uXSkgPT4ge1xuICAgICAgICBjb25zdCBzb3VyY2VDaGFuZ2VkID1cbiAgICAgICAgICB2aWV3LmNvbG9yQnk/LmtpbmQgIT09IHRoaXMudmlldy5jb2xvckJ5Py5raW5kIHx8IHZpZXcuY29sb3JCeT8ubmFtZSAhPT0gdGhpcy52aWV3LmNvbG9yQnk/Lm5hbWU7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ291bnQgPSBzZWxlY3Rpb24uY291bnQ7XG4gICAgICAgIC8vIEEgc2VsZWN0aW9uIG9yIGxvZyBjaGFuZ2Ugb25seSBuZWVkcyBhIHJlLXJlbmRlcjsgYSBuZXcgY29sb3VyIHNvdXJjZVxuICAgICAgICAvLyBuZWVkcyBpdHMgdmVjdG9yIGZldGNoZWQgZmlyc3QuIFRoZSBGSVJTVCBlbWlzc2lvbiBhbHdheXMgcmVsb2FkczpcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGBudWxsIC0+IG51bGxgIHJlYWRzIGFzIFwidW5jaGFuZ2VkXCIgYW5kIHRoZSBjb21wb25lbnQgc2l0c1xuICAgICAgICAvLyB3aXRoIG5vIGRhdGEgYW5kIG5vIGV4cGxhbmF0aW9uIHVudGlsIHNvbWV0aGluZyBlbHNlIG1vdmVzLlxuICAgICAgICBpZiAoIXRoaXMucHJpbWVkIHx8IHNvdXJjZUNoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLnByaW1lZCA9IHRydWU7XG4gICAgICAgICAgdm9pZCB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEEgc2VsZWN0aW9uIG9yIGxvZy1zY2FsZSBjaGFuZ2UgbmVlZHMgb25seSBhIHJlZHJhdyBvZiB0aGUgc2FtZSB2ZWN0b3IuXG4gICAgICAgICAgdm9pZCB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyb2xzXG4gICAgICAuZ2V0RGF0YXNldCQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChkYXRhc2V0KSA9PiB7XG4gICAgICAgIC8vIE9mZmVyIHRvIGNvbXB1dGUgYSB0LVNORSBvbmx5IHdoZXJlIHRoZSBkYXRhc2V0IGhhcyBQQ0EgdG8gZW1iZWQgYW5kIG5vIHQtU05FIG9mXG4gICAgICAgIC8vIGl0cyBvd247IGFueXRoaW5nIGNvbXB1dGVkIG9yIGNvbXB1dGluZyBmb3IgdGhlIHByZXZpb3VzIGRhdGFzZXQgaXMgZHJvcHBlZC5cbiAgICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IHRoaXMuY29tcHV0ZS5zZXREYXRhc2V0KGRhdGFzZXQ/LmVtYmVkZGluZ3MgPz8gW10sIGRhdGFzZXQ/Lm9ic2VydmF0aW9ucy5jb3VudCA/PyAwKTtcbiAgICAgICAgY29uc3Qgc3dpdGNoZWQgPSB0aGlzLmRhdGEub25EYXRhc2V0Q2hhbmdlZChcbiAgICAgICAgICBkYXRhc2V0LFxuICAgICAgICAgIHRoaXMuY29udHJvbHM/LmNhdGVnb3JpY2FsQ29sdW1ucygpID8/IFtdLFxuICAgICAgICAgIGVtYmVkZGluZ3MsXG4gICAgICAgICk7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZHJhdyBmb3IgdGhlIGtpbmQgdGhhdCB3YXMgc2VsZWN0ZWQ7IGZhbGwgYmFjayByYXRoZXIgdGhhbiBzaXQgYmxhbmsuXG4gICAgICAgIGlmICh0aGlzLmtpbmQgPT09ICdlbWJlZGRpbmcnICYmIGVtYmVkZGluZ3MubGVuZ3RoID09PSAwKSB0aGlzLmtpbmQgPSAnaGlzdG9ncmFtJztcbiAgICAgICAgLy8gRXZlcnl0aGluZyBsb2FkZWQgd2FzIHRoZSBwcmV2aW91cyBkYXRhc2V0J3M6IGZldGNoIGFmcmVzaCwgZXZlbiB3aGVuIHRoZSB2aWV3XG4gICAgICAgIC8vIGRvZXMgbm90IHJlLWVtaXQgKGEgY29sb3VyIHNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lKS5cbiAgICAgICAgaWYgKHN3aXRjaGVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXBCeSkgdm9pZCB0aGlzLm9uR3JvdXBCeSh0aGlzLmdyb3VwQnkpO1xuICAgICAgICAgIHZvaWQgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqIExhdGVzdCB3aW5zIGFtb25nIGhlYXRtYXAgZHJhd3MsIHdob3NlIG1hdHJpeCBtYXkgYmUgY29tcHV0ZWQgaW4gYSB3b3JrZXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhdG1hcFJlbmRlciA9IG5ldyBTdXBlcnNlZGUoKTtcblxuICAvKiogUGxvdGx5IEkvTyBmb3IgYm90aCB0aGUgaW5saW5lIGFuZCB0aGUgZGV0YWNoZWQgZGl2LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBsb3QgPSBuZXcgUGxvdGx5Q2hhcnRIb3N0KCk7XG5cbiAgLyoqXG4gICAqIFJlLWZpdCB0aGUgcGxvdCB0byB0aGUgcGFuZWwncyBjdXJyZW50IHdpZHRoLlxuICAgKlxuICAgKiBDYWxsZWQgYnkgdGhlIGhvc3Qgd2hlbiB0aGUgZGlhbG9nIGZpbmlzaGVzIHJlc2l6aW5nLiBQbG90bHkgZG9lcyBub3Qgbm90aWNlXG4gICAqIGEgY29udGFpbmVyIHJlc2l6ZSBvbiBpdHMgb3duIOKAlCBpdHMgYHJlc3BvbnNpdmVgIG9wdGlvbiBsaXN0ZW5zIGZvciBXSU5ET1dcbiAgICogcmVzaXplcyBvbmx5LCBzbyBkcmFnZ2luZyBhIGRpYWxvZyBlZGdlIHJlYWNoZXMgaXQgdGhyb3VnaCBub3RoaW5nIGF0IGFsbC5cbiAgICovXG4gIHJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3QucmVmaXQodGhpcy5jaGFydERpdik7XG4gIH1cblxuICAvKiogU3RvcHMgdGhlIHQtU05FIHJ1biBhbmQgaGVhdG1hcCB3b3JrZXIgYW5kIGZyZWVzIGJvdGggcGxvdHM7IHRoZSBzdHJlYW1zIGVuZFxuICAgKiAgdGhyb3VnaCBgdGFrZVVudGlsRGVzdHJveWVkYC4gKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQSB3b3JrZXIgb3V0bGl2ZXMgdGhlIGNvbXBvbmVudCB0aGF0IHN0YXJ0ZWQgaXQ6IGNsb3NpbmcgdGhlIHBhbmVsIG1pZC1ydW4gd291bGRcbiAgICAvLyBvdGhlcndpc2UgbGVhdmUgYSB0LVNORSBzYXR1cmF0aW5nIGEgR1BVIGZvciBtaW51dGVzIHdpdGggbm90aGluZyBsZWZ0IHRvIHJlY2VpdmVcbiAgICAvLyB0aGUgYW5zd2VyLlxuICAgIHRoaXMuY29tcHV0ZS5hYmFuZG9uKCk7XG4gICAgdGhpcy5oZWF0bWFwUmVuZGVyLmNhbmNlbCgpO1xuICAgIC8vIEJPVEggZGl2czogYSBjaGFydCBsZWZ0IGRldGFjaGVkIGF0IHRlYXJkb3duIGhvbGRzIGl0cyBXZWJHTCBjb250ZXh0IGluIHRoZVxuICAgIC8vIHdpbmRvdydzIGRpdiwgd2hpY2ggdGhlIGlubGluZSBpZCB3b3VsZCBuZXZlciByZWFjaC5cbiAgICBmb3IgKGNvbnN0IGRpdiBvZiBbdGhpcy5jaGFydERpdiwgdGhpcy5kZXRhY2hlZERpdl0pIHRoaXMucGxvdC5wdXJnZShkaXYpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIFRoZSBkaXYgZXhpc3RzIG9ubHkgbm93LCBzbyB0aGlzIGlzIHRoZSBlYXJsaWVzdCBhIGZpcnN0IGRyYXcgY2FuIGxhbmQuXG4gICAgdm9pZCB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2luZChraW5kOiBPbWljc0NoYXJ0S2luZCk6IHZvaWQge1xuICAgIHRoaXMua2luZCA9IGtpbmQ7XG4gICAgaWYgKGtpbmQgPT09ICdoZWF0bWFwJykge1xuICAgICAgLy8gU2VlZCB3aXRoIHRoZSBnZW5lIGFscmVhZHkgb24gc2NyZWVuLCBzbyB0aGUgY2hhcnQgc2F5cyBzb21ldGhpbmcgdGhlXG4gICAgICAvLyBtb21lbnQgaXQgb3BlbnMgcmF0aGVyIHRoYW4gc2hvd2luZyBhbiBlbXB0eSBncmlkIGFuZCBhIHByb21wdC5cbiAgICAgIGlmICh0aGlzLmhlYXRtYXBHZW5lcy5sZW5ndGggPT09IDAgJiYgdGhpcy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScpIHtcbiAgICAgICAgdGhpcy5kYXRhLnNldEhlYXRtYXBHZW5lcyhbdGhpcy5jb2xvckJ5Lm5hbWVdKTtcbiAgICAgIH1cbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVIZWF0bWFwR3JvdXBpbmcoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkSGVhdG1hcEdlbmVzKCk7XG4gICAgICAgIHZvaWQgdGhpcy5yZW5kZXIoKTtcbiAgICAgIH0pKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZvaWQgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZ3JvdXBpbmcgdGhlIGhlYXRtYXAncyBjb2x1bW5zIGNvbWUgZnJvbSwgZGVmYXVsdGluZyByYXRoZXIgdGhhblxuICAgKiBkZW1hbmRpbmcgb25lOiBhIGhlYXRtYXAgd2l0aCBubyBjb2x1bW5zIGlzIG5vdCBhIGNoYXJ0LCBhbmQgXCJObyBncm91cGluZ1wiXG4gICAqIGlzIGEgc2Vuc2libGUgYW5zd2VyIGZvciBhIHZpb2xpbiBidXQgbm90IGZvciB0aGlzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVIZWF0bWFwR3JvdXBpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGF0YS5oYXNHcm91cGluZyB8fCAhdGhpcy5jb250cm9scykgcmV0dXJuO1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5ncm91cE9wdGlvbnMuZmluZCgobykgPT4gby52YWx1ZSk/LnZhbHVlO1xuICAgIGlmICghZmlyc3QpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLm9uR3JvdXBCeShmaXJzdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25IZWF0bWFwWlNjb3JlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5oZWF0bWFwWlNjb3JlID0gb247XG4gICAgdm9pZCB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGhlYXRtYXAgaXMgY3VycmVudGx5IHNob3dpbmcsIHNhaWQgcGxhaW5seS4gKi9cbiAgcHJvdGVjdGVkIGdldCBoZWF0bWFwTm90ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBoZWF0bWFwTm90ZSh7XG4gICAgICBnZW5lQ291bnQ6IHRoaXMuaGVhdG1hcEdlbmVzLmxlbmd0aCxcbiAgICAgIHNlbGVjdGlvbkNvdW50OiB0aGlzLnNlbGVjdGlvbkNvdW50LFxuICAgICAgelNjb3JlOiB0aGlzLmhlYXRtYXBaU2NvcmUsXG4gICAgICBoaWRkZW46IHRoaXMuaGVhdG1hcEhpZGRlbixcbiAgICAgIGdyb3VwQnk6IHRoaXMuZ3JvdXBCeSxcbiAgICAgIG1heENvbHVtbnM6IFNwYXRpYWxDaGFydHNDb21wb25lbnQuSEVBVE1BUF9NQVhfQ09MVU1OUyxcbiAgICAgIGNlbGxDb2x1bW5zOiBTcGF0aWFsQ2hhcnRzQ29tcG9uZW50LkhFQVRNQVBfQ0VMTF9DT0xVTU5TLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEdlbmUgcm93cyBmb3IgdGhlIGhlYXRtYXAuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkhlYXRtYXBHZW5lcyhuYW1lczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRhdGEuc2V0SGVhdG1hcEdlbmVzKG5hbWVzKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRIZWF0bWFwR2VuZXMoKTtcbiAgICB2b2lkIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKiogRmV0Y2ggYW55IGdlbmUgdGhlIGhlYXRtYXAgbmVlZHMgYW5kIGRvZXMgbm90IGFscmVhZHkgaG9sZC4gKi9cbiAgcHJpdmF0ZSBsb2FkSGVhdG1hcEdlbmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEubG9hZEhlYXRtYXBHZW5lcyh0aGlzLmNvbnRyb2xzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBvbkdyb3VwQnkobmFtZTogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLmRhdGEubG9hZEdyb3VwaW5nKHRoaXMuY29udHJvbHMsIG5hbWUpO1xuICAgIHRoaXMuY2hhbmdlZCgpOyAvLyB0aGUgYnVzeSBzcGlubmVyXG4gICAgaWYgKGF3YWl0IGxvYWRpbmcpIHZvaWQgdGhpcy5yZW5kZXIoKTtcbiAgICBlbHNlIHRoaXMuY2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgY3VycmVudCBraW5kIHdvdWxkIHJlYWQgYmV0dGVyIHdpdGggYSBncm91cGluZyBjaG9zZW4uICovXG4gIHByb3RlY3RlZCBnZXQgc3VnZ2VzdHNHcm91cGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYmVuZWZpdHNGcm9tR3JvdXBpbmcodGhpcy5raW5kKSAmJiAhdGhpcy5ncm91cEJ5ICYmIHRoaXMuZ3JvdXBPcHRpb25zLmxlbmd0aCA+IDE7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHN1YmplY3QoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29sb3JCeSkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0aGlzLmNvbG9yQnkua2luZCA9PT0gJ2ZlYXR1cmUnID8gYGdlbmUgJHt0aGlzLmNvbG9yQnkubmFtZX1gIDogdGhpcy5jb2xvckJ5Lm5hbWU7XG4gIH1cblxuICAvLyDilIDilIAgaW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBGZXRjaCB0aGUgYWN0aXZlIGNvbG91ciBzb3VyY2UncyB2ZWN0b3IsIHRoZW4gZHJhdy4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZGluZyA9IHRoaXMuZGF0YS5sb2FkVmFsdWVzKHRoaXMuY29udHJvbHMsIHRoaXMudmlldy5jb2xvckJ5KTtcbiAgICB0aGlzLmNoYW5nZWQoKTsgLy8gdGhlIGJ1c3kgc3Bpbm5lclxuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRpbmc7XG4gICAgaWYgKGxvYWRlZCA9PT0gJ3N1cGVyc2VkZWQnKSByZXR1cm47XG4gICAgLy8gT25seSBvZmYgdGhlIGRpc3RyaWJ1dGlvbiB0YWJzLiBUaGUgaGVhdG1hcCBkb2VzIG5vdCBjaGFydCB0aGUgY29sb3VyIHNvdXJjZSwgYW5kIHRoZVxuICAgIC8vIGVtYmVkZGluZyBpcyBjb2xvdXJlZCBCWSBpdCDigJQgaXRzIG93biBjYXB0aW9uIGFza3MgZm9yIGV4YWN0bHkgdGhpcy5cbiAgICBpZiAobG9hZGVkID09PSAnY2F0ZWdvcmljYWwnICYmIHRoaXMua2luZCAhPT0gJ2VtYmVkZGluZycgJiYgdGhpcy5raW5kICE9PSAnaGVhdG1hcCcpIHRoaXMua2luZCA9ICdjb3VudHMnO1xuICAgIGlmIChsb2FkZWQgPT09ICdjb250aW51b3VzJyAmJiB0aGlzLmtpbmQgPT09ICdjb3VudHMnKSB0aGlzLmtpbmQgPSAnaGlzdG9ncmFtJztcbiAgICB2b2lkIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVtYmVkZGluZyBzY2F0dGVyIOKAlCBhIFVNQVAgb3ZlciB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gICAqXG4gICAqIEFuc3dlcnMgd2hhdCB0aGUgbWFwIGNhbm5vdDogdGhlIG1hcCBzYXlzIFdIRVJFIGEgcG9wdWxhdGlvbiBzaXRzLCB0aGlzIHNheXMgd2hpY2hcbiAgICogcG9wdWxhdGlvbnMgdGhlcmUgYXJlIGFuZCBob3cgY2xvc2UgdGhleSBhcmUgaW4gZXhwcmVzc2lvbi5cbiAgICpcbiAgICogTGlua2VkIHRvIHRoZSBtYXAgd2l0aG91dCBhc2tpbmcgZm9yIGFueXRoaW5nOiBpdCByZXVzZXMgdGhlIGxvYWRlZCBjYXRlZ29yaWVzLCB0aGUgc2FtZVxuICAgKiBsb2FkZWQgY29sb3VyaW5nIHRoZSBjb3VudHMgY2hhcnQgZHJhd3MgZnJvbSwgc28gdGhlIHR3byBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBhXG4gICAqIGNvbG91ciBtZWFucyBhbmQgbm8gc2Vjb25kIGZldGNoIGhhcHBlbnMuIEEgc2VsZWN0aW9uIGRpbXMgdGhlIHJlc3QgcmF0aGVyIHRoYW5cbiAgICogZHJvcHBpbmcgaXQg4oCUIHRoZSBlbWJlZGRpbmcncyBzaGFwZSBpcyB0aGUgY29udGV4dCB0aGF0IG1ha2VzIGEgc2VsZWN0aW9uIGxlZ2libGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckVtYmVkZGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZW1iZWRkaW5nO1xuICAgIGlmICghY29udHJvbHMgfHwgIW1ldGEpIHtcbiAgICAgIHRoaXMucHVyZ2VQbG90KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY29udHJvbHMuZ2V0RW1iZWRkaW5nKSB7XG4gICAgICB0aGlzLm5vdGljZSA9ICdUaGlzIGRhdGEgc291cmNlIGRvZXMgbm90IHNlcnZlIGVtYmVkZGluZ3MuJztcbiAgICAgIHRoaXMucHVyZ2VQbG90KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZWQgaGVyZSwgbm90IHNlcnZlZDogYSBsb2NhbCByZXN1bHQgaXMgdGhlIHNhbWUgc2hhcGUgYXMgYSBmZXRjaGVkIG9uZSwgc29cbiAgICAvLyBldmVyeXRoaW5nIGRvd25zdHJlYW0g4oCUIGNvbG91cmluZywgbGFzc28gc2VsZWN0aW9uLCB0aGUgY2FtZXJhIOKAlCBpcyB1bmNoYW5nZWQuXG4gICAgY29uc3QgbG9jYWwgPSB0aGlzLmNvbXB1dGUucmVzdWx0KG1ldGEubmFtZSk7XG4gICAgaWYgKGxvY2FsKSB7XG4gICAgICB0aGlzLmRhdGEuc3VwZXJzZWRlRW1iZWRkaW5nTG9hZCgpO1xuICAgICAgdGhpcy5kYXRhLmVtYmVkZGluZ0Nvb3JkcyA9IGxvY2FsO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbXB1dGFibGUpIHtcbiAgICAgIC8vIE9mZmVyZWQgYnV0IG5vdCB5ZXQgY29tcHV0ZWQuIFRoZSBwYW5lbCBzaG93cyB0aGUgQ29tcHV0ZSBidXR0b247IGRyYXdpbmcgbm90aGluZ1xuICAgICAgLy8gaXMgcmlnaHQsIGFuZCBhbiBlcnJvciB3b3VsZCBiZSB3cm9uZyDigJQgdGhlcmUgaXMgbm8gZmFpbHVyZSBoZXJlLlxuICAgICAgdGhpcy5kYXRhLnN1cGVyc2VkZUVtYmVkZGluZ0xvYWQoKTtcbiAgICAgIHRoaXMucHVyZ2VQbG90KCk7XG4gICAgICB0aGlzLm5vdGljZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHRoaXMuZGF0YS5sb2FkRW1iZWRkaW5nKChuYW1lKSA9PiBjb250cm9scy5nZXRFbWJlZGRpbmchKG5hbWUpLCBtZXRhKTtcbiAgICAgIGlmIChsb2FkZWQgPT09ICdzdXBlcnNlZGVkJykgcmV0dXJuO1xuICAgICAgaWYgKGxvYWRlZCA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgdGhpcy5wdXJnZVBsb3QoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGVtYmVkZGluZ0Nvb3JkczogY29vcmRzLCBjYXRlZ29yaWNhbCB9ID0gdGhpcy5kYXRhLnNuYXBzaG90KCk7XG4gICAgaWYgKCFjb29yZHMpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucGxvdFRhcmdldDtcbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldCkpIHJldHVybjsgLy8gdGhlIHdpbmRvdyBpcyBjbG9zZWQsIG9yIG5vdCByZW5kZXJlZCB5ZXRcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5wbG90LmxpdmVWaWV3KHRhcmdldCk7XG5cbiAgICB0aGlzLm5vdGljZSA9IG51bGw7XG4gICAgY29uc3QgaW5wdXQgPSB7XG4gICAgICB4OiBjb29yZHMueCxcbiAgICAgIHk6IGNvb3Jkcy55LFxuICAgICAgLy8gVGhlIHRoaXJkIGRpbWVuc2lvbiB3aGVuIHRoZSBlbWJlZGRpbmcgaGFzIG9uZSDigJQgd2hhdCBzd2l0Y2hlcyB0aGUgcGxvdCB0byBhXG4gICAgICAvLyByb3RhdGFibGUgM0Qgc2NhdHRlci4gRGVjb2RlZCBvbmx5IGZvciBhIDMtZGltIGVtYmVkZGluZywgc28gaXRzIHByZXNlbmNlIGhlcmVcbiAgICAgIC8vIGlzIHRoZSBzYW1lIHF1ZXN0aW9uIGFzIGBtZXRhLmRpbXMgPT09IDNgLlxuICAgICAgLi4uKGNvb3Jkcy56ID8geyB6OiBjb29yZHMueiB9IDoge30pLFxuICAgICAgbGFiZWw6IG1ldGEubGFiZWwgPz8gbWV0YS5uYW1lLFxuICAgICAgZGVyaXZlZDogbWV0YS5kZXJpdmVkLFxuICAgICAgLy8gUHJlc2VudCBmb3IgYSBQQ0EsIGFic2VudCBmb3IgYSBVTUFQIOKAlCBzZWUgYHZhcmlhbmNlUmF0aW9gIG9uIHRoZSBtZXRhLlxuICAgICAgLi4uKG1ldGEudmFyaWFuY2VSYXRpbyA/IHsgdmFyaWFuY2VSYXRpbzogbWV0YS52YXJpYW5jZVJhdGlvIH0gOiB7fSksXG4gICAgICAuLi4oY2F0ZWdvcmljYWxcbiAgICAgICAgPyB7IGNhdGVnb3JpZXM6IHsgY29kZXM6IGNhdGVnb3JpY2FsLmNvZGVzLCBuYW1lczogY2F0ZWdvcmljYWwuY2F0ZWdvcmllcywgY29sb3JzOiBjYXRlZ29yaWNhbC5jb2xvcnMgfSB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKHRoaXMuc2VsZWN0aW9uLmNvdW50ID4gMCA/IHsgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbi5tYXNrIH0gOiB7fSksXG4gICAgICAvLyBXaGF0ZXZlciB2aWV3IHRoZSB1c2VyIGhhcyBzZXQgdXAsIHJlYWQgZnJvbSB0aGUgTElWRSBwbG90IOKAlCB3aGljaCBpcyB3aGVyZVxuICAgICAgLy8gcm90YXRpbmcgYW5kIHpvb21pbmcgbGVhdmUgaXQuXG4gICAgICAuLi4odmlldyA/IHsgdmlldyB9IDoge30pLFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy5wbG90LmRyYXcodGFyZ2V0LCBidWlsZEVtYmVkZGluZ1RyYWNlcyhpbnB1dCksIGVtYmVkZGluZ0xheW91dChpbnB1dCksIEVNQkVERElOR19DT05GSUcpO1xuICAgIC8vIERyYXcgcm91bmQgYSBjbHVzdGVyIGhlcmUgYW5kIHRob3NlIGNlbGxzIGxpZ2h0IHVwIG9uIHRoZSB0aXNzdWU6IGV2ZXJ5IHZpZXcgcmVhZHNcbiAgICAvLyB0aGUgc2FtZSBtYXNrLlxuICAgIHRoaXMucGxvdC5iaW5kU2VsZWN0aW9uKHRhcmdldCwge1xuICAgICAgc2VsZWN0ZWQ6IChpbmRpY2VzKSA9PiB0aGlzLmNvbnRyb2xzPy5zZWxlY3RJbmRpY2VzKGluZGljZXMpLFxuICAgICAgZGVzZWxlY3RlZDogKCkgPT4gdGhpcy5jb250cm9scz8uY2xlYXJTZWxlY3Rpb24oKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbG90IG9uIHNjcmVlbiBmaXhlZCBpdHMgb3duIGhlaWdodC5cbiAgICpcbiAgICogVGhlIGNvdW50cyBhbmQgaGVhdG1hcCBsYXlvdXRzIHNpemUgdGhlbXNlbHZlcyB0byB0aGVpciByb3cgY291bnQsIHNvIGluIHRoZSBkZXRhY2hlZFxuICAgKiB3aW5kb3cgdGhleSBjYW4gYmUgVEFMTEVSIHRoYW4gdGhlIHdpbmRvdyDigJQgd2hpY2ggaGFzIHRvIHNjcm9sbCByYXRoZXIgdGhhbiBjbGlwLiBBblxuICAgKiBlbWJlZGRpbmcgZml4ZXMgbm8gaGVpZ2h0IGFuZCBmaWxscyB0aGUgd2luZG93IGluc3RlYWQuIFRoZSB0ZW1wbGF0ZSBuZWVkcyB0byBrbm93XG4gICAqIHdoaWNoLCBiZWNhdXNlIHRoZSB0d28gd2FudCBvcHBvc2l0ZSBgZmxleGAgYW5kIGBvdmVyZmxvd2AuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGhhc0ZpeGVkSGVpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsb3QuaGFzRml4ZWRIZWlnaHQ7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGFjdGl2ZSBraW5kIGRyYXdzOiBpdHMgb3duIHdpbmRvdywgb3IgdGhlIHNoYXJlZCBjaGFydCBkaXYuICovXG4gIGdldCBwbG90VGFyZ2V0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGV0YWNoZWQgPyB0aGlzLmRldGFjaGVkRGl2IDogdGhpcy5jaGFydERpdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWFkZXIgZm9yIHRoZSBkZXRhY2hlZCB3aW5kb3cg4oCUIHdoYXQgaXQgaXMgc2hvd2luZywgbmFtZWQgYXMgaXRzIHRhYiBpcy5cbiAgICpcbiAgICogVGhlIGVtYmVkZGluZyBuYW1lcyB0aGUgZW1iZWRkaW5nIHJhdGhlciB0aGFuIHRoZSB0YWIsIGJlY2F1c2UgXCJFbWJlZGRpbmdcIiBiZXNpZGUgYVxuICAgKiB3aW5kb3cgZHJhd2luZyBhIHQtU05FIHNheXMgbGVzcyB0aGFuIFwidC1TTkVcIiBkb2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkZXRhY2hlZFRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMua2luZCA9PT0gJ2VtYmVkZGluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmVtYmVkZGluZz8ubGFiZWwgPz8gdGhpcy5lbWJlZGRpbmc/Lm5hbWUgPz8gJ0VtYmVkZGluZyc7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5raW5kT3B0aW9ucy5maW5kKChrKSA9PiBrLnZhbHVlID09PSB0aGlzLmtpbmQpPy5sYWJlbCA/PyAnQ2hhcnQnO1xuICAgIHJldHVybiB0aGlzLnN1YmplY3QgPyBgJHtsYWJlbH0gwrcgJHt0aGlzLnN1YmplY3R9YCA6IGxhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGFjdGl2ZSBraW5kIGJldHdlZW4gaXRzIG93biB3aW5kb3cgYW5kIHRoZSBwYW5lbC5cbiAgICpcbiAgICogUHVyZ2VzIHRoZSBkaXYgaXQgaXMgTEVBVklORyBmaXJzdC4gUGxvdGx5IGtlZXBzIHBlci1kaXYgc3RhdGUsIGFuZCBhIGdyYXBoIGxlZnRcbiAgICogYmVoaW5kIGluIGEgZGl2IHRoYXQgQW5ndWxhciB0aGVuIHJlbW92ZXMgbGVha3MgaXRzIFdlYkdMIGNvbnRleHQg4oCUIGFuZCBpZiB0aGUgZGl2XG4gICAqIGNvbWVzIGJhY2ssIHJlYWN0IHdvdWxkIHJlc2l6ZSBhIHBsb3Qgd2hvc2UgZGF0YSBiZWxvbmdzIHRvIHRoZSBvdGhlciBwbGFjZS5cbiAgICovXG4gIHByb3RlY3RlZCB0b2dnbGVEZXRhY2hlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBsZWF2aW5nID0gdGhpcy5wbG90VGFyZ2V0O1xuICAgIHRoaXMuZGV0YWNoZWQgPSAhdGhpcy5kZXRhY2hlZDtcbiAgICB0aGlzLnBsb3QucHVyZ2UobGVhdmluZyk7XG4gICAgLy8gR29pbmcgYmFjayBJTkxJTkUsIHRoZSBkaXYgYXBwZWFycyB3aXRoIHRoZSBuZXh0IGNoYW5nZSBkZXRlY3Rpb24sIHNvIGEgdGFzayBpc1xuICAgIC8vIGVub3VnaC4gR29pbmcgT1VULCB0aGUgd2luZG93J3MgZGl2IGRvZXMgbm90IGV4aXN0IHlldCDigJQgUHJpbWVORyBtb3VudHMgdGhlIGRpYWxvZ1xuICAgIC8vIHdpdGggYSB0cmFuc2l0aW9uIOKAlCBzbyB0aGUgZGlhbG9nJ3Mgb3duIGBvblNob3dgIGRyaXZlcyB0aGF0IGRyYXcgaW5zdGVhZC4gQSBzaW5nbGVcbiAgICAvLyBkZWZlcnJlZCBhdHRlbXB0IGRyZXcgbm90aGluZyBhbmQgbmV2ZXIgcmV0cmllZC5cbiAgICBpZiAoIXRoaXMuZGV0YWNoZWQpIHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJlbmRlcigpLCAwKTtcbiAgfVxuXG4gIC8qKiBUaGUgZGV0YWNoZWQgd2luZG93IGlzIHVwIGFuZCBpdHMgZGl2IGV4aXN0cyDigJQgbm93IHRoZSBwbG90IGNhbiBiZSBkcmF3biBpbnRvIGl0LiAqL1xuICBwcm90ZWN0ZWQgb25EZXRhY2hlZFdpbmRvd1Nob3duKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBSZS1maXQgdGhlIGRldGFjaGVkIHdpbmRvdydzIHBsb3QgYWZ0ZXIgaXQgaXMgcmVzaXplZC4gKi9cbiAgcHJvdGVjdGVkIG9uRGV0YWNoZWRSZXNpemVFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5wbG90LnJlZml0KHRoaXMuZGV0YWNoZWREaXYpO1xuICB9XG5cbiAgLyoqIFRoZSBnZW5lIHBpY2tlcidzIGZpbHRlciBib3ggY2hhbmdlZDogc2VhcmNoIHRoZSByZXNpZGVudCBuYW1lcywgc2hvdyB0aGUgYmVzdC4gKi9cbiAgcHJvdGVjdGVkIG9uR2VuZUZpbHRlcihxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhLmZpbHRlckdlbmVzKHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKiBSb3VnaGx5IGhvdyBsb25nIGEgcnVuIHdpbGwgdGFrZSwgaW4gc2Vjb25kcywgZnJvbSB0aGUgbWVhc3VyZWQgYW5jaG9yLiAqL1xuICBnZXQgY29tcHV0ZUVzdGltYXRlU2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuZXN0aW1hdGVTZWNvbmRzO1xuICB9XG5cbiAgLyoqIFRoYXQgZXN0aW1hdGUgYXMgc29tZXRoaW5nIHRvIHB1dCBvbiBhIGJ1dHRvbi4gKi9cbiAgcHJvdGVjdGVkIGdldCBjb21wdXRlRXN0aW1hdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuZXN0aW1hdGVMYWJlbDtcbiAgfVxuXG4gIC8qKiBXaHkgdGhlIG9wdGlvbiBpcyBhYnNlbnQsIHdoZW4gYSBkYXRhc2V0IGlzIHBhc3QgdGhlIHRocmVzaG9sZC4gKi9cbiAgcHJvdGVjdGVkIGdldCB0c25lVG9vTGFyZ2VOb3RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZS50b29MYXJnZU5vdGU7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgc2VsZWN0ZWQgZW1iZWRkaW5nIGlzIG9uZSB0aGlzIGJyb3dzZXIgd291bGQgaGF2ZSB0byBjb21wdXRlLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzQ29tcHV0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLmlzQ29tcHV0YWJsZSh0aGlzLmVtYmVkZGluZyk7XG4gIH1cblxuICAvKiogV2hldGhlciBpdCBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkIGluIHRoaXMgc2Vzc2lvbi4gKi9cbiAgcHJvdGVjdGVkIGdldCBpc0NvbXB1dGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuaXNDb21wdXRlZCh0aGlzLmVtYmVkZGluZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlzQ29tcHV0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUucnVubmluZztcbiAgfVxuXG4gIC8qKiBDb21wdXRlIHRoZSBzZWxlY3RlZCBlbWJlZGRpbmcgaGVyZSwgaW4gYSB3b3JrZXIsIHRoZW4gZHJhdyBpdC4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNvbXB1dGVFbWJlZGRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZW1iZWRkaW5nO1xuICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5jb250cm9scztcbiAgICBpZiAoIW1ldGEgfHwgIWNvbnRyb2xzPy5nZXRFbWJlZGRpbmcgfHwgdGhpcy5pc0NvbXB1dGluZykgcmV0dXJuO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29tcHV0ZS5zdGFydChtZXRhLCB0aGlzLmVtYmVkZGluZ3MsIChuYW1lKSA9PiBjb250cm9scy5nZXRFbWJlZGRpbmchKG5hbWUpKTtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuICAgIHRoaXMuZGF0YS5lbWJlZGRpbmdDb29yZHMgPSByZXN1bHQ7XG4gICAgYXdhaXQgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBTdG9wIGEgcnVuLiBJdCBzZXR0bGVzIHNob3J0bHkgYWZ0ZXIsIGxlYXZpbmcgbm8gZW1iZWRkaW5nLiAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsQ29tcHV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXB1dGUuY2FuY2VsKCk7XG4gIH1cblxuICAvKiogV2hpY2ggZW1iZWRkaW5nIHRvIGRyYXcsIHdoZW4gdGhlIGRhdGFzZXQgcHVibGlzaGVzIG1vcmUgdGhhbiBvbmUuICovXG4gIHByb3RlY3RlZCBvbkVtYmVkZGluZyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLnNlbGVjdEVtYmVkZGluZyhuYW1lKSkgdm9pZCB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGNoYXJ0IG9uIHNjcmVlbiBzaG93cywgYW5kIHdoYXQgaXQgY2Fubm90IGJlIHJlYWQgZm9yIOKAlCBzZWUge0BsaW5rIGtpbmRIZWxwfS4gKi9cbiAgcHJvdGVjdGVkIGdldCBraW5kSGVscCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBraW5kSGVscCh0aGlzLmtpbmQsIHRoaXMuZW1iZWRkaW5nKTtcbiAgfVxuXG4gIC8qKiBXaGF0IHRoZSBlbWJlZGRpbmcgdmlldyBpcyBzaG93aW5nLCBzYWlkIHBsYWlubHkuICovXG4gIHByb3RlY3RlZCBnZXQgZW1iZWRkaW5nTm90ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBlbWJlZGRpbmdOb3RlKFxuICAgICAgdGhpcy5kYXRhLmVtYmVkZGluZ0Nvb3Jkcz8ubWV0YSA/PyB0aGlzLmVtYmVkZGluZyxcbiAgICAgIHRoaXMuZGF0YS5pc0NhdGVnb3JpY2FsLFxuICAgICAgdGhpcy5zZWxlY3Rpb24uY291bnQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBQdXJnZSB0aGUgQUNUSVZFIHRhcmdldDogcHVyZ2luZyB0aGUgaW5saW5lIGRpdiB3aGlsZSBkZXRhY2hlZCB3b3VsZCBsZWF2ZSB0aGUgd2luZG93XG4gICAqICBzaG93aW5nIGEgcGxvdCB0aGUgY29tcG9uZW50IGJlbGlldmVzIGl0IGhhcyBjbGVhcmVkLiAqL1xuICBwcml2YXRlIHB1cmdlUGxvdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3QucHVyZ2UodGhpcy5wbG90VGFyZ2V0KTtcbiAgfVxuXG4gIC8qKiBEcmF3IGludG8gdGhlIGFjdGl2ZSB0YXJnZXQuICovXG4gIHByaXZhdGUgZHJhdyh0cmFjZXM6IHVua25vd24sIGxheW91dDogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnBsb3QuZHJhdyh0aGlzLnBsb3RUYXJnZXQsIHRyYWNlcywgbGF5b3V0KTtcbiAgfVxuXG4gIC8qKiBEcmF3IHRoZSBhY3RpdmUga2luZCwgdGhlbiByZS1yZW5kZXIgdGhlIHBhbmVsIGFyb3VuZCBpdCAobm90aWNlcywgaGVpZ2h0LCBub3RlcykuICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlckNoYXJ0KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVyQ2hhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgLy8gR3VhcmQgb24gdGhlIGRpdiB0aGUgQUNUSVZFIGtpbmQgd2lsbCBkcmF3IGludG8sIG5vdCBhbHdheXMgdGhlIHNoYXJlZCBvbmUuIFdoaWxlIGFcbiAgICAvLyBraW5kIGlzIGRldGFjaGVkIHRoZSBpbmxpbmUgZGl2IGlzIHJlbW92ZWQgYnkgaXRzIGAqbmdJZmAsIHNvIGNoZWNraW5nIHRoYXQgb25lXG4gICAgLy8gYmFpbGVkIGhlcmUgYW5kIHRoZSBkZXRhY2hlZCB3aW5kb3cgbmV2ZXIgZ290IGEgcGxvdC5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBsb3RUYXJnZXQ7XG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQpKSByZXR1cm47XG4gICAgLy8gQW55dGhpbmcgYnV0IHRoZSBlbWJlZGRpbmcgaW5oZXJpdHMgYSBkaXYgdGhlIGVtYmVkZGluZyBtYXkgaGF2ZSBib3VuZCBoYW5kbGVycyBvbi5cbiAgICBpZiAodGhpcy5raW5kICE9PSAnZW1iZWRkaW5nJykgdGhpcy5wbG90LnVuYmluZFNlbGVjdGlvbih0YXJnZXQpO1xuICAgIC8vIEEgaGVhdG1hcCBzdGlsbCBjb21wdXRpbmcgbXVzdCBub3QgZHJhdyBvdmVyIHRoZSBraW5kIHRoYXQgcmVwbGFjZWQgaXQuXG4gICAgaWYgKHRoaXMua2luZCAhPT0gJ2hlYXRtYXAnKSB0aGlzLmhlYXRtYXBSZW5kZXIuY2FuY2VsKCk7XG4gICAgLy8gVGhlIGhlYXRtYXAgYW5zd2VycyBhIGRpZmZlcmVudCBxdWVzdGlvbiBmcm9tIHRoZSBvdGhlciBraW5kcyDigJQgd2hpY2hcbiAgICAvLyBnZW5lcyBkaXN0aW5ndWlzaCB3aGljaCBncm91cHMg4oCUIHNvIGl0IGlzIGRyaXZlbiBieSBpdHMgb3duIGdlbmUgbGlzdCBhbmRcbiAgICAvLyBncm91cGluZyByYXRoZXIgdGhhbiBieSB3aGF0ZXZlciB0aGUgbWFwIGlzIGNvbG91cmVkIGJ5LlxuICAgIGlmICh0aGlzLmtpbmQgPT09ICdoZWF0bWFwJykge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJIZWF0bWFwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEFsc28gaW5kZXBlbmRlbnQgb2YgdGhlIGFjdGl2ZSBjb2xvdXIgc291cmNlOiB0aGUgY29vcmRpbmF0ZXMgYXJlIHRoZSBkYXRhc2V0J3MsXG4gICAgLy8gYW5kIHRoZSBjb2xvdXJpbmcgbWVyZWx5IGZvbGxvd3Mgd2hhdGV2ZXIgdGhlIG1hcCBpcyB1c2luZy5cbiAgICBpZiAodGhpcy5raW5kID09PSAnZW1iZWRkaW5nJykge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJFbWJlZGRpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB2YWx1ZXMsIGNhdGVnb3JpY2FsLCBncm91cGluZyB9ID0gdGhpcy5kYXRhLnNuYXBzaG90KCk7XG4gICAgaWYgKCF0aGlzLmNvbG9yQnkgfHwgKCF2YWx1ZXMgJiYgIWNhdGVnb3JpY2FsKSkge1xuICAgICAgdGhpcy5wdXJnZVBsb3QoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNhdGVnb3JpY2FsKSB7XG4gICAgICBjb25zdCBjb3VudHMgPSB7XG4gICAgICAgIGdyb3VwOiBjYXRlZ29yaWNhbCxcbiAgICAgICAgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbi5jb3VudCA+IDAgPyB0aGlzLnNlbGVjdGlvbi5tYXNrIDogbnVsbCxcbiAgICAgICAgbmFtZTogdGhpcy5jb2xvckJ5Lm5hbWUsXG4gICAgICB9O1xuICAgICAgLy8gQ291bnRlZCBvbmNlIGZvciBib3RoOiB0aGUgbGF5b3V0J3MgaGVpZ2h0IGZvbGxvd3MgdGhlIGJhciBjb3VudC5cbiAgICAgIGNvbnN0IHRhbGx5ID0gY291bnRCeUNhdGVnb3J5KGNvdW50cyk7XG4gICAgICBhd2FpdCB0aGlzLmRyYXcoYnVpbGRDb3VudFRyYWNlcyhjb3VudHMsIHRhbGx5KSwgY291bnRzTGF5b3V0KGNvdW50cywgdGFsbHkpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZXMpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIG5hbWU6IHRoaXMuY29sb3JCeS5uYW1lLFxuICAgICAgZ3JvdXA6IGJlbmVmaXRzRnJvbUdyb3VwaW5nKHRoaXMua2luZCkgPyBncm91cGluZyA6IG51bGwsXG4gICAgICBzZWxlY3Rpb246IHRoaXMuc2VsZWN0aW9uLmNvdW50ID4gMCA/IHRoaXMuc2VsZWN0aW9uLm1hc2sgOiBudWxsLFxuICAgICAgbG9nOiB0aGlzLnZpZXcubG9nU2NhbGUsXG4gICAgfTtcbiAgICBjb25zdCB0cmFjZXMgPSBidWlsZE9taWNzVHJhY2VzKHRoaXMua2luZCwgaW5wdXQpO1xuICAgIGF3YWl0IHRoaXMuZHJhdyh0cmFjZXMsIG9taWNzTGF5b3V0KHRoaXMua2luZCwgaW5wdXQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcyDDlyBncm91cHMgbWVhbiBleHByZXNzaW9uLlxuICAgKlxuICAgKiBDb2x1bW5zIGFyZSB0aGUgZ3JvdXBpbmcgY29sdW1uJ3MgY2F0ZWdvcmllcyDigJQgb3IsIGluc2lkZSBhIFNNQUxMXG4gICAqIHNlbGVjdGlvbiwgdGhlIHNlbGVjdGVkIGNlbGxzIHRoZW1zZWx2ZXMuIEEgdHdvLWNvbHVtbiBjbGFzcyBtYXRyaXggaXMgYVxuICAgKiBwb29yIGFuc3dlciBmb3IgYW4gUk9JIGhvbGRpbmcgZm9ydHkgY2VsbHM7IFwid2hhdCBpcyBpbiBmcm9udCBvZiBtZVwiIGlzIHRoZVxuICAgKiBxdWVzdGlvbiB0aGVyZSwgYW5kIGVhY2ggY2VsbCBlYXJucyBhIGNvbHVtbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySGVhdG1hcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGhlYXRtYXBSb3dzOiBnZW5lcywgZ3JvdXBpbmcgfSA9IHRoaXMuZGF0YS5zbmFwc2hvdCgpO1xuICAgIGlmICghdGhpcy5jb250cm9scyB8fCBnZW5lcy5sZW5ndGggPT09IDAgfHwgIWdyb3VwaW5nKSB7XG4gICAgICB0aGlzLnB1cmdlUGxvdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyh0aGlzLnNlbGVjdGlvbi5tYXNrKSA6IG51bGw7XG4gICAgY29uc3QgcGVyQ2VsbCA9ICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoIDw9IFNwYXRpYWxDaGFydHNDb21wb25lbnQuSEVBVE1BUF9DRUxMX0NPTFVNTlM7XG4gICAgY29uc3QgY2VsbHMgPVxuICAgICAgcGVyQ2VsbCAmJiBzZWxlY3RlZFxuICAgICAgICA/IGNlbGxzQXNHcm91cHMoc2VsZWN0ZWQsIGdyb3VwaW5nLmNvZGVzLmxlbmd0aCwgU3BhdGlhbENoYXJ0c0NvbXBvbmVudC5IRUFUTUFQX0NFTExfQ09MVU1OUylcbiAgICAgICAgOiBudWxsO1xuXG4gICAgLy8gT2ZmIHRoZSBtYWluIHRocmVhZCBmb3IgYSBiaWcgZGF0YXNldCAoZ2VuZXMgw5cgY2VsbHMgcGFzdCB0aGUgd29ya2VyIHRocmVzaG9sZCksIGFuZFxuICAgIC8vIHN1cGVyc2VkZWQgYnkgdGhlIG5leHQgaGVhdG1hcCBkcmF3OiBhIHNsb3cgbWF0cml4IGZvciBhbiBlYXJsaWVyIGdlbmUgbGlzdCBvclxuICAgIC8vIHNlbGVjdGlvbiBtdXN0IG5vdCBsYW5kIG92ZXIgdGhlIGN1cnJlbnQgb25lLCBhbmQgaXRzIHdvcmtlciBzdG9wcy5cbiAgICBjb25zdCB0YXNrID0gdGhpcy5oZWF0bWFwUmVuZGVyLm5leHQoKTtcbiAgICBsZXQgbWF0cml4OiBIZWF0bWFwTWF0cml4IHwgbnVsbDtcbiAgICB0cnkge1xuICAgICAgbWF0cml4ID0gYXdhaXQgY29tcHV0ZUhlYXRtYXBNYXRyaXhBc3luYyhcbiAgICAgICAgZ2VuZXMsXG4gICAgICAgIGNlbGxzID8gY2VsbHMuZ3JvdXBzIDogeyBjb2RlczogZ3JvdXBpbmcuY29kZXMsIGNhdGVnb3JpZXM6IGdyb3VwaW5nLmNhdGVnb3JpZXMgfSxcbiAgICAgICAge1xuICAgICAgICAgIC4uLihjZWxscyA/IHsgaW5kaWNlczogY2VsbHMuaW5kaWNlcywgbWluQ2VsbHM6IDEgfSA6IHt9KSxcbiAgICAgICAgICAvLyBPdXRzaWRlIHRoZSBwZXItY2VsbCB2aWV3IGEgc2VsZWN0aW9uIHN0aWxsIG5hcnJvd3MgdGhlIG1lYW5zLCB0aGUgd2F5XG4gICAgICAgICAgLy8gdGhlIHZpb2xpbiBhbmQgYm94IG5hcnJvdyByYXRoZXIgdGhhbiBvdmVybGF5LlxuICAgICAgICAgIC4uLighY2VsbHMgJiYgc2VsZWN0ZWQgPyB7IGluZGljZXM6IHNlbGVjdGVkIH0gOiB7fSksXG4gICAgICAgICAgLy8gT25seSB0aGUgZ3JvdXBlZCB2aWV3OiBgY2VsbHNBc0dyb3Vwc2AgYWxyZWFkeSBjYXBzIGJ5IGV2ZW4gdGhpbm5pbmcsXG4gICAgICAgICAgLy8gYW5kIHJlLXJhbmtpbmcgdGhvc2UgY29sdW1ucyB3b3VsZCBsb3NlIHRoZSBzZWxlY3Rpb24ncyBzcHJlYWQuXG4gICAgICAgICAgLi4uKGNlbGxzID8ge30gOiB7IG1heENvbHM6IFNwYXRpYWxDaGFydHNDb21wb25lbnQuSEVBVE1BUF9NQVhfQ09MVU1OUyB9KSxcbiAgICAgICAgICB6U2NvcmU6IHRoaXMuaGVhdG1hcFpTY29yZSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBzaWduYWw6IHRhc2suc2lnbmFsIH0sXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGlmICghdGFzay5pc0N1cnJlbnQoKSkgcmV0dXJuO1xuICAgIGlmICghbWF0cml4KSB7XG4gICAgICB0aGlzLnB1cmdlUGxvdCgpO1xuICAgICAgdGhpcy5ub3RpY2UgPSAnTm8gZ3JvdXAgaGFzIGVub3VnaCBtZWFzdXJlZCBjZWxscyBmb3IgYSBtZWFuLic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubm90aWNlID0gbnVsbDtcbiAgICB0aGlzLmhlYXRtYXBIaWRkZW4gPSBtYXRyaXguaGlkZGVuQ29scztcbiAgICBjb25zdCBpbnB1dCA9IHtcbiAgICAgIHJvd3M6IG1hdHJpeC5yb3dzLFxuICAgICAgY29sczogbWF0cml4LmNvbHMsXG4gICAgICB2YWx1ZXM6IG1hdHJpeC52YWx1ZXMsXG4gICAgICBjb3VudHM6IG1hdHJpeC5jb3VudHMsXG4gICAgICB6U2NvcmVkOiB0aGlzLmhlYXRtYXBaU2NvcmUsXG4gICAgICBncm91cExhYmVsOiBjZWxscyA/ICdzZWxlY3RlZCBjZWxscycgOiAodGhpcy5ncm91cEJ5ID8/ICcnKSxcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMuZHJhdyhidWlsZEhlYXRtYXBUcmFjZXMoaW5wdXQpLCBoZWF0bWFwTGF5b3V0KGlucHV0KSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzeC1ib2R5XCIgKm5nSWY9XCJjb250cm9sc1wiPlxuICA8IS0tIFRoZSBjaGFydCBmb2xsb3dzIHdoYXRldmVyIHRoZSBtYXAgaXMgY29sb3VyZWQgYnksIHNvIHRoZSB0d28gY2FuIG5ldmVyXG4gICAgICAgZGlzYWdyZWUgYWJvdXQgd2hhdCBpcyBiZWluZyBzaG93bi4gLS0+XG4gIDxkaXYgY2xhc3M9XCJzeC1oZWFkXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzeC1zdWJqZWN0XCIgKm5nSWY9XCJzdWJqZWN0XCI+e3sgc3ViamVjdCB9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInN4LXN1YmplY3Qgc3gtbXV0ZWRcIiAqbmdJZj1cIiFzdWJqZWN0XCI+bm90aGluZyBzZWxlY3RlZCB0byBjaGFydDwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInN4LWJhZGdlXCIgKm5nSWY9XCJzZWxlY3Rpb25Db3VudFwiPiB7eyBzZWxlY3Rpb25Db3VudCB8IG51bWJlciB9fSBzZWxlY3RlZCA8L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1zcGluIHBpLXNwaW5uZXIgc3gtYnVzeVwiICpuZ0lmPVwiYnVzeVwiIGFyaWEtbGFiZWw9XCJsb2FkaW5nXCI+PC9pPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic3gtY29udHJvbHNcIj5cbiAgICA8cC1zZWxlY3RCdXR0b25cbiAgICAgIFtvcHRpb25zXT1cImtpbmRPcHRpb25zXCJcbiAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJraW5kXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uS2luZCgkZXZlbnQpXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJzeC1raW5kXCJcbiAgICA+PC9wLXNlbGVjdEJ1dHRvbj5cbiAgICA8cC1kcm9wZG93blxuICAgICAgW29wdGlvbnNdPVwiZ3JvdXBPcHRpb25zXCJcbiAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJncm91cEJ5XCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uR3JvdXBCeSgkZXZlbnQpXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiTm8gZ3JvdXBpbmdcIlxuICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgIFtkaXNhYmxlZF09XCJraW5kID09PSAnaGlzdG9ncmFtJ1wiXG4gICAgICBbcFRvb2x0aXBdPVwiXG4gICAgICAgIGtpbmQgPT09ICdoZWF0bWFwJ1xuICAgICAgICAgID8gJ1RoZSBjYXRlZ29yaWNhbCBjb2x1bW4gdGhlIGhlYXRtYXBcXCdzIGNvbHVtbnMgY29tZSBmcm9tJ1xuICAgICAgICAgIDogJ1NwbGl0IGEgdmlvbGluIG9yIGJveCBieSBhIGNhdGVnb3JpY2FsIGNvbHVtbidcbiAgICAgIFwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgID48L3AtZHJvcGRvd24+XG4gICAgPCEtLSBXaGF0IHRoZSBjaGFydCBvbiBzY3JlZW4gc2hvd3MsIGFuZCB3aGF0IGl0IG11c3QgTk9UIGJlIHJlYWQgZm9yLiBFYWNoIG9mIHRoZXNlXG4gICAgICAgICBhbnN3ZXJzIGEgZGlmZmVyZW50IHF1ZXN0aW9uIGFuZCB0d28gYXJlIHJvdXRpbmVseSBvdmVyLXJlYWQsIHNvIHRoZSBjYXZlYXRcbiAgICAgICAgIHRyYXZlbHMgd2l0aCB0aGUgZXhwbGFuYXRpb24uIC0tPlxuICAgIDxpXG4gICAgICBjbGFzcz1cInBpIHBpLXF1ZXN0aW9uLWNpcmNsZSBzeC1oZWxwXCJcbiAgICAgIFtwVG9vbHRpcF09XCJraW5kSGVscFwiXG4gICAgICBbZXNjYXBlXT1cImZhbHNlXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxuICAgICAgdG9vbHRpcFN0eWxlQ2xhc3M9XCJzeC1oZWxwLXRpcFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBYm91dCB0aGUgJyArIGtpbmQgKyAnIGNoYXJ0J1wiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgID48L2k+XG4gIDwvZGl2PlxuXG4gIDxzcGF0aWFsLWhlYXRtYXAtY29udHJvbHNcbiAgICAqbmdJZj1cImtpbmQgPT09ICdoZWF0bWFwJ1wiXG4gICAgW2dlbmVPcHRpb25zXT1cImdlbmVPcHRpb25zXCJcbiAgICBbZ2VuZXNdPVwiaGVhdG1hcEdlbmVzXCJcbiAgICBbelNjb3JlXT1cImhlYXRtYXBaU2NvcmVcIlxuICAgIChnZW5lc0NoYW5nZSk9XCJvbkhlYXRtYXBHZW5lcygkZXZlbnQpXCJcbiAgICAoZmlsdGVyQ2hhbmdlKT1cIm9uR2VuZUZpbHRlcigkZXZlbnQpXCJcbiAgICAoelNjb3JlQ2hhbmdlKT1cIm9uSGVhdG1hcFpTY29yZSgkZXZlbnQpXCJcbiAgPjwvc3BhdGlhbC1oZWF0bWFwLWNvbnRyb2xzPlxuXG4gIDxzcGF0aWFsLWVtYmVkZGluZy1jb250cm9sc1xuICAgIFtpc0VtYmVkZGluZ109XCJraW5kID09PSAnZW1iZWRkaW5nJ1wiXG4gICAgW2VtYmVkZGluZ3NdPVwiZW1iZWRkaW5nc1wiXG4gICAgW2VtYmVkZGluZ109XCJlbWJlZGRpbmdcIlxuICAgIFtjb21wdXRhYmxlXT1cImlzQ29tcHV0YWJsZVwiXG4gICAgW2NvbXB1dGVkXT1cImlzQ29tcHV0ZWRcIlxuICAgIFtydW5uaW5nXT1cImlzQ29tcHV0aW5nXCJcbiAgICBbc3RhdGVdPVwiY29tcHV0ZVN0YXRlXCJcbiAgICBbZXN0aW1hdGVMYWJlbF09XCJjb21wdXRlRXN0aW1hdGVMYWJlbFwiXG4gICAgW3Rvb0xhcmdlTm90ZV09XCJ0c25lVG9vTGFyZ2UgPyB0c25lVG9vTGFyZ2VOb3RlIDogbnVsbFwiXG4gICAgW2RldGFjaGVkXT1cImRldGFjaGVkXCJcbiAgICAoZW1iZWRkaW5nQ2hhbmdlKT1cIm9uRW1iZWRkaW5nKCRldmVudClcIlxuICAgIChjb21wdXRlKT1cImNvbXB1dGVFbWJlZGRpbmcoKVwiXG4gICAgKGNhbmNlbCk9XCJjYW5jZWxDb21wdXRlKClcIlxuICAgIChkZXRhY2hlZFRvZ2dsZSk9XCJ0b2dnbGVEZXRhY2hlZCgpXCJcbiAgPlxuICA8L3NwYXRpYWwtZW1iZWRkaW5nLWNvbnRyb2xzPlxuXG4gIDxkaXYgW2lkXT1cImNoYXJ0RGl2XCIgY2xhc3M9XCJzeC1wbG90XCIgKm5nSWY9XCIhZGV0YWNoZWRcIj48L2Rpdj5cblxuICA8IS0tIERldGFjaGVkOiB0aGUgY2hhcnQga2VlcHMgZHJhd2luZywgaW4gaXRzIG93biB3aW5kb3cuIFNheXMgc28gcmF0aGVyIHRoYW5cbiAgICAgICBsZWF2aW5nIGEgYmxhbmsgcGFuZWwgdGhhdCBsb29rcyBicm9rZW4uIC0tPlxuICA8ZGl2IGNsYXNzPVwic3gtZGV0YWNoZWRcIiAqbmdJZj1cImRldGFjaGVkXCI+U2hvd24gaW4gaXRzIG93biB3aW5kb3cuPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhpbnRzXCI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPCEtLSBEZWNsYXJlZCBvbmNlIGFuZCByZW5kZXJlZCBpbiBib3RoIHRoZSBwYW5lbCBhbmQgdGhlIGRldGFjaGVkIHdpbmRvdzogdGhlIGxhZGRlciBpc1xuICAgICBkZWxpYmVyYXRlbHkgbm90IG11dHVhbGx5IGV4Y2x1c2l2ZSAoYSBoZWF0bWFwIHN0aWxsIG5lZWRzIGl0cyBncm91cGluZyBwcm9tcHQpLCBzb1xuICAgICBjb2xsYXBzaW5nIGl0IHRvIGEgc2luZ2xlIGV4cHJlc3Npb24gd291bGQgZHJvcCBhIGhpbnQgcmF0aGVyIHRoYW4gbW92ZSBpdC4gLS0+XG48bmctdGVtcGxhdGUgI2hpbnRzPlxuICA8c21hbGwgY2xhc3M9XCJzeC1oaW50XCIgKm5nSWY9XCJub3RpY2VcIj57eyBub3RpY2UgfX08L3NtYWxsPlxuICA8c21hbGwgY2xhc3M9XCJzeC1oaW50XCIgKm5nSWY9XCIhbm90aWNlICYmIHN1Z2dlc3RzR3JvdXBpbmdcIj4gUGljayBhIGdyb3VwaW5nIHRvIGNvbXBhcmUgY2F0ZWdvcmllcy4gPC9zbWFsbD5cbiAgPHNtYWxsIGNsYXNzPVwic3gtaGludFwiICpuZ0lmPVwiIW5vdGljZSAmJiBzZWxlY3Rpb25Db3VudCAmJiBraW5kID09PSAnaGlzdG9ncmFtJ1wiPlxuICAgIFRoZSBzZWxlY3Rpb24gaXMgb3ZlcmxhaWQgb24gdGhlIGZ1bGwgZGlzdHJpYnV0aW9uLlxuICA8L3NtYWxsPlxuICA8c21hbGwgY2xhc3M9XCJzeC1oaW50XCIgKm5nSWY9XCIhbm90aWNlICYmIHNlbGVjdGlvbkNvdW50ICYmIGtpbmQgIT09ICdoaXN0b2dyYW0nICYmIGtpbmQgIT09ICdoZWF0bWFwJ1wiPlxuICAgIFNob3dpbmcgdGhlIHNlbGVjdGlvbiBvbmx5LlxuICA8L3NtYWxsPlxuICA8c21hbGwgY2xhc3M9XCJzeC1oaW50XCIgKm5nSWY9XCIhbm90aWNlICYmIGtpbmQgPT09ICdoZWF0bWFwJ1wiPnt7IGhlYXRtYXBOb3RlIH19PC9zbWFsbD5cbiAgPHNtYWxsIGNsYXNzPVwic3gtaGludFwiICpuZ0lmPVwiIW5vdGljZSAmJiBraW5kID09PSAnZW1iZWRkaW5nJ1wiPnt7IGVtYmVkZGluZ05vdGUgfX08L3NtYWxsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPHNwYXRpYWwtY2hhcnQtd2luZG93XG4gICpuZ0lmPVwiZGV0YWNoZWRcIlxuICBbdGl0bGVdPVwiZGV0YWNoZWRUaXRsZVwiXG4gIFtkaXZJZF09XCJkZXRhY2hlZERpdlwiXG4gIFtmaXhlZEhlaWdodF09XCJoYXNGaXhlZEhlaWdodFwiXG4gIChjbG9zZWQpPVwidG9nZ2xlRGV0YWNoZWQoKVwiXG4gIChzaG93bik9XCJvbkRldGFjaGVkV2luZG93U2hvd24oKVwiXG4gIChyZXNpemVFbmQpPVwib25EZXRhY2hlZFJlc2l6ZUVuZCgpXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhpbnRzXCI+PC9uZy1jb250YWluZXI+XG48L3NwYXRpYWwtY2hhcnQtd2luZG93PlxuIl19
777
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jaGFydHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsLWNvbnRyb2xzL3NwYXRpYWwtY2hhcnRzL3NwYXRpYWwtY2hhcnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNoYXJ0cy9zcGF0aWFsLWNoYXJ0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVyQyxPQUFPLEVBQUUsVUFBVSxFQUFpQyxNQUFNLHFDQUFxQyxDQUFDO0FBRWhHLE9BQU8sRUFBb0Msb0JBQW9CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RyxPQUFPLEVBQXdCLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RyxPQUFPLEVBQWlCLGFB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dCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIGluamVjdCxcbiAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1hcmtGb3JDaGVja0luWm9uZSB9IGZyb20gJy4uLy4uL3V0aWwvbWFyay1mb3ItY2hlY2snO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0YnV0dG9uJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBWSVNVQUxJWkVSLCBJVmlzdWFsaXplciwgSVNwYXRpYWxDb250cm9scyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxFbWJlZGRpbmdNZXRhIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsQ29sb3JCeSwgU3BhdGlhbFZpZXdTdGF0ZSwgREVGQVVMVF9TUEFUSUFMX1ZJRVcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uTWFzaywgZW1wdHlTZWxlY3Rpb24sIG1hc2tUb0luZGljZXMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IEhlYXRtYXBNYXRyaXgsIGNlbGxzQXNHcm91cHMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtaGVhdG1hcCc7XG5pbXBvcnQgeyBjb21wdXRlSGVhdG1hcE1hdHJpeEFzeW5jIH0gZnJvbSAnLi4vLi4vd29ya2Vycy9zcGF0aWFsLW1hdGgnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuaW1wb3J0IHtcbiAgQlJPV1NFUl9UU05FX01BWF9PQlNFUlZBVElPTlMsXG4gIEVtYmVkZGluZ0NvbXB1dGVDb29yZGluYXRvcixcbiAgRW1iZWRkaW5nQ29tcHV0ZVN0YXRlLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL2VtYmVkZGluZy1jb21wdXRlLWNvb3JkaW5hdG9yJztcbmltcG9ydCB7IENoYXJ0RGF0YU1vZGVsIH0gZnJvbSAnLi9jaGFydC1kYXRhLW1vZGVsJztcbmltcG9ydCB7IEVNQkVERElOR19DT05GSUcsIFBsb3RseUNoYXJ0SG9zdCB9IGZyb20gJy4vcGxvdGx5LWNoYXJ0LWhvc3QnO1xuaW1wb3J0IHsgQ2hhcnRLaW5kT3B0aW9uLCBjaGFydEtpbmRPcHRpb25zLCBlbWJlZGRpbmdOb3RlLCBoZWF0bWFwTm90ZSwga2luZEhlbHAgfSBmcm9tICcuL2NoYXJ0LWhlbHAnO1xuaW1wb3J0IHtcbiAgT21pY3NDaGFydEtpbmQsXG4gIGJlbmVmaXRzRnJvbUdyb3VwaW5nLFxuICBidWlsZENvdW50VHJhY2VzLFxuICBidWlsZEhlYXRtYXBUcmFjZXMsXG4gIGNvdW50QnlDYXRlZ29yeSxcbiAgYnVpbGRPbWljc1RyYWNlcyxcbiAgYnVpbGRFbWJlZGRpbmdUcmFjZXMsXG4gIGNvdW50c0xheW91dCxcbiAgaGVhdG1hcExheW91dCxcbiAgb21pY3NMYXlvdXQsXG4gIGVtYmVkZGluZ0xheW91dCxcbn0gZnJvbSAnLi4vLi4vaW1wbGVtZW50YXRpb25zL3Bsb3RseS9vbWljcy10cmFjZS1idWlsZGVycyc7XG5pbXBvcnQgeyBTcGF0aWFsSGVhdG1hcENvbnRyb2xzQ29tcG9uZW50IH0gZnJvbSAnLi9zcGF0aWFsLWhlYXRtYXAtY29udHJvbHMvc3BhdGlhbC1oZWF0bWFwLWNvbnRyb2xzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTcGF0aWFsRW1iZWRkaW5nQ29udHJvbHNDb21wb25lbnQgfSBmcm9tICcuL3NwYXRpYWwtZW1iZWRkaW5nLWNvbnRyb2xzL3NwYXRpYWwtZW1iZWRkaW5nLWNvbnRyb2xzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTcGF0aWFsQ2hhcnRXaW5kb3dDb21wb25lbnQgfSBmcm9tICcuL3NwYXRpYWwtY2hhcnQtd2luZG93L3NwYXRpYWwtY2hhcnQtd2luZG93LmNvbXBvbmVudCc7XG5cbi8qKlxuICogV2lkZW4gdGhlIGhlbHAgdG9vbHRpcCwgb25jZSBwZXIgZG9jdW1lbnQuXG4gKlxuICogUHJpbWVORyBjYXBzIGAucC10b29sdGlwYCBhdCAxMi41cmVtIGFuZCBhcHBlbmRzIGl0IHRvIGA8Ym9keT5gLCBzbyBhIGNvbXBvbmVudFxuICogc3R5bGVzaGVldCBjYW5ub3QgcmVhY2ggaXQg4oCUIHRoZSBzYW1lIHJlYXNvbiB0aGUgZGV0YWNoZWQgZGlhbG9nIGlzIHNpemVkIGlubGluZS4gQXRcbiAqIDIwMCBweCB0aGUgY2hhcnQgZXhwbGFuYXRpb25zIHJlbmRlciBhcyBhIHRhbGwgdGhyZWFkIG9mIHR3by13b3JkIGxpbmVzLCB3aGljaCBpcyB3b3JzZVxuICogdGhhbiBub3Qgc2hvd2luZyB0aGVtLiBUaGUgbGlicmFyeSBzaGlwcyBubyBnbG9iYWwgc3R5bGVzaGVldCB0byBwdXQgdGhpcyBpbiwgc28gb25lXG4gKiBydWxlIGlzIGluamVjdGVkIGluc3RlYWQ6IHNjb3BlZCB0byB0aGlzIGNvbXBvbmVudCdzIG93biB0b29sdGlwIGNsYXNzLCBpZGVtcG90ZW50LCBhbmRcbiAqIHNraXBwZWQgd2hlcmUgdGhlcmUgaXMgbm8gZG9jdW1lbnQuXG4gKi9cbmNvbnN0IEhFTFBfVElQX1NUWUxFX0lEID0gJ3N4LWhlbHAtdGlwLXN0eWxlJztcbmZ1bmN0aW9uIGVuc3VyZUhlbHBUaXBTdHlsZSgpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEhFTFBfVElQX1NUWUxFX0lEKSkgcmV0dXJuO1xuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLmlkID0gSEVMUF9USVBfU1RZTEVfSUQ7XG4gIHN0eWxlLnRleHRDb250ZW50ID1cbiAgICAnLnN4LWhlbHAtdGlwIC5wLXRvb2x0aXAtdGV4dCB7IG1heC13aWR0aDogbm9uZTsgd2lkdGg6IDI0cmVtOyAnICtcbiAgICAnbGluZS1oZWlnaHQ6IDEuNDU7IH1cXG4uc3gtaGVscC10aXAgeyBtYXgtd2lkdGg6IG5vbmU7IH0nO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cblxuLyoqIFBlci1pbnN0YW5jZSBjaGFydC1kaXYgaWQgc291cmNlIOKAlCBzZWUge0BsaW5rIFNwYXRpYWxDaGFydHNDb21wb25lbnQuY2hhcnREaXZ9LiAqL1xubGV0IGNoYXJ0SW5zdGFuY2VTZXEgPSAwO1xuXG4vKipcbiAqIERpc3RyaWJ1dGlvbiBjaGFydHMgb3ZlciB0aGUgc3BhdGlhbC1vbWljcyB2YWx1ZXMg4oCUIGhpc3RvZ3JhbSwgdmlvbGluLCBib3gg4oCUXG4gKiAqKmxpbmtlZCB0byB0aGUgbWFwKio6IHRoZXkgY2hhcnQgd2hhdGV2ZXIgdGhlIG1hcCBpcyBjb2xvdXJlZCBieSwgYW5kIG5hcnJvd1xuICogdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIEVtYmVkZGVkIElOU0lERSBgPHNwYXRpYWwtY29udHJvbHM+YCByYXRoZXIgdGhhbiBvd25pbmcgYSBkaWFsb2cgb2YgaXRzIG93bjpcbiAqIHRoZSB0d28gYXJlIG9uZSB3b3JrZmxvdyAoY2hhbmdlIHRoZSBjb2xvdXIgc291cmNlLCB3YXRjaCB0aGUgZGlzdHJpYnV0aW9uXG4gKiBtb3ZlKSwgYW5kIHNwbGl0dGluZyB0aGVtIGFjcm9zcyB0d28gZmxvYXRpbmcgd2luZG93cyBtYWRlIHRoZSBsaW5rIGhhcmRlciB0b1xuICogc2VlLCBub3QgZWFzaWVyLiBJdCBzdGF5cyBhIHNlcGFyYXRlIGNvbXBvbmVudCBzbyB0aGUgcHVyZSB0cmFjZSBidWlsZGVycyBhbmRcbiAqIGl0cyBvd24gdGVzdHMga2VlcCB0aGVpciBib3VuZGFyeS5cbiAqXG4gKiBDaGFydGluZyB0aGUgYWN0aXZlIGNvbG91ciBzb3VyY2UgcmF0aGVyIHRoYW4gb2ZmZXJpbmcgaXRzIG93biB2YWx1ZSBwaWNrZXIgaXNcbiAqIGRlbGliZXJhdGU6IGl0IGtlZXBzIG9uZSBzb3VyY2Ugb2YgdHJ1dGgsIHNvIHdoYXQgeW91IHNlZSBvbiB0aGUgbWFwIGFuZCB3aGF0XG4gKiB5b3Ugc2VlIGluIHRoZSBjaGFydCBjYW5ub3QgZGlzYWdyZWUsIGFuZCBpdCBtYWtlcyB0aGUgbGluayBsZWdpYmxlIHdpdGhvdXRcbiAqIGV4cGxhaW5pbmcgaXQuXG4gKlxuICogRGVwZW5kcyBvbmx5IG9uIHtAbGluayBJU3BhdGlhbENvbnRyb2xzfSB0aHJvdWdoIHRoZSBgVklTVUFMSVpFUmAgY29udHJhY3RcbiAqIHRva2VuLCBsaWtlIGBTcGF0aWFsQ29udHJvbHNDb21wb25lbnRgLiBUcmFjZSBidWlsZGluZyBsaXZlcyBpbiB0aGUgcHVyZVxuICogYG9taWNzLXRyYWNlLWJ1aWxkZXJzYDsgdGhpcyBjb21wb25lbnQgb25seSBtb3ZlcyBkYXRhIGFuZCBvd25zIHRoZSBkaXYuXG4gKlxuICogT25QdXNoOiBpdHMgc3RhdGUgbGl2ZXMgaW4gY29sbGFib3JhdG9ycyB0aGF0IGNoYW5nZSBhc3luY2hyb25vdXNseSAodGhlIGRhdGEgbG9hZHMsXG4gKiB0aGUgdC1TTkUgcnVuLCB0aGUgcGxvdCBob3N0KSwgc28gdGhlIGNvbnRyb2xzJyBzdHJlYW1zLCB0aGUgcnVuJ3Mgc3RhdGUsIGV2ZXJ5XG4gKiBmaW5pc2hlZCBkcmF3IGFuZCBldmVyeSBsb2FkIHN0YXJ0IG1hcmsgaXQgZm9yIGNoZWNrLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcGF0aWFsLWNoYXJ0cycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgRHJvcGRvd25Nb2R1bGUsXG4gICAgU2VsZWN0QnV0dG9uTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgU3BhdGlhbEhlYXRtYXBDb250cm9sc0NvbXBvbmVudCxcbiAgICBTcGF0aWFsRW1iZWRkaW5nQ29udHJvbHNDb21wb25lbnQsXG4gICAgU3BhdGlhbENoYXJ0V2luZG93Q29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BhdGlhbC1jaGFydHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWNoYXJ0cy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3BhdGlhbENoYXJ0c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGhvc3QgcGFuZWwgaXMgb24gc2NyZWVuLiBUaGUgY2hhcnQgb25seSBkcmF3cyB3aGVuIGl0IGlzOiB0aGVcbiAgICogZW5jbG9zaW5nIGRpYWxvZyBjcmVhdGVzIGFuZCBkZXN0cm95cyBpdHMgY29udGVudCwgc28gd2l0aG91dCB0aGlzIHRoZVxuICAgKiBjb21wb25lbnQgd291bGQgbW91bnQgd2l0aCBhIGRpdiBwcmVzZW50IGJ1dCBubyBzdGF0ZSBjaGFuZ2UgdG8gdHJpZ2dlciBhXG4gICAqIGZpcnN0IGRyYXcuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgYWN0aXZlKG9uOiBib29sZWFuKSB7XG4gICAgY29uc3Qgd2FzID0gdGhpcy5pc0FjdGl2ZTtcbiAgICB0aGlzLmlzQWN0aXZlID0gb247XG4gICAgLy8gRGVmZXJyZWQgYnkgYSB0YXNrOiB3aGVuIGEgY29sbGFwc2VkIHNlY3Rpb24gZXhwYW5kcywgdGhlIGhvc3QgaXMgc3RpbGxcbiAgICAvLyBgaGlkZGVuYCBhdCB0aGUgbW9tZW50IHRoaXMgc2V0dGVyIHJ1bnMsIHNvIHBsb3R0aW5nIG5vdyB3b3VsZCBzaXplIHRoZVxuICAgIC8vIGNoYXJ0IHRvIGEgemVyby1oZWlnaHQgZGl2LlxuICAgIGlmIChvbiAmJiAhd2FzKSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5yZWxvYWQoKSwgMCk7XG4gICAgZWxzZSBpZiAob24pIHZvaWQgdGhpcy5yZWxvYWQoKTtcbiAgfVxuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWN0aXZlO1xuICB9XG4gIHByaXZhdGUgaXNBY3RpdmUgPSB0cnVlO1xuXG4gIC8qKiBPbmUgaW5jcmVtZW50IHBlciBJTlNUQU5DRSDigJQgYSBzdGF0aWMgaW5pdGlhbGl6ZXIgd291bGQgcnVuIG9uY2UgcGVyIGNsYXNzIGFuZFxuICAgKiAgaGFuZCBldmVyeSBpbnN0YW5jZSB0aGUgc2FtZSBpZCwgd2hpY2ggaXMgdGhlIGJ1ZyB0aGlzIGlkIGV4aXN0cyB0byBhdm9pZC4gRGVjbGFyZWRcbiAgICogIGJlZm9yZSB0aGUgaWRzIGJlY2F1c2UgZmllbGQgaW5pdGlhbGl6ZXJzIHJ1biBpbiBvcmRlci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZXEgPSArK2NoYXJ0SW5zdGFuY2VTZXE7XG4gIC8qKiBQZXItaW5zdGFuY2UsIGZvciB0aGUgc2FtZSByZWFzb24gdGhlIHZpc3VhbGl6ZXIncyBwbG90IGRpdiBpc1xuICAgKiAgKGB2aXN1YWxpemVyLmNvbXBvbmVudC50c2ApOiB0d28gbW91bnRlZCBjaGFydHMgc2hhcmluZyBvbmUgRE9NIGlkIG1lYW5zXG4gICAqICBgZ2V0RWxlbWVudEJ5SWRgIGhhbmRzIGJvdGggb2YgdGhlbSB0aGUgZmlyc3QgZWxlbWVudCwgc28gb25lIGluc3RhbmNlIGRyYXdzXG4gICAqICBpbnRvIOKAlCBvciBwdXJnZXMg4oCUIHRoZSBvdGhlcidzIGNhbnZhcy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYXJ0RGl2ID0gYHNwYXRpYWwtY2hhcnRzLXBsb3QtJHt0aGlzLnNlcX1gO1xuICAvKipcbiAgICogVGhlIGRpdiBpbnNpZGUgdGhlIGRldGFjaGVkIHdpbmRvdy5cbiAgICpcbiAgICogQSBzZXBhcmF0ZSBpZCByYXRoZXIgdGhhbiBtb3ZpbmcgdGhlIGV4aXN0aW5nIGRpdjogQW5ndWxhciBkZXN0cm95cyBhbmQgcmVjcmVhdGVzIGFcbiAgICogZGl2IGFjcm9zcyBhbiBgKm5nSWZgLCBzbyBQbG90bHkgd291bGQgYmUgbGVmdCBob2xkaW5nIGEgZGV0YWNoZWQgbm9kZS4gVHdvIGRpdnMgYW5kXG4gICAqIGEgcmVkcmF3IGlzIGJvdGggc2ltcGxlciBhbmQgY29ycmVjdC5cbiAgICpcbiAgICogT05FIGlzIGVub3VnaCBmb3IgZXZlcnkga2luZCwgYmVjYXVzZSBvbmx5IHRoZSBhY3RpdmUga2luZCBpcyBldmVyIHBsb3R0ZWQuIERldGFjaGluZ1xuICAgKiBpcyByZW1lbWJlcmVkIHBlciBraW5kLCBidXQgYXQgbW9zdCBvbmUgd2luZG93IGlzIG9wZW4gYXQgYSB0aW1lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRldGFjaGVkRGl2ID0gYHNwYXRpYWwtY2hhcnRzLWRldGFjaGVkLSR7dGhpcy5zZXF9YDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hhcnQgaXMgc2hvd24gaW4gaXRzIG93biB3aW5kb3cgcmF0aGVyIHRoYW4gaW5saW5lLlxuICAgKlxuICAgKiBEZXRhY2hlZCwgaXQgc2l0cyBBTE9OR1NJREUgdGhlIHNwYXRpYWwtb21pY3MgZGlhbG9nIGluc3RlYWQgb2YgaW5zaWRlIGl0IOKAlCB3aGljaCBpc1xuICAgKiB0aGUgcG9pbnQ6IHRoZXNlIGFyZSByZWFkIGFnYWluc3QgdGhlIG1hcCwgbm90IGluc3RlYWQgb2YgaXQuIFRoZSBkaWFsb2cgaXMgb25seSBzb1xuICAgKiB3aWRlLlxuICAgKlxuICAgKiBPbmUgZmxhZyBmb3IgdGhlIFBBTkVMLCBub3Qgb25lIHBlciBraW5kLiBXaGVyZSB0aGUgd2luZG93IGlzLCBpcyBhIHByb3BlcnR5IG9mIHRoZVxuICAgKiB3b3Jrc3BhY2Ugc29tZW9uZSBoYXMgYXJyYW5nZWQsIG5vdCBvZiB0aGUgdGFiIHRoZXkgaGFwcGVuIHRvIGJlIG9uOiBoYXZpbmcgcHV0IHRoZVxuICAgKiBjaGFydHMgYmVzaWRlIHRoZSBtYXAsIHN3aXRjaGluZyBmcm9tIHRoZSBoZWF0bWFwIHRvIHRoZSBjb3VudHMgc2hvdWxkIHN3YXAgd2hhdCB0aGVcbiAgICogd2luZG93IHNob3dzLCBub3QgeWFuayBpdCBiYWNrIGludG8gdGhlIGRpYWxvZyBhbmQgbWFrZSB0aGVtIGRldGFjaCBpdCBhZ2Fpbi5cbiAgICovXG4gIHByb3RlY3RlZCBkZXRhY2hlZCA9IGZhbHNlO1xuICAvKipcbiAgICogTGFyZ2VzdCBkYXRhc2V0IHRoaXMgd2lsbCBvZmZlciB0byBlbWJlZCBpbiB0aGUgYnJvd3NlciDigJQgc2VlXG4gICAqIHtAbGluayBCUk9XU0VSX1RTTkVfTUFYX09CU0VSVkFUSU9OU30uXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgQlJPV1NFUl9UU05FX01BWF9PQlNFUlZBVElPTlMgPSBCUk9XU0VSX1RTTkVfTUFYX09CU0VSVkFUSU9OUztcblxuICAvKiogVGhlIHQtU05FIGNvbXB1dGVkIGluIHRoaXMgYnJvd3Nlcjogd2hhdCB0byBvZmZlciwgdGhlIHJ1biwgaXRzIHByb2dyZXNzLCBpdHMgcmVzdWx0cy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb21wdXRlID0gbmV3IEVtYmVkZGluZ0NvbXB1dGVDb29yZGluYXRvcigpO1xuXG4gIC8qKiAwLi4xIHdoaWxlIHJ1bm5pbmcsIG9yIG51bGwgYmVmb3JlIHRoZSBmaXJzdCByZXBvcnQuIERyaXZlcyB0aGUgcHJvZ3Jlc3MgYmFyLiAqL1xuICBnZXQgY29tcHV0ZUZyYWN0aW9uKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuc3RhdGUuZnJhY3Rpb247XG4gIH1cbiAgLyoqIFdoaWNoIGJhY2tlbmQgdGhlIHdvcmtlciBnb3Qg4oCUICd3ZWJncHUnLCAnd2FzbScgb3IgJ2NwdScuIFNob3duIHdoaWxlIHJ1bm5pbmcuICovXG4gIGdldCBjb21wdXRlQmFja2VuZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLnN0YXRlLmJhY2tlbmQ7XG4gIH1cbiAgZ2V0IGNvbXB1dGVNZXNzYWdlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuc3RhdGUubWVzc2FnZTtcbiAgfVxuICBnZXQgY29tcHV0ZUVycm9yKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUuc3RhdGUuZXJyb3I7XG4gIH1cbiAgLyoqIFdoZXJlIGEgY29tcHV0YXRpb24gc3RhbmRzLCBmb3IgdGhlIGVtYmVkZGluZyBjb250cm9scy4gKi9cbiAgcHJvdGVjdGVkIGdldCBjb21wdXRlU3RhdGUoKTogRW1iZWRkaW5nQ29tcHV0ZVN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLnN0YXRlO1xuICB9XG4gIC8qKiBUcnVlIHdoZW4gYSB0LVNORSBpcyBtaXNzaW5nIGJ1dCB0aGUgZGF0YXNldCBpcyB0b28gYmlnIHRvIGVtYmVkIGhlcmUuICovXG4gIHByb3RlY3RlZCBnZXQgdHNuZVRvb0xhcmdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUudG9vTGFyZ2U7XG4gIH1cblxuICAvKiogVGhlIGtpbmRzIHRoZSBBQ1RJVkUgc3ViamVjdCBjYW4gYmUgZHJhd24gYXMuIEEgY2F0ZWdvcnkgY29kZSBpcyBhIGxhYmVsLFxuICAgKiAgbm90IGEgbWFnbml0dWRlLCBzbyBhIGhpc3RvZ3JhbSBvZiBpdCB3b3VsZCBiZSBtZWFuaW5nbGVzcyDigJQgd2hhdCBhXG4gICAqICBjYXRlZ29yaWNhbCBjb2x1bW4gaGFzIGlzIGEgZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbi5cbiAgICpcbiAgICogIEJvdW5kIHRvIGEgYHAtc2VsZWN0QnV0dG9uYCwgc28gdGhlIFNBTUUgYXJyYXkgaXMgcmV0dXJuZWQgdW50aWwgd2hhdCBpdCBpcyBidWlsdFxuICAgKiAgZnJvbSBjaGFuZ2VzOiBhIGZyZXNoIGFycmF5IHBlciBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3MgbWFrZXMgUHJpbWVORyByZS1yZW5kZXIgdGhlXG4gICAqICBidXR0b25zLCBhbmQgYSBidXR0b24gcmUtcmVuZGVyZWQgdW5kZXIgdGhlIHBvaW50ZXIgc3dhbGxvd3MgdGhlIGNsaWNrLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGtpbmRPcHRpb25zKCk6IENoYXJ0S2luZE9wdGlvbltdIHtcbiAgICBjb25zdCBjYXRlZ29yaWNhbCA9IHRoaXMuZGF0YS5pc0NhdGVnb3JpY2FsO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSB0aGlzLmVtYmVkZGluZ3MubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoaXQgPSB0aGlzLmtpbmRPcHRpb25zTWVtbztcbiAgICBpZiAoaGl0ICYmIGhpdC5jYXRlZ29yaWNhbCA9PT0gY2F0ZWdvcmljYWwgJiYgaGl0LmVtYmVkZGluZ3MgPT09IGVtYmVkZGluZ3MpIHtcbiAgICAgIHJldHVybiBoaXQub3B0aW9ucztcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNoYXJ0S2luZE9wdGlvbnMoY2F0ZWdvcmljYWwsIGVtYmVkZGluZ3MpO1xuICAgIHRoaXMua2luZE9wdGlvbnNNZW1vID0geyBjYXRlZ29yaWNhbCwgZW1iZWRkaW5ncywgb3B0aW9ucyB9O1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG4gIHByaXZhdGUga2luZE9wdGlvbnNNZW1vOiB7XG4gICAgY2F0ZWdvcmljYWw6IGJvb2xlYW47XG4gICAgZW1iZWRkaW5nczogYm9vbGVhbjtcbiAgICBvcHRpb25zOiBDaGFydEtpbmRPcHRpb25bXTtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBjb250cm9sczogSVNwYXRpYWxDb250cm9scyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQga2luZDogT21pY3NDaGFydEtpbmQgPSAnaGlzdG9ncmFtJztcbiAgLyoqIFRoZSBkYXRhIGNoYXJ0ZWQsIGFuZCBpdHMgbG9hZGluZyDigJQgc2VlIHtAbGluayBDaGFydERhdGFNb2RlbH0uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBDaGFydERhdGFNb2RlbCgpO1xuXG4gIC8qKiBFbWJlZGRpbmdzIHRoZSBkYXRhc2V0IG9mZmVycywgYW5kIHdoaWNoIG9mIHRoZW0gaXMgZHJhd24uICovXG4gIHByb3RlY3RlZCBnZXQgZW1iZWRkaW5ncygpOiBTcGF0aWFsRW1iZWRkaW5nTWV0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmVtYmVkZGluZ3M7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBlbWJlZGRpbmcoKTogU3BhdGlhbEVtYmVkZGluZ01ldGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmVtYmVkZGluZztcbiAgfVxuICAvKiogR2VuZXMgdGhlIGhlYXRtYXAncyByb3dzIGFyZS4gKi9cbiAgcHJvdGVjdGVkIGdldCBoZWF0bWFwR2VuZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGEuaGVhdG1hcEdlbmVzO1xuICB9XG4gIC8qKiBUaGUgaGVhdG1hcCBnZW5lIHBpY2tlcidzIG9wdGlvbnMuICovXG4gIHByb3RlY3RlZCBnZXQgZ2VuZU9wdGlvbnMoKTogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZW5lT3B0aW9ucztcbiAgfVxuICAvKiogQ2F0ZWdvcmljYWwgY29sdW1uIHRoZSB2aW9saW4vYm94IHNwbGl0cyBieTsgbnVsbCA9IG9uZSB0cmFjZSBmb3IgYWxsLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGdyb3VwQnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5ncm91cEJ5O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgZ3JvdXBPcHRpb25zKCk6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bGwgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdyb3VwT3B0aW9ucztcbiAgfVxuICAvKiogU2V0IHdoZW4gdGhlIGFjdGl2ZSBjb2xvdXIgc291cmNlIGNhbm5vdCBiZSBjaGFydGVkLCBmb3IgYW4gaW5saW5lIGhpbnQuICovXG4gIHByb3RlY3RlZCBnZXQgbm90aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRhdGEubm90aWNlO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgbm90aWNlKHRleHQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLmRhdGEubm90aWNlID0gdGV4dDtcbiAgfVxuICAvKiogQSBsb2FkIGlzIGluIGZsaWdodC4gKi9cbiAgcHJvdGVjdGVkIGdldCBidXN5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEuYnVzeTtcbiAgfVxuICAvKiogWi1zY29yZSBlYWNoIGdlbmUgYWNyb3NzIHRoZSBncm91cHMuIE9uIGJ5IGRlZmF1bHQ6IHdpdGhvdXQgaXQgb25lIGxvdWRcbiAgICogIGdlbmUgc2F0dXJhdGVzIHRoZSBzY2FsZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhbmVsIHJlYWRzIGFzIGJsYW5rLiAqL1xuICBwcm90ZWN0ZWQgaGVhdG1hcFpTY29yZSA9IHRydWU7XG4gIC8qKiBQYXN0IHRoaXMgbWFueSBzZWxlY3RlZCBjZWxscyB0aGUgcGVyLWNlbGwgdmlldyBpcyBhIHRleHR1cmUsIG5vdCBhXG4gICAqICByZWFkYWJsZSBwYW5lbCwgc28gdGhlIGNvbHVtbnMgZ28gYmFjayB0byBiZWluZyBjbGFzc2VzLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIRUFUTUFQX0NFTExfQ09MVU1OUyA9IDIwMDtcbiAgLyoqXG4gICAqIENvbHVtbiBjYXAgZm9yIHRoZSBncm91cGVkIGhlYXRtYXAuXG4gICAqXG4gICAqIEFueSBjYXRlZ29yaWNhbCBjb2x1bW4gY2FuIGJlIHRoZSB4IGF4aXMsIGFuZCB0aGV5IGFyZSBub3QgdGhlIHNhbWUgc2l6ZTpcbiAgICogYG5ldXJvdHJhbnNtaXR0ZXJgIGhhcyA5IGNhdGVnb3JpZXMsIGBjbGFzc2AgMzQsIGBzdWJjbGFzc2AgMzM4LiBBdCAzMzggdGhlXG4gICAqIHBhbmVsIGlzIGEgdGV4dHVyZSDigJQgY29sdW1ucyBhIGNvdXBsZSBvZiBwaXhlbHMgd2lkZSwgbm8gcmVhZGFibGUgbGFiZWwg4oCUXG4gICAqIHNvIHBhc3QgdGhpcyBtYW55IHRoZSBzdHJvbmdlc3QgY29sdW1ucyBhcmUga2VwdCBhbmQgdGhlIG5vdGUgc2F5cyBob3cgbWFueVxuICAgKiB3ZXJlIGRyb3BwZWQuIFNlZSBgbWF4Q29sc2AgaW4gYHNwYXRpYWwtaGVhdG1hcC50c2AuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIRUFUTUFQX01BWF9DT0xVTU5TID0gNDA7XG4gIC8qKiBDb2x1bW5zIHRoZSBjYXAgZHJvcHBlZCBmcm9tIHRoZSBsYXN0IHJlbmRlciwgZm9yIHRoZSBub3RlLiAqL1xuICBwcml2YXRlIGhlYXRtYXBIaWRkZW4gPSAwO1xuXG4gIC8qKiBXaGF0IHRoZSBtYXAgaXMgY29sb3VyZWQgYnkg4oCUIHRoZSBjaGFydCdzIHN1YmplY3QuICovXG4gIGNvbG9yQnk6IFNwYXRpYWxDb2xvckJ5IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBzZWxlY3Rpb25Db3VudCA9IDA7XG5cbiAgcHJpdmF0ZSB2aWV3OiBTcGF0aWFsVmlld1N0YXRlID0geyAuLi5ERUZBVUxUX1NQQVRJQUxfVklFVyB9O1xuICBwcml2YXRlIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgPSBlbXB0eVNlbGVjdGlvbigpO1xuICAvKiogV2hldGhlciB0aGUgZmlyc3QgdmlldyBlbWlzc2lvbiBoYXMgYmVlbiBoYW5kbGVkLiAqL1xuICBwcml2YXRlIHByaW1lZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLyoqIFJlLXJlbmRlciB0aGlzIE9uUHVzaCB2aWV3LCByZS1lbnRlcmluZyB0aGUgem9uZSB3aGVuIHRoZSBjaGFuZ2UgY2FtZSBmcm9tIG91dHNpZGUgaXQuICovXG4gIHByaXZhdGUgY2hhbmdlZCgpOiB2b2lkIHtcbiAgICBtYXJrRm9yQ2hlY2tJblpvbmUodGhpcy5jZHIsIHRoaXMuem9uZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFZJU1VBTElaRVIpIHByaXZhdGUgcmVhZG9ubHkgdml6OiBJVmlzdWFsaXplcikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBCZWZvcmUgdGhlIHBvcnQgY2hlY2s6IHRoZSBoZWxwIGljb24gaXMgaW4gdGhlIHRlbXBsYXRlIGVpdGhlciB3YXksIGFuZCBhIHBhbmVsXG4gICAgLy8gd2l0aCBubyBkYXRhIHNvdXJjZSBpcyBleGFjdGx5IHdoZXJlIHNvbWVvbmUgcmVhZHMgaXQuXG4gICAgZW5zdXJlSGVscFRpcFN0eWxlKCk7XG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMudml6LmdldFNwYXRpYWxDb250cm9scz8uKCkgPz8gbnVsbDtcbiAgICBpZiAoIXRoaXMuY29udHJvbHMpIHJldHVybjtcblxuICAgIC8vIFRoZSBydW4ncyBwcm9ncmVzcywgYmFja2VuZCBhbmQgZXJyb3JzLCBmb3IgdGhlIGVtYmVkZGluZyBjb250cm9scy5cbiAgICB0aGlzLmNvbXB1dGUuc3RhdGUkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNoYW5nZWQoKSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmNvbnRyb2xzLmdldFZpZXdTdGF0ZSQoKSwgdGhpcy5jb250cm9scy5nZXRTZWxlY3Rpb24kKCldKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChbdmlldywgc2VsZWN0aW9uXSkgPT4ge1xuICAgICAgICBjb25zdCBzb3VyY2VDaGFuZ2VkID1cbiAgICAgICAgICB2aWV3LmNvbG9yQnk/LmtpbmQgIT09IHRoaXMudmlldy5jb2xvckJ5Py5raW5kIHx8IHZpZXcuY29sb3JCeT8ubmFtZSAhPT0gdGhpcy52aWV3LmNvbG9yQnk/Lm5hbWU7XG4gICAgICAgIC8vIEEgZ3JvdXAgcmVjb2xvdXJlZCBpbiB0aGUgQ2VsbHMgcGFuZWw6IHRoZSBjYXRlZ29yaWVzIGFyZSBmZXRjaGVkIGFnYWluIGluIHRoZWlyIG5ldyBjb2xvdXJzLlxuICAgICAgICBjb25zdCBncm91cENvbG9yc0NoYW5nZWQgPVxuICAgICAgICAgIHRoaXMucHJpbWVkICYmIEpTT04uc3RyaW5naWZ5KHZpZXcuZ3JvdXBDb2xvcnMpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLnZpZXcuZ3JvdXBDb2xvcnMpO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvdW50ID0gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgICAvLyBBIHNlbGVjdGlvbiBvciBsb2cgY2hhbmdlIG9ubHkgbmVlZHMgYSByZS1yZW5kZXI7IGEgbmV3IGNvbG91ciBzb3VyY2VcbiAgICAgICAgLy8gbmVlZHMgaXRzIHZlY3RvciBmZXRjaGVkIGZpcnN0LiBUaGUgRklSU1QgZW1pc3Npb24gYWx3YXlzIHJlbG9hZHM6XG4gICAgICAgIC8vIG90aGVyd2lzZSBgbnVsbCAtPiBudWxsYCByZWFkcyBhcyBcInVuY2hhbmdlZFwiIGFuZCB0aGUgY29tcG9uZW50IHNpdHNcbiAgICAgICAgLy8gd2l0aCBubyBkYXRhIGFuZCBubyBleHBsYW5hdGlvbiB1bnRpbCBzb21ldGhpbmcgZWxzZSBtb3Zlcy5cbiAgICAgICAgaWYgKCF0aGlzLnByaW1lZCB8fCBzb3VyY2VDaGFuZ2VkIHx8IGdyb3VwQ29sb3JzQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMucHJpbWVkID0gdHJ1ZTtcbiAgICAgICAgICB2b2lkIHRoaXMucmVsb2FkKCk7XG4gICAgICAgICAgaWYgKGdyb3VwQ29sb3JzQ2hhbmdlZCAmJiB0aGlzLmdyb3VwQnkpIHZvaWQgdGhpcy5vbkdyb3VwQnkodGhpcy5ncm91cEJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBIHNlbGVjdGlvbiBvciBsb2ctc2NhbGUgY2hhbmdlIG5lZWRzIG9ubHkgYSByZWRyYXcgb2YgdGhlIHNhbWUgdmVjdG9yLlxuICAgICAgICAgIHZvaWQgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jb250cm9sc1xuICAgICAgLmdldERhdGFzZXQkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoZGF0YXNldCkgPT4ge1xuICAgICAgICAvLyBPZmZlciB0byBjb21wdXRlIGEgdC1TTkUgb25seSB3aGVyZSB0aGUgZGF0YXNldCBoYXMgUENBIHRvIGVtYmVkIGFuZCBubyB0LVNORSBvZlxuICAgICAgICAvLyBpdHMgb3duOyBhbnl0aGluZyBjb21wdXRlZCBvciBjb21wdXRpbmcgZm9yIHRoZSBwcmV2aW91cyBkYXRhc2V0IGlzIGRyb3BwZWQuXG4gICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSB0aGlzLmNvbXB1dGUuc2V0RGF0YXNldChkYXRhc2V0Py5lbWJlZGRpbmdzID8/IFtdLCBkYXRhc2V0Py5vYnNlcnZhdGlvbnMuY291bnQgPz8gMCk7XG4gICAgICAgIGNvbnN0IHN3aXRjaGVkID0gdGhpcy5kYXRhLm9uRGF0YXNldENoYW5nZWQoXG4gICAgICAgICAgZGF0YXNldCxcbiAgICAgICAgICB0aGlzLmNvbnRyb2xzPy5jYXRlZ29yaWNhbENvbHVtbnMoKSA/PyBbXSxcbiAgICAgICAgICBlbWJlZGRpbmdzLFxuICAgICAgICApO1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRyYXcgZm9yIHRoZSBraW5kIHRoYXQgd2FzIHNlbGVjdGVkOyBmYWxsIGJhY2sgcmF0aGVyIHRoYW4gc2l0IGJsYW5rLlxuICAgICAgICBpZiAodGhpcy5raW5kID09PSAnZW1iZWRkaW5nJyAmJiBlbWJlZGRpbmdzLmxlbmd0aCA9PT0gMCkgdGhpcy5raW5kID0gJ2hpc3RvZ3JhbSc7XG4gICAgICAgIC8vIEV2ZXJ5dGhpbmcgbG9hZGVkIHdhcyB0aGUgcHJldmlvdXMgZGF0YXNldCdzOiBmZXRjaCBhZnJlc2gsIGV2ZW4gd2hlbiB0aGUgdmlld1xuICAgICAgICAvLyBkb2VzIG5vdCByZS1lbWl0IChhIGNvbG91ciBzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSkuXG4gICAgICAgIGlmIChzd2l0Y2hlZCkge1xuICAgICAgICAgIGlmICh0aGlzLmdyb3VwQnkpIHZvaWQgdGhpcy5vbkdyb3VwQnkodGhpcy5ncm91cEJ5KTtcbiAgICAgICAgICB2b2lkIHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBMYXRlc3Qgd2lucyBhbW9uZyBoZWF0bWFwIGRyYXdzLCB3aG9zZSBtYXRyaXggbWF5IGJlIGNvbXB1dGVkIGluIGEgd29ya2VyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhlYXRtYXBSZW5kZXIgPSBuZXcgU3VwZXJzZWRlKCk7XG5cbiAgLyoqIFBsb3RseSBJL08gZm9yIGJvdGggdGhlIGlubGluZSBhbmQgdGhlIGRldGFjaGVkIGRpdi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwbG90ID0gbmV3IFBsb3RseUNoYXJ0SG9zdCgpO1xuXG4gIC8qKlxuICAgKiBSZS1maXQgdGhlIHBsb3QgdG8gdGhlIHBhbmVsJ3MgY3VycmVudCB3aWR0aC5cbiAgICpcbiAgICogQ2FsbGVkIGJ5IHRoZSBob3N0IHdoZW4gdGhlIGRpYWxvZyBmaW5pc2hlcyByZXNpemluZy4gUGxvdGx5IGRvZXMgbm90IG5vdGljZVxuICAgKiBhIGNvbnRhaW5lciByZXNpemUgb24gaXRzIG93biDigJQgaXRzIGByZXNwb25zaXZlYCBvcHRpb24gbGlzdGVucyBmb3IgV0lORE9XXG4gICAqIHJlc2l6ZXMgb25seSwgc28gZHJhZ2dpbmcgYSBkaWFsb2cgZWRnZSByZWFjaGVzIGl0IHRocm91Z2ggbm90aGluZyBhdCBhbGwuXG4gICAqL1xuICByZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5wbG90LnJlZml0KHRoaXMuY2hhcnREaXYpO1xuICB9XG5cbiAgLyoqIFN0b3BzIHRoZSB0LVNORSBydW4gYW5kIGhlYXRtYXAgd29ya2VyIGFuZCBmcmVlcyBib3RoIHBsb3RzOyB0aGUgc3RyZWFtcyBlbmRcbiAgICogIHRocm91Z2ggYHRha2VVbnRpbERlc3Ryb3llZGAuICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIEEgd29ya2VyIG91dGxpdmVzIHRoZSBjb21wb25lbnQgdGhhdCBzdGFydGVkIGl0OiBjbG9zaW5nIHRoZSBwYW5lbCBtaWQtcnVuIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIGxlYXZlIGEgdC1TTkUgc2F0dXJhdGluZyBhIEdQVSBmb3IgbWludXRlcyB3aXRoIG5vdGhpbmcgbGVmdCB0byByZWNlaXZlXG4gICAgLy8gdGhlIGFuc3dlci5cbiAgICB0aGlzLmNvbXB1dGUuYWJhbmRvbigpO1xuICAgIHRoaXMuaGVhdG1hcFJlbmRlci5jYW5jZWwoKTtcbiAgICAvLyBCT1RIIGRpdnM6IGEgY2hhcnQgbGVmdCBkZXRhY2hlZCBhdCB0ZWFyZG93biBob2xkcyBpdHMgV2ViR0wgY29udGV4dCBpbiB0aGVcbiAgICAvLyB3aW5kb3cncyBkaXYsIHdoaWNoIHRoZSBpbmxpbmUgaWQgd291bGQgbmV2ZXIgcmVhY2guXG4gICAgZm9yIChjb25zdCBkaXYgb2YgW3RoaXMuY2hhcnREaXYsIHRoaXMuZGV0YWNoZWREaXZdKSB0aGlzLnBsb3QucHVyZ2UoZGl2KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBUaGUgZGl2IGV4aXN0cyBvbmx5IG5vdywgc28gdGhpcyBpcyB0aGUgZWFybGllc3QgYSBmaXJzdCBkcmF3IGNhbiBsYW5kLlxuICAgIHZvaWQgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbktpbmQoa2luZDogT21pY3NDaGFydEtpbmQpOiB2b2lkIHtcbiAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIGlmIChraW5kID09PSAnaGVhdG1hcCcpIHtcbiAgICAgIC8vIFNlZWQgd2l0aCB0aGUgZ2VuZSBhbHJlYWR5IG9uIHNjcmVlbiwgc28gdGhlIGNoYXJ0IHNheXMgc29tZXRoaW5nIHRoZVxuICAgICAgLy8gbW9tZW50IGl0IG9wZW5zIHJhdGhlciB0aGFuIHNob3dpbmcgYW4gZW1wdHkgZ3JpZCBhbmQgYSBwcm9tcHQuXG4gICAgICBpZiAodGhpcy5oZWF0bWFwR2VuZXMubGVuZ3RoID09PSAwICYmIHRoaXMuY29sb3JCeT8ua2luZCA9PT0gJ2ZlYXR1cmUnKSB7XG4gICAgICAgIHRoaXMuZGF0YS5zZXRIZWF0bWFwR2VuZXMoW3RoaXMuY29sb3JCeS5uYW1lXSk7XG4gICAgICB9XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSGVhdG1hcEdyb3VwaW5nKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEhlYXRtYXBHZW5lcygpO1xuICAgICAgICB2b2lkIHRoaXMucmVuZGVyKCk7XG4gICAgICB9KSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2b2lkIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGdyb3VwaW5nIHRoZSBoZWF0bWFwJ3MgY29sdW1ucyBjb21lIGZyb20sIGRlZmF1bHRpbmcgcmF0aGVyIHRoYW5cbiAgICogZGVtYW5kaW5nIG9uZTogYSBoZWF0bWFwIHdpdGggbm8gY29sdW1ucyBpcyBub3QgYSBjaGFydCwgYW5kIFwiTm8gZ3JvdXBpbmdcIlxuICAgKiBpcyBhIHNlbnNpYmxlIGFuc3dlciBmb3IgYSB2aW9saW4gYnV0IG5vdCBmb3IgdGhpcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSGVhdG1hcEdyb3VwaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRhdGEuaGFzR3JvdXBpbmcgfHwgIXRoaXMuY29udHJvbHMpIHJldHVybjtcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuZ3JvdXBPcHRpb25zLmZpbmQoKG8pID0+IG8udmFsdWUpPy52YWx1ZTtcbiAgICBpZiAoIWZpcnN0KSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5vbkdyb3VwQnkoZmlyc3QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSGVhdG1hcFpTY29yZShvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaGVhdG1hcFpTY29yZSA9IG9uO1xuICAgIHZvaWQgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBXaGF0IHRoZSBoZWF0bWFwIGlzIGN1cnJlbnRseSBzaG93aW5nLCBzYWlkIHBsYWlubHkuICovXG4gIHByb3RlY3RlZCBnZXQgaGVhdG1hcE5vdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaGVhdG1hcE5vdGUoe1xuICAgICAgZ2VuZUNvdW50OiB0aGlzLmhlYXRtYXBHZW5lcy5sZW5ndGgsXG4gICAgICBzZWxlY3Rpb25Db3VudDogdGhpcy5zZWxlY3Rpb25Db3VudCxcbiAgICAgIHpTY29yZTogdGhpcy5oZWF0bWFwWlNjb3JlLFxuICAgICAgaGlkZGVuOiB0aGlzLmhlYXRtYXBIaWRkZW4sXG4gICAgICBncm91cEJ5OiB0aGlzLmdyb3VwQnksXG4gICAgICBtYXhDb2x1bW5zOiBTcGF0aWFsQ2hhcnRzQ29tcG9uZW50LkhFQVRNQVBfTUFYX0NPTFVNTlMsXG4gICAgICBjZWxsQ29sdW1uczogU3BhdGlhbENoYXJ0c0NvbXBvbmVudC5IRUFUTUFQX0NFTExfQ09MVU1OUyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBHZW5lIHJvd3MgZm9yIHRoZSBoZWF0bWFwLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25IZWF0bWFwR2VuZXMobmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kYXRhLnNldEhlYXRtYXBHZW5lcyhuYW1lcyk7XG4gICAgYXdhaXQgdGhpcy5sb2FkSGVhdG1hcEdlbmVzKCk7XG4gICAgdm9pZCB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEZldGNoIGFueSBnZW5lIHRoZSBoZWF0bWFwIG5lZWRzIGFuZCBkb2VzIG5vdCBhbHJlYWR5IGhvbGQuICovXG4gIHByaXZhdGUgbG9hZEhlYXRtYXBHZW5lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmxvYWRIZWF0bWFwR2VuZXModGhpcy5jb250cm9scyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgb25Hcm91cEJ5KG5hbWU6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5kYXRhLmxvYWRHcm91cGluZyh0aGlzLmNvbnRyb2xzLCBuYW1lKTtcbiAgICB0aGlzLmNoYW5nZWQoKTsgLy8gdGhlIGJ1c3kgc3Bpbm5lclxuICAgIGlmIChhd2FpdCBsb2FkaW5nKSB2b2lkIHRoaXMucmVuZGVyKCk7XG4gICAgZWxzZSB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGN1cnJlbnQga2luZCB3b3VsZCByZWFkIGJldHRlciB3aXRoIGEgZ3JvdXBpbmcgY2hvc2VuLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IHN1Z2dlc3RzR3JvdXBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGJlbmVmaXRzRnJvbUdyb3VwaW5nKHRoaXMua2luZCkgJiYgIXRoaXMuZ3JvdXBCeSAmJiB0aGlzLmdyb3VwT3B0aW9ucy5sZW5ndGggPiAxO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBzdWJqZWN0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbG9yQnkpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGhpcy5jb2xvckJ5LmtpbmQgPT09ICdmZWF0dXJlJyA/IGBnZW5lICR7dGhpcy5jb2xvckJ5Lm5hbWV9YCA6IHRoaXMuY29sb3JCeS5uYW1lO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogRmV0Y2ggdGhlIGFjdGl2ZSBjb2xvdXIgc291cmNlJ3MgdmVjdG9yLCB0aGVuIGRyYXcuICovXG4gIHByaXZhdGUgYXN5bmMgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLmRhdGEubG9hZFZhbHVlcyh0aGlzLmNvbnRyb2xzLCB0aGlzLnZpZXcuY29sb3JCeSk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7IC8vIHRoZSBidXN5IHNwaW5uZXJcbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkaW5nO1xuICAgIGlmIChsb2FkZWQgPT09ICdzdXBlcnNlZGVkJykgcmV0dXJuO1xuICAgIC8vIE9ubHkgb2ZmIHRoZSBkaXN0cmlidXRpb24gdGFicy4gVGhlIGhlYXRtYXAgZG9lcyBub3QgY2hhcnQgdGhlIGNvbG91ciBzb3VyY2UsIGFuZCB0aGVcbiAgICAvLyBlbWJlZGRpbmcgaXMgY29sb3VyZWQgQlkgaXQg4oCUIGl0cyBvd24gY2FwdGlvbiBhc2tzIGZvciBleGFjdGx5IHRoaXMuXG4gICAgaWYgKGxvYWRlZCA9PT0gJ2NhdGVnb3JpY2FsJyAmJiB0aGlzLmtpbmQgIT09ICdlbWJlZGRpbmcnICYmIHRoaXMua2luZCAhPT0gJ2hlYXRtYXAnKSB0aGlzLmtpbmQgPSAnY291bnRzJztcbiAgICBpZiAobG9hZGVkID09PSAnY29udGludW91cycgJiYgdGhpcy5raW5kID09PSAnY291bnRzJykgdGhpcy5raW5kID0gJ2hpc3RvZ3JhbSc7XG4gICAgdm9pZCB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbWJlZGRpbmcgc2NhdHRlciDigJQgYSBVTUFQIG92ZXIgdGhlIHNhbWUgb2JzZXJ2YXRpb25zLlxuICAgKlxuICAgKiBBbnN3ZXJzIHdoYXQgdGhlIG1hcCBjYW5ub3Q6IHRoZSBtYXAgc2F5cyBXSEVSRSBhIHBvcHVsYXRpb24gc2l0cywgdGhpcyBzYXlzIHdoaWNoXG4gICAqIHBvcHVsYXRpb25zIHRoZXJlIGFyZSBhbmQgaG93IGNsb3NlIHRoZXkgYXJlIGluIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIExpbmtlZCB0byB0aGUgbWFwIHdpdGhvdXQgYXNraW5nIGZvciBhbnl0aGluZzogaXQgcmV1c2VzIHRoZSBsb2FkZWQgY2F0ZWdvcmllcywgdGhlIHNhbWVcbiAgICogbG9hZGVkIGNvbG91cmluZyB0aGUgY291bnRzIGNoYXJ0IGRyYXdzIGZyb20sIHNvIHRoZSB0d28gY2Fubm90IGRpc2FncmVlIGFib3V0IHdoYXQgYVxuICAgKiBjb2xvdXIgbWVhbnMgYW5kIG5vIHNlY29uZCBmZXRjaCBoYXBwZW5zLiBBIHNlbGVjdGlvbiBkaW1zIHRoZSByZXN0IHJhdGhlciB0aGFuXG4gICAqIGRyb3BwaW5nIGl0IOKAlCB0aGUgZW1iZWRkaW5nJ3Mgc2hhcGUgaXMgdGhlIGNvbnRleHQgdGhhdCBtYWtlcyBhIHNlbGVjdGlvbiBsZWdpYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJFbWJlZGRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udHJvbHMgPSB0aGlzLmNvbnRyb2xzO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmVtYmVkZGluZztcbiAgICBpZiAoIWNvbnRyb2xzIHx8ICFtZXRhKSB7XG4gICAgICB0aGlzLnB1cmdlUGxvdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNvbnRyb2xzLmdldEVtYmVkZGluZykge1xuICAgICAgdGhpcy5ub3RpY2UgPSAnVGhpcyBkYXRhIHNvdXJjZSBkb2VzIG5vdCBzZXJ2ZSBlbWJlZGRpbmdzLic7XG4gICAgICB0aGlzLnB1cmdlUGxvdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGVkIGhlcmUsIG5vdCBzZXJ2ZWQ6IGEgbG9jYWwgcmVzdWx0IGlzIHRoZSBzYW1lIHNoYXBlIGFzIGEgZmV0Y2hlZCBvbmUsIHNvXG4gICAgLy8gZXZlcnl0aGluZyBkb3duc3RyZWFtIOKAlCBjb2xvdXJpbmcsIGxhc3NvIHNlbGVjdGlvbiwgdGhlIGNhbWVyYSDigJQgaXMgdW5jaGFuZ2VkLlxuICAgIGNvbnN0IGxvY2FsID0gdGhpcy5jb21wdXRlLnJlc3VsdChtZXRhLm5hbWUpO1xuICAgIGlmIChsb2NhbCkge1xuICAgICAgdGhpcy5kYXRhLnN1cGVyc2VkZUVtYmVkZGluZ0xvYWQoKTtcbiAgICAgIHRoaXMuZGF0YS5lbWJlZGRpbmdDb29yZHMgPSBsb2NhbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb21wdXRhYmxlKSB7XG4gICAgICAvLyBPZmZlcmVkIGJ1dCBub3QgeWV0IGNvbXB1dGVkLiBUaGUgcGFuZWwgc2hvd3MgdGhlIENvbXB1dGUgYnV0dG9uOyBkcmF3aW5nIG5vdGhpbmdcbiAgICAgIC8vIGlzIHJpZ2h0LCBhbmQgYW4gZXJyb3Igd291bGQgYmUgd3Jvbmcg4oCUIHRoZXJlIGlzIG5vIGZhaWx1cmUgaGVyZS5cbiAgICAgIHRoaXMuZGF0YS5zdXBlcnNlZGVFbWJlZGRpbmdMb2FkKCk7XG4gICAgICB0aGlzLnB1cmdlUGxvdCgpO1xuICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCB0aGlzLmRhdGEubG9hZEVtYmVkZGluZygobmFtZSkgPT4gY29udHJvbHMuZ2V0RW1iZWRkaW5nIShuYW1lKSwgbWV0YSk7XG4gICAgICBpZiAobG9hZGVkID09PSAnc3VwZXJzZWRlZCcpIHJldHVybjtcbiAgICAgIGlmIChsb2FkZWQgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgIHRoaXMucHVyZ2VQbG90KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeyBlbWJlZGRpbmdDb29yZHM6IGNvb3JkcywgY2F0ZWdvcmljYWwgfSA9IHRoaXMuZGF0YS5zbmFwc2hvdCgpO1xuICAgIGlmICghY29vcmRzKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBsb3RUYXJnZXQ7XG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQpKSByZXR1cm47IC8vIHRoZSB3aW5kb3cgaXMgY2xvc2VkLCBvciBub3QgcmVuZGVyZWQgeWV0XG4gICAgY29uc3QgdmlldyA9IHRoaXMucGxvdC5saXZlVmlldyh0YXJnZXQpO1xuXG4gICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgeDogY29vcmRzLngsXG4gICAgICB5OiBjb29yZHMueSxcbiAgICAgIC8vIFRoZSB0aGlyZCBkaW1lbnNpb24gd2hlbiB0aGUgZW1iZWRkaW5nIGhhcyBvbmUg4oCUIHdoYXQgc3dpdGNoZXMgdGhlIHBsb3QgdG8gYVxuICAgICAgLy8gcm90YXRhYmxlIDNEIHNjYXR0ZXIuIERlY29kZWQgb25seSBmb3IgYSAzLWRpbSBlbWJlZGRpbmcsIHNvIGl0cyBwcmVzZW5jZSBoZXJlXG4gICAgICAvLyBpcyB0aGUgc2FtZSBxdWVzdGlvbiBhcyBgbWV0YS5kaW1zID09PSAzYC5cbiAgICAgIC4uLihjb29yZHMueiA/IHsgejogY29vcmRzLnogfSA6IHt9KSxcbiAgICAgIGxhYmVsOiBtZXRhLmxhYmVsID8/IG1ldGEubmFtZSxcbiAgICAgIGRlcml2ZWQ6IG1ldGEuZGVyaXZlZCxcbiAgICAgIC8vIFByZXNlbnQgZm9yIGEgUENBLCBhYnNlbnQgZm9yIGEgVU1BUCDigJQgc2VlIGB2YXJpYW5jZVJhdGlvYCBvbiB0aGUgbWV0YS5cbiAgICAgIC4uLihtZXRhLnZhcmlhbmNlUmF0aW8gPyB7IHZhcmlhbmNlUmF0aW86IG1ldGEudmFyaWFuY2VSYXRpbyB9IDoge30pLFxuICAgICAgLi4uKGNhdGVnb3JpY2FsXG4gICAgICAgID8geyBjYXRlZ29yaWVzOiB7IGNvZGVzOiBjYXRlZ29yaWNhbC5jb2RlcywgbmFtZXM6IGNhdGVnb3JpY2FsLmNhdGVnb3JpZXMsIGNvbG9yczogY2F0ZWdvcmljYWwuY29sb3JzIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLih0aGlzLnNlbGVjdGlvbi5jb3VudCA+IDAgPyB7IHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24ubWFzayB9IDoge30pLFxuICAgICAgLy8gV2hhdGV2ZXIgdmlldyB0aGUgdXNlciBoYXMgc2V0IHVwLCByZWFkIGZyb20gdGhlIExJVkUgcGxvdCDigJQgd2hpY2ggaXMgd2hlcmVcbiAgICAgIC8vIHJvdGF0aW5nIGFuZCB6b29taW5nIGxlYXZlIGl0LlxuICAgICAgLi4uKHZpZXcgPyB7IHZpZXcgfSA6IHt9KSxcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMucGxvdC5kcmF3KHRhcmdldCwgYnVpbGRFbWJlZGRpbmdUcmFjZXMoaW5wdXQpLCBlbWJlZGRpbmdMYXlvdXQoaW5wdXQpLCBFTUJFRERJTkdfQ09ORklHKTtcbiAgICAvLyBEcmF3IHJvdW5kIGEgY2x1c3RlciBoZXJlIGFuZCB0aG9zZSBjZWxscyBsaWdodCB1cCBvbiB0aGUgdGlzc3VlOiBldmVyeSB2aWV3IHJlYWRzXG4gICAgLy8gdGhlIHNhbWUgbWFzay5cbiAgICB0aGlzLnBsb3QuYmluZFNlbGVjdGlvbih0YXJnZXQsIHtcbiAgICAgIHNlbGVjdGVkOiAoaW5kaWNlcykgPT4gdGhpcy5jb250cm9scz8uc2VsZWN0SW5kaWNlcyhpbmRpY2VzKSxcbiAgICAgIGRlc2VsZWN0ZWQ6ICgpID0+IHRoaXMuY29udHJvbHM/LmNsZWFyU2VsZWN0aW9uKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGxvdCBvbiBzY3JlZW4gZml4ZWQgaXRzIG93biBoZWlnaHQuXG4gICAqXG4gICAqIFRoZSBjb3VudHMgYW5kIGhlYXRtYXAgbGF5b3V0cyBzaXplIHRoZW1zZWx2ZXMgdG8gdGhlaXIgcm93IGNvdW50LCBzbyBpbiB0aGUgZGV0YWNoZWRcbiAgICogd2luZG93IHRoZXkgY2FuIGJlIFRBTExFUiB0aGFuIHRoZSB3aW5kb3cg4oCUIHdoaWNoIGhhcyB0byBzY3JvbGwgcmF0aGVyIHRoYW4gY2xpcC4gQW5cbiAgICogZW1iZWRkaW5nIGZpeGVzIG5vIGhlaWdodCBhbmQgZmlsbHMgdGhlIHdpbmRvdyBpbnN0ZWFkLiBUaGUgdGVtcGxhdGUgbmVlZHMgdG8ga25vd1xuICAgKiB3aGljaCwgYmVjYXVzZSB0aGUgdHdvIHdhbnQgb3Bwb3NpdGUgYGZsZXhgIGFuZCBgb3ZlcmZsb3dgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBoYXNGaXhlZEhlaWdodCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wbG90Lmhhc0ZpeGVkSGVpZ2h0O1xuICB9XG5cbiAgLyoqIFdoZXJlIHRoZSBhY3RpdmUga2luZCBkcmF3czogaXRzIG93biB3aW5kb3csIG9yIHRoZSBzaGFyZWQgY2hhcnQgZGl2LiAqL1xuICBnZXQgcGxvdFRhcmdldCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRldGFjaGVkID8gdGhpcy5kZXRhY2hlZERpdiA6IHRoaXMuY2hhcnREaXY7XG4gIH1cblxuICAvKipcbiAgICogSGVhZGVyIGZvciB0aGUgZGV0YWNoZWQgd2luZG93IOKAlCB3aGF0IGl0IGlzIHNob3dpbmcsIG5hbWVkIGFzIGl0cyB0YWIgaXMuXG4gICAqXG4gICAqIFRoZSBlbWJlZGRpbmcgbmFtZXMgdGhlIGVtYmVkZGluZyByYXRoZXIgdGhhbiB0aGUgdGFiLCBiZWNhdXNlIFwiRW1iZWRkaW5nXCIgYmVzaWRlIGFcbiAgICogd2luZG93IGRyYXdpbmcgYSB0LVNORSBzYXlzIGxlc3MgdGhhbiBcInQtU05FXCIgZG9lcy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZGV0YWNoZWRUaXRsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdlbWJlZGRpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZGRpbmc/LmxhYmVsID8/IHRoaXMuZW1iZWRkaW5nPy5uYW1lID8/ICdFbWJlZGRpbmcnO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbCA9IHRoaXMua2luZE9wdGlvbnMuZmluZCgoaykgPT4gay52YWx1ZSA9PT0gdGhpcy5raW5kKT8ubGFiZWwgPz8gJ0NoYXJ0JztcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0ID8gYCR7bGFiZWx9IMK3ICR7dGhpcy5zdWJqZWN0fWAgOiBsYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBhY3RpdmUga2luZCBiZXR3ZWVuIGl0cyBvd24gd2luZG93IGFuZCB0aGUgcGFuZWwuXG4gICAqXG4gICAqIFB1cmdlcyB0aGUgZGl2IGl0IGlzIExFQVZJTkcgZmlyc3QuIFBsb3RseSBrZWVwcyBwZXItZGl2IHN0YXRlLCBhbmQgYSBncmFwaCBsZWZ0XG4gICAqIGJlaGluZCBpbiBhIGRpdiB0aGF0IEFuZ3VsYXIgdGhlbiByZW1vdmVzIGxlYWtzIGl0cyBXZWJHTCBjb250ZXh0IOKAlCBhbmQgaWYgdGhlIGRpdlxuICAgKiBjb21lcyBiYWNrLCByZWFjdCB3b3VsZCByZXNpemUgYSBwbG90IHdob3NlIGRhdGEgYmVsb25ncyB0byB0aGUgb3RoZXIgcGxhY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgdG9nZ2xlRGV0YWNoZWQoKTogdm9pZCB7XG4gICAgY29uc3QgbGVhdmluZyA9IHRoaXMucGxvdFRhcmdldDtcbiAgICB0aGlzLmRldGFjaGVkID0gIXRoaXMuZGV0YWNoZWQ7XG4gICAgdGhpcy5wbG90LnB1cmdlKGxlYXZpbmcpO1xuICAgIC8vIEdvaW5nIGJhY2sgSU5MSU5FLCB0aGUgZGl2IGFwcGVhcnMgd2l0aCB0aGUgbmV4dCBjaGFuZ2UgZGV0ZWN0aW9uLCBzbyBhIHRhc2sgaXNcbiAgICAvLyBlbm91Z2guIEdvaW5nIE9VVCwgdGhlIHdpbmRvdydzIGRpdiBkb2VzIG5vdCBleGlzdCB5ZXQg4oCUIFByaW1lTkcgbW91bnRzIHRoZSBkaWFsb2dcbiAgICAvLyB3aXRoIGEgdHJhbnNpdGlvbiDigJQgc28gdGhlIGRpYWxvZydzIG93biBgb25TaG93YCBkcml2ZXMgdGhhdCBkcmF3IGluc3RlYWQuIEEgc2luZ2xlXG4gICAgLy8gZGVmZXJyZWQgYXR0ZW1wdCBkcmV3IG5vdGhpbmcgYW5kIG5ldmVyIHJldHJpZWQuXG4gICAgaWYgKCF0aGlzLmRldGFjaGVkKSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5yZW5kZXIoKSwgMCk7XG4gIH1cblxuICAvKiogVGhlIGRldGFjaGVkIHdpbmRvdyBpcyB1cCBhbmQgaXRzIGRpdiBleGlzdHMg4oCUIG5vdyB0aGUgcGxvdCBjYW4gYmUgZHJhd24gaW50byBpdC4gKi9cbiAgcHJvdGVjdGVkIG9uRGV0YWNoZWRXaW5kb3dTaG93bigpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKiogUmUtZml0IHRoZSBkZXRhY2hlZCB3aW5kb3cncyBwbG90IGFmdGVyIGl0IGlzIHJlc2l6ZWQuICovXG4gIHByb3RlY3RlZCBvbkRldGFjaGVkUmVzaXplRW5kKCk6IHZvaWQge1xuICAgIHRoaXMucGxvdC5yZWZpdCh0aGlzLmRldGFjaGVkRGl2KTtcbiAgfVxuXG4gIC8qKiBUaGUgZ2VuZSBwaWNrZXIncyBmaWx0ZXIgYm94IGNoYW5nZWQ6IHNlYXJjaCB0aGUgcmVzaWRlbnQgbmFtZXMsIHNob3cgdGhlIGJlc3QuICovXG4gIHByb3RlY3RlZCBvbkdlbmVGaWx0ZXIocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5maWx0ZXJHZW5lcyhxdWVyeSk7XG4gIH1cblxuICAvKiogUm91Z2hseSBob3cgbG9uZyBhIHJ1biB3aWxsIHRha2UsIGluIHNlY29uZHMsIGZyb20gdGhlIG1lYXN1cmVkIGFuY2hvci4gKi9cbiAgZ2V0IGNvbXB1dGVFc3RpbWF0ZVNlY29uZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLmVzdGltYXRlU2Vjb25kcztcbiAgfVxuXG4gIC8qKiBUaGF0IGVzdGltYXRlIGFzIHNvbWV0aGluZyB0byBwdXQgb24gYSBidXR0b24uICovXG4gIHByb3RlY3RlZCBnZXQgY29tcHV0ZUVzdGltYXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLmVzdGltYXRlTGFiZWw7XG4gIH1cblxuICAvKiogV2h5IHRoZSBvcHRpb24gaXMgYWJzZW50LCB3aGVuIGEgZGF0YXNldCBpcyBwYXN0IHRoZSB0aHJlc2hvbGQuICovXG4gIHByb3RlY3RlZCBnZXQgdHNuZVRvb0xhcmdlTm90ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGUudG9vTGFyZ2VOb3RlO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNlbGVjdGVkIGVtYmVkZGluZyBpcyBvbmUgdGhpcyBicm93c2VyIHdvdWxkIGhhdmUgdG8gY29tcHV0ZS4gKi9cbiAgcHJvdGVjdGVkIGdldCBpc0NvbXB1dGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZS5pc0NvbXB1dGFibGUodGhpcy5lbWJlZGRpbmcpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgaXQgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZCBpbiB0aGlzIHNlc3Npb24uICovXG4gIHByb3RlY3RlZCBnZXQgaXNDb21wdXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLmlzQ29tcHV0ZWQodGhpcy5lbWJlZGRpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpc0NvbXB1dGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlLnJ1bm5pbmc7XG4gIH1cblxuICAvKiogQ29tcHV0ZSB0aGUgc2VsZWN0ZWQgZW1iZWRkaW5nIGhlcmUsIGluIGEgd29ya2VyLCB0aGVuIGRyYXcgaXQuICovXG4gIHByb3RlY3RlZCBhc3luYyBjb21wdXRlRW1iZWRkaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmVtYmVkZGluZztcbiAgICBjb25zdCBjb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgaWYgKCFtZXRhIHx8ICFjb250cm9scz8uZ2V0RW1iZWRkaW5nIHx8IHRoaXMuaXNDb21wdXRpbmcpIHJldHVybjtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbXB1dGUuc3RhcnQobWV0YSwgdGhpcy5lbWJlZGRpbmdzLCAobmFtZSkgPT4gY29udHJvbHMuZ2V0RW1iZWRkaW5nIShuYW1lKSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybjtcbiAgICB0aGlzLmRhdGEuZW1iZWRkaW5nQ29vcmRzID0gcmVzdWx0O1xuICAgIGF3YWl0IHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKiogU3RvcCBhIHJ1bi4gSXQgc2V0dGxlcyBzaG9ydGx5IGFmdGVyLCBsZWF2aW5nIG5vIGVtYmVkZGluZy4gKi9cbiAgcHJvdGVjdGVkIGNhbmNlbENvbXB1dGUoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wdXRlLmNhbmNlbCgpO1xuICB9XG5cbiAgLyoqIFdoaWNoIGVtYmVkZGluZyB0byBkcmF3LCB3aGVuIHRoZSBkYXRhc2V0IHB1Ymxpc2hlcyBtb3JlIHRoYW4gb25lLiAqL1xuICBwcm90ZWN0ZWQgb25FbWJlZGRpbmcobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YS5zZWxlY3RFbWJlZGRpbmcobmFtZSkpIHZvaWQgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBXaGF0IHRoZSBjaGFydCBvbiBzY3JlZW4gc2hvd3MsIGFuZCB3aGF0IGl0IGNhbm5vdCBiZSByZWFkIGZvciDigJQgc2VlIHtAbGluayBraW5kSGVscH0uICovXG4gIHByb3RlY3RlZCBnZXQga2luZEhlbHAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga2luZEhlbHAodGhpcy5raW5kLCB0aGlzLmVtYmVkZGluZyk7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgZW1iZWRkaW5nIHZpZXcgaXMgc2hvd2luZywgc2FpZCBwbGFpbmx5LiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGVtYmVkZGluZ05vdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZW1iZWRkaW5nTm90ZShcbiAgICAgIHRoaXMuZGF0YS5lbWJlZGRpbmdDb29yZHM/Lm1ldGEgPz8gdGhpcy5lbWJlZGRpbmcsXG4gICAgICB0aGlzLmRhdGEuaXNDYXRlZ29yaWNhbCxcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNvdW50LFxuICAgICk7XG4gIH1cblxuICAvKiogUHVyZ2UgdGhlIEFDVElWRSB0YXJnZXQ6IHB1cmdpbmcgdGhlIGlubGluZSBkaXYgd2hpbGUgZGV0YWNoZWQgd291bGQgbGVhdmUgdGhlIHdpbmRvd1xuICAgKiAgc2hvd2luZyBhIHBsb3QgdGhlIGNvbXBvbmVudCBiZWxpZXZlcyBpdCBoYXMgY2xlYXJlZC4gKi9cbiAgcHJpdmF0ZSBwdXJnZVBsb3QoKTogdm9pZCB7XG4gICAgdGhpcy5wbG90LnB1cmdlKHRoaXMucGxvdFRhcmdldCk7XG4gIH1cblxuICAvKiogRHJhdyBpbnRvIHRoZSBhY3RpdmUgdGFyZ2V0LiAqL1xuICBwcml2YXRlIGRyYXcodHJhY2VzOiB1bmtub3duLCBsYXlvdXQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wbG90LmRyYXcodGhpcy5wbG90VGFyZ2V0LCB0cmFjZXMsIGxheW91dCk7XG4gIH1cblxuICAvKiogRHJhdyB0aGUgYWN0aXZlIGtpbmQsIHRoZW4gcmUtcmVuZGVyIHRoZSBwYW5lbCBhcm91bmQgaXQgKG5vdGljZXMsIGhlaWdodCwgbm90ZXMpLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJDaGFydCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmRlckNoYXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSkgcmV0dXJuO1xuICAgIC8vIEd1YXJkIG9uIHRoZSBkaXYgdGhlIEFDVElWRSBraW5kIHdpbGwgZHJhdyBpbnRvLCBub3QgYWx3YXlzIHRoZSBzaGFyZWQgb25lLiBXaGlsZSBhXG4gICAgLy8ga2luZCBpcyBkZXRhY2hlZCB0aGUgaW5saW5lIGRpdiBpcyByZW1vdmVkIGJ5IGl0cyBgKm5nSWZgLCBzbyBjaGVja2luZyB0aGF0IG9uZVxuICAgIC8vIGJhaWxlZCBoZXJlIGFuZCB0aGUgZGV0YWNoZWQgd2luZG93IG5ldmVyIGdvdCBhIHBsb3QuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5wbG90VGFyZ2V0O1xuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0KSkgcmV0dXJuO1xuICAgIC8vIEFueXRoaW5nIGJ1dCB0aGUgZW1iZWRkaW5nIGluaGVyaXRzIGEgZGl2IHRoZSBlbWJlZGRpbmcgbWF5IGhhdmUgYm91bmQgaGFuZGxlcnMgb24uXG4gICAgaWYgKHRoaXMua2luZCAhPT0gJ2VtYmVkZGluZycpIHRoaXMucGxvdC51bmJpbmRTZWxlY3Rpb24odGFyZ2V0KTtcbiAgICAvLyBBIGhlYXRtYXAgc3RpbGwgY29tcHV0aW5nIG11c3Qgbm90IGRyYXcgb3ZlciB0aGUga2luZCB0aGF0IHJlcGxhY2VkIGl0LlxuICAgIGlmICh0aGlzLmtpbmQgIT09ICdoZWF0bWFwJykgdGhpcy5oZWF0bWFwUmVuZGVyLmNhbmNlbCgpO1xuICAgIC8vIFRoZSBoZWF0bWFwIGFuc3dlcnMgYSBkaWZmZXJlbnQgcXVlc3Rpb24gZnJvbSB0aGUgb3RoZXIga2luZHMg4oCUIHdoaWNoXG4gICAgLy8gZ2VuZXMgZGlzdGluZ3Vpc2ggd2hpY2ggZ3JvdXBzIOKAlCBzbyBpdCBpcyBkcml2ZW4gYnkgaXRzIG93biBnZW5lIGxpc3QgYW5kXG4gICAgLy8gZ3JvdXBpbmcgcmF0aGVyIHRoYW4gYnkgd2hhdGV2ZXIgdGhlIG1hcCBpcyBjb2xvdXJlZCBieS5cbiAgICBpZiAodGhpcy5raW5kID09PSAnaGVhdG1hcCcpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVySGVhdG1hcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBbHNvIGluZGVwZW5kZW50IG9mIHRoZSBhY3RpdmUgY29sb3VyIHNvdXJjZTogdGhlIGNvb3JkaW5hdGVzIGFyZSB0aGUgZGF0YXNldCdzLFxuICAgIC8vIGFuZCB0aGUgY29sb3VyaW5nIG1lcmVseSBmb2xsb3dzIHdoYXRldmVyIHRoZSBtYXAgaXMgdXNpbmcuXG4gICAgaWYgKHRoaXMua2luZCA9PT0gJ2VtYmVkZGluZycpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyRW1iZWRkaW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgdmFsdWVzLCBjYXRlZ29yaWNhbCwgZ3JvdXBpbmcgfSA9IHRoaXMuZGF0YS5zbmFwc2hvdCgpO1xuICAgIGlmICghdGhpcy5jb2xvckJ5IHx8ICghdmFsdWVzICYmICFjYXRlZ29yaWNhbCkpIHtcbiAgICAgIHRoaXMucHVyZ2VQbG90KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjYXRlZ29yaWNhbCkge1xuICAgICAgY29uc3QgY291bnRzID0ge1xuICAgICAgICBncm91cDogY2F0ZWdvcmljYWwsXG4gICAgICAgIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24uY291bnQgPiAwID8gdGhpcy5zZWxlY3Rpb24ubWFzayA6IG51bGwsXG4gICAgICAgIG5hbWU6IHRoaXMuY29sb3JCeS5uYW1lLFxuICAgICAgfTtcbiAgICAgIC8vIENvdW50ZWQgb25jZSBmb3IgYm90aDogdGhlIGxheW91dCdzIGhlaWdodCBmb2xsb3dzIHRoZSBiYXIgY291bnQuXG4gICAgICBjb25zdCB0YWxseSA9IGNvdW50QnlDYXRlZ29yeShjb3VudHMpO1xuICAgICAgYXdhaXQgdGhpcy5kcmF3KGJ1aWxkQ291bnRUcmFjZXMoY291bnRzLCB0YWxseSksIGNvdW50c0xheW91dChjb3VudHMsIHRhbGx5KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdmFsdWVzKSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSB7XG4gICAgICB2YWx1ZXMsXG4gICAgICBuYW1lOiB0aGlzLmNvbG9yQnkubmFtZSxcbiAgICAgIGdyb3VwOiBiZW5lZml0c0Zyb21Hcm91cGluZyh0aGlzLmtpbmQpID8gZ3JvdXBpbmcgOiBudWxsLFxuICAgICAgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbi5jb3VudCA+IDAgPyB0aGlzLnNlbGVjdGlvbi5tYXNrIDogbnVsbCxcbiAgICAgIGxvZzogdGhpcy52aWV3LmxvZ1NjYWxlLFxuICAgIH07XG4gICAgY29uc3QgdHJhY2VzID0gYnVpbGRPbWljc1RyYWNlcyh0aGlzLmtpbmQsIGlucHV0KTtcbiAgICBhd2FpdCB0aGlzLmRyYXcodHJhY2VzLCBvbWljc0xheW91dCh0aGlzLmtpbmQsIGlucHV0KSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXMgw5cgZ3JvdXBzIG1lYW4gZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQ29sdW1ucyBhcmUgdGhlIGdyb3VwaW5nIGNvbHVtbidzIGNhdGVnb3JpZXMg4oCUIG9yLCBpbnNpZGUgYSBTTUFMTFxuICAgKiBzZWxlY3Rpb24sIHRoZSBzZWxlY3RlZCBjZWxscyB0aGVtc2VsdmVzLiBBIHR3by1jb2x1bW4gY2xhc3MgbWF0cml4IGlzIGFcbiAgICogcG9vciBhbnN3ZXIgZm9yIGFuIFJPSSBob2xkaW5nIGZvcnR5IGNlbGxzOyBcIndoYXQgaXMgaW4gZnJvbnQgb2YgbWVcIiBpcyB0aGVcbiAgICogcXVlc3Rpb24gdGhlcmUsIGFuZCBlYWNoIGNlbGwgZWFybnMgYSBjb2x1bW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckhlYXRtYXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBoZWF0bWFwUm93czogZ2VuZXMsIGdyb3VwaW5nIH0gPSB0aGlzLmRhdGEuc25hcHNob3QoKTtcbiAgICBpZiAoIXRoaXMuY29udHJvbHMgfHwgZ2VuZXMubGVuZ3RoID09PSAwIHx8ICFncm91cGluZykge1xuICAgICAgdGhpcy5wdXJnZVBsb3QoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXModGhpcy5zZWxlY3Rpb24ubWFzaykgOiBudWxsO1xuICAgIGNvbnN0IHBlckNlbGwgPSAhIXNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA8PSBTcGF0aWFsQ2hhcnRzQ29tcG9uZW50LkhFQVRNQVBfQ0VMTF9DT0xVTU5TO1xuICAgIGNvbnN0IGNlbGxzID1cbiAgICAgIHBlckNlbGwgJiYgc2VsZWN0ZWRcbiAgICAgICAgPyBjZWxsc0FzR3JvdXBzKHNlbGVjdGVkLCBncm91cGluZy5jb2Rlcy5sZW5ndGgsIFNwYXRpYWxDaGFydHNDb21wb25lbnQuSEVBVE1BUF9DRUxMX0NPTFVNTlMpXG4gICAgICAgIDogbnVsbDtcblxuICAgIC8vIE9mZiB0aGUgbWFpbiB0aHJlYWQgZm9yIGEgYmlnIGRhdGFzZXQgKGdlbmVzIMOXIGNlbGxzIHBhc3QgdGhlIHdvcmtlciB0aHJlc2hvbGQpLCBhbmRcbiAgICAvLyBzdXBlcnNlZGVkIGJ5IHRoZSBuZXh0IGhlYXRtYXAgZHJhdzogYSBzbG93IG1hdHJpeCBmb3IgYW4gZWFybGllciBnZW5lIGxpc3Qgb3JcbiAgICAvLyBzZWxlY3Rpb24gbXVzdCBub3QgbGFuZCBvdmVyIHRoZSBjdXJyZW50IG9uZSwgYW5kIGl0cyB3b3JrZXIgc3RvcHMuXG4gICAgY29uc3QgdGFzayA9IHRoaXMuaGVhdG1hcFJlbmRlci5uZXh0KCk7XG4gICAgbGV0IG1hdHJpeDogSGVhdG1hcE1hdHJpeCB8IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIG1hdHJpeCA9IGF3YWl0IGNvbXB1dGVIZWF0bWFwTWF0cml4QXN5bmMoXG4gICAgICAgIGdlbmVzLFxuICAgICAgICBjZWxscyA/IGNlbGxzLmdyb3VwcyA6IHsgY29kZXM6IGdyb3VwaW5nLmNvZGVzLCBjYXRlZ29yaWVzOiBncm91cGluZy5jYXRlZ29yaWVzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAuLi4oY2VsbHMgPyB7IGluZGljZXM6IGNlbGxzLmluZGljZXMsIG1pbkNlbGxzOiAxIH0gOiB7fSksXG4gICAgICAgICAgLy8gT3V0c2lkZSB0aGUgcGVyLWNlbGwgdmlldyBhIHNlbGVjdGlvbiBzdGlsbCBuYXJyb3dzIHRoZSBtZWFucywgdGhlIHdheVxuICAgICAgICAgIC8vIHRoZSB2aW9saW4gYW5kIGJveCBuYXJyb3cgcmF0aGVyIHRoYW4gb3ZlcmxheS5cbiAgICAgICAgICAuLi4oIWNlbGxzICYmIHNlbGVjdGVkID8geyBpbmRpY2VzOiBzZWxlY3RlZCB9IDoge30pLFxuICAgICAgICAgIC8vIE9ubHkgdGhlIGdyb3VwZWQgdmlldzogYGNlbGxzQXNHcm91cHNgIGFscmVhZHkgY2FwcyBieSBldmVuIHRoaW5uaW5nLFxuICAgICAgICAgIC8vIGFuZCByZS1yYW5raW5nIHRob3NlIGNvbHVtbnMgd291bGQgbG9zZSB0aGUgc2VsZWN0aW9uJ3Mgc3ByZWFkLlxuICAgICAgICAgIC4uLihjZWxscyA/IHt9IDogeyBtYXhDb2xzOiBTcGF0aWFsQ2hhcnRzQ29tcG9uZW50LkhFQVRNQVBfTUFYX0NPTFVNTlMgfSksXG4gICAgICAgICAgelNjb3JlOiB0aGlzLmhlYXRtYXBaU2NvcmUsXG4gICAgICAgIH0sXG4gICAgICAgIHsgc2lnbmFsOiB0YXNrLnNpZ25hbCB9LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICghdGFzay5pc0N1cnJlbnQoKSkgcmV0dXJuO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBpZiAoIXRhc2suaXNDdXJyZW50KCkpIHJldHVybjtcbiAgICBpZiAoIW1hdHJpeCkge1xuICAgICAgdGhpcy5wdXJnZVBsb3QoKTtcbiAgICAgIHRoaXMubm90aWNlID0gJ05vIGdyb3VwIGhhcyBlbm91Z2ggbWVhc3VyZWQgY2VsbHMgZm9yIGEgbWVhbi4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5vdGljZSA9IG51bGw7XG4gICAgdGhpcy5oZWF0bWFwSGlkZGVuID0gbWF0cml4LmhpZGRlbkNvbHM7XG4gICAgY29uc3QgaW5wdXQgPSB7XG4gICAgICByb3dzOiBtYXRyaXgucm93cyxcbiAgICAgIGNvbHM6IG1hdHJpeC5jb2xzLFxuICAgICAgdmFsdWVzOiBtYXRyaXgudmFsdWVzLFxuICAgICAgY291bnRzOiBtYXRyaXguY291bnRzLFxuICAgICAgelNjb3JlZDogdGhpcy5oZWF0bWFwWlNjb3JlLFxuICAgICAgZ3JvdXBMYWJlbDogY2VsbHMgPyAnc2VsZWN0ZWQgY2VsbHMnIDogKHRoaXMuZ3JvdXBCeSA/PyAnJyksXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLmRyYXcoYnVpbGRIZWF0bWFwVHJhY2VzKGlucHV0KSwgaGVhdG1hcExheW91dChpbnB1dCkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic3gtYm9keVwiICpuZ0lmPVwiY29udHJvbHNcIj5cbiAgPCEtLSBUaGUgY2hhcnQgZm9sbG93cyB3aGF0ZXZlciB0aGUgbWFwIGlzIGNvbG91cmVkIGJ5LCBzbyB0aGUgdHdvIGNhbiBuZXZlclxuICAgICAgIGRpc2FncmVlIGFib3V0IHdoYXQgaXMgYmVpbmcgc2hvd24uIC0tPlxuICA8ZGl2IGNsYXNzPVwic3gtaGVhZFwiPlxuICAgIDxzcGFuIGNsYXNzPVwic3gtc3ViamVjdFwiICpuZ0lmPVwic3ViamVjdFwiPnt7IHN1YmplY3QgfX08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJzeC1zdWJqZWN0IHN4LW11dGVkXCIgKm5nSWY9XCIhc3ViamVjdFwiPm5vdGhpbmcgc2VsZWN0ZWQgdG8gY2hhcnQ8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJzeC1iYWRnZVwiICpuZ0lmPVwic2VsZWN0aW9uQ291bnRcIj4ge3sgc2VsZWN0aW9uQ291bnQgfCBudW1iZXIgfX0gc2VsZWN0ZWQgPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwicGkgcGktc3BpbiBwaS1zcGlubmVyIHN4LWJ1c3lcIiAqbmdJZj1cImJ1c3lcIiBhcmlhLWxhYmVsPVwibG9hZGluZ1wiPjwvaT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInN4LWNvbnRyb2xzXCI+XG4gICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICBbb3B0aW9uc109XCJraW5kT3B0aW9uc1wiXG4gICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgW25nTW9kZWxdPVwia2luZFwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbktpbmQoJGV2ZW50KVwiXG4gICAgICBzdHlsZUNsYXNzPVwic3gta2luZFwiXG4gICAgPjwvcC1zZWxlY3RCdXR0b24+XG4gICAgPHAtZHJvcGRvd25cbiAgICAgIFtvcHRpb25zXT1cImdyb3VwT3B0aW9uc1wiXG4gICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgW25nTW9kZWxdPVwiZ3JvdXBCeVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkdyb3VwQnkoJGV2ZW50KVwiXG4gICAgICBwbGFjZWhvbGRlcj1cIk5vIGdyb3VwaW5nXCJcbiAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICBbZGlzYWJsZWRdPVwia2luZCA9PT0gJ2hpc3RvZ3JhbSdcIlxuICAgICAgW3BUb29sdGlwXT1cIlxuICAgICAgICBraW5kID09PSAnaGVhdG1hcCdcbiAgICAgICAgICA/ICdUaGUgY2F0ZWdvcmljYWwgY29sdW1uIHRoZSBoZWF0bWFwXFwncyBjb2x1bW5zIGNvbWUgZnJvbSdcbiAgICAgICAgICA6ICdTcGxpdCBhIHZpb2xpbiBvciBib3ggYnkgYSBjYXRlZ29yaWNhbCBjb2x1bW4nXG4gICAgICBcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICA+PC9wLWRyb3Bkb3duPlxuICAgIDwhLS0gV2hhdCB0aGUgY2hhcnQgb24gc2NyZWVuIHNob3dzLCBhbmQgd2hhdCBpdCBtdXN0IE5PVCBiZSByZWFkIGZvci4gRWFjaCBvZiB0aGVzZVxuICAgICAgICAgYW5zd2VycyBhIGRpZmZlcmVudCBxdWVzdGlvbiBhbmQgdHdvIGFyZSByb3V0aW5lbHkgb3Zlci1yZWFkLCBzbyB0aGUgY2F2ZWF0XG4gICAgICAgICB0cmF2ZWxzIHdpdGggdGhlIGV4cGxhbmF0aW9uLiAtLT5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJwaSBwaS1xdWVzdGlvbi1jaXJjbGUgc3gtaGVscFwiXG4gICAgICBbcFRvb2x0aXBdPVwia2luZEhlbHBcIlxuICAgICAgW2VzY2FwZV09XCJmYWxzZVwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgIHRvb2x0aXBTdHlsZUNsYXNzPVwic3gtaGVscC10aXBcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQWJvdXQgdGhlICcgKyBraW5kICsgJyBjaGFydCdcIlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICA+PC9pPlxuICA8L2Rpdj5cblxuICA8c3BhdGlhbC1oZWF0bWFwLWNvbnRyb2xzXG4gICAgKm5nSWY9XCJraW5kID09PSAnaGVhdG1hcCdcIlxuICAgIFtnZW5lT3B0aW9uc109XCJnZW5lT3B0aW9uc1wiXG4gICAgW2dlbmVzXT1cImhlYXRtYXBHZW5lc1wiXG4gICAgW3pTY29yZV09XCJoZWF0bWFwWlNjb3JlXCJcbiAgICAoZ2VuZXNDaGFuZ2UpPVwib25IZWF0bWFwR2VuZXMoJGV2ZW50KVwiXG4gICAgKGZpbHRlckNoYW5nZSk9XCJvbkdlbmVGaWx0ZXIoJGV2ZW50KVwiXG4gICAgKHpTY29yZUNoYW5nZSk9XCJvbkhlYXRtYXBaU2NvcmUoJGV2ZW50KVwiXG4gID48L3NwYXRpYWwtaGVhdG1hcC1jb250cm9scz5cblxuICA8c3BhdGlhbC1lbWJlZGRpbmctY29udHJvbHNcbiAgICBbaXNFbWJlZGRpbmddPVwia2luZCA9PT0gJ2VtYmVkZGluZydcIlxuICAgIFtlbWJlZGRpbmdzXT1cImVtYmVkZGluZ3NcIlxuICAgIFtlbWJlZGRpbmddPVwiZW1iZWRkaW5nXCJcbiAgICBbY29tcHV0YWJsZV09XCJpc0NvbXB1dGFibGVcIlxuICAgIFtjb21wdXRlZF09XCJpc0NvbXB1dGVkXCJcbiAgICBbcnVubmluZ109XCJpc0NvbXB1dGluZ1wiXG4gICAgW3N0YXRlXT1cImNvbXB1dGVTdGF0ZVwiXG4gICAgW2VzdGltYXRlTGFiZWxdPVwiY29tcHV0ZUVzdGltYXRlTGFiZWxcIlxuICAgIFt0b29MYXJnZU5vdGVdPVwidHNuZVRvb0xhcmdlID8gdHNuZVRvb0xhcmdlTm90ZSA6IG51bGxcIlxuICAgIFtkZXRhY2hlZF09XCJkZXRhY2hlZFwiXG4gICAgKGVtYmVkZGluZ0NoYW5nZSk9XCJvbkVtYmVkZGluZygkZXZlbnQpXCJcbiAgICAoY29tcHV0ZSk9XCJjb21wdXRlRW1iZWRkaW5nKClcIlxuICAgIChjYW5jZWwpPVwiY2FuY2VsQ29tcHV0ZSgpXCJcbiAgICAoZGV0YWNoZWRUb2dnbGUpPVwidG9nZ2xlRGV0YWNoZWQoKVwiXG4gID5cbiAgPC9zcGF0aWFsLWVtYmVkZGluZy1jb250cm9scz5cblxuICA8ZGl2IFtpZF09XCJjaGFydERpdlwiIGNsYXNzPVwic3gtcGxvdFwiICpuZ0lmPVwiIWRldGFjaGVkXCI+PC9kaXY+XG5cbiAgPCEtLSBEZXRhY2hlZDogdGhlIGNoYXJ0IGtlZXBzIGRyYXdpbmcsIGluIGl0cyBvd24gd2luZG93LiBTYXlzIHNvIHJhdGhlciB0aGFuXG4gICAgICAgbGVhdmluZyBhIGJsYW5rIHBhbmVsIHRoYXQgbG9va3MgYnJva2VuLiAtLT5cbiAgPGRpdiBjbGFzcz1cInN4LWRldGFjaGVkXCIgKm5nSWY9XCJkZXRhY2hlZFwiPlNob3duIGluIGl0cyBvd24gd2luZG93LjwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoaW50c1wiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjwhLS0gRGVjbGFyZWQgb25jZSBhbmQgcmVuZGVyZWQgaW4gYm90aCB0aGUgcGFuZWwgYW5kIHRoZSBkZXRhY2hlZCB3aW5kb3c6IHRoZSBsYWRkZXIgaXNcbiAgICAgZGVsaWJlcmF0ZWx5IG5vdCBtdXR1YWxseSBleGNsdXNpdmUgKGEgaGVhdG1hcCBzdGlsbCBuZWVkcyBpdHMgZ3JvdXBpbmcgcHJvbXB0KSwgc29cbiAgICAgY29sbGFwc2luZyBpdCB0byBhIHNpbmdsZSBleHByZXNzaW9uIHdvdWxkIGRyb3AgYSBoaW50IHJhdGhlciB0aGFuIG1vdmUgaXQuIC0tPlxuPG5nLXRlbXBsYXRlICNoaW50cz5cbiAgPHNtYWxsIGNsYXNzPVwic3gtaGludFwiICpuZ0lmPVwibm90aWNlXCI+e3sgbm90aWNlIH19PC9zbWFsbD5cbiAgPHNtYWxsIGNsYXNzPVwic3gtaGludFwiICpuZ0lmPVwiIW5vdGljZSAmJiBzdWdnZXN0c0dyb3VwaW5nXCI+IFBpY2sgYSBncm91cGluZyB0byBjb21wYXJlIGNhdGVnb3JpZXMuIDwvc21hbGw+XG4gIDxzbWFsbCBjbGFzcz1cInN4LWhpbnRcIiAqbmdJZj1cIiFub3RpY2UgJiYgc2VsZWN0aW9uQ291bnQgJiYga2luZCA9PT0gJ2hpc3RvZ3JhbSdcIj5cbiAgICBUaGUgc2VsZWN0aW9uIGlzIG92ZXJsYWlkIG9uIHRoZSBmdWxsIGRpc3RyaWJ1dGlvbi5cbiAgPC9zbWFsbD5cbiAgPHNtYWxsIGNsYXNzPVwic3gtaGludFwiICpuZ0lmPVwiIW5vdGljZSAmJiBzZWxlY3Rpb25Db3VudCAmJiBraW5kICE9PSAnaGlzdG9ncmFtJyAmJiBraW5kICE9PSAnaGVhdG1hcCdcIj5cbiAgICBTaG93aW5nIHRoZSBzZWxlY3Rpb24gb25seS5cbiAgPC9zbWFsbD5cbiAgPHNtYWxsIGNsYXNzPVwic3gtaGludFwiICpuZ0lmPVwiIW5vdGljZSAmJiBraW5kID09PSAnaGVhdG1hcCdcIj57eyBoZWF0bWFwTm90ZSB9fTwvc21hbGw+XG4gIDxzbWFsbCBjbGFzcz1cInN4LWhpbnRcIiAqbmdJZj1cIiFub3RpY2UgJiYga2luZCA9PT0gJ2VtYmVkZGluZydcIj57eyBlbWJlZGRpbmdOb3RlIH19PC9zbWFsbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxzcGF0aWFsLWNoYXJ0LXdpbmRvd1xuICAqbmdJZj1cImRldGFjaGVkXCJcbiAgW3RpdGxlXT1cImRldGFjaGVkVGl0bGVcIlxuICBbZGl2SWRdPVwiZGV0YWNoZWREaXZcIlxuICBbZml4ZWRIZWlnaHRdPVwiaGFzRml4ZWRIZWlnaHRcIlxuICAoY2xvc2VkKT1cInRvZ2dsZURldGFjaGVkKClcIlxuICAoc2hvd24pPVwib25EZXRhY2hlZFdpbmRvd1Nob3duKClcIlxuICAocmVzaXplRW5kKT1cIm9uRGV0YWNoZWRSZXNpemVFbmQoKVwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoaW50c1wiPjwvbmctY29udGFpbmVyPlxuPC9zcGF0aWFsLWNoYXJ0LXdpbmRvdz5cbiJdfQ==