igniteui-angular 18.1.0-beta.1 → 18.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/esm2022/lib/combo/combo.common.mjs +8 -8
  2. package/esm2022/lib/combo/combo.component.mjs +3 -3
  3. package/esm2022/lib/grids/headers/grid-header-group.component.mjs +3 -3
  4. package/esm2022/lib/grids/state-base.directive.mjs +1 -1
  5. package/esm2022/lib/grids/state.directive.mjs +5 -5
  6. package/esm2022/lib/icon/icon.service.mjs +3 -3
  7. package/esm2022/lib/navigation-drawer/navigation-drawer.directives.mjs +22 -4
  8. package/esm2022/lib/select/select.component.mjs +8 -8
  9. package/esm2022/lib/services/overlay/overlay.mjs +27 -16
  10. package/esm2022/lib/services/overlay/utilities.mjs +1 -1
  11. package/esm2022/lib/services/public_api.mjs +6 -6
  12. package/esm2022/lib/simple-combo/simple-combo.component.mjs +3 -3
  13. package/esm2022/lib/tree/tree-node/tree-node.component.mjs +3 -3
  14. package/esm2022/lib/tree/tree.component.mjs +5 -5
  15. package/fesm2022/igniteui-angular.mjs +118 -89
  16. package/fesm2022/igniteui-angular.mjs.map +1 -1
  17. package/lib/core/styles/components/stepper/_stepper-theme.scss +7 -7
  18. package/lib/grids/state-base.directive.d.ts +0 -1
  19. package/lib/grids/state.directive.d.ts +4 -3
  20. package/lib/icon/icon.service.d.ts +1 -1
  21. package/lib/navigation-drawer/navigation-drawer.directives.d.ts +21 -3
  22. package/lib/services/overlay/overlay.d.ts +16 -6
  23. package/lib/services/overlay/utilities.d.ts +7 -1
  24. package/lib/services/public_api.d.ts +5 -5
  25. package/package.json +2 -2
  26. package/styles/igniteui-angular-dark.css +1 -1
  27. package/styles/igniteui-angular.css +1 -1
  28. package/styles/igniteui-bootstrap-dark.css +1 -1
  29. package/styles/igniteui-bootstrap-light.css +1 -1
  30. package/styles/igniteui-dark-green.css +1 -1
  31. package/styles/igniteui-fluent-dark-excel.css +1 -1
  32. package/styles/igniteui-fluent-dark-word.css +1 -1
  33. package/styles/igniteui-fluent-dark.css +1 -1
  34. package/styles/igniteui-fluent-light-excel.css +1 -1
  35. package/styles/igniteui-fluent-light-word.css +1 -1
  36. package/styles/igniteui-fluent-light.css +1 -1
  37. package/styles/igniteui-indigo-dark.css +1 -1
  38. package/styles/igniteui-indigo-light.css +1 -1
  39. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  40. package/styles/maps/igniteui-angular.css.map +1 -1
  41. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  42. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  43. package/styles/maps/igniteui-dark-green.css.map +1 -1
  44. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  45. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  46. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  47. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  48. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  49. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  50. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  51. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -585,13 +585,13 @@ export class IgxTreeNodeComponent extends ToggleAnimationPlayer {
585
585
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: IgxTreeNodeComponent, deps: [{ token: IGX_TREE_COMPONENT }, { token: i2.IgxTreeSelectionService }, { token: i3.IgxTreeService }, { token: i1.IgxTreeNavigationService }, { token: i0.ChangeDetectorRef }, { token: IgxAngularAnimationService }, { token: i0.ElementRef }, { token: IGX_TREE_NODE_COMPONENT, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); }
586
586
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.0.5", type: IgxTreeNodeComponent, isStandalone: true, selector: "igx-tree-node", inputs: { data: "data", loading: ["loading", "loading", booleanAttribute], resourceStrings: "resourceStrings", active: ["active", "active", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], selected: ["selected", "selected", booleanAttribute], expanded: ["expanded", "expanded", booleanAttribute] }, outputs: { selectedChange: "selectedChange", expandedChange: "expandedChange" }, host: { properties: { "class.igx-tree-node--disabled": "this.disabled", "class.igx-tree-node": "this.cssClass", "attr.role": "this.role" } }, providers: [
587
587
  { provide: IGX_TREE_NODE_COMPONENT, useExisting: IgxTreeNodeComponent }
588
- ], queries: [{ propertyName: "linkChildren", predicate: IgxTreeNodeLinkDirective, read: ElementRef }, { propertyName: "_children", predicate: IGX_TREE_NODE_COMPONENT, read: IGX_TREE_NODE_COMPONENT }, { propertyName: "allChildren", predicate: IGX_TREE_NODE_COMPONENT, descendants: true, read: IGX_TREE_NODE_COMPONENT }], viewQueries: [{ propertyName: "header", first: true, predicate: ["ghostTemplate"], descendants: true, read: ElementRef }, { propertyName: "_defaultExpandIndicatorTemplate", first: true, predicate: ["defaultIndicator"], descendants: true, read: TemplateRef, static: true }, { propertyName: "childrenContainer", first: true, predicate: ["childrenContainer"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<ng-template #noDragTemplate>\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n</ng-template>\n\n<!-- Will switch templates depending on dragDrop -->\n<ng-template *ngTemplateOutlet=\"noDragTemplate\">\n</ng-template>\n\n<div #childrenContainer\n *ngIf=\"expanded && !loading\"\n class=\"igx-tree-node__group\"\n role=\"group\"\n>\n <ng-content select=\"igx-tree-node\"></ng-content>\n</div>\n\n\n<ng-template #defaultIndicator>\n <igx-icon\n [attr.aria-label]=\"expanded ? resourceStrings.igx_collapse : resourceStrings.igx_expand\"\n [name]=\"!expanded ? 'expand' : 'collapse'\"\n family=\"tree\"\n >\n </igx-icon>\n</ng-template>\n\n<!-- separated in a template in case this ever needs to be templatable -->\n<ng-template #selectMarkerTemplate>\n <igx-checkbox [checked]=\"selected\" [disabled]=\"disabled\" [readonly]=\"true\" [indeterminate]=\"indeterminate\" [tabindex]=\"-1\">\n </igx-checkbox>\n</ng-template>\n\n<ng-template #headerTemplate>\n <div #ghostTemplate class=\"igx-tree-node__wrapper\"\n [attr.role]=\"role\"\n [tabIndex]=\"tabIndex\"\n [ngClass]=\"{\n 'igx-tree-node__wrapper--selected': selected,\n 'igx-tree-node__wrapper--active' : this.active,\n 'igx-tree-node__wrapper--focused' : this.focused,\n 'igx-tree-node__wrapper--disabled' : this.disabled\n }\"\n (pointerdown)=\"onPointerDown($event)\"\n (focus)=\"handleFocus()\"\n (blur)=\"clearFocus()\"\n >\n <div aria-hidden=\"true\">\n <span *ngFor=\"let item of [].constructor(level)\"\n aria-hidden=\"true\"\n class=\"igx-tree-node__spacer\"\n ></span>\n </div>\n\n <!-- Expand/Collapse indicator -->\n <span *ngIf=\"!loading\"\n class=\"igx-tree-node__toggle-button\"\n [ngClass]=\"{ 'igx-tree-node__toggle-button--hidden': !_children?.length }\"\n (click)=\"indicatorClick()\"\n >\n <ng-container *ngTemplateOutlet=\"expandIndicatorTemplate, context: { $implicit: expanded }\">\n </ng-container>\n </span>\n <span *ngIf=\"loading\"\n class=\"igx-tree-node__toggle-button\"\n >\n \t<igx-circular-bar\n \t[animate]=\"false\"\n \t[indeterminate]=\"true\"\n \t[textVisibility]=\"false\"\n \t>\n \t</igx-circular-bar>\n </span>\n\n <!-- Item selection -->\n <div *ngIf=\"showSelectors\"\n class=\"igx-tree-node__select\"\n (pointerdown)=\"onSelectorPointerDown($event)\"\n (click)=\"onSelectorClick($event)\">\n <ng-container *ngTemplateOutlet=\"selectMarkerTemplate\">\n </ng-container>\n </div>\n\n <div class=\"igx-tree-node__content\">\n <!-- Ghost content -->\n <ng-content></ng-content>\n </div>\n </div>\n\n <!-- Buffer element for 'move after' when D&D is implemented-->\n <div class=\"igx-tree-node__drop-indicator\">\n <span aria-hidden=\"true\" class=\"igx-tree-node__spacer\" *ngFor=\"let item of [].constructor(level)\"></span>\n <!-- style rules target this div, do not delete it -->\n <div></div>\n </div>\n</ng-template>\n\n<ng-template #dragTemplate>\n <!-- Drag drop goes here\n igxDrop\n #dropRef=\"drop\"\n [igxNodeDrag]=\"this\"\n (dragStart)=\"logDrop(dropRef)\"\n (leave)=\"emitLeave()\"\n (enter)=\"emitEnter()\" -->\n <div class=\"igx-tree-node__drag-wrapper\">\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }] }); }
588
+ ], queries: [{ propertyName: "linkChildren", predicate: IgxTreeNodeLinkDirective, read: ElementRef }, { propertyName: "_children", predicate: IGX_TREE_NODE_COMPONENT, read: IGX_TREE_NODE_COMPONENT }, { propertyName: "allChildren", predicate: IGX_TREE_NODE_COMPONENT, descendants: true, read: IGX_TREE_NODE_COMPONENT }], viewQueries: [{ propertyName: "header", first: true, predicate: ["ghostTemplate"], descendants: true, read: ElementRef }, { propertyName: "_defaultExpandIndicatorTemplate", first: true, predicate: ["defaultIndicator"], descendants: true, read: TemplateRef, static: true }, { propertyName: "childrenContainer", first: true, predicate: ["childrenContainer"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<ng-template #noDragTemplate>\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n</ng-template>\n\n<!-- Will switch templates depending on dragDrop -->\n<ng-template *ngTemplateOutlet=\"noDragTemplate\">\n</ng-template>\n\n<div #childrenContainer\n *ngIf=\"expanded && !loading\"\n class=\"igx-tree-node__group\"\n role=\"group\"\n>\n <ng-content select=\"igx-tree-node\"></ng-content>\n</div>\n\n\n<ng-template #defaultIndicator>\n <igx-icon\n [attr.aria-label]=\"expanded ? resourceStrings.igx_collapse : resourceStrings.igx_expand\"\n [name]=\"!expanded ? 'chevron_right' : 'expand'\"\n family=\"default\"\n >\n </igx-icon>\n</ng-template>\n\n<!-- separated in a template in case this ever needs to be templatable -->\n<ng-template #selectMarkerTemplate>\n <igx-checkbox [checked]=\"selected\" [disabled]=\"disabled\" [readonly]=\"true\" [indeterminate]=\"indeterminate\" [tabindex]=\"-1\">\n </igx-checkbox>\n</ng-template>\n\n<ng-template #headerTemplate>\n <div #ghostTemplate class=\"igx-tree-node__wrapper\"\n [attr.role]=\"role\"\n [tabIndex]=\"tabIndex\"\n [ngClass]=\"{\n 'igx-tree-node__wrapper--selected': selected,\n 'igx-tree-node__wrapper--active' : this.active,\n 'igx-tree-node__wrapper--focused' : this.focused,\n 'igx-tree-node__wrapper--disabled' : this.disabled\n }\"\n (pointerdown)=\"onPointerDown($event)\"\n (focus)=\"handleFocus()\"\n (blur)=\"clearFocus()\"\n >\n <div aria-hidden=\"true\">\n <span *ngFor=\"let item of [].constructor(level)\"\n aria-hidden=\"true\"\n class=\"igx-tree-node__spacer\"\n ></span>\n </div>\n\n <!-- Expand/Collapse indicator -->\n <span *ngIf=\"!loading\"\n class=\"igx-tree-node__toggle-button\"\n [ngClass]=\"{ 'igx-tree-node__toggle-button--hidden': !_children?.length }\"\n (click)=\"indicatorClick()\"\n >\n <ng-container *ngTemplateOutlet=\"expandIndicatorTemplate, context: { $implicit: expanded }\">\n </ng-container>\n </span>\n <span *ngIf=\"loading\"\n class=\"igx-tree-node__toggle-button\"\n >\n \t<igx-circular-bar\n \t[animate]=\"false\"\n \t[indeterminate]=\"true\"\n \t[textVisibility]=\"false\"\n \t>\n \t</igx-circular-bar>\n </span>\n\n <!-- Item selection -->\n <div *ngIf=\"showSelectors\"\n class=\"igx-tree-node__select\"\n (pointerdown)=\"onSelectorPointerDown($event)\"\n (click)=\"onSelectorClick($event)\">\n <ng-container *ngTemplateOutlet=\"selectMarkerTemplate\">\n </ng-container>\n </div>\n\n <div class=\"igx-tree-node__content\">\n <!-- Ghost content -->\n <ng-content></ng-content>\n </div>\n </div>\n\n <!-- Buffer element for 'move after' when D&D is implemented-->\n <div class=\"igx-tree-node__drop-indicator\">\n <span aria-hidden=\"true\" class=\"igx-tree-node__spacer\" *ngFor=\"let item of [].constructor(level)\"></span>\n <!-- style rules target this div, do not delete it -->\n <div></div>\n </div>\n</ng-template>\n\n<ng-template #dragTemplate>\n <!-- Drag drop goes here\n igxDrop\n #dropRef=\"drop\"\n [igxNodeDrag]=\"this\"\n (dragStart)=\"logDrop(dropRef)\"\n (leave)=\"emitLeave()\"\n (enter)=\"emitEnter()\" -->\n <div class=\"igx-tree-node__drag-wrapper\">\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }] }); }
589
589
  }
590
590
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: IgxTreeNodeComponent, decorators: [{
591
591
  type: Component,
592
592
  args: [{ selector: 'igx-tree-node', providers: [
593
593
  { provide: IGX_TREE_NODE_COMPONENT, useExisting: IgxTreeNodeComponent }
594
- ], standalone: true, imports: [NgTemplateOutlet, NgIf, IgxIconComponent, IgxCheckboxComponent, NgClass, NgFor, IgxCircularProgressBarComponent], template: "<ng-template #noDragTemplate>\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n</ng-template>\n\n<!-- Will switch templates depending on dragDrop -->\n<ng-template *ngTemplateOutlet=\"noDragTemplate\">\n</ng-template>\n\n<div #childrenContainer\n *ngIf=\"expanded && !loading\"\n class=\"igx-tree-node__group\"\n role=\"group\"\n>\n <ng-content select=\"igx-tree-node\"></ng-content>\n</div>\n\n\n<ng-template #defaultIndicator>\n <igx-icon\n [attr.aria-label]=\"expanded ? resourceStrings.igx_collapse : resourceStrings.igx_expand\"\n [name]=\"!expanded ? 'expand' : 'collapse'\"\n family=\"tree\"\n >\n </igx-icon>\n</ng-template>\n\n<!-- separated in a template in case this ever needs to be templatable -->\n<ng-template #selectMarkerTemplate>\n <igx-checkbox [checked]=\"selected\" [disabled]=\"disabled\" [readonly]=\"true\" [indeterminate]=\"indeterminate\" [tabindex]=\"-1\">\n </igx-checkbox>\n</ng-template>\n\n<ng-template #headerTemplate>\n <div #ghostTemplate class=\"igx-tree-node__wrapper\"\n [attr.role]=\"role\"\n [tabIndex]=\"tabIndex\"\n [ngClass]=\"{\n 'igx-tree-node__wrapper--selected': selected,\n 'igx-tree-node__wrapper--active' : this.active,\n 'igx-tree-node__wrapper--focused' : this.focused,\n 'igx-tree-node__wrapper--disabled' : this.disabled\n }\"\n (pointerdown)=\"onPointerDown($event)\"\n (focus)=\"handleFocus()\"\n (blur)=\"clearFocus()\"\n >\n <div aria-hidden=\"true\">\n <span *ngFor=\"let item of [].constructor(level)\"\n aria-hidden=\"true\"\n class=\"igx-tree-node__spacer\"\n ></span>\n </div>\n\n <!-- Expand/Collapse indicator -->\n <span *ngIf=\"!loading\"\n class=\"igx-tree-node__toggle-button\"\n [ngClass]=\"{ 'igx-tree-node__toggle-button--hidden': !_children?.length }\"\n (click)=\"indicatorClick()\"\n >\n <ng-container *ngTemplateOutlet=\"expandIndicatorTemplate, context: { $implicit: expanded }\">\n </ng-container>\n </span>\n <span *ngIf=\"loading\"\n class=\"igx-tree-node__toggle-button\"\n >\n \t<igx-circular-bar\n \t[animate]=\"false\"\n \t[indeterminate]=\"true\"\n \t[textVisibility]=\"false\"\n \t>\n \t</igx-circular-bar>\n </span>\n\n <!-- Item selection -->\n <div *ngIf=\"showSelectors\"\n class=\"igx-tree-node__select\"\n (pointerdown)=\"onSelectorPointerDown($event)\"\n (click)=\"onSelectorClick($event)\">\n <ng-container *ngTemplateOutlet=\"selectMarkerTemplate\">\n </ng-container>\n </div>\n\n <div class=\"igx-tree-node__content\">\n <!-- Ghost content -->\n <ng-content></ng-content>\n </div>\n </div>\n\n <!-- Buffer element for 'move after' when D&D is implemented-->\n <div class=\"igx-tree-node__drop-indicator\">\n <span aria-hidden=\"true\" class=\"igx-tree-node__spacer\" *ngFor=\"let item of [].constructor(level)\"></span>\n <!-- style rules target this div, do not delete it -->\n <div></div>\n </div>\n</ng-template>\n\n<ng-template #dragTemplate>\n <!-- Drag drop goes here\n igxDrop\n #dropRef=\"drop\"\n [igxNodeDrag]=\"this\"\n (dragStart)=\"logDrop(dropRef)\"\n (leave)=\"emitLeave()\"\n (enter)=\"emitEnter()\" -->\n <div class=\"igx-tree-node__drag-wrapper\">\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n </div>\n</ng-template>\n" }]
594
+ ], standalone: true, imports: [NgTemplateOutlet, NgIf, IgxIconComponent, IgxCheckboxComponent, NgClass, NgFor, IgxCircularProgressBarComponent], template: "<ng-template #noDragTemplate>\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n</ng-template>\n\n<!-- Will switch templates depending on dragDrop -->\n<ng-template *ngTemplateOutlet=\"noDragTemplate\">\n</ng-template>\n\n<div #childrenContainer\n *ngIf=\"expanded && !loading\"\n class=\"igx-tree-node__group\"\n role=\"group\"\n>\n <ng-content select=\"igx-tree-node\"></ng-content>\n</div>\n\n\n<ng-template #defaultIndicator>\n <igx-icon\n [attr.aria-label]=\"expanded ? resourceStrings.igx_collapse : resourceStrings.igx_expand\"\n [name]=\"!expanded ? 'chevron_right' : 'expand'\"\n family=\"default\"\n >\n </igx-icon>\n</ng-template>\n\n<!-- separated in a template in case this ever needs to be templatable -->\n<ng-template #selectMarkerTemplate>\n <igx-checkbox [checked]=\"selected\" [disabled]=\"disabled\" [readonly]=\"true\" [indeterminate]=\"indeterminate\" [tabindex]=\"-1\">\n </igx-checkbox>\n</ng-template>\n\n<ng-template #headerTemplate>\n <div #ghostTemplate class=\"igx-tree-node__wrapper\"\n [attr.role]=\"role\"\n [tabIndex]=\"tabIndex\"\n [ngClass]=\"{\n 'igx-tree-node__wrapper--selected': selected,\n 'igx-tree-node__wrapper--active' : this.active,\n 'igx-tree-node__wrapper--focused' : this.focused,\n 'igx-tree-node__wrapper--disabled' : this.disabled\n }\"\n (pointerdown)=\"onPointerDown($event)\"\n (focus)=\"handleFocus()\"\n (blur)=\"clearFocus()\"\n >\n <div aria-hidden=\"true\">\n <span *ngFor=\"let item of [].constructor(level)\"\n aria-hidden=\"true\"\n class=\"igx-tree-node__spacer\"\n ></span>\n </div>\n\n <!-- Expand/Collapse indicator -->\n <span *ngIf=\"!loading\"\n class=\"igx-tree-node__toggle-button\"\n [ngClass]=\"{ 'igx-tree-node__toggle-button--hidden': !_children?.length }\"\n (click)=\"indicatorClick()\"\n >\n <ng-container *ngTemplateOutlet=\"expandIndicatorTemplate, context: { $implicit: expanded }\">\n </ng-container>\n </span>\n <span *ngIf=\"loading\"\n class=\"igx-tree-node__toggle-button\"\n >\n \t<igx-circular-bar\n \t[animate]=\"false\"\n \t[indeterminate]=\"true\"\n \t[textVisibility]=\"false\"\n \t>\n \t</igx-circular-bar>\n </span>\n\n <!-- Item selection -->\n <div *ngIf=\"showSelectors\"\n class=\"igx-tree-node__select\"\n (pointerdown)=\"onSelectorPointerDown($event)\"\n (click)=\"onSelectorClick($event)\">\n <ng-container *ngTemplateOutlet=\"selectMarkerTemplate\">\n </ng-container>\n </div>\n\n <div class=\"igx-tree-node__content\">\n <!-- Ghost content -->\n <ng-content></ng-content>\n </div>\n </div>\n\n <!-- Buffer element for 'move after' when D&D is implemented-->\n <div class=\"igx-tree-node__drop-indicator\">\n <span aria-hidden=\"true\" class=\"igx-tree-node__spacer\" *ngFor=\"let item of [].constructor(level)\"></span>\n <!-- style rules target this div, do not delete it -->\n <div></div>\n </div>\n</ng-template>\n\n<ng-template #dragTemplate>\n <!-- Drag drop goes here\n igxDrop\n #dropRef=\"drop\"\n [igxNodeDrag]=\"this\"\n (dragStart)=\"logDrop(dropRef)\"\n (leave)=\"emitLeave()\"\n (enter)=\"emitEnter()\" -->\n <div class=\"igx-tree-node__drag-wrapper\">\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n </div>\n</ng-template>\n" }]
595
595
  }], ctorParameters: () => [{ type: undefined, decorators: [{
596
596
  type: Inject,
597
597
  args: [IGX_TREE_COMPONENT]
@@ -656,4 +656,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImpor
656
656
  type: Input,
657
657
  args: [{ transform: booleanAttribute }]
658
658
  }] } });
659
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi90cmVlL3RyZWUtbm9kZS90cmVlLW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL3RyZWUvdHJlZS1ub2RlL3RyZWUtbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFTixRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBd0IscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQTJCLE1BQU0sa0RBQWtELENBQUM7QUFDbEgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFaEcsT0FBTyxFQUdILG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBRTFCLE1BQU0sV0FBVyxDQUFDO0FBSW5CLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtB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QyxxQkFBcUI7Z0JBS3ZCLElBQUk7c0JBRGQsV0FBVzt1QkFBQyxXQUFXO2dCQU9qQixZQUFZO3NCQURsQixlQUFlO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFLeEQsU0FBUztzQkFEZixlQUFlO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFO2dCQUtwRSxXQUFXO3NCQURqQixlQUFlO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBc0J2RixNQUFNO3NCQURaLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJeEMsK0JBQStCO3NCQUR0QyxTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkxRCxpQkFBaUI7c0JBRHhCLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQW9GekMsUUFBUTtzQkFEbEIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFvQzNCLFFBQVE7c0JBRGxCLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNraXBTZWxmLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBib29sZWFuQXR0cmlidXRlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSVRyZWVSZXNvdXJjZVN0cmluZ3MsIFRyZWVSZXNvdXJjZVN0cmluZ3NFTiB9IGZyb20gJy4uLy4uL2NvcmUvaTE4bi90cmVlLXJlc291cmNlcyc7XG5pbXBvcnQgeyBUb2dnbGVBbmltYXRpb25QbGF5ZXIsIFRvZ2dsZUFuaW1hdGlvblNldHRpbmdzIH0gZnJvbSAnLi4vLi4vZXhwYW5zaW9uLXBhbmVsL3RvZ2dsZS1hbmltYXRpb24tY29tcG9uZW50JztcbmltcG9ydCB7IElneEFuZ3VsYXJBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW5pbWF0aW9uL2FuZ3VsYXItYW5pbWF0aW9uLXNlcnZpY2UnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuaW1hdGlvbi9hbmltYXRpb24nO1xuaW1wb3J0IHtcbiAgICBJZ3hUcmVlLFxuICAgIElneFRyZWVOb2RlLFxuICAgIElneFRyZWVTZWxlY3Rpb25UeXBlLFxuICAgIElHWF9UUkVFX0NPTVBPTkVOVCxcbiAgICBJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVCxcbiAgICBJVHJlZU5vZGVUb2dnbGluZ0V2ZW50QXJnc1xufSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHsgSWd4VHJlZU5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vdHJlZS1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4VHJlZVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi90cmVlLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneFRyZWVTZXJ2aWNlIH0gZnJvbSAnLi4vdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IElneENpcmN1bGFyUHJvZ3Jlc3NCYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiwgTmdDbGFzcywgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uLy4uL2NvcmUvaTE4bi9yZXNvdXJjZXMnO1xuXG4vLyBUT0RPOiBJbXBsZW1lbnQgYXJpYSBmdW5jdGlvbmFsaXR5XG4vKipcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKiBVc2VkIGZvciBsaW5rcyAoYGFgIHRhZ3MpIGluIHRoZSBib2R5IG9mIGFuIGBpZ3gtdHJlZS1ub2RlYC4gSGFuZGxlcyBhcmlhIGFuZCBldmVudCBkaXNwYXRjaC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6IGBbaWd4VHJlZU5vZGVMaW5rXWAsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlTm9kZUxpbmtEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ3RyZWVpdGVtJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBub2RlJ3MgcGFyZW50LiBTaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIGxpbmsgaXMgZGVmaW5lZFxuICAgICAqIGluIGA8bmctdGVtcGxhdGU+YCB0YWcgb3V0c2lkZSBvZiBpdHMgcGFyZW50LCBhcyBBbmd1bGFyIERJIHdpbGwgbm90IHByb3Blcmx5IHByb3ZpZGUgYSByZWZlcmVuY2VcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWU+XG4gICAgICogICAgIDxpZ3gtdHJlZS1ub2RlICNteU5vZGUgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YVwiIFtkYXRhXT1cIm5vZGVcIj5cbiAgICAgKiAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGRhdGEsIHBhcmVudE5vZGU6IG15Tm9kZSB9XCI+XG4gICAgICogICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogICAgIC4uLlxuICAgICAqICAgICA8IS0tIG5vZGUgdGVtcGxhdGUgaXMgZGVmaW5lZCB1bmRlciB0cmVlIHRvIGFjY2VzcyByZWxhdGVkIHNlcnZpY2VzIC0tPlxuICAgICAqICAgICA8bmctdGVtcGxhdGUgI25vZGVUZW1wbGF0ZSBsZXQtZGF0YSBsZXQtbm9kZT1cInBhcmVudE5vZGVcIj5cbiAgICAgKiAgICAgICAgIDxhIFtpZ3hUcmVlTm9kZUxpbmtdPVwibm9kZVwiPnt7IGRhdGEubGFiZWwgfX08L2E+XG4gICAgICogICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2lneFRyZWVOb2RlTGluaycpXG4gICAgcHVibGljIHNldCBwYXJlbnROb2RlKHZhbDogYW55KSB7XG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudE5vZGUgPSB2YWw7XG4gICAgICAgICAgICAodGhpcy5fcGFyZW50Tm9kZSBhcyBhbnkpLmFkZExpbmtDaGlsZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyZW50Tm9kZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICAvKiogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbm9kZSAqL1xuICAgIHByaXZhdGUgZ2V0IHRhcmdldCgpOiBJZ3hUcmVlTm9kZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZSB8fCB0aGlzLnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyZW50Tm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVClcbiAgICAgICAgcHJpdmF0ZSBub2RlOiBJZ3hUcmVlTm9kZTxhbnk+LFxuICAgICAgICBwcml2YXRlIG5hdlNlcnZpY2U6IElneFRyZWVOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgKSB7IH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgcHVibGljIGdldCB0YWJJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZTZXJ2aWNlLmZvY3VzZWROb2RlID09PSB0aGlzLnRhcmdldCA/ICh0aGlzLnRhcmdldD8uZGlzYWJsZWQgPyAtMSA6IDApIDogLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBDbGVhciB0aGUgbm9kZSdzIGZvY3VzZWQgc3RhdGVcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgaGFuZGxlQmx1cigpIHtcbiAgICAgICAgdGhpcy50YXJnZXQuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBTZXQgdGhlIG5vZGUgYXMgZm9jdXNlZFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcbiAgICBwdWJsaWMgaGFuZGxlRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCAmJiAhdGhpcy50YXJnZXQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hdlNlcnZpY2UuZm9jdXNlZE5vZGUgIT09IHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLmZvY3VzZWROb2RlID0gdGhpcy50YXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVMaW5rQ2hpbGQodGhpcyk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBUaGUgdHJlZSBub2RlIGNvbXBvbmVudCByZXByZXNlbnRzIGEgY2hpbGQgbm9kZSBvZiB0aGUgdHJlZSBjb21wb25lbnQgb3IgYW5vdGhlciB0cmVlIG5vZGUuXG4gKiBVc2FnZTpcbiAqXG4gKiBgYGBodG1sXG4gKiAgPGlneC10cmVlPlxuICogIC4uLlxuICogICAgPGlneC10cmVlLW5vZGUgW2RhdGFdPVwiZGF0YVwiIFtzZWxlY3RlZF09XCJzZXJ2aWNlLmlzTm9kZVNlbGVjdGVkKGRhdGEuS2V5KVwiIFtleHBhbmRlZF09XCJzZXJ2aWNlLmlzTm9kZUV4cGFuZGVkKGRhdGEuS2V5KVwiPlxuICogICAgICB7eyBkYXRhLkZpcnN0TmFtZSB9fSB7eyBkYXRhLkxhc3ROYW1lIH19XG4gKiAgICA8L2lneC10cmVlLW5vZGU+XG4gKiAgLi4uXG4gKiAgPC9pZ3gtdHJlZT5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC10cmVlLW5vZGUnLFxuICAgIHRlbXBsYXRlVXJsOiAndHJlZS1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVCwgdXNlRXhpc3Rpbmc6IElneFRyZWVOb2RlQ29tcG9uZW50IH1cbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nVGVtcGxhdGVPdXRsZXQsIE5nSWYsIElneEljb25Db21wb25lbnQsIElneENoZWNrYm94Q29tcG9uZW50LCBOZ0NsYXNzLCBOZ0ZvciwgSWd4Q2lyY3VsYXJQcm9ncmVzc0JhckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4VHJlZU5vZGVDb21wb25lbnQ8VD4gZXh0ZW5kcyBUb2dnbGVBbmltYXRpb25QbGF5ZXIgaW1wbGVtZW50cyBJZ3hUcmVlTm9kZTxUPiwgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGVudHJ5IHRoYXQgdGhlIG5vZGUgaXMgdmlzdWFsaXppbmcuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVkIGZvciBzZWFyY2hpbmcgdGhyb3VnaCBub2Rlcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LXRyZWU+XG4gICAgICogIC4uLlxuICAgICAqICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImRhdGFcIj5cbiAgICAgKiAgICAgIHt7IGRhdGEuRmlyc3ROYW1lIH19IHt7IGRhdGEuTGFzdE5hbWUgfX1cbiAgICAgKiAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogIC4uLlxuICAgICAqICA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRhdGE6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBUbyBiZSB1c2VkIGZvciBsb2FkLW9uLWRlbWFuZCBzY2VuYXJpb3MgaW4gb3JkZXIgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBub2RlIGlzIGxvYWRpbmcgZGF0YS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTG9hZGluZyBub2RlcyBkbyBub3QgcmVuZGVyIGNoaWxkcmVuLlxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICAvLyBUTyBETzogcmV0dXJuIGRpZmZlcmVudCB0YWIgaW5kZXggZGVwZW5kaW5nIG9uIGFuY2hvciBjaGlsZFxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBzZXQgdGFiSW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCB0YWJJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90YWJJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF2U2VydmljZS5mb2N1c2VkTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc0xpbmtDaGlsZHJlbiA/IC0xIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oYXNMaW5rQ2hpbGRyZW4gPyAtMSA6IHRoaXMuX3RhYkluZGV4O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgYW5pbWF0aW9uU2V0dGluZ3MoKTogVG9nZ2xlQW5pbWF0aW9uU2V0dGluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmFuaW1hdGlvblNldHRpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXNlcyBFTiByZXNvdXJjZXMgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJVHJlZVJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBhY2Nlc3NvciB0aGF0IHJldHVybnMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSVRyZWVSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoZSBub2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWU6IGJvb2xlYW5cbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgc2V0IGFjdGl2ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubmF2U2VydmljZS5hY3RpdmVOb2RlID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMudHJlZS5hY3RpdmVOb2RlQmluZGluZ0NoYW5nZS5lbWl0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdlNlcnZpY2UuYWN0aXZlTm9kZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIG5vZGUncyBgc2VsZWN0ZWRgIHByb3BlcnR5IGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICAgICAgPGlneC10cmVlLW5vZGUgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YVwiIFtkYXRhXT1cIm5vZGVcIiBbKHNlbGVjdGVkKV09XCJub2RlLnNlbGVjdGVkXCI+XG4gICAgICogICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBub2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2RlcyhkYXRhWzBdKVswXTtcbiAgICAgKiBub2RlLnNlbGVjdGVkQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGU6IGJvb2xlYW4pID0+IGNvbnNvbGUubG9nKFwiTm9kZSBzZWxlY3Rpb24gY2hhbmdlZCB0byBcIiwgZSkpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBub2RlJ3MgYGV4cGFuZGVkYCBwcm9wZXJ0eSBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZT5cbiAgICAgKiAgICAgIDxpZ3gtdHJlZS1ub2RlICpuZ0Zvcj1cImxldCBub2RlIG9mIGRhdGFcIiBbZGF0YV09XCJub2RlXCIgWyhleHBhbmRlZCldPVwibm9kZS5leHBhbmRlZFwiPlxuICAgICAqICAgICAgPC9pZ3gtdHJlZS1ub2RlPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgbm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IHRoaXMudHJlZS5maW5kTm9kZXMoZGF0YVswXSlbMF07XG4gICAgICogbm9kZS5leHBhbmRlZENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlOiBib29sZWFuKSA9PiBjb25zb2xlLmxvZyhcIk5vZGUgZXhwYW5zaW9uIHN0YXRlIGNoYW5nZWQgdG8gXCIsIGUpKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBleHBhbmRlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgZm9jdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGb2N1c2VkICYmXG4gICAgICAgICAgICB0aGlzLm5hdlNlcnZpY2UuZm9jdXNlZE5vZGUgPT09IHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBmdWxsIHBhdGggdG8gdGhlIG5vZGUgaW5jdWRpbmcgaXRzZWxmXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgbm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IHRoaXMudHJlZS5maW5kTm9kZXMoZGF0YVswXSlbMF07XG4gICAgICogY29uc3QgcGF0aDogSWd4VHJlZU5vZGU8YW55PltdID0gbm9kZS5wYXRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGF0aCgpOiBJZ3hUcmVlTm9kZTxhbnk+W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnROb2RlPy5wYXRoID8gWy4uLnRoaXMucGFyZW50Tm9kZS5wYXRoLCB0aGlzXSA6IFt0aGlzXTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBiaW5kIHRvIGRpc2FibGVkIHN0YXRlIHdoZW4gbm9kZSBpcyBkcmFnZ2VkXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgbm9kZVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlOiBib29sZWFuXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdHJlZS1ub2RlLS1kaXNhYmxlZCcpXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudHJlZS5kaXNhYmxlZENoYW5nZS5lbWl0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdHJlZS1ub2RlJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXRyZWUtbm9kZSc7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGdldCByb2xlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNMaW5rQ2hpbGRyZW4gPyAnbm9uZScgOiAndHJlZWl0ZW0nO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4VHJlZU5vZGVMaW5rRGlyZWN0aXZlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgbGlua0NoaWxkcmVuOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElHWF9UUkVFX05PREVfQ09NUE9ORU5ULCB7IHJlYWQ6IElHWF9UUkVFX05PREVfQ09NUE9ORU5UIH0pXG4gICAgcHVibGljIF9jaGlsZHJlbjogUXVlcnlMaXN0PElneFRyZWVOb2RlPGFueT4+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVCwgeyByZWFkOiBJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVCwgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgYWxsQ2hpbGRyZW46IFF1ZXJ5TGlzdDxJZ3hUcmVlTm9kZTxhbnk+PjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIG5vZGUgKGlmIGFueSlcbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiBub2RlIGRvZXMgbm90IGhhdmUgY2hpbGRyZW5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5vZGU6IElneFRyZWVOb2RlPGFueT4gPSB0aGlzLnRyZWUuZmluZE5vZGVzKGRhdGFbMF0pWzBdO1xuICAgICAqIGNvbnN0IGNoaWxkcmVuOiBJZ3hUcmVlTm9kZTxhbnk+W10gPSBub2RlLmNoaWxkcmVuO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hpbGRyZW4oKTogSWd4VHJlZU5vZGU8YW55PltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuPy5sZW5ndGggPyB0aGlzLl9jaGlsZHJlbi50b0FycmF5KCkgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHdpbGwgYmUgdXNlZCBpbiBEcmFnIGFuZCBEcm9wIGltcGxlbWVudGF0aW9uXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnZ2hvc3RUZW1wbGF0ZScsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBoZWFkZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0SW5kaWNhdG9yJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEV4cGFuZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnY2hpbGRyZW5Db250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcml2YXRlIGNoaWxkcmVuQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgcHJpdmF0ZSBnZXQgaGFzTGlua0NoaWxkcmVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5saW5rQ2hpbGRyZW4/Lmxlbmd0aCA+IDAgfHwgdGhpcy5yZWdpc3RlcmVkQ2hpbGRyZW4/Lmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGlzRm9jdXNlZDogYm9vbGVhbjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWdpc3RlcmVkQ2hpbGRyZW46IElneFRyZWVOb2RlTGlua0RpcmVjdGl2ZVtdID0gW107XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzKFRyZWVSZXNvdXJjZVN0cmluZ3NFTik7XG5cbiAgICBwcml2YXRlIF90YWJJbmRleCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KElHWF9UUkVFX0NPTVBPTkVOVCkgcHVibGljIHRyZWU6IElneFRyZWUsXG4gICAgICAgIHByb3RlY3RlZCBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hUcmVlU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHRyZWVTZXJ2aWNlOiBJZ3hUcmVlU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIG5hdlNlcnZpY2U6IElneFRyZWVOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoSWd4QW5ndWxhckFuaW1hdGlvblNlcnZpY2UpIGFuaW1hdGlvblNlcnZpY2U6IEFuaW1hdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIEBJbmplY3QoSUdYX1RSRUVfTk9ERV9DT01QT05FTlQpIHB1YmxpYyBwYXJlbnROb2RlOiBJZ3hUcmVlTm9kZTxhbnk+XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGFuaW1hdGlvblNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93U2VsZWN0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnNlbGVjdGlvbiAhPT0gSWd4VHJlZVNlbGVjdGlvblR5cGUuTm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5pc05vZGVJbmRldGVybWluYXRlKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgZGVwdGggb2YgdGhlIG5vZGUsIHJlbGF0aXZlIHRvIHRoZSByb290XG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICAuLi5cbiAgICAgKiAgPGlneC10cmVlLW5vZGUgI25vZGU+XG4gICAgICogICAgICBNeSBsZXZlbCBpcyB7eyBub2RlLmxldmVsIH19XG4gICAgICogIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5vZGU6IElneFRyZWVOb2RlPGFueT4gPSB0aGlzLnRyZWUuZmluZE5vZGVzKGRhdGFbMTJdKVswXTtcbiAgICAgKiBjb25zdCBsZXZlbDogbnVtYmVyID0gbm9kZS5sZXZlbDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxldmVsKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudE5vZGUgPyB0aGlzLnBhcmVudE5vZGUubGV2ZWwgKyAxIDogMDtcbiAgICB9XG5cbiAgICAvKiogR2V0L3NldCB3aGV0aGVyIHRoZSBub2RlIGlzIHNlbGVjdGVkLiBTdXBwb3JzdCB0d28td2F5IGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICAuLi5cbiAgICAgKiAgPGlneC10cmVlLW5vZGUgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YVwiIFsoc2VsZWN0ZWQpXT1cIm5vZGUuc2VsZWN0ZWRcIj5cbiAgICAgKiAgICAgIHt7IG5vZGUubGFiZWwgfX1cbiAgICAgKiAgPC9pZ3gtdHJlZS1ub2RlPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgbm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IHRoaXMudHJlZS5maW5kTm9kZXMoZGF0YVswXSlbMF07XG4gICAgICogY29uc3Qgc2VsZWN0ZWQgPSBub2RlLnNlbGVjdGVkO1xuICAgICAqIG5vZGUuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuaXNOb2RlU2VsZWN0ZWQodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWxlY3RlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCEodGhpcy50cmVlPy5ub2RlcyAmJiB0aGlzLnRyZWUubm9kZXMuZmluZCgoZSkgPT4gZSA9PT0gdGhpcykpICYmIHZhbCkge1xuICAgICAgICAgICAgdGhpcy50cmVlLmZvcmNlU2VsZWN0LnB1c2godGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCAmJiAhdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzTm9kZVNlbGVjdGVkKHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Tm9kZXNXaXRoTm9FdmVudChbdGhpc10pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsICYmIHRoaXMuc2VsZWN0aW9uU2VydmljZS5pc05vZGVTZWxlY3RlZCh0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Tm9kZXNXaXRoTm9FdmVudChbdGhpc10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEdldC9zZXQgd2hldGhlciB0aGUgbm9kZSBpcyBleHBhbmRlZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZT5cbiAgICAgKiAgLi4uXG4gICAgICogIDxpZ3gtdHJlZS1ub2RlICpuZ0Zvcj1cImxldCBub2RlIG9mIGRhdGFcIiBbZXhwYW5kZWRdPVwibm9kZS5uYW1lID09PSB0aGlzLmV4cGFuZGVkTm9kZVwiPlxuICAgICAqICAgICAge3sgbm9kZS5sYWJlbCB9fVxuICAgICAqICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBub2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2RlcyhkYXRhWzBdKVswXTtcbiAgICAgKiBjb25zdCBleHBhbmRlZCA9IG5vZGUuZXhwYW5kZWQ7XG4gICAgICogbm9kZS5leHBhbmRlZCA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBleHBhbmRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZVNlcnZpY2UuaXNFeHBhbmRlZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cGFuZGVkKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmV4cGFuZCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbGxhcHNlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBleHBhbmRJbmRpY2F0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZT8uZXhwYW5kSW5kaWNhdG9yIHx8IHRoaXMuX2RlZmF1bHRFeHBhbmRJbmRpY2F0b3JUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmF0aXZlIERPTSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgbm9kZS4gQ291bGQgYmUgbnVsbCBpbiBjZXJ0YWluIGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIG5hdGl2ZUVsZW1lbnQgb2YgdGhlIHNlY29uZCBub2RlXG4gICAgICogY29uc3Qgbm9kZTogSWd4VHJlZU5vZGUgPSB0aGlzLnRyZWUubm9kZXMuZmlyc3QoKTtcbiAgICAgKiBjb25zdCBub2RlRWxlbWVudDogSFRNTEVsZW1lbnQgPSBub2RlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm9wZW5BbmltYXRpb25Eb25lLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlLm5vZGVFeHBhbmRlZC5lbWl0KHsgb3duZXI6IHRoaXMudHJlZSwgbm9kZTogdGhpcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jbG9zZUFuaW1hdGlvbkRvbmUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyZWUubm9kZUNvbGxhcHNlZC5lbWl0KHsgb3duZXI6IHRoaXMudHJlZSwgbm9kZTogdGhpcyB9KTtcbiAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UuY29sbGFwc2UodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgbm9kZSdzIDxhPiBjaGlsZCwgaWYgcHJlc2VudFxuICAgICAqIFNldHMgdGhlIG5vZGUgYXMgdGhlIHRyZWUgc2VydmljZSdzIGZvY3VzZWROb2RlXG4gICAgICogTWFya3MgdGhlIG5vZGUgYXMgdGhlIGN1cnJlbnQgYWN0aXZlIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubmF2U2VydmljZS5mb2N1c2VkTm9kZSAhPT0gdGhpcykge1xuICAgICAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLmZvY3VzZWROb2RlID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmxpbmtDaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtDaGlsZHJlbi5maXJzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVnaXN0ZXJlZENoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQ2hpbGRyZW5bMF0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIENsZWFyIHRoZSBub2RlJ3MgZm9jdXNlZCBzdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblNlbGVjdG9yUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblNlbGVjdG9yQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIHRoaXMubmF2U2VydmljZS5oYW5kbGVGb2N1c2VkQW5kQWN0aXZlTm9kZSh0aGlzKTtcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0TXVsdGlwbGVOb2Rlcyh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdE5vZGUodGhpcywgZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdE5vZGUodGhpcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgbm9kZSBleHBhbnNpb24gc3RhdGUsIHRyaWdnZXJpbmcgYW5pbWF0aW9uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICAgICAgPGlneC10cmVlLW5vZGUgI25vZGU+TXkgTm9kZTwvaWd4LXRyZWUtbm9kZT5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbiAoY2xpY2spPVwibm9kZS50b2dnbGUoKVwiPlRvZ2dsZSBOb2RlPC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlOb2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2RlcyhkYXRhWzBdKVswXTtcbiAgICAgKiBteU5vZGUudG9nZ2xlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaW5kaWNhdG9yQ2xpY2soKSB7XG4gICAgICAgIGlmKCF0aGlzLnRyZWUudG9nZ2xlTm9kZU9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICB0aGlzLm5hdlNlcnZpY2Uuc2V0Rm9jdXNlZEFuZEFjdGl2ZU5vZGUodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIC8vVG9nZ2xlIHRoZSBub2RlIG9ubHkgb24gbGVmdCBtb3VzZSBjbGljayAtIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9wb2ludGVyZXZlbnRzLyNidXR0b24tc3RhdGVzXG4gICAgICAgIGlmKHRoaXMudHJlZS50b2dnbGVOb2RlT25DbGljayAmJiBldmVudC5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5hdlNlcnZpY2Uuc2V0Rm9jdXNlZEFuZEFjdGl2ZU5vZGUodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZW5zdXJlU3RhdGVPbk5vZGVEZWxldGUodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwYW5kcyB0aGUgbm9kZSwgdHJpZ2dlcmluZyBhbmltYXRpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWU+XG4gICAgICogICAgICA8aWd4LXRyZWUtbm9kZSAjbm9kZT5NeSBOb2RlPC9pZ3gtdHJlZS1ub2RlPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJub2RlLmV4cGFuZCgpXCI+RXhwYW5kIE5vZGU8L2J1dHRvbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteU5vZGU6IElneFRyZWVOb2RlPGFueT4gPSB0aGlzLnRyZWUuZmluZE5vZGVzKGRhdGFbMF0pWzBdO1xuICAgICAqIG15Tm9kZS5leHBhbmQoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kKCkge1xuICAgICAgICBpZiAodGhpcy5leHBhbmRlZCAmJiAhdGhpcy50cmVlU2VydmljZS5jb2xsYXBzaW5nTm9kZXMuaGFzKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJnczogSVRyZWVOb2RlVG9nZ2xpbmdFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcy50cmVlLFxuICAgICAgICAgICAgbm9kZTogdGhpcyxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcblxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRyZWUubm9kZUV4cGFuZGluZy5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoIWFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmV4cGFuZCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMucGxheU9wZW5BbmltYXRpb24oXG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkNvbnRhaW5lclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyB0aGUgbm9kZSwgdHJpZ2dlcmluZyBhbmltYXRpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWU+XG4gICAgICogICAgICA8aWd4LXRyZWUtbm9kZSAjbm9kZT5NeSBOb2RlPC9pZ3gtdHJlZS1ub2RlPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJub2RlLmNvbGxhcHNlKClcIj5Db2xsYXBzZSBOb2RlPC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlOb2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2RlcyhkYXRhWzBdKVswXTtcbiAgICAgKiBteU5vZGUuY29sbGFwc2UoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5leHBhbmRlZCB8fCB0aGlzLnRyZWVTZXJ2aWNlLmNvbGxhcHNpbmdOb2Rlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzOiBJVHJlZU5vZGVUb2dnbGluZ0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLnRyZWUsXG4gICAgICAgICAgICBub2RlOiB0aGlzLFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudHJlZS5ub2RlQ29sbGFwc2luZy5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoIWFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbGxhcHNpbmcodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnBsYXlDbG9zZUFuaW1hdGlvbihcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuQ29udGFpbmVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGFkZExpbmtDaGlsZChsaW5rOiBJZ3hUcmVlTm9kZUxpbmtEaXJlY3RpdmUpIHtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkQ2hpbGRyZW4ucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVtb3ZlTGlua0NoaWxkKGxpbms6IElneFRyZWVOb2RlTGlua0RpcmVjdGl2ZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVnaXN0ZXJlZENoaWxkcmVuLmluZGV4T2YobGluayk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZENoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI25vRHJhZ1RlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gV2lsbCBzd2l0Y2ggdGVtcGxhdGVzIGRlcGVuZGluZyBvbiBkcmFnRHJvcCAtLT5cbjxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cIm5vRHJhZ1RlbXBsYXRlXCI+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2ICNjaGlsZHJlbkNvbnRhaW5lclxuICAgICpuZ0lmPVwiZXhwYW5kZWQgJiYgIWxvYWRpbmdcIlxuICAgIGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fZ3JvdXBcIlxuICAgIHJvbGU9XCJncm91cFwiXG4+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXRyZWUtbm9kZVwiPjwvbmctY29udGVudD5cbjwvZGl2PlxuXG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEluZGljYXRvcj5cbiAgICA8aWd4LWljb25cbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJleHBhbmRlZCA/IHJlc291cmNlU3RyaW5ncy5pZ3hfY29sbGFwc2UgOiByZXNvdXJjZVN0cmluZ3MuaWd4X2V4cGFuZFwiXG4gICAgICAgIFtuYW1lXT1cIiFleHBhbmRlZCA/ICdleHBhbmQnIDogJ2NvbGxhcHNlJ1wiXG4gICAgICAgIGZhbWlseT1cInRyZWVcIlxuICAgID5cbiAgICA8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBzZXBhcmF0ZWQgaW4gYSB0ZW1wbGF0ZSBpbiBjYXNlIHRoaXMgZXZlciBuZWVkcyB0byBiZSB0ZW1wbGF0YWJsZSAtLT5cbjxuZy10ZW1wbGF0ZSAjc2VsZWN0TWFya2VyVGVtcGxhdGU+XG4gICAgPGlneC1jaGVja2JveCBbY2hlY2tlZF09XCJzZWxlY3RlZFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtyZWFkb25seV09XCJ0cnVlXCIgW2luZGV0ZXJtaW5hdGVdPVwiaW5kZXRlcm1pbmF0ZVwiIFt0YWJpbmRleF09XCItMVwiPlxuICAgIDwvaWd4LWNoZWNrYm94PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNoZWFkZXJUZW1wbGF0ZT5cbiAgICA8ZGl2ICNnaG9zdFRlbXBsYXRlIGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fd3JhcHBlclwiXG4gICAgICAgIFthdHRyLnJvbGVdPVwicm9sZVwiXG4gICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdpZ3gtdHJlZS1ub2RlX193cmFwcGVyLS1zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgJ2lneC10cmVlLW5vZGVfX3dyYXBwZXItLWFjdGl2ZScgOiB0aGlzLmFjdGl2ZSxcbiAgICAgICAgICAgICdpZ3gtdHJlZS1ub2RlX193cmFwcGVyLS1mb2N1c2VkJyA6IHRoaXMuZm9jdXNlZCxcbiAgICAgICAgICAgICdpZ3gtdHJlZS1ub2RlX193cmFwcGVyLS1kaXNhYmxlZCcgOiB0aGlzLmRpc2FibGVkXG4gICAgICAgIH1cIlxuICAgICAgICAocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkZXZlbnQpXCJcbiAgICAgICAgKGZvY3VzKT1cImhhbmRsZUZvY3VzKClcIlxuICAgICAgICAoYmx1cik9XCJjbGVhckZvY3VzKClcIlxuICAgID5cbiAgICAgICAgPGRpdiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBpdGVtIG9mIFtdLmNvbnN0cnVjdG9yKGxldmVsKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlneC10cmVlLW5vZGVfX3NwYWNlclwiXG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBpbmRpY2F0b3IgLS0+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWxvYWRpbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtdHJlZS1ub2RlX190b2dnbGUtYnV0dG9uXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lneC10cmVlLW5vZGVfX3RvZ2dsZS1idXR0b24tLWhpZGRlbic6ICFfY2hpbGRyZW4/Lmxlbmd0aCB9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJpbmRpY2F0b3JDbGljaygpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImV4cGFuZEluZGljYXRvclRlbXBsYXRlLCBjb250ZXh0OiB7ICRpbXBsaWNpdDogZXhwYW5kZWQgfVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fdG9nZ2xlLWJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgXHQ8aWd4LWNpcmN1bGFyLWJhclxuICAgICAgICAgICAgXHRbYW5pbWF0ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICBcdFtpbmRldGVybWluYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgXHRbdGV4dFZpc2liaWxpdHldPVwiZmFsc2VcIlxuICAgICAgICBcdD5cbiAgICAgICAgXHQ8L2lneC1jaXJjdWxhci1iYXI+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8IS0tIEl0ZW0gc2VsZWN0aW9uIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1NlbGVjdG9yc1wiXG4gICAgICAgICAgICBjbGFzcz1cImlneC10cmVlLW5vZGVfX3NlbGVjdFwiXG4gICAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25TZWxlY3RvclBvaW50ZXJEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0b3JDbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0TWFya2VyVGVtcGxhdGVcIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fY29udGVudFwiPlxuICAgICAgICAgICAgPCEtLSBHaG9zdCBjb250ZW50IC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gIEJ1ZmZlciBlbGVtZW50IGZvciAnbW92ZSBhZnRlcicgd2hlbiBEJkQgaXMgaW1wbGVtZW50ZWQtLT5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fZHJvcC1pbmRpY2F0b3JcIj5cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJpZ3gtdHJlZS1ub2RlX19zcGFjZXJcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbXS5jb25zdHJ1Y3RvcihsZXZlbClcIj48L3NwYW4+XG4gICAgICAgIDwhLS0gc3R5bGUgcnVsZXMgdGFyZ2V0IHRoaXMgZGl2LCBkbyBub3QgZGVsZXRlIGl0IC0tPlxuICAgICAgICA8ZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkcmFnVGVtcGxhdGU+XG4gICAgPCEtLSBEcmFnIGRyb3AgZ29lcyBoZXJlXG4gICAgICAgIGlneERyb3BcbiAgICAgICAgI2Ryb3BSZWY9XCJkcm9wXCJcbiAgICAgICAgW2lneE5vZGVEcmFnXT1cInRoaXNcIlxuICAgICAgICAoZHJhZ1N0YXJ0KT1cImxvZ0Ryb3AoZHJvcFJlZilcIlxuICAgICAgICAobGVhdmUpPVwiZW1pdExlYXZlKClcIlxuICAgICAgICAoZW50ZXIpPVwiZW1pdEVudGVyKClcIiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fZHJhZy13cmFwcGVyXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
659
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi90cmVlL3RyZWUtbm9kZS90cmVlLW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL3RyZWUvdHJlZS1ub2RlL3RyZWUtbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFTixRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBd0IscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQTJCLE1BQU0sa0RBQWtELENBQUM7QUFDbEgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFaEcsT0FBTyxFQUdILG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBRTFCLE1BQU0sV0FBVyxDQUFDO0FBSW5CLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtB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QyxxQkFBcUI7Z0JBS3ZCLElBQUk7c0JBRGQsV0FBVzt1QkFBQyxXQUFXO2dCQU9qQixZQUFZO3NCQURsQixlQUFlO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFLeEQsU0FBUztzQkFEZixlQUFlO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFO2dCQUtwRSxXQUFXO3NCQURqQixlQUFlO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBc0J2RixNQUFNO3NCQURaLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJeEMsK0JBQStCO3NCQUR0QyxTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkxRCxpQkFBaUI7c0JBRHhCLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQW9GekMsUUFBUTtzQkFEbEIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFvQzNCLFFBQVE7c0JBRGxCLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNraXBTZWxmLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBib29sZWFuQXR0cmlidXRlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSVRyZWVSZXNvdXJjZVN0cmluZ3MsIFRyZWVSZXNvdXJjZVN0cmluZ3NFTiB9IGZyb20gJy4uLy4uL2NvcmUvaTE4bi90cmVlLXJlc291cmNlcyc7XG5pbXBvcnQgeyBUb2dnbGVBbmltYXRpb25QbGF5ZXIsIFRvZ2dsZUFuaW1hdGlvblNldHRpbmdzIH0gZnJvbSAnLi4vLi4vZXhwYW5zaW9uLXBhbmVsL3RvZ2dsZS1hbmltYXRpb24tY29tcG9uZW50JztcbmltcG9ydCB7IElneEFuZ3VsYXJBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW5pbWF0aW9uL2FuZ3VsYXItYW5pbWF0aW9uLXNlcnZpY2UnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuaW1hdGlvbi9hbmltYXRpb24nO1xuaW1wb3J0IHtcbiAgICBJZ3hUcmVlLFxuICAgIElneFRyZWVOb2RlLFxuICAgIElneFRyZWVTZWxlY3Rpb25UeXBlLFxuICAgIElHWF9UUkVFX0NPTVBPTkVOVCxcbiAgICBJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVCxcbiAgICBJVHJlZU5vZGVUb2dnbGluZ0V2ZW50QXJnc1xufSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHsgSWd4VHJlZU5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vdHJlZS1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4VHJlZVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi90cmVlLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneFRyZWVTZXJ2aWNlIH0gZnJvbSAnLi4vdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IElneENpcmN1bGFyUHJvZ3Jlc3NCYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiwgTmdDbGFzcywgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uLy4uL2NvcmUvaTE4bi9yZXNvdXJjZXMnO1xuXG4vLyBUT0RPOiBJbXBsZW1lbnQgYXJpYSBmdW5jdGlvbmFsaXR5XG4vKipcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKiBVc2VkIGZvciBsaW5rcyAoYGFgIHRhZ3MpIGluIHRoZSBib2R5IG9mIGFuIGBpZ3gtdHJlZS1ub2RlYC4gSGFuZGxlcyBhcmlhIGFuZCBldmVudCBkaXNwYXRjaC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6IGBbaWd4VHJlZU5vZGVMaW5rXWAsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlTm9kZUxpbmtEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ3RyZWVpdGVtJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBub2RlJ3MgcGFyZW50LiBTaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIGxpbmsgaXMgZGVmaW5lZFxuICAgICAqIGluIGA8bmctdGVtcGxhdGU+YCB0YWcgb3V0c2lkZSBvZiBpdHMgcGFyZW50LCBhcyBBbmd1bGFyIERJIHdpbGwgbm90IHByb3Blcmx5IHByb3ZpZGUgYSByZWZlcmVuY2VcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWU+XG4gICAgICogICAgIDxpZ3gtdHJlZS1ub2RlICNteU5vZGUgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YVwiIFtkYXRhXT1cIm5vZGVcIj5cbiAgICAgKiAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGRhdGEsIHBhcmVudE5vZGU6IG15Tm9kZSB9XCI+XG4gICAgICogICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogICAgIC4uLlxuICAgICAqICAgICA8IS0tIG5vZGUgdGVtcGxhdGUgaXMgZGVmaW5lZCB1bmRlciB0cmVlIHRvIGFjY2VzcyByZWxhdGVkIHNlcnZpY2VzIC0tPlxuICAgICAqICAgICA8bmctdGVtcGxhdGUgI25vZGVUZW1wbGF0ZSBsZXQtZGF0YSBsZXQtbm9kZT1cInBhcmVudE5vZGVcIj5cbiAgICAgKiAgICAgICAgIDxhIFtpZ3hUcmVlTm9kZUxpbmtdPVwibm9kZVwiPnt7IGRhdGEubGFiZWwgfX08L2E+XG4gICAgICogICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2lneFRyZWVOb2RlTGluaycpXG4gICAgcHVibGljIHNldCBwYXJlbnROb2RlKHZhbDogYW55KSB7XG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudE5vZGUgPSB2YWw7XG4gICAgICAgICAgICAodGhpcy5fcGFyZW50Tm9kZSBhcyBhbnkpLmFkZExpbmtDaGlsZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyZW50Tm9kZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICAvKiogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbm9kZSAqL1xuICAgIHByaXZhdGUgZ2V0IHRhcmdldCgpOiBJZ3hUcmVlTm9kZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZSB8fCB0aGlzLnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyZW50Tm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVClcbiAgICAgICAgcHJpdmF0ZSBub2RlOiBJZ3hUcmVlTm9kZTxhbnk+LFxuICAgICAgICBwcml2YXRlIG5hdlNlcnZpY2U6IElneFRyZWVOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgKSB7IH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgcHVibGljIGdldCB0YWJJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZTZXJ2aWNlLmZvY3VzZWROb2RlID09PSB0aGlzLnRhcmdldCA/ICh0aGlzLnRhcmdldD8uZGlzYWJsZWQgPyAtMSA6IDApIDogLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBDbGVhciB0aGUgbm9kZSdzIGZvY3VzZWQgc3RhdGVcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgaGFuZGxlQmx1cigpIHtcbiAgICAgICAgdGhpcy50YXJnZXQuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBTZXQgdGhlIG5vZGUgYXMgZm9jdXNlZFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcbiAgICBwdWJsaWMgaGFuZGxlRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCAmJiAhdGhpcy50YXJnZXQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hdlNlcnZpY2UuZm9jdXNlZE5vZGUgIT09IHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLmZvY3VzZWROb2RlID0gdGhpcy50YXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVMaW5rQ2hpbGQodGhpcyk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBUaGUgdHJlZSBub2RlIGNvbXBvbmVudCByZXByZXNlbnRzIGEgY2hpbGQgbm9kZSBvZiB0aGUgdHJlZSBjb21wb25lbnQgb3IgYW5vdGhlciB0cmVlIG5vZGUuXG4gKiBVc2FnZTpcbiAqXG4gKiBgYGBodG1sXG4gKiAgPGlneC10cmVlPlxuICogIC4uLlxuICogICAgPGlneC10cmVlLW5vZGUgW2RhdGFdPVwiZGF0YVwiIFtzZWxlY3RlZF09XCJzZXJ2aWNlLmlzTm9kZVNlbGVjdGVkKGRhdGEuS2V5KVwiIFtleHBhbmRlZF09XCJzZXJ2aWNlLmlzTm9kZUV4cGFuZGVkKGRhdGEuS2V5KVwiPlxuICogICAgICB7eyBkYXRhLkZpcnN0TmFtZSB9fSB7eyBkYXRhLkxhc3ROYW1lIH19XG4gKiAgICA8L2lneC10cmVlLW5vZGU+XG4gKiAgLi4uXG4gKiAgPC9pZ3gtdHJlZT5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC10cmVlLW5vZGUnLFxuICAgIHRlbXBsYXRlVXJsOiAndHJlZS1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVCwgdXNlRXhpc3Rpbmc6IElneFRyZWVOb2RlQ29tcG9uZW50IH1cbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nVGVtcGxhdGVPdXRsZXQsIE5nSWYsIElneEljb25Db21wb25lbnQsIElneENoZWNrYm94Q29tcG9uZW50LCBOZ0NsYXNzLCBOZ0ZvciwgSWd4Q2lyY3VsYXJQcm9ncmVzc0JhckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4VHJlZU5vZGVDb21wb25lbnQ8VD4gZXh0ZW5kcyBUb2dnbGVBbmltYXRpb25QbGF5ZXIgaW1wbGVtZW50cyBJZ3hUcmVlTm9kZTxUPiwgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGVudHJ5IHRoYXQgdGhlIG5vZGUgaXMgdmlzdWFsaXppbmcuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVkIGZvciBzZWFyY2hpbmcgdGhyb3VnaCBub2Rlcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LXRyZWU+XG4gICAgICogIC4uLlxuICAgICAqICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImRhdGFcIj5cbiAgICAgKiAgICAgIHt7IGRhdGEuRmlyc3ROYW1lIH19IHt7IGRhdGEuTGFzdE5hbWUgfX1cbiAgICAgKiAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogIC4uLlxuICAgICAqICA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRhdGE6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBUbyBiZSB1c2VkIGZvciBsb2FkLW9uLWRlbWFuZCBzY2VuYXJpb3MgaW4gb3JkZXIgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBub2RlIGlzIGxvYWRpbmcgZGF0YS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTG9hZGluZyBub2RlcyBkbyBub3QgcmVuZGVyIGNoaWxkcmVuLlxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICAvLyBUTyBETzogcmV0dXJuIGRpZmZlcmVudCB0YWIgaW5kZXggZGVwZW5kaW5nIG9uIGFuY2hvciBjaGlsZFxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBzZXQgdGFiSW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCB0YWJJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90YWJJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF2U2VydmljZS5mb2N1c2VkTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc0xpbmtDaGlsZHJlbiA/IC0xIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oYXNMaW5rQ2hpbGRyZW4gPyAtMSA6IHRoaXMuX3RhYkluZGV4O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgYW5pbWF0aW9uU2V0dGluZ3MoKTogVG9nZ2xlQW5pbWF0aW9uU2V0dGluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmFuaW1hdGlvblNldHRpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXNlcyBFTiByZXNvdXJjZXMgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJVHJlZVJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBhY2Nlc3NvciB0aGF0IHJldHVybnMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSVRyZWVSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoZSBub2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWU6IGJvb2xlYW5cbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgc2V0IGFjdGl2ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubmF2U2VydmljZS5hY3RpdmVOb2RlID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMudHJlZS5hY3RpdmVOb2RlQmluZGluZ0NoYW5nZS5lbWl0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdlNlcnZpY2UuYWN0aXZlTm9kZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIG5vZGUncyBgc2VsZWN0ZWRgIHByb3BlcnR5IGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICAgICAgPGlneC10cmVlLW5vZGUgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YVwiIFtkYXRhXT1cIm5vZGVcIiBbKHNlbGVjdGVkKV09XCJub2RlLnNlbGVjdGVkXCI+XG4gICAgICogICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBub2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2RlcyhkYXRhWzBdKVswXTtcbiAgICAgKiBub2RlLnNlbGVjdGVkQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGU6IGJvb2xlYW4pID0+IGNvbnNvbGUubG9nKFwiTm9kZSBzZWxlY3Rpb24gY2hhbmdlZCB0byBcIiwgZSkpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBub2RlJ3MgYGV4cGFuZGVkYCBwcm9wZXJ0eSBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZT5cbiAgICAgKiAgICAgIDxpZ3gtdHJlZS1ub2RlICpuZ0Zvcj1cImxldCBub2RlIG9mIGRhdGFcIiBbZGF0YV09XCJub2RlXCIgWyhleHBhbmRlZCldPVwibm9kZS5leHBhbmRlZFwiPlxuICAgICAqICAgICAgPC9pZ3gtdHJlZS1ub2RlPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgbm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IHRoaXMudHJlZS5maW5kTm9kZXMoZGF0YVswXSlbMF07XG4gICAgICogbm9kZS5leHBhbmRlZENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlOiBib29sZWFuKSA9PiBjb25zb2xlLmxvZyhcIk5vZGUgZXhwYW5zaW9uIHN0YXRlIGNoYW5nZWQgdG8gXCIsIGUpKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBleHBhbmRlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgZm9jdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGb2N1c2VkICYmXG4gICAgICAgICAgICB0aGlzLm5hdlNlcnZpY2UuZm9jdXNlZE5vZGUgPT09IHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBmdWxsIHBhdGggdG8gdGhlIG5vZGUgaW5jdWRpbmcgaXRzZWxmXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgbm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IHRoaXMudHJlZS5maW5kTm9kZXMoZGF0YVswXSlbMF07XG4gICAgICogY29uc3QgcGF0aDogSWd4VHJlZU5vZGU8YW55PltdID0gbm9kZS5wYXRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGF0aCgpOiBJZ3hUcmVlTm9kZTxhbnk+W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnROb2RlPy5wYXRoID8gWy4uLnRoaXMucGFyZW50Tm9kZS5wYXRoLCB0aGlzXSA6IFt0aGlzXTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBiaW5kIHRvIGRpc2FibGVkIHN0YXRlIHdoZW4gbm9kZSBpcyBkcmFnZ2VkXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgbm9kZVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlOiBib29sZWFuXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdHJlZS1ub2RlLS1kaXNhYmxlZCcpXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudHJlZS5kaXNhYmxlZENoYW5nZS5lbWl0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdHJlZS1ub2RlJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXRyZWUtbm9kZSc7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGdldCByb2xlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNMaW5rQ2hpbGRyZW4gPyAnbm9uZScgOiAndHJlZWl0ZW0nO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4VHJlZU5vZGVMaW5rRGlyZWN0aXZlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgbGlua0NoaWxkcmVuOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElHWF9UUkVFX05PREVfQ09NUE9ORU5ULCB7IHJlYWQ6IElHWF9UUkVFX05PREVfQ09NUE9ORU5UIH0pXG4gICAgcHVibGljIF9jaGlsZHJlbjogUXVlcnlMaXN0PElneFRyZWVOb2RlPGFueT4+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVCwgeyByZWFkOiBJR1hfVFJFRV9OT0RFX0NPTVBPTkVOVCwgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgYWxsQ2hpbGRyZW46IFF1ZXJ5TGlzdDxJZ3hUcmVlTm9kZTxhbnk+PjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIG5vZGUgKGlmIGFueSlcbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiBub2RlIGRvZXMgbm90IGhhdmUgY2hpbGRyZW5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5vZGU6IElneFRyZWVOb2RlPGFueT4gPSB0aGlzLnRyZWUuZmluZE5vZGVzKGRhdGFbMF0pWzBdO1xuICAgICAqIGNvbnN0IGNoaWxkcmVuOiBJZ3hUcmVlTm9kZTxhbnk+W10gPSBub2RlLmNoaWxkcmVuO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hpbGRyZW4oKTogSWd4VHJlZU5vZGU8YW55PltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuPy5sZW5ndGggPyB0aGlzLl9jaGlsZHJlbi50b0FycmF5KCkgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHdpbGwgYmUgdXNlZCBpbiBEcmFnIGFuZCBEcm9wIGltcGxlbWVudGF0aW9uXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnZ2hvc3RUZW1wbGF0ZScsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBoZWFkZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0SW5kaWNhdG9yJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEV4cGFuZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnY2hpbGRyZW5Db250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcml2YXRlIGNoaWxkcmVuQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgcHJpdmF0ZSBnZXQgaGFzTGlua0NoaWxkcmVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5saW5rQ2hpbGRyZW4/Lmxlbmd0aCA+IDAgfHwgdGhpcy5yZWdpc3RlcmVkQ2hpbGRyZW4/Lmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGlzRm9jdXNlZDogYm9vbGVhbjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWdpc3RlcmVkQ2hpbGRyZW46IElneFRyZWVOb2RlTGlua0RpcmVjdGl2ZVtdID0gW107XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzKFRyZWVSZXNvdXJjZVN0cmluZ3NFTik7XG5cbiAgICBwcml2YXRlIF90YWJJbmRleCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KElHWF9UUkVFX0NPTVBPTkVOVCkgcHVibGljIHRyZWU6IElneFRyZWUsXG4gICAgICAgIHByb3RlY3RlZCBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hUcmVlU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHRyZWVTZXJ2aWNlOiBJZ3hUcmVlU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIG5hdlNlcnZpY2U6IElneFRyZWVOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoSWd4QW5ndWxhckFuaW1hdGlvblNlcnZpY2UpIGFuaW1hdGlvblNlcnZpY2U6IEFuaW1hdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIEBJbmplY3QoSUdYX1RSRUVfTk9ERV9DT01QT05FTlQpIHB1YmxpYyBwYXJlbnROb2RlOiBJZ3hUcmVlTm9kZTxhbnk+XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGFuaW1hdGlvblNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93U2VsZWN0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnNlbGVjdGlvbiAhPT0gSWd4VHJlZVNlbGVjdGlvblR5cGUuTm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5pc05vZGVJbmRldGVybWluYXRlKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgZGVwdGggb2YgdGhlIG5vZGUsIHJlbGF0aXZlIHRvIHRoZSByb290XG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICAuLi5cbiAgICAgKiAgPGlneC10cmVlLW5vZGUgI25vZGU+XG4gICAgICogICAgICBNeSBsZXZlbCBpcyB7eyBub2RlLmxldmVsIH19XG4gICAgICogIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5vZGU6IElneFRyZWVOb2RlPGFueT4gPSB0aGlzLnRyZWUuZmluZE5vZGVzKGRhdGFbMTJdKVswXTtcbiAgICAgKiBjb25zdCBsZXZlbDogbnVtYmVyID0gbm9kZS5sZXZlbDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxldmVsKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudE5vZGUgPyB0aGlzLnBhcmVudE5vZGUubGV2ZWwgKyAxIDogMDtcbiAgICB9XG5cbiAgICAvKiogR2V0L3NldCB3aGV0aGVyIHRoZSBub2RlIGlzIHNlbGVjdGVkLiBTdXBwb3JzdCB0d28td2F5IGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICAuLi5cbiAgICAgKiAgPGlneC10cmVlLW5vZGUgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YVwiIFsoc2VsZWN0ZWQpXT1cIm5vZGUuc2VsZWN0ZWRcIj5cbiAgICAgKiAgICAgIHt7IG5vZGUubGFiZWwgfX1cbiAgICAgKiAgPC9pZ3gtdHJlZS1ub2RlPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgbm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IHRoaXMudHJlZS5maW5kTm9kZXMoZGF0YVswXSlbMF07XG4gICAgICogY29uc3Qgc2VsZWN0ZWQgPSBub2RlLnNlbGVjdGVkO1xuICAgICAqIG5vZGUuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuaXNOb2RlU2VsZWN0ZWQodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWxlY3RlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCEodGhpcy50cmVlPy5ub2RlcyAmJiB0aGlzLnRyZWUubm9kZXMuZmluZCgoZSkgPT4gZSA9PT0gdGhpcykpICYmIHZhbCkge1xuICAgICAgICAgICAgdGhpcy50cmVlLmZvcmNlU2VsZWN0LnB1c2godGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCAmJiAhdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzTm9kZVNlbGVjdGVkKHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Tm9kZXNXaXRoTm9FdmVudChbdGhpc10pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsICYmIHRoaXMuc2VsZWN0aW9uU2VydmljZS5pc05vZGVTZWxlY3RlZCh0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Tm9kZXNXaXRoTm9FdmVudChbdGhpc10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEdldC9zZXQgd2hldGhlciB0aGUgbm9kZSBpcyBleHBhbmRlZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZT5cbiAgICAgKiAgLi4uXG4gICAgICogIDxpZ3gtdHJlZS1ub2RlICpuZ0Zvcj1cImxldCBub2RlIG9mIGRhdGFcIiBbZXhwYW5kZWRdPVwibm9kZS5uYW1lID09PSB0aGlzLmV4cGFuZGVkTm9kZVwiPlxuICAgICAqICAgICAge3sgbm9kZS5sYWJlbCB9fVxuICAgICAqICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBub2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2RlcyhkYXRhWzBdKVswXTtcbiAgICAgKiBjb25zdCBleHBhbmRlZCA9IG5vZGUuZXhwYW5kZWQ7XG4gICAgICogbm9kZS5leHBhbmRlZCA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBleHBhbmRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZVNlcnZpY2UuaXNFeHBhbmRlZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cGFuZGVkKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmV4cGFuZCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbGxhcHNlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBleHBhbmRJbmRpY2F0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZT8uZXhwYW5kSW5kaWNhdG9yIHx8IHRoaXMuX2RlZmF1bHRFeHBhbmRJbmRpY2F0b3JUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmF0aXZlIERPTSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgbm9kZS4gQ291bGQgYmUgbnVsbCBpbiBjZXJ0YWluIGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIG5hdGl2ZUVsZW1lbnQgb2YgdGhlIHNlY29uZCBub2RlXG4gICAgICogY29uc3Qgbm9kZTogSWd4VHJlZU5vZGUgPSB0aGlzLnRyZWUubm9kZXMuZmlyc3QoKTtcbiAgICAgKiBjb25zdCBub2RlRWxlbWVudDogSFRNTEVsZW1lbnQgPSBub2RlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm9wZW5BbmltYXRpb25Eb25lLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlLm5vZGVFeHBhbmRlZC5lbWl0KHsgb3duZXI6IHRoaXMudHJlZSwgbm9kZTogdGhpcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jbG9zZUFuaW1hdGlvbkRvbmUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyZWUubm9kZUNvbGxhcHNlZC5lbWl0KHsgb3duZXI6IHRoaXMudHJlZSwgbm9kZTogdGhpcyB9KTtcbiAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UuY29sbGFwc2UodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgbm9kZSdzIDxhPiBjaGlsZCwgaWYgcHJlc2VudFxuICAgICAqIFNldHMgdGhlIG5vZGUgYXMgdGhlIHRyZWUgc2VydmljZSdzIGZvY3VzZWROb2RlXG4gICAgICogTWFya3MgdGhlIG5vZGUgYXMgdGhlIGN1cnJlbnQgYWN0aXZlIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubmF2U2VydmljZS5mb2N1c2VkTm9kZSAhPT0gdGhpcykge1xuICAgICAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLmZvY3VzZWROb2RlID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmxpbmtDaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtDaGlsZHJlbi5maXJzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVnaXN0ZXJlZENoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQ2hpbGRyZW5bMF0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIENsZWFyIHRoZSBub2RlJ3MgZm9jdXNlZCBzdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblNlbGVjdG9yUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblNlbGVjdG9yQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIHRoaXMubmF2U2VydmljZS5oYW5kbGVGb2N1c2VkQW5kQWN0aXZlTm9kZSh0aGlzKTtcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0TXVsdGlwbGVOb2Rlcyh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdE5vZGUodGhpcywgZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdE5vZGUodGhpcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgbm9kZSBleHBhbnNpb24gc3RhdGUsIHRyaWdnZXJpbmcgYW5pbWF0aW9uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICAgICAgPGlneC10cmVlLW5vZGUgI25vZGU+TXkgTm9kZTwvaWd4LXRyZWUtbm9kZT5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbiAoY2xpY2spPVwibm9kZS50b2dnbGUoKVwiPlRvZ2dsZSBOb2RlPC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlOb2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2RlcyhkYXRhWzBdKVswXTtcbiAgICAgKiBteU5vZGUudG9nZ2xlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaW5kaWNhdG9yQ2xpY2soKSB7XG4gICAgICAgIGlmKCF0aGlzLnRyZWUudG9nZ2xlTm9kZU9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICB0aGlzLm5hdlNlcnZpY2Uuc2V0Rm9jdXNlZEFuZEFjdGl2ZU5vZGUodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIC8vVG9nZ2xlIHRoZSBub2RlIG9ubHkgb24gbGVmdCBtb3VzZSBjbGljayAtIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9wb2ludGVyZXZlbnRzLyNidXR0b24tc3RhdGVzXG4gICAgICAgIGlmKHRoaXMudHJlZS50b2dnbGVOb2RlT25DbGljayAmJiBldmVudC5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5hdlNlcnZpY2Uuc2V0Rm9jdXNlZEFuZEFjdGl2ZU5vZGUodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZW5zdXJlU3RhdGVPbk5vZGVEZWxldGUodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwYW5kcyB0aGUgbm9kZSwgdHJpZ2dlcmluZyBhbmltYXRpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWU+XG4gICAgICogICAgICA8aWd4LXRyZWUtbm9kZSAjbm9kZT5NeSBOb2RlPC9pZ3gtdHJlZS1ub2RlPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJub2RlLmV4cGFuZCgpXCI+RXhwYW5kIE5vZGU8L2J1dHRvbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteU5vZGU6IElneFRyZWVOb2RlPGFueT4gPSB0aGlzLnRyZWUuZmluZE5vZGVzKGRhdGFbMF0pWzBdO1xuICAgICAqIG15Tm9kZS5leHBhbmQoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kKCkge1xuICAgICAgICBpZiAodGhpcy5leHBhbmRlZCAmJiAhdGhpcy50cmVlU2VydmljZS5jb2xsYXBzaW5nTm9kZXMuaGFzKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJnczogSVRyZWVOb2RlVG9nZ2xpbmdFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcy50cmVlLFxuICAgICAgICAgICAgbm9kZTogdGhpcyxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcblxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRyZWUubm9kZUV4cGFuZGluZy5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoIWFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmV4cGFuZCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMucGxheU9wZW5BbmltYXRpb24oXG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkNvbnRhaW5lclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyB0aGUgbm9kZSwgdHJpZ2dlcmluZyBhbmltYXRpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWU+XG4gICAgICogICAgICA8aWd4LXRyZWUtbm9kZSAjbm9kZT5NeSBOb2RlPC9pZ3gtdHJlZS1ub2RlPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJub2RlLmNvbGxhcHNlKClcIj5Db2xsYXBzZSBOb2RlPC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlOb2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2RlcyhkYXRhWzBdKVswXTtcbiAgICAgKiBteU5vZGUuY29sbGFwc2UoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5leHBhbmRlZCB8fCB0aGlzLnRyZWVTZXJ2aWNlLmNvbGxhcHNpbmdOb2Rlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzOiBJVHJlZU5vZGVUb2dnbGluZ0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLnRyZWUsXG4gICAgICAgICAgICBub2RlOiB0aGlzLFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudHJlZS5ub2RlQ29sbGFwc2luZy5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoIWFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbGxhcHNpbmcodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnBsYXlDbG9zZUFuaW1hdGlvbihcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuQ29udGFpbmVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGFkZExpbmtDaGlsZChsaW5rOiBJZ3hUcmVlTm9kZUxpbmtEaXJlY3RpdmUpIHtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkQ2hpbGRyZW4ucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVtb3ZlTGlua0NoaWxkKGxpbms6IElneFRyZWVOb2RlTGlua0RpcmVjdGl2ZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVnaXN0ZXJlZENoaWxkcmVuLmluZGV4T2YobGluayk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZENoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI25vRHJhZ1RlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gV2lsbCBzd2l0Y2ggdGVtcGxhdGVzIGRlcGVuZGluZyBvbiBkcmFnRHJvcCAtLT5cbjxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cIm5vRHJhZ1RlbXBsYXRlXCI+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2ICNjaGlsZHJlbkNvbnRhaW5lclxuICAgICpuZ0lmPVwiZXhwYW5kZWQgJiYgIWxvYWRpbmdcIlxuICAgIGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fZ3JvdXBcIlxuICAgIHJvbGU9XCJncm91cFwiXG4+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXRyZWUtbm9kZVwiPjwvbmctY29udGVudD5cbjwvZGl2PlxuXG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEluZGljYXRvcj5cbiAgICA8aWd4LWljb25cbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJleHBhbmRlZCA/IHJlc291cmNlU3RyaW5ncy5pZ3hfY29sbGFwc2UgOiByZXNvdXJjZVN0cmluZ3MuaWd4X2V4cGFuZFwiXG4gICAgICAgIFtuYW1lXT1cIiFleHBhbmRlZCA/ICdjaGV2cm9uX3JpZ2h0JyA6ICdleHBhbmQnXCJcbiAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgPlxuICAgIDwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIHNlcGFyYXRlZCBpbiBhIHRlbXBsYXRlIGluIGNhc2UgdGhpcyBldmVyIG5lZWRzIHRvIGJlIHRlbXBsYXRhYmxlIC0tPlxuPG5nLXRlbXBsYXRlICNzZWxlY3RNYXJrZXJUZW1wbGF0ZT5cbiAgICA8aWd4LWNoZWNrYm94IFtjaGVja2VkXT1cInNlbGVjdGVkXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW3JlYWRvbmx5XT1cInRydWVcIiBbaW5kZXRlcm1pbmF0ZV09XCJpbmRldGVybWluYXRlXCIgW3RhYmluZGV4XT1cIi0xXCI+XG4gICAgPC9pZ3gtY2hlY2tib3g+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2hlYWRlclRlbXBsYXRlPlxuICAgIDxkaXYgI2dob3N0VGVtcGxhdGUgY2xhc3M9XCJpZ3gtdHJlZS1ub2RlX193cmFwcGVyXCJcbiAgICAgICAgW2F0dHIucm9sZV09XCJyb2xlXCJcbiAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2lneC10cmVlLW5vZGVfX3dyYXBwZXItLXNlbGVjdGVkJzogc2VsZWN0ZWQsXG4gICAgICAgICAgICAnaWd4LXRyZWUtbm9kZV9fd3JhcHBlci0tYWN0aXZlJyA6IHRoaXMuYWN0aXZlLFxuICAgICAgICAgICAgJ2lneC10cmVlLW5vZGVfX3dyYXBwZXItLWZvY3VzZWQnIDogdGhpcy5mb2N1c2VkLFxuICAgICAgICAgICAgJ2lneC10cmVlLW5vZGVfX3dyYXBwZXItLWRpc2FibGVkJyA6IHRoaXMuZGlzYWJsZWRcbiAgICAgICAgfVwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJvblBvaW50ZXJEb3duKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwiaGFuZGxlRm9jdXMoKVwiXG4gICAgICAgIChibHVyKT1cImNsZWFyRm9jdXMoKVwiXG4gICAgPlxuICAgICAgICA8ZGl2IGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGl0ZW0gb2YgW10uY29uc3RydWN0b3IobGV2ZWwpXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fc3BhY2VyXCJcbiAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRXhwYW5kL0NvbGxhcHNlIGluZGljYXRvciAtLT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhbG9hZGluZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImlneC10cmVlLW5vZGVfX3RvZ2dsZS1idXR0b25cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaWd4LXRyZWUtbm9kZV9fdG9nZ2xlLWJ1dHRvbi0taGlkZGVuJzogIV9jaGlsZHJlbj8ubGVuZ3RoIH1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImluZGljYXRvckNsaWNrKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXhwYW5kSW5kaWNhdG9yVGVtcGxhdGUsIGNvbnRleHQ6IHsgJGltcGxpY2l0OiBleHBhbmRlZCB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtdHJlZS1ub2RlX190b2dnbGUtYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICBcdDxpZ3gtY2lyY3VsYXItYmFyXG4gICAgICAgICAgICBcdFthbmltYXRlXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFx0W2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBcdFt0ZXh0VmlzaWJpbGl0eV09XCJmYWxzZVwiXG4gICAgICAgIFx0PlxuICAgICAgICBcdDwvaWd4LWNpcmN1bGFyLWJhcj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDwhLS0gSXRlbSBzZWxlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93U2VsZWN0b3JzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LXRyZWUtbm9kZV9fc2VsZWN0XCJcbiAgICAgICAgICAgIChwb2ludGVyZG93bik9XCJvblNlbGVjdG9yUG9pbnRlckRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3RvckNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RNYXJrZXJUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtdHJlZS1ub2RlX19jb250ZW50XCI+XG4gICAgICAgICAgICA8IS0tIEdob3N0IGNvbnRlbnQgLS0+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSAgQnVmZmVyIGVsZW1lbnQgZm9yICdtb3ZlIGFmdGVyJyB3aGVuIEQmRCBpcyBpbXBsZW1lbnRlZC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtdHJlZS1ub2RlX19kcm9wLWluZGljYXRvclwiPlxuICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImlneC10cmVlLW5vZGVfX3NwYWNlclwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIFtdLmNvbnN0cnVjdG9yKGxldmVsKVwiPjwvc3Bhbj5cbiAgICAgICAgPCEtLSBzdHlsZSBydWxlcyB0YXJnZXQgdGhpcyBkaXYsIGRvIG5vdCBkZWxldGUgaXQgLS0+XG4gICAgICAgIDxkaXY+PC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RyYWdUZW1wbGF0ZT5cbiAgICA8IS0tIERyYWcgZHJvcCBnb2VzIGhlcmVcbiAgICAgICAgaWd4RHJvcFxuICAgICAgICAjZHJvcFJlZj1cImRyb3BcIlxuICAgICAgICBbaWd4Tm9kZURyYWddPVwidGhpc1wiXG4gICAgICAgIChkcmFnU3RhcnQpPVwibG9nRHJvcChkcm9wUmVmKVwiXG4gICAgICAgIChsZWF2ZSk9XCJlbWl0TGVhdmUoKVwiXG4gICAgICAgIChlbnRlcik9XCJlbWl0RW50ZXIoKVwiIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtdHJlZS1ub2RlX19kcmFnLXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -263,12 +263,12 @@ export class IgxTreeComponent {
263
263
  this.selectionService.register(this);
264
264
  this.treeService.register(this);
265
265
  this.navService.register(this);
266
- iconService?.addIconRef('expand', 'tree', {
267
- name: 'keyboard_arrow_right',
266
+ iconService?.addIconRef('chevron_right', 'default', {
267
+ name: 'chevron_right',
268
268
  family: 'material'
269
269
  });
270
- iconService?.addIconRef('collapse', 'tree', {
271
- name: 'keyboard_arrow_down',
270
+ iconService?.addIconRef('expand', 'default', {
271
+ name: 'expand_more',
272
272
  family: 'material'
273
273
  });
274
274
  }
@@ -513,4 +513,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImpor
513
513
  type: ContentChildren,
514
514
  args: [IgxTreeNodeComponent, { descendants: true }]
515
515
  }] } });
516
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvdHJlZS90cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi90cmVlL3RyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULFdBQVcsRUFHWCxlQUFlLEVBRWYsV0FBVyxFQUVYLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RCxPQUFPLEVBQ0gsa0JBQWtCLEVBQUUsb0JBQW9CLEVBRTNDLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7OztBQUV0RDs7O0dBR0c7QUFLSCxNQUFNLE9BQU8sNEJBQTRC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LEtBQUs7c0JBRFgsZUFBZTt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBRdWVyeUxpc3QsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGlyZWN0aXZlLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIE9uSW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBPbkRlc3Ryb3ksXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgRWxlbWVudFJlZixcbiAgICBib29sZWFuQXR0cmlidXRlLFxuICAgIE9wdGlvbmFsLFxuICAgIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFRvZ2dsZUFuaW1hdGlvblNldHRpbmdzIH0gZnJvbSAnLi4vZXhwYW5zaW9uLXBhbmVsL3RvZ2dsZS1hbmltYXRpb24tY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgSUdYX1RSRUVfQ09NUE9ORU5ULCBJZ3hUcmVlU2VsZWN0aW9uVHlwZSwgSWd4VHJlZSwgSVRyZWVOb2RlVG9nZ2xlZEV2ZW50QXJncyxcbiAgICBJVHJlZU5vZGVUb2dnbGluZ0V2ZW50QXJncywgSVRyZWVOb2RlU2VsZWN0aW9uRXZlbnQsIElneFRyZWVOb2RlLCBJZ3hUcmVlU2VhcmNoUmVzb2x2ZXJcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgSWd4VHJlZU5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi90cmVlLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vdHJlZS1ub2RlL3RyZWUtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VHJlZVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuL3RyZWUtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4VHJlZVNlcnZpY2UgfSBmcm9tICcuL3RyZWUuc2VydmljZSc7XG5pbXBvcnQgeyBncm93VmVySW4sIGdyb3dWZXJPdXQgfSBmcm9tICdpZ25pdGV1aS1hbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgcmVzaXplT2JzZXJ2YWJsZSB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSWd4SWNvblNlcnZpY2UgfSBmcm9tICcuLi9pY29uL2ljb24uc2VydmljZSc7XG5cbi8qKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqIFVzZWQgZm9yIHRlbXBsYXRpbmcgdGhlIHNlbGVjdCBtYXJrZXIgb2YgdGhlIHRyZWVcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VHJlZVNlbGVjdE1hcmtlcl0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSWd4VHJlZVNlbGVjdE1hcmtlckRpcmVjdGl2ZSB7XG59XG5cbi8qKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqIFVzZWQgZm9yIHRlbXBsYXRpbmcgdGhlIGV4cGFuZCBpbmRpY2F0b3Igb2YgdGhlIHRyZWVcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VHJlZUV4cGFuZEluZGljYXRvcl0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSWd4VHJlZUV4cGFuZEluZGljYXRvckRpcmVjdGl2ZSB7XG59XG5cbi8qKlxuICogSWd4VHJlZUNvbXBvbmVudCBhbGxvd3MgYSBkZXZlbG9wZXIgdG8gc2hvdyBhIHNldCBvZiBub2RlcyBpbiBhIGhpZXJhcmNoaWNhbCBmYXNoaW9uLlxuICpcbiAqIEBpZ3hNb2R1bGUgSWd4VHJlZU1vZHVsZVxuICogQGlneEtleXdvcmRzIHRyZWVcbiAqIEBpZ3hUaGVtZSBpZ3gtdHJlZS10aGVtZVxuICogQGlneEdyb3VwIEdyaWRzICYgTGlzdHNcbiAqXG4gKiBAcmVtYXJrXG4gKiBUaGUgQW5ndWxhciBUcmVlIENvbXBvbmVudCBhbGxvd3MgdXNlcnMgdG8gcmVwcmVzZW50IGhpZXJhcmNoaWNhbCBkYXRhIGluIGEgdHJlZS12aWV3IHN0cnVjdHVyZSxcbiAqIG1haW50YWluaW5nIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLCBhcyB3ZWxsIGFzIHRvIGRlZmluZSBzdGF0aWMgdHJlZS12aWV3IHN0cnVjdHVyZSB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBkYXRhIG1vZGVsLlxuICogSXRzIHByaW1hcnkgcHVycG9zZSBpcyB0byBhbGxvdyBlbmQtdXNlcnMgdG8gdmlzdWFsaXplIGFuZCBuYXZpZ2F0ZSB3aXRoaW4gaGllcmFyY2hpY2FsIGRhdGEgc3RydWN0dXJlcy5cbiAqIFRoZSBJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgVHJlZSBDb21wb25lbnQgYWxzbyBwcm92aWRlcyBsb2FkIG9uIGRlbWFuZCBjYXBhYmlsaXRpZXMsIGl0ZW0gYWN0aXZhdGlvbixcbiAqIGJpLXN0YXRlIGFuZCBjYXNjYWRpbmcgc2VsZWN0aW9uIG9mIGl0ZW1zIHRocm91Z2ggYnVpbHQtaW4gY2hlY2tib3hlcywgYnVpbHQtaW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiBhbmQgbW9yZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlneC10cmVlPlxuICogICA8aWd4LXRyZWUtbm9kZT5cbiAqICAgICAgSSBhbSBhIHBhcmVudCBub2RlIDFcbiAqICAgICAgPGlneC10cmVlLW5vZGU+XG4gKiAgICAgICAgICBJIGFtIGEgY2hpbGQgbm9kZSAxXG4gKiAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAqICAgICAgLi4uXG4gKiAgIDwvaWd4LXRyZWUtbm9kZT5cbiAqXHQgLi4uXG4gKiA8L2lneC10cmVlPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXRyZWUnLFxuICAgIHRlbXBsYXRlVXJsOiAndHJlZS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIElneFRyZWVTZXJ2aWNlLFxuICAgICAgICBJZ3hUcmVlU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgSWd4VHJlZU5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9UUkVFX0NPTVBPTkVOVCwgdXNlRXhpc3Rpbmc6IElneFRyZWVDb21wb25lbnQgfSxcbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSWd4VHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIElneFRyZWUsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRyZWUnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtdHJlZSc7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdHJlZSBzZWxlY3Rpb24gbW9kZVxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSB0cmVlIHNlbGVjdGlvbiBtb2RlIGlzICdOb25lJ1xuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBJZ3hUcmVlU2VsZWN0aW9uVHlwZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb24oc2VsZWN0aW9uTW9kZTogSWd4VHJlZVNlbGVjdGlvblR5cGUpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gc2VsZWN0aW9uTW9kZTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyTm9kZXNTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKiogR2V0L1NldCBob3cgdGhlIHRyZWUgc2hvdWxkIGhhbmRsZSBicmFuY2ggZXhwYW5zaW9uLlxuICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIG9ubHkgYSBzaW5nbGUgYnJhbmNoIGNhbiBiZSBleHBhbmRlZCBhdCBhIHRpbWUsIGNvbGxhcHNpbmcgYWxsIG90aGVyc1xuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZSBbc2luZ2xlQnJhbmNoRXhwYW5kXT1cInRydWVcIj5cbiAgICAgKiAuLi5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRyZWU6IElneFRyZWUgPSB0aGlzLnRyZWU7XG4gICAgICogdGhpcy50cmVlLnNpbmdsZUJyYW5jaEV4cGFuZCA9IGZhbHNlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBzaW5nbGVCcmFuY2hFeHBhbmQgPSBmYWxzZTtcblxuICAgIC8qKiBHZXQvU2V0IGlmIG5vZGVzIHNob3VsZCBiZSBleHBhbmRlZC9jb2xsYXBzZWQgd2hlbiBjbGlja2luZyBvdmVyIHRoZW0uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlIFt0b2dnbGVOb2RlT25DbGlja109XCJ0cnVlXCI+XG4gICAgICogLi4uXG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0cmVlOiBJZ3hUcmVlID0gdGhpcy50cmVlO1xuICAgICAqIHRoaXMudHJlZS50b2dnbGVOb2RlT25DbGljayA9IGZhbHNlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyB0b2dnbGVOb2RlT25DbGljayA9IGZhbHNlO1xuXG5cbiAgICAvKiogR2V0L1NldCB0aGUgYW5pbWF0aW9uIHNldHRpbmdzIHRoYXQgYnJhbmNoZXMgc2hvdWxkIHVzZSB3aGVuIGV4cGFuZGluZy9jb2xscGFzaW5nLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZSBbYW5pbWF0aW9uU2V0dGluZ3NdPVwiY3VzdG9tQW5pbWF0aW9uU2V0dGluZ3NcIj5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGFuaW1hdGlvblNldHRpbmdzOiBUb2dnbGVBbmltYXRpb25TZXR0aW5ncyA9IHtcbiAgICAgKiAgICAgIG9wZW5BbmltYXRpb246IGdyb3dWZXJJbixcbiAgICAgKiAgICAgIGNsb3NlQW5pbWF0aW9uOiBncm93VmVyT3V0XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHRoaXMudHJlZS5hbmltYXRpb25TZXR0aW5ncyA9IGFuaW1hdGlvblNldHRpbmdzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFuaW1hdGlvblNldHRpbmdzOiBUb2dnbGVBbmltYXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgb3BlbkFuaW1hdGlvbjogZ3Jvd1ZlckluLFxuICAgICAgICBjbG9zZUFuaW1hdGlvbjogZ3Jvd1Zlck91dFxuICAgIH07XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBub2RlIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIHRocm91Z2ggaW50ZXJhY3Rpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWUgKG5vZGVTZWxlY3Rpb24pPVwiaGFuZGxlTm9kZVNlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBoYW5kbGVOb2RlU2VsZWN0aW9uKGV2ZW50OiBJVHJlZU5vZGVTZWxlY3Rpb25FdmVudCkge1xuICAgICAqICBjb25zdCBuZXdTZWxlY3Rpb246IElneFRyZWVOb2RlPGFueT5bXSA9IGV2ZW50Lm5ld1NlbGVjdGlvbjtcbiAgICAgKiAgY29uc3QgYWRkZWQ6IElneFRyZWVOb2RlPGFueT5bXSA9IGV2ZW50LmFkZGVkO1xuICAgICAqICBjb25zb2xlLmxvZyhcIk5ldyBzZWxlY3Rpb24gd2lsbCBiZTogXCIsIG5ld1NlbGVjdGlvbik7XG4gICAgICogIGNvbnNvbGUubG9nKFwiQWRkZWQgbm9kZXM6IFwiLCBldmVudC5hZGRlZCk7XG4gICAgICogfVxuICAgICAqYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG5vZGVTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPElUcmVlTm9kZVNlbGVjdGlvbkV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIG5vZGUgaXMgZXhwYW5kaW5nLCBiZWZvcmUgaXQgZmluaXNoZXNcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWUgKG5vZGVFeHBhbmRpbmcpPVwiaGFuZGxlTm9kZUV4cGFuZGluZygkZXZlbnQpXCI+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBoYW5kbGVOb2RlRXhwYW5kaW5nKGV2ZW50OiBJVHJlZU5vZGVUb2dnbGluZ0V2ZW50QXJncykge1xuICAgICAqICBjb25zdCBleHBhbmRlZE5vZGU6IElneFRyZWVOb2RlPGFueT4gPSBldmVudC5ub2RlO1xuICAgICAqICBpZiAoZXhwYW5kZWROb2RlLmRpc2FibGVkKSB7XG4gICAgICogICAgICBldmVudC5jYW5jZWwgPSB0cnVlO1xuICAgICAqICB9XG4gICAgICogfVxuICAgICAqYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG5vZGVFeHBhbmRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElUcmVlTm9kZVRvZ2dsaW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIG5vZGUgaXMgZXhwYW5kZWQsIGFmdGVyIGl0IGZpbmlzaGVzXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlIChub2RlRXhwYW5kZWQpPVwiaGFuZGxlTm9kZUV4cGFuZGVkKCRldmVudClcIj5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGhhbmRsZU5vZGVFeHBhbmRlZChldmVudDogSVRyZWVOb2RlVG9nZ2xlZEV2ZW50QXJncykge1xuICAgICAqICBjb25zdCBleHBhbmRlZE5vZGU6IElneFRyZWVOb2RlPGFueT4gPSBldmVudC5ub2RlO1xuICAgICAqICBjb25zb2xlLmxvZyhcIk5vZGUgaXMgZXhwYW5kZWQ6IFwiLCBleHBhbmRlZE5vZGUuZGF0YSk7XG4gICAgICogfVxuICAgICAqYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG5vZGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVRyZWVOb2RlVG9nZ2xlZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSBub2RlIGlzIGNvbGxhcHNpbmcsIGJlZm9yZSBpdCBmaW5pc2hlc1xuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZSAobm9kZUNvbGxhcHNpbmcpPVwiaGFuZGxlTm9kZUNvbGxhcHNpbmcoJGV2ZW50KVwiPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgaGFuZGxlTm9kZUNvbGxhcHNpbmcoZXZlbnQ6IElUcmVlTm9kZVRvZ2dsaW5nRXZlbnRBcmdzKSB7XG4gICAgICogIGNvbnN0IGNvbGxhcHNlZE5vZGU6IElneFRyZWVOb2RlPGFueT4gPSBldmVudC5ub2RlO1xuICAgICAqICBpZiAoY29sbGFwc2VkTm9kZS5hbHdheXNPcGVuKSB7XG4gICAgICogICAgICBldmVudC5jYW5jZWwgPSB0cnVlO1xuICAgICAqICB9XG4gICAgICogfVxuICAgICAqYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG5vZGVDb2xsYXBzaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJVHJlZU5vZGVUb2dnbGluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSBub2RlIGlzIGNvbGxhcHNlZCwgYWZ0ZXIgaXQgZmluaXNoZXNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZSAobm9kZUNvbGxhcHNlZCk9XCJoYW5kbGVOb2RlQ29sbGFwc2VkKCRldmVudClcIj5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgaGFuZGxlTm9kZUNvbGxhcHNlZChldmVudDogSVRyZWVOb2RlVG9nZ2xlZEV2ZW50QXJncykge1xuICAgICAqICBjb25zdCBjb2xsYXBzZWROb2RlOiBJZ3hUcmVlTm9kZTxhbnk+ID0gZXZlbnQubm9kZTtcbiAgICAgKiAgY29uc29sZS5sb2coXCJOb2RlIGlzIGNvbGxhcHNlZDogXCIsIGNvbGxhcHNlZE5vZGUuZGF0YSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBub2RlQ29sbGFwc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJVHJlZU5vZGVUb2dnbGVkRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhY3RpdmUgbm9kZSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiA8aWd4LXRyZWUgKGFjdGl2ZU5vZGVDaGFuZ2VkKT1cImFjdGl2ZU5vZGVDaGFuZ2VkKCRldmVudClcIj48L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVOb2RlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SWd4VHJlZU5vZGU8YW55Pj4oKTtcblxuICAgIC8qKlxuICAgICAqIEEgY3VzdG9tIHRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIHRoZSBleHBhbmQgaW5kaWNhdG9yIG9mIG5vZGVzXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZT5cbiAgICAgKiAgPG5nLXRlbXBsYXRlIGlneFRyZWVFeHBhbmRJbmRpY2F0b3IgbGV0LWV4cGFuZGVkPlxuICAgICAqICAgICAgPGlneC1pY29uPnt7IGV4cGFuZGVkID8gXCJjbG9zZV9mdWxsc2NyZWVuXCI6IFwib3Blbl9pbl9mdWxsXCJ9fTwvaWd4LWljb24+XG4gICAgICogIDwvbmctdGVtcGxhdGU+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFRyZWVFeHBhbmRJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZXhwYW5kSW5kaWNhdG9yOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hUcmVlTm9kZUNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHB1YmxpYyBub2RlczogUXVlcnlMaXN0PElneFRyZWVOb2RlQ29tcG9uZW50PGFueT4+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGRpc2FibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hUcmVlTm9kZTxhbnk+PigpO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgKipyb290IGxldmVsKiogbm9kZXNcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0cmVlOiBJZ3hUcmVlID0gdGhpcy50cmVlO1xuICAgICAqIGNvbnN0IHJvb3ROb2RlczogSWd4VHJlZU5vZGVDb21wb25lbnQ8YW55PltdID0gdHJlZS5yb290Tm9kZXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290Tm9kZXMoKTogSWd4VHJlZU5vZGVDb21wb25lbnQ8YW55PltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM/LmZpbHRlcihub2RlID0+IG5vZGUubGV2ZWwgPT09IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYWN0aXZlIG5vZGUgaXMgc2V0IHRocm91Z2ggQVBJXG4gICAgICpcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhY3RpdmVOb2RlQmluZGluZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SWd4VHJlZU5vZGU8YW55Pj4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBmb3JjZVNlbGVjdCA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlc2l6ZU5vdGlmeSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwcml2YXRlIF9zZWxlY3Rpb246IElneFRyZWVTZWxlY3Rpb25UeXBlID0gSWd4VHJlZVNlbGVjdGlvblR5cGUuTm9uZTtcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIHVuc3ViQ2hpbGRyZW4kID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIG5hdlNlcnZpY2U6IElneFRyZWVOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hUcmVlU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0cmVlU2VydmljZTogSWd4VHJlZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSWd4SWNvblNlcnZpY2UpIGljb25TZXJ2aWNlPzogSWd4SWNvblNlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgdGhpcy50cmVlU2VydmljZS5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLnJlZ2lzdGVyKHRoaXMpO1xuXG4gICAgICAgIGljb25TZXJ2aWNlPy5hZGRJY29uUmVmKCdleHBhbmQnLCAndHJlZScsIHtcbiAgICAgICAgICAgIG5hbWU6ICdrZXlib2FyZF9hcnJvd19yaWdodCcsXG4gICAgICAgICAgICBmYW1pbHk6ICdtYXRlcmlhbCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWNvblNlcnZpY2U/LmFkZEljb25SZWYoJ2NvbGxhcHNlJywgJ3RyZWUnLCB7XG4gICAgICAgICAgICBuYW1lOiAna2V5Ym9hcmRfYXJyb3dfZG93bicsXG4gICAgICAgICAgICBmYW1pbHk6ICdtYXRlcmlhbCdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwYW5kcyBhbGwgb2YgdGhlIHBhc3NlZCBub2Rlcy5cbiAgICAgKiBJZiBubyBub2RlcyBhcmUgcGFzc2VkLCBleHBhbmRzIEFMTCBub2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIG5vZGVzIG5vZGVzIHRvIGJlIGV4cGFuZGVkXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdGFyZ2V0Tm9kZXM6IElneFRyZWVOb2RlPGFueT4gPSB0aGlzLnRyZWUuZmluZE5vZGVzKHRydWUsIChfZGF0YTogYW55LCBub2RlOiBJZ3hUcmVlTm9kZTxhbnk+KSA9PiBub2RlLmRhdGEuZXhwYW5kYWJsZSk7XG4gICAgICogdHJlZS5leHBhbmRBbGwobm9kZXMpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRBbGwobm9kZXM/OiBJZ3hUcmVlTm9kZTxhbnk+W10pIHtcbiAgICAgICAgbm9kZXMgPSBub2RlcyB8fCB0aGlzLm5vZGVzLnRvQXJyYXkoKTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaChlID0+IGUuZXhwYW5kZWQgPSB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgYWxsIG9mIHRoZSBwYXNzZWQgbm9kZXMuXG4gICAgICogSWYgbm8gbm9kZXMgYXJlIHBhc3NlZCwgY29sbGFwc2VzIEFMTCBub2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIG5vZGVzIG5vZGVzIHRvIGJlIGNvbGxhcHNlZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRhcmdldE5vZGVzOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2Rlcyh0cnVlLCAoX2RhdGE6IGFueSwgbm9kZTogSWd4VHJlZU5vZGU8YW55PikgPT4gbm9kZS5kYXRhLmNvbGxhcHNpYmxlKTtcbiAgICAgKiB0cmVlLmNvbGxhcHNlQWxsKG5vZGVzKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VBbGwobm9kZXM/OiBJZ3hUcmVlTm9kZTxhbnk+W10pIHtcbiAgICAgICAgbm9kZXMgPSBub2RlcyB8fCB0aGlzLm5vZGVzLnRvQXJyYXkoKTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaChlID0+IGUuZXhwYW5kZWQgPSBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3QgYWxsIG5vZGVzIGlmIHRoZSBub2RlcyBjb2xsZWN0aW9uIGlzIGVtcHR5LiBPdGhlcndpc2UsIGRlc2VsZWN0IHRoZSBub2RlcyBpbiB0aGUgbm9kZXMgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBhcnIgPSBbXG4gICAgICogICAgICB0aGlzLnRyZWUubm9kZXMudG9BcnJheSgpWzBdLFxuICAgICAqICAgICAgdGhpcy50cmVlLm5vZGVzLnRvQXJyYXkoKVsxXVxuICAgICAqICBdO1xuICAgICAqICB0aGlzLnRyZWUuZGVzZWxlY3RBbGwoYXJyKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbm9kZXM6IElneFRyZWVOb2RlQ29tcG9uZW50PGFueT5bXVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdEFsbChub2Rlcz86IElneFRyZWVOb2RlQ29tcG9uZW50PGFueT5bXSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3ROb2Rlc1dpdGhOb0V2ZW50KG5vZGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUgbm9kZXMgdGhhdCBtYXRjaCB0aGUgcGFzc2VkIHNlYXJjaFRlcm0uXG4gICAgICogQWNjZXB0cyBhIGN1c3RvbSBjb21wYXJlciBmdW5jdGlvbiBmb3IgZXZhbHVhdGluZyB0aGUgc2VhcmNoIHRlcm0gYWdhaW5zdCB0aGUgbm9kZXMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrXG4gICAgICogRGVmYXVsdCBzZWFyY2ggY29tcGFyZXMgdGhlIHBhc3NlZCBgc2VhcmNoVGVybWAgYWdhaW5zdCB0aGUgbm9kZSdzIGBkYXRhYCBJbnB1dC5cbiAgICAgKiBXaGVuIHVzaW5nIGBmaW5kTm9kZXNgIHcvbyBhIGBjb21wYXJlcmAsIG1ha2Ugc3VyZSBhbGwgbm9kZXMgaGF2ZSBgZGF0YWAgcGFzc2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlYXJjaFRlcm0gVGhlIGRhdGEgb2YgdGhlIHNlYXJjaGVkIG5vZGVcbiAgICAgKiBAcGFyYW0gY29tcGFyZXIgQSBjdXN0b20gY29tcGFyZXIgZnVuY3Rpb24gdGhhdCBldmFsdWF0ZXMgdGhlIHBhc3NlZCBgc2VhcmNoVGVybWAgYWdhaW5zdCBhbGwgbm9kZXMuXG4gICAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9kZXMgdGhhdCBtYXRjaCB0aGUgc2VhcmNoLiBgbnVsbGAgaWYgbm8gbm9kZXMgYXJlIGZvdW5kLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZT5cbiAgICAgKiAgICAgPGlneC10cmVlLW5vZGUgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YVwiIFtkYXRhXT1cIm5vZGVcIj5cbiAgICAgKiAgICAgICAgICB7eyBub2RlLmxhYmVsIH19XG4gICAgICogICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBkYXRhOiBEYXRhRW50cnlbXSA9IEZFVENIRURfREFUQTtcbiAgICAgKiAuLi5cbiAgICAgKiBjb25zdCBtYXRjaGVkTm9kZXM6IElneFRyZWVOb2RlPERhdGFFbnRyeT5bXSA9IHRoaXMudHJlZS5maW5kTm9kZXM8RGF0YUVudHJ5PihzZWFyY2hUZXJtOiBkYXRhWzVdKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFVzaW5nIGEgY3VzdG9tIGNvbXBhcmVyXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBkYXRhOiBEYXRhRW50cnlbXSA9IEZFVENIRURfREFUQTtcbiAgICAgKiAuLi5cbiAgICAgKiBjb25zdCBjb21wYXJlcjogSWd4VHJlZVNlYXJjaFJlc29sdmVyID0gKGRhdGE6IGFueSwgbm9kZTogSWd4VHJlZU5vZGU8RGF0YUVudHJ5Pikge1xuICAgICAqICAgICAgcmV0dXJuIG5vZGUuZGF0YS5pbmRleCAlIDIgPT09IDA7XG4gICAgICogfVxuICAgICAqIGNvbnN0IGV2ZW5JbmRleE5vZGVzOiBJZ3hUcmVlTm9kZTxEYXRhRW50cnk+W10gPSB0aGlzLnRyZWUuZmluZE5vZGVzPERhdGFFbnRyeT4obnVsbCwgY29tcGFyZXIpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kTm9kZXMoc2VhcmNoVGVybTogYW55LCBjb21wYXJlcj86IElneFRyZWVTZWFyY2hSZXNvbHZlcik6IElneFRyZWVOb2RlQ29tcG9uZW50PGFueT5bXSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb21wYXJlRnVuYyA9IGNvbXBhcmVyIHx8IHRoaXMuX2NvbXBhcmVyO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ub2Rlcy5maWx0ZXIobm9kZSA9PiBjb21wYXJlRnVuYyhzZWFyY2hUZXJtLCBub2RlKSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzPy5sZW5ndGggPT09IDAgPyBudWxsIDogcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB0aGlzLm5hdlNlcnZpY2UuaGFuZGxlS2V5ZG93bihldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmRpc2FibGVkQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmF2U2VydmljZS51cGRhdGVfZGlzYWJsZWRfY2FjaGUoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2ZU5vZGVCaW5kaW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKG5vZGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kVG9Ob2RlKHRoaXMubmF2U2VydmljZS5hY3RpdmVOb2RlKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsTm9kZUludG9WaWV3KG5vZGU/LmhlYWRlcj8ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1YlRvQ29sbGFwc2luZygpO1xuICAgICAgICB0aGlzLnJlc2l6ZU5vdGlmeS5waXBlKFxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDQwLCBudWxsLCB7IHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTm9kZUludG9WaWV3KHRoaXMubmF2U2VydmljZS5hY3RpdmVOb2RlPy5oZWFkZXIubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJUb0NoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2Nyb2xsTm9kZUludG9WaWV3KHRoaXMubmF2U2VydmljZS5hY3RpdmVOb2RlPy5oZWFkZXI/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnN1YlRvQ2hhbmdlcygpO1xuICAgICAgICByZXNpemVPYnNlcnZhYmxlKHRoaXMubmF0aXZlRWxlbWVudCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2l6ZU5vdGlmeS5uZXh0KCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51bnN1YkNoaWxkcmVuJC5uZXh0KCk7XG4gICAgICAgIHRoaXMudW5zdWJDaGlsZHJlbiQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGFuZFRvTm9kZShub2RlOiBJZ3hUcmVlTm9kZTxhbnk+KSB7XG4gICAgICAgIGlmIChub2RlICYmIG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbm9kZS5wYXRoLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG4gIT09IG5vZGUgJiYgIW4uZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbi5leHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN1YlRvQ29sbGFwc2luZygpIHtcbiAgICAgICAgdGhpcy5ub2RlQ29sbGFwc2luZy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5hdlNlcnZpY2UudXBkYXRlX3Zpc2libGVfY2FjaGUoZXZlbnQubm9kZSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub2RlRXhwYW5kaW5nLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmNhbmNlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmF2U2VydmljZS51cGRhdGVfdmlzaWJsZV9jYWNoZShldmVudC5ub2RlLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJUb0NoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMudW5zdWJDaGlsZHJlbiQubmV4dCgpO1xuICAgICAgICBjb25zdCB0b0JlU2VsZWN0ZWQgPSBbLi4udGhpcy5mb3JjZVNlbGVjdF07XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Tm9kZXNXaXRoTm9FdmVudCh0b0JlU2VsZWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mb3JjZVNlbGVjdCA9IFtdO1xuICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBub2RlLmV4cGFuZGVkQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJDaGlsZHJlbiQpKS5zdWJzY3JpYmUobm9kZVN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdlNlcnZpY2UudXBkYXRlX3Zpc2libGVfY2FjaGUobm9kZSwgbm9kZVN0YXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbm9kZS5jbG9zZUFuaW1hdGlvbkRvbmUucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YkNoaWxkcmVuJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMubmF2U2VydmljZS5mb2N1c2VkTm9kZT8uaGVhZGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxOb2RlSW50b1ZpZXcodGFyZ2V0RWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5vZGUub3BlbkFuaW1hdGlvbkRvbmUucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YkNoaWxkcmVuJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMubmF2U2VydmljZS5mb2N1c2VkTm9kZT8uaGVhZGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxOb2RlSW50b1ZpZXcodGFyZ2V0RWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmF2U2VydmljZS5pbml0X2ludmlzaWJsZV9jYWNoZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsTm9kZUludG9WaWV3KGVsOiBIVE1MRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZVJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdHJlZVJlY3QgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRvcE9mZnNldCA9IHRyZWVSZWN0LnRvcCA+IG5vZGVSZWN0LnRvcCA/IG5vZGVSZWN0LnRvcCAtIHRyZWVSZWN0LnRvcCA6IDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbU9mZnNldCA9IHRyZWVSZWN0LmJvdHRvbSA8IG5vZGVSZWN0LmJvdHRvbSA/IG5vZGVSZWN0LmJvdHRvbSAtIHRyZWVSZWN0LmJvdHRvbSA6IDA7XG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbCA9ICEhdG9wT2Zmc2V0IHx8ICEhYm90dG9tT2Zmc2V0O1xuICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsICYmIHRoaXMubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gbm9kZVJlY3QueSAtIHRyZWVSZWN0LnkgLSBub2RlUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wICsgYm90dG9tT2Zmc2V0ICsgdG9wT2Zmc2V0ICsgKHRvcE9mZnNldCA/IC0xIDogKzEpICogbm9kZVJlY3QuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29tcGFyZXIgPSA8VD4oZGF0YTogVCwgbm9kZTogSWd4VHJlZU5vZGVDb21wb25lbnQ8VD4pID0+IG5vZGUuZGF0YSA9PT0gZGF0YTtcblxufVxuIiwiPGRpdiBjbGFzcz1cImlneC10cmVlX19yb290XCIgcm9sZT1cInRyZWVcIiAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtdHJlZS1ub2RlXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
516
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvdHJlZS90cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi90cmVlL3RyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULFdBQVcsRUFHWCxlQUFlLEVBRWYsV0FBVyxFQUVYLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RCxPQUFPLEVBQ0gsa0JBQWtCLEVBQUUsb0JBQW9CLEVBRTNDLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7OztBQUV0RDs7O0dBR0c7QUFLSCxNQUFNLE9BQU8sNEJBQTRC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SztzQkFEWCxlQUFlO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBEaXJlY3RpdmUsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgT25Jbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIE9uRGVzdHJveSxcbiAgICBIb3N0QmluZGluZyxcbiAgICBFbGVtZW50UmVmLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgT3B0aW9uYWwsXG4gICAgSW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVG9nZ2xlQW5pbWF0aW9uU2V0dGluZ3MgfSBmcm9tICcuLi9leHBhbnNpb24tcGFuZWwvdG9nZ2xlLWFuaW1hdGlvbi1jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBJR1hfVFJFRV9DT01QT05FTlQsIElneFRyZWVTZWxlY3Rpb25UeXBlLCBJZ3hUcmVlLCBJVHJlZU5vZGVUb2dnbGVkRXZlbnRBcmdzLFxuICAgIElUcmVlTm9kZVRvZ2dsaW5nRXZlbnRBcmdzLCBJVHJlZU5vZGVTZWxlY3Rpb25FdmVudCwgSWd4VHJlZU5vZGUsIElneFRyZWVTZWFyY2hSZXNvbHZlclxufSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBJZ3hUcmVlTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL3RyZWUtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneFRyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi90cmVlLW5vZGUvdHJlZS1ub2RlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hUcmVlU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vdHJlZS1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hUcmVlU2VydmljZSB9IGZyb20gJy4vdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdyb3dWZXJJbiwgZ3Jvd1Zlck91dCB9IGZyb20gJ2lnbml0ZXVpLWFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyByZXNpemVPYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJZ3hJY29uU2VydmljZSB9IGZyb20gJy4uL2ljb24vaWNvbi5zZXJ2aWNlJztcblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICogVXNlZCBmb3IgdGVtcGxhdGluZyB0aGUgc2VsZWN0IG1hcmtlciBvZiB0aGUgdHJlZVxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hUcmVlU2VsZWN0TWFya2VyXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlU2VsZWN0TWFya2VyRGlyZWN0aXZlIHtcbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICogVXNlZCBmb3IgdGVtcGxhdGluZyB0aGUgZXhwYW5kIGluZGljYXRvciBvZiB0aGUgdHJlZVxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hUcmVlRXhwYW5kSW5kaWNhdG9yXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlRXhwYW5kSW5kaWNhdG9yRGlyZWN0aXZlIHtcbn1cblxuLyoqXG4gKiBJZ3hUcmVlQ29tcG9uZW50IGFsbG93cyBhIGRldmVsb3BlciB0byBzaG93IGEgc2V0IG9mIG5vZGVzIGluIGEgaGllcmFyY2hpY2FsIGZhc2hpb24uXG4gKlxuICogQGlneE1vZHVsZSBJZ3hUcmVlTW9kdWxlXG4gKiBAaWd4S2V5d29yZHMgdHJlZVxuICogQGlneFRoZW1lIGlneC10cmVlLXRoZW1lXG4gKiBAaWd4R3JvdXAgR3JpZHMgJiBMaXN0c1xuICpcbiAqIEByZW1hcmtcbiAqIFRoZSBBbmd1bGFyIFRyZWUgQ29tcG9uZW50IGFsbG93cyB1c2VycyB0byByZXByZXNlbnQgaGllcmFyY2hpY2FsIGRhdGEgaW4gYSB0cmVlLXZpZXcgc3RydWN0dXJlLFxuICogbWFpbnRhaW5pbmcgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMsIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHN0YXRpYyB0cmVlLXZpZXcgc3RydWN0dXJlIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIGRhdGEgbW9kZWwuXG4gKiBJdHMgcHJpbWFyeSBwdXJwb3NlIGlzIHRvIGFsbG93IGVuZC11c2VycyB0byB2aXN1YWxpemUgYW5kIG5hdmlnYXRlIHdpdGhpbiBoaWVyYXJjaGljYWwgZGF0YSBzdHJ1Y3R1cmVzLlxuICogVGhlIElnbml0ZSBVSSBmb3IgQW5ndWxhciBUcmVlIENvbXBvbmVudCBhbHNvIHByb3ZpZGVzIGxvYWQgb24gZGVtYW5kIGNhcGFiaWxpdGllcywgaXRlbSBhY3RpdmF0aW9uLFxuICogYmktc3RhdGUgYW5kIGNhc2NhZGluZyBzZWxlY3Rpb24gb2YgaXRlbXMgdGhyb3VnaCBidWlsdC1pbiBjaGVja2JveGVzLCBidWlsdC1pbiBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBtb3JlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LXRyZWU+XG4gKiAgIDxpZ3gtdHJlZS1ub2RlPlxuICogICAgICBJIGFtIGEgcGFyZW50IG5vZGUgMVxuICogICAgICA8aWd4LXRyZWUtbm9kZT5cbiAqICAgICAgICAgIEkgYW0gYSBjaGlsZCBub2RlIDFcbiAqICAgICAgPC9pZ3gtdHJlZS1ub2RlPlxuICogICAgICAuLi5cbiAqICAgPC9pZ3gtdHJlZS1ub2RlPlxuICpcdCAuLi5cbiAqIDwvaWd4LXRyZWU+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtdHJlZScsXG4gICAgdGVtcGxhdGVVcmw6ICd0cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgSWd4VHJlZVNlcnZpY2UsXG4gICAgICAgIElneFRyZWVTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBJZ3hUcmVlTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHsgcHJvdmlkZTogSUdYX1RSRUVfQ09NUE9ORU5ULCB1c2VFeGlzdGluZzogSWd4VHJlZUNvbXBvbmVudCB9LFxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgSWd4VHJlZSwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdHJlZScpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC10cmVlJztcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0cmVlIHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHRyZWUgc2VsZWN0aW9uIG1vZGUgaXMgJ05vbmUnXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbk1vZGU6IElneFRyZWVTZWxlY3Rpb25UeXBlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGlvbihzZWxlY3Rpb25Nb2RlOiBJZ3hUcmVlU2VsZWN0aW9uVHlwZSkge1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJOb2Rlc1NlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIC8qKiBHZXQvU2V0IGhvdyB0aGUgdHJlZSBzaG91bGQgaGFuZGxlIGJyYW5jaCBleHBhbnNpb24uXG4gICAgICogSWYgc2V0IHRvIGB0cnVlYCwgb25seSBhIHNpbmdsZSBicmFuY2ggY2FuIGJlIGV4cGFuZGVkIGF0IGEgdGltZSwgY29sbGFwc2luZyBhbGwgb3RoZXJzXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlIFtzaW5nbGVCcmFuY2hFeHBhbmRdPVwidHJ1ZVwiPlxuICAgICAqIC4uLlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdHJlZTogSWd4VHJlZSA9IHRoaXMudHJlZTtcbiAgICAgKiB0aGlzLnRyZWUuc2luZ2xlQnJhbmNoRXhwYW5kID0gZmFsc2U7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIHNpbmdsZUJyYW5jaEV4cGFuZCA9IGZhbHNlO1xuXG4gICAgLyoqIEdldC9TZXQgaWYgbm9kZXMgc2hvdWxkIGJlIGV4cGFuZGVkL2NvbGxhcHNlZCB3aGVuIGNsaWNraW5nIG92ZXIgdGhlbS5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWUgW3RvZ2dsZU5vZGVPbkNsaWNrXT1cInRydWVcIj5cbiAgICAgKiAuLi5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRyZWU6IElneFRyZWUgPSB0aGlzLnRyZWU7XG4gICAgICogdGhpcy50cmVlLnRvZ2dsZU5vZGVPbkNsaWNrID0gZmFsc2U7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIHRvZ2dsZU5vZGVPbkNsaWNrID0gZmFsc2U7XG5cblxuICAgIC8qKiBHZXQvU2V0IHRoZSBhbmltYXRpb24gc2V0dGluZ3MgdGhhdCBicmFuY2hlcyBzaG91bGQgdXNlIHdoZW4gZXhwYW5kaW5nL2NvbGxwYXNpbmcuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlIFthbmltYXRpb25TZXR0aW5nc109XCJjdXN0b21BbmltYXRpb25TZXR0aW5nc1wiPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgYW5pbWF0aW9uU2V0dGluZ3M6IFRvZ2dsZUFuaW1hdGlvblNldHRpbmdzID0ge1xuICAgICAqICAgICAgb3BlbkFuaW1hdGlvbjogZ3Jvd1ZlckluLFxuICAgICAqICAgICAgY2xvc2VBbmltYXRpb246IGdyb3dWZXJPdXRcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdGhpcy50cmVlLmFuaW1hdGlvblNldHRpbmdzID0gYW5pbWF0aW9uU2V0dGluZ3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYW5pbWF0aW9uU2V0dGluZ3M6IFRvZ2dsZUFuaW1hdGlvblNldHRpbmdzID0ge1xuICAgICAgICBvcGVuQW5pbWF0aW9uOiBncm93VmVySW4sXG4gICAgICAgIGNsb3NlQW5pbWF0aW9uOiBncm93VmVyT3V0XG4gICAgfTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIG5vZGUgc2VsZWN0aW9uIGlzIGNoYW5nZWQgdGhyb3VnaCBpbnRlcmFjdGlvblxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZSAobm9kZVNlbGVjdGlvbik9XCJoYW5kbGVOb2RlU2VsZWN0aW9uKCRldmVudClcIj5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGhhbmRsZU5vZGVTZWxlY3Rpb24oZXZlbnQ6IElUcmVlTm9kZVNlbGVjdGlvbkV2ZW50KSB7XG4gICAgICogIGNvbnN0IG5ld1NlbGVjdGlvbjogSWd4VHJlZU5vZGU8YW55PltdID0gZXZlbnQubmV3U2VsZWN0aW9uO1xuICAgICAqICBjb25zdCBhZGRlZDogSWd4VHJlZU5vZGU8YW55PltdID0gZXZlbnQuYWRkZWQ7XG4gICAgICogIGNvbnNvbGUubG9nKFwiTmV3IHNlbGVjdGlvbiB3aWxsIGJlOiBcIiwgbmV3U2VsZWN0aW9uKTtcbiAgICAgKiAgY29uc29sZS5sb2coXCJBZGRlZCBub2RlczogXCIsIGV2ZW50LmFkZGVkKTtcbiAgICAgKiB9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbm9kZVNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8SVRyZWVOb2RlU2VsZWN0aW9uRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgbm9kZSBpcyBleHBhbmRpbmcsIGJlZm9yZSBpdCBmaW5pc2hlc1xuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdHJlZSAobm9kZUV4cGFuZGluZyk9XCJoYW5kbGVOb2RlRXhwYW5kaW5nKCRldmVudClcIj5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGhhbmRsZU5vZGVFeHBhbmRpbmcoZXZlbnQ6IElUcmVlTm9kZVRvZ2dsaW5nRXZlbnRBcmdzKSB7XG4gICAgICogIGNvbnN0IGV4cGFuZGVkTm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IGV2ZW50Lm5vZGU7XG4gICAgICogIGlmIChleHBhbmRlZE5vZGUuZGlzYWJsZWQpIHtcbiAgICAgKiAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7XG4gICAgICogIH1cbiAgICAgKiB9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbm9kZUV4cGFuZGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVRyZWVOb2RlVG9nZ2xpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZCwgYWZ0ZXIgaXQgZmluaXNoZXNcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWUgKG5vZGVFeHBhbmRlZCk9XCJoYW5kbGVOb2RlRXhwYW5kZWQoJGV2ZW50KVwiPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgaGFuZGxlTm9kZUV4cGFuZGVkKGV2ZW50OiBJVHJlZU5vZGVUb2dnbGVkRXZlbnRBcmdzKSB7XG4gICAgICogIGNvbnN0IGV4cGFuZGVkTm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IGV2ZW50Lm5vZGU7XG4gICAgICogIGNvbnNvbGUubG9nKFwiTm9kZSBpcyBleHBhbmRlZDogXCIsIGV4cGFuZGVkTm9kZS5kYXRhKTtcbiAgICAgKiB9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbm9kZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJVHJlZU5vZGVUb2dnbGVkRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIG5vZGUgaXMgY29sbGFwc2luZywgYmVmb3JlIGl0IGZpbmlzaGVzXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlIChub2RlQ29sbGFwc2luZyk9XCJoYW5kbGVOb2RlQ29sbGFwc2luZygkZXZlbnQpXCI+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBoYW5kbGVOb2RlQ29sbGFwc2luZyhldmVudDogSVRyZWVOb2RlVG9nZ2xpbmdFdmVudEFyZ3MpIHtcbiAgICAgKiAgY29uc3QgY29sbGFwc2VkTm9kZTogSWd4VHJlZU5vZGU8YW55PiA9IGV2ZW50Lm5vZGU7XG4gICAgICogIGlmIChjb2xsYXBzZWROb2RlLmFsd2F5c09wZW4pIHtcbiAgICAgKiAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7XG4gICAgICogIH1cbiAgICAgKiB9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbm9kZUNvbGxhcHNpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElUcmVlTm9kZVRvZ2dsaW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkLCBhZnRlciBpdCBmaW5pc2hlc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlIChub2RlQ29sbGFwc2VkKT1cImhhbmRsZU5vZGVDb2xsYXBzZWQoJGV2ZW50KVwiPlxuICAgICAqIDwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBoYW5kbGVOb2RlQ29sbGFwc2VkKGV2ZW50OiBJVHJlZU5vZGVUb2dnbGVkRXZlbnRBcmdzKSB7XG4gICAgICogIGNvbnN0IGNvbGxhcHNlZE5vZGU6IElneFRyZWVOb2RlPGFueT4gPSBldmVudC5ub2RlO1xuICAgICAqICBjb25zb2xlLmxvZyhcIk5vZGUgaXMgY29sbGFwc2VkOiBcIiwgY29sbGFwc2VkTm9kZS5kYXRhKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG5vZGVDb2xsYXBzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElUcmVlTm9kZVRvZ2dsZWRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGFjdGl2ZSBub2RlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIDxpZ3gtdHJlZSAoYWN0aXZlTm9kZUNoYW5nZWQpPVwiYWN0aXZlTm9kZUNoYW5nZWQoJGV2ZW50KVwiPjwvaWd4LXRyZWU+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFjdGl2ZU5vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hUcmVlTm9kZTxhbnk+PigpO1xuXG4gICAgLyoqXG4gICAgICogQSBjdXN0b20gdGVtcGxhdGUgdG8gYmUgdXNlZCBmb3IgdGhlIGV4cGFuZCBpbmRpY2F0b3Igb2Ygbm9kZXNcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10cmVlPlxuICAgICAqICA8bmctdGVtcGxhdGUgaWd4VHJlZUV4cGFuZEluZGljYXRvciBsZXQtZXhwYW5kZWQ+XG4gICAgICogICAgICA8aWd4LWljb24+e3sgZXhwYW5kZWQgPyBcImNsb3NlX2Z1bGxzY3JlZW5cIjogXCJvcGVuX2luX2Z1bGxcIn19PC9pZ3gtaWNvbj5cbiAgICAgKiAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiA8L2lneC10cmVlPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4VHJlZUV4cGFuZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBleHBhbmRJbmRpY2F0b3I6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFRyZWVOb2RlQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIG5vZGVzOiBRdWVyeUxpc3Q8SWd4VHJlZU5vZGVDb21wb25lbnQ8YW55Pj47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZGlzYWJsZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElneFRyZWVOb2RlPGFueT4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCAqKnJvb3QgbGV2ZWwqKiBub2Rlc1xuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRyZWU6IElneFRyZWUgPSB0aGlzLnRyZWU7XG4gICAgICogY29uc3Qgcm9vdE5vZGVzOiBJZ3hUcmVlTm9kZUNvbXBvbmVudDxhbnk+W10gPSB0cmVlLnJvb3ROb2RlcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3ROb2RlcygpOiBJZ3hUcmVlTm9kZUNvbXBvbmVudDxhbnk+W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcz8uZmlsdGVyKG5vZGUgPT4gbm9kZS5sZXZlbCA9PT0gMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhY3RpdmUgbm9kZSBpcyBzZXQgdGhyb3VnaCBBUElcbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2ZU5vZGVCaW5kaW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hUcmVlTm9kZTxhbnk+PigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGZvcmNlU2VsZWN0ID0gW107XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVzaXplTm90aWZ5ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIHByaXZhdGUgX3NlbGVjdGlvbjogSWd4VHJlZVNlbGVjdGlvblR5cGUgPSBJZ3hUcmVlU2VsZWN0aW9uVHlwZS5Ob25lO1xuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgdW5zdWJDaGlsZHJlbiQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbmF2U2VydmljZTogSWd4VHJlZU5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNlbGVjdGlvblNlcnZpY2U6IElneFRyZWVTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyZWVTZXJ2aWNlOiBJZ3hUcmVlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJZ3hJY29uU2VydmljZSkgaWNvblNlcnZpY2U/OiBJZ3hJY29uU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnJlZ2lzdGVyKHRoaXMpO1xuICAgICAgICB0aGlzLm5hdlNlcnZpY2UucmVnaXN0ZXIodGhpcyk7XG5cbiAgICAgICAgaWNvblNlcnZpY2U/LmFkZEljb25SZWYoJ2NoZXZyb25fcmlnaHQnLCAnZGVmYXVsdCcsIHtcbiAgICAgICAgICAgIG5hbWU6ICdjaGV2cm9uX3JpZ2h0JyxcbiAgICAgICAgICAgIGZhbWlseTogJ21hdGVyaWFsJ1xuICAgICAgICB9KTtcblxuICAgICAgICBpY29uU2VydmljZT8uYWRkSWNvblJlZignZXhwYW5kJywgJ2RlZmF1bHQnLCB7XG4gICAgICAgICAgICBuYW1lOiAnZXhwYW5kX21vcmUnLFxuICAgICAgICAgICAgZmFtaWx5OiAnbWF0ZXJpYWwnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgYWxsIG9mIHRoZSBwYXNzZWQgbm9kZXMuXG4gICAgICogSWYgbm8gbm9kZXMgYXJlIHBhc3NlZCwgZXhwYW5kcyBBTEwgbm9kZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlcyBub2RlcyB0byBiZSBleHBhbmRlZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRhcmdldE5vZGVzOiBJZ3hUcmVlTm9kZTxhbnk+ID0gdGhpcy50cmVlLmZpbmROb2Rlcyh0cnVlLCAoX2RhdGE6IGFueSwgbm9kZTogSWd4VHJlZU5vZGU8YW55PikgPT4gbm9kZS5kYXRhLmV4cGFuZGFibGUpO1xuICAgICAqIHRyZWUuZXhwYW5kQWxsKG5vZGVzKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kQWxsKG5vZGVzPzogSWd4VHJlZU5vZGU8YW55PltdKSB7XG4gICAgICAgIG5vZGVzID0gbm9kZXMgfHwgdGhpcy5ub2Rlcy50b0FycmF5KCk7XG4gICAgICAgIG5vZGVzLmZvckVhY2goZSA9PiBlLmV4cGFuZGVkID0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGFwc2VzIGFsbCBvZiB0aGUgcGFzc2VkIG5vZGVzLlxuICAgICAqIElmIG5vIG5vZGVzIGFyZSBwYXNzZWQsIGNvbGxhcHNlcyBBTEwgbm9kZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlcyBub2RlcyB0byBiZSBjb2xsYXBzZWRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0YXJnZXROb2RlczogSWd4VHJlZU5vZGU8YW55PiA9IHRoaXMudHJlZS5maW5kTm9kZXModHJ1ZSwgKF9kYXRhOiBhbnksIG5vZGU6IElneFRyZWVOb2RlPGFueT4pID0+IG5vZGUuZGF0YS5jb2xsYXBzaWJsZSk7XG4gICAgICogdHJlZS5jb2xsYXBzZUFsbChub2Rlcyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbGxhcHNlQWxsKG5vZGVzPzogSWd4VHJlZU5vZGU8YW55PltdKSB7XG4gICAgICAgIG5vZGVzID0gbm9kZXMgfHwgdGhpcy5ub2Rlcy50b0FycmF5KCk7XG4gICAgICAgIG5vZGVzLmZvckVhY2goZSA9PiBlLmV4cGFuZGVkID0gZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0IGFsbCBub2RlcyBpZiB0aGUgbm9kZXMgY29sbGVjdGlvbiBpcyBlbXB0eS4gT3RoZXJ3aXNlLCBkZXNlbGVjdCB0aGUgbm9kZXMgaW4gdGhlIG5vZGVzIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgY29uc3QgYXJyID0gW1xuICAgICAqICAgICAgdGhpcy50cmVlLm5vZGVzLnRvQXJyYXkoKVswXSxcbiAgICAgKiAgICAgIHRoaXMudHJlZS5ub2Rlcy50b0FycmF5KClbMV1cbiAgICAgKiAgXTtcbiAgICAgKiAgdGhpcy50cmVlLmRlc2VsZWN0QWxsKGFycik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5vZGVzOiBJZ3hUcmVlTm9kZUNvbXBvbmVudDxhbnk+W11cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RBbGwobm9kZXM/OiBJZ3hUcmVlTm9kZUNvbXBvbmVudDxhbnk+W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Tm9kZXNXaXRoTm9FdmVudChub2Rlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIG5vZGVzIHRoYXQgbWF0Y2ggdGhlIHBhc3NlZCBzZWFyY2hUZXJtLlxuICAgICAqIEFjY2VwdHMgYSBjdXN0b20gY29tcGFyZXIgZnVuY3Rpb24gZm9yIGV2YWx1YXRpbmcgdGhlIHNlYXJjaCB0ZXJtIGFnYWluc3QgdGhlIG5vZGVzLlxuICAgICAqXG4gICAgICogQHJlbWFya1xuICAgICAqIERlZmF1bHQgc2VhcmNoIGNvbXBhcmVzIHRoZSBwYXNzZWQgYHNlYXJjaFRlcm1gIGFnYWluc3QgdGhlIG5vZGUncyBgZGF0YWAgSW5wdXQuXG4gICAgICogV2hlbiB1c2luZyBgZmluZE5vZGVzYCB3L28gYSBgY29tcGFyZXJgLCBtYWtlIHN1cmUgYWxsIG5vZGVzIGhhdmUgYGRhdGFgIHBhc3NlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWFyY2hUZXJtIFRoZSBkYXRhIG9mIHRoZSBzZWFyY2hlZCBub2RlXG4gICAgICogQHBhcmFtIGNvbXBhcmVyIEEgY3VzdG9tIGNvbXBhcmVyIGZ1bmN0aW9uIHRoYXQgZXZhbHVhdGVzIHRoZSBwYXNzZWQgYHNlYXJjaFRlcm1gIGFnYWluc3QgYWxsIG5vZGVzLlxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIG5vZGVzIHRoYXQgbWF0Y2ggdGhlIHNlYXJjaC4gYG51bGxgIGlmIG5vIG5vZGVzIGFyZSBmb3VuZC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRyZWU+XG4gICAgICogICAgIDxpZ3gtdHJlZS1ub2RlICpuZ0Zvcj1cImxldCBub2RlIG9mIGRhdGFcIiBbZGF0YV09XCJub2RlXCI+XG4gICAgICogICAgICAgICAge3sgbm9kZS5sYWJlbCB9fVxuICAgICAqICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICogPC9pZ3gtdHJlZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgZGF0YTogRGF0YUVudHJ5W10gPSBGRVRDSEVEX0RBVEE7XG4gICAgICogLi4uXG4gICAgICogY29uc3QgbWF0Y2hlZE5vZGVzOiBJZ3hUcmVlTm9kZTxEYXRhRW50cnk+W10gPSB0aGlzLnRyZWUuZmluZE5vZGVzPERhdGFFbnRyeT4oc2VhcmNoVGVybTogZGF0YVs1XSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBVc2luZyBhIGN1c3RvbSBjb21wYXJlclxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgZGF0YTogRGF0YUVudHJ5W10gPSBGRVRDSEVEX0RBVEE7XG4gICAgICogLi4uXG4gICAgICogY29uc3QgY29tcGFyZXI6IElneFRyZWVTZWFyY2hSZXNvbHZlciA9IChkYXRhOiBhbnksIG5vZGU6IElneFRyZWVOb2RlPERhdGFFbnRyeT4pIHtcbiAgICAgKiAgICAgIHJldHVybiBub2RlLmRhdGEuaW5kZXggJSAyID09PSAwO1xuICAgICAqIH1cbiAgICAgKiBjb25zdCBldmVuSW5kZXhOb2RlczogSWd4VHJlZU5vZGU8RGF0YUVudHJ5PltdID0gdGhpcy50cmVlLmZpbmROb2RlczxEYXRhRW50cnk+KG51bGwsIGNvbXBhcmVyKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZE5vZGVzKHNlYXJjaFRlcm06IGFueSwgY29tcGFyZXI/OiBJZ3hUcmVlU2VhcmNoUmVzb2x2ZXIpOiBJZ3hUcmVlTm9kZUNvbXBvbmVudDxhbnk+W10gfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29tcGFyZUZ1bmMgPSBjb21wYXJlciB8fCB0aGlzLl9jb21wYXJlcjtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMubm9kZXMuZmlsdGVyKG5vZGUgPT4gY29tcGFyZUZ1bmMoc2VhcmNoVGVybSwgbm9kZSkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0cz8ubGVuZ3RoID09PSAwID8gbnVsbCA6IHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLmhhbmRsZUtleWRvd24oZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5hdlNlcnZpY2UudXBkYXRlX2Rpc2FibGVkX2NhY2hlKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmVOb2RlQmluZGluZ0NoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChub2RlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZFRvTm9kZSh0aGlzLm5hdlNlcnZpY2UuYWN0aXZlTm9kZSk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbE5vZGVJbnRvVmlldyhub2RlPy5oZWFkZXI/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdWJUb0NvbGxhcHNpbmcoKTtcbiAgICAgICAgdGhpcy5yZXNpemVOb3RpZnkucGlwZShcbiAgICAgICAgICAgIHRocm90dGxlVGltZSg0MCwgbnVsbCwgeyB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbE5vZGVJbnRvVmlldyh0aGlzLm5hdlNlcnZpY2UuYWN0aXZlTm9kZT8uaGVhZGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMubm9kZXMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3ViVG9DaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNjcm9sbE5vZGVJbnRvVmlldyh0aGlzLm5hdlNlcnZpY2UuYWN0aXZlTm9kZT8uaGVhZGVyPy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zdWJUb0NoYW5nZXMoKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNpemVOb3RpZnkubmV4dCgpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudW5zdWJDaGlsZHJlbiQubmV4dCgpO1xuICAgICAgICB0aGlzLnVuc3ViQ2hpbGRyZW4kLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHBhbmRUb05vZGUobm9kZTogSWd4VHJlZU5vZGU8YW55Pikge1xuICAgICAgICBpZiAobm9kZSAmJiBub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIG5vZGUucGF0aC5mb3JFYWNoKG4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuICE9PSBub2RlICYmICFuLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG4uZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJUb0NvbGxhcHNpbmcoKSB7XG4gICAgICAgIHRoaXMubm9kZUNvbGxhcHNpbmcucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLnVwZGF0ZV92aXNpYmxlX2NhY2hlKGV2ZW50Lm5vZGUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubm9kZUV4cGFuZGluZy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5hdlNlcnZpY2UudXBkYXRlX3Zpc2libGVfY2FjaGUoZXZlbnQubm9kZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3ViVG9DaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLnVuc3ViQ2hpbGRyZW4kLm5leHQoKTtcbiAgICAgICAgY29uc3QgdG9CZVNlbGVjdGVkID0gWy4uLnRoaXMuZm9yY2VTZWxlY3RdO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdE5vZGVzV2l0aE5vRXZlbnQodG9CZVNlbGVjdGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZm9yY2VTZWxlY3QgPSBbXTtcbiAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgbm9kZS5leHBhbmRlZENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViQ2hpbGRyZW4kKSkuc3Vic2NyaWJlKG5vZGVTdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLnVwZGF0ZV92aXNpYmxlX2NhY2hlKG5vZGUsIG5vZGVTdGF0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5vZGUuY2xvc2VBbmltYXRpb25Eb25lLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJDaGlsZHJlbiQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0aGlzLm5hdlNlcnZpY2UuZm9jdXNlZE5vZGU/LmhlYWRlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTm9kZUludG9WaWV3KHRhcmdldEVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBub2RlLm9wZW5BbmltYXRpb25Eb25lLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJDaGlsZHJlbiQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0aGlzLm5hdlNlcnZpY2UuZm9jdXNlZE5vZGU/LmhlYWRlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTm9kZUludG9WaWV3KHRhcmdldEVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5hdlNlcnZpY2UuaW5pdF9pbnZpc2libGVfY2FjaGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbE5vZGVJbnRvVmlldyhlbDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGVSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRyZWVSZWN0ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB0b3BPZmZzZXQgPSB0cmVlUmVjdC50b3AgPiBub2RlUmVjdC50b3AgPyBub2RlUmVjdC50b3AgLSB0cmVlUmVjdC50b3AgOiAwO1xuICAgICAgICBjb25zdCBib3R0b21PZmZzZXQgPSB0cmVlUmVjdC5ib3R0b20gPCBub2RlUmVjdC5ib3R0b20gPyBub2RlUmVjdC5ib3R0b20gLSB0cmVlUmVjdC5ib3R0b20gOiAwO1xuICAgICAgICBjb25zdCBzaG91bGRTY3JvbGwgPSAhIXRvcE9mZnNldCB8fCAhIWJvdHRvbU9mZnNldDtcbiAgICAgICAgaWYgKHNob3VsZFNjcm9sbCAmJiB0aGlzLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gdGhpcy5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgLy8gdGhpcy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IG5vZGVSZWN0LnkgLSB0cmVlUmVjdC55IC0gbm9kZVJlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCArIGJvdHRvbU9mZnNldCArIHRvcE9mZnNldCArICh0b3BPZmZzZXQgPyAtMSA6ICsxKSAqIG5vZGVSZWN0LmhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbXBhcmVyID0gPFQ+KGRhdGE6IFQsIG5vZGU6IElneFRyZWVOb2RlQ29tcG9uZW50PFQ+KSA9PiBub2RlLmRhdGEgPT09IGRhdGE7XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJpZ3gtdHJlZV9fcm9vdFwiIHJvbGU9XCJ0cmVlXCIgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXRyZWUtbm9kZVwiPjwvbmctY29udGVudD5cbjwvZGl2PlxuIl19