@jax-data-science/sci-image-visualizer 0.13.0 → 0.15.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 (67) hide show
  1. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +39 -3
  2. package/esm2022/lib/channel-histogram/channel-tree.mjs +65 -0
  3. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
  4. package/esm2022/lib/contracts/display-types.mjs +7 -1
  5. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
  9. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
  10. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
  11. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
  12. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
  13. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +4 -1
  14. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
  15. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +7 -9
  16. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
  17. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
  18. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
  19. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
  20. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
  21. package/esm2022/lib/spatial/lod.mjs +24 -3
  22. package/esm2022/lib/spatial/spatial-controls.facade.mjs +8 -3
  23. package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
  24. package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
  25. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +47 -10
  26. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +4 -3
  27. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
  28. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
  29. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
  30. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  31. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  32. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
  33. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
  34. package/esm2022/lib/store/visualizer-store.service.mjs +67 -1
  35. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs} +1250 -335
  36. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs.map +1 -0
  37. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs} +3 -2
  38. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs.map} +1 -1
  39. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -1
  40. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  41. package/lib/channel-histogram/channel-histogram.component.d.ts +14 -0
  42. package/lib/channel-histogram/channel-tree.d.ts +30 -0
  43. package/lib/contracts/channel-histogram-api.contract.d.ts +16 -0
  44. package/lib/contracts/display-types.d.ts +27 -0
  45. package/lib/contracts/image.contract.d.ts +8 -0
  46. package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
  47. package/lib/contracts/visualizer.contract.d.ts +3 -0
  48. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
  49. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
  50. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
  51. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
  52. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +2 -0
  53. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
  54. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
  55. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
  56. package/lib/spatial/lod.d.ts +14 -2
  57. package/lib/spatial/spatial-controls.facade.d.ts +3 -0
  58. package/lib/spatial/spatial-gene-filter.d.ts +44 -0
  59. package/lib/spatial/spatial-tile-merge.d.ts +17 -0
  60. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +18 -1
  61. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
  62. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
  63. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
  64. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
  65. package/lib/store/visualizer-store.service.d.ts +19 -0
  66. package/package.json +1 -1
  67. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs.map +0 -1
@@ -7,4 +7,4 @@ import { InjectionToken } from '@angular/core';
7
7
  * the routing/fallback implementation can change without touching constructors.
8
8
  */
9
9
  export const VISUALIZER = new InjectionToken('VISUALIZER');
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWd0Qi9DOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBYyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFNlY3Rpb25BeGlzLCBTZWN0aW9uVmlld3MgfSBmcm9tICcuL3NlY3Rpb24tdmlldy5jb250cmFjdCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4vcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgQ2FudmFzVG9vbE9wdGlvbnMsXG4gIENvbG9ybWFwTm9kZSxcbiAgSVdhbmRPcHRpb25zLFxuICBJQnJ1c2hPcHRpb25zLFxuICBTcGF0aWFsVmlld1N0YXRlLFxuICBTcGF0aWFsQ29sb3JCeSxcbn0gZnJvbSAnLi9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxNYXJrZXJHZW5lcyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzLFxufSBmcm9tICcuL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFBsb3RNb2RlVmlld3BvcnQgfSBmcm9tICcuL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCB2aXN1YWxpemF0aW9uIGNvbnRyYWN0LiBQbG90bHkgaXMgb25lIGltcGxlbWVudGF0aW9uO1xuICogT3BlblNlYWRyYWdvbiBpcyBhbm90aGVyIChmb3IgdGhlIGltYWdlIHBsb3QgdHlwZSkuIFRoZSBhYnN0cmFjdGlvbiByZW5kZXJzXG4gKiBkYXRhIOKAlCBhIHJhc3RlciBpbWFnZSBPUiBhIHNjaWVudGlmaWMgcGxvdCAoaGVhdG1hcCwgc3VyZmFjZSwgY29udG91cixcbiAqIHNjYXR0ZXIsIGxpbmUsIGlzb3N1cmZhY2UpIOKAlCBkcmF3cyByZWdpb25zIG9uIGl0LCBhbmQgZHJpdmVzIG9uLWNhbnZhcyB0b29scy5cbiAqXG4gKiBTcGxpdCBpbnRvIHJvbGUgaW50ZXJmYWNlcyBzbyBhIGNvbnN1bWVyIGNhbiBkZXBlbmQgb25seSBvbiB0aGUgc2xpY2UgaXRcbiAqIHVzZXMsIHRoZW4gY29tcG9zZWQgaW50byBgSVZpc3VhbGl6ZXJgLlxuICovXG5cbi8qKiBQaXhlbCByZWFkYmFjayBzaGFwZSByZXR1cm5lZCBieSBgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxEYXRhIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5O1xufVxuXG4vKiogSW50ZW5zaXR5IHNhbXBsZWQgYWxvbmcgYSBsaW5lIFJPSSAoUGxvdFR5cGUuTElORSBvdmVyIGltYWdlIGRhdGEpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlbnNpdHlQcm9maWxlIHtcbiAgLyoqIERpc3RhbmNlIGFsb25nIHRoZSBsaW5lLiBJbiBtaWNyb25zIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgYSBwaHlzaWNhbFxuICAgKiAgcGl4ZWwgc2l6ZSAobXBwKTsgb3RoZXJ3aXNlIGluIGltYWdlIHBpeGVscy4gU2VlIHtAbGluayB1bml0fS4gKi9cbiAgcG9zaXRpb25zOiBudW1iZXJbXTtcbiAgLyoqIFNhbXBsZWQgaW50ZW5zaXR5IChncmF5c2NhbGUgdmFsdWUgb3IgUkdCIGx1bWluYW5jZSkuICovXG4gIHZhbHVlczogbnVtYmVyW107XG4gIC8qKiBVbml0IG9mIHtAbGluayBwb3NpdGlvbnN9OiAnwrVtJyB3aGVuIHNjYWxlZCBieSB0aGUgaW1hZ2UncyBtcHAsIGVsc2UgJ3B4Jy4gKi9cbiAgdW5pdD86ICfCtW0nIHwgJ3B4JztcbiAgLyoqIFN0YWJsZSBpZCBvZiB0aGUgbGluZSBST0kgdGhpcyBwcm9maWxlIGNhbWUgZnJvbSAobXVsdGktbGluZSBzdXBwb3J0KS4gKi9cbiAgaWQ/OiBudW1iZXI7XG4gIC8qKiBDb2xvdXIgb2YgdGhlIGxpbmUgUk9JIOKAlCB0aGUgaW5zZXQgdHJhY2UgaXMgZHJhd24gaW4gdGhlIHNhbWUgY29sb3VyLiAqL1xuICBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBJRGF0YVJlbmRlcmVyLmxvYWQoKWAgcmVzb2x2ZXMgdG8uIEJhY2tlbmQtc3BlY2lmaWMgYmV5b25kIGBmaWxlbmFtZWAsXG4gKiB3aGljaCBuYW1lcyB0aGUgaW1hZ2UgdGhlIGhhbmRsZSB3YXMgbG9hZGVkIGZvcjogdGhlIGhvc3QgY29tcGFyZXMgaXQgd2l0aCB0aGVcbiAqIGltYWdlIGl0IGFza2VkIGZvciwgdG8gZHJvcCBhIGhhbmRsZSBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gUGFzcyB0aGVcbiAqIGhhbmRsZSBvbiB0byBgcGxvdCgpYCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkSW1hZ2Uge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSByZW5kZXIvdmlld3BvcnQgcm9sZTogbG9hZCBkYXRhLCByZW5kZXIgaXQgKGltYWdlIG9yIHBsb3QpLCBhbmQgaGFuZGxlXG4gKiB6b29tLCBzdGFjayBuYXZpZ2F0aW9uLCBhbmQgcGl4ZWwgcmVhZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZW5kZXJlciB7XG4gIC8qKiBGZXRjaCB3aGF0IHtAbGluayBwbG90fSBuZWVkcyBmb3IgdGhpcyBpbWFnZS9zbGljZS4gYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlXG4gICAqICBob3N0IG5vIGxvbmdlciB3YW50cyB0aGUgcmVzdWx0IChhIG5ld2VyIGltYWdlLCBDYW5jZWwsIHRlYXJkb3duKTsgYSBiYWNrZW5kXG4gICAqICBtYXkgc3RvcCBpdHMgbmV0d29yayB3b3JrIHRoZW4uIE9wdGlvbmFsLCBhbmQgaWdub3JlZCBieSBiYWNrZW5kcyB0aGF0IGRvXG4gICAqICBub3Qgc3VwcG9ydCBpdCB5ZXQuICovXG4gIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPjtcbiAgLyoqIGBpbWFnZUxvYWRlZGAgaXMgdGhlIHtAbGluayBMb2FkZWRJbWFnZX0gaGFuZGxlIHJldHVybmVkIGJ5IGBsb2FkKClgIChvciBudWxsXG4gICAqICBmb3IgYSBkcmF3IHdpdGggbm8gaW1hZ2UpIOKAlCBwYXNzIGl0IHN0cmFpZ2h0IHRocm91Z2guIFJlc29sdmVzIGZhbHNlIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIGNvdWxkIG5vdCBkcmF3IChubyBwbG90IHRhcmdldCwgbm8gV2ViR1BVLCDigKYpLiAqL1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIHJlLXJlbmRlcjsgdGhlIE9TRCBiYWNrZW5kIG5vLW9wcyBpdC4gVGhlIGhvc3RcbiAgICogIHJlLWRyaXZlcyBgcGxvdCgpYCBmcm9tIGl0cyBpbWFnZSBzdHJlYW0gaW5zdGVhZC4gKi9cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKipcbiAgICogRml0IHRoZSB3aG9sZSBpbWFnZSAob3Igc2NlbmUpIGludG8gdGhlIHZpZXcg4oCUIGV2ZXJ5IGJhY2tlbmQgZG9lczogUGxvdGx5XG4gICAqIGF1dG9yYW5nZXMgaXRzIGF4ZXMsIE9wZW5TZWFkcmFnb24gZ29lcyBob21lLCBuYXBhcmktanMgZml0cyBpdHMgY2FtZXJhLiBUaGVcbiAgICogYmFja2VuZCB0aGVuIGVtaXRzIG9uIHtAbGluayBnZXRBdXRvc2NhbGVFdmVudH0uXG4gICAqL1xuICBmaXRUb1ZpZXcoKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSB2aWV3IHRvIHRoZSBpbWFnZSBleHRlbnQuIFNhbWUgaW50ZW50IGFzIHtAbGluayBmaXRUb1ZpZXd9OyBrZXB0IGZvclxuICAgKiAgY2FsbGVycyBvZiB0aGUgb3JpZ2luYWwgbmFtZS4gKi9cbiAgcmVzZXRBeGVzKCk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30g4oCUIHRoZSBzYW1lIG9wZXJhdGlvbiB1bmRlciBpdHMgYmFja2VuZC1uZXV0cmFsIG5hbWUuICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkO1xuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQ7XG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkO1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIC8qKiBDYW5jZWwgYW55IGluLWZsaWdodCBtdWx0aS1mcmFtZSBsb2FkaW5nICh2b2x1bWUtYXNzZW1ibHkgLyBzdXJmYWNlIHByZWxvYWQpIHNvIGl0IHN0b3BzXG4gICAqICBmZXRjaGluZyBtb3JlIGZyYW1lcyBhbmQgY2xlYXJzIHRoZSBsb2FkaW5nIHN0YXRlLiBPcHRpb25hbCDigJQgb25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBhXG4gICAqICB6LXN0YWNrIChuYXBhcmktanMgV2ViR1BVKSBkbyByZWFsIHdvcmsgaGVyZTsgb3RoZXJzIG5vLW9wLiAqL1xuICBjYW5jZWxMb2FkaW5nPygpOiB2b2lkO1xuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIG9mIHRoZSBvcmlnaW5hbCwgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHRoYXQgdGhlIHBpeGVscyByZXR1cm5lZFxuICAgKiBieSB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfSBjdXJyZW50bHkgY292ZXIg4oCUIGB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfWBcbiAgICogaW4gZnVsbC1pbWFnZSBwaXhlbCBjb29yZGluYXRlcy4gV2hlbiB6b29tZWQvcGFubmVkIGludG8gYSBzdWItYXJlYSB0aGlzIGlzXG4gICAqIHRoZSBjcm9wJ3Mgb3JpZ2luICsgZXh0ZW50OyB3aGVuIHpvb21lZCBvdXQvcGFubmVkIGJleW9uZCB0aGUgZWRnZXMsIHRoZVxuICAgKiByZWN0YW5nbGUgbWF5IGV4dGVuZCBvdXRzaWRlIHRoZSBpbWFnZSBib3VuZHMgKG1hdGNoaW5nIHRoZSBwaXhlbCByZWFkYmFja1xuICAgKiBjYW52YXMpLiBMZXRzIGEgY29uc3VtZXIgbWFwIGRpc3BsYXllZC1waXhlbCBjb29yZGluYXRlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAgKiBpbWFnZSB2aWEgYG9yaWdpbiArIGRpc3BsYXllZFB4ICogKGV4dGVudCAvIGRpc3BsYXllZERpbSlgLlxuICAgKlxuICAgKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSB2aWV3cG9ydCBpc24ndCBsYWlkIG91dCB5ZXQgb3IgdGhlIGJhY2tlbmQgY2FuJ3RcbiAgICogcmVwb3J0IGl0IOKAlCBjYWxsZXJzIHNob3VsZCB0aGVuIGZhbGwgYmFjayB0byB0aGUgZnVsbC1pbWFnZSBzY2FsZSAodHJlYXRcbiAgICogdGhlIGRpc3BsYXllZCBwaXhlbHMgYXMgYSBkb3duc2FtcGxlIG9mIHRoZSB3aG9sZSBpbWFnZSkuXG4gICAqL1xuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAgb24gYElWaXN1YWxpemVyYC4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlPyhzY2FsZTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAgb24gYElWaXN1YWxpemVyYCAodGhpcyByZXR1cm5zIDEgd2l0aG91dCBvbmUpLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGU/KCk6IG51bWJlcjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKClgIOKAlCAzRCBzY2VuZSBjb250cm9sc1xuICAgKiAgb25seSBleGlzdCBvbiBhIGJhY2tlbmQgdGhhdCByZW5kZXJzIDNEIHBsb3QgdHlwZXM7IHRoaXMgc2lsZW50bHkgbm8tb3BzIG9uIE9TRC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgIOKAlCBzZWUge0BsaW5rIHNldFN1cmZhY2VEcmFnTW9kZX0uICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3ICh7QGxpbmsgZml0VG9WaWV3fSkuICovXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj47XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgKGRyaXZlcyB0aGUgVUkgc2VsZWN0b3IpLiAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdO1xuXG4gIC8qKiBJbnRlbnNpdHkgYWxvbmcgdGhlIGxpbmUgUk9JczsgZW1pdHMgdGhlIGZ1bGwgc2V0IGFzIGFueSBsaW5lIGlzIGFkZGVkLFxuICAgKiAgbW92ZWQsIG9yIHJlbW92ZWQgKFBsb3RUeXBlLkxJTkUpLiBPbmUgZW50cnkgcGVyIGxpbmUgUk9JLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT47XG5cbiAgLyoqIFJlbmRlciB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgY2hhcnQgaW50byBgZGl2SWRgIGZyb20gdGhlXG4gICAqICBnaXZlbiBwcm9maWxlcyAob25lIHRyYWNlIHBlciBsaW5lIFJPSSwgY29sb3VyZWQgdG8gbWF0Y2ggaXRzIGxpbmUpLlxuICAgKiAgT3duZWQgYnkgdGhlIGJhY2tlbmQgc28gY29uc3VtZXJzIG5ldmVyIHJlYWNoIGEgY2hhcnRpbmcgbGlicmFyeSBkaXJlY3RseS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQ6IHN0cmluZywgcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQ7XG59XG5cbi8qKiBSZWdpb24vc2hhcGUgc3RhdGU6IENSVUQsIHNlbGVjdGlvbiwgY2xhc3NpZmljYXRpb24gY29sb3VycywgR2VvSlNPTiBJL08uICovXG5leHBvcnQgaW50ZXJmYWNlIElSZWdpb25TdG9yZSB7XG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG4gIC8qKiBGcmFtZXdvcmstbmV1dHJhbCBhY2Nlc3NvciDigJQgdGhlIGNhbm9uaWNhbCB3YXkgdG8gcmVhZCBjdXJyZW50IHJlZ2lvbnMuICovXG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW107XG4gIC8qKiBUaGUgY3VycmVudCByZWdpb25zIGFzIHBvbHlnb25zIChyZWN0YW5nbGVzIGV4cGFuZGVkKSwgZm9yIHNlcnZlciByZXF1ZXN0cy4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xuICAvKiogRW1pdHMgdGhlIHJlZ2lvbiBzZXQgd2hlbmV2ZXIgaXQgY2hhbmdlcy4gKi9cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT47XG5cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT47XG4gIC8qKiBTZWxlY3QgYSBzcGVjaWZpYyByZWdpb24gKGJ5IGlkZW50aXR5KSwgaGlnaGxpZ2h0aW5nIGl0IG9uIHdoaWNoZXZlclxuICAgKiAgYmFja2VuZCBpcyByZW5kZXJpbmcg4oCUIFBsb3RseSBzZXRzIGl0cyBhY3RpdmUtc2hhcGUgaGFuZGxlcywgT3BlblNlYWRyYWdvblxuICAgKiAgaGlnaGxpZ2h0cyB0aGUgU1ZHIGVsZW1lbnQuIE5vLW9wIGlmIHRoZSByZWdpb24gaXNuJ3QgaW4gdGhlIHN0b3JlLiAqL1xuICBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkO1xuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkO1xuXG4gIGdldFNob3dTaGFwZUxhYmVsKCk6IGJvb2xlYW47XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nO1xuICBnZXRGaWxsQ29sb3IoKTogc3RyaW5nO1xuICBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBSZXN0b3JlcyB0aGUgcmVnaW9uIHNldCB0b1xuICAgKiAgdGhlIHN0YXRlIGJlZm9yZSB0aGF0IGFjdGlvbjsgdXAgdG8gYSBzbWFsbCBmaXhlZCBkZXB0aCAoMTApIGlzIHJldGFpbmVkLFxuICAgKiAgc28gaXQgY2FuIGJlIGludm9rZWQgdXAgdG8gMTAgdGltZXMgaW4gYSByb3cuIE5vLW9wIHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvXG4gICAqICB1bmRvLiAqL1xuICB1bmRvKCk6IHZvaWQ7XG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbi4gTm8tb3Agd2hlbiB0aGVyZSdzXG4gICAqICBub3RoaW5nIHRvIHJlZG8gKGFueSBmcmVzaCByZWdpb24gYWN0aW9uIGNsZWFycyB0aGUgcmVkbyBmdXR1cmUpLiAqL1xuICByZWRvKCk6IHZvaWQ7XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5VbmRvJH0uICovXG4gIGNhblVuZG8oKTogYm9vbGVhbjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfS4gKi9cbiAgY2FuUmVkbygpOiBib29sZWFuO1xuICAvKiogRW1pdHMgd2hldGhlciBhbiB1bmRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBVbmRvIGJ1dHRvbidzIGVuYWJsZWQgKGdyZXllZC1vdXQpIHN0YXRlLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogRW1pdHMgd2hldGhlciBhIHJlZG8gc3RlcCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIOKAlCBkcml2ZXMgdGhlIHRvb2xiYXJcbiAgICogIFJlZG8gYnV0dG9uJ3MgZW5hYmxlZCAoZ3JleWVkLW91dCkgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBDbGVhciB0aGUgdW5kby9yZWRvIGhpc3RvcnkgKGUuZy4gb24gaW1hZ2UgbG9hZC9zd2l0Y2gpLiAqL1xuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQ7XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXTtcbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQ7XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmc7XG5cbiAgLyoqIEJlZ2luIGEgcGVyLXNsaWNlIHotc3RhY2sgcmVnaW9uIHNlc3Npb24gKGppdC11aSM5MykuIGBzbGljZXNgIG1hcHMgZWFjaFxuICAgKiAgemVyby1iYXNlZCBzbGljZSBpbmRleCB0byB0aGF0IHNsaWNlJ3MgcmVnaW9uczsgdGhlIHN0b3JlIHNob3dzIGBpbml0aWFsWmBcbiAgICogIGxpdmUgd2hpbGUgaG9sZGluZyB0aGUgcmVzdCwgc28gc2NydWJiaW5nIHN3YXBzIHJlZ2lvbiBzZXRzIGFuZCBlZGl0cyBvbiBhXG4gICAqICBzbGljZSBwZXJzaXN0LiBgc2F2ZUxheW91dGAgcmVjb3JkcyBob3cgdGhlIHN0YWNrIHBlcnNpc3RzIOKAlCBgY29tYmluZWRgXG4gICAqICAob25lIHotaW5kZXhlZCBnZW9qc29uLCBzaW5nbGUtZmlsZSB6LXN0YWNrKSBvciBgcGVyLXNsaWNlLWZpbGVgIChmb2xkZXJcbiAgICogIHN0YWNrKS4gU2VlIHtAbGluayBzZXREaXNwbGF5U2xpY2V9LCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfS4gKi9cbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkO1xuICAvKiogRW5kIHRoZSBwZXItc2xpY2Ugc2Vzc2lvbiAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZDtcbiAgLyoqIFRydWUgd2hpbGUgYSBwZXItc2xpY2Ugei1zdGFjayBzZXNzaW9uIGlzIGFjdGl2ZS4gKi9cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbjtcbiAgLyoqIEhvdyB0aGUgY3VycmVudCBzdGFjayBwZXJzaXN0cyB0byBkaXNrIChqaXQtdWkjOTMpLiAqL1xuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZSc7XG4gIC8qKiBTd2FwIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gc2xpY2UgYHpgIChzdGFjayBtb2RlIG9ubHkpLCBjYXB0dXJpbmcgdGhlXG4gICAqICBjdXJyZW50IHNsaWNlJ3MgZWRpdHMgZmlyc3QuIENhbGxlZCBvbiBldmVyeSBjb21taXR0ZWQgc2xpY2Ugc2NydWIuICovXG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkO1xuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIGZvciBzYXZlL2V4cG9ydCwgZWFjaCB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZFxuICAgKiAge0BsaW5rIFJlZ2lvbi56fTsgdGhlIGZsYXQgc2V0IG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdO1xuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBlYWNoXG4gICAqICBzbGljZSB3aXRoIHJlZ2lvbnMsIHBsdXMgc2xpY2VzIGNsZWFyZWQgc2luY2UgbG9hZCAoZW1wdHksIHRvIG92ZXJ3cml0ZSkuXG4gICAqICBLZXllZCBieSB6ZXJvLWJhc2VkIHNsaWNlIGluZGV4OyByZWdpb25zIHRhZ2dlZCB3aXRoIHRoZWlyIHouICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT47XG59XG5cbi8qKiBPbi1jYW52YXMgdG9vbCBtb2RlcyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94LCBTQU0gcG9pbnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVG9vbENvbnRyb2xsZXIge1xuICAvKipcbiAgICogQXJtIG9uZSBvbi1jYW52YXMgdG9vbCAoYENhbnZhc1Rvb2xJZGApIHdpdGggaXRzIG9wdGlvbnMg4oCUIHRoZSB3YW5kJ3NcbiAgICoge0BsaW5rIElXYW5kT3B0aW9uc30sIHRoZSBicnVzaCdzIHtAbGluayBJQnJ1c2hPcHRpb25zfSAoYHNpemVgIGlzIHRoZVxuICAgKiBtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIgb2YgdGhlIHBhaW50ZWQgZGlzYyksIHRoZSBlcmFzZXIncyBgeyByYWRpdXMgfWAg4oCUXG4gICAqIGFuZCBkaXNhcm0gdGhlIG9uZSB0aGF0IHdhcyBhcm1lZC4gYG51bGxgLCBvciBhbnkgaWQgdGhhdCBpcyBub3QgYSBjYW52YXNcbiAgICogdG9vbCAoYSByZWdpb24gZHJhdyBtb2RlIHN1Y2ggYXMgYCdkcmF3cmVjdCdgLCBgJ3BhbidgKSwgZGlzYXJtcyBvbmx5LlxuICAgKiBBcm1pbmcgdGhlIGFybWVkIHRvb2wgYWdhaW4gYXBwbGllcyB0aGUgb3B0aW9ucyBhbmQga2VlcHMgaXRzIHdvcmsgaW5cbiAgICogcHJvZ3Jlc3MuXG4gICAqL1xuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd3YW5kJywgb3B0aW9ucylgIC8gYHNldEFjdGl2ZVRvb2wobnVsbClgLiAqL1xuICBzZXRXYW5kTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnYnJ1c2gnLCBvcHRpb25zKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZDtcbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCdlcmFzZVZlcnRleCcsIHsgcmFkaXVzIH0pYCAvIGBzZXRBY3RpdmVUb29sKG51bGwpYC4gKi9cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd6b29tVG9Cb3gnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uOiBzZWdtZW50IGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24gaW50byBtYXNrcy5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXNrIHJlZ2lvbnMgYWRkZWQuIChqaXQtdWkjOTApICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENlbGxwb3NlLW9uLWNyb3A6IGNsaWVudCBzbGlkZS1jcm9wIGVhY2ggcmVjdGFuZ2xlIGFuZCBzZWdtZW50IGNlbGxzIGluIGl0XG4gICAqICAoY2VsbHBvc2UtU0FNIHZpYSB0aGUgaG9zdCdzIENFTExfU0VHTUVOVEVSKS4gUmV0dXJucyByZWdpb25zIGFkZGVkLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgaW50ZXJhY3RpdmUgU0FNIHBvaW50LXByb21wdCB0b29sIChjbGljayA9ICtwb2ludCwgU2hpZnQgPSAtKS5cbiAgICogIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnc2FtUG9pbnQnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogRmluYWxpc2UgLyBkaXNjYXJkIHRoZSBpbi1wcm9ncmVzcyBTQU0gcG9pbnQgb2JqZWN0LiAqL1xuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZDtcbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb250cm9scyBzcGVjaWZpYyB0byB0aGUgSVNPU1VSRkFDRSBwbG90IHR5cGUuIE9wdGlvbmFsIGFuZCBjYXBhYmlsaXR5LWdhdGVkXG4gKiAoYFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZWApOiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgaXNvc3VyZmFjZXMgZXhwb3Nlc1xuICogaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKClgLiBLZXB0IG9mZiB0aGUgYWx3YXlzLW9uXG4gKiBjb250cmFjdCBzbyBjb25zdW1lcnMgbmV2ZXIgY2FsbCBhIGNvbnRyb2wgdGhhdCdzIG1lYW5pbmdsZXNzIGZvciB0aGUgY3VycmVudFxuICogcGxvdCB0eXBlIC8gYmFja2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXNvc3VyZmFjZUNvbnRyb2xzIHtcbiAgLyoqIExpdmUtdXBkYXRlIHRoZSBpc29zdXJmYWNlIGludGVuc2l0eSBiYW5kIFtpc29taW4sIGlzb21heF0gb3ZlciAw4oCTMjU1LiAqL1xuICBzZXRJc29SYW5nZShpc29NaW46IG51bWJlciwgaXNvTWF4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSAzRCBwbG90IHR5cGVzIChTVVJGQUNFIC8gU0NBVFRFUjNEIC8gSVNPU1VSRkFDRVxuICogc2NlbmVzKS4gQ2FwYWJpbGl0eS1nYXRlZCBsaWtlIHtAbGluayBJSXNvc3VyZmFjZUNvbnRyb2xzfTogb25seSBhIGJhY2tlbmRcbiAqIHRoYXQgcmVuZGVycyAzRCBzY2VuZXMgZXhwb3NlcyBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRTdXJmYWNlM2RDb250cm9scygpYCDigJRcbiAqIHRoZSBkZXByZWNhdGVkIHRvcC1sZXZlbCBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYCBzaWxlbnRseVxuICogbm8tb3Agb24gMkQtb25seSBiYWNrZW5kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VyZmFjZTNkQ29udHJvbHMge1xuICAvKiogU3dpdGNoIHRoZSAzRCBzY2VuZSBpbnRlcmFjdGlvbiBtb2RlIChvcmJpdCAvIHR1cm50YWJsZSAvIHBhbiAvIHpvb20pLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSAzRCBzY2VuZSBjYW1lcmEgdG8gaXRzIGRlZmF1bHQgZXllIHBvc2l0aW9uLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gb24vb2ZmLiBPcHRpb25hbCDigJQgb25seSB0aGUgbmFwYXJpLWpzIFdlYkdQVVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2UgYmFja2VuZCByZW5kZXJzIG9uZSAoaml0LXVpIzEwMikuICovXG4gIHNldEF4ZXNWaXNpYmxlPyh2aXNpYmxlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIGF4ZXMgZ2l6bW8gaXMgY3VycmVudGx5IHNob3duIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiBPcHRpb25hbC4gKi9cbiAgYXhlc1Zpc2libGU/KCk6IGJvb2xlYW47XG4gIC8qKiBSZW5kZXIgdGhlIHN1cmZhY2UgYXMgYSB3aXJlZnJhbWUgKGVkZ2VzKSBpbnN0ZWFkIG9mIGEgZmlsbGVkIHN1cmZhY2UuIE9wdGlvbmFsIOKAlCBvbmx5IHRoZVxuICAgKiAgbmFwYXJpLWpzIFdlYkdQVSBzdXJmYWNlIGJhY2tlbmQgc3VwcG9ydHMgaXQgKGppdC11aSMxMDIpLiAqL1xuICBzZXRXaXJlZnJhbWU/KG9uOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIHN1cmZhY2UgaXMgY3VycmVudGx5IGRyYXduIGFzIGEgd2lyZWZyYW1lIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiAqL1xuICB3aXJlZnJhbWU/KCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIExJTkUgKGludGVuc2l0eS1wcm9maWxlKSBwbG90IHR5cGUuIENhcGFiaWxpdHktZ2F0ZWRcbiAqIGxpa2Uge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9OiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgdGhlIGxpbmUtUk9JIC9cbiAqIGluc2V0IGV4cG9zZXMgaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVuc2l0eUNvbnRyb2xzIHtcbiAgLyoqIEFkZCBhbm90aGVyIGxpbmUgUk9JIChuZXh0IGJyaWdodCBwYWxldHRlIGNvbG91cikgYW5kIGl0cyBpbnNldCB0cmFjZS5cbiAgICogIFJldHVybnMgdGhlIGNyZWF0ZWQgcmVnaW9uIHNvIHRoZSBjYWxsZXIgY2FuIHNlbGVjdCBpdCBvbiB0aGUgYWN0aXZlXG4gICAqICBiYWNrZW5kLCBvciBudWxsIGlmIG5vIGltYWdlIGV4dGVudCBpcyBrbm93biB5ZXQuICovXG4gIGFkZFByb2ZpbGVMaW5lKCk6IFJlZ2lvbiB8IG51bGw7XG59XG5cbi8qKiBBIGNhdGVnb3JpY2FsIGNvbHVtbiByZXNvbHZlZCBmb3IgY2hhcnRpbmc6IGxhYmVscywgY29kZXMgYW5kIG1hcCBjb2xvdXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsQ2F0ZWdvcmljYWxWaWV3IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcbiAgLyoqIGAjcnJnZ2JiYCBwZXIgY2F0ZWdvcnksIGluZGV4LWFsaWduZWQgd2l0aCB7QGxpbmsgY2F0ZWdvcmllc30uICovXG4gIGNvbG9yczogc3RyaW5nW107XG4gIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gIGNvZGVzOiBVaW50MTZBcnJheTtcbn1cblxuLyoqXG4gKiBIb3cgXCJTZWxlY3QgZnJvbSBST0lzXCIgc2VsZWN0czogaW5zaWRlIHRoZSB2b2x1bWVzIG9mIHRoZSByZWdpb24gY2xhc3NlcyBwaWNrZWRcbiAqIGluIHRoZSBSZWdpb24gRWRpdG9yIChTcGF0aWFsIG9taWNzIDNELCB0aGUgcmVnaW9ucyBvbiB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZVxuICogdm9sdW1lIHNob3duKSwgb3IgYnkgdGhlIGRyYXduIHJlZ2lvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFJvaVNlbGVjdGlvbk1vZGUgPSAnY2xhc3Mtdm9sdW1lcycgfCAncmVnaW9ucyc7XG5cbi8qKlxuICogQ29udHJvbHMgZm9yIHRoZSBTUEFUSUFMX09NSUNTIHBsb3QgdHlwZTogd2hhdCB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBhcmVcbiAqIGNvbG91cmVkIGJ5LCBhbmQgaG93IHRoZXkgYXJlIGRyYXduLiBDYXBhYmlsaXR5LWdhdGVkIGxpa2VcbiAqIHtAbGluayBJSXNvc3VyZmFjZUNvbnRyb2xzfSDigJQgYGdldFNwYXRpYWxDb250cm9scygpYCByZXR1cm5zIG51bGwgdW5sZXNzIGFcbiAqIGhvc3QgaGFzIGJvdW5kIGBTUEFUSUFMX0RBVEFfUE9SVGAuXG4gKlxuICogVGhlIHZpZXcgc3RhdGUgaXMgYmFja2VuZC1uZXV0cmFsIChpdCBsaXZlcyBpbiB0aGUgc2hhcmVkIHN0b3JlLCBsaWtlIHRoZVxuICogY29sb3JtYXApLCBzbyB0aGVzZSBjb250cm9scyB3b3JrIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3BhdGlhbENvbnRyb2xzIHtcbiAgLyoqIFRoZSBkYXRhc2V0IGJlaW5nIHZpc3VhbGl6ZWQsIG9yIG51bGwuIERyaXZlcyB0aGUgY29sdW1uL2dlbmUgcGlja2VycyBhbmRcbiAgICogIHRoZSBsZWdlbmQuICovXG4gIGdldERhdGFzZXQkKCk6IE9ic2VydmFibGU8U3BhdGlhbERhdGFzZXQgfCBudWxsPjtcbiAgLyoqIEN1cnJlbnQgZGlzcGxheSBzdGF0ZSAoY29sb3VyIHNvdXJjZSwgcG9pbnQgc2NhbGUsIG9wYWNpdHksIHNjYWxpbmcpLiAqL1xuICBnZXRWaWV3U3RhdGUkKCk6IE9ic2VydmFibGU8U3BhdGlhbFZpZXdTdGF0ZT47XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkLCBmb3Igc2VlZGluZyBhIGNvbnRyb2wncyBpbml0aWFsIHZhbHVlLiAqL1xuICB2aWV3U3RhdGUoKTogU3BhdGlhbFZpZXdTdGF0ZTtcbiAgLyoqIFBhdGNoIHRoZSBkaXNwbGF5IHN0YXRlOyB0aGUgbWFya2VycyByZWJ1aWxkIHdpdGhvdXQgcmVtb3VudGluZyB0aGUgc2NlbmUuICovXG4gIHNldFZpZXdTdGF0ZShwYXJ0aWFsOiBQYXJ0aWFsPFNwYXRpYWxWaWV3U3RhdGU+KTogdm9pZDtcbiAgLyoqIENvbG91ciBieSBhbiBhbm5vdGF0aW9uIGNvbHVtbi4gUmVqZWN0cyBmb3IgYW4gdW5rbm93biBjb2x1bW4uICovXG4gIGNvbG9yQnlDb2x1bW4obmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIENvbG91ciBieSBhIGdlbmU7IGl0cyB2ZWN0b3IgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuICovXG4gIGNvbG9yQnlGZWF0dXJlKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBDbGVhciB0aGUgY29sb3VyIHNvdXJjZSDigJQgZXZlcnkgb2JzZXJ2YXRpb24gcmVuZGVycyBpbiBvbmUgbmV1dHJhbCBjb2xvdXIuICovXG4gIGNsZWFyQ29sb3JCeSgpOiB2b2lkO1xuICAvKiogVHlwZWFoZWFkIG92ZXIgZmVhdHVyZSBuYW1lcywgZm9yIGRhdGFzZXRzIHRvbyB3aWRlIHRvIGlubGluZSB0aGUgbGlzdC4gKi9cbiAgc2VhcmNoRmVhdHVyZXMocXVlcnk6IHN0cmluZywgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgLyoqIFBlci1jYXRlZ29yeSBkaXNwbGF5IGNvbG91cnMgZm9yIGEgY2F0ZWdvcmljYWwgY29sdW1uLCBpbmRleC1hbGlnbmVkIHdpdGhcbiAgICogIGl0cyBgY2F0ZWdvcmllc2Ag4oCUIHRoZSBsZWdlbmQncyBzd2F0Y2hlcywgcmVzb2x2ZWQgdGhlIHNhbWUgd2F5IHRoZVxuICAgKiAgcmVuZGVyZXIgcmVzb2x2ZXMgdGhlbSBzbyB0aGUgdHdvIGNhbm5vdCBkaXNhZ3JlZS4gKi9cbiAgY2F0ZWdvcnlDb2xvcnMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT47XG5cbiAgLy8g4pSA4pSAIHZhbHVlcywgZm9yIHRoZSAxLUQgY2hhcnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKipcbiAgICogVGhlIHZhbHVlcyBiZWhpbmQgYSBjb2xvdXIgc291cmNlLCBpbmRleC1hbGlnbmVkIHdpdGggdGhlIG9ic2VydmF0aW9ucy5cbiAgICogUmVqZWN0cyBmb3IgYSBjYXRlZ29yaWNhbCBjb2x1bW4g4oCUIHRoZXJlIGlzIG5vdGhpbmcgY29udGludW91cyB0byBjaGFydC5cbiAgICovXG4gIGNvbnRpbnVvdXNWYWx1ZXMoc291cmNlOiBTcGF0aWFsQ29sb3JCeSk6IFByb21pc2U8RmxvYXQzMkFycmF5PjtcbiAgLyoqXG4gICAqIEEgY2F0ZWdvcmljYWwgY29sdW1uJ3MgY2F0ZWdvcmllcywgcGVyLW9ic2VydmF0aW9uIGNvZGVzIGFuZCBkaXNwbGF5XG4gICAqIGNvbG91cnMg4oCUIGV2ZXJ5dGhpbmcgYSBncm91cGVkIHZpb2xpbi9ib3ggbmVlZHMsIHdpdGggdGhlIGNvbG91cnMgcmVzb2x2ZWRcbiAgICogdGhlIHNhbWUgd2F5IHRoZSBtYXAgcmVzb2x2ZXMgdGhlbS5cbiAgICovXG4gIGNhdGVnb3JpY2FsVmlldyhjb2x1bW46IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbENhdGVnb3JpY2FsVmlldz47XG5cbiAgLyoqXG4gICAqIE9uZSBlbWJlZGRpbmcncyBjb29yZGluYXRlcyDigJQgYSBVTUFQLCB0LVNORSBvciBQQ0EgcGxhbmUgb3ZlciB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gICAqXG4gICAqIE9wdGlvbmFsLCBhbmQgYWJzZW50IHdoZW4gdGhlIGRhdGEgc291cmNlIHNlcnZlcyBub25lOiBgU3BhdGlhbERhdGFQb3J0LmdldEVtYmVkZGluZ2BcbiAgICogaXMgaXRzZWxmIG9wdGlvbmFsLCBzbyBhIHBhbmVsIG11c3QgYmUgYWJsZSB0byBhc2sgd2hldGhlciB0aGlzIGV4aXN0cyByYXRoZXIgdGhhblxuICAgKiBjYWxsaW5nIGl0IGFuZCBjYXRjaGluZy5cbiAgICovXG4gIGdldEVtYmVkZGluZz8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsRW1iZWRkaW5nPjtcbiAgLyoqIE5hbWVzIG9mIHRoZSBjYXRlZ29yaWNhbCBjb2x1bW5zIGF2YWlsYWJsZSB0byBncm91cCBieS4gKi9cbiAgY2F0ZWdvcmljYWxDb2x1bW5zKCk6IHN0cmluZ1tdO1xuICAvKipcbiAgICogSW1wb3J0IGEgY2VsbCBncm91cGluZyAoQ1NWL1RTViBvZiBgY2VsbF9pZGAsIGBncm91cGApIGFzIGEgbmV3IGNhdGVnb3JpY2FsIGNvbHVtbi5cbiAgICogT3B0aW9uYWw6IG9ubHkgZGF0YSBzb3VyY2VzIHRoYXQgY2FuIGpvaW4gY2VsbCBpZHMgaW1wbGVtZW50IGl0LlxuICAgKi9cbiAgaW1wb3J0R3JvdXBzPyhsYWJlbDogc3RyaW5nLCB0YWJsZTogc3RyaW5nKTogUHJvbWlzZTx7IGNvbHVtbjogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhOyBtYXRjaGVkOiBudW1iZXIgfT47XG4gIC8qKiBUcmFuc2NyaXB0IHRvdGFscyBwZXIgZ2VuZSDigJQgZm9yIHRoZSBwb2ludHMgZXN0aW1hdGUuIE9wdGlvbmFsLiAqL1xuICB0cmFuc2NyaXB0Q291bnRzPyhnZW5lczogc3RyaW5nW10pOiBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzPjtcbiAgLyoqIE1hcmtlciBnZW5lcyBvZiBlYWNoIGdyb3VwIG9mIGEgY2F0ZWdvcmljYWwgY29sdW1uLiBPcHRpb25hbCAoc2VlIHRoZSBwb3J0KS4gKi9cbiAgbWFya2VyR2VuZXM/KGNvbHVtbjogc3RyaW5nLCBwZXJHcm91cD86IG51bWJlcik6IFByb21pc2U8U3BhdGlhbE1hcmtlckdlbmVzPjtcbiAgLyoqIFRyYW5zY3JpcHRzIG9mIGVhY2ggc2VsZWN0ZWQgZ2VuZSBpbiB0aGUgY3VycmVudCB2aWV3LCBvciBudWxsIHdoZW4gbm90IGtub3duXG4gICAqICAoYWxsIGdlbmVzIGF0IG9uY2UsIHRyYW5zY3JpcHRzIG9mZiwgb3IgYSBzZWxlY3Rpb24gem9vbWVkIG91dCBvbiBhIGRhdGFzZXQgd2l0aG91dCB0aGVcbiAgICogIHB5cmFtaWQncyBwZXItZ2VuZSBsZXZlbHMsIHdoZXJlIGNsdXN0ZXJzIGFyZSBkcmF3biBmcm9tIHN1bW1lZCBkZW5zaXR5IGdyaWRzKS4gKi9cbiAgZ2V0R2VuZUNvdW50c0luVmlldyQ/KCk6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGw+O1xuICAvKiogRXN0aW1hdGVkIHRyYW5zY3JpcHRzIGluIHZpZXcgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYWdhaW5zdCB0aGUgbWFya2VyIGJ1ZGdldC4gKi9cbiAgZ2V0VHJhbnNjcmlwdEVzdGltYXRlJD8oKTogT2JzZXJ2YWJsZTx7IHBvaW50czogbnVtYmVyOyBtYXg6IG51bWJlciB9IHwgbnVsbD47XG4gIC8qKiBUaGUgZGVuc2l0eSBtYXAncyBjb2xvdXIgd2luZG93IGluIHVzZSAoYXV0by1kZXJpdmVkIG9yIHNldCkgYW5kIGl0cyBkZW5zZXN0IGJpbi4gKi9cbiAgZ2V0RGVuc2l0eVN0YXRzJD8oKTogT2JzZXJ2YWJsZTx7IGxvOiBudW1iZXI7IGhpOiBudW1iZXI7IG1heDogbnVtYmVyIH0gfCBudWxsPjtcbiAgLyoqXG4gICAqIFRoZSB6IHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgdGhlIGRhdGFzZXQgd2FzIGltYWdlZCBhdCwgYXNjZW5kaW5nIOKAlCBvclxuICAgKiBudWxsIHdoZW4gaXRzIHogaXMgY29udGludW91cyByYXRoZXIgdGhhbiBzZWN0aW9uZWQgKHNvIHRoZXJlIGFyZSBubyBzZWN0aW9uc1xuICAgKiB0byBvZmZlcikgb3Igd2hlbiB0aGVyZSBpcyBubyBkYXRhc2V0LlxuICAgKlxuICAgKiBMZXRzIGEgcGFuZWwgb2ZmZXIgXCJvbmUgc2VjdGlvbiBhdCBhIHRpbWVcIiBmb3IgdGhlIDNEIGNsb3VkIG9ubHkgd2hlcmUgdGhhdFxuICAgKiBtZWFucyBzb21ldGhpbmcsIGFuZCBsYWJlbCB0aGUgY2hvc2VuIG9uZS4gU2Nhbm5lZCBvbmNlIHBlciBkYXRhc2V0LlxuICAgKi9cbiAgc2FtcGxlZFNlY3Rpb25zKCk6IEZsb2F0MzJBcnJheSB8IG51bGw7XG5cbiAgLy8g4pSA4pSAIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqIFRoZSBjdXJyZW50IHNlbGVjdGlvbi4gRW1wdHkgbWVhbnMgXCJub3RoaW5nIHNlbGVjdGVkXCIsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAqICB3aG9sZSB0aXNzdWUgcmVuZGVycyBub3JtYWxseSByYXRoZXIgdGhhbiBldmVyeXRoaW5nIGJlaW5nIG11dGVkLiAqL1xuICBnZXRTZWxlY3Rpb24kKCk6IE9ic2VydmFibGU8U3BhdGlhbFNlbGVjdGlvbk1hc2s+O1xuICAvKipcbiAgICogU2VsZWN0IGV2ZXJ5IG9ic2VydmF0aW9uIGluc2lkZSB0aGUgY3VycmVudGx5LWRyYXduIHJlZ2lvbnMgKHRoZWlyIHVuaW9uKS5cbiAgICogUmV1c2VzIHRoZSBleGlzdGluZyBST0kgdG9vbHMg4oCUIHJlY3RhbmdsZSwgcG9seWdvbiwgZnJlZWhhbmQsIHdhbmQsIGJydXNoIOKAlFxuICAgKiBzbyB0aGVyZSBpcyBubyBzZXBhcmF0ZSBtYXJxdWVlIHRvIGxlYXJuLiBJbiB0aGUgM0QgY2xvdWQsIHRoZSByZWdpb24gY2xhc3Nlc1xuICAgKiBwaWNrZWQgaW4gdGhlIFJlZ2lvbiBFZGl0b3IgKHNlZSB7QGxpbmsgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyR9KSBzZWxlY3QgdGhlXG4gICAqIG9ic2VydmF0aW9ucyBpbnNpZGUgdGhlaXIgdm9sdW1lcyBpbnN0ZWFkLCB3aGVuIHRoZSByZWdpb25zIHNpdCBvbiB0aGVcbiAgICogZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWU7IHdpdGhvdXQgYSBwaWNrLCB0aGUgbGFzc29zIGRyYXduIG92ZXIgdGhlIGNsb3VkLlxuICAgKiBSZXNvbHZlcyBob3cgbWFueSB3ZXJlIHNlbGVjdGVkIOKAlCBvciBudWxsIHdoZW4gaXQgd2FzIHN1cGVyc2VkZWQgd2hpbGUgdGhlXG4gICAqIGNsYXNzZXMnIG91dGxpbmVzIHdlcmUgcmVhZCAoYSBuZXdlciBzZWxlY3Rpb24sIGEgQ2xlYXIsIGFub3RoZXIgZGF0YXNldCwgdmlld1xuICAgKiBvciBwaWNrKSwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIHdhcyBwdWJsaXNoZWQuXG4gICAqL1xuICBzZWxlY3RGcm9tUmVnaW9ucygpOiBQcm9taXNlPG51bWJlciB8IG51bGw+O1xuICAvKipcbiAgICogSG93IHtAbGluayBzZWxlY3RGcm9tUmVnaW9uc30gd291bGQgc2VsZWN0IG5vdzogaW5zaWRlIHRoZSBwaWNrZWQgY2xhc3NlcydcbiAgICogdm9sdW1lcywgb3IgYnkgdGhlIGRyYXduIHJlZ2lvbnMuIFRoZSBydWxlIGl0IHJ1bnMgYnksIHNvIGEgcGFuZWwgZGVzY3JpYmluZ1xuICAgKiB0aGUgYnV0dG9uIGNhbiBuZXZlciBkaXNhZ3JlZSB3aXRoIHdoYXQgaXQgZG9lcy5cbiAgICovXG4gIHJvaVNlbGVjdGlvbk1vZGU/KCk6IFJvaVNlbGVjdGlvbk1vZGU7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGNsYXNzZXMgdGhlIHJlZ2lvbiBzZWxlY3Rpb24gd2FzIHBpY2tlZCBhcyAoYSBjbGFzcyB0cmVlIG5vZGUgd2l0aFxuICAgKiBpdHMgc3ViY2xhc3NlcywgYSBzdXJmYWNlIGNsaWNrZWQgaW4gM0QpOyBbXSBmb3IgYW55IG90aGVyIHNlbGVjdGlvbi5cbiAgICovXG4gIGdldFBpY2tlZFJlZ2lvbkNsYXNzZXMkPygpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IHN0cmluZ1tdPjtcbiAgLyoqIFNlbGVjdCBldmVyeSBvYnNlcnZhdGlvbiBpbiBvbmUgY2F0ZWdvcnkgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW4g4oCUIHRoZVxuICAgKiAgbGVnZW5kIGNsaWNrLiBSZWplY3RzIGZvciBhbiB1bmtub3duIG9yIGNvbnRpbnVvdXMgY29sdW1uLiAqL1xuICBzZWxlY3RDYXRlZ29yeShjb2x1bW46IHN0cmluZywgY2F0ZWdvcnlJbmRleDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gZXhwbGljaXQgc2V0IG9mIG9ic2VydmF0aW9ucywgcmVwbGFjaW5nIGFueSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICpcbiAgICogRm9yIGEgbGlua2VkIHBsb3Q6IGxhc3NvaW5nIHBvaW50cyBpbiBhbiBlbWJlZGRpbmcgaXMgYSBzZWxlY3Rpb24gT0Ygb2JzZXJ2YXRpb25zLFxuICAgKiBhbmQgZXZlcnkgb3RoZXIgdmlldyDigJQgdGhlIG1hcCwgdGhlIGRpc3RyaWJ1dGlvbnMg4oCUIHJlYWRzIHRoZSBzYW1lIG1hc2ssIHNvIGJydXNoaW5nXG4gICAqIG9uZSBsaWdodHMgdXAgdGhlIHJlc3QuIFJldHVybnMgaG93IG1hbnkgd2VyZSBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdEluZGljZXMoaW5kaWNlczogSXRlcmFibGU8bnVtYmVyPik6IG51bWJlcjtcbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZDtcbn1cblxuLyoqIERpc3BsYXkgb3B0aW9ucyAoY29sb3JtYXAvTFVULCByZXZlcnNlIHNjYWxlLCBpbWFnZSBtZXRhZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5T3B0aW9ucyB7XG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD47XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBDb2xvcm1hcE5vZGUpOiB2b2lkO1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW107XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBQdWJsaXNoIHRoZSBjdXJyZW50IGltYWdlJ3MgbWV0YWRhdGEuIGBpbWFnZUtleWAgKGl0cyBmaWxlIG5hbWUpIGxldHMgdGhlXG4gICAqICBjaGFubmVsIHN0YXRlIHN1cnZpdmUgYSByZS1wbG90IG9mIHRoZSBzYW1lIGltYWdlIGJ1dCBub3QgYSBzd2l0Y2ggdG8gYW5vdGhlci4gKi9cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkO1xuICBnZXRJbWFnZU1ldGEoKTogT2JzZXJ2YWJsZTxJSW1hZ2VNZXRhZGF0YVtdPjtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBpbnRlbnNpdHkgc2FtcGxpbmcgYSByZW5kZXJpbmcgYmFja2VuZCBvd25zOiB3aGVyZSBpdHMgdmlldyBzZXR0bGVkLlxuICogV2hhdCBgSVZpZXdlckJhY2tlbmQuZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKWAgcmV0dXJucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2Uge1xuICAvKiogVmlzaWJsZS1yZWdpb24gY2hhbmdlcyAoaW1hZ2UtcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IHNldHRsZXMsXG4gICAqICBzbyB0aGUgaW5zZXQgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZyAodGhlIGxpbmUgUk9JcycgaW5zZXQpLCBmcm9tIGBJVmlzdWFsaXplci5nZXRJbnRlbnNpdHlTYW1wbGluZygpYC5cbiAqIFRoZSBzYW1wbGluZyBpdHNlbGYgaXMgYmFja2VuZC1uZXV0cmFsICh0aGUgbGlicmFyeSdzIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlXG4gKiBzYW1wbGVzIHdoYXRldmVyIGltYWdlIGlzIG9uIHNjcmVlbik7IHRoZSB2aWV3cG9ydC1jaGFuZ2Ugc2lnbmFsIGNvbWVzIGZyb20gdGhlXG4gKiBiYWNrZW5kIHRoYXQgZHJhd3MgdGhlIGltYWdlIChPcGVuU2VhZHJhZ29uIGFuZCBuYXBhcmktanMgcmVwb3J0IGl0OyBQbG90bHlcbiAqIHJlLXNhbXBsZXMgaXRzIGhpZ2gtZGVmIHpvb20gY3JvcHMgaW5saW5lIGluc3RlYWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJbnRlbnNpdHlTYW1wbGluZyBleHRlbmRzIElJbnRlbnNpdHlWaWV3cG9ydFNvdXJjZSB7XG4gIC8qKiBMb2FkIHRoZSBjdXJyZW50IGltYWdlL3NsaWNlJ3MgcGl4ZWxzIHNvIHRoZSBsaW5lLVJPSSBwcm9maWxlcyBoYXZlIGRhdGFcbiAgICogIChhIGJhY2tlbmQgd2l0aCBubyBmcmFtZXMgb2YgaXRzIG93bjogT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzKS4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZS1zYW1wbGUgdGhlIHByb2ZpbGVzIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBnaXZlbiBpbWFnZS1waXhlbCBST0kgYXRcbiAgICogIGRpc3BsYXkgcmVzb2x1dGlvbi4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSAyRCB2aWV3IG9wdGlvbnMgb2YgYSB0aWxlZCBpbWFnZSB2aWV3ZXI6IHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgYW5kIGltYWdlXG4gKiBzbW9vdGhpbmcuIE9wZW5TZWFkcmFnb24ncywgbWlycm9yZWQgYnkgbmFwYXJpLWpzJ3MgMkQgdmlld3M7IFBsb3RseSBoYXMgbmVpdGhlci5cbiAqIENhcGFiaWxpdHktZ2F0ZWQ6IGBJVmlld2VyQmFja2VuZC5nZXRPc2RWaWV3T3B0aW9ucygpYCBpcyBudWxsIG9uIGEgYmFja2VuZFxuICogd2l0aG91dCB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElPc2RWaWV3T3B0aW9ucyB7XG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAodGhlIG1pbmltYXApLiBBcHBsaWVkIHdoZW4gdGhlIHZpZXdlciBpc1xuICAgKiAgKHJlKWNyZWF0ZWQsIGFuZCB0b2dnbGVkIGxpdmUgd2hlbiBvbmUgaXMgYWxyZWFkeSBtb3VudGVkLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKS4gYGZhbHNlYCA9IG5lYXJlc3QtbmVpZ2hib3VyLCBzb1xuICAgKiAgem9vbWluZyBwYXN0IDE6MSBzaG93cyBjcmlzcCBwaXhlbCBibG9ja3MgKHBpeGVsLWxldmVsIGluc3BlY3Rpb24pLiBBcHBsaWVkXG4gICAqICBhdCB2aWV3ZXIgY3JlYXRpb24gYW5kIGxpdmUgKHdpdGggYSByZWRyYXcpIHdoZW4gb25lIGlzIG1vdW50ZWQuICovXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIGEgdm9sdW1lIHJlbmRlcmVyIChuYXBhcmktanMgV2ViR1BVKTogMSA9IGZ1bGxcbiAqIHJlc29sdXRpb24g4oCmIDggPSDihZsgcGVyIGF4aXMuIENhcGFiaWxpdHktZ2F0ZWQ6IG51bGwgb24gYSBiYWNrZW5kIHdpdGhvdXQgb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElWb2x1bWVSZXNvbHV0aW9uIHtcbiAgLyoqIFRoZSBjdXJyZW50IGZhY3RvciAodG8gaW5pdGlhbGl6ZSB0aGUgUmVzb2x1dGlvbiBjb250cm9sKS4gKi9cbiAgZ2V0KCk6IG51bWJlcjtcbiAgLyoqIFNldCB0aGUgZmFjdG9yIChyb3VuZGVkLCBhdCBsZWFzdCAxKS4gVGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IChyZSlsb2FkIOKAlFxuICAgKiAgdGhlIGhvc3QgcmUtcGxvdHMgYWZ0ZXIgY2FsbGluZyBpdCwgc2luY2UgaXQgY2hhbmdlcyB0aGUgZmV0Y2hlZCBkYXRhLiAqL1xuICBzZXQoc2NhbGU6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGhvc3QtZmFjaW5nIGNvbXBvc2l0ZSBjb250cmFjdCwgaW1wbGVtZW50ZWQgYnkgdGhlIHJvdXRlciAoYFZJU1VBTElaRVJgKS4gQVxuICogcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyB7QGxpbmsgSVZpZXdlckJhY2tlbmR9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXJcbiAgZXh0ZW5kcyBJRGF0YVJlbmRlcmVyLCBJUmVnaW9uU3RvcmUsIElUb29sQ29udHJvbGxlciwgSURpc3BsYXlPcHRpb25zLCBJSW50ZW5zaXR5U2FtcGxpbmcge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gTWF5IGJlIG51bGwgdW50aWwgYSBwbG90IGlzIG1vdW50ZWRcbiAgICogIChPcGVuU2VhZHJhZ29uKS4gRHJpdmVzIHJlZ2lvbiBkcmF3L3NlbGVjdCBtb2RlcyB1bmlmb3JtbHkuICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsO1xuICAvKiogU3BsaXQgYSB2b2x1bWUgdmlldzogdGhlIGRpc3BsYXllZCBzbGljZSwgd2l0aCBldmVyeSByZWdpb24gdG9vbCwgaW4gdGhlIGRpdiBgZGl2YCBiZXNpZGVcbiAgICogIHRoZSAzRCB2aWV3OyBudWxsIGNsb3NlcyBpdC4gUmVzb2x2ZXMgd2hldGhlciB0aGUgc2xpY2Ugc2hvd3MuIE9wdGlvbmFsOiB0aGUgcm91dGVyJ3MuICovXG4gIHNldFNsaWNlRWRpdG9yPyhkaXY6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogVGhlIHNsaWNlIGVkaXRvcidzIHNlY3Rpb25zIHRocm91Z2ggeCBhbmQgeSAobnVsbHMgd2hpbGUgaXQgaXMgY2xvc2VkKS4gT3B0aW9uYWw6IHRoZSByb3V0ZXIncy4gKi9cbiAgZ2V0U2VjdGlvblZpZXdzJD8oKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+O1xuICAvKiogTW92ZSB0aGUgc2xpY2UgZWRpdG9yJ3Mgc2VjdGlvbiBwbGFuZSB0aHJvdWdoIGBheGlzYCB0byBgYXRgIChpbWFnZSBweCkuICovXG4gIHNldFNlY3Rpb25QbGFuZT8oYXhpczogU2VjdGlvbkF4aXMsIGF0OiBudW1iZXIpOiB2b2lkO1xuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lICh0aGUgaG9zdCBzaG93cyBpdCkuICovXG4gIGdldFNsaWNlRHJhZyQ/KCk6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqIElzb3N1cmZhY2UgY29udHJvbHMgd2hlbiB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlYCxcbiAgICogIGVsc2UgbnVsbCDigJQgc28gY29uc3VtZXJzIGdhdGUgb24gdGhlIHJldHVybmVkIG9iamVjdCwgbm90IGEgbm8tb3AgbWV0aG9kLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGw7XG4gIC8qKiBJbnRlbnNpdHkgKGxpbmUtUk9JKSBjb250cm9scyB3aGVuIHRoZSBiYWNrZW5kIHJlbmRlcnMgdGhlIExJTkUgcGxvdCB0eXBlLFxuICAgKiAgZWxzZSBudWxsLiAqL1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsO1xuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgd2hlbiB0aGlzIGJhY2tlbmQgcmVuZGVycyAzRCBwbG90IHR5cGVzLCBlbHNlIG51bGwg4oCUXG4gICAqICB0aGUgY2FwYWJpbGl0eS1nYXRlZCByZXBsYWNlbWVudCBmb3IgdGhlIGRlcHJlY2F0ZWQgdG9wLWxldmVsXG4gICAqICBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYC4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIFRoZSBuYXZpZ2F0b3IgLyBpbWFnZS1zbW9vdGhpbmcgb3B0aW9ucy4gTmV2ZXIgbnVsbCBvbiB0aGUgcm91dGVyOiBhIHNldHRpbmdcbiAgICogIGFwcGxpZXMgdG8gZXZlcnkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBzbyBpdCBjYW5cbiAgICogIGJlIHNldCBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlciBhbmQgc3Vydml2ZXMgYSBiYWNrZW5kIHN3aXRjaC4gKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zO1xuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlbiBpdCBoYXMgbm9uZVxuICAgKiAgKG9ubHkgbmFwYXJpLWpzIHJlbmRlcnMgdm9sdW1lcykuICovXG4gIGdldFZvbHVtZVJlc29sdXRpb24oKTogSVZvbHVtZVJlc29sdXRpb24gfCBudWxsO1xuICAvKiogSW50ZW5zaXR5LXByb2ZpbGUgc2FtcGxpbmcsIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbi4gKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koKWAuICovXG4gIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5nZXRWaWV3cG9ydENoYW5nZSQoKWAuICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+O1xuICAvKiogU3BhdGlhbC1vbWljcyBjb250cm9scyB3aGVuIGEgYFNQQVRJQUxfREFUQV9QT1JUYCBpcyBib3VuZCwgZWxzZSBudWxsLlxuICAgKiAgT3B0aW9uYWw6IG9ubHkgdGhlIHJvdXRpbmcgc2VydmljZSBpbXBsZW1lbnRzIGl0LCBzaW5jZSB0aGUgc3RhdGUgaXMgc2hhcmVkXG4gICAqICByYXRoZXIgdGhhbiBvd25lZCBieSBhbnkgb25lIGJhY2tlbmQuICovXG4gIGdldFNwYXRpYWxDb250cm9scz8oKTogSVNwYXRpYWxDb250cm9scyB8IG51bGw7XG4gIC8qKiBUaGUgdmlld3BvcnQgYSBjb250cmlidXRlZCBwbG90IG1vZGUgZHJhd3Mgb3Zlciwgd2hlbiB0aGUgYmFja2VuZCBvblxuICAgKiAgc2NyZWVuIGNhbiBwcm92aWRlIG9uZSAoT3BlblNlYWRyYWdvbiksIGVsc2UgbnVsbC4gT3B0aW9uYWw6IGJhY2tlbmRzIHRoYXRcbiAgICogIG5vIGNvbnRyaWJ1dGVkIG1vZGUgcmlkZXMgb24gbmVlZCBub3QgaW1wbGVtZW50IGl0LiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0PygpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbDtcbiAgLyoqIEJpbm5lZCBpbnRlbnNpdHkgaGlzdG9ncmFtIGZvciBhIGNoYW5uZWwgZnJvbSB0aGUgY3VycmVudGx5LWRpc3BsYXllZFxuICAgKiAgcGl4ZWxzLCBvciBudWxsIHdoZW4gbm9uZSBhcmUgYXZhaWxhYmxlLiBGZWVkcyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW1cbiAgICogIHBhbmUuICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGw7XG4gIC8qKiBBc3luYyBoaXN0b2dyYW0gc3RyZWFtIOKAlCBuYXRpdmUgYml0IGRlcHRoIGZvciA+OC1iaXQgaW1hZ2VzIChzZXJ2ZXIpLCBlbHNlXG4gICAqICB0aGUgOC1iaXQgY2xpZW50IGhpc3RvZ3JhbS4gKi9cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD47XG4gIC8qKiBFeHBvcnQgdGhlIGRpc3BsYXllZCBpbWFnZSwgY29tcG9zaXRlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXkgc2V0dGluZ3MsXG4gICAqICBhcyBhIHB1YmxpY2F0aW9uLXJlYWR5IFBORyBkb3dubG9hZC4gKi9cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQ7XG4gIC8qKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgaW1hZ2UgZGF0YSBhcyBhIGRhdGEtcHJlc2VydmluZyBtdWx0aS1iYW5kIFRJRkZcbiAgICogIChuYXRpdmUgYml0IGRlcHRoKS4gTm8tb3Agb24gYmFja2VuZHMgdGhhdCBjYW4ndCBwcm92aWRlIGl0LiAqL1xuICBleHBvcnREYXRhKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgdmlldyBpcyBnb2luZyBhd2F5ICh0aGUgYDx2aXN1YWxpemVyPmAgaXMgZGVzdHJveWVkKTogZHJvcCB3aGF0IGlzIGJvdW5kIHRvXG4gICAqIGl0IOKAlCB0aGUgb24tc2NyZWVuIHZpZXdlciwgaXRzIHJlbmRlciBsb29wIGFuZCB2aWV3IHN1YnNjcmlwdGlvbnMg4oCUIHNvIG5vdGhpbmdcbiAgICogb3V0bGl2ZXMgdGhlIHZpZXcuIFNlcnZpY2UtbGlmZXRpbWUgc3RhdGUgKHN0b3JlcywgdGhlIGJhY2tlbmRzJyBvd24gc3RvcmVcbiAgICogc3Vic2NyaXB0aW9ucykgaXMgdW50b3VjaGVkLCBzbyBhIGxhdGVyIHZpZXcgb24gdGhlIHNhbWUgY2hhaW4gcmVuZGVycyBub3JtYWxseS5cbiAgICovXG4gIGRldGFjaCgpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBkZXRhY2h9LCB3aGljaCB0aGlzIGRlbGVnYXRlcyB0by4gKi9cbiAgdW5zdWJzY3JpYmUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBXaGF0IGEgcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyAoUGxvdGx5LCBPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpOiByZW5kZXJpbmcsXG4gKiB0aGUgdmlld3BvcnQsIHBpeGVsIHJlYWRiYWNrLCBleHBvcnQsIGxvYWRpbmcgc3RhdGUgYW5kIGl0cyBvbi1jYW52YXMgdG9vbHMsIHBsdXNcbiAqIGNhcGFiaWxpdHktZ2F0ZWQgZ2V0dGVycyBmb3Igd2hhdCBvbmx5IHNvbWUgYmFja2VuZHMgaGF2ZS5cbiAqXG4gKiBJdCBpcyB0aGUgYmFja2VuZC1mYWNpbmcgaGFsZiBvZiB7QGxpbmsgSVZpc3VhbGl6ZXJ9LiBSZWdpb24gYW5kIGRpc3BsYXkgc3RhdGUgYXJlXG4gKiBub3QgaGVyZTogdGhleSBsaXZlIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCAvIGBWaXN1YWxpemVyU3RvcmVgLCB3aGljaCB0aGUgcm91dGVyXG4gKiBzZXJ2ZXMgdG8gaG9zdHMgZGlyZWN0bHk7IGEgYmFja2VuZCBkcmF3cyB0aGVtIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBzdG9yZXMnIGV2ZW50cy5cbiAqIEhvc3RzIGtlZXAgZGVwZW5kaW5nIG9uIGBJVmlzdWFsaXplcmAgKHRoZSByb3V0ZXIncyBjb21wb3NpdGUpLCBuZXZlciBvbiBhIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZXdlckJhY2tlbmQgZXh0ZW5kcyBJVG9vbENvbnRyb2xsZXIge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcblxuICAvLyDilIDilIAgcmVuZGVyIGxpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TG9hZGVkSW1hZ2U+O1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogVGhlIHZpZXcgaXMgZ29pbmcgYXdheTogcmVsZWFzZSB3aGF0IGlzIGJvdW5kIHRvIGl0LiAqL1xuICBkZXRhY2goKTogdm9pZDtcbiAgLyoqIFN0b3Agc3RyZWFtaW5nIGZyYW1lcyAodm9sdW1lIGFzc2VtYmx5IC8gc3VyZmFjZSBwcmVsb2FkKS4gT3B0aW9uYWw6IG9ubHlcbiAgICogIGJhY2tlbmRzIHRoYXQgc3RyZWFtIGEgei1zdGFjayBkbyB3b3JrIGhlcmUuICovXG4gIGNhbmNlbExvYWRpbmc/KCk6IHZvaWQ7XG5cbiAgLy8g4pSA4pSAIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIGZpdFRvVmlldygpOiB2b2lkO1xuICAvKiogQHNlZSBJRGF0YVJlbmRlcmVyLnJlc2V0QXhlcyAqL1xuICByZXNldEF4ZXMoKTogdm9pZDtcbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3LiAqL1xuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHVua25vd24+O1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgLy8g4pSA4pSAIHBpeGVscywgaGlzdG9ncmFtLCBleHBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGw7XG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGw7XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+O1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkO1xuICBleHBvcnREYXRhKCk6IHZvaWQ7XG5cbiAgLy8g4pSA4pSAIGNhcGFiaWxpdHktZ2F0ZWQgc3VyZmFjZXMgKG51bGwgLyBhYnNlbnQgd2hlcmUgdGhlIGJhY2tlbmQgbGFja3MgdGhlIGZlYXR1cmUpIOKUgOKUgFxuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHwgbnVsbDtcbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsO1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsO1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsO1xuICBnZXRQbG90TW9kZVZpZXdwb3J0PygpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbDtcbiAgLyoqIE5hdmlnYXRvciAvIGltYWdlIHNtb290aGluZywgb3IgbnVsbCB3aGVuIHRoZSBiYWNrZW5kIGhhcyBuZWl0aGVyIChQbG90bHkpLiAqL1xuICBnZXRPc2RWaWV3T3B0aW9ucygpOiBJT3NkVmlld09wdGlvbnMgfCBudWxsO1xuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3Rvciwgb3IgbnVsbCB3aGVuIHRoZSBiYWNrZW5kIHJlbmRlcnMgbm8gdm9sdW1lcy4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGw7XG4gIC8qKiBXaGVyZSB0aGUgdmlldyBzZXR0bGVkLCBmb3IgdGhlIGludGVuc2l0eSBpbnNldCdzIHJlLXNhbXBsaW5nOyBudWxsIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIHJlLXNhbXBsZXMgb24gaXRzIG93biAoUGxvdGx5J3MgaGlnaC1kZWYgem9vbSkuIFRoZSBzYW1wbGluZyBpdHNlbGYgaXNcbiAgICogIHRoZSByb3V0ZXIncyAoSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UpLiAqL1xuICBnZXRJbnRlbnNpdHlTYW1wbGluZygpOiBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2UgfCBudWxsO1xufVxuXG4vKipcbiAqIFdoYXQgYSBtb3VudGVkIGA8dmlzdWFsaXplcj5gIGhhbmRzIGl0cyBob3N0IHRocm91Z2hcbiAqIGBJbWFnZVN0YXRlUG9ydC5zZXREaWFncmFtKClgIOKAlCBhIHNtYWxsLCB0eXBlZCBzdXJmYWNlIHJhdGhlciB0aGFuIHRoZSBjb21wb25lbnRcbiAqIGl0c2VsZiwgd2hvc2UgZXZlcnkgcHVibGljIG1lbWJlciB3b3VsZCBvdGhlcndpc2UgYmUgZGUtZmFjdG8gQVBJLiBDbGVhcmVkXG4gKiAoYHNldERpYWdyYW0obnVsbClgKSB3aGVuIHRoZSB2aXN1YWxpemVyIGlzIGRlc3Ryb3llZC4gSG9zdHMgdGhhdCBjYW4gaW5qZWN0XG4gKiB7QGxpbmsgVklTVUFMSVpFUn0gLyBgUkVHSU9OX0VESVRPUl9BUElgIGRpcmVjdGx5IG5lZWQgbm90IHVzZSBpdCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlzdWFsaXplckhhbmRsZSB7XG4gIC8qKiBUaGUgdmlzdWFsaXplciBjaGFpbiB0aGlzIGA8dmlzdWFsaXplcj5gIHJlbmRlcnMgdGhyb3VnaC4gKi9cbiAgcmVhZG9ubHkgdmlzdWFsaXplcjogSVZpc3VhbGl6ZXI7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHZpc3VhbGl6ZXJ9LiBLZXB0IGZvciBob3N0cyB0aGF0IHJlYWQgdGhlIGNvbXBvbmVudCdzXG4gICAqICBmb3JtZXIgYHBsb3RTZXJ2aWNlYCBmaWVsZCBvZmYgdGhlIHJlZ2lzdGVyZWQgb2JqZWN0LiAqL1xuICByZWFkb25seSBwbG90U2VydmljZTogSVZpc3VhbGl6ZXI7XG4gIC8qKiBXaGV0aGVyIGFueSByZWdpb24gKGFubm90YXRpb24gb3IgaW50ZW5zaXR5IGxpbmUpIGV4aXN0cyBvbiB0aGUgY3VycmVudCBpbWFnZS4gKi9cbiAgaGFzUmVnaW9ucygpOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgcmVnaW9ucyBhcyBwb2x5Z29ucywgZm9yIGEgc2VydmVyIHJlcXVlc3QgKGNyb3AgLyBwcm9jZXNzaW5nKS4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xufVxuXG4vKipcbiAqIERJIHRva2VuIGZvciB0aGUgYWN0aXZlIHZpc3VhbGl6YXRpb24gYmFja2VuZC4gQmluZCBpdCAoYHVzZUV4aXN0aW5nYCkgdG8gdGhlXG4gKiBgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlYCwgd2hpY2ggc2VsZWN0cyBQbG90bHkgdnMgT3BlblNlYWRyYWdvbiBwZXIgcGxvdFxuICogdHlwZS4gQ29uc3VtZXJzIOKAlCBpbmNsdWRpbmcgdGhpcyBsaWJyYXJ5J3Mgb3duIGBWaXN1YWxpemVyQ29tcG9uZW50YCDigJRcbiAqIGluamVjdCBgSVZpc3VhbGl6ZXJgIHRocm91Z2ggdGhpcyB0b2tlbiByYXRoZXIgdGhhbiB0aGUgY29uY3JldGUgcm91dGVyLCBzb1xuICogdGhlIHJvdXRpbmcvZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gY2FuIGNoYW5nZSB3aXRob3V0IHRvdWNoaW5nIGNvbnN0cnVjdG9ycy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZJU1VBTElaRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48SVZpc3VhbGl6ZXI+KCdWSVNVQUxJWkVSJyk7XG4iXX0=
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQW10Qi9DOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBYyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFNlY3Rpb25BeGlzLCBTZWN0aW9uVmlld3MgfSBmcm9tICcuL3NlY3Rpb24tdmlldy5jb250cmFjdCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4vcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgQ2FudmFzVG9vbE9wdGlvbnMsXG4gIENvbG9ybWFwTm9kZSxcbiAgSVdhbmRPcHRpb25zLFxuICBJQnJ1c2hPcHRpb25zLFxuICBTcGF0aWFsVmlld1N0YXRlLFxuICBTcGF0aWFsQ29sb3JCeSxcbn0gZnJvbSAnLi9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxNYXJrZXJHZW5lcyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzLFxufSBmcm9tICcuL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFBsb3RNb2RlVmlld3BvcnQgfSBmcm9tICcuL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCB2aXN1YWxpemF0aW9uIGNvbnRyYWN0LiBQbG90bHkgaXMgb25lIGltcGxlbWVudGF0aW9uO1xuICogT3BlblNlYWRyYWdvbiBpcyBhbm90aGVyIChmb3IgdGhlIGltYWdlIHBsb3QgdHlwZSkuIFRoZSBhYnN0cmFjdGlvbiByZW5kZXJzXG4gKiBkYXRhIOKAlCBhIHJhc3RlciBpbWFnZSBPUiBhIHNjaWVudGlmaWMgcGxvdCAoaGVhdG1hcCwgc3VyZmFjZSwgY29udG91cixcbiAqIHNjYXR0ZXIsIGxpbmUsIGlzb3N1cmZhY2UpIOKAlCBkcmF3cyByZWdpb25zIG9uIGl0LCBhbmQgZHJpdmVzIG9uLWNhbnZhcyB0b29scy5cbiAqXG4gKiBTcGxpdCBpbnRvIHJvbGUgaW50ZXJmYWNlcyBzbyBhIGNvbnN1bWVyIGNhbiBkZXBlbmQgb25seSBvbiB0aGUgc2xpY2UgaXRcbiAqIHVzZXMsIHRoZW4gY29tcG9zZWQgaW50byBgSVZpc3VhbGl6ZXJgLlxuICovXG5cbi8qKiBQaXhlbCByZWFkYmFjayBzaGFwZSByZXR1cm5lZCBieSBgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxEYXRhIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5O1xufVxuXG4vKiogSW50ZW5zaXR5IHNhbXBsZWQgYWxvbmcgYSBsaW5lIFJPSSAoUGxvdFR5cGUuTElORSBvdmVyIGltYWdlIGRhdGEpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlbnNpdHlQcm9maWxlIHtcbiAgLyoqIERpc3RhbmNlIGFsb25nIHRoZSBsaW5lLiBJbiBtaWNyb25zIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgYSBwaHlzaWNhbFxuICAgKiAgcGl4ZWwgc2l6ZSAobXBwKTsgb3RoZXJ3aXNlIGluIGltYWdlIHBpeGVscy4gU2VlIHtAbGluayB1bml0fS4gKi9cbiAgcG9zaXRpb25zOiBudW1iZXJbXTtcbiAgLyoqIFNhbXBsZWQgaW50ZW5zaXR5IChncmF5c2NhbGUgdmFsdWUgb3IgUkdCIGx1bWluYW5jZSkuICovXG4gIHZhbHVlczogbnVtYmVyW107XG4gIC8qKiBVbml0IG9mIHtAbGluayBwb3NpdGlvbnN9OiAnwrVtJyB3aGVuIHNjYWxlZCBieSB0aGUgaW1hZ2UncyBtcHAsIGVsc2UgJ3B4Jy4gKi9cbiAgdW5pdD86ICfCtW0nIHwgJ3B4JztcbiAgLyoqIFN0YWJsZSBpZCBvZiB0aGUgbGluZSBST0kgdGhpcyBwcm9maWxlIGNhbWUgZnJvbSAobXVsdGktbGluZSBzdXBwb3J0KS4gKi9cbiAgaWQ/OiBudW1iZXI7XG4gIC8qKiBDb2xvdXIgb2YgdGhlIGxpbmUgUk9JIOKAlCB0aGUgaW5zZXQgdHJhY2UgaXMgZHJhd24gaW4gdGhlIHNhbWUgY29sb3VyLiAqL1xuICBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBJRGF0YVJlbmRlcmVyLmxvYWQoKWAgcmVzb2x2ZXMgdG8uIEJhY2tlbmQtc3BlY2lmaWMgYmV5b25kIGBmaWxlbmFtZWAsXG4gKiB3aGljaCBuYW1lcyB0aGUgaW1hZ2UgdGhlIGhhbmRsZSB3YXMgbG9hZGVkIGZvcjogdGhlIGhvc3QgY29tcGFyZXMgaXQgd2l0aCB0aGVcbiAqIGltYWdlIGl0IGFza2VkIGZvciwgdG8gZHJvcCBhIGhhbmRsZSBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gUGFzcyB0aGVcbiAqIGhhbmRsZSBvbiB0byBgcGxvdCgpYCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkSW1hZ2Uge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSByZW5kZXIvdmlld3BvcnQgcm9sZTogbG9hZCBkYXRhLCByZW5kZXIgaXQgKGltYWdlIG9yIHBsb3QpLCBhbmQgaGFuZGxlXG4gKiB6b29tLCBzdGFjayBuYXZpZ2F0aW9uLCBhbmQgcGl4ZWwgcmVhZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZW5kZXJlciB7XG4gIC8qKiBGZXRjaCB3aGF0IHtAbGluayBwbG90fSBuZWVkcyBmb3IgdGhpcyBpbWFnZS9zbGljZS4gYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlXG4gICAqICBob3N0IG5vIGxvbmdlciB3YW50cyB0aGUgcmVzdWx0IChhIG5ld2VyIGltYWdlLCBDYW5jZWwsIHRlYXJkb3duKTsgYSBiYWNrZW5kXG4gICAqICBtYXkgc3RvcCBpdHMgbmV0d29yayB3b3JrIHRoZW4uIE9wdGlvbmFsLCBhbmQgaWdub3JlZCBieSBiYWNrZW5kcyB0aGF0IGRvXG4gICAqICBub3Qgc3VwcG9ydCBpdCB5ZXQuICovXG4gIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPjtcbiAgLyoqIGBpbWFnZUxvYWRlZGAgaXMgdGhlIHtAbGluayBMb2FkZWRJbWFnZX0gaGFuZGxlIHJldHVybmVkIGJ5IGBsb2FkKClgIChvciBudWxsXG4gICAqICBmb3IgYSBkcmF3IHdpdGggbm8gaW1hZ2UpIOKAlCBwYXNzIGl0IHN0cmFpZ2h0IHRocm91Z2guIFJlc29sdmVzIGZhbHNlIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIGNvdWxkIG5vdCBkcmF3IChubyBwbG90IHRhcmdldCwgbm8gV2ViR1BVLCDigKYpLiAqL1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIHJlLXJlbmRlcjsgdGhlIE9TRCBiYWNrZW5kIG5vLW9wcyBpdC4gVGhlIGhvc3RcbiAgICogIHJlLWRyaXZlcyBgcGxvdCgpYCBmcm9tIGl0cyBpbWFnZSBzdHJlYW0gaW5zdGVhZC4gKi9cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKipcbiAgICogRml0IHRoZSB3aG9sZSBpbWFnZSAob3Igc2NlbmUpIGludG8gdGhlIHZpZXcg4oCUIGV2ZXJ5IGJhY2tlbmQgZG9lczogUGxvdGx5XG4gICAqIGF1dG9yYW5nZXMgaXRzIGF4ZXMsIE9wZW5TZWFkcmFnb24gZ29lcyBob21lLCBuYXBhcmktanMgZml0cyBpdHMgY2FtZXJhLiBUaGVcbiAgICogYmFja2VuZCB0aGVuIGVtaXRzIG9uIHtAbGluayBnZXRBdXRvc2NhbGVFdmVudH0uXG4gICAqL1xuICBmaXRUb1ZpZXcoKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSB2aWV3IHRvIHRoZSBpbWFnZSBleHRlbnQuIFNhbWUgaW50ZW50IGFzIHtAbGluayBmaXRUb1ZpZXd9OyBrZXB0IGZvclxuICAgKiAgY2FsbGVycyBvZiB0aGUgb3JpZ2luYWwgbmFtZS4gKi9cbiAgcmVzZXRBeGVzKCk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30g4oCUIHRoZSBzYW1lIG9wZXJhdGlvbiB1bmRlciBpdHMgYmFja2VuZC1uZXV0cmFsIG5hbWUuICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkO1xuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQ7XG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkO1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIC8qKiBDYW5jZWwgYW55IGluLWZsaWdodCBtdWx0aS1mcmFtZSBsb2FkaW5nICh2b2x1bWUtYXNzZW1ibHkgLyBzdXJmYWNlIHByZWxvYWQpIHNvIGl0IHN0b3BzXG4gICAqICBmZXRjaGluZyBtb3JlIGZyYW1lcyBhbmQgY2xlYXJzIHRoZSBsb2FkaW5nIHN0YXRlLiBPcHRpb25hbCDigJQgb25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBhXG4gICAqICB6LXN0YWNrIChuYXBhcmktanMgV2ViR1BVKSBkbyByZWFsIHdvcmsgaGVyZTsgb3RoZXJzIG5vLW9wLiAqL1xuICBjYW5jZWxMb2FkaW5nPygpOiB2b2lkO1xuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIG9mIHRoZSBvcmlnaW5hbCwgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHRoYXQgdGhlIHBpeGVscyByZXR1cm5lZFxuICAgKiBieSB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfSBjdXJyZW50bHkgY292ZXIg4oCUIGB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfWBcbiAgICogaW4gZnVsbC1pbWFnZSBwaXhlbCBjb29yZGluYXRlcy4gV2hlbiB6b29tZWQvcGFubmVkIGludG8gYSBzdWItYXJlYSB0aGlzIGlzXG4gICAqIHRoZSBjcm9wJ3Mgb3JpZ2luICsgZXh0ZW50OyB3aGVuIHpvb21lZCBvdXQvcGFubmVkIGJleW9uZCB0aGUgZWRnZXMsIHRoZVxuICAgKiByZWN0YW5nbGUgbWF5IGV4dGVuZCBvdXRzaWRlIHRoZSBpbWFnZSBib3VuZHMgKG1hdGNoaW5nIHRoZSBwaXhlbCByZWFkYmFja1xuICAgKiBjYW52YXMpLiBMZXRzIGEgY29uc3VtZXIgbWFwIGRpc3BsYXllZC1waXhlbCBjb29yZGluYXRlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAgKiBpbWFnZSB2aWEgYG9yaWdpbiArIGRpc3BsYXllZFB4ICogKGV4dGVudCAvIGRpc3BsYXllZERpbSlgLlxuICAgKlxuICAgKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSB2aWV3cG9ydCBpc24ndCBsYWlkIG91dCB5ZXQgb3IgdGhlIGJhY2tlbmQgY2FuJ3RcbiAgICogcmVwb3J0IGl0IOKAlCBjYWxsZXJzIHNob3VsZCB0aGVuIGZhbGwgYmFjayB0byB0aGUgZnVsbC1pbWFnZSBzY2FsZSAodHJlYXRcbiAgICogdGhlIGRpc3BsYXllZCBwaXhlbHMgYXMgYSBkb3duc2FtcGxlIG9mIHRoZSB3aG9sZSBpbWFnZSkuXG4gICAqL1xuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAgb24gYElWaXN1YWxpemVyYC4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlPyhzY2FsZTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAgb24gYElWaXN1YWxpemVyYCAodGhpcyByZXR1cm5zIDEgd2l0aG91dCBvbmUpLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGU/KCk6IG51bWJlcjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKClgIOKAlCAzRCBzY2VuZSBjb250cm9sc1xuICAgKiAgb25seSBleGlzdCBvbiBhIGJhY2tlbmQgdGhhdCByZW5kZXJzIDNEIHBsb3QgdHlwZXM7IHRoaXMgc2lsZW50bHkgbm8tb3BzIG9uIE9TRC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgIOKAlCBzZWUge0BsaW5rIHNldFN1cmZhY2VEcmFnTW9kZX0uICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3ICh7QGxpbmsgZml0VG9WaWV3fSkuICovXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj47XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgKGRyaXZlcyB0aGUgVUkgc2VsZWN0b3IpLiAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdO1xuXG4gIC8qKiBJbnRlbnNpdHkgYWxvbmcgdGhlIGxpbmUgUk9JczsgZW1pdHMgdGhlIGZ1bGwgc2V0IGFzIGFueSBsaW5lIGlzIGFkZGVkLFxuICAgKiAgbW92ZWQsIG9yIHJlbW92ZWQgKFBsb3RUeXBlLkxJTkUpLiBPbmUgZW50cnkgcGVyIGxpbmUgUk9JLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT47XG5cbiAgLyoqIFJlbmRlciB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgY2hhcnQgaW50byBgZGl2SWRgIGZyb20gdGhlXG4gICAqICBnaXZlbiBwcm9maWxlcyAob25lIHRyYWNlIHBlciBsaW5lIFJPSSwgY29sb3VyZWQgdG8gbWF0Y2ggaXRzIGxpbmUpLlxuICAgKiAgT3duZWQgYnkgdGhlIGJhY2tlbmQgc28gY29uc3VtZXJzIG5ldmVyIHJlYWNoIGEgY2hhcnRpbmcgbGlicmFyeSBkaXJlY3RseS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQ6IHN0cmluZywgcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQ7XG59XG5cbi8qKiBSZWdpb24vc2hhcGUgc3RhdGU6IENSVUQsIHNlbGVjdGlvbiwgY2xhc3NpZmljYXRpb24gY29sb3VycywgR2VvSlNPTiBJL08uICovXG5leHBvcnQgaW50ZXJmYWNlIElSZWdpb25TdG9yZSB7XG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG4gIC8qKiBGcmFtZXdvcmstbmV1dHJhbCBhY2Nlc3NvciDigJQgdGhlIGNhbm9uaWNhbCB3YXkgdG8gcmVhZCBjdXJyZW50IHJlZ2lvbnMuICovXG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW107XG4gIC8qKiBUaGUgY3VycmVudCByZWdpb25zIGFzIHBvbHlnb25zIChyZWN0YW5nbGVzIGV4cGFuZGVkKSwgZm9yIHNlcnZlciByZXF1ZXN0cy4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xuICAvKiogRW1pdHMgdGhlIHJlZ2lvbiBzZXQgd2hlbmV2ZXIgaXQgY2hhbmdlcy4gKi9cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT47XG5cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT47XG4gIC8qKiBTZWxlY3QgYSBzcGVjaWZpYyByZWdpb24gKGJ5IGlkZW50aXR5KSwgaGlnaGxpZ2h0aW5nIGl0IG9uIHdoaWNoZXZlclxuICAgKiAgYmFja2VuZCBpcyByZW5kZXJpbmcg4oCUIFBsb3RseSBzZXRzIGl0cyBhY3RpdmUtc2hhcGUgaGFuZGxlcywgT3BlblNlYWRyYWdvblxuICAgKiAgaGlnaGxpZ2h0cyB0aGUgU1ZHIGVsZW1lbnQuIE5vLW9wIGlmIHRoZSByZWdpb24gaXNuJ3QgaW4gdGhlIHN0b3JlLiAqL1xuICBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkO1xuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkO1xuXG4gIGdldFNob3dTaGFwZUxhYmVsKCk6IGJvb2xlYW47XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nO1xuICBnZXRGaWxsQ29sb3IoKTogc3RyaW5nO1xuICBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBSZXN0b3JlcyB0aGUgcmVnaW9uIHNldCB0b1xuICAgKiAgdGhlIHN0YXRlIGJlZm9yZSB0aGF0IGFjdGlvbjsgdXAgdG8gYSBzbWFsbCBmaXhlZCBkZXB0aCAoMTApIGlzIHJldGFpbmVkLFxuICAgKiAgc28gaXQgY2FuIGJlIGludm9rZWQgdXAgdG8gMTAgdGltZXMgaW4gYSByb3cuIE5vLW9wIHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvXG4gICAqICB1bmRvLiAqL1xuICB1bmRvKCk6IHZvaWQ7XG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbi4gTm8tb3Agd2hlbiB0aGVyZSdzXG4gICAqICBub3RoaW5nIHRvIHJlZG8gKGFueSBmcmVzaCByZWdpb24gYWN0aW9uIGNsZWFycyB0aGUgcmVkbyBmdXR1cmUpLiAqL1xuICByZWRvKCk6IHZvaWQ7XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5VbmRvJH0uICovXG4gIGNhblVuZG8oKTogYm9vbGVhbjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfS4gKi9cbiAgY2FuUmVkbygpOiBib29sZWFuO1xuICAvKiogRW1pdHMgd2hldGhlciBhbiB1bmRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBVbmRvIGJ1dHRvbidzIGVuYWJsZWQgKGdyZXllZC1vdXQpIHN0YXRlLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogRW1pdHMgd2hldGhlciBhIHJlZG8gc3RlcCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIOKAlCBkcml2ZXMgdGhlIHRvb2xiYXJcbiAgICogIFJlZG8gYnV0dG9uJ3MgZW5hYmxlZCAoZ3JleWVkLW91dCkgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBDbGVhciB0aGUgdW5kby9yZWRvIGhpc3RvcnkgKGUuZy4gb24gaW1hZ2UgbG9hZC9zd2l0Y2gpLiAqL1xuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQ7XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXTtcbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQ7XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmc7XG5cbiAgLyoqIEJlZ2luIGEgcGVyLXNsaWNlIHotc3RhY2sgcmVnaW9uIHNlc3Npb24gKGppdC11aSM5MykuIGBzbGljZXNgIG1hcHMgZWFjaFxuICAgKiAgemVyby1iYXNlZCBzbGljZSBpbmRleCB0byB0aGF0IHNsaWNlJ3MgcmVnaW9uczsgdGhlIHN0b3JlIHNob3dzIGBpbml0aWFsWmBcbiAgICogIGxpdmUgd2hpbGUgaG9sZGluZyB0aGUgcmVzdCwgc28gc2NydWJiaW5nIHN3YXBzIHJlZ2lvbiBzZXRzIGFuZCBlZGl0cyBvbiBhXG4gICAqICBzbGljZSBwZXJzaXN0LiBgc2F2ZUxheW91dGAgcmVjb3JkcyBob3cgdGhlIHN0YWNrIHBlcnNpc3RzIOKAlCBgY29tYmluZWRgXG4gICAqICAob25lIHotaW5kZXhlZCBnZW9qc29uLCBzaW5nbGUtZmlsZSB6LXN0YWNrKSBvciBgcGVyLXNsaWNlLWZpbGVgIChmb2xkZXJcbiAgICogIHN0YWNrKS4gU2VlIHtAbGluayBzZXREaXNwbGF5U2xpY2V9LCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfS4gKi9cbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkO1xuICAvKiogRW5kIHRoZSBwZXItc2xpY2Ugc2Vzc2lvbiAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZDtcbiAgLyoqIFRydWUgd2hpbGUgYSBwZXItc2xpY2Ugei1zdGFjayBzZXNzaW9uIGlzIGFjdGl2ZS4gKi9cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbjtcbiAgLyoqIEhvdyB0aGUgY3VycmVudCBzdGFjayBwZXJzaXN0cyB0byBkaXNrIChqaXQtdWkjOTMpLiAqL1xuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZSc7XG4gIC8qKiBTd2FwIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gc2xpY2UgYHpgIChzdGFjayBtb2RlIG9ubHkpLCBjYXB0dXJpbmcgdGhlXG4gICAqICBjdXJyZW50IHNsaWNlJ3MgZWRpdHMgZmlyc3QuIENhbGxlZCBvbiBldmVyeSBjb21taXR0ZWQgc2xpY2Ugc2NydWIuICovXG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkO1xuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIGZvciBzYXZlL2V4cG9ydCwgZWFjaCB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZFxuICAgKiAge0BsaW5rIFJlZ2lvbi56fTsgdGhlIGZsYXQgc2V0IG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdO1xuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBlYWNoXG4gICAqICBzbGljZSB3aXRoIHJlZ2lvbnMsIHBsdXMgc2xpY2VzIGNsZWFyZWQgc2luY2UgbG9hZCAoZW1wdHksIHRvIG92ZXJ3cml0ZSkuXG4gICAqICBLZXllZCBieSB6ZXJvLWJhc2VkIHNsaWNlIGluZGV4OyByZWdpb25zIHRhZ2dlZCB3aXRoIHRoZWlyIHouICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT47XG59XG5cbi8qKiBPbi1jYW52YXMgdG9vbCBtb2RlcyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94LCBTQU0gcG9pbnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVG9vbENvbnRyb2xsZXIge1xuICAvKipcbiAgICogQXJtIG9uZSBvbi1jYW52YXMgdG9vbCAoYENhbnZhc1Rvb2xJZGApIHdpdGggaXRzIG9wdGlvbnMg4oCUIHRoZSB3YW5kJ3NcbiAgICoge0BsaW5rIElXYW5kT3B0aW9uc30sIHRoZSBicnVzaCdzIHtAbGluayBJQnJ1c2hPcHRpb25zfSAoYHNpemVgIGlzIHRoZVxuICAgKiBtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIgb2YgdGhlIHBhaW50ZWQgZGlzYyksIHRoZSBlcmFzZXIncyBgeyByYWRpdXMgfWAg4oCUXG4gICAqIGFuZCBkaXNhcm0gdGhlIG9uZSB0aGF0IHdhcyBhcm1lZC4gYG51bGxgLCBvciBhbnkgaWQgdGhhdCBpcyBub3QgYSBjYW52YXNcbiAgICogdG9vbCAoYSByZWdpb24gZHJhdyBtb2RlIHN1Y2ggYXMgYCdkcmF3cmVjdCdgLCBgJ3BhbidgKSwgZGlzYXJtcyBvbmx5LlxuICAgKiBBcm1pbmcgdGhlIGFybWVkIHRvb2wgYWdhaW4gYXBwbGllcyB0aGUgb3B0aW9ucyBhbmQga2VlcHMgaXRzIHdvcmsgaW5cbiAgICogcHJvZ3Jlc3MuXG4gICAqL1xuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd3YW5kJywgb3B0aW9ucylgIC8gYHNldEFjdGl2ZVRvb2wobnVsbClgLiAqL1xuICBzZXRXYW5kTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnYnJ1c2gnLCBvcHRpb25zKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZDtcbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCdlcmFzZVZlcnRleCcsIHsgcmFkaXVzIH0pYCAvIGBzZXRBY3RpdmVUb29sKG51bGwpYC4gKi9cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd6b29tVG9Cb3gnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uOiBzZWdtZW50IGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24gaW50byBtYXNrcy5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXNrIHJlZ2lvbnMgYWRkZWQuIChqaXQtdWkjOTApICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENlbGxwb3NlLW9uLWNyb3A6IGNsaWVudCBzbGlkZS1jcm9wIGVhY2ggcmVjdGFuZ2xlIGFuZCBzZWdtZW50IGNlbGxzIGluIGl0XG4gICAqICAoY2VsbHBvc2UtU0FNIHZpYSB0aGUgaG9zdCdzIENFTExfU0VHTUVOVEVSKS4gUmV0dXJucyByZWdpb25zIGFkZGVkLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgaW50ZXJhY3RpdmUgU0FNIHBvaW50LXByb21wdCB0b29sIChjbGljayA9ICtwb2ludCwgU2hpZnQgPSAtKS5cbiAgICogIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnc2FtUG9pbnQnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogRmluYWxpc2UgLyBkaXNjYXJkIHRoZSBpbi1wcm9ncmVzcyBTQU0gcG9pbnQgb2JqZWN0LiAqL1xuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZDtcbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb250cm9scyBzcGVjaWZpYyB0byB0aGUgSVNPU1VSRkFDRSBwbG90IHR5cGUuIE9wdGlvbmFsIGFuZCBjYXBhYmlsaXR5LWdhdGVkXG4gKiAoYFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZWApOiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgaXNvc3VyZmFjZXMgZXhwb3Nlc1xuICogaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKClgLiBLZXB0IG9mZiB0aGUgYWx3YXlzLW9uXG4gKiBjb250cmFjdCBzbyBjb25zdW1lcnMgbmV2ZXIgY2FsbCBhIGNvbnRyb2wgdGhhdCdzIG1lYW5pbmdsZXNzIGZvciB0aGUgY3VycmVudFxuICogcGxvdCB0eXBlIC8gYmFja2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXNvc3VyZmFjZUNvbnRyb2xzIHtcbiAgLyoqIExpdmUtdXBkYXRlIHRoZSBpc29zdXJmYWNlIGludGVuc2l0eSBiYW5kIFtpc29taW4sIGlzb21heF0gb3ZlciAw4oCTMjU1LiAqL1xuICBzZXRJc29SYW5nZShpc29NaW46IG51bWJlciwgaXNvTWF4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSAzRCBwbG90IHR5cGVzIChTVVJGQUNFIC8gU0NBVFRFUjNEIC8gSVNPU1VSRkFDRVxuICogc2NlbmVzKS4gQ2FwYWJpbGl0eS1nYXRlZCBsaWtlIHtAbGluayBJSXNvc3VyZmFjZUNvbnRyb2xzfTogb25seSBhIGJhY2tlbmRcbiAqIHRoYXQgcmVuZGVycyAzRCBzY2VuZXMgZXhwb3NlcyBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRTdXJmYWNlM2RDb250cm9scygpYCDigJRcbiAqIHRoZSBkZXByZWNhdGVkIHRvcC1sZXZlbCBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYCBzaWxlbnRseVxuICogbm8tb3Agb24gMkQtb25seSBiYWNrZW5kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VyZmFjZTNkQ29udHJvbHMge1xuICAvKiogU3dpdGNoIHRoZSAzRCBzY2VuZSBpbnRlcmFjdGlvbiBtb2RlIChvcmJpdCAvIHR1cm50YWJsZSAvIHBhbiAvIHpvb20pLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSAzRCBzY2VuZSBjYW1lcmEgdG8gaXRzIGRlZmF1bHQgZXllIHBvc2l0aW9uLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gb24vb2ZmLiBPcHRpb25hbCDigJQgb25seSB0aGUgbmFwYXJpLWpzIFdlYkdQVVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2UgYmFja2VuZCByZW5kZXJzIG9uZSAoaml0LXVpIzEwMikuICovXG4gIHNldEF4ZXNWaXNpYmxlPyh2aXNpYmxlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIGF4ZXMgZ2l6bW8gaXMgY3VycmVudGx5IHNob3duIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiBPcHRpb25hbC4gKi9cbiAgYXhlc1Zpc2libGU/KCk6IGJvb2xlYW47XG4gIC8qKiBSZW5kZXIgdGhlIHN1cmZhY2UgYXMgYSB3aXJlZnJhbWUgKGVkZ2VzKSBpbnN0ZWFkIG9mIGEgZmlsbGVkIHN1cmZhY2UuIE9wdGlvbmFsIOKAlCBvbmx5IHRoZVxuICAgKiAgbmFwYXJpLWpzIFdlYkdQVSBzdXJmYWNlIGJhY2tlbmQgc3VwcG9ydHMgaXQgKGppdC11aSMxMDIpLiAqL1xuICBzZXRXaXJlZnJhbWU/KG9uOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIHN1cmZhY2UgaXMgY3VycmVudGx5IGRyYXduIGFzIGEgd2lyZWZyYW1lIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiAqL1xuICB3aXJlZnJhbWU/KCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIExJTkUgKGludGVuc2l0eS1wcm9maWxlKSBwbG90IHR5cGUuIENhcGFiaWxpdHktZ2F0ZWRcbiAqIGxpa2Uge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9OiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgdGhlIGxpbmUtUk9JIC9cbiAqIGluc2V0IGV4cG9zZXMgaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVuc2l0eUNvbnRyb2xzIHtcbiAgLyoqIEFkZCBhbm90aGVyIGxpbmUgUk9JIChuZXh0IGJyaWdodCBwYWxldHRlIGNvbG91cikgYW5kIGl0cyBpbnNldCB0cmFjZS5cbiAgICogIFJldHVybnMgdGhlIGNyZWF0ZWQgcmVnaW9uIHNvIHRoZSBjYWxsZXIgY2FuIHNlbGVjdCBpdCBvbiB0aGUgYWN0aXZlXG4gICAqICBiYWNrZW5kLCBvciBudWxsIGlmIG5vIGltYWdlIGV4dGVudCBpcyBrbm93biB5ZXQuICovXG4gIGFkZFByb2ZpbGVMaW5lKCk6IFJlZ2lvbiB8IG51bGw7XG59XG5cbi8qKiBBIGNhdGVnb3JpY2FsIGNvbHVtbiByZXNvbHZlZCBmb3IgY2hhcnRpbmc6IGxhYmVscywgY29kZXMgYW5kIG1hcCBjb2xvdXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsQ2F0ZWdvcmljYWxWaWV3IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcbiAgLyoqIGAjcnJnZ2JiYCBwZXIgY2F0ZWdvcnksIGluZGV4LWFsaWduZWQgd2l0aCB7QGxpbmsgY2F0ZWdvcmllc30uICovXG4gIGNvbG9yczogc3RyaW5nW107XG4gIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gIGNvZGVzOiBVaW50MTZBcnJheTtcbn1cblxuLyoqXG4gKiBIb3cgXCJTZWxlY3QgZnJvbSBST0lzXCIgc2VsZWN0czogaW5zaWRlIHRoZSB2b2x1bWVzIG9mIHRoZSByZWdpb24gY2xhc3NlcyBwaWNrZWRcbiAqIGluIHRoZSBSZWdpb24gRWRpdG9yIChTcGF0aWFsIG9taWNzIDNELCB0aGUgcmVnaW9ucyBvbiB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZVxuICogdm9sdW1lIHNob3duKSwgb3IgYnkgdGhlIGRyYXduIHJlZ2lvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFJvaVNlbGVjdGlvbk1vZGUgPSAnY2xhc3Mtdm9sdW1lcycgfCAncmVnaW9ucyc7XG5cbi8qKlxuICogQ29udHJvbHMgZm9yIHRoZSBTUEFUSUFMX09NSUNTIHBsb3QgdHlwZTogd2hhdCB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBhcmVcbiAqIGNvbG91cmVkIGJ5LCBhbmQgaG93IHRoZXkgYXJlIGRyYXduLiBDYXBhYmlsaXR5LWdhdGVkIGxpa2VcbiAqIHtAbGluayBJSXNvc3VyZmFjZUNvbnRyb2xzfSDigJQgYGdldFNwYXRpYWxDb250cm9scygpYCByZXR1cm5zIG51bGwgdW5sZXNzIGFcbiAqIGhvc3QgaGFzIGJvdW5kIGBTUEFUSUFMX0RBVEFfUE9SVGAuXG4gKlxuICogVGhlIHZpZXcgc3RhdGUgaXMgYmFja2VuZC1uZXV0cmFsIChpdCBsaXZlcyBpbiB0aGUgc2hhcmVkIHN0b3JlLCBsaWtlIHRoZVxuICogY29sb3JtYXApLCBzbyB0aGVzZSBjb250cm9scyB3b3JrIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3BhdGlhbENvbnRyb2xzIHtcbiAgLyoqIFRoZSBkYXRhc2V0IGJlaW5nIHZpc3VhbGl6ZWQsIG9yIG51bGwuIERyaXZlcyB0aGUgY29sdW1uL2dlbmUgcGlja2VycyBhbmRcbiAgICogIHRoZSBsZWdlbmQuICovXG4gIGdldERhdGFzZXQkKCk6IE9ic2VydmFibGU8U3BhdGlhbERhdGFzZXQgfCBudWxsPjtcbiAgLyoqIEN1cnJlbnQgZGlzcGxheSBzdGF0ZSAoY29sb3VyIHNvdXJjZSwgcG9pbnQgc2NhbGUsIG9wYWNpdHksIHNjYWxpbmcpLiAqL1xuICBnZXRWaWV3U3RhdGUkKCk6IE9ic2VydmFibGU8U3BhdGlhbFZpZXdTdGF0ZT47XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkLCBmb3Igc2VlZGluZyBhIGNvbnRyb2wncyBpbml0aWFsIHZhbHVlLiAqL1xuICB2aWV3U3RhdGUoKTogU3BhdGlhbFZpZXdTdGF0ZTtcbiAgLyoqIFBhdGNoIHRoZSBkaXNwbGF5IHN0YXRlOyB0aGUgbWFya2VycyByZWJ1aWxkIHdpdGhvdXQgcmVtb3VudGluZyB0aGUgc2NlbmUuICovXG4gIHNldFZpZXdTdGF0ZShwYXJ0aWFsOiBQYXJ0aWFsPFNwYXRpYWxWaWV3U3RhdGU+KTogdm9pZDtcbiAgLyoqIENvbG91ciBieSBhbiBhbm5vdGF0aW9uIGNvbHVtbi4gUmVqZWN0cyBmb3IgYW4gdW5rbm93biBjb2x1bW4uICovXG4gIGNvbG9yQnlDb2x1bW4obmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIENvbG91ciBieSBhIGdlbmU7IGl0cyB2ZWN0b3IgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuICovXG4gIGNvbG9yQnlGZWF0dXJlKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBDbGVhciB0aGUgY29sb3VyIHNvdXJjZSDigJQgZXZlcnkgb2JzZXJ2YXRpb24gcmVuZGVycyBpbiBvbmUgbmV1dHJhbCBjb2xvdXIuICovXG4gIGNsZWFyQ29sb3JCeSgpOiB2b2lkO1xuICAvKiogVHlwZWFoZWFkIG92ZXIgZmVhdHVyZSBuYW1lcywgZm9yIGRhdGFzZXRzIHRvbyB3aWRlIHRvIGlubGluZSB0aGUgbGlzdC4gKi9cbiAgc2VhcmNoRmVhdHVyZXMocXVlcnk6IHN0cmluZywgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgLyoqIFBlci1jYXRlZ29yeSBkaXNwbGF5IGNvbG91cnMgZm9yIGEgY2F0ZWdvcmljYWwgY29sdW1uLCBpbmRleC1hbGlnbmVkIHdpdGhcbiAgICogIGl0cyBgY2F0ZWdvcmllc2Ag4oCUIHRoZSBsZWdlbmQncyBzd2F0Y2hlcywgcmVzb2x2ZWQgdGhlIHNhbWUgd2F5IHRoZVxuICAgKiAgcmVuZGVyZXIgcmVzb2x2ZXMgdGhlbSBzbyB0aGUgdHdvIGNhbm5vdCBkaXNhZ3JlZS4gKi9cbiAgY2F0ZWdvcnlDb2xvcnMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT47XG5cbiAgLy8g4pSA4pSAIHZhbHVlcywgZm9yIHRoZSAxLUQgY2hhcnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKipcbiAgICogVGhlIHZhbHVlcyBiZWhpbmQgYSBjb2xvdXIgc291cmNlLCBpbmRleC1hbGlnbmVkIHdpdGggdGhlIG9ic2VydmF0aW9ucy5cbiAgICogUmVqZWN0cyBmb3IgYSBjYXRlZ29yaWNhbCBjb2x1bW4g4oCUIHRoZXJlIGlzIG5vdGhpbmcgY29udGludW91cyB0byBjaGFydC5cbiAgICovXG4gIGNvbnRpbnVvdXNWYWx1ZXMoc291cmNlOiBTcGF0aWFsQ29sb3JCeSk6IFByb21pc2U8RmxvYXQzMkFycmF5PjtcbiAgLyoqXG4gICAqIEEgY2F0ZWdvcmljYWwgY29sdW1uJ3MgY2F0ZWdvcmllcywgcGVyLW9ic2VydmF0aW9uIGNvZGVzIGFuZCBkaXNwbGF5XG4gICAqIGNvbG91cnMg4oCUIGV2ZXJ5dGhpbmcgYSBncm91cGVkIHZpb2xpbi9ib3ggbmVlZHMsIHdpdGggdGhlIGNvbG91cnMgcmVzb2x2ZWRcbiAgICogdGhlIHNhbWUgd2F5IHRoZSBtYXAgcmVzb2x2ZXMgdGhlbS5cbiAgICovXG4gIGNhdGVnb3JpY2FsVmlldyhjb2x1bW46IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbENhdGVnb3JpY2FsVmlldz47XG5cbiAgLyoqXG4gICAqIE9uZSBlbWJlZGRpbmcncyBjb29yZGluYXRlcyDigJQgYSBVTUFQLCB0LVNORSBvciBQQ0EgcGxhbmUgb3ZlciB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gICAqXG4gICAqIE9wdGlvbmFsLCBhbmQgYWJzZW50IHdoZW4gdGhlIGRhdGEgc291cmNlIHNlcnZlcyBub25lOiBgU3BhdGlhbERhdGFQb3J0LmdldEVtYmVkZGluZ2BcbiAgICogaXMgaXRzZWxmIG9wdGlvbmFsLCBzbyBhIHBhbmVsIG11c3QgYmUgYWJsZSB0byBhc2sgd2hldGhlciB0aGlzIGV4aXN0cyByYXRoZXIgdGhhblxuICAgKiBjYWxsaW5nIGl0IGFuZCBjYXRjaGluZy5cbiAgICovXG4gIGdldEVtYmVkZGluZz8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsRW1iZWRkaW5nPjtcbiAgLyoqIE5hbWVzIG9mIHRoZSBjYXRlZ29yaWNhbCBjb2x1bW5zIGF2YWlsYWJsZSB0byBncm91cCBieS4gKi9cbiAgY2F0ZWdvcmljYWxDb2x1bW5zKCk6IHN0cmluZ1tdO1xuICAvKipcbiAgICogSW1wb3J0IGEgY2VsbCBncm91cGluZyAoQ1NWL1RTViBvZiBgY2VsbF9pZGAsIGBncm91cGApIGFzIGEgbmV3IGNhdGVnb3JpY2FsIGNvbHVtbi5cbiAgICogT3B0aW9uYWw6IG9ubHkgZGF0YSBzb3VyY2VzIHRoYXQgY2FuIGpvaW4gY2VsbCBpZHMgaW1wbGVtZW50IGl0LlxuICAgKi9cbiAgaW1wb3J0R3JvdXBzPyhsYWJlbDogc3RyaW5nLCB0YWJsZTogc3RyaW5nKTogUHJvbWlzZTx7IGNvbHVtbjogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhOyBtYXRjaGVkOiBudW1iZXIgfT47XG4gIC8qKiBUcmFuc2NyaXB0IHRvdGFscyBwZXIgZ2VuZSDigJQgZm9yIHRoZSBwb2ludHMgZXN0aW1hdGUuIE9wdGlvbmFsLiAqL1xuICB0cmFuc2NyaXB0Q291bnRzPyhnZW5lczogc3RyaW5nW10pOiBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzPjtcbiAgLyoqIE1hcmtlciBnZW5lcyBvZiBlYWNoIGdyb3VwIG9mIGEgY2F0ZWdvcmljYWwgY29sdW1uLiBPcHRpb25hbCAoc2VlIHRoZSBwb3J0KS4gKi9cbiAgbWFya2VyR2VuZXM/KGNvbHVtbjogc3RyaW5nLCBwZXJHcm91cD86IG51bWJlcik6IFByb21pc2U8U3BhdGlhbE1hcmtlckdlbmVzPjtcbiAgLyoqIFRyYW5zY3JpcHRzIG9mIGVhY2ggc2VsZWN0ZWQgZ2VuZSBpbiB0aGUgY3VycmVudCB2aWV3LCBvciBudWxsIHdoZW4gbm90IGtub3duXG4gICAqICAoYWxsIGdlbmVzIGF0IG9uY2UsIHRyYW5zY3JpcHRzIG9mZiwgb3IgYSBzZWxlY3Rpb24gem9vbWVkIG91dCBvbiBhIGRhdGFzZXQgd2l0aG91dCB0aGVcbiAgICogIHB5cmFtaWQncyBwZXItZ2VuZSBsZXZlbHMsIHdoZXJlIGNsdXN0ZXJzIGFyZSBkcmF3biBmcm9tIHN1bW1lZCBkZW5zaXR5IGdyaWRzKS4gKi9cbiAgZ2V0R2VuZUNvdW50c0luVmlldyQ/KCk6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGw+O1xuICAvKiogRXN0aW1hdGVkIHRyYW5zY3JpcHRzIGluIHZpZXcgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYWdhaW5zdCB0aGUgbWFya2VyIGJ1ZGdldC4gKi9cbiAgZ2V0VHJhbnNjcmlwdEVzdGltYXRlJD8oKTogT2JzZXJ2YWJsZTx7IHBvaW50czogbnVtYmVyOyBtYXg6IG51bWJlciB9IHwgbnVsbD47XG4gIC8qKiBUaGUgZGVuc2l0eSBtYXAncyBjb2xvdXIgd2luZG93IGluIHVzZSAoYXV0by1kZXJpdmVkIG9yIHNldCkgYW5kIGl0cyBkZW5zZXN0IGJpbi4gKi9cbiAgZ2V0RGVuc2l0eVN0YXRzJD8oKTogT2JzZXJ2YWJsZTx7IGxvOiBudW1iZXI7IGhpOiBudW1iZXI7IG1heDogbnVtYmVyIH0gfCBudWxsPjtcbiAgLyoqIFRydWUgd2hpbGUgdGhlIG9ic2VydmF0aW9uIGdlbmUgZmlsdGVyIGNvdWxkIG5vdCBiZSBhcHBsaWVkIChhbiBleHByZXNzaW9uIHJlYWQgZmFpbGVkKTpcbiAgICogIHRoZSBvYnNlcnZhdGlvbnMgdGhlbiBzdGlsbCBzaG93IHRoZSBsYXN0IGZpbHRlciB0aGF0IGNvdWxkIGJlLiAqL1xuICBnZXRHZW5lRmlsdGVyRmFpbGVkJD8oKTogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFRoZSB6IHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgdGhlIGRhdGFzZXQgd2FzIGltYWdlZCBhdCwgYXNjZW5kaW5nIOKAlCBvclxuICAgKiBudWxsIHdoZW4gaXRzIHogaXMgY29udGludW91cyByYXRoZXIgdGhhbiBzZWN0aW9uZWQgKHNvIHRoZXJlIGFyZSBubyBzZWN0aW9uc1xuICAgKiB0byBvZmZlcikgb3Igd2hlbiB0aGVyZSBpcyBubyBkYXRhc2V0LlxuICAgKlxuICAgKiBMZXRzIGEgcGFuZWwgb2ZmZXIgXCJvbmUgc2VjdGlvbiBhdCBhIHRpbWVcIiBmb3IgdGhlIDNEIGNsb3VkIG9ubHkgd2hlcmUgdGhhdFxuICAgKiBtZWFucyBzb21ldGhpbmcsIGFuZCBsYWJlbCB0aGUgY2hvc2VuIG9uZS4gU2Nhbm5lZCBvbmNlIHBlciBkYXRhc2V0LlxuICAgKi9cbiAgc2FtcGxlZFNlY3Rpb25zKCk6IEZsb2F0MzJBcnJheSB8IG51bGw7XG5cbiAgLy8g4pSA4pSAIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqIFRoZSBjdXJyZW50IHNlbGVjdGlvbi4gRW1wdHkgbWVhbnMgXCJub3RoaW5nIHNlbGVjdGVkXCIsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAqICB3aG9sZSB0aXNzdWUgcmVuZGVycyBub3JtYWxseSByYXRoZXIgdGhhbiBldmVyeXRoaW5nIGJlaW5nIG11dGVkLiAqL1xuICBnZXRTZWxlY3Rpb24kKCk6IE9ic2VydmFibGU8U3BhdGlhbFNlbGVjdGlvbk1hc2s+O1xuICAvKipcbiAgICogU2VsZWN0IGV2ZXJ5IG9ic2VydmF0aW9uIGluc2lkZSB0aGUgY3VycmVudGx5LWRyYXduIHJlZ2lvbnMgKHRoZWlyIHVuaW9uKS5cbiAgICogUmV1c2VzIHRoZSBleGlzdGluZyBST0kgdG9vbHMg4oCUIHJlY3RhbmdsZSwgcG9seWdvbiwgZnJlZWhhbmQsIHdhbmQsIGJydXNoIOKAlFxuICAgKiBzbyB0aGVyZSBpcyBubyBzZXBhcmF0ZSBtYXJxdWVlIHRvIGxlYXJuLiBJbiB0aGUgM0QgY2xvdWQsIHRoZSByZWdpb24gY2xhc3Nlc1xuICAgKiBwaWNrZWQgaW4gdGhlIFJlZ2lvbiBFZGl0b3IgKHNlZSB7QGxpbmsgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyR9KSBzZWxlY3QgdGhlXG4gICAqIG9ic2VydmF0aW9ucyBpbnNpZGUgdGhlaXIgdm9sdW1lcyBpbnN0ZWFkLCB3aGVuIHRoZSByZWdpb25zIHNpdCBvbiB0aGVcbiAgICogZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWU7IHdpdGhvdXQgYSBwaWNrLCB0aGUgbGFzc29zIGRyYXduIG92ZXIgdGhlIGNsb3VkLlxuICAgKiBSZXNvbHZlcyBob3cgbWFueSB3ZXJlIHNlbGVjdGVkIOKAlCBvciBudWxsIHdoZW4gaXQgd2FzIHN1cGVyc2VkZWQgd2hpbGUgdGhlXG4gICAqIGNsYXNzZXMnIG91dGxpbmVzIHdlcmUgcmVhZCAoYSBuZXdlciBzZWxlY3Rpb24sIGEgQ2xlYXIsIGFub3RoZXIgZGF0YXNldCwgdmlld1xuICAgKiBvciBwaWNrKSwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIHdhcyBwdWJsaXNoZWQuXG4gICAqL1xuICBzZWxlY3RGcm9tUmVnaW9ucygpOiBQcm9taXNlPG51bWJlciB8IG51bGw+O1xuICAvKipcbiAgICogSG93IHtAbGluayBzZWxlY3RGcm9tUmVnaW9uc30gd291bGQgc2VsZWN0IG5vdzogaW5zaWRlIHRoZSBwaWNrZWQgY2xhc3NlcydcbiAgICogdm9sdW1lcywgb3IgYnkgdGhlIGRyYXduIHJlZ2lvbnMuIFRoZSBydWxlIGl0IHJ1bnMgYnksIHNvIGEgcGFuZWwgZGVzY3JpYmluZ1xuICAgKiB0aGUgYnV0dG9uIGNhbiBuZXZlciBkaXNhZ3JlZSB3aXRoIHdoYXQgaXQgZG9lcy5cbiAgICovXG4gIHJvaVNlbGVjdGlvbk1vZGU/KCk6IFJvaVNlbGVjdGlvbk1vZGU7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGNsYXNzZXMgdGhlIHJlZ2lvbiBzZWxlY3Rpb24gd2FzIHBpY2tlZCBhcyAoYSBjbGFzcyB0cmVlIG5vZGUgd2l0aFxuICAgKiBpdHMgc3ViY2xhc3NlcywgYSBzdXJmYWNlIGNsaWNrZWQgaW4gM0QpOyBbXSBmb3IgYW55IG90aGVyIHNlbGVjdGlvbi5cbiAgICovXG4gIGdldFBpY2tlZFJlZ2lvbkNsYXNzZXMkPygpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IHN0cmluZ1tdPjtcbiAgLyoqIFNlbGVjdCBldmVyeSBvYnNlcnZhdGlvbiBpbiBvbmUgY2F0ZWdvcnkgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW4g4oCUIHRoZVxuICAgKiAgbGVnZW5kIGNsaWNrLiBSZWplY3RzIGZvciBhbiB1bmtub3duIG9yIGNvbnRpbnVvdXMgY29sdW1uLiAqL1xuICBzZWxlY3RDYXRlZ29yeShjb2x1bW46IHN0cmluZywgY2F0ZWdvcnlJbmRleDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gZXhwbGljaXQgc2V0IG9mIG9ic2VydmF0aW9ucywgcmVwbGFjaW5nIGFueSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICpcbiAgICogRm9yIGEgbGlua2VkIHBsb3Q6IGxhc3NvaW5nIHBvaW50cyBpbiBhbiBlbWJlZGRpbmcgaXMgYSBzZWxlY3Rpb24gT0Ygb2JzZXJ2YXRpb25zLFxuICAgKiBhbmQgZXZlcnkgb3RoZXIgdmlldyDigJQgdGhlIG1hcCwgdGhlIGRpc3RyaWJ1dGlvbnMg4oCUIHJlYWRzIHRoZSBzYW1lIG1hc2ssIHNvIGJydXNoaW5nXG4gICAqIG9uZSBsaWdodHMgdXAgdGhlIHJlc3QuIFJldHVybnMgaG93IG1hbnkgd2VyZSBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdEluZGljZXMoaW5kaWNlczogSXRlcmFibGU8bnVtYmVyPik6IG51bWJlcjtcbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZDtcbn1cblxuLyoqIERpc3BsYXkgb3B0aW9ucyAoY29sb3JtYXAvTFVULCByZXZlcnNlIHNjYWxlLCBpbWFnZSBtZXRhZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5T3B0aW9ucyB7XG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD47XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBDb2xvcm1hcE5vZGUpOiB2b2lkO1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW107XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBQdWJsaXNoIHRoZSBjdXJyZW50IGltYWdlJ3MgbWV0YWRhdGEuIGBpbWFnZUtleWAgKGl0cyBmaWxlIG5hbWUpIGxldHMgdGhlXG4gICAqICBjaGFubmVsIHN0YXRlIHN1cnZpdmUgYSByZS1wbG90IG9mIHRoZSBzYW1lIGltYWdlIGJ1dCBub3QgYSBzd2l0Y2ggdG8gYW5vdGhlci4gKi9cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkO1xuICBnZXRJbWFnZU1ldGEoKTogT2JzZXJ2YWJsZTxJSW1hZ2VNZXRhZGF0YVtdPjtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBpbnRlbnNpdHkgc2FtcGxpbmcgYSByZW5kZXJpbmcgYmFja2VuZCBvd25zOiB3aGVyZSBpdHMgdmlldyBzZXR0bGVkLlxuICogV2hhdCBgSVZpZXdlckJhY2tlbmQuZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKWAgcmV0dXJucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2Uge1xuICAvKiogVmlzaWJsZS1yZWdpb24gY2hhbmdlcyAoaW1hZ2UtcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IHNldHRsZXMsXG4gICAqICBzbyB0aGUgaW5zZXQgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZyAodGhlIGxpbmUgUk9JcycgaW5zZXQpLCBmcm9tIGBJVmlzdWFsaXplci5nZXRJbnRlbnNpdHlTYW1wbGluZygpYC5cbiAqIFRoZSBzYW1wbGluZyBpdHNlbGYgaXMgYmFja2VuZC1uZXV0cmFsICh0aGUgbGlicmFyeSdzIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlXG4gKiBzYW1wbGVzIHdoYXRldmVyIGltYWdlIGlzIG9uIHNjcmVlbik7IHRoZSB2aWV3cG9ydC1jaGFuZ2Ugc2lnbmFsIGNvbWVzIGZyb20gdGhlXG4gKiBiYWNrZW5kIHRoYXQgZHJhd3MgdGhlIGltYWdlIChPcGVuU2VhZHJhZ29uIGFuZCBuYXBhcmktanMgcmVwb3J0IGl0OyBQbG90bHlcbiAqIHJlLXNhbXBsZXMgaXRzIGhpZ2gtZGVmIHpvb20gY3JvcHMgaW5saW5lIGluc3RlYWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJbnRlbnNpdHlTYW1wbGluZyBleHRlbmRzIElJbnRlbnNpdHlWaWV3cG9ydFNvdXJjZSB7XG4gIC8qKiBMb2FkIHRoZSBjdXJyZW50IGltYWdlL3NsaWNlJ3MgcGl4ZWxzIHNvIHRoZSBsaW5lLVJPSSBwcm9maWxlcyBoYXZlIGRhdGFcbiAgICogIChhIGJhY2tlbmQgd2l0aCBubyBmcmFtZXMgb2YgaXRzIG93bjogT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzKS4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZS1zYW1wbGUgdGhlIHByb2ZpbGVzIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBnaXZlbiBpbWFnZS1waXhlbCBST0kgYXRcbiAgICogIGRpc3BsYXkgcmVzb2x1dGlvbi4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSAyRCB2aWV3IG9wdGlvbnMgb2YgYSB0aWxlZCBpbWFnZSB2aWV3ZXI6IHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgYW5kIGltYWdlXG4gKiBzbW9vdGhpbmcuIE9wZW5TZWFkcmFnb24ncywgbWlycm9yZWQgYnkgbmFwYXJpLWpzJ3MgMkQgdmlld3M7IFBsb3RseSBoYXMgbmVpdGhlci5cbiAqIENhcGFiaWxpdHktZ2F0ZWQ6IGBJVmlld2VyQmFja2VuZC5nZXRPc2RWaWV3T3B0aW9ucygpYCBpcyBudWxsIG9uIGEgYmFja2VuZFxuICogd2l0aG91dCB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElPc2RWaWV3T3B0aW9ucyB7XG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAodGhlIG1pbmltYXApLiBBcHBsaWVkIHdoZW4gdGhlIHZpZXdlciBpc1xuICAgKiAgKHJlKWNyZWF0ZWQsIGFuZCB0b2dnbGVkIGxpdmUgd2hlbiBvbmUgaXMgYWxyZWFkeSBtb3VudGVkLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKS4gYGZhbHNlYCA9IG5lYXJlc3QtbmVpZ2hib3VyLCBzb1xuICAgKiAgem9vbWluZyBwYXN0IDE6MSBzaG93cyBjcmlzcCBwaXhlbCBibG9ja3MgKHBpeGVsLWxldmVsIGluc3BlY3Rpb24pLiBBcHBsaWVkXG4gICAqICBhdCB2aWV3ZXIgY3JlYXRpb24gYW5kIGxpdmUgKHdpdGggYSByZWRyYXcpIHdoZW4gb25lIGlzIG1vdW50ZWQuICovXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIGEgdm9sdW1lIHJlbmRlcmVyIChuYXBhcmktanMgV2ViR1BVKTogMSA9IGZ1bGxcbiAqIHJlc29sdXRpb24g4oCmIDggPSDihZsgcGVyIGF4aXMuIENhcGFiaWxpdHktZ2F0ZWQ6IG51bGwgb24gYSBiYWNrZW5kIHdpdGhvdXQgb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElWb2x1bWVSZXNvbHV0aW9uIHtcbiAgLyoqIFRoZSBjdXJyZW50IGZhY3RvciAodG8gaW5pdGlhbGl6ZSB0aGUgUmVzb2x1dGlvbiBjb250cm9sKS4gKi9cbiAgZ2V0KCk6IG51bWJlcjtcbiAgLyoqIFNldCB0aGUgZmFjdG9yIChyb3VuZGVkLCBhdCBsZWFzdCAxKS4gVGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IChyZSlsb2FkIOKAlFxuICAgKiAgdGhlIGhvc3QgcmUtcGxvdHMgYWZ0ZXIgY2FsbGluZyBpdCwgc2luY2UgaXQgY2hhbmdlcyB0aGUgZmV0Y2hlZCBkYXRhLiAqL1xuICBzZXQoc2NhbGU6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGhvc3QtZmFjaW5nIGNvbXBvc2l0ZSBjb250cmFjdCwgaW1wbGVtZW50ZWQgYnkgdGhlIHJvdXRlciAoYFZJU1VBTElaRVJgKS4gQVxuICogcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyB7QGxpbmsgSVZpZXdlckJhY2tlbmR9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXJcbiAgZXh0ZW5kcyBJRGF0YVJlbmRlcmVyLCBJUmVnaW9uU3RvcmUsIElUb29sQ29udHJvbGxlciwgSURpc3BsYXlPcHRpb25zLCBJSW50ZW5zaXR5U2FtcGxpbmcge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gTWF5IGJlIG51bGwgdW50aWwgYSBwbG90IGlzIG1vdW50ZWRcbiAgICogIChPcGVuU2VhZHJhZ29uKS4gRHJpdmVzIHJlZ2lvbiBkcmF3L3NlbGVjdCBtb2RlcyB1bmlmb3JtbHkuICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsO1xuICAvKiogU3BsaXQgYSB2b2x1bWUgdmlldzogdGhlIGRpc3BsYXllZCBzbGljZSwgd2l0aCBldmVyeSByZWdpb24gdG9vbCwgaW4gdGhlIGRpdiBgZGl2YCBiZXNpZGVcbiAgICogIHRoZSAzRCB2aWV3OyBudWxsIGNsb3NlcyBpdC4gUmVzb2x2ZXMgd2hldGhlciB0aGUgc2xpY2Ugc2hvd3MuIE9wdGlvbmFsOiB0aGUgcm91dGVyJ3MuICovXG4gIHNldFNsaWNlRWRpdG9yPyhkaXY6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogVGhlIHNsaWNlIGVkaXRvcidzIHNlY3Rpb25zIHRocm91Z2ggeCBhbmQgeSAobnVsbHMgd2hpbGUgaXQgaXMgY2xvc2VkKS4gT3B0aW9uYWw6IHRoZSByb3V0ZXIncy4gKi9cbiAgZ2V0U2VjdGlvblZpZXdzJD8oKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+O1xuICAvKiogTW92ZSB0aGUgc2xpY2UgZWRpdG9yJ3Mgc2VjdGlvbiBwbGFuZSB0aHJvdWdoIGBheGlzYCB0byBgYXRgIChpbWFnZSBweCkuICovXG4gIHNldFNlY3Rpb25QbGFuZT8oYXhpczogU2VjdGlvbkF4aXMsIGF0OiBudW1iZXIpOiB2b2lkO1xuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lICh0aGUgaG9zdCBzaG93cyBpdCkuICovXG4gIGdldFNsaWNlRHJhZyQ/KCk6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqIElzb3N1cmZhY2UgY29udHJvbHMgd2hlbiB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlYCxcbiAgICogIGVsc2UgbnVsbCDigJQgc28gY29uc3VtZXJzIGdhdGUgb24gdGhlIHJldHVybmVkIG9iamVjdCwgbm90IGEgbm8tb3AgbWV0aG9kLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGw7XG4gIC8qKiBJbnRlbnNpdHkgKGxpbmUtUk9JKSBjb250cm9scyB3aGVuIHRoZSBiYWNrZW5kIHJlbmRlcnMgdGhlIExJTkUgcGxvdCB0eXBlLFxuICAgKiAgZWxzZSBudWxsLiAqL1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsO1xuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgd2hlbiB0aGlzIGJhY2tlbmQgcmVuZGVycyAzRCBwbG90IHR5cGVzLCBlbHNlIG51bGwg4oCUXG4gICAqICB0aGUgY2FwYWJpbGl0eS1nYXRlZCByZXBsYWNlbWVudCBmb3IgdGhlIGRlcHJlY2F0ZWQgdG9wLWxldmVsXG4gICAqICBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYC4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIFRoZSBuYXZpZ2F0b3IgLyBpbWFnZS1zbW9vdGhpbmcgb3B0aW9ucy4gTmV2ZXIgbnVsbCBvbiB0aGUgcm91dGVyOiBhIHNldHRpbmdcbiAgICogIGFwcGxpZXMgdG8gZXZlcnkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBzbyBpdCBjYW5cbiAgICogIGJlIHNldCBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlciBhbmQgc3Vydml2ZXMgYSBiYWNrZW5kIHN3aXRjaC4gKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zO1xuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlbiBpdCBoYXMgbm9uZVxuICAgKiAgKG9ubHkgbmFwYXJpLWpzIHJlbmRlcnMgdm9sdW1lcykuICovXG4gIGdldFZvbHVtZVJlc29sdXRpb24oKTogSVZvbHVtZVJlc29sdXRpb24gfCBudWxsO1xuICAvKiogSW50ZW5zaXR5LXByb2ZpbGUgc2FtcGxpbmcsIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbi4gKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koKWAuICovXG4gIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5nZXRWaWV3cG9ydENoYW5nZSQoKWAuICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+O1xuICAvKiogU3BhdGlhbC1vbWljcyBjb250cm9scyB3aGVuIGEgYFNQQVRJQUxfREFUQV9QT1JUYCBpcyBib3VuZCwgZWxzZSBudWxsLlxuICAgKiAgT3B0aW9uYWw6IG9ubHkgdGhlIHJvdXRpbmcgc2VydmljZSBpbXBsZW1lbnRzIGl0LCBzaW5jZSB0aGUgc3RhdGUgaXMgc2hhcmVkXG4gICAqICByYXRoZXIgdGhhbiBvd25lZCBieSBhbnkgb25lIGJhY2tlbmQuICovXG4gIGdldFNwYXRpYWxDb250cm9scz8oKTogSVNwYXRpYWxDb250cm9scyB8IG51bGw7XG4gIC8qKiBUaGUgdmlld3BvcnQgYSBjb250cmlidXRlZCBwbG90IG1vZGUgZHJhd3Mgb3Zlciwgd2hlbiB0aGUgYmFja2VuZCBvblxuICAgKiAgc2NyZWVuIGNhbiBwcm92aWRlIG9uZSAoT3BlblNlYWRyYWdvbiksIGVsc2UgbnVsbC4gT3B0aW9uYWw6IGJhY2tlbmRzIHRoYXRcbiAgICogIG5vIGNvbnRyaWJ1dGVkIG1vZGUgcmlkZXMgb24gbmVlZCBub3QgaW1wbGVtZW50IGl0LiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0PygpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbDtcbiAgLyoqIEJpbm5lZCBpbnRlbnNpdHkgaGlzdG9ncmFtIGZvciBhIGNoYW5uZWwgZnJvbSB0aGUgY3VycmVudGx5LWRpc3BsYXllZFxuICAgKiAgcGl4ZWxzLCBvciBudWxsIHdoZW4gbm9uZSBhcmUgYXZhaWxhYmxlLiBGZWVkcyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW1cbiAgICogIHBhbmUuICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGw7XG4gIC8qKiBBc3luYyBoaXN0b2dyYW0gc3RyZWFtIOKAlCBuYXRpdmUgYml0IGRlcHRoIGZvciA+OC1iaXQgaW1hZ2VzIChzZXJ2ZXIpLCBlbHNlXG4gICAqICB0aGUgOC1iaXQgY2xpZW50IGhpc3RvZ3JhbS4gKi9cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD47XG4gIC8qKiBFeHBvcnQgdGhlIGRpc3BsYXllZCBpbWFnZSwgY29tcG9zaXRlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXkgc2V0dGluZ3MsXG4gICAqICBhcyBhIHB1YmxpY2F0aW9uLXJlYWR5IFBORyBkb3dubG9hZC4gKi9cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQ7XG4gIC8qKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgaW1hZ2UgZGF0YSBhcyBhIGRhdGEtcHJlc2VydmluZyBtdWx0aS1iYW5kIFRJRkZcbiAgICogIChuYXRpdmUgYml0IGRlcHRoKS4gTm8tb3Agb24gYmFja2VuZHMgdGhhdCBjYW4ndCBwcm92aWRlIGl0LiAqL1xuICBleHBvcnREYXRhKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgdmlldyBpcyBnb2luZyBhd2F5ICh0aGUgYDx2aXN1YWxpemVyPmAgaXMgZGVzdHJveWVkKTogZHJvcCB3aGF0IGlzIGJvdW5kIHRvXG4gICAqIGl0IOKAlCB0aGUgb24tc2NyZWVuIHZpZXdlciwgaXRzIHJlbmRlciBsb29wIGFuZCB2aWV3IHN1YnNjcmlwdGlvbnMg4oCUIHNvIG5vdGhpbmdcbiAgICogb3V0bGl2ZXMgdGhlIHZpZXcuIFNlcnZpY2UtbGlmZXRpbWUgc3RhdGUgKHN0b3JlcywgdGhlIGJhY2tlbmRzJyBvd24gc3RvcmVcbiAgICogc3Vic2NyaXB0aW9ucykgaXMgdW50b3VjaGVkLCBzbyBhIGxhdGVyIHZpZXcgb24gdGhlIHNhbWUgY2hhaW4gcmVuZGVycyBub3JtYWxseS5cbiAgICovXG4gIGRldGFjaCgpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBkZXRhY2h9LCB3aGljaCB0aGlzIGRlbGVnYXRlcyB0by4gKi9cbiAgdW5zdWJzY3JpYmUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBXaGF0IGEgcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyAoUGxvdGx5LCBPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpOiByZW5kZXJpbmcsXG4gKiB0aGUgdmlld3BvcnQsIHBpeGVsIHJlYWRiYWNrLCBleHBvcnQsIGxvYWRpbmcgc3RhdGUgYW5kIGl0cyBvbi1jYW52YXMgdG9vbHMsIHBsdXNcbiAqIGNhcGFiaWxpdHktZ2F0ZWQgZ2V0dGVycyBmb3Igd2hhdCBvbmx5IHNvbWUgYmFja2VuZHMgaGF2ZS5cbiAqXG4gKiBJdCBpcyB0aGUgYmFja2VuZC1mYWNpbmcgaGFsZiBvZiB7QGxpbmsgSVZpc3VhbGl6ZXJ9LiBSZWdpb24gYW5kIGRpc3BsYXkgc3RhdGUgYXJlXG4gKiBub3QgaGVyZTogdGhleSBsaXZlIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCAvIGBWaXN1YWxpemVyU3RvcmVgLCB3aGljaCB0aGUgcm91dGVyXG4gKiBzZXJ2ZXMgdG8gaG9zdHMgZGlyZWN0bHk7IGEgYmFja2VuZCBkcmF3cyB0aGVtIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBzdG9yZXMnIGV2ZW50cy5cbiAqIEhvc3RzIGtlZXAgZGVwZW5kaW5nIG9uIGBJVmlzdWFsaXplcmAgKHRoZSByb3V0ZXIncyBjb21wb3NpdGUpLCBuZXZlciBvbiBhIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZXdlckJhY2tlbmQgZXh0ZW5kcyBJVG9vbENvbnRyb2xsZXIge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcblxuICAvLyDilIDilIAgcmVuZGVyIGxpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TG9hZGVkSW1hZ2U+O1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogVGhlIHZpZXcgaXMgZ29pbmcgYXdheTogcmVsZWFzZSB3aGF0IGlzIGJvdW5kIHRvIGl0LiAqL1xuICBkZXRhY2goKTogdm9pZDtcbiAgLyoqIFN0b3Agc3RyZWFtaW5nIGZyYW1lcyAodm9sdW1lIGFzc2VtYmx5IC8gc3VyZmFjZSBwcmVsb2FkKS4gT3B0aW9uYWw6IG9ubHlcbiAgICogIGJhY2tlbmRzIHRoYXQgc3RyZWFtIGEgei1zdGFjayBkbyB3b3JrIGhlcmUuICovXG4gIGNhbmNlbExvYWRpbmc/KCk6IHZvaWQ7XG5cbiAgLy8g4pSA4pSAIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIGZpdFRvVmlldygpOiB2b2lkO1xuICAvKiogQHNlZSBJRGF0YVJlbmRlcmVyLnJlc2V0QXhlcyAqL1xuICByZXNldEF4ZXMoKTogdm9pZDtcbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3LiAqL1xuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHVua25vd24+O1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgLy8g4pSA4pSAIHBpeGVscywgaGlzdG9ncmFtLCBleHBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGw7XG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGw7XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+O1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkO1xuICBleHBvcnREYXRhKCk6IHZvaWQ7XG5cbiAgLy8g4pSA4pSAIGNhcGFiaWxpdHktZ2F0ZWQgc3VyZmFjZXMgKG51bGwgLyBhYnNlbnQgd2hlcmUgdGhlIGJhY2tlbmQgbGFja3MgdGhlIGZlYXR1cmUpIOKUgOKUgFxuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHwgbnVsbDtcbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsO1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsO1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsO1xuICBnZXRQbG90TW9kZVZpZXdwb3J0PygpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbDtcbiAgLyoqIE5hdmlnYXRvciAvIGltYWdlIHNtb290aGluZywgb3IgbnVsbCB3aGVuIHRoZSBiYWNrZW5kIGhhcyBuZWl0aGVyIChQbG90bHkpLiAqL1xuICBnZXRPc2RWaWV3T3B0aW9ucygpOiBJT3NkVmlld09wdGlvbnMgfCBudWxsO1xuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3Rvciwgb3IgbnVsbCB3aGVuIHRoZSBiYWNrZW5kIHJlbmRlcnMgbm8gdm9sdW1lcy4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGw7XG4gIC8qKiBXaGVyZSB0aGUgdmlldyBzZXR0bGVkLCBmb3IgdGhlIGludGVuc2l0eSBpbnNldCdzIHJlLXNhbXBsaW5nOyBudWxsIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIHJlLXNhbXBsZXMgb24gaXRzIG93biAoUGxvdGx5J3MgaGlnaC1kZWYgem9vbSkuIFRoZSBzYW1wbGluZyBpdHNlbGYgaXNcbiAgICogIHRoZSByb3V0ZXIncyAoSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UpLiAqL1xuICBnZXRJbnRlbnNpdHlTYW1wbGluZygpOiBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2UgfCBudWxsO1xufVxuXG4vKipcbiAqIFdoYXQgYSBtb3VudGVkIGA8dmlzdWFsaXplcj5gIGhhbmRzIGl0cyBob3N0IHRocm91Z2hcbiAqIGBJbWFnZVN0YXRlUG9ydC5zZXREaWFncmFtKClgIOKAlCBhIHNtYWxsLCB0eXBlZCBzdXJmYWNlIHJhdGhlciB0aGFuIHRoZSBjb21wb25lbnRcbiAqIGl0c2VsZiwgd2hvc2UgZXZlcnkgcHVibGljIG1lbWJlciB3b3VsZCBvdGhlcndpc2UgYmUgZGUtZmFjdG8gQVBJLiBDbGVhcmVkXG4gKiAoYHNldERpYWdyYW0obnVsbClgKSB3aGVuIHRoZSB2aXN1YWxpemVyIGlzIGRlc3Ryb3llZC4gSG9zdHMgdGhhdCBjYW4gaW5qZWN0XG4gKiB7QGxpbmsgVklTVUFMSVpFUn0gLyBgUkVHSU9OX0VESVRPUl9BUElgIGRpcmVjdGx5IG5lZWQgbm90IHVzZSBpdCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlzdWFsaXplckhhbmRsZSB7XG4gIC8qKiBUaGUgdmlzdWFsaXplciBjaGFpbiB0aGlzIGA8dmlzdWFsaXplcj5gIHJlbmRlcnMgdGhyb3VnaC4gKi9cbiAgcmVhZG9ubHkgdmlzdWFsaXplcjogSVZpc3VhbGl6ZXI7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHZpc3VhbGl6ZXJ9LiBLZXB0IGZvciBob3N0cyB0aGF0IHJlYWQgdGhlIGNvbXBvbmVudCdzXG4gICAqICBmb3JtZXIgYHBsb3RTZXJ2aWNlYCBmaWVsZCBvZmYgdGhlIHJlZ2lzdGVyZWQgb2JqZWN0LiAqL1xuICByZWFkb25seSBwbG90U2VydmljZTogSVZpc3VhbGl6ZXI7XG4gIC8qKiBXaGV0aGVyIGFueSByZWdpb24gKGFubm90YXRpb24gb3IgaW50ZW5zaXR5IGxpbmUpIGV4aXN0cyBvbiB0aGUgY3VycmVudCBpbWFnZS4gKi9cbiAgaGFzUmVnaW9ucygpOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgcmVnaW9ucyBhcyBwb2x5Z29ucywgZm9yIGEgc2VydmVyIHJlcXVlc3QgKGNyb3AgLyBwcm9jZXNzaW5nKS4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xufVxuXG4vKipcbiAqIERJIHRva2VuIGZvciB0aGUgYWN0aXZlIHZpc3VhbGl6YXRpb24gYmFja2VuZC4gQmluZCBpdCAoYHVzZUV4aXN0aW5nYCkgdG8gdGhlXG4gKiBgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlYCwgd2hpY2ggc2VsZWN0cyBQbG90bHkgdnMgT3BlblNlYWRyYWdvbiBwZXIgcGxvdFxuICogdHlwZS4gQ29uc3VtZXJzIOKAlCBpbmNsdWRpbmcgdGhpcyBsaWJyYXJ5J3Mgb3duIGBWaXN1YWxpemVyQ29tcG9uZW50YCDigJRcbiAqIGluamVjdCBgSVZpc3VhbGl6ZXJgIHRocm91Z2ggdGhpcyB0b2tlbiByYXRoZXIgdGhhbiB0aGUgY29uY3JldGUgcm91dGVyLCBzb1xuICogdGhlIHJvdXRpbmcvZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gY2FuIGNoYW5nZSB3aXRob3V0IHRvdWNoaW5nIGNvbnN0cnVjdG9ycy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZJU1VBTElaRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48SVZpc3VhbGl6ZXI+KCdWSVNVQUxJWkVSJyk7XG4iXX0=