igniteui-angular 18.2.6 → 18.2.8

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 (76) hide show
  1. package/esm2022/lib/carousel/carousel.component.mjs +10 -6
  2. package/esm2022/lib/checkbox/checkbox.component.mjs +30 -20
  3. package/esm2022/lib/core/utils.mjs +8 -2
  4. package/esm2022/lib/directives/drag-drop/drag-drop.directive.mjs +28 -26
  5. package/esm2022/lib/grids/filtering/base/grid-filtering-cell.component.mjs +4 -4
  6. package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +3 -3
  7. package/esm2022/lib/grids/grid-base.directive.mjs +2 -2
  8. package/esm2022/lib/grids/hierarchical-grid/row-island.component.mjs +3 -3
  9. package/esm2022/lib/grids/moving/moving.drag.directive.mjs +3 -3
  10. package/esm2022/lib/grids/selection/selection.service.mjs +4 -4
  11. package/esm2022/lib/icon/icon.component.mjs +4 -7
  12. package/esm2022/lib/icon/icon.service.mjs +39 -11
  13. package/esm2022/lib/icon/types.mjs +1 -1
  14. package/esm2022/lib/input-group/input-group.component.mjs +29 -21
  15. package/esm2022/lib/services/excel/worksheet-data-dictionary.mjs +2 -2
  16. package/esm2022/lib/services/exporter-common/export-utilities.mjs +5 -4
  17. package/esm2022/lib/services/public_api.mjs +2 -1
  18. package/esm2022/lib/services/theme/theme.token.mjs +39 -0
  19. package/fesm2022/igniteui-angular.mjs +181 -137
  20. package/fesm2022/igniteui-angular.mjs.map +1 -1
  21. package/lib/carousel/carousel.component.d.ts +2 -1
  22. package/lib/checkbox/checkbox.component.d.ts +4 -5
  23. package/lib/core/styles/components/avatar/_avatar-theme.scss +1 -31
  24. package/lib/core/styles/components/card/_card-theme.scss +1 -1
  25. package/lib/core/styles/components/combo/_combo-theme.scss +22 -8
  26. package/lib/core/styles/components/input/_input-group-theme.scss +5 -2
  27. package/lib/core/styles/themes/presets/igniteui-angular-dark.scss +8 -2
  28. package/lib/core/styles/themes/presets/igniteui-angular.scss +8 -2
  29. package/lib/core/styles/themes/presets/igniteui-bootstrap-dark.scss +8 -2
  30. package/lib/core/styles/themes/presets/igniteui-bootstrap-light.scss +8 -2
  31. package/lib/core/styles/themes/presets/igniteui-dark-green.scss +8 -2
  32. package/lib/core/styles/themes/presets/igniteui-fluent-dark-excel.scss +8 -2
  33. package/lib/core/styles/themes/presets/igniteui-fluent-dark-word.scss +8 -2
  34. package/lib/core/styles/themes/presets/igniteui-fluent-dark.scss +8 -2
  35. package/lib/core/styles/themes/presets/igniteui-fluent-light-excel.scss +8 -2
  36. package/lib/core/styles/themes/presets/igniteui-fluent-light-word.scss +8 -2
  37. package/lib/core/styles/themes/presets/igniteui-fluent-light.scss +8 -2
  38. package/lib/core/styles/themes/presets/igniteui-indigo-dark.scss +8 -2
  39. package/lib/core/styles/themes/presets/igniteui-indigo-light.scss +8 -2
  40. package/lib/core/utils.d.ts +2 -0
  41. package/lib/directives/drag-drop/drag-drop.directive.d.ts +1 -0
  42. package/lib/icon/icon.component.d.ts +1 -3
  43. package/lib/icon/icon.service.d.ts +7 -4
  44. package/lib/icon/types.d.ts +3 -1
  45. package/lib/input-group/input-group.component.d.ts +8 -10
  46. package/lib/services/public_api.d.ts +1 -0
  47. package/lib/services/theme/theme.token.d.ts +24 -0
  48. package/package.json +1 -1
  49. package/styles/igniteui-angular-dark.css +1 -1
  50. package/styles/igniteui-angular.css +1 -1
  51. package/styles/igniteui-bootstrap-dark.css +1 -1
  52. package/styles/igniteui-bootstrap-light.css +1 -1
  53. package/styles/igniteui-dark-green.css +1 -1
  54. package/styles/igniteui-fluent-dark-excel.css +1 -1
  55. package/styles/igniteui-fluent-dark-word.css +1 -1
  56. package/styles/igniteui-fluent-dark.css +1 -1
  57. package/styles/igniteui-fluent-light-excel.css +1 -1
  58. package/styles/igniteui-fluent-light-word.css +1 -1
  59. package/styles/igniteui-fluent-light.css +1 -1
  60. package/styles/igniteui-indigo-dark.css +1 -1
  61. package/styles/igniteui-indigo-light.css +1 -1
  62. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  63. package/styles/maps/igniteui-angular.css.map +1 -1
  64. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  65. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  66. package/styles/maps/igniteui-dark-green.css.map +1 -1
  67. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  68. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  69. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  70. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  71. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  72. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  73. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  74. package/styles/maps/igniteui-indigo-light.css.map +1 -1
  75. package/esm2022/lib/services/theme/theme.service.mjs +0 -48
  76. package/lib/services/theme/theme.service.d.ts +0 -27
@@ -1,4 +1,4 @@
1
- import { NgIf, NgClass, NgFor, NgTemplateOutlet } from '@angular/common';
1
+ import { NgIf, NgClass, NgFor, NgTemplateOutlet, DOCUMENT } from '@angular/common';
2
2
  import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, Inject, Injectable, Input, Output, TemplateRef, ViewChild, ViewChildren, booleanAttribute } from '@angular/core';
3
3
  import { HammerGestureConfig, HAMMER_GESTURE_CONFIG } from '@angular/platform-browser';
4
4
  import { merge, Subject } from 'rxjs';
@@ -202,12 +202,13 @@ export class IgxCarouselComponent extends IgxCarouselComponentBase {
202
202
  this._interval = +value;
203
203
  this.restartInterval();
204
204
  }
205
- constructor(cdr, element, iterableDiffers, animationService, platformUtil, dir) {
205
+ constructor(cdr, element, iterableDiffers, animationService, platformUtil, dir, document) {
206
206
  super(animationService, cdr);
207
207
  this.element = element;
208
208
  this.iterableDiffers = iterableDiffers;
209
209
  this.platformUtil = platformUtil;
210
210
  this.dir = dir;
211
+ this.document = document;
211
212
  /**
212
213
  * Sets the `id` of the carousel.
213
214
  * If not set, the `id` of the first carousel component will be `"igx-carousel-0"`.
@@ -816,7 +817,7 @@ export class IgxCarouselComponent extends IgxCarouselComponentBase {
816
817
  return this._indicators.toArray();
817
818
  }
818
819
  focusElement() {
819
- const focusedElement = document.activeElement;
820
+ const focusedElement = this.document.activeElement;
820
821
  if (focusedElement.classList.contains('igx-carousel-indicators__indicator')) {
821
822
  this.indicatorsElements[this.current].nativeElement.focus();
822
823
  }
@@ -966,7 +967,7 @@ export class IgxCarouselComponent extends IgxCarouselComponentBase {
966
967
  requestAnimationFrame(() => this.slides.find(s => s.active).nativeElement.focus());
967
968
  }
968
969
  }
969
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: IgxCarouselComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.IterableDiffers }, { token: IgxAngularAnimationService }, { token: i1.PlatformUtil }, { token: i2.IgxDirectionality }], target: i0.ɵɵFactoryTarget.Component }); }
970
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: IgxCarouselComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.IterableDiffers }, { token: IgxAngularAnimationService }, { token: i1.PlatformUtil }, { token: i2.IgxDirectionality }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
970
971
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.4", type: IgxCarouselComponent, isStandalone: true, selector: "igx-carousel", inputs: { id: "id", loop: ["loop", "loop", booleanAttribute], pause: ["pause", "pause", booleanAttribute], navigation: ["navigation", "navigation", booleanAttribute], indicators: ["indicators", "indicators", booleanAttribute], vertical: ["vertical", "vertical", booleanAttribute], keyboardSupport: ["keyboardSupport", "keyboardSupport", booleanAttribute], gesturesSupport: ["gesturesSupport", "gesturesSupport", booleanAttribute], maximumIndicatorsCount: "maximumIndicatorsCount", indicatorsOrientation: "indicatorsOrientation", animationType: "animationType", resourceStrings: "resourceStrings", interval: "interval" }, outputs: { slideChanged: "slideChanged", slideAdded: "slideAdded", slideRemoved: "slideRemoved", carouselPaused: "carouselPaused", carouselPlaying: "carouselPlaying" }, host: { listeners: { "keydown.arrowright": "onKeydownArrowRight($event)", "keydown.arrowleft": "onKeydownArrowLeft($event)", "tap": "onTap($event)", "keydown.home": "onKeydownHome($event)", "keydown.end": "onKeydownEnd($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "panleft": "onPanLeft($event)", "panright": "onPanRight($event)", "panup": "onPanUp($event)", "pandown": "onPanDown($event)", "panend": "onPanEnd($event)" }, properties: { "attr.id": "this.id", "attr.role": "this.role", "attr.aria-roledescription": "this.roleDescription", "attr.aria-labelledby": "this.labelId", "class.igx-carousel--vertical": "this.isVertical", "class.igx-carousel": "this.cssClass", "style.touch-action": "this.touchAction" } }, providers: [
971
972
  {
972
973
  provide: HAMMER_GESTURE_CONFIG,
@@ -985,7 +986,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
985
986
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.IterableDiffers }, { type: undefined, decorators: [{
986
987
  type: Inject,
987
988
  args: [IgxAngularAnimationService]
988
- }] }, { type: i1.PlatformUtil }, { type: i2.IgxDirectionality }], propDecorators: { id: [{
989
+ }] }, { type: i1.PlatformUtil }, { type: i2.IgxDirectionality }, { type: undefined, decorators: [{
990
+ type: Inject,
991
+ args: [DOCUMENT]
992
+ }] }], propDecorators: { id: [{
989
993
  type: HostBinding,
990
994
  args: ['attr.id']
991
995
  }, {
@@ -1110,4 +1114,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
1110
1114
  type: HostListener,
1111
1115
  args: ['panend', ['$event']]
1112
1116
  }] } });
1113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2Nhcm91c2VsL2Nhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9jYXJvdXNlbC9jYXJvdXNlbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RSxPQUFPLEVBR0gsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBQ1YsS0FBSyxFQUtMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkYsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSx5QkFBeUIsRUFBNEIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RyxPQUFPLEVBQUUsS0FBSyxFQUFrQixJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRTdGLE9BQU8sRUFBRSxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsOEJB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QyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBV2hDLFlBQVk7c0JBRGxCLFlBQVk7dUJBQUMsWUFBWTtnQkFVbkIsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyxZQUFZO2dCQVNuQixTQUFTO3NCQURmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVM1QixVQUFVO3NCQURoQixZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFTN0IsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFTMUIsU0FBUztzQkFEZixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXNUIsUUFBUTtzQkFEZCxZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nSWYsIE5nQ2xhc3MsIE5nRm9yLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdGFibGUsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVDaGFuZ2VSZWNvcmQsXG4gICAgSXRlcmFibGVEaWZmZXIsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgYm9vbGVhbkF0dHJpYnV0ZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhhbW1lckdlc3R1cmVDb25maWcsIEhBTU1FUl9HRVNUVVJFX0NPTkZJRyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENhcm91c2VsUmVzb3VyY2VTdHJpbmdzRU4sIElDYXJvdXNlbFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9jYXJvdXNlbC1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgZmlyc3QsIElCYXNlRXZlbnRBcmdzLCBsYXN0LCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneEFuZ3VsYXJBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYW5pbWF0aW9uL2FuZ3VsYXItYW5pbWF0aW9uLXNlcnZpY2UnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FuaW1hdGlvbi9hbmltYXRpb24nO1xuaW1wb3J0IHsgRGlyZWN0aW9uLCBJZ3hDYXJvdXNlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuL2Nhcm91c2VsLWJhc2UnO1xuaW1wb3J0IHsgSWd4Q2Fyb3VzZWxJbmRpY2F0b3JEaXJlY3RpdmUsIElneENhcm91c2VsTmV4dEJ1dHRvbkRpcmVjdGl2ZSwgSWd4Q2Fyb3VzZWxQcmV2QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi9jYXJvdXNlbC5kaXJlY3RpdmVzJztcbmltcG9ydCB7IElneFNsaWRlQ29tcG9uZW50IH0gZnJvbSAnLi9zbGlkZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBIYW1tZXJHZXN0dXJlc01hbmFnZXIgfSBmcm9tICcuLi9jb3JlL3RvdWNoJztcbmltcG9ydCB7IENhcm91c2VsQW5pbWF0aW9uVHlwZSwgQ2Fyb3VzZWxJbmRpY2F0b3JzT3JpZW50YXRpb24gfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IElneERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnLi4vc2VydmljZXMvZGlyZWN0aW9uL2RpcmVjdGlvbmFsaXR5JztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbEhhbW1lckNvbmZpZyBleHRlbmRzIEhhbW1lckdlc3R1cmVDb25maWcge1xuICAgIHB1YmxpYyBvdmVycmlkZSBvdmVycmlkZXMgPSB7XG4gICAgICAgIHBhbjogeyBkaXJlY3Rpb246IEhhbW1lckdlc3R1cmVzTWFuYWdlci5IYW1tZXI/LkRJUkVDVElPTl9IT1JJWk9OVEFMIH1cbiAgICB9O1xufVxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBDYXJvdXNlbCoqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy9jYXJvdXNlbC5odG1sKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgQ2Fyb3VzZWwgaXMgdXNlZCB0byBicm93c2Ugb3IgbmF2aWdhdGUgdGhyb3VnaCBhIGNvbGxlY3Rpb24gb2Ygc2xpZGVzLiBTbGlkZXMgY2FuIGNvbnRhaW4gY3VzdG9tXG4gKiBjb250ZW50IHN1Y2ggYXMgaW1hZ2VzIG9yIGNhcmRzIGFuZCBiZSB1c2VkIGZvciB0aGluZ3Mgc3VjaCBhcyBvbi1ib2FyZGluZyB0dXRvcmlhbHMgb3IgcGFnZS1iYXNlZCBpbnRlcmZhY2VzLlxuICogSXQgY2FuIGJlIHVzZWQgYXMgYSBzZXBhcmF0ZSBmdWxsc2NyZWVuIGVsZW1lbnQgb3IgaW5zaWRlIGFub3RoZXIgY29tcG9uZW50LlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LWNhcm91c2VsPlxuICogICA8aWd4LXNsaWRlPlxuICogICAgIDxoMz5GaXJzdCBTbGlkZSBIZWFkZXI8L2gzPlxuICogICAgIDxwPkZpcnN0IHNsaWRlIENvbnRlbnQ8L3A+XG4gKiAgIDxpZ3gtc2xpZGU+XG4gKiAgIDxpZ3gtc2xpZGU+XG4gKiAgICAgPGgzPlNlY29uZCBTbGlkZSBIZWFkZXI8L2gzPlxuICogICAgIDxwPlNlY29uZCBTbGlkZSBDb250ZW50PC9wPlxuICogPC9pZ3gtY2Fyb3VzZWw+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEhBTU1FUl9HRVNUVVJFX0NPTkZJRyxcbiAgICAgICAgICAgIHVzZUNsYXNzOiBDYXJvdXNlbEhhbW1lckNvbmZpZ1xuICAgICAgICB9XG4gICAgXSxcbiAgICBzZWxlY3RvcjogJ2lneC1jYXJvdXNlbCcsXG4gICAgdGVtcGxhdGVVcmw6ICdjYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG91dGxpbmUtc3R5bGU6IG5vbmU7XG4gICAgfWBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0lneEJ1dHRvbkRpcmVjdGl2ZSwgSWd4SWNvbkNvbXBvbmVudCwgTmdJZiwgTmdDbGFzcywgTmdGb3IsIE5nVGVtcGxhdGVPdXRsZXRdXG59KVxuXG5leHBvcnQgY2xhc3MgSWd4Q2Fyb3VzZWxDb21wb25lbnQgZXh0ZW5kcyBJZ3hDYXJvdXNlbENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQge1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYGlkYCBvZiB0aGUgY2Fyb3VzZWwuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGBpZGAgb2YgdGhlIGZpcnN0IGNhcm91c2VsIGNvbXBvbmVudCB3aWxsIGJlIGBcImlneC1jYXJvdXNlbC0wXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIGlkPVwibXktZmlyc3QtY2Fyb3VzZWxcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWNhcm91c2VsLSR7TkVYVF9JRCsrfWA7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2Fyb3VzZWwuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjYXJvdXNlbFJvbGUgPSAgdGhpcy5jYXJvdXNlbC5yb2xlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSBwdWJsaWMgcm9sZSA9ICdyZWdpb24nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1yb2xlZGVzY3JpcHRpb24nKVxuICAgIHB1YmxpYyByb2xlRGVzY3JpcHRpb24gPSAnY2Fyb3VzZWwnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbGxlZGJ5JylcbiAgICBwdWJsaWMgZ2V0IGxhYmVsSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dJbmRpY2F0b3JzTGFiZWwgPyBgJHt0aGlzLmlkfS1sYWJlbGAgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2Fyb3VzZWwtLXZlcnRpY2FsJylcblx0cHVibGljIGdldCBpc1ZlcnRpY2FsKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZlcnRpY2FsO1xuXHR9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgY2Fyb3VzZWwgY29tcG9uZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY2xhc3MgPSAgdGhpcy5jYXJvdXNlbC5jc3NDbGFzcztcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcm91c2VsJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNhcm91c2VsJztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b3VjaC1hY3Rpb25gIHN0eWxlIG9mIHRoZSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRvdWNoQWN0aW9uID0gdGhpcy5saXN0SXRlbS50b3VjaEFjdGlvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLnRvdWNoLWFjdGlvbicpXG4gICAgcHVibGljIGdldCB0b3VjaEFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VzdHVyZXNTdXBwb3J0ID8gJ3Bhbi15JyA6ICdhdXRvJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNhcm91c2VsIHNob3VsZCBgbG9vcGAgYmFjayB0byB0aGUgZmlyc3Qgc2xpZGUgYWZ0ZXIgcmVhY2hpbmcgdGhlIGxhc3Qgc2xpZGUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgW2xvb3BdPVwiZmFsc2VcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgbG9vcCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNhcm91c2VsIHdpbGwgYHBhdXNlYCB0aGUgc2xpZGUgdHJhbnNpdGlvbnMgb24gdXNlciBpbnRlcmFjdGlvbnMuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWNhcm91c2VsIFtwYXVzZV09XCJmYWxzZVwiPjwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHB1YmxpYyBwYXVzZSA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBjYXJvdXNlbCBzaG91bGQgcmVuZGVyIHRoZSBsZWZ0L3JpZ2h0IGBuYXZpZ2F0aW9uYCBidXR0b25zLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIFtuYXZpZ2F0aW9uXT1cImZhbHNlXCI+PC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcHVibGljIG5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgY2Fyb3VzZWwgc2hvdWxkIHJlbmRlciB0aGUgaW5kaWNhdG9ycy5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJvdXNlbCBbaW5kaWNhdG9yc109XCJmYWxzZVwiPjwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHB1YmxpYyBpbmRpY2F0b3JzID0gdHJ1ZTtcblxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgY2Fyb3VzZWwgaGFzIHZlcnRpY2FsIGFsaWdubWVudC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgW3ZlcnRpY2FsXT1cInRydWVcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgb3ZlcnJpZGUgdmVydGljYWwgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNhcm91c2VsIHNob3VsZCBzdXBwb3J0IGtleWJvYXJkIG5hdmlnYXRpb24uXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIFtrZXlib2FyZFN1cHBvcnRdPVwidHJ1ZVwiPjwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxOC4yLjAuXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHB1YmxpYyBrZXlib2FyZFN1cHBvcnQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNhcm91c2VsIHNob3VsZCBzdXBwb3J0IGdlc3R1cmVzLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIFtnZXN0dXJlc1N1cHBvcnRdPVwiZmFsc2VcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgZ2VzdHVyZXNTdXBwb3J0ID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBtYXhpbXVtIGluZGV4ZXMgdGhhdCBjYW4gYmUgc2hvd24uXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgNWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgW21heGltdW1JbmRpY2F0b3JzQ291bnRdPVwiMTBcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhpbXVtSW5kaWNhdG9yc0NvdW50ID0gNTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgZGlzcGxheSBtb2RlIG9mIGNhcm91c2VsIGluZGljYXRvcnMuIEl0IGNhbiBiZSB0b3Agb3IgYm90dG9tLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGJvdHRvbWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgaW5kaWNhdG9yc09yaWVudGF0aW9uPSd0b3AnPlxuICAgICAqIDxpZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4U2xpZGVDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaW5kaWNhdG9yc09yaWVudGF0aW9uOiBDYXJvdXNlbEluZGljYXRvcnNPcmllbnRhdGlvbiA9IENhcm91c2VsSW5kaWNhdG9yc09yaWVudGF0aW9uLmJvdHRvbTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgYW5pbWF0aW9uIHR5cGUgb2YgY2Fyb3VzZWwuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgc2xpZGVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIGFuaW1hdGlvblR5cGU9J25vbmUnPlxuICAgICAqIDxpZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4U2xpZGVDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgb3ZlcnJpZGUgYW5pbWF0aW9uVHlwZTogQ2Fyb3VzZWxBbmltYXRpb25UeXBlID0gQ2Fyb3VzZWxBbmltYXRpb25UeXBlLnNsaWRlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGNhcm91c2VsIGluZGljYXRvcnNcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jYXJvdXNlbC5pbmRpY2F0b3JUZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jYXJvdXNlbCAjY2Fyb3VzZWw+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDYXJvdXNlbEluZGljYXRvciBsZXQtc2xpZGU+XG4gICAgICogICAgICAgICA8aWd4LWljb24gKm5nSWY9XCJzbGlkZS5hY3RpdmVcIj5icmlnaHRuZXNzXzc8L2lneC1pY29uPlxuICAgICAqICAgICAgICAgPGlneC1pY29uICpuZ0lmPVwiIXNsaWRlLmFjdGl2ZVwiPmJyaWdodG5lc3NfNTwvaWd4LWljb24+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENhcm91c2VsSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIGluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBjYXJvdXNlbCBuZXh0IGJ1dHRvblxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNhcm91c2VsLm5leHRCdXR0b25UZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jYXJvdXNlbCAjY2Fyb3VzZWw+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDYXJvdXNlbE5leHRCdXR0b24gbGV0LWRpc2FibGVkPlxuICAgICAqICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbj1cImZhYlwiIGlneFJpcHBsZT1cIndoaXRlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICogICAgICAgICAgICAgIDxpZ3gtaWNvbiBuYW1lPVwiYWRkXCI+PC9pZ3gtaWNvbj5cbiAgICAgKiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q2Fyb3VzZWxOZXh0QnV0dG9uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIG5leHRCdXR0b25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgY2Fyb3VzZWwgcHJldmlvdXMgYnV0dG9uXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY2Fyb3VzZWwucHJldkJ1dHRvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNhcm91c2VsICNjYXJvdXNlbD5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENhcm91c2VsUHJldkJ1dHRvbiBsZXQtZGlzYWJsZWQ+XG4gICAgICogICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uPVwiZmFiXCIgaWd4UmlwcGxlPVwid2hpdGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgKiAgICAgICAgICAgICAgPGlneC1pY29uIG5hbWU9XCJyZW1vdmVcIj48L2lneC1pY29uPlxuICAgICAqICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDYXJvdXNlbFByZXZCdXR0b25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgcHJldkJ1dHRvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIGBzbGlkZXNgIGN1cnJlbnRseSBpbiB0aGUgY2Fyb3VzZWwuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzbGlkZXM6IFF1ZXJ5TGlzdDxJZ3hTbGlkZUNvbXBvbmVudD4gPSB0aGlzLmNhcm91c2VsLnNsaWRlcztcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4U2xpZGVDb21wb25lbnQpXG4gICAgcHVibGljIHNsaWRlczogUXVlcnlMaXN0PElneFNsaWRlQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciBhIHNsaWRlIHRyYW5zaXRpb24gaGFzIGhhcHBlbmVkLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZXMgdG8gdGhlIGBJZ3hDYXJvdXNlbENvbXBvbmVudGAgYW5kIGBJZ3hTbGlkZUNvbXBvbmVudGAgYXMgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIChzbGlkZUNoYW5nZWQpPVwic2xpZGVDaGFuZ2VkKCRldmVudClcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2xpZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJU2xpZGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgYWZ0ZXIgYSBzbGlkZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgY2Fyb3VzZWwuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneENhcm91c2VsQ29tcG9uZW50YCBhbmQgYElneFNsaWRlQ29tcG9uZW50YCBhcyBldmVudCBhcmd1bWVudHMuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgKHNsaWRlQWRkZWQpPVwic2xpZGVBZGRlZCgkZXZlbnQpXCI+PC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHNsaWRlQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElTbGlkZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciBhIHNsaWRlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2Fyb3VzZWwuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneENhcm91c2VsQ29tcG9uZW50YCBhbmQgYElneFNsaWRlQ29tcG9uZW50YCBhcyBldmVudCBhcmd1bWVudHMuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgKHNsaWRlUmVtb3ZlZCk9XCJzbGlkZVJlbW92ZWQoJGV2ZW50KVwiPjwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzbGlkZVJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElTbGlkZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciB0aGUgY2Fyb3VzZWwgaGFzIGJlZW4gcGF1c2VkLlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4Q2Fyb3VzZWxDb21wb25lbnRgIGFzIGFuIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIChjYXJvdXNlbFBhdXNlZCk9XCJjYXJvdXNlbFBhdXNlZCgkZXZlbnQpXCI+PC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIGNhcm91c2VsUGF1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hDYXJvdXNlbENvbXBvbmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciB0aGUgY2Fyb3VzZWwgaGFzIHJlc3VtZWQgdHJhbnNpdGlvbmluZyBiZXR3ZWVuIGBzbGlkZXNgLlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4Q2Fyb3VzZWxDb21wb25lbnRgIGFzIGFuIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIChjYXJvdXNlbFBsYXlpbmcpPVwiY2Fyb3VzZWxQbGF5aW5nKCRldmVudClcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgY2Fyb3VzZWxQbGF5aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hDYXJvdXNlbENvbXBvbmVudD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRJbmRpY2F0b3InLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIGRlZmF1bHRJbmRpY2F0b3I6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0TmV4dEJ1dHRvbicsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgZGVmYXVsdE5leHRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0UHJldkJ1dHRvbicsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgZGVmYXVsdFByZXZCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdpbmRpY2F0b3JzJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBfaW5kaWNhdG9yczogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcHBlZEJ5SW50ZXJhY3Rpb246IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGN1cnJlbnRJdGVtOiBJZ3hTbGlkZUNvbXBvbmVudDtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJldmlvdXNJdGVtOiBJZ3hTbGlkZUNvbXBvbmVudDtcbiAgICBwcml2YXRlIF9pbnRlcnZhbDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncyA9IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MoQ2Fyb3VzZWxSZXNvdXJjZVN0cmluZ3NFTik7XG4gICAgcHJpdmF0ZSBsYXN0SW50ZXJ2YWw6IGFueTtcbiAgICBwcml2YXRlIHBsYXlpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIGRpZmZlcjogSXRlcmFibGVEaWZmZXI8SWd4U2xpZGVDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBpbmNvbWluZ1NsaWRlOiBJZ3hTbGlkZUNvbXBvbmVudDtcbiAgICBwcml2YXRlIF9oYXNLZXlib2FyZEZvY3VzT25JbmRpY2F0b3JzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhY2Nlc3NvciB0aGF0IHNldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICogQnkgZGVmYXVsdCBpdCB1c2VzIEVOIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJQ2Fyb3VzZWxSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCByZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElDYXJvdXNlbFJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IGdldEluZGljYXRvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5pbmRpY2F0b3JUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEluZGljYXRvcjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBnZXQgZ2V0TmV4dEJ1dHRvblRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5uZXh0QnV0dG9uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHRCdXR0b25UZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHROZXh0QnV0dG9uXG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IGdldFByZXZCdXR0b25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMucHJldkJ1dHRvblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2QnV0dG9uVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0UHJldkJ1dHRvblxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGdldCBpbmRpY2F0b3JzQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbJ2lneC1jYXJvdXNlbC1pbmRpY2F0b3JzLS1mb2N1c2VkJ106IHRoaXMuX2hhc0tleWJvYXJkRm9jdXNPbkluZGljYXRvcnMsXG4gICAgICAgICAgICBbYGlneC1jYXJvdXNlbC1pbmRpY2F0b3JzLS0ke3RoaXMuaW5kaWNhdG9yc09yaWVudGF0aW9ufWBdOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dJbmRpY2F0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JzICYmIHRoaXMudG90YWwgPD0gdGhpcy5tYXhpbXVtSW5kaWNhdG9yc0NvdW50ICYmIHRoaXMudG90YWwgPiAwO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGdldCBzaG93SW5kaWNhdG9yc0xhYmVsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JzICYmIHRoaXMudG90YWwgPiB0aGlzLm1heGltdW1JbmRpY2F0b3JzQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IGdldENhcm91c2VsTGFiZWwoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmN1cnJlbnQgKyAxfSAke3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9jYXJvdXNlbF9vZn0gJHt0aGlzLnRvdGFsfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGBzbGlkZXNgIGluIHRoZSBjYXJvdXNlbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHNsaWRlQ291bnQgPSAgdGhpcy5jYXJvdXNlbC50b3RhbDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWwoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVzPy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBzbGlkZSBiZWluZyBjdXJyZW50bHkgc2hvd24uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjdXJyZW50U2xpZGVOdW1iZXIgPSAgdGhpcy5jYXJvdXNlbC5jdXJyZW50O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jdXJyZW50SXRlbSA/IDAgOiB0aGlzLmN1cnJlbnRJdGVtLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNhcm91c2VsIGlzIHBsYXlpbmcuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1BsYXlpbmcgPSAgdGhpcy5jYXJvdXNlbC5pc1BsYXlpbmc7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUGxheWluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zINCwIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY2Fyb3VzZWwgaXMgZGVzdHJveWVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNEZXN0cm95ZWQgPSAgdGhpcy5jYXJvdXNlbC5pc0Rlc3Ryb3llZDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNEZXN0cm95ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudCBpbiB0aGUgRE9NLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbmF0aXZlRWxlbWVudCA9ICB0aGlzLmNhcm91c2VsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRpbWUgYGludGVydmFsYCBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBzbGlkZSBjaGFuZ2VzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdGltZUludGVydmFsID0gdGhpcy5jYXJvdXNlbC5pbnRlcnZhbDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpbnRlcnZhbCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGltZSBgaW50ZXJ2YWxgIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNsaWRlIGNoYW5nZXMuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGNhcm91c2VsIHdpbGwgbm90IGNoYW5nZSBgc2xpZGVzYCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIFtpbnRlcnZhbF09XCIxMDAwXCI+PC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSArdmFsdWU7XG4gICAgICAgIHRoaXMucmVzdGFydEludGVydmFsKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICAgICAgQEluamVjdChJZ3hBbmd1bGFyQW5pbWF0aW9uU2VydmljZSkgYW5pbWF0aW9uU2VydmljZTogQW5pbWF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwbGF0Zm9ybVV0aWw6IFBsYXRmb3JtVXRpbCxcbiAgICAgICAgcHJpdmF0ZSBkaXI6IElneERpcmVjdGlvbmFsaXR5XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGFuaW1hdGlvblNlcnZpY2UsIGNkcik7XG4gICAgICAgIHRoaXMuZGlmZmVyID0gdGhpcy5pdGVyYWJsZURpZmZlcnMuZmluZChbXSkuY3JlYXRlKG51bGwpO1xuICAgIH1cblxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93cmlnaHQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd1JpZ2h0KGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkU3VwcG9ydCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0VsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2xlZnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd0xlZnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdXBwb3J0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5wcmV2KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCd0YXAnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblRhcChldmVudCkge1xuICAgICAgICAvLyBwbGF5IHBhdXNlIG9ubHkgd2hlbiB0YXAgb24gc2xpZGVcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpZ3gtc2xpZGUnKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGF1c2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wcGVkQnlJbnRlcmFjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0b3BwZWRCeUludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uaG9tZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkhvbWUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdXBwb3J0ICYmIHRoaXMuc2xpZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNsaWRlcy5maXJzdC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0VsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbmQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25FbmQoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdXBwb3J0ICYmIHRoaXMuc2xpZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNsaWRlcy5sYXN0LmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcbiAgICBwdWJsaWMgb25Nb3VzZUVudGVyKCkge1xuICAgICAgICBpZiAodGhpcy5wYXVzZSAmJiB0aGlzLmlzUGxheWluZykge1xuICAgICAgICAgICAgdGhpcy5zdG9wcGVkQnlJbnRlcmFjdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgICBwdWJsaWMgb25Nb3VzZUxlYXZlKCkge1xuICAgICAgICBpZiAodGhpcy5zdG9wcGVkQnlJbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BhbmxlZnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhbkxlZnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICB0aGlzLnBhbihldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BhbnJpZ2h0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25QYW5SaWdodChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIHRoaXMucGFuKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigncGFudXAnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhblVwKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICB0aGlzLnBhbihldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BhbmRvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhbkRvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIHRoaXMucGFuKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5lbmQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhbkVuZChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuZ2VzdHVyZXNTdXBwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBzbGlkZVNpemUgPSB0aGlzLnZlcnRpY2FsXG4gICAgICAgICAgICA/IHRoaXMuY3VycmVudEl0ZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgIDogdGhpcy5jdXJyZW50SXRlbS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBwYW5PZmZzZXQgPSAoc2xpZGVTaXplIC8gMTAwMCk7XG4gICAgICAgIGNvbnN0IGV2ZW50RGVsdGEgPSB0aGlzLnZlcnRpY2FsID8gZXZlbnQuZGVsdGFZIDogZXZlbnQuZGVsdGFYO1xuICAgICAgICBjb25zdCBkZWx0YSA9IE1hdGguYWJzKGV2ZW50RGVsdGEpICsgcGFuT2Zmc2V0IDwgc2xpZGVTaXplID8gTWF0aC5hYnMoZXZlbnREZWx0YSkgOiBzbGlkZVNpemUgLSBwYW5PZmZzZXQ7XG4gICAgICAgIGNvbnN0IHZlbG9jaXR5ID0gTWF0aC5hYnMoZXZlbnQudmVsb2NpdHkpO1xuICAgICAgICB0aGlzLnJlc2V0U2xpZGVTdHlsZXModGhpcy5jdXJyZW50SXRlbSk7XG4gICAgICAgIGlmICh0aGlzLmluY29taW5nU2xpZGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRTbGlkZVN0eWxlcyh0aGlzLmluY29taW5nU2xpZGUpO1xuICAgICAgICAgICAgaWYgKHNsaWRlU2l6ZSAvIDIgPCBkZWx0YSB8fCB2ZWxvY2l0eSA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nU2xpZGUuZGlyZWN0aW9uID0gZXZlbnREZWx0YSA8IDAgPyBEaXJlY3Rpb24uTkVYVCA6IERpcmVjdGlvbi5QUkVWO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdTbGlkZS5wcmV2aW91cyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb25Qb3NpdGlvbiA9IHRoaXMuYW5pbWF0aW9uVHlwZSA9PT0gQ2Fyb3VzZWxBbmltYXRpb25UeXBlLmZhZGUgP1xuICAgICAgICAgICAgICAgICAgICBkZWx0YSAvIHNsaWRlU2l6ZSA6IChzbGlkZVNpemUgLSBkZWx0YSkgLyBzbGlkZVNpemU7XG5cbiAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3RHVyYXRpb24gPSB0aGlzLmRlZmF1bHRBbmltYXRpb25EdXJhdGlvbiAvIHZlbG9jaXR5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nU2xpZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbS5kaXJlY3Rpb24gPSBldmVudERlbHRhID4gMCA/IERpcmVjdGlvbi5ORVhUIDogRGlyZWN0aW9uLlBSRVY7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0l0ZW0gPSB0aGlzLmluY29taW5nU2xpZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0l0ZW0ucHJldmlvdXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uUG9zaXRpb24gPSB0aGlzLmFuaW1hdGlvblR5cGUgPT09IENhcm91c2VsQW5pbWF0aW9uVHlwZS5mYWRlID9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoKHNsaWRlU2l6ZSAtIGRlbHRhKSAvIHNsaWRlU2l6ZSkgOiBkZWx0YSAvIHNsaWRlU2l6ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlBbmltYXRpb25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdG9wcGVkQnlJbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuc2xpZGVzLmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogUXVlcnlMaXN0PElneFNsaWRlQ29tcG9uZW50PikgPT4gdGhpcy5pbml0U2xpZGVzKGNoYW5nZSkpO1xuXG4gICAgICAgIHRoaXMuaW5pdFNsaWRlcyh0aGlzLnNsaWRlcyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmxhc3RJbnRlcnZhbCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmxhc3RJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBoYW5kbGVLZXlkb3duUHJldihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybVV0aWwuaXNBY3RpdmF0aW9uS2V5KGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMucHJldigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgaGFuZGxlS2V5ZG93bk5leHQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm1VdGlsLmlzQWN0aXZhdGlvbktleShldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm1VdGlsLktFWU1BUC5UQUIpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhc0tleWJvYXJkRm9jdXNPbkluZGljYXRvcnMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgaGFuZGxlRm9jdXNPdXQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnaWd4LWNhcm91c2VsLWluZGljYXRvcnNfX2luZGljYXRvcicpKSB7XG4gICAgICAgICAgICB0aGlzLl9oYXNLZXlib2FyZEZvY3VzT25JbmRpY2F0b3JzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBoYW5kbGVDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRGb2N1c09uSW5kaWNhdG9ycyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdXBwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBrZXkgfSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBzbGlkZXMgPSB0aGlzLnNsaWRlcy50b0FycmF5KCk7XG5cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybVV0aWwuS0VZTUFQLkFSUk9XX0xFRlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5kaXIucnRsID8gdGhpcy5uZXh0KCkgOiB0aGlzLnByZXYoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybVV0aWwuS0VZTUFQLkFSUk9XX1JJR0hUOlxuICAgICAgICAgICAgICAgIHRoaXMuZGlyLnJ0bCA/IHRoaXMucHJldigpIDogdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHRoaXMucGxhdGZvcm1VdGlsLktFWU1BUC5IT01FOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5kaXIucnRsID8gbGFzdChzbGlkZXMpIDogZmlyc3Qoc2xpZGVzKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHRoaXMucGxhdGZvcm1VdGlsLktFWU1BUC5FTkQ6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmRpci5ydGwgPyBmaXJzdChzbGlkZXMpIDogbGFzdChzbGlkZXMpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yc0VsZW1lbnRzW3RoaXMuY3VycmVudF0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNsaWRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIGBpbmRleGAgb3IgbnVsbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHNsaWRlMSA9ICB0aGlzLmNhcm91c2VsLmdldCgxKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IElneFNsaWRlQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVzLmZpbmQoKHNsaWRlKSA9PiBzbGlkZS5pbmRleCA9PT0gaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgc2xpZGUgdG8gdGhlIGNhcm91c2VsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNhcm91c2VsLmFkZChuZXdTbGlkZSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkKHNsaWRlOiBJZ3hTbGlkZUNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBuZXdTbGlkZXMgPSB0aGlzLnNsaWRlcy50b0FycmF5KCk7XG4gICAgICAgIG5ld1NsaWRlcy5wdXNoKHNsaWRlKTtcbiAgICAgICAgdGhpcy5zbGlkZXMucmVzZXQobmV3U2xpZGVzKTtcbiAgICAgICAgdGhpcy5zbGlkZXMubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHNsaWRlIGZyb20gdGhlIGNhcm91c2VsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNhcm91c2VsLnJlbW92ZShzbGlkZSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlKHNsaWRlOiBJZ3hTbGlkZUNvbXBvbmVudCkge1xuICAgICAgICBpZiAoc2xpZGUgJiYgc2xpZGUgPT09IHRoaXMuZ2V0KHNsaWRlLmluZGV4KSkgeyAvLyBjaGVjayBpZiB0aGUgcmVxdWVzdGVkIHNsaWRlIGZvciBkZWxldGUgaXMgcHJlc2VudCBpbiB0aGUgY2Fyb3VzZWxcbiAgICAgICAgICAgIGNvbnN0IG5ld1NsaWRlcyA9IHRoaXMuc2xpZGVzLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIG5ld1NsaWRlcy5zcGxpY2Uoc2xpZGUuaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5zbGlkZXMucmVzZXQobmV3U2xpZGVzKTtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVzLm5vdGlmeU9uQ2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogS2lja3MgaW4gYSB0cmFuc2l0aW9uIGZvciBhIGdpdmVuIHNsaWRlIHdpdGggYSBnaXZlbiBgZGlyZWN0aW9uYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jYXJvdXNlbC5zZWxlY3QodGhpcy5jYXJvdXNlbC5nZXQoMiksIERpcmVjdGlvbi5ORVhUKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3Qoc2xpZGU6IElneFNsaWRlQ29tcG9uZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbiA9IERpcmVjdGlvbi5OT05FKSB7XG4gICAgICAgIGlmIChzbGlkZSAmJiBzbGlkZSAhPT0gdGhpcy5jdXJyZW50SXRlbSkge1xuICAgICAgICAgICAgc2xpZGUuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICAgICAgc2xpZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zaXRpb25zIHRvIHRoZSBuZXh0IHNsaWRlIGluIHRoZSBjYXJvdXNlbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jYXJvdXNlbC5uZXh0KCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldE5leHRJbmRleCgpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCAmJiAhdGhpcy5sb29wKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3QodGhpcy5nZXQoaW5kZXgpLCBEaXJlY3Rpb24uTkVYVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNpdGlvbnMgdG8gdGhlIHByZXZpb3VzIHNsaWRlIGluIHRoZSBjYXJvdXNlbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jYXJvdXNlbC5wcmV2KCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldigpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldFByZXZJbmRleCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5sb29wICYmIGluZGV4ID09PSB0aGlzLnRvdGFsIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KHRoaXMuZ2V0KGluZGV4KSwgRGlyZWN0aW9uLlBSRVYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3VtZXMgcGxheWluZyBvZiB0aGUgY2Fyb3VzZWwgaWYgaW4gcGF1c2VkIHN0YXRlLlxuICAgICAqIE5vIG9wZXJhdGlvbiBvdGhlcndpc2UuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY2Fyb3VzZWwucGxheSgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBwbGF5KCkge1xuICAgICAgICBpZiAoIXRoaXMucGxheWluZykge1xuICAgICAgICAgICAgdGhpcy5wbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2Fyb3VzZWxQbGF5aW5nLmVtaXQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlc3RhcnRJbnRlcnZhbCgpO1xuICAgICAgICAgICAgdGhpcy5zdG9wcGVkQnlJbnRlcmFjdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgc2xpZGUgdHJhbnNpdGlvbnMgaWYgdGhlIGBwYXVzZWAgb3B0aW9uIGlzIHNldCB0byBgdHJ1ZWAuXG4gICAgICogTm8gb3BlcmF0aW9uIG90aGVyd2lzZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuY2Fyb3VzZWwuc3RvcCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5wYXVzZSkge1xuICAgICAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhcm91c2VsUGF1c2VkLmVtaXQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0SW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRQcmV2aW91c0VsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91c0l0ZW0ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Q3VycmVudEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SXRlbS5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRJbnRlcnZhbCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdEludGVydmFsKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMubGFzdEludGVydmFsKTtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVydmFsID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzdGFydEludGVydmFsKCkge1xuICAgICAgICB0aGlzLnJlc2V0SW50ZXJ2YWwoKTtcblxuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuaW50ZXJ2YWwpICYmIHRoaXMuaW50ZXJ2YWwgPiAwICYmIHRoaXMucGxhdGZvcm1VdGlsLmlzQnJvd3Nlcikge1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGljayA9ICt0aGlzLmludGVydmFsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXlpbmcgJiYgdGhpcy50b3RhbCAmJiAhaXNOYU4odGljaykgJiYgdGljayA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGhpcy5pbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBnZXQgbmV4dEJ1dHRvbkRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMubG9vcCAmJiB0aGlzLmN1cnJlbnQgPT09ICh0aGlzLnRvdGFsIC0gMSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IHByZXZCdXR0b25EaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmxvb3AgJiYgdGhpcy5jdXJyZW50ID09PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGluZGljYXRvcnNFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luZGljYXRvcnMudG9BcnJheSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBmb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGZvY3VzZWRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaWd4LWNhcm91c2VsLWluZGljYXRvcnNfX2luZGljYXRvcicpKSB7XG4gICAgICAgICAgICB0aGlzLmluZGljYXRvcnNFbGVtZW50c1t0aGlzLmN1cnJlbnRdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTbGlkZUVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmV4dEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAodGhpcy5jdXJyZW50ICsgMSkgJSB0aGlzLnRvdGFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJldkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgLSAxIDwgMCA/IHRoaXMudG90YWwgLSAxIDogdGhpcy5jdXJyZW50IC0gMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0U2xpZGVTdHlsZXMoc2xpZGU6IElneFNsaWRlQ29tcG9uZW50KSB7XG4gICAgICAgIHNsaWRlLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgIHNsaWRlLm5hdGl2ZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFuKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNsaWRlU2l6ZSA9IHRoaXMudmVydGljYWxcbiAgICAgICAgICAgID8gdGhpcy5jdXJyZW50SXRlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodFxuICAgICAgICAgICAgOiB0aGlzLmN1cnJlbnRJdGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IHBhbk9mZnNldCA9IChzbGlkZVNpemUgLyAxMDAwKTtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLnZlcnRpY2FsID8gZXZlbnQuZGVsdGFZIDogZXZlbnQuZGVsdGFYO1xuICAgICAgICBjb25zdCBpbmRleCA9IGRlbHRhIDwgMCA/IHRoaXMuZ2V0TmV4dEluZGV4KCkgOiB0aGlzLmdldFByZXZJbmRleCgpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBkZWx0YSA8IDAgPyBzbGlkZVNpemUgKyBkZWx0YSA6IC1zbGlkZVNpemUgKyBkZWx0YTtcblxuICAgICAgICBpZiAoIXRoaXMuZ2VzdHVyZXNTdXBwb3J0IHx8IGV2ZW50LmlzRmluYWwgfHwgTWF0aC5hYnMoZGVsdGEpICsgcGFuT2Zmc2V0ID49IHNsaWRlU2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvb3AgJiYgKCh0aGlzLmN1cnJlbnQgPT09IDAgJiYgZGVsdGEgPiAwKSB8fCAodGhpcy5jdXJyZW50ID09PSB0aGlzLnRvdGFsIC0gMSAmJiBkZWx0YSA8IDApKSkge1xuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ1NsaWRlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZykge1xuICAgICAgICAgICAgdGhpcy5zdG9wcGVkQnlJbnRlcmFjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzSXRlbSAmJiB0aGlzLnByZXZpb3VzSXRlbS5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0l0ZW0ucHJldmlvdXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaEFuaW1hdGlvbnMoKTtcblxuICAgICAgICBpZiAodGhpcy5pbmNvbWluZ1NsaWRlKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IHRoaXMuaW5jb21pbmdTbGlkZS5pbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRTbGlkZVN0eWxlcyh0aGlzLmluY29taW5nU2xpZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdTbGlkZS5wcmV2aW91cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdTbGlkZSA9IHRoaXMuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdTbGlkZSA9IHRoaXMuZ2V0KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluY29taW5nU2xpZGUucHJldmlvdXMgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvblR5cGUgPT09IENhcm91c2VsQW5pbWF0aW9uVHlwZS5mYWRlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IGAke01hdGguYWJzKG9mZnNldCkgLyBzbGlkZVNpemV9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW0ubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSB0aGlzLnZlcnRpY2FsXG4gICAgICAgICAgICAgICAgPyBgdHJhbnNsYXRlWSgke2RlbHRhfXB4KWBcbiAgICAgICAgICAgICAgICA6IGB0cmFuc2xhdGVYKCR7ZGVsdGF9cHgpYDtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdTbGlkZS5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHRoaXMudmVydGljYWxcbiAgICAgICAgICAgICAgICA/IGB0cmFuc2xhdGVZKCR7b2Zmc2V0fXB4KWBcbiAgICAgICAgICAgICAgICA6IGB0cmFuc2xhdGVYKCR7b2Zmc2V0fXB4KWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVuc3Vic2NyaWJlcihzbGlkZTogSWd4U2xpZGVDb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKHRoaXMuZGVzdHJveSQsIHNsaWRlLmlzRGVzdHJveWVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU2xpZGVBY3RpdmF0ZWQoc2xpZGU6IElneFNsaWRlQ29tcG9uZW50KSB7XG4gICAgICAgIGlmIChzbGlkZS5hY3RpdmUgJiYgc2xpZGUgIT09IHRoaXMuY3VycmVudEl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChzbGlkZS5kaXJlY3Rpb24gPT09IERpcmVjdGlvbi5OT05FKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBzbGlkZS5pbmRleDtcbiAgICAgICAgICAgICAgICBzbGlkZS5kaXJlY3Rpb24gPSBuZXdJbmRleCA+IHRoaXMuY3VycmVudCA/IERpcmVjdGlvbi5ORVhUIDogRGlyZWN0aW9uLlBSRVY7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJdGVtKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNJdGVtICYmIHRoaXMucHJldmlvdXNJdGVtLnByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNJdGVtLnByZXZpb3VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW0uZGlyZWN0aW9uID0gc2xpZGUuZGlyZWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW0uYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzSXRlbSA9IHRoaXMuY3VycmVudEl0ZW07XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbSA9IHNsaWRlO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckFuaW1hdGlvbnMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbSA9IHNsaWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zbGlkZUNoYW5nZWQuZW1pdCh7IGNhcm91c2VsOiB0aGlzLCBzbGlkZSB9KTtcbiAgICAgICAgICAgIHRoaXMucmVzdGFydEludGVydmFsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgZmluaXNoQW5pbWF0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uU3RhcnRlZCh0aGlzLmxlYXZlQW5pbWF0aW9uUGxheWVyKSkge1xuICAgICAgICAgICAgdGhpcy5sZWF2ZUFuaW1hdGlvblBsYXllci5maW5pc2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvblN0YXJ0ZWQodGhpcy5lbnRlckFuaW1hdGlvblBsYXllcikpIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJBbmltYXRpb25QbGF5ZXIuZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRTbGlkZXMoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4U2xpZGVDb21wb25lbnQ+KSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLmRpZmZlci5kaWZmKGNoYW5nZS50b0FycmF5KCkpO1xuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgdGhpcy5zbGlkZXMucmVkdWNlKChhbnksIGMsIGluZCkgPT4gYy5pbmRleCA9IGluZCwgMCk7IC8vIHJlc2V0IHNsaWRlcyBpbmRleGVzXG4gICAgICAgICAgICBkaWZmLmZvckVhY2hBZGRlZEl0ZW0oKHJlY29yZDogSXRlcmFibGVDaGFuZ2VSZWNvcmQ8SWd4U2xpZGVDb21wb25lbnQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpZGUgPSByZWNvcmQuaXRlbTtcbiAgICAgICAgICAgICAgICBzbGlkZS50b3RhbCA9IHRoaXMudG90YWw7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZUFkZGVkLmVtaXQoeyBjYXJvdXNlbDogdGhpcywgc2xpZGUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHNsaWRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtID0gc2xpZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNsaWRlLmFjdGl2ZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlcihzbGlkZSkpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblNsaWRlQWN0aXZhdGVkKHNsaWRlKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGlmZi5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHJlY29yZDogSXRlcmFibGVDaGFuZ2VSZWNvcmQ8SWd4U2xpZGVDb21wb25lbnQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpZGUgPSByZWNvcmQuaXRlbTtcbiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlUmVtb3ZlZC5lbWl0KHsgY2Fyb3VzZWw6IHRoaXMsIHNsaWRlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChzbGlkZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2xpZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW0gPSB0aGlzLmdldChzbGlkZS5pbmRleCA8IHRoaXMudG90YWwgPyBzbGlkZS5pbmRleCA6IHRoaXMudG90YWwgLSAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTbGlkZXNTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2xpZGVzU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybVV0aWwuaXNCcm93c2VyKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW0uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlU2xpZGVzID0gdGhpcy5zbGlkZXMuZmlsdGVyKHNsaWRlID0+IHNsaWRlLmFjdGl2ZSAmJiBzbGlkZS5pbmRleCAhPT0gdGhpcy5jdXJyZW50SXRlbS5pbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNsaWRlcy5mb3JFYWNoKHNsaWRlID0+IHNsaWRlLmFjdGl2ZSA9IGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG90YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZXMuZmlyc3QuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGZvY3VzU2xpZGVFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5sZWF2ZUFuaW1hdGlvblBsYXllcikge1xuICAgICAgICAgICAgdGhpcy5sZWF2ZUFuaW1hdGlvblBsYXllci5hbmltYXRpb25FbmRcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVzLmZpbmQocyA9PiBzLmFjdGl2ZSkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuc2xpZGVzLmZpbmQocyA9PiBzLmFjdGl2ZSkubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTbGlkZUV2ZW50QXJncyBleHRlbmRzIElCYXNlRXZlbnRBcmdzIHtcbiAgICBjYXJvdXNlbDogSWd4Q2Fyb3VzZWxDb21wb25lbnQ7XG4gICAgc2xpZGU6IElneFNsaWRlQ29tcG9uZW50O1xufVxuIiwiPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5kaWNhdG9yIGxldC1zbGlkZT5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LW5hdi1kb3RcIlxuICAgICAgICBbY2xhc3MuaWd4LW5hdi1kb3QtLWFjdGl2ZV09XCJzbGlkZS5hY3RpdmVcIj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5leHRCdXR0b24+XG4gICAgPGlneC1pY29uIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwiY2Fyb3VzZWxfbmV4dFwiXG4gICAgICAgIGNsYXNzPVwiaWd4LW5hdi1hcnJvd1wiPlxuICAgIDwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRQcmV2QnV0dG9uPlxuICAgIDxpZ3gtaWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImNhcm91c2VsX3ByZXZcIlxuICAgICAgICBjbGFzcz1cImlneC1uYXYtYXJyb3dcIj5cbiAgICA8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGJ1dHRvbiAqbmdJZj1cIm5hdmlnYXRpb24gJiYgc2xpZGVzLmxlbmd0aFwiXG4gICAgaWd4QnV0dG9uXG4gICAgY2xhc3M9XCJpZ3gtY2Fyb3VzZWxfX2Fycm93LS1wcmV2XCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJlc291cmNlU3RyaW5ncy5pZ3hfY2Fyb3VzZWxfcHJldmlvdXNfc2xpZGVcIlxuICAgIFtkaXNhYmxlZF09XCJwcmV2QnV0dG9uRGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJwcmV2KClcIlxuICAgIChrZXlkb3duKT1cImhhbmRsZUtleWRvd25QcmV2KCRldmVudClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0UHJldkJ1dHRvblRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcmV2QnV0dG9uRGlzYWJsZWR9O1wiPjwvbmctY29udGFpbmVyPlxuPC9idXR0b24+XG5cbjxidXR0b24gKm5nSWY9XCJuYXZpZ2F0aW9uICYmIHNsaWRlcy5sZW5ndGhcIlxuICAgIGlneEJ1dHRvblxuICAgIGNsYXNzPVwiaWd4LWNhcm91c2VsX19hcnJvdy0tbmV4dFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXNvdXJjZVN0cmluZ3MuaWd4X2Nhcm91c2VsX25leHRfc2xpZGVcIlxuICAgIFtkaXNhYmxlZF09XCJuZXh0QnV0dG9uRGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJuZXh0KClcIlxuICAgIChrZXlkb3duKT1cImhhbmRsZUtleWRvd25OZXh0KCRldmVudClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0TmV4dEJ1dHRvblRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBuZXh0QnV0dG9uRGlzYWJsZWR9O1wiPjwvbmctY29udGFpbmVyPlxuPC9idXR0b24+XG5cbjxkaXYgKm5nSWY9XCJzaG93SW5kaWNhdG9yc1wiIFtuZ0NsYXNzXT1cImluZGljYXRvcnNDbGFzc1wiIFthdHRyLnJvbGVdPVwiJ3RhYmxpc3QnXCIgKGtleXVwKT1cImhhbmRsZUtleVVwKCRldmVudClcIiAoZm9jdXNvdXQpPVwiaGFuZGxlRm9jdXNPdXQoJGV2ZW50KVwiIChjbGljayk9XCJoYW5kbGVDbGljaygpXCIgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgPGRpdiAjaW5kaWNhdG9ycyAqbmdGb3I9XCJsZXQgc2xpZGUgb2Ygc2xpZGVzXCJcbiAgICAgICAgY2xhc3M9XCJpZ3gtY2Fyb3VzZWwtaW5kaWNhdG9yc19faW5kaWNhdG9yXCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdChzbGlkZSlcIlxuICAgICAgICBbaWRdPVwiJ3RhYi0nKyBzbGlkZS5pbmRleCArICctJyArIHRvdGFsXCJcbiAgICAgICAgW2F0dHIucm9sZV09XCIndGFiJ1wiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cInNsaWRlLmFjdGl2ZSA/IDAgOiAtMVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVzb3VyY2VTdHJpbmdzLmlneF9jYXJvdXNlbF9zbGlkZSArICcgJyArIChzbGlkZS5pbmRleCArIDEpICsgJyAnICsgcmVzb3VyY2VTdHJpbmdzLmlneF9jYXJvdXNlbF9vZiArICcgJyArIHRoaXMudG90YWxcIlxuICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidwYW5lbC0nICsgc2xpZGUuaW5kZXhcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInNsaWRlLmFjdGl2ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0SW5kaWNhdG9yVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHNsaWRlfTtcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwic2hvd0luZGljYXRvcnNMYWJlbFwiIFtuZ0NsYXNzXT1cImluZGljYXRvcnNDbGFzc1wiIGNsYXNzPVwiaWd4LWNhcm91c2VsLWxhYmVsLWluZGljYXRvclwiPlxuICAgIDxzcGFuIFtpZF09XCJsYWJlbElkXCIgY2xhc3M9XCJpZ3gtY2Fyb3VzZWxfX2xhYmVsXCI+e3tnZXRDYXJvdXNlbExhYmVsfX08L3NwYW4+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImlneC1jYXJvdXNlbF9faW5uZXJcIiBbYXR0ci5hcmlhLWxpdmVdPVwiIWludGVydmFsIHx8IHN0b3BwZWRCeUludGVyYWN0aW9uID8gJ3BvbGl0ZScgOiAnb2ZmJ1wiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuIl19
1117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2Nhcm91c2VsL2Nhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9jYXJvdXNlbC9jYXJvdXNlbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkYsT0FBTyxFQUdILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sVUFBVSxFQUNWLEtBQUssRUFLTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUseUJBQXlCLEVBQTRCLE1BQU0saUNBQWlDLENBQUM7QUFDdEcsT0FBTyxFQUFFLEtBQUssRUFBa0IsSUFBSSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUU3RixPQUFPLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLDZCQUE2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Q0FBQztnQkFpQnhCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVdqQyxZQUFZO3NCQURsQixZQUFZO3VCQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXaEMsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyxZQUFZO2dCQVVuQixZQUFZO3NCQURsQixZQUFZO3VCQUFDLFlBQVk7Z0JBU25CLFNBQVM7c0JBRGYsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzVCLFVBQVU7c0JBRGhCLFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVM3QixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVMxQixTQUFTO3NCQURmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVc1QixRQUFRO3NCQURkLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdJZiwgTmdDbGFzcywgTmdGb3IsIE5nVGVtcGxhdGVPdXRsZXQsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdGFibGUsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVDaGFuZ2VSZWNvcmQsXG4gICAgSXRlcmFibGVEaWZmZXIsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgYm9vbGVhbkF0dHJpYnV0ZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhhbW1lckdlc3R1cmVDb25maWcsIEhBTU1FUl9HRVNUVVJFX0NPTkZJRyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENhcm91c2VsUmVzb3VyY2VTdHJpbmdzRU4sIElDYXJvdXNlbFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9jYXJvdXNlbC1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgZmlyc3QsIElCYXNlRXZlbnRBcmdzLCBsYXN0LCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneEFuZ3VsYXJBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYW5pbWF0aW9uL2FuZ3VsYXItYW5pbWF0aW9uLXNlcnZpY2UnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FuaW1hdGlvbi9hbmltYXRpb24nO1xuaW1wb3J0IHsgRGlyZWN0aW9uLCBJZ3hDYXJvdXNlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuL2Nhcm91c2VsLWJhc2UnO1xuaW1wb3J0IHsgSWd4Q2Fyb3VzZWxJbmRpY2F0b3JEaXJlY3RpdmUsIElneENhcm91c2VsTmV4dEJ1dHRvbkRpcmVjdGl2ZSwgSWd4Q2Fyb3VzZWxQcmV2QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi9jYXJvdXNlbC5kaXJlY3RpdmVzJztcbmltcG9ydCB7IElneFNsaWRlQ29tcG9uZW50IH0gZnJvbSAnLi9zbGlkZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBIYW1tZXJHZXN0dXJlc01hbmFnZXIgfSBmcm9tICcuLi9jb3JlL3RvdWNoJztcbmltcG9ydCB7IENhcm91c2VsQW5pbWF0aW9uVHlwZSwgQ2Fyb3VzZWxJbmRpY2F0b3JzT3JpZW50YXRpb24gfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IElneERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnLi4vc2VydmljZXMvZGlyZWN0aW9uL2RpcmVjdGlvbmFsaXR5JztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbEhhbW1lckNvbmZpZyBleHRlbmRzIEhhbW1lckdlc3R1cmVDb25maWcge1xuICAgIHB1YmxpYyBvdmVycmlkZSBvdmVycmlkZXMgPSB7XG4gICAgICAgIHBhbjogeyBkaXJlY3Rpb246IEhhbW1lckdlc3R1cmVzTWFuYWdlci5IYW1tZXI/LkRJUkVDVElPTl9IT1JJWk9OVEFMIH1cbiAgICB9O1xufVxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBDYXJvdXNlbCoqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy9jYXJvdXNlbC5odG1sKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgQ2Fyb3VzZWwgaXMgdXNlZCB0byBicm93c2Ugb3IgbmF2aWdhdGUgdGhyb3VnaCBhIGNvbGxlY3Rpb24gb2Ygc2xpZGVzLiBTbGlkZXMgY2FuIGNvbnRhaW4gY3VzdG9tXG4gKiBjb250ZW50IHN1Y2ggYXMgaW1hZ2VzIG9yIGNhcmRzIGFuZCBiZSB1c2VkIGZvciB0aGluZ3Mgc3VjaCBhcyBvbi1ib2FyZGluZyB0dXRvcmlhbHMgb3IgcGFnZS1iYXNlZCBpbnRlcmZhY2VzLlxuICogSXQgY2FuIGJlIHVzZWQgYXMgYSBzZXBhcmF0ZSBmdWxsc2NyZWVuIGVsZW1lbnQgb3IgaW5zaWRlIGFub3RoZXIgY29tcG9uZW50LlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LWNhcm91c2VsPlxuICogICA8aWd4LXNsaWRlPlxuICogICAgIDxoMz5GaXJzdCBTbGlkZSBIZWFkZXI8L2gzPlxuICogICAgIDxwPkZpcnN0IHNsaWRlIENvbnRlbnQ8L3A+XG4gKiAgIDxpZ3gtc2xpZGU+XG4gKiAgIDxpZ3gtc2xpZGU+XG4gKiAgICAgPGgzPlNlY29uZCBTbGlkZSBIZWFkZXI8L2gzPlxuICogICAgIDxwPlNlY29uZCBTbGlkZSBDb250ZW50PC9wPlxuICogPC9pZ3gtY2Fyb3VzZWw+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEhBTU1FUl9HRVNUVVJFX0NPTkZJRyxcbiAgICAgICAgICAgIHVzZUNsYXNzOiBDYXJvdXNlbEhhbW1lckNvbmZpZ1xuICAgICAgICB9XG4gICAgXSxcbiAgICBzZWxlY3RvcjogJ2lneC1jYXJvdXNlbCcsXG4gICAgdGVtcGxhdGVVcmw6ICdjYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG91dGxpbmUtc3R5bGU6IG5vbmU7XG4gICAgfWBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0lneEJ1dHRvbkRpcmVjdGl2ZSwgSWd4SWNvbkNvbXBvbmVudCwgTmdJZiwgTmdDbGFzcywgTmdGb3IsIE5nVGVtcGxhdGVPdXRsZXRdXG59KVxuXG5leHBvcnQgY2xhc3MgSWd4Q2Fyb3VzZWxDb21wb25lbnQgZXh0ZW5kcyBJZ3hDYXJvdXNlbENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQge1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYGlkYCBvZiB0aGUgY2Fyb3VzZWwuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGBpZGAgb2YgdGhlIGZpcnN0IGNhcm91c2VsIGNvbXBvbmVudCB3aWxsIGJlIGBcImlneC1jYXJvdXNlbC0wXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIGlkPVwibXktZmlyc3QtY2Fyb3VzZWxcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWNhcm91c2VsLSR7TkVYVF9JRCsrfWA7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2Fyb3VzZWwuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjYXJvdXNlbFJvbGUgPSAgdGhpcy5jYXJvdXNlbC5yb2xlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSBwdWJsaWMgcm9sZSA9ICdyZWdpb24nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1yb2xlZGVzY3JpcHRpb24nKVxuICAgIHB1YmxpYyByb2xlRGVzY3JpcHRpb24gPSAnY2Fyb3VzZWwnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbGxlZGJ5JylcbiAgICBwdWJsaWMgZ2V0IGxhYmVsSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dJbmRpY2F0b3JzTGFiZWwgPyBgJHt0aGlzLmlkfS1sYWJlbGAgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2Fyb3VzZWwtLXZlcnRpY2FsJylcblx0cHVibGljIGdldCBpc1ZlcnRpY2FsKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZlcnRpY2FsO1xuXHR9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgY2Fyb3VzZWwgY29tcG9uZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY2xhc3MgPSAgdGhpcy5jYXJvdXNlbC5jc3NDbGFzcztcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcm91c2VsJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNhcm91c2VsJztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b3VjaC1hY3Rpb25gIHN0eWxlIG9mIHRoZSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRvdWNoQWN0aW9uID0gdGhpcy5saXN0SXRlbS50b3VjaEFjdGlvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLnRvdWNoLWFjdGlvbicpXG4gICAgcHVibGljIGdldCB0b3VjaEFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VzdHVyZXNTdXBwb3J0ID8gJ3Bhbi15JyA6ICdhdXRvJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNhcm91c2VsIHNob3VsZCBgbG9vcGAgYmFjayB0byB0aGUgZmlyc3Qgc2xpZGUgYWZ0ZXIgcmVhY2hpbmcgdGhlIGxhc3Qgc2xpZGUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgW2xvb3BdPVwiZmFsc2VcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgbG9vcCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNhcm91c2VsIHdpbGwgYHBhdXNlYCB0aGUgc2xpZGUgdHJhbnNpdGlvbnMgb24gdXNlciBpbnRlcmFjdGlvbnMuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWNhcm91c2VsIFtwYXVzZV09XCJmYWxzZVwiPjwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHB1YmxpYyBwYXVzZSA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBjYXJvdXNlbCBzaG91bGQgcmVuZGVyIHRoZSBsZWZ0L3JpZ2h0IGBuYXZpZ2F0aW9uYCBidXR0b25zLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIFtuYXZpZ2F0aW9uXT1cImZhbHNlXCI+PC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcHVibGljIG5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgY2Fyb3VzZWwgc2hvdWxkIHJlbmRlciB0aGUgaW5kaWNhdG9ycy5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJvdXNlbCBbaW5kaWNhdG9yc109XCJmYWxzZVwiPjwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHB1YmxpYyBpbmRpY2F0b3JzID0gdHJ1ZTtcblxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgY2Fyb3VzZWwgaGFzIHZlcnRpY2FsIGFsaWdubWVudC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgW3ZlcnRpY2FsXT1cInRydWVcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgb3ZlcnJpZGUgdmVydGljYWwgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNhcm91c2VsIHNob3VsZCBzdXBwb3J0IGtleWJvYXJkIG5hdmlnYXRpb24uXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIFtrZXlib2FyZFN1cHBvcnRdPVwidHJ1ZVwiPjwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxOC4yLjAuXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHB1YmxpYyBrZXlib2FyZFN1cHBvcnQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNhcm91c2VsIHNob3VsZCBzdXBwb3J0IGdlc3R1cmVzLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIFtnZXN0dXJlc1N1cHBvcnRdPVwiZmFsc2VcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgZ2VzdHVyZXNTdXBwb3J0ID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBtYXhpbXVtIGluZGV4ZXMgdGhhdCBjYW4gYmUgc2hvd24uXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgNWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgW21heGltdW1JbmRpY2F0b3JzQ291bnRdPVwiMTBcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhpbXVtSW5kaWNhdG9yc0NvdW50ID0gNTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgZGlzcGxheSBtb2RlIG9mIGNhcm91c2VsIGluZGljYXRvcnMuIEl0IGNhbiBiZSB0b3Agb3IgYm90dG9tLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGJvdHRvbWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgaW5kaWNhdG9yc09yaWVudGF0aW9uPSd0b3AnPlxuICAgICAqIDxpZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4U2xpZGVDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaW5kaWNhdG9yc09yaWVudGF0aW9uOiBDYXJvdXNlbEluZGljYXRvcnNPcmllbnRhdGlvbiA9IENhcm91c2VsSW5kaWNhdG9yc09yaWVudGF0aW9uLmJvdHRvbTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgYW5pbWF0aW9uIHR5cGUgb2YgY2Fyb3VzZWwuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgc2xpZGVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIGFuaW1hdGlvblR5cGU9J25vbmUnPlxuICAgICAqIDxpZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4U2xpZGVDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgb3ZlcnJpZGUgYW5pbWF0aW9uVHlwZTogQ2Fyb3VzZWxBbmltYXRpb25UeXBlID0gQ2Fyb3VzZWxBbmltYXRpb25UeXBlLnNsaWRlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGNhcm91c2VsIGluZGljYXRvcnNcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jYXJvdXNlbC5pbmRpY2F0b3JUZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jYXJvdXNlbCAjY2Fyb3VzZWw+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDYXJvdXNlbEluZGljYXRvciBsZXQtc2xpZGU+XG4gICAgICogICAgICAgICA8aWd4LWljb24gKm5nSWY9XCJzbGlkZS5hY3RpdmVcIj5icmlnaHRuZXNzXzc8L2lneC1pY29uPlxuICAgICAqICAgICAgICAgPGlneC1pY29uICpuZ0lmPVwiIXNsaWRlLmFjdGl2ZVwiPmJyaWdodG5lc3NfNTwvaWd4LWljb24+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENhcm91c2VsSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIGluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBjYXJvdXNlbCBuZXh0IGJ1dHRvblxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNhcm91c2VsLm5leHRCdXR0b25UZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jYXJvdXNlbCAjY2Fyb3VzZWw+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDYXJvdXNlbE5leHRCdXR0b24gbGV0LWRpc2FibGVkPlxuICAgICAqICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbj1cImZhYlwiIGlneFJpcHBsZT1cIndoaXRlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICogICAgICAgICAgICAgIDxpZ3gtaWNvbiBuYW1lPVwiYWRkXCI+PC9pZ3gtaWNvbj5cbiAgICAgKiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q2Fyb3VzZWxOZXh0QnV0dG9uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIG5leHRCdXR0b25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgY2Fyb3VzZWwgcHJldmlvdXMgYnV0dG9uXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY2Fyb3VzZWwucHJldkJ1dHRvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNhcm91c2VsICNjYXJvdXNlbD5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENhcm91c2VsUHJldkJ1dHRvbiBsZXQtZGlzYWJsZWQ+XG4gICAgICogICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uPVwiZmFiXCIgaWd4UmlwcGxlPVwid2hpdGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgKiAgICAgICAgICAgICAgPGlneC1pY29uIG5hbWU9XCJyZW1vdmVcIj48L2lneC1pY29uPlxuICAgICAqICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDYXJvdXNlbFByZXZCdXR0b25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgcHJldkJ1dHRvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIGBzbGlkZXNgIGN1cnJlbnRseSBpbiB0aGUgY2Fyb3VzZWwuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzbGlkZXM6IFF1ZXJ5TGlzdDxJZ3hTbGlkZUNvbXBvbmVudD4gPSB0aGlzLmNhcm91c2VsLnNsaWRlcztcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4U2xpZGVDb21wb25lbnQpXG4gICAgcHVibGljIHNsaWRlczogUXVlcnlMaXN0PElneFNsaWRlQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciBhIHNsaWRlIHRyYW5zaXRpb24gaGFzIGhhcHBlbmVkLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZXMgdG8gdGhlIGBJZ3hDYXJvdXNlbENvbXBvbmVudGAgYW5kIGBJZ3hTbGlkZUNvbXBvbmVudGAgYXMgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIChzbGlkZUNoYW5nZWQpPVwic2xpZGVDaGFuZ2VkKCRldmVudClcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2xpZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJU2xpZGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgYWZ0ZXIgYSBzbGlkZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgY2Fyb3VzZWwuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneENhcm91c2VsQ29tcG9uZW50YCBhbmQgYElneFNsaWRlQ29tcG9uZW50YCBhcyBldmVudCBhcmd1bWVudHMuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgKHNsaWRlQWRkZWQpPVwic2xpZGVBZGRlZCgkZXZlbnQpXCI+PC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHNsaWRlQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElTbGlkZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciBhIHNsaWRlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2Fyb3VzZWwuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneENhcm91c2VsQ29tcG9uZW50YCBhbmQgYElneFNsaWRlQ29tcG9uZW50YCBhcyBldmVudCBhcmd1bWVudHMuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2Fyb3VzZWwgKHNsaWRlUmVtb3ZlZCk9XCJzbGlkZVJlbW92ZWQoJGV2ZW50KVwiPjwvaWd4LWNhcm91c2VsPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzbGlkZVJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElTbGlkZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciB0aGUgY2Fyb3VzZWwgaGFzIGJlZW4gcGF1c2VkLlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4Q2Fyb3VzZWxDb21wb25lbnRgIGFzIGFuIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIChjYXJvdXNlbFBhdXNlZCk9XCJjYXJvdXNlbFBhdXNlZCgkZXZlbnQpXCI+PC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIGNhcm91c2VsUGF1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hDYXJvdXNlbENvbXBvbmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciB0aGUgY2Fyb3VzZWwgaGFzIHJlc3VtZWQgdHJhbnNpdGlvbmluZyBiZXR3ZWVuIGBzbGlkZXNgLlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4Q2Fyb3VzZWxDb21wb25lbnRgIGFzIGFuIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIChjYXJvdXNlbFBsYXlpbmcpPVwiY2Fyb3VzZWxQbGF5aW5nKCRldmVudClcIj48L2lneC1jYXJvdXNlbD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgY2Fyb3VzZWxQbGF5aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hDYXJvdXNlbENvbXBvbmVudD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRJbmRpY2F0b3InLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIGRlZmF1bHRJbmRpY2F0b3I6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0TmV4dEJ1dHRvbicsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgZGVmYXVsdE5leHRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0UHJldkJ1dHRvbicsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgZGVmYXVsdFByZXZCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdpbmRpY2F0b3JzJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBfaW5kaWNhdG9yczogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcHBlZEJ5SW50ZXJhY3Rpb246IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGN1cnJlbnRJdGVtOiBJZ3hTbGlkZUNvbXBvbmVudDtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJldmlvdXNJdGVtOiBJZ3hTbGlkZUNvbXBvbmVudDtcbiAgICBwcml2YXRlIF9pbnRlcnZhbDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncyA9IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MoQ2Fyb3VzZWxSZXNvdXJjZVN0cmluZ3NFTik7XG4gICAgcHJpdmF0ZSBsYXN0SW50ZXJ2YWw6IGFueTtcbiAgICBwcml2YXRlIHBsYXlpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIGRpZmZlcjogSXRlcmFibGVEaWZmZXI8SWd4U2xpZGVDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBpbmNvbWluZ1NsaWRlOiBJZ3hTbGlkZUNvbXBvbmVudDtcbiAgICBwcml2YXRlIF9oYXNLZXlib2FyZEZvY3VzT25JbmRpY2F0b3JzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhY2Nlc3NvciB0aGF0IHNldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICogQnkgZGVmYXVsdCBpdCB1c2VzIEVOIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJQ2Fyb3VzZWxSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCByZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElDYXJvdXNlbFJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IGdldEluZGljYXRvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5pbmRpY2F0b3JUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEluZGljYXRvcjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBnZXQgZ2V0TmV4dEJ1dHRvblRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5uZXh0QnV0dG9uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHRCdXR0b25UZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHROZXh0QnV0dG9uXG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IGdldFByZXZCdXR0b25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMucHJldkJ1dHRvblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2QnV0dG9uVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0UHJldkJ1dHRvblxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGdldCBpbmRpY2F0b3JzQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbJ2lneC1jYXJvdXNlbC1pbmRpY2F0b3JzLS1mb2N1c2VkJ106IHRoaXMuX2hhc0tleWJvYXJkRm9jdXNPbkluZGljYXRvcnMsXG4gICAgICAgICAgICBbYGlneC1jYXJvdXNlbC1pbmRpY2F0b3JzLS0ke3RoaXMuaW5kaWNhdG9yc09yaWVudGF0aW9ufWBdOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dJbmRpY2F0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JzICYmIHRoaXMudG90YWwgPD0gdGhpcy5tYXhpbXVtSW5kaWNhdG9yc0NvdW50ICYmIHRoaXMudG90YWwgPiAwO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGdldCBzaG93SW5kaWNhdG9yc0xhYmVsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JzICYmIHRoaXMudG90YWwgPiB0aGlzLm1heGltdW1JbmRpY2F0b3JzQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IGdldENhcm91c2VsTGFiZWwoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmN1cnJlbnQgKyAxfSAke3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9jYXJvdXNlbF9vZn0gJHt0aGlzLnRvdGFsfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGBzbGlkZXNgIGluIHRoZSBjYXJvdXNlbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHNsaWRlQ291bnQgPSAgdGhpcy5jYXJvdXNlbC50b3RhbDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWwoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVzPy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBzbGlkZSBiZWluZyBjdXJyZW50bHkgc2hvd24uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjdXJyZW50U2xpZGVOdW1iZXIgPSAgdGhpcy5jYXJvdXNlbC5jdXJyZW50O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jdXJyZW50SXRlbSA/IDAgOiB0aGlzLmN1cnJlbnRJdGVtLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNhcm91c2VsIGlzIHBsYXlpbmcuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1BsYXlpbmcgPSAgdGhpcy5jYXJvdXNlbC5pc1BsYXlpbmc7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUGxheWluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zINCwIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY2Fyb3VzZWwgaXMgZGVzdHJveWVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNEZXN0cm95ZWQgPSAgdGhpcy5jYXJvdXNlbC5pc0Rlc3Ryb3llZDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNEZXN0cm95ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudCBpbiB0aGUgRE9NLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbmF0aXZlRWxlbWVudCA9ICB0aGlzLmNhcm91c2VsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRpbWUgYGludGVydmFsYCBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBzbGlkZSBjaGFuZ2VzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdGltZUludGVydmFsID0gdGhpcy5jYXJvdXNlbC5pbnRlcnZhbDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpbnRlcnZhbCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGltZSBgaW50ZXJ2YWxgIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNsaWRlIGNoYW5nZXMuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGNhcm91c2VsIHdpbGwgbm90IGNoYW5nZSBgc2xpZGVzYCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcm91c2VsIFtpbnRlcnZhbF09XCIxMDAwXCI+PC9pZ3gtY2Fyb3VzZWw+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2Fyb3VzZWxDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSArdmFsdWU7XG4gICAgICAgIHRoaXMucmVzdGFydEludGVydmFsKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICAgICAgQEluamVjdChJZ3hBbmd1bGFyQW5pbWF0aW9uU2VydmljZSkgYW5pbWF0aW9uU2VydmljZTogQW5pbWF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwbGF0Zm9ybVV0aWw6IFBsYXRmb3JtVXRpbCxcbiAgICAgICAgcHJpdmF0ZSBkaXI6IElneERpcmVjdGlvbmFsaXR5LFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnlcbiAgICApIHtcbiAgICAgICAgc3VwZXIoYW5pbWF0aW9uU2VydmljZSwgY2RyKTtcbiAgICAgICAgdGhpcy5kaWZmZXIgPSB0aGlzLml0ZXJhYmxlRGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gICAgfVxuXG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dyaWdodCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93UmlnaHQoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdXBwb3J0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93bGVmdCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93TGVmdChldmVudCkge1xuICAgICAgICBpZiAodGhpcy5rZXlib2FyZFN1cHBvcnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnByZXYoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3RhcCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uVGFwKGV2ZW50KSB7XG4gICAgICAgIC8vIHBsYXkgcGF1c2Ugb25seSB3aGVuIHRhcCBvbiBzbGlkZVxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2lneC1zbGlkZScpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXVzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BwZWRCeUludGVyYWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RvcHBlZEJ5SW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5ob21lJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duSG9tZShldmVudCkge1xuICAgICAgICBpZiAodGhpcy5rZXlib2FyZFN1cHBvcnQgJiYgdGhpcy5zbGlkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVzLmZpcnN0LmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVuZCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkVuZChldmVudCkge1xuICAgICAgICBpZiAodGhpcy5rZXlib2FyZFN1cHBvcnQgJiYgdGhpcy5zbGlkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVzLmxhc3QuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxuICAgIHB1YmxpYyBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhdXNlICYmIHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3BwZWRCeUludGVyYWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICAgIHB1YmxpYyBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWRCeUludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigncGFubGVmdCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uUGFuTGVmdChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIHRoaXMucGFuKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigncGFucmlnaHQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhblJpZ2h0KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5wYW4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW51cCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uUGFuVXAoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIHRoaXMucGFuKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigncGFuZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uUGFuRG93bihldmVudCkge1xuICAgICAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5wYW4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BhbmVuZCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uUGFuRW5kKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5nZXN0dXJlc1N1cHBvcnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHNsaWRlU2l6ZSA9IHRoaXMudmVydGljYWxcbiAgICAgICAgICAgID8gdGhpcy5jdXJyZW50SXRlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodFxuICAgICAgICAgICAgOiB0aGlzLmN1cnJlbnRJdGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IHBhbk9mZnNldCA9IChzbGlkZVNpemUgLyAxMDAwKTtcbiAgICAgICAgY29uc3QgZXZlbnREZWx0YSA9IHRoaXMudmVydGljYWwgPyBldmVudC5kZWx0YVkgOiBldmVudC5kZWx0YVg7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gTWF0aC5hYnMoZXZlbnREZWx0YSkgKyBwYW5PZmZzZXQgPCBzbGlkZVNpemUgPyBNYXRoLmFicyhldmVudERlbHRhKSA6IHNsaWRlU2l6ZSAtIHBhbk9mZnNldDtcbiAgICAgICAgY29uc3QgdmVsb2NpdHkgPSBNYXRoLmFicyhldmVudC52ZWxvY2l0eSk7XG4gICAgICAgIHRoaXMucmVzZXRTbGlkZVN0eWxlcyh0aGlzLmN1cnJlbnRJdGVtKTtcbiAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdTbGlkZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldFNsaWRlU3R5bGVzKHRoaXMuaW5jb21pbmdTbGlkZSk7XG4gICAgICAgICAgICBpZiAoc2xpZGVTaXplIC8gMiA8IGRlbHRhIHx8IHZlbG9jaXR5ID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdTbGlkZS5kaXJlY3Rpb24gPSBldmVudERlbHRhIDwgMCA/IERpcmVjdGlvbi5ORVhUIDogRGlyZWN0aW9uLlBSRVY7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNvbWluZ1NsaWRlLnByZXZpb3VzID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGlvblBvc2l0aW9uID0gdGhpcy5hbmltYXRpb25UeXBlID09PSBDYXJvdXNlbEFuaW1hdGlvblR5cGUuZmFkZSA/XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhIC8gc2xpZGVTaXplIDogKHNsaWRlU2l6ZSAtIGRlbHRhKSAvIHNsaWRlU2l6ZTtcblxuICAgICAgICAgICAgICAgIGlmICh2ZWxvY2l0eSA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdEdXJhdGlvbiA9IHRoaXMuZGVmYXVsdEFuaW1hdGlvbkR1cmF0aW9uIC8gdmVsb2NpdHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdTbGlkZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtLmRpcmVjdGlvbiA9IGV2ZW50RGVsdGEgPiAwID8gRGlyZWN0aW9uLk5FWFQgOiBEaXJlY3Rpb24uUFJFVjtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzSXRlbSA9IHRoaXMuaW5jb21pbmdTbGlkZTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzSXRlbS5wcmV2aW91cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb25Qb3NpdGlvbiA9IHRoaXMuYW5pbWF0aW9uVHlwZSA9PT0gQ2Fyb3VzZWxBbmltYXRpb25UeXBlLmZhZGUgP1xuICAgICAgICAgICAgICAgICAgICBNYXRoLmFicygoc2xpZGVTaXplIC0gZGVsdGEpIC8gc2xpZGVTaXplKSA6IGRlbHRhIC8gc2xpZGVTaXplO1xuICAgICAgICAgICAgICAgIHRoaXMucGxheUFuaW1hdGlvbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWRCeUludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5zbGlkZXMuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4U2xpZGVDb21wb25lbnQ+KSA9PiB0aGlzLmluaXRTbGlkZXMoY2hhbmdlKSk7XG5cbiAgICAgICAgdGhpcy5pbml0U2xpZGVzKHRoaXMuc2xpZGVzKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubGFzdEludGVydmFsKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMubGFzdEludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGhhbmRsZUtleWRvd25QcmV2KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtVXRpbC5pc0FjdGl2YXRpb25LZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5wcmV2KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBoYW5kbGVLZXlkb3duTmV4dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybVV0aWwuaXNBY3RpdmF0aW9uS2V5KGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgaGFuZGxlS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gdGhpcy5wbGF0Zm9ybVV0aWwuS0VZTUFQLlRBQikge1xuICAgICAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRGb2N1c09uSW5kaWNhdG9ycyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBoYW5kbGVGb2N1c091dChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpZ3gtY2Fyb3VzZWwtaW5kaWNhdG9yc19faW5kaWNhdG9yJykpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhc0tleWJvYXJkRm9jdXNPbkluZGljYXRvcnMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGhhbmRsZUNsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYXNLZXlib2FyZEZvY3VzT25JbmRpY2F0b3JzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5rZXlib2FyZFN1cHBvcnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGtleSB9ID0gZXZlbnQ7XG4gICAgICAgIGNvbnN0IHNsaWRlcyA9IHRoaXMuc2xpZGVzLnRvQXJyYXkoKTtcblxuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSB0aGlzLnBsYXRmb3JtVXRpbC5LRVlNQVAuQVJST1dfTEVGVDpcbiAgICAgICAgICAgICAgICB0aGlzLmRpci5ydGwgPyB0aGlzLm5leHQoKSA6IHRoaXMucHJldigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB0aGlzLnBsYXRmb3JtVXRpbC5LRVlNQVAuQVJST1dfUklHSFQ6XG4gICAgICAgICAgICAgICAgdGhpcy5kaXIucnRsID8gdGhpcy5wcmV2KCkgOiB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybVV0aWwuS0VZTUFQLkhPTUU6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmRpci5ydGwgPyBsYXN0KHNsaWRlcykgOiBmaXJzdChzbGlkZXMpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybVV0aWwuS0VZTUFQLkVORDpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0KHRoaXMuZGlyLnJ0bCA/IGZpcnN0KHNsaWRlcykgOiBsYXN0KHNsaWRlcykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbmRpY2F0b3JzRWxlbWVudHNbdGhpcy5jdXJyZW50XS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2xpZGUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgYGluZGV4YCBvciBudWxsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgc2xpZGUxID0gIHRoaXMuY2Fyb3VzZWwuZ2V0KDEpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogSWd4U2xpZGVDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXMuZmluZCgoc2xpZGUpID0+IHNsaWRlLmluZGV4ID09PSBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBzbGlkZSB0byB0aGUgY2Fyb3VzZWwuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY2Fyb3VzZWwuYWRkKG5ld1NsaWRlKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGQoc2xpZGU6IElneFNsaWRlQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IG5ld1NsaWRlcyA9IHRoaXMuc2xpZGVzLnRvQXJyYXkoKTtcbiAgICAgICAgbmV3U2xpZGVzLnB1c2goc2xpZGUpO1xuICAgICAgICB0aGlzLnNsaWRlcy5yZXNldChuZXdTbGlkZXMpO1xuICAgICAgICB0aGlzLnNsaWRlcy5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc2xpZGUgZnJvbSB0aGUgY2Fyb3VzZWwuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY2Fyb3VzZWwucmVtb3ZlKHNsaWRlKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmUoc2xpZGU6IElneFNsaWRlQ29tcG9uZW50KSB7XG4gICAgICAgIGlmIChzbGlkZSAmJiBzbGlkZSA9PT0gdGhpcy5nZXQoc2xpZGUuaW5kZXgpKSB7IC8vIGNoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgc2xpZGUgZm9yIGRlbGV0ZSBpcyBwcmVzZW50IGluIHRoZSBjYXJvdXNlbFxuICAgICAgICAgICAgY29uc3QgbmV3U2xpZGVzID0gdGhpcy5zbGlkZXMudG9BcnJheSgpO1xuICAgICAgICAgICAgbmV3U2xpZGVzLnNwbGljZShzbGlkZS5pbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLnNsaWRlcy5yZXNldChuZXdTbGlkZXMpO1xuICAgICAgICAgICAgdGhpcy5zbGlkZXMubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLaWNrcyBpbiBhIHRyYW5zaXRpb24gZm9yIGEgZ2l2ZW4gc2xpZGUgd2l0aCBhIGdpdmVuIGBkaXJlY3Rpb25gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNhcm91c2VsLnNlbGVjdCh0aGlzLmNhcm91c2VsLmdldCgyKSwgRGlyZWN0aW9uLk5FWFQpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdChzbGlkZTogSWd4U2xpZGVDb21wb25lbnQsIGRpcmVjdGlvbjogRGlyZWN0aW9uID0gRGlyZWN0aW9uLk5PTkUpIHtcbiAgICAgICAgaWYgKHNsaWRlICYmIHNsaWRlICE9PSB0aGlzLmN1cnJlbnRJdGVtKSB7XG4gICAgICAgICAgICBzbGlkZS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICAgICAgICBzbGlkZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNpdGlvbnMgdG8gdGhlIG5leHQgc2xpZGUgaW4gdGhlIGNhcm91c2VsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNhcm91c2VsLm5leHQoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0KCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0TmV4dEluZGV4KCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmICF0aGlzLmxvb3ApIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdCh0aGlzLmdldChpbmRleCksIERpcmVjdGlvbi5ORVhUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2l0aW9ucyB0byB0aGUgcHJldmlvdXMgc2xpZGUgaW4gdGhlIGNhcm91c2VsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNhcm91c2VsLnByZXYoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBJZ3hDYXJvdXNlbENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2KCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0UHJldkluZGV4KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvb3AgJiYgaW5kZXggPT09IHRoaXMudG90YWwgLSAxKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3QodGhpcy5nZXQoaW5kZXgpLCBEaXJlY3Rpb24uUFJFVik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lcyBwbGF5aW5nIG9mIHRoZSBjYXJvdXNlbCBpZiBpbiBwYXVzZWQgc3RhdGUuXG4gICAgICogTm8gb3BlcmF0aW9uIG90aGVyd2lzZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jYXJvdXNlbC5wbGF5KCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHBsYXkoKSB7XG4gICAgICAgIGlmICghdGhpcy5wbGF5aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jYXJvdXNlbFBsYXlpbmcuZW1pdCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucmVzdGFydEludGVydmFsKCk7XG4gICAgICAgICAgICB0aGlzLnN0b3BwZWRCeUludGVyYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyBzbGlkZSB0cmFuc2l0aW9ucyBpZiB0aGUgYHBhdXNlYCBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBObyBvcGVyYXRpb24gb3RoZXJ3aXNlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgdGhpcy5jYXJvdXNlbC5zdG9wKCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIElneENhcm91c2VsQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhdXNlKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2Fyb3VzZWxQYXVzZWQuZW1pdCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRJbnRlcnZhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFByZXZpb3VzRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzSXRlbS5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRDdXJyZW50RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJdGVtLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEludGVydmFsKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0SW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5sYXN0SW50ZXJ2YWwpO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXN0YXJ0SW50ZXJ2YWwoKSB7XG4gICAgICAgIHRoaXMucmVzZXRJbnRlcnZhbCgpO1xuXG4gICAgICAgIGlmICghaXNOYU4odGhpcy5pbnRlcnZhbCkgJiYgdGhpcy5pbnRlcnZhbCA+IDAgJiYgdGhpcy5wbGF0Zm9ybVV0aWwuaXNCcm93c2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWNrID0gK3RoaXMuaW50ZXJ2YWw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWluZyAmJiB0aGlzLnRvdGFsICYmICFpc05hTih0aWNrKSAmJiB0aWNrID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzLmludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGdldCBuZXh0QnV0dG9uRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5sb29wICYmIHRoaXMuY3VycmVudCA9PT0gKHRoaXMudG90YWwgLSAxKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBnZXQgcHJldkJ1dHRvbkRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMubG9vcCAmJiB0aGlzLmN1cnJlbnQgPT09IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaW5kaWNhdG9yc0VsZW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kaWNhdG9ycy50b0FycmF5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmIChmb2N1c2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2lneC1jYXJvdXNlbC1pbmRpY2F0b3JzX19pbmRpY2F0b3InKSkge1xuICAgICAgICAgICAgdGhpcy5pbmRpY2F0b3JzRWxlbWVudHNbdGhpcy5jdXJyZW50XS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU2xpZGVFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5leHRJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKHRoaXMuY3VycmVudCArIDEpICUgdGhpcy50b3RhbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByZXZJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50IC0gMSA8IDAgPyB0aGlzLnRvdGFsIC0gMSA6IHRoaXMuY3VycmVudCAtIDE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldFNsaWRlU3R5bGVzKHNsaWRlOiBJZ3hTbGlkZUNvbXBvbmVudCkge1xuICAgICAgICBzbGlkZS5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICBzbGlkZS5uYXRpdmVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhbihldmVudCkge1xuICAgICAgICBjb25zdCBzbGlkZVNpemUgPSB0aGlzLnZlcnRpY2FsXG4gICAgICAgICAgICA/IHRoaXMuY3VycmVudEl0ZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgIDogdGhpcy5jdXJyZW50SXRlbS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBwYW5PZmZzZXQgPSAoc2xpZGVTaXplIC8gMTAwMCk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy52ZXJ0aWNhbCA/IGV2ZW50LmRlbHRhWSA6IGV2ZW50LmRlbHRhWDtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkZWx0YSA8IDAgPyB0aGlzLmdldE5leHRJbmRleCgpIDogdGhpcy5nZXRQcmV2SW5kZXgoKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZGVsdGEgPCAwID8gc2xpZGVTaXplICsgZGVsdGEgOiAtc2xpZGVTaXplICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKCF0aGlzLmdlc3R1cmVzU3VwcG9ydCB8fCBldmVudC5pc0ZpbmFsIHx8IE1hdGguYWJzKGRlbHRhKSArIHBhbk9mZnNldCA+PSBzbGlkZVNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5sb29wICYmICgodGhpcy5jdXJyZW50ID09PSAwICYmIGRlbHRhID4gMCkgfHwgKHRoaXMuY3VycmVudCA9PT0gdGhpcy50b3RhbCAtIDEgJiYgZGVsdGEgPCAwKSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdTbGlkZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcHBlZEJ5SW50ZXJhY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcmV2aW91c0l0ZW0gJiYgdGhpcy5wcmV2aW91c0l0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNJdGVtLnByZXZpb3VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hBbmltYXRpb25zKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdTbGlkZSkge1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLmluY29taW5nU2xpZGUuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0U2xpZGVTdHlsZXModGhpcy5pbmNvbWluZ1NsaWRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nU2xpZGUucHJldmlvdXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nU2xpZGUgPSB0aGlzLmdldChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluY29taW5nU2xpZGUgPSB0aGlzLmdldChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmNvbWluZ1NsaWRlLnByZXZpb3VzID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25UeXBlID09PSBDYXJvdXNlbEFuaW1hdGlvblR5cGUuZmFkZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbS5uYXRpdmVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSBgJHtNYXRoLmFicyhvZmZzZXQpIC8gc2xpZGVTaXplfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gdGhpcy52ZXJ0aWNhbFxuICAgICAgICAgICAgICAgID8gYHRyYW5zbGF0ZVkoJHtkZWx0YX1weClgXG4gICAgICAgICAgICAgICAgOiBgdHJhbnNsYXRlWCgke2RlbHRhfXB4KWA7XG4gICAgICAgICAgICB0aGlzLmluY29taW5nU2xpZGUubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSB0aGlzLnZlcnRpY2FsXG4gICAgICAgICAgICAgICAgPyBgdHJhbnNsYXRlWSgke29mZnNldH1weClgXG4gICAgICAgICAgICAgICAgOiBgdHJhbnNsYXRlWCgke29mZnNldH1weClgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bnN1YnNjcmliZXIoc2xpZGU6IElneFNsaWRlQ29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiBtZXJnZSh0aGlzLmRlc3Ryb3kkLCBzbGlkZS5pc0Rlc3Ryb3llZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblNsaWRlQWN0aXZhdGVkKHNsaWRlOiBJZ3hTbGlkZUNvbXBvbmVudCkge1xuICAgICAgICBpZiAoc2xpZGUuYWN0aXZlICYmIHNsaWRlICE9PSB0aGlzLmN1cnJlbnRJdGVtKSB7XG4gICAgICAgICAgICBpZiAoc2xpZGUuZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uTk9ORSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gc2xpZGUuaW5kZXg7XG4gICAgICAgICAgICAgICAgc2xpZGUuZGlyZWN0aW9uID0gbmV3SW5kZXggPiB0aGlzLmN1cnJlbnQgPyBEaXJlY3Rpb24uTkVYVCA6IERpcmVjdGlvbi5QUkVWO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50SXRlbSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzSXRlbSAmJiB0aGlzLnByZXZpb3VzSXRlbS5wcmV2aW91cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzSXRlbS5wcmV2aW91cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtLmRpcmVjdGlvbiA9IHNsaWRlLmRpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0l0ZW0gPSB0aGlzLmN1cnJlbnRJdGVtO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW0gPSBzbGlkZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJBbmltYXRpb25zKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW0gPSBzbGlkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2xpZGVDaGFuZ2VkLmVtaXQoeyBjYXJvdXNlbDogdGhpcywgc2xpZGUgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc3RhcnRJbnRlcnZhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGZpbmlzaEFuaW1hdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvblN0YXJ0ZWQodGhpcy5sZWF2ZUFuaW1hdGlvblBsYXllcikpIHtcbiAgICAgICAgICAgIHRoaXMubGVhdmVBbmltYXRpb25QbGF5ZXIuZmluaXNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25TdGFydGVkKHRoaXMuZW50ZXJBbmltYXRpb25QbGF5ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmVudGVyQW5pbWF0aW9uUGxheWVyLmZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0U2xpZGVzKGNoYW5nZTogUXVlcnlMaXN0PElneFNsaWRlQ29tcG9uZW50Pikge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5kaWZmZXIuZGlmZihjaGFuZ2UudG9BcnJheSgpKTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVzLnJlZHVjZSgoYW55LCBjLCBpbmQpID0+IGMuaW5kZXggPSBpbmQsIDApOyAvLyByZXNldCBzbGlkZXMgaW5kZXhlc1xuICAgICAgICAgICAgZGlmZi5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneFNsaWRlQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWRlID0gcmVjb3JkLml0ZW07XG4gICAgICAgICAgICAgICAgc2xpZGUudG90YWwgPSB0aGlzLnRvdGFsO1xuICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVBZGRlZC5lbWl0KHsgY2Fyb3VzZWw6IHRoaXMsIHNsaWRlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChzbGlkZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbSA9IHNsaWRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzbGlkZS5hY3RpdmVDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZXIoc2xpZGUpKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25TbGlkZUFjdGl2YXRlZChzbGlkZSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRpZmYuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneFNsaWRlQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWRlID0gcmVjb3JkLml0ZW07XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZVJlbW92ZWQuZW1pdCh7IGNhcm91c2VsOiB0aGlzLCBzbGlkZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc2xpZGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNsaWRlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtID0gdGhpcy5nZXQoc2xpZGUuaW5kZXggPCB0aGlzLnRvdGFsID8gc2xpZGUuaW5kZXggOiB0aGlzLnRvdGFsIC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2xpZGVzU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNsaWRlc1NlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm1VdGlsLmlzQnJvd3Nlcikge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVNsaWRlcyA9IHRoaXMuc2xpZGVzLmZpbHRlcihzbGlkZSA9PiBzbGlkZS5hY3RpdmUgJiYgc2xpZGUuaW5kZXggIT09IHRoaXMuY3VycmVudEl0ZW0uaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVTbGlkZXMuZm9yRWFjaChzbGlkZSA9PiBzbGlkZS5hY3RpdmUgPSBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRvdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVzLmZpcnN0LmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGxheSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBmb2N1c1NsaWRlRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVhdmVBbmltYXRpb25QbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubGVhdmVBbmltYXRpb25QbGF5ZXIuYW5pbWF0aW9uRW5kXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlcy5maW5kKHMgPT4gcy5hY3RpdmUpLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnNsaWRlcy5maW5kKHMgPT4gcy5hY3RpdmUpLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgY2Fyb3VzZWw6IElneENhcm91c2VsQ29tcG9uZW50O1xuICAgIHNsaWRlOiBJZ3hTbGlkZUNvbXBvbmVudDtcbn1cbiIsIjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEluZGljYXRvciBsZXQtc2xpZGU+XG4gICAgPGRpdiBjbGFzcz1cImlneC1uYXYtZG90XCJcbiAgICAgICAgW2NsYXNzLmlneC1uYXYtZG90LS1hY3RpdmVdPVwic2xpZGUuYWN0aXZlXCI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHROZXh0QnV0dG9uPlxuICAgIDxpZ3gtaWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImNhcm91c2VsX25leHRcIlxuICAgICAgICBjbGFzcz1cImlneC1uYXYtYXJyb3dcIj5cbiAgICA8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0UHJldkJ1dHRvbj5cbiAgICA8aWd4LWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgZmFtaWx5PVwiZGVmYXVsdFwiIG5hbWU9XCJjYXJvdXNlbF9wcmV2XCJcbiAgICAgICAgY2xhc3M9XCJpZ3gtbmF2LWFycm93XCI+XG4gICAgPC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxidXR0b24gKm5nSWY9XCJuYXZpZ2F0aW9uICYmIHNsaWRlcy5sZW5ndGhcIlxuICAgIGlneEJ1dHRvblxuICAgIGNsYXNzPVwiaWd4LWNhcm91c2VsX19hcnJvdy0tcHJldlwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXNvdXJjZVN0cmluZ3MuaWd4X2Nhcm91c2VsX3ByZXZpb3VzX3NsaWRlXCJcbiAgICBbZGlzYWJsZWRdPVwicHJldkJ1dHRvbkRpc2FibGVkXCJcbiAgICAoY2xpY2spPVwicHJldigpXCJcbiAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duUHJldigkZXZlbnQpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldFByZXZCdXR0b25UZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJldkJ1dHRvbkRpc2FibGVkfTtcIj48L25nLWNvbnRhaW5lcj5cbjwvYnV0dG9uPlxuXG48YnV0dG9uICpuZ0lmPVwibmF2aWdhdGlvbiAmJiBzbGlkZXMubGVuZ3RoXCJcbiAgICBpZ3hCdXR0b25cbiAgICBjbGFzcz1cImlneC1jYXJvdXNlbF9fYXJyb3ctLW5leHRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVzb3VyY2VTdHJpbmdzLmlneF9jYXJvdXNlbF9uZXh0X3NsaWRlXCJcbiAgICBbZGlzYWJsZWRdPVwibmV4dEJ1dHRvbkRpc2FibGVkXCJcbiAgICAoY2xpY2spPVwibmV4dCgpXCJcbiAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duTmV4dCgkZXZlbnQpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldE5leHRCdXR0b25UZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogbmV4dEJ1dHRvbkRpc2FibGVkfTtcIj48L25nLWNvbnRhaW5lcj5cbjwvYnV0dG9uPlxuXG48ZGl2ICpuZ0lmPVwic2hvd0luZGljYXRvcnNcIiBbbmdDbGFzc109XCJpbmRpY2F0b3JzQ2xhc3NcIiBbYXR0ci5yb2xlXT1cIid0YWJsaXN0J1wiIChrZXl1cCk9XCJoYW5kbGVLZXlVcCgkZXZlbnQpXCIgKGZvY3Vzb3V0KT1cImhhbmRsZUZvY3VzT3V0KCRldmVudClcIiAoY2xpY2spPVwiaGFuZGxlQ2xpY2soKVwiIChrZXlkb3duKT1cImhhbmRsZUtleWRvd24oJGV2ZW50KVwiPlxuICAgIDxkaXYgI2luZGljYXRvcnMgKm5nRm9yPVwibGV0IHNsaWRlIG9mIHNsaWRlc1wiXG4gICAgICAgIGNsYXNzPVwiaWd4LWNhcm91c2VsLWluZGljYXRvcnNfX2luZGljYXRvclwiXG4gICAgICAgIChjbGljayk9XCJzZWxlY3Qoc2xpZGUpXCJcbiAgICAgICAgW2lkXT1cIid0YWItJysgc2xpZGUuaW5kZXggKyAnLScgKyB0b3RhbFwiXG4gICAgICAgIFthdHRyLnJvbGVdPVwiJ3RhYidcIlxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCJzbGlkZS5hY3RpdmUgPyAwIDogLTFcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJlc291cmNlU3RyaW5ncy5pZ3hfY2Fyb3VzZWxfc2xpZGUgKyAnICcgKyAoc2xpZGUuaW5kZXggKyAxKSArICcgJyArIHJlc291cmNlU3RyaW5ncy5pZ3hfY2Fyb3VzZWxfb2YgKyAnICcgKyB0aGlzLnRvdGFsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCIncGFuZWwtJyArIHNsaWRlLmluZGV4XCJcbiAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJzbGlkZS5hY3RpdmVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldEluZGljYXRvclRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBzbGlkZX07XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cInNob3dJbmRpY2F0b3JzTGFiZWxcIiBbbmdDbGFzc109XCJpbmRpY2F0b3JzQ2xhc3NcIiBjbGFzcz1cImlneC1jYXJvdXNlbC1sYWJlbC1pbmRpY2F0b3JcIj5cbiAgICA8c3BhbiBbaWRdPVwibGFiZWxJZFwiIGNsYXNzPVwiaWd4LWNhcm91c2VsX19sYWJlbFwiPnt7Z2V0Q2Fyb3VzZWxMYWJlbH19PC9zcGFuPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtY2Fyb3VzZWxfX2lubmVyXCIgW2F0dHIuYXJpYS1saXZlXT1cIiFpbnRlcnZhbCB8fCBzdG9wcGVkQnlJbnRlcmFjdGlvbiA/ICdwb2xpdGUnIDogJ29mZidcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==