@energycap/components 0.39.16-ECAP-23123-Help-Popover-On-Controls.20240514-1647 → 0.39.16-ECAP-23124-menu-item-divider-improvements.20240516-0944

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.
@@ -14,7 +14,6 @@ import * as i7 from "../textbox/textbox.component";
14
14
  import * as i8 from "../../display/view-overlay/view-overlay.component";
15
15
  import * as i9 from "../menu/menu.component";
16
16
  import * as i10 from "../../shared/directives/popup/popup-container.directive";
17
- import * as i11 from "../help-popover/help-popover.component";
18
17
  /**
19
18
  * Select box (select, autocomplete, combobox)
20
19
  *
@@ -815,10 +814,10 @@ export class ComboboxComponent extends FormControlBase {
815
814
  }
816
815
  }
817
816
  ComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ComboboxComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }, { token: i3.TranslateService }, { token: i4.ScrollService }], target: i0.ɵɵFactoryTarget.Component });
818
- ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ComboboxComponent, selector: "ec-combobox", inputs: { addNew: "addNew", addNewOptions: "addNewOptions", maxlength: "maxlength", menuPosition: "menuPosition", minlength: "minlength", options: "options", templateType: "templateType", customMenuTemplate: "customMenuTemplate", preserveIconSpace: "preserveIconSpace", popupFixed: "popupFixed", totalRecords: "totalRecords", upperCase: "upperCase", placeholder: "placeholder", loadOnOpenObservable: "loadOnOpenObservable", hideToggleButton: "hideToggleButton", alwaysOpen: "alwaysOpen", menuElementClasses: "menuElementClasses", textboxElementClasses: "textboxElementClasses", hideNoMatches: "hideNoMatches", noMatchesText: "noMatchesText", truncateItems: "truncateItems" }, outputs: { addNewClick: "addNewClick", search: "search" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textbox"], descendants: true }, { propertyName: "popup", first: true, predicate: PopupContainerDirective, descendants: true }, { propertyName: "addNewButton", first: true, predicate: ["addNewButton"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\"\r\n [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\"\r\n [ngClass]=\"textboxElementClasses\"\r\n *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\"\r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i7.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i8.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i9.MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "directive", type: i10.PopupContainerDirective, selector: "[ecPopup]", inputs: ["ecPopup", "options"] }, { kind: "component", type: i11.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
817
+ ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ComboboxComponent, selector: "ec-combobox", inputs: { addNew: "addNew", addNewOptions: "addNewOptions", maxlength: "maxlength", menuPosition: "menuPosition", minlength: "minlength", options: "options", templateType: "templateType", customMenuTemplate: "customMenuTemplate", preserveIconSpace: "preserveIconSpace", popupFixed: "popupFixed", totalRecords: "totalRecords", upperCase: "upperCase", placeholder: "placeholder", loadOnOpenObservable: "loadOnOpenObservable", hideToggleButton: "hideToggleButton", alwaysOpen: "alwaysOpen", menuElementClasses: "menuElementClasses", textboxElementClasses: "textboxElementClasses", hideNoMatches: "hideNoMatches", noMatchesText: "noMatchesText", truncateItems: "truncateItems" }, outputs: { addNewClick: "addNewClick", search: "search" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textbox"], descendants: true }, { propertyName: "popup", first: true, predicate: PopupContainerDirective, descendants: true }, { propertyName: "addNewButton", first: true, predicate: ["addNewButton"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\" ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">{{validationErrors}}</span>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\" *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong \r\n class=\"ec-util-truncate\" \r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i7.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i8.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i9.MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "directive", type: i10.PopupContainerDirective, selector: "[ecPopup]", inputs: ["ecPopup", "options"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
819
818
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ComboboxComponent, decorators: [{
820
819
  type: Component,
821
- args: [{ selector: 'ec-combobox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\"\r\n [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\"\r\n [ngClass]=\"textboxElementClasses\"\r\n *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\"\r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"] }]
820
+ args: [{ selector: 'ec-combobox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\" ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">{{validationErrors}}</span>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\" *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong \r\n class=\"ec-util-truncate\" \r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"] }]
822
821
  }], ctorParameters: function () { return [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i3.TranslateService }, { type: i4.ScrollService }]; }, propDecorators: { onResize: [{
823
822
  type: HostListener,
824
823
  args: ['window:resize']
@@ -878,4 +877,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
878
877
  type: ViewChild,
879
878
  args: ['addNewButton']
880
879
  }] } });
881
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFtRCxTQUFTLEVBQWMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzFLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUtqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQWUsTUFBTSx5REFBeUQsQ0FBQzs7Ozs7Ozs7Ozs7OztBQXlCL0c7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFNSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsZUFBZTtJQUVyRDs7Ozs7T0FLRztJQUM0QixRQUFRO1FBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFrT0QsWUFDVyx3QkFBa0QsRUFDbEQsZUFBZ0MsRUFDaEMsU0FBMkIsRUFDM0IsYUFBNEI7UUFFdEMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBTHZDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGNBQVMs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QU1VLFVBQVU7c0JBQXpCLEtBQUs7Z0JBS1Usa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUtVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFHVSxhQUFhO3NCQUE1QixLQUFLO2dCQUtXLGFBQWE7c0JBQTVCLEtBQUs7Z0JBS1MsYUFBYTtzQkFBNUIsS0FBSztnQkFTVyxXQUFXO3NCQUEzQixNQUFNO2dCQU1VLE1BQU07c0JBQXRCLE1BQU07Z0JBR3NCLE9BQU87c0JBQW5DLFNBQVM7dUJBQUMsU0FBUztnQkFLd0IsS0FBSztzQkFBaEQsU0FBUzt1QkFBQyx1QkFBdUI7Z0JBTUMsWUFBWTtzQkFBOUMsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xCYXNlIH0gZnJvbSAnLi4vZm9ybS1jb250cm9sLWJhc2UnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVGV4dGJveENvbXBvbmVudCB9IGZyb20gJy4uL3RleHRib3gvdGV4dGJveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3ZhbGlkYXRpb24tbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwSGVscGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Zvcm0tZ3JvdXAuaGVscGVyJztcclxuaW1wb3J0IHsgTWVudUl0ZW0sIE1lbnVUZW1wbGF0ZVR5cGUsIE1lbnVIb3N0RWxlbWVudENsYXNzZXMgfSBmcm9tICcuLi9tZW51L21lbnUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUG9wdXBDb250YWluZXJEaXJlY3RpdmUsIFBvcHVwU3RhdHVzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RpcmVjdGl2ZXMvcG9wdXAvcG9wdXAtY29udGFpbmVyLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNjcm9sbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3Njcm9sbC5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbiBvZiB0aGUgbWVudSByZWxhdGl2ZSB0byB0aGUgaW5wdXRcclxuICovXHJcbmV4cG9ydCB0eXBlIENvbWJvYm94TWVudVBvc2l0aW9uID0gXCJ0b3BfcmlnaHRcIiB8IFwidG9wX2xlZnRcIiB8IFwiYm90dG9tX2xlZnRcIiB8IFwiYm90dG9tX3JpZ2h0XCI7XHJcblxyXG5cclxuLyoqXHJcbiAqIFRoZSB0eXBlIG9mIGFkZCBuZXcgaW1wbGVtZW50YXRpb24uIFN0YXRpYyBkaXNwbGF5cyBhIHNpbXBsZSBzdGF0aWMgYnV0dG9uIHdoaWxlIGR5bmFtaWMgdXBkYXRlc1xyXG4gKiB0aGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiB3aXRoIHZhbHVlIG9mIHRoZSB0ZXh0Ym94XHJcbiAqL1xyXG50eXBlIEFkZE5ld1R5cGUgPSBcImR5bmFtaWNcIiB8IFwic3RhdGljXCIgfCBib29sZWFuO1xyXG5cclxuLyoqXHJcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBcIkFkZCBuZXdcIiBidXR0b24gd2hlbiBpbiBzdGF0aWMgbW9kZVxyXG4gKi9cclxudHlwZSBBZGROZXdPcHRpb25zID0ge1xyXG5cdGxhYmVsPzogc3RyaW5nOyBcdC8qKiBBIGN1c3RvbSBsYWJlbCB0byBkaXNwbGF5IGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0IFwiQWRkIG5ldy4uLlwiICovXHJcblx0Y2xhc3NMaXN0Pzogc3RyaW5nOyBcdC8qKiBBIHN0cmluZyBvZiBzcGFjZS1zZXBhcmF0ZWQgdXRpbGl0eSBjbGFzc2VzIHdlJ2xsIGFwcGx5IHRvIHRoZSBsYWJlbCAqL1xyXG5cdGljb24/OiBzdHJpbmc7IFx0LyoqIEEgY3VzdG9tIGljb24gdG8gZGlzcGxheSBpbiBwbGFjZSBvZiB0aGUgZGVmYXVsdCAnaWNvbi1hZGQnICovXHJcbn07XHJcblxyXG5cclxuLyoqXHJcbiAqIFNlbGVjdCBib3ggKHNlbGVjdCwgYXV0b2NvbXBsZXRlLCBjb21ib2JveClcclxuICpcclxuICogTk9URTogTWluL21heCBsZW5ndGggdmFsaWRhdGlvbiBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgaW50ZXJuYWwgZWMtdGV4dGJveC5cclxuICogVmFsdWVzIHBhc3NlZCBpbiB2aWEgaW5wdXQgcHJvcGVydGllcyAoQHNlZSBtYXhsZW5ndGggLCBAc2VlIG1pbmxlbmd0aCApXHJcbiAqIGFyZSB1c2VkIHRvIGNyZWF0ZSB2YWxpZGF0b3JzIG9uIHRoZSB0ZXh0Ym94LiAgV2hlbiB0aGUgdmFsaWRhdGlvbiBvbiB0aGVcclxuICogdGV4dGJveCBmYWlscywgdGhlIHZhbGlkYXRpb24gZXJyb3IocykgZ2V0IHBhc3NlZCB1cCB0byB0aGUge0BzZWUgZm9ybU1vZGVsIH0uXHJcbiAqIFdoZW4gc2V0dGluZyB1cCB0aGlzIGNvbXBvbmVudCdzIHtAc2VlIEZvcm1Db250cm9sIH0sIHlvdSBkbyBOT1QgbmVlZCB0byBzZXQgdGhlXHJcbiAqIFZhbGlkYXRvcnMubWluTGVuZ3RoIG9yIFZhbGlkYXRvcnMubWF4TGVuZ3RoIHZhbGlkYXRvcnMuXHJcbiAqXHJcbiAqIFJlcXVpcmVkIGlzIGFsc28gcGFzc2VkIHZpYSBpbnB1dCBwcm9wZXJ0eSwgYnV0IHlvdSBTSE9VTEQgYWxzbyBzZXQgdXAgdGhlXHJcbiAqIFZhbGlkYXRvcnMucmVxdWlyZWQgdmFsaWRhdG9yIG9uIHRoaXMgY29tcG9uZW50J3MgRm9ybUNvbnRyb2wuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnZWMtY29tYm9ib3gnLFxyXG5cdHRlbXBsYXRlVXJsOiAnY29tYm9ib3guY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2NvbWJvYm94LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDbG9zZSB0aGUgcG9wdXAgbWVudSBvbiByZXNpemUgc28gdGhlIHdpZHRoIGFuZCBwb3NpdGlvbmluZyBjYW4gYmUgcmVjYWxjdWxhdGVkXHJcblx0ICogY29ycmVjdGx5LiBDYW5ub3QgYmUgcGxhY2VkIG9uIHRoZSBwb3B1cERpcmVjdGl2ZSBiZWNhdXNlIG9mIGEgYnVnIHdoZXJlXHJcblx0ICogSG9zdExpc3RlbmVycyBmb3IgZ2xvYmFsIGV2ZW50cyBkb24ndCBmaXJlXHJcblx0ICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNDE5MVxyXG5cdCAqL1xyXG5cdEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKSBvblJlc2l6ZSgpIHtcclxuXHRcdGlmICh0aGlzLnBvcHVwKSB0aGlzLnBvcHVwLmhpZGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3cgdGhlIGFkZCBuZXcgYnV0dG9uIGluIHRoZSBwb3B1cFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBhZGROZXc/OiBBZGROZXdUeXBlO1xyXG5cclxuXHQvKiogQ29uZmlndXJlIHRoZSBhZGROZXcgYnV0dG9uIGxhYmVsICYgaWNvbiB3aGVuIGFkZE5ldyBpcyB0cnVlIGFuZCBzZXQgdG8gc3RhdGljXHJcblx0ICogRGVmYXVsdCBpcyBzZXQgdG86IHsgbGFiZWw6ICdBbGwgbmV3Li4uJywgaWNvbjogJ2ljb24tYWRkJ31cclxuXHQgKiBAc2VlIEFkZE5ld09wdGlvbnNcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKiBAZXhhbXBsZVxyXG5cdCAqIDxlYy1jb21ib2JveCBbYWRkTmV3XT1cInRydWVcIiBcclxuXHQgKiBcdCAgICAgICAgIFthZGROZXdPcHRpb25zXT1cInsgXHJcbiogXHRcdFx0XHRcdFx0bGFiZWw6ICdIZWxwIG1lIGNob29zZS4uLicsXHJcbiogXHRcdFx0XHRcdFx0aWNvbjogJ2ljb24tc2VhcmNoJyxcclxuKiBcdFx0XHRcdFx0XHRjbGFzc0xpc3Q6ICd0ZXh0LWJvZHktMiB0ZXh0LWxpbmsnIH1cIj5cclxuXHQgKiA8L2VjLWNvbWJvYm94PlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBhZGROZXdPcHRpb25zPzogQWRkTmV3T3B0aW9ucyA9IHsgXHJcblx0XHRsYWJlbDogJ0FkZCBuZXcuLi4nLFxyXG5cdFx0aWNvbjogJ2ljb24tYWRkJyxcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBpbnB1dC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBUZXh0Ym94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG1heGxlbmd0aD86IG51bWJlcjtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHRoZSB0ZXh0IGJveFxyXG5cdCAqIEBkZWZhdWx0ICdib3R0b21fcmlnaHQnXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG1lbnVQb3NpdGlvbj86IENvbWJvYm94TWVudVBvc2l0aW9uID0gJ2JvdHRvbV9yaWdodCc7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBpbnB1dFxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIFRleHRib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWlubGVuZ3RoPzogbnVtYmVyO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogSXRlbXMgdG8gc2hvdyBpbiBjb21ib2JveCBtZW51XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwbGF5IHRlbXBsYXRlIGZvciBtZW51IGl0ZW1zXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGVUeXBlOiBNZW51VGVtcGxhdGVUeXBlID0gJ2xhYmVsJztcclxuXHJcblx0LyoqXHJcbiAgICAgKiBPcHRpb25hbCBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBtZW51IGl0ZW1zLiBNdXN0IGRlY2xhcmUgYSB0ZW1wbGF0ZVxyXG5cdCAqIGlucHV0IHZhcmlhYmxlIGNhbGxlZCBcIml0ZW1cIiBsaWtlIHNvOiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlTmFtZSBsZXQtaXRlbT4sXHJcblx0ICogd2hlcmUgaXRlbSByZXByZXNlbnRzIHRoZSBtZW51SXRlbS5cclxuICAgICAqIFdpbGwgb3ZlcnJpZGUgdGhlIGNob2ljZSBmb3IgdGVtcGxhdGVUeXBlIGlmIHByb3ZpZGVkLlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21NZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHQvKipcclxuXHQgKiBXaGVuIHRydWUsIHRoZSBtZW51IGl0ZW1zIHdpbGwgcHJlc2VydmUgdGhlIGljb24gc3BhY2Ugd2hlbiB0aGVyZSBpcyBubyBpY29uXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHByZXNlcnZlSWNvblNwYWNlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBvc2l0aW9uIHRoZSBtZW51IGFzIGZpeGVkLCBpZGVhbCB3aGVuIGNvbWJvYm94ZXMgYXJlIGluc2lkZSBkaWFsb2dzXHJcblx0ICogRGVmYXVsdGluZyB0byB0cnVlIHNvIGFsbCBtZW51cyB3aWxsIGJlIGF0IGxlYXN0IHRoZSB3aWR0aCBvZiB0aGVcclxuXHQgKiB0ZXh0Ym94ICsgYnV0dG9uLCBidXQgY2FuIGdyb3cgd2lkZXIgaWYgdGhlIGlubmVyIGVsZW1lbnRzIG5lZWQgaXRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcG9wdXBGaXhlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgZnJvbSB0aGUgZGF0YXNvdXJjZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB0b3RhbFJlY29yZHM/OiBudW1iZXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHNldCB0byB0cnVlLCB3ZSB3aWxsIHVwcGVyQ2FzZSB0aGUgdGV4dCBib3ggYW5kIGFwcGx5IHRoZSBjbGFzcyBvbiB0aGUgYWRkIGJveFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB1cHBlckNhc2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cdC8qKlRoZSBwbGFjZWhvbGRlciB0byBzaG93IGluIHRoZSBjb21ib2JveC4gTGVhdmUgZW1wdHkgdG8gdXNlIGRlZmF1bHQgYmVoYXZpb3IgZGV0ZXJtaW5lZFxyXG5cdCAqIGJ5IHdoZXRoZXIgQWRkIE5ldyBpcyBlbmFibGVkXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblx0LyoqIE9ic2VydmFibGUgdG8gc3Vic2NyaWJlIHRvIHdoZW4gdGhlIGNvbWJvYm94IG1lbnUgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZSAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBsb2FkT25PcGVuT2JzZXJ2YWJsZT86IE9ic2VydmFibGU8TWVudUl0ZW1bXT4gfCB1bmRlZmluZWQ7XHJcblxyXG5cdC8qKiBEbyBub3QgZGlzcGxheSB0aGUgdG9nZ2xlIGJ1dHRvbiB3aGVuIHRydWUgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgaGlkZVRvZ2dsZUJ1dHRvbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBBbHdheXMgc2hvdyB0aGUgbWVudSB3aGVuIHRoZSBmb3JtTW9kZWwgaGFzIGEgdmFsdWUuIFNldHNcclxuXHQgKiBoaWRlVG9nZ2xlQnV0dG9uIHRvIHRydWUgYW5kIG1lbnVTdGF0dXMgdG8gdmlzaWJsZSBhcyB3ZWxsLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBhbHdheXNPcGVuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZGl0b25hbCBjbGFzc2VzIHRvIGFwcGx5IHRvIHRoZSBlYy1tZW51IGVsZW1lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWVudUVsZW1lbnRDbGFzc2VzOiBNZW51SG9zdEVsZW1lbnRDbGFzc2VzIHwgc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkaXRpb25hbCBjbGFzc2VzIHRvIGFwcGx5IHRvIHRoZSAudGV4dGJveC1ncm91cCBlbGVtZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHRleHRib3hFbGVtZW50Q2xhc3Nlczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqIEhpZGUgJ05vIG1hdGNoZXMnIG1lc3NhZ2Ugd2hlbiB0cnVlICovXHJcblx0QElucHV0KCkgcHVibGljIGhpZGVOb01hdGNoZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcbiAgICogVGV4dCB0byBzaG93IHdoZW4gdGhlIG1lbnUgaXMgZW1wdHkuIFwiTm8gbWF0Y2hlc1wiIGlzIHRoZSBkZWZhdWx0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBub01hdGNoZXNUZXh0OiBzdHJpbmcgPSAnTm9NYXRjaGVzX1NDJztcclxuXHJcblx0LyoqXHJcblx0ICogVHJ1bmNhdGUgbWVudSBpdGVtcyB3aGVuIHRydWVcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdHJ1bmNhdGVJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBOb3RpZnkgdGhlIHBhcmVudCB0aGF0IHRoZSBhZGQgbmV3IGJ1dHRvbiB3YXMgY2xpY2tlZFxyXG5cdCAqIEB0b2RvIGRpc2N1c3MgaWYgd2UgbmVlZCB0byBzZW5kIGFsb25nIHRoZSB2YWx1ZSBvciBzaG91bGRcclxuXHQgKiB0aGUgcGFyZW50IGdldCBpdCBmcm9tIHRoZSBmb3JtTW9kZWxcclxuXHQgKiAobHdmIDIwMTcuMDcuMTMpOiBJIHRoaW5rIHdlIG1pZ2h0IGFzIHdlbGwgc2VuZCB0aGUgdmFsdWUgYWxvbmcgYW5kXHJcblx0ICogbGVhdmUgaXQgdXAgdG8gdGhlIHBhcmVudCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdC5cclxuXHQgKi9cclxuXHRAT3V0cHV0KCkgcHVibGljIGFkZE5ld0NsaWNrOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogTm90aWZ5IHBhcmVudCB3aGVuIHRleHQgdHlwZWQgaW50byB0ZXh0Ym94XHJcblx0ICovXHJcblx0QE91dHB1dCgpIHB1YmxpYyBzZWFyY2g6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG5cclxuXHRAVmlld0NoaWxkKCd0ZXh0Ym94JykgcHVibGljIHRleHRib3ghOiBUZXh0Ym94Q29tcG9uZW50O1xyXG5cclxuXHQvKipcclxuXHQgKiBBY2Nlc3MgdG8gdGhlIG1lbnUncyBjb21wb25lbnQgdmlhIHRoZSAge0BsaW5rIFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlfVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoUG9wdXBDb250YWluZXJEaXJlY3RpdmUpIHByaXZhdGUgcG9wdXA/OiBQb3B1cENvbnRhaW5lckRpcmVjdGl2ZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0aGUgYWRkLW5ldyBidXR0b24gZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoJ2FkZE5ld0J1dHRvbicpIHByaXZhdGUgYWRkTmV3QnV0dG9uITogRWxlbWVudFJlZjtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEZpbHRlcmVkIEl0ZW1zIHRvIHNob3cgaW4gY29tYm9ib3ggbWVudVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnM6IEFycmF5PE1lbnVJdGVtPiA9IFtdO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVHJhY2tzIGlmIHRoZSBtZW51IGlzIG9wZW4gb3IgaGlkZGVuXHJcblx0ICovXHJcblx0cHVibGljIG1lbnVTdGF0dXM6IFBvcHVwU3RhdHVzID0gJ2hpZGRlbic7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBQbGFjZWhvbGRlciB0byBhc3NpZ24gdG8gdGV4dGJveFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZmZlY3RpdmVQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBtZW51IGl0ZW1cclxuXHQgKi9cclxuXHRwdWJsaWMgc2VsZWN0ZWRJdGVtOiBNZW51SXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRm9ybUNvbnRyb2wgZm9yIHRoZSB0ZXh0Ym94XHJcblx0ICovXHJcblx0cHVibGljIHRleHRib3hGb3JtTW9kZWw6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycpO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVHJhY2tzIHdoZXRoZXIgdGhlIGFkZCBuZXcgYnV0dG9uIGlzIHNlbGVjdGVkXHJcblx0ICovXHJcblx0cHVibGljIGFkZE5ld1NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFja3Mgd2hldGhlciB0aGUgdGV4dGJveEZvcm1Nb2RlbCB2YWx1ZSBtYXRjaGVzIGFuIGl0ZW0gaW4gdGhlIGZpbHRlcmVkT3B0aW9uc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBmb3VuZE1hdGNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE51bWJlciBvZiBmaWx0ZXJlZCBvcHRpb25zIHRvIGRpc3BsYXkgaW4gdGhlIGZvb3Rlci4gIEV4Y2x1ZGVzIGhlYWRpbmdzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBmaWx0ZXJlZE9wdGlvbkNvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbmRleCBvZiB0aGUgY3VycmVudGx5LXNlbGVjdGVkIG9wdGlvbnNcclxuXHQgKi9cclxuXHRwcml2YXRlIHNlbGVjdGVkSXRlbUluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcblx0LyoqIFBsYWNlaG9sZGVyIHRleHQgZm9yICdDaG9vc2Ugb3IgQWRkLi4uJyAqL1xyXG5cdHByaXZhdGUgY2hvb3NlT3JBZGRQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcblxyXG5cdC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciAnQ2hvb3NlJyAqL1xyXG5cdHByaXZhdGUgY2hvb3NlUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHRwcml2YXRlIGhhc0RhdGFCZWVuTG9hZGVkT25PcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJvdGVjdGVkIHZhbGlkYXRpb25NZXNzYWdlU2VydmljZTogVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLFxyXG5cdFx0cHJvdGVjdGVkIGZvcm1Hcm91cEhlbHBlcjogRm9ybUdyb3VwSGVscGVyLFxyXG5cdFx0cHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuXHRcdHByb3RlY3RlZCBzY3JvbGxTZXJ2aWNlOiBTY3JvbGxTZXJ2aWNlXHJcblx0KSB7XHJcblx0XHRzdXBlcih2YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsIGZvcm1Hcm91cEhlbHBlcik7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ3VsYXIgb25DaGFuZ2VzIGxpZmVjeWNsZSBldmVudFxyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcblx0XHRzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuXHJcblx0XHQvLyB3aGVuIG9wdGlvbnMgY2hhbmdlc1xyXG5cdFx0aWYgKGNoYW5nZXMub3B0aW9ucykge1xyXG5cdFx0XHR0aGlzLnJlc2V0T3B0aW9ucygpO1xyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBwb3B1cCBwb3NpdGlvblxyXG5cdFx0XHRpZiAodGhpcy5wb3B1cCkge1xyXG5cdFx0XHRcdHRoaXMucG9wdXAudXBkYXRlKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgdmFsaWRhdG9ycyBvbiB0aGUgdGV4dGJveFxyXG5cdFx0aWYgKGNoYW5nZXMucmVxdWlyZWQgfHwgY2hhbmdlcy5taW5sZW5ndGggfHwgY2hhbmdlcy5tYXhsZW5ndGgpIHtcclxuXHRcdFx0dGhpcy5zZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVwZGF0ZSBwbGFjZWhvbGRlciB0ZXh0IHdoZW4gJ0FkZCBOZXcnIGlzIGNvbmRpdGlvbmFsLlxyXG5cdFx0Ly8gbmdPbkNoYW5nZXMoKSBraWNrcyBvZmYgYmVmb3JlIG5nT25Jbml0LCBzbyBpbiBvcmRlclxyXG5cdFx0Ly8gdG8gbm90IG92ZXJ3cml0ZSBhIHVzZXItcHJvdmlkZWQgcGxhY2Vob2xkZXIsIGRvIG5vdFxyXG5cdFx0Ly8gdXBkYXRlIHBsYWNlaG9sZGVyIG9uIGZpcnN0IGNoYW5nZSAobmdPbkluaXQgd2lsbCB0YWtlIGNhcmUgb2YgaXQpLlxyXG5cdFx0aWYgKChjaGFuZ2VzLmFkZE5ldyAmJiAhY2hhbmdlcy5hZGROZXcuaXNGaXJzdENoYW5nZSgpKSB8fCBjaGFuZ2VzLnBsYWNlaG9sZGVyKSB7XHJcblx0XHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXJUZXh0KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5ndWxhciBvbkluaXQgbGlmZWN5Y2xlIGhvb2tcclxuXHQgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3NcclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcblx0XHRzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuXHRcdGlmICh0aGlzLmFsd2F5c09wZW4pIHtcclxuXHRcdFx0dGhpcy5oaWRlVG9nZ2xlQnV0dG9uID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5tZW51U3RhdHVzID0gJ3Zpc2libGUnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEdldCB0cmFuc2xhdGVkIHBsYWNlaG9sZGVyIHRleHRcclxuXHRcdHRoaXMuY2hvb3NlT3JBZGRQbGFjZWhvbGRlciA9IGAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0Nob29zZSBvciBhZGQnKX0uLi5gO1xyXG5cdFx0dGhpcy5jaG9vc2VQbGFjZWhvbGRlciA9IGAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0Nob29zZScpfWA7XHJcblxyXG5cdFx0dGhpcy5mb3JtTW9kZWxDaGFuZ2VkKHRoaXMuZm9ybU1vZGVsLnZhbHVlKTtcclxuXHRcdHRoaXMuc2V0VGV4dGJveEZvcm1Nb2RlbFZhbGlkYXRvcnMoKTtcclxuXHJcblx0XHQvLyBFcnJvcnMgZm9yIHRoaXMgY29tcG9uZW50IGFyZSBkaXNwbGF5ZWQgdmlhIHRoZSB2YWxpZGF0aW9uRXJyb3JzIHByb3BlcnR5LCB3aGljaCBpc1xyXG5cdFx0Ly8gcG9wdWxhdGVkIHdoZW4gdHJhbnNsYXRlVmFsaWRhdGlvbk1lc3NhZ2VzIGlzIHJ1bi5cclxuXHRcdC8vIFdoZW4gdGhlIGludGVybmFsIFRleHRib3hDb21wb25lbnQgaGFzIHZhbGlkYXRpb24gZXJyb3JzLCB3ZSBzZXQgdGhlbSBvbiB0aGVcclxuXHRcdC8vIGZvcm1Nb2RlbCBhcyB3ZWxsLiAgVGhpcyB1cGRhdGVzIHRoZSB2YWxpZGl0eSBvZiBvdXIgQ29tYm9ib3hDb21wb25lbnQgY29udHJvbCxcclxuXHRcdC8vIGJ1dCBkb2VzIG5vdCB0cmlnZ2VyIHRyYW5zbGF0aW9uLiAgU3Vic2NyaWJlIHRvIHN0YXR1c0NoYW5nZXMgaGVyZSBzbyBjb21wb25lbnRcclxuXHRcdC8vIHZhbGlkYXRpb24gZXJyb3JzIHdpbGwgYXBwZWFyIGFsb25nIHdpdGggdGhlIENvbWJvYm94Q29tcG9uZW50J3MgbGFiZWwuXHJcblx0XHR0aGlzLmZvcm1Nb2RlbC52YWx1ZUNoYW5nZXMucGlwZShcclxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxyXG5cdFx0KS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLmZvcm1Nb2RlbENoYW5nZWQoZGF0YSkpO1xyXG5cclxuXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUoXHJcblx0XHRcdHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuXHRcdCkuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5zZXRGb3JtTW9kZWxWYWxpZGF0aW9uRXJyb3JzKGRhdGEpKTtcclxuXHJcblx0XHQvLyBkZWZhdWx0IHBsYWNlaG9sZGVyXHJcblx0XHR0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyVGV4dCgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmd1bGFyIGFmdGVyVmlld0luaXQgbGlmZWN5Y2xlIGhvb2tcclxuXHQgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3NcclxuXHQgKi9cclxuXHRwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnBvcHVwKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBhbGxvdyBvdmVyZmxvdyBvdXQgb2YgdGhlIHNjcm9sbFBhcmVudFxyXG5cdFx0Ly8gcHJldmVudHMgbWVudSBmcm9tIG9ic2N1cmluZyB0aGUgY29tYm9ib3hcclxuXHRcdGxldCBwb3BwZXJPcHRpb25zOiBQb3BwZXIuUG9wcGVyT3B0aW9ucyA9IHtcclxuXHRcdFx0bW9kaWZpZXJzOiB7XHJcblx0XHRcdFx0cHJldmVudE92ZXJmbG93OiB7XHJcblx0XHRcdFx0XHRib3VuZGFyaWVzRWxlbWVudDogJ3ZpZXdwb3J0J1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBjb252ZXJ0IHRoZSBDb21ib2JveE1lbnVQb3NpdGlvbiBpbnRvIGEgUG9wcGVyUGxhY2VtZW50XHJcblx0XHRzd2l0Y2ggKHRoaXMubWVudVBvc2l0aW9uKSB7XHJcblx0XHRcdGNhc2UgKFwidG9wX2xlZnRcIik6XHJcblx0XHRcdFx0cG9wcGVyT3B0aW9ucy5wbGFjZW1lbnQgPSAndG9wLXN0YXJ0JztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAoXCJ0b3BfcmlnaHRcIik6XHJcblx0XHRcdFx0cG9wcGVyT3B0aW9ucy5wbGFjZW1lbnQgPSAndG9wLWVuZCc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKFwiYm90dG9tX2xlZnRcIik6XHJcblx0XHRcdFx0cG9wcGVyT3B0aW9ucy5wbGFjZW1lbnQgPSAnYm90dG9tLXN0YXJ0JztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAoXCJib3R0b21fcmlnaHRcIik6XHJcblx0XHRcdFx0cG9wcGVyT3B0aW9ucy5wbGFjZW1lbnQgPSAnYm90dG9tLWVuZCc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1lbnVQb3NpdGlvbiBmb3IgQ29tYm9ib3hDb21wb25lbnQuYClcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTY3JvbGwgdGhlIG1lbnUgdG8gdGhlIHNlbGVjdGVkIGl0ZW0gb25jZSB0aGUgcG9wdXAgbWVudSBpcyByZWFkeVxyXG5cdFx0cG9wcGVyT3B0aW9ucy5vbkNyZWF0ZSA9ICgpID0+IHtcclxuXHRcdFx0dGhpcy5zY3JvbGxNZW51KCk7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5wb3B1cEZpeGVkKSB7XHJcblx0XHRcdFx0dGhpcy5wb3B1cCEuZml4UG9zaXRpb24oKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnBvcHVwRml4ZWQpIHtcclxuXHRcdFx0cG9wcGVyT3B0aW9ucy5vblVwZGF0ZSA9ICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLnBvcHVwIS5maXhQb3NpdGlvbigpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wb3B1cC5wb3BwZXJPcHRpb25zID0gcG9wcGVyT3B0aW9ucztcclxuXHJcblx0XHR0aGlzLnBvcHVwLnBvcHBlclN0YXR1c0NoYW5nZS5waXBlKFxyXG5cdFx0XHR0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcblx0XHQpLnN1YnNjcmliZSgoZXZlbnQ6ICd2aXNpYmxlJyB8ICdoaWRkZW4nKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5tZW51U3RhdHVzID0gZXZlbnQ7XHJcblxyXG5cdFx0XHRcdC8vIFN5bmNocm9uaXplIHRoZSBmb3JtTW9kZWwgYW5kIHRleHRGb3JtTW9kZWwgdmFsdWVzIHdoZW4gdGhlXHJcblx0XHRcdFx0Ly8gcG9wdXAgbWVudSBjbG9zZXMgYW5kIHVuLWZpbHRlciB0aGUgb3B0aW9ucyBhbmQgcmVzZXQgdGhlXHJcblx0XHRcdFx0Ly8gc2VsZWN0ZWRJdGVtIGFuZCBpbmRleFxyXG5cdFx0XHRcdGlmIChldmVudCA9PT0gJ2hpZGRlbicpIHtcclxuXHRcdFx0XHRcdHRoaXMuc3luY01vZGVsVmFsdWVzKCk7XHJcblx0XHRcdFx0XHR0aGlzLnJlc2V0T3B0aW9ucygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IGVycm9ycyBvbiB0aGUgdGV4dGJveEZvcm1Nb2RlbCwgd2hpY2ggd2lsbCB0aGVuIHNldCBlcnJvcnMgb24gdGhlXHJcblx0ICogZm9ybU1vZGVsLiBBbHNvIG1hcmsgdGhlIGZvcm1Nb2RlbCBhcyB0b3VjaGVkIHRvIGRpc3BsYXkgYW55IGVycm9ycy5cclxuXHQgKiBAcGFyYW0gZXJyb3JzIGtleShzKSBvZiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UgZXJyb3JzIHRvIGRpc3BsYXkgb3IgcmVtb3ZlXHJcblx0ICogQG1lbWJlcm9mIENvbW9ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXRFcnJvcnMoZXJyb3JzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSk6IHZvaWQge1xyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldEVycm9ycyhlcnJvcnMpO1xyXG5cdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFVuZmlsdGVyIG9wdGlvbnMgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0ZWRJdGVtIGFuZCBzZWxlY3RlZEl0ZW1JbmRleFxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyByZXNldE9wdGlvbnMob3B0aW9ucz86IE1lbnVJdGVtW10pOiB2b2lkIHtcclxuXHRcdHRoaXMuZmlsdGVyZWRPcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLm9wdGlvbnM7XHJcblx0XHQvLyBkbyBub3QgY291bnQgaGVhZGluZ3NcclxuXHRcdHRoaXMuZmlsdGVyZWRPcHRpb25Db3VudCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zPy5maWx0ZXIobyA9PiBvLmRpc3BsYXkgIT09ICdoZWFkaW5nJykubGVuZ3RoIHx8IDA7XHJcblxyXG5cdFx0Ly9pZiB0aGV5IGhhdmUgbm8gc2VhcmNoIHRlcm0sIGRvbid0IHRyeSB0byBzZWxlY3QgYW55dGhpbmcgc28gdGhleSBjYW4gY2xlYXIgdGhlIGJveCBvdXQgYnkgaGl0dGluZyBlbnRlclxyXG5cdFx0Ly9pZiB0aGV5IGhhdmUgYSBzZWFyY2ggdGVybSBhbmQgdGhlIG9wdGlvbnMgY2hhbmdlZCwgc2VsZWN0IGFuIG9wdGlvbiBmcm9tIHRoZSBtZW51IHNvIHRoZXkgd2lsbCBnZXQgaXQgYXV0b21hdGljYWxseSBpZiB0aGV5IGhpdCBlbnRlclxyXG5cdFx0aWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSAhPT0gJycpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZmluZERlZmF1bHRTZWxlY3Rpb25JbmRleCh0aGlzLmZpbHRlcmVkT3B0aW9ucywgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLmZpbHRlcmVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4XSB8fCBudWxsO1xyXG5cdFx0XHR0aGlzLnNjcm9sbE1lbnUodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvL2lmIHRoZXkgaGF2ZSBubyBzZWFyY2ggdGVybSBhbmQgdGhlIG9wdGlvbnMgYXJlIHJlc2V0LCBkb24ndCBhdXRvLXBpY2sgdGhlIGZpcnN0IG9uZVxyXG5cdFx0XHQvL3NvIHRoYXQgZW50ZXIgd2lsbCBhbGxvdyB0aGVtIHRvIHdpcGUgb3V0IHRoZWlyIGxhc3Qgc2VsZWN0aW9uXHJcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpc3RlbiB0byB0aGUgc2VsZWN0ZWQgY2hhbmdlZCBldmVudCBmcm9tIHtAbGluayBNZW51Q29tcG9uZW50fSBhbmQgdXBkYXRlIHRoZSBmb3JtXHJcblx0ICogbW9kZWwgYW5kIGNsb3NlIG1lbnVcclxuXHQgKi9cclxuXHRwdWJsaWMgc2VsZWN0ZWRDaGFuZ2VkKGl0ZW06IE1lbnVJdGVtKTogdm9pZCB7XHJcblx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKGl0ZW0pO1xyXG5cdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2hvdyBhbmQgaGlkZSB0aGUgcG9wdXAgbWVudVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHRvZ2dsZU1lbnUoZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnBvcHVwKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoZXZlbnQpIHtcclxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCF0aGlzLmZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG5cdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHQvLyBXaGVuIHRoZSBwb3B1cCBpcyBoaWRkZW4gaXQgd2lsbCBlbWl0IGl0cyBjaGFuZ2VkIHN0YXR1cyBhbmRcclxuXHRcdFx0XHQvLyB3ZSB3aWxsIHJlc2V0IHZhbHVlcyBpZiBuZWVkIGJlLlxyXG5cdFx0XHRcdHRoaXMucG9wdXAuaGlkZSgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdGlmICh0aGlzLmxvYWRPbk9wZW5PYnNlcnZhYmxlICYmICF0aGlzLmhhc0RhdGFCZWVuTG9hZGVkT25PcGVuKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBlbmRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubG9hZE9uT3Blbk9ic2VydmFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKHJlc3VsdDogTWVudUl0ZW1bXSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmhhc0RhdGFCZWVuTG9hZGVkT25PcGVuID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLm9wdGlvbnMgPSByZXN1bHQ7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLnJlc2V0T3B0aW9ucygpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBvcHVwIS5zaG93KCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5wb3B1cC5zaG93KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgb25CbHVyKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnRyb2wgdGhlIG1lbnUgd2l0aCBrZXlib2FyZCBuYXZpZ2F0aW9uXHJcblx0ICpcclxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkjRXhhbXBsZSB8IEtleWJvYXJkRXZlbnQua2V5fVxyXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleS9LZXlfVmFsdWVzIHwgS2V5IFZhbHVlc31cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBrZXlOYXZpZ2F0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG5cdFx0c3dpdGNoIChldmVudC5rZXkpIHtcclxuXHRcdFx0Y2FzZSBcIkFycm93RG93blwiOlxyXG5cdFx0XHRjYXNlIFwiRG93blwiOlxyXG5cdFx0XHRjYXNlIFwiQXJyb3dVcFwiOlxyXG5cdFx0XHRjYXNlIFwiVXBcIjpcclxuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdHRoaXMub25BcnJvd0Rvd25VcChldmVudCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiQmFja3NwYWNlXCI6XHJcblx0XHRcdGNhc2UgXCJEZWxldGVcIjpcclxuXHRcdFx0Y2FzZSBcIkRlbFwiOlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nKSB7XHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgXCJUYWJcIjpcclxuXHRcdFx0XHQvLyBJZiB0YWJiaW5nIGZyb20gdGhlIHRleHRib3ggdG8gdGhlIGJ1dHRvbiwgb3ZlcnJpZGUgdGhlIHRleHRib3ggYXMgYmVpbmdcclxuXHRcdFx0XHQvLyBtYXJrZWQgdG91Y2hlZCBzbyB3ZSBkb24ndCBzZWUgdGhlIGludmFsaWQgc3RhdGUuIE9ubHkgc2hvdyB0aGUgaW52YWxpZCBzdGF0ZVxyXG5cdFx0XHRcdC8vIHdoZW4gdGFiYmluZyBvdXQgb2YgY29tYm9ib3ggZnJvbSB0aGUgYnV0dG9uIG9yIGJhY2sgdGFiYmluZyBmcm9tIHRoZSB0ZXh0Ym94XHJcblx0XHRcdFx0Ly8gaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgZXZlbnQuc3JjRWxlbWVudCAmJiBldmVudC5zcmNFbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcpIHtcclxuXHRcdFx0XHQvLyBcdGlmIChldmVudC5zaGlmdEtleSkge1xyXG5cdFx0XHRcdC8vIFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdFx0XHRcdC8vIFx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwubWFya0FzVW50b3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHR9XHJcblx0XHRcdFx0Ly8gfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmIGV2ZW50LnNyY0VsZW1lbnQgJiYgZXZlbnQuc3JjRWxlbWVudC50YWdOYW1lID09PSAnQlVUVE9OJykge1xyXG5cdFx0XHRcdC8vIFx0aWYgKCFldmVudC5zaGlmdEtleSkge1xyXG5cdFx0XHRcdC8vIFx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHR9XHJcblx0XHRcdFx0Ly8gfVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHRcdC8vaWYgdGhlIHNlbGVjdGVkIG9wdGlvbiBpcyB0aGUgYWRkIG5ldyBidXR0b24gbGV0IGl0IGZpcmUgYnV0IGRvbid0IGFsbG93XHJcblx0XHRcdFx0XHQvL3RoZSB0YWIgZXZlbnQgdG8gY2FycnkgdGhlbSBmb3J3YXJkIGZyb20gd2hlcmV2ZXIgdGhleSBsYW5kIC0gdGhleSB3b3VsZCBza2lwIHRoZSBmaXJzdCBib3ggb24gdGhlIGFkZCBuZXcgZm9ybVxyXG5cdFx0XHRcdFx0Ly9JbiB0aGUgbm9ybWFsIGNhc2Ugd2Ugd2FudCB0byBhbGxvdyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvciB0aGV5IHdvbid0IGJlIGFibGUgdG8gdGFiIG91dCBvZiB0aGUgY29udHJvbCBhdCBhbGwuXHJcblx0XHRcdFx0XHRpZih0aGlzLmFkZE5ld1NlbGVjdGVkKXtcclxuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0aGlzLmNvbW1pdFNlbGVjdGlvbihldmVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkVudGVyXCI6XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvbW1pdFNlbGVjdGlvbihldmVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkVzY2FwZVwiOlxyXG5cdFx0XHRjYXNlIFwiRXNjXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0XHQvLyBKdXN0IGNsb3NlIHRoZSBtZW51LCBkbyBub3QgZm9jdXMgdGhlIG5leHQgZWxlbWVudCBvbiB0YWJcclxuXHRcdFx0XHRcdC8vIHVubGVzcyB0aGUgbWVudSBpcyBoaWRkZW5cclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ2xvc2UgdGhlIG1lbnUgYmVmb3JlIHdlIHJlc2V0IHNlbGVjdGVkSXRlbSBzbyB3ZSBkb24ndCBzZWUgdGhlIGhpZ2hsaWdodCBjaGFuZ2luZ1xyXG5cdFx0XHRcdFx0Ly8gd2hlbiByZXNldCB0aGUgc2VsZWN0ZWQgaXRlbSBiYWNrIHRvIHRoZSBmb3JtTW9kZWxcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCIgXCI6XHJcblx0XHRcdGNhc2UgXCJTcGFjZWJhclwiOlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nKSB7XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJyAmJiBldmVudC5rZXkgIT09ICdTaGlmdCcpIHtcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWNpbGl0YXRlcyBhZGRpbmcgaXRlbXMgdG8gYSBjb21ib2JveFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGFkZEZuIEZ1bmN0aW9uIGZyb20gcGFyZW50IHRoYXQgc2hvdWxkIG1ha2UgYW4gQVBJIHJlcXVlc3QgdG8gYWRkIGEgbmV3IGl0ZW0gdG8gdGhlIGNvbWJvYm94J3Mgb3B0aW9uc1xyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhc3luYyBhZGROZXdJdGVtKGFkZEZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBhZGRGbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBXZSBnYXZlIGl0IG91ciBiZXN0IHRyeSwgc29tZXRoaW5nIGlzIHJlYWxseSB3aGFjaywgc28gbGV0J3MganVzdCBzZXQgdGhlIGVycm9yXHJcbiAgICAgICAgICAgIHRoaXMuc2V0RXJyb3JzKHsgJ2FkZG5ldyc6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG9nZ2xlTWVudSgpO1xyXG4gICAgfVxyXG5cclxuXHQvKipcclxuXHQgKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhleSBhcmUgYWRkaW5nIG5ldyBvciBoYXZlIGFuIGl0ZW0gc2VsZWN0ZWQsIGFuZCBjb21taXQgaXQgdG8gdGhlIGZvcm0gbW9kZWxcclxuXHQgKi9cclxuICBwcml2YXRlIGNvbW1pdFNlbGVjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdHRoaXMub25BZGROZXcoZXZlbnQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zZXRGb3JtTW9kZWxWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbSk7XHJcblx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VuZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdGV4dGJveCB0byB0aGUgcGFyZW50IHdoZW4gdGhlIGFkZCBuZXcgYnV0dG9uIGlzXHJcblx0ICogY2xpY2tlZFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGV2ZW50IEFkZCBuZXcgYnV0dG9uIGNsaWNrIG9yIGVudGVyIGtleSBldmVudFxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBvbkFkZE5ldyhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5hZGROZXdDbGljay5lbWl0KHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSk7XHJcblx0XHR0aGlzLnBvcHVwPy5oaWRlKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogTmF2aWdhdGUgdGhlIGRyb3Bkb3duIG1lbnUgdXNpbmcgdXAgYW5kIGRvd24gYXJyb3cga2V5c1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIGV2ZW50IFVwIG9yIGRvd24gYXJyb3cga2V5ZG93biBldmVudFxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgb25BcnJvd0Rvd25VcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG5cdFx0c3dpdGNoIChldmVudC5rZXkpIHtcclxuXHRcdFx0Y2FzZSBcIkFycm93RG93blwiOlxyXG5cdFx0XHRjYXNlIFwiRG93blwiOlxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PT0gLTEgJiYgdGhpcy5hZGROZXdCdXR0b24gJiYgIXRoaXMuYWRkTmV3QnV0dG9uLm5hdGl2ZUVsZW1lbnQuaGlkZGVuICYmICF0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPCB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAxKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvL2lmIHRoZSBsYXN0IGl0ZW0gaXMgYSBoZWFkaW5nIGFuZCB3ZSBhcmUgb24gdGhlIHNlY29uZCBsYXN0IGl0ZW0sIHdlIHNob3VsZG4ndCBpbmNyZW1lbnQgdGhlIHNlbGVjdGVkSXRlbUluZGV4IGJlY2F1c2UgdGhhdCB3b3VsZCBzZWxlY3QgdGhlIGhlYWRpbmdcclxuXHRcdFx0XHRcdGlmKCAhKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT0gdGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoIC0gMiAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4KzFdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykgKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgrKztcclxuXHRcdFx0XHRcdFx0Ly8gU2tpcCBhbnkgaW4tbWVudSBoZWFkaW5nIGl0ZW1zXHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4IDwgdGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoIC0gMSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4XS5kaXNwbGF5ID09PSAnaGVhZGluZycpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4Kys7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiQXJyb3dVcFwiOlxyXG5cdFx0XHRjYXNlIFwiVXBcIjpcclxuXHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PT0gLTEgJiYgdGhpcy5hZGROZXdCdXR0b24gJiYgIXRoaXMuYWRkTmV3QnV0dG9uLm5hdGl2ZUVsZW1lbnQuaGlkZGVuICYmIHRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAtMSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT09IDAgJiYgdGhpcy5hZGROZXdCdXR0b24gJiYgIXRoaXMuYWRkTmV3QnV0dG9uLm5hdGl2ZUVsZW1lbnQuaGlkZGVuKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleC0tO1xyXG5cdFx0XHRcdFx0Ly8gU2tpcCBhbnkgaW4tbWVudSBoZWFkaW5nIGl0ZW1zXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA+IC0xICYmIHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4LS07XHJcblxyXG5cdFx0XHRcdFx0XHQvL2lmIHRoZSBzZWxlY3RlZEl0ZW1JbmRleCBpcyAtMSwgdGhhdCBtZWFucyB0aGUgdmVyeSBmaXJzdCBpdGVtIHdhcyBhIGhlYWRpbmcgYW5kIHdlIGp1c3Qgc2tpcHBlZCBvdmVyIGl0LlxyXG5cdFx0XHRcdFx0XHRpZih0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly9pZiB0aGVyZSBpcyBhbiBhZGQgbmV3IGJ1dHRvbiB3ZSBzaG91bGQgc2VsZWN0IGl0LiBvdGhlcndpc2Ugd2Ugc2hvdWxkIGxvY2sgdGhlbSBhdCBpbmRleCAxIChyaWdodCBiZWZvcmUgdGhlIGhlYWRpbmcpXHJcblx0XHRcdFx0XHRcdFx0aWYodGhpcy5hZGROZXdCdXR0b24gJiYgIXRoaXMuYWRkTmV3QnV0dG9uLm5hdGl2ZUVsZW1lbnQuaGlkZGVuKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IDE7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcbiAgICAgICAgICBcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLmZpbHRlcmVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4XTtcclxuXHJcblx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJykge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRGb3JtTW9kZWxWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNjcm9sbE1lbnUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHJcblx0LyoqXHJcblxyXG5cdCAqIEZpbHRlciBhcnJheSBvZiBvcHRpb25zIGJ5IGxhYmVsIG9yIGNhcHRpb24gKGNvbnRhaW5zKVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGZpbHRlclRleHQgVGhlIHZhbHVlIG9mIHRleHRib3ggdGhhdCB3ZSB3aWxsIGZpbHRlciBvdXIgb3B0aW9ucyBieVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaWx0ZXJPcHRpb25zQXJyYXkoZmlsdGVyVGV4dDogc3RyaW5nKTogQXJyYXk8TWVudUl0ZW0+IHtcclxuXHRcdGxldCBzZWFyY2hUZXh0ID0gZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0aWYgKGZpbHRlclRleHQgJiYgZmlsdGVyVGV4dCAhPT0gJycpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIoaXRlbSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIGl0ZW0ubGFiZWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID49IDAgfHwgXHJcblx0XHRcdFx0XHRcdChpdGVtLmNhcHRpb24gJiYgaXRlbS5jYXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hUZXh0KSA+PSAwKTtcclxuXHRcdFx0fSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnM7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRmluZCBhIGdpdmVuIGl0ZW0ncyBpbmRleCBpbiB0aGUgZmlsdGVyZWQgaXRlbXMgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZFxyXG5cdCAqIEBwYXJhbSBpdGVtIFRoZSBtYXRjaGluZyBpdGVtIHRvIGZpbmQgaW4gdGhlXHJcblx0ICogZmlsdGVyZE9wdGlvbnMgYXJyYXkuIFdpbGwgdXNlIHRoZSBzZWxlY3RlZEl0ZW0gaWYgbm90aGluZyBpcyBwYXNzZWQuXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kU2VsZWN0ZWRJdGVtSW5kZXgoaXRlbT86IE1lbnVJdGVtKTogbnVtYmVyIHtcclxuXHRcdGxldCBpdGVtVG9GaW5kID0gaXRlbSA/IGl0ZW0gOiB0aGlzLnNlbGVjdGVkSXRlbTtcclxuXHJcblx0XHRpZiAoaXRlbVRvRmluZCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMuZmluZEluZGV4KGl0ZW0gPT4ge1xyXG5cdFx0XHRcdGlmKGl0ZW0uaWQgJiYgKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW0ubGFiZWwgPT09ICg8TWVudUl0ZW0+aXRlbVRvRmluZCkubGFiZWwgJiYgaXRlbS5pZCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZFxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAtMTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFjdCB0byBvdXIgZm9ybU1vZGVsIGNoYW5naW5nXHJcblx0ICpcclxuXHQgKiBUaGUgZm9ybU1vZGVsIHJlcHJlc2VudHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBNb2RlbEl0ZW1cclxuXHQgKiBXaGVuIGNoYW5nZWQsIHNldCB0aGUgdmFsdWUgb2YgdGhlIFRleHRib3hDb21wb25lbnQgYW5kXHJcblx0ICogZmluZCBpbmRleCBvZiBpdGVtIGluIG9wdGlvbnMgbGlzdC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZm9ybU1vZGVsQ2hhbmdlZChkYXRhPzogTWVudUl0ZW0pOiB2b2lkIHtcclxuXHRcdHRoaXMuc3luY2hyb25pemVEaXNhYmxlZEF0dHJpYnV0ZXMoKTtcclxuXHJcblx0XHRpZiAoZGF0YSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoZGF0YS5zZWxlY3RlZExhYmVsIHx8IGRhdGEubGFiZWwpO1xyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZmluZFNlbGVjdGVkSXRlbUluZGV4KGRhdGEpO1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA+PSAwKSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLmZpbHRlcmVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4XTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly9UaGUgaG9zdCB3aXBlZCBvdXQgdGhlIGRhdGEgZXh0ZXJuYWxseSwgY2xlYXIgdGhlIHRleHRib3ggYW5kIHRoZSB0cmFja2luZyBzdGF0ZVxyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwucmVzZXQoKTtcclxuXHRcdFx0dGhpcy5jbGVhclNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNjcm9sbCB0aGUgbWVudSBpZiB0aGUgY3VycmVudCBzZWxlY3RlZEl0ZW1JbmRleCBpcyBvdXQgb2Ygdmlld1xyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzY3JvbGxNZW51KGtub3duSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWRJdGVtSW5kZXggaW4gY2FzZSBvdXIgb3B0aW9ucyBjaGFuZ2VkXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBrbm93bkluZGV4ID09PSB1bmRlZmluZWQgPyB0aGlzLmZpbmRTZWxlY3RlZEl0ZW1JbmRleCgpIDoga25vd25JbmRleDtcclxuXHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5zZWxlY3RlZEl0ZW0pIHtcclxuXHRcdFx0XHQvLyBUaGUgbWVudSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGlkcyBmb3IgdGhlIG1lbnUgaXRlbXMgaWYgdGhleSBkb250IGhhdmUgdGhlbSxcclxuXHRcdFx0XHQvLyBzbyB0aGV5IG5lZWQgdG8gYmUgYWNjb3VudGVkIGZvciBoZXJlIHNpbmNlIHRoZSBjb21ib2JveCBkb2Vzbid0IGtub3cgYWJvdXQgdGhvc2UgaWRzXHJcblx0XHRcdFx0bGV0IGl0ZW1TZWxlY3RvciA9IHRoaXMuc2VsZWN0ZWRJdGVtLmlkID8gYCMke3RoaXMuc2VsZWN0ZWRJdGVtLmlkfWAgOiBgIyR7dGhpcy5pZH1fbWVudV9pdGVtJHt0aGlzLnNlbGVjdGVkSXRlbUluZGV4fWA7XHJcblxyXG5cdFx0XHRcdC8vdHJpZ2dlciB0aGUgc2Nyb2xsaW5nIGFmdGVyIGEgdGljayB0byBhbGxvdyB0aGUgbWVudSB0byBiZSB1cCB0byBkYXRlIChhbmQgcGVuZGluZyBtYXNrIGNsZWFyZWQpIGJlZm9yZSBtZWFzdXJpbmdcclxuXHRcdFx0XHRzZXRUaW1lb3V0KCgpPT57XHJcblx0XHRcdFx0XHR0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsSXRlbUNlbnRlcmVkKGAjJHt0aGlzLmlkfV9tZW51X2xpc3RgLCBpdGVtU2VsZWN0b3IpO1xyXG5cdFx0XHRcdH0sIDApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaC9GaWx0ZXIgYmFzZWQgb24gdGV4dGJveCBpbnB1dFxyXG5cdCAqIE5PVEU6IHNvIGFzIG5vdCB0byByZWNlaXZlIGEgbm90aWZpY2F0aW9uIG9uIGV2ZXJ5IGtleSBldmVudCwgd2Ugc3VnZ2VzdCB5b3UgZGVib3VuY2UgeW91clxyXG5cdCAqIHN1YnNjcmlwdGlvblxyXG5cdCAqIEBzZWUge0BsaW5rIGh0dHA6Ly9yZWFjdGl2ZXguaW8vcnhqcy9jbGFzcy9lczYvT2JzZXJ2YWJsZS5qc35PYnNlcnZhYmxlLmh0bWwjaW5zdGFuY2UtbWV0aG9kLWRlYm91bmNlVGltZSB8IE9ic2VydmFibGUuZGVib3VuY2VUaW1lfVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZWFyY2hBbmRGaWx0ZXIoc2VhcmNoVGV4dD86IHN0cmluZyk6IHZvaWQge1xyXG5cclxuXHRcdC8vIGFsd2F5cyBlbWl0XHJcblx0XHR0aGlzLnNlYXJjaC5lbWl0KHNlYXJjaFRleHQpO1xyXG5cclxuXHRcdC8vIGRvIGludGVybmFsIGZpbHRlcmluZyBpZiBubyBvbmUncyBzdWJzY3JpYmVkIHRvIG91ciBzZWFyY2ggZW1pdHRlclxyXG5cdFx0aWYgKHRoaXMuc2VhcmNoLm9ic2VydmVycy5sZW5ndGggPT09IDAgJiYgc2VhcmNoVGV4dCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHRoaXMucmVzZXRPcHRpb25zKHRoaXMuZmlsdGVyT3B0aW9uc0FycmF5KHNlYXJjaFRleHQpKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLmFkZE5ld1NlbGVjdGVkICYmICF0aGlzLmFkZE5ld0J1dHRvbikge1xyXG5cdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCB7QGxpbmsgZm9ybU1vZGVsIH0ncyB2YWxpZGF0aW9uIGVycm9ycyBlcXVhbCB0byB0aGUgaW50ZXJuYWwgdGV4dGJveCdzLlxyXG5cdCAqXHJcblx0ICogV2hlbiB0aGUgaW50ZXJuYWwgdGV4dGJveCBpcyBpbnZhbGlkLCBuZWVkIHRvIHNldCB0aGlzIGNvbnRyb2wnc1xyXG5cdCAqIGVycm9ycyBiZWNhdXNlIHdlIGFyZSB1c2luZyBvdXIgb3duIGxhYmVsLCBub3QgVGV4dGJveENvbnRyb2wncy5cclxuXHQgKiBXZSB1c2Ugb3VyIG93biBsYWJlbCBzbyBsYWJlbCB0ZXh0IHdpbGwgd3JhcCBhdCB0aGUgZW5kIG9mIHRoZSBidXR0b24sXHJcblx0ICogbm90IGF0IHRoZSBlbmQgb2YgdGhlIHRleHRib3guXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNldEZvcm1Nb2RlbFZhbGlkYXRpb25FcnJvcnMoZGF0YT86IGFueSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5pbnZhbGlkKSB7XHJcblx0XHRcdHRoaXMuZm9ybU1vZGVsLnNldEVycm9ycyh0aGlzLnRleHRib3hGb3JtTW9kZWwuZXJyb3JzKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZm9ybU1vZGVsLnNldEVycm9ycyhudWxsKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCB2YWx1ZSB3aXRoIHRoZSBzZWxlY3RlZCBpdGVtIG9yIHJlc2V0IGZvcm0gbW9kZWwgdmFsdWUgaWYgaXRlbSBpcyBudWxsXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNldEZvcm1Nb2RlbFZhbHVlKGl0ZW06IE1lbnVJdGVtIHwgbnVsbCk6IHZvaWQge1xyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKGl0ZW0gPyAoaXRlbS5zZWxlY3RlZExhYmVsIHx8IGl0ZW0ubGFiZWwpIDogJycpO1xyXG5cdFx0dGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUoaXRlbSk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNEaXJ0eSgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCB2YWxpZGF0b3JzIG9uIHRoZSB7QHNlZSB0ZXh0Ym94Rm9ybU1vZGVsIH1cclxuXHQgKlxyXG5cdCAqIFZhbGlkYXRvcnMgYXJlIGN1cnJlbnRseSBzZXQgYmFzZWQgb24gdGhlIHtAc2VlIG1heGxlbmd0aCB9LFxyXG5cdCAqIHtAc2VlIG1pbmxlbmd0aCB9LCBhbmQge0BzZWUgcmVxdWlyZWQgfSBpbnB1dHMuICBUaGlzIHdvcmtzIHdlbGxcclxuXHQgKiB3aXRoIHtAc2VlIFRleHRib3hDb21wb25lbnQgfSwgd2hpY2ggbmVlZHMgdGhlc2UgaW5wdXRzIHRvIGFwcGx5XHJcblx0ICogdGhlIHByb3BlciBhdHRyaWJ1dGVzIHRvIGl0cyBpbnB1dHMuXHJcblx0ICpcclxuXHQgKiBBIGZ1dHVyZSByZWxlYXNlIG9mIEFuZ3VsYXIgd2lsbCBzdXBwb3NlZGx5IGFkZCB0aGVzZSBhdHRyaWJ1dGVzXHJcblx0ICogZm9yIHlvdSwgd2hpY2ggd2lsbCBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIFRleHRib3hDb21wb25lbnQgdG8gaGF2ZVxyXG5cdCAqIHN1Y2ggaW5wdXRzLiAgVGhpcyBjb21wb25lbnQsIGhvd2V2ZXIsIHdpbGwgc3RpbGwgbmVlZCB0aGVzZSBpbnB1dHNcclxuXHQgKiBhcyB0aGVyZSBpcyBubyBjdXJyZW50IHdheSB0byBrbm93IHdoaWNoIHZhbGlkYXRvcnMgYXJlIGFwcGxpZWQgdG8gaXRcclxuXHQgKiBmcm9tIGl0cyBwYXJlbnQgVmlldyBDb21wb25lbnQuXHJcblx0ICpcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0VGV4dGJveEZvcm1Nb2RlbFZhbGlkYXRvcnMoKTogdm9pZCB7XHJcblx0XHRsZXQgdmFsaWRhdG9yczogQXJyYXk8VmFsaWRhdG9yRm4+ID0gW107XHJcblxyXG5cdFx0aWYgKHRoaXMucmVxdWlyZWQpIHtcclxuXHRcdFx0dmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLm1pbmxlbmd0aCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW5sZW5ndGgpKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5tYXhsZW5ndGgpIHtcclxuXHRcdFx0dmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4bGVuZ3RoKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcblxyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBLZWVwIHRleHRib3gncyBkaXNhYmxlZCBzdGF0dXMgaW4tc3luYyB3aXRoIGNvbWJvYm94J3NcclxuXHQgKlxyXG5cdCAqIHtAbGluayBUZXh0Ym94Q29tcG9uZW50fSBnZXRzIGl0cyBkaXNhYmxlZCBzdGF0dXMgZnJvbSBpdHMge0BsaW5rIEZvcm1Db250cm9sfVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzeW5jaHJvbml6ZURpc2FibGVkQXR0cmlidXRlcygpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmZvcm1Nb2RlbC5kaXNhYmxlZCAhPT0gdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdGlmICh0aGlzLmZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG5cdFx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmVuYWJsZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhlIGZvcm1Nb2RlbCB2YWx1ZSBhbmQgdGV4dGJveCB2YWx1ZSBkbyBub3QgbWF0Y2gsIHJlc2V0IHRoZSB0ZXh0Ym94IGFuZCBzZWxlY3RlZEl0ZW0gdG9cclxuXHQgKiB0aGUgZm9ybU1vZGxlIHZhbHVlLiBJZiB0aGVyZSBpcyBubyBmb3JtTW9kZWwgdmFsdWUsIG1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgdGV4dGJveC4gUmVzZXQgdGhlXHJcblx0ICogZmlsdGVyZWRPcHRpb25zIHRvIHRoZSBmdWxsIGxpc3QgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0ZWRJdGVtSW5kZXhcclxuXHQgKlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3luY01vZGVsVmFsdWVzKCk6IHZvaWQge1xyXG5cdFx0Ly8gSWYgdGhlcmUgaXMgYSBmb3JtTW9kZWwgdmFsdWUsIHJlc2V0IHRoZSBzZWxlY3RlZCBpdGVtLiBJZiB0aGVyZSBpc24ndCwgbWFrZVxyXG5cdFx0Ly8gc3VyZSB3ZSBjbGVhciB0aGUgdGV4dGJveFxyXG5cdFx0Y29uc3QgbmV3TGFiZWwgPSB0aGlzLmZvcm1Nb2RlbC52YWx1ZT8uc2VsZWN0ZWRMYWJlbCB8fCB0aGlzLmZvcm1Nb2RlbC52YWx1ZT8ubGFiZWw7XHJcblx0XHRpZiAodGhpcy5mb3JtTW9kZWwudmFsdWUgJiYgKG5ld0xhYmVsICE9PSB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpKSB7XHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZShuZXdMYWJlbCk7XHJcblx0XHR9IGVsc2UgaWYgKCF0aGlzLmZvcm1Nb2RlbC52YWx1ZSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoJycpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaCBhbmQgZmlsdGVyIHRoZSBvcHRpb25zIGxpc3Qgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHRleHRib3ggaW5wdXQgY2hhbmdlcy4gSWYgYWRkTmV3IGlzXHJcblx0ICogc2V0IGFsc28gY2hlY2sgZm9yIG1hdGNoZXMgaW4gb3VyIGZpbHRlcmVkT3B0aW9ucyB0byBjb25kaXRpb25hbGx5IHNob3cgYW5kIGhpZGUgdGhlIGFkZCBuZXdcclxuXHQgKiBidXR0b25cclxuXHQgKlxyXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2lucHV0XHJcblx0ICovXHJcblx0cHVibGljIHRleHRib3hWYWx1ZUNoYW5nZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcblx0XHR0aGlzLnNlYXJjaEFuZEZpbHRlcih0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cclxuXHRcdGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09ICcnKSB7XHJcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5hZGROZXcpIHtcclxuXHRcdFx0bGV0IG1hdGNoID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMuZm91bmRNYXRjaCA9IG1hdGNoID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVwZGF0ZSB0aGUgcG9wdXAgbWVudSBwb3NpdGlvbiB3aGVuIGlucHV0IHZhbHVlIGNoYW5nZXNcclxuXHRcdGlmICh0aGlzLnBvcHVwKSB7XHJcblx0XHRcdHRoaXMucG9wdXAudXBkYXRlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNsZWFyU2VsZWN0ZWRJdGVtKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IC0xO1xyXG5cdH1cclxuXHJcblx0LyoqUmVjb21wdXRlIHdoYXQgdGhlIHBsYWNlaG9sZGVyIHNob3VsZCBiZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSB1c2VyIHByb3ZpZGVkIG9uZSBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFkZE5ldyBpbnB1dCAqL1xyXG5cdHByaXZhdGUgdXBkYXRlUGxhY2Vob2xkZXJUZXh0KCl7XHJcblx0XHRpZiAodGhpcy5wbGFjZWhvbGRlcikge1xyXG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLnBsYWNlaG9sZGVyKTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5hZGROZXcpIHtcclxuXHRcdFx0dGhpcy5lZmZlY3RpdmVQbGFjZWhvbGRlciA9IHRoaXMuY2hvb3NlT3JBZGRQbGFjZWhvbGRlcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZWZmZWN0aXZlUGxhY2Vob2xkZXIgPSB0aGlzLmNob29zZVBsYWNlaG9sZGVyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqRmluZCB0aGUgb3B0aW9uIHdlIHdhbnQgdG8gYmUgdGhlIGRlZmF1bHQgc2VsZWN0aW9uLiBJZiB0aGVyZSBpcyBhbiBleGFjdCBtYXRjaCwgdXNlIHRoYXRcclxuXHQgKiBvdGhlcndpc2UgaWYgdGhlcmUgYXJlIGl0ZW1zLCByZXR1cm4gemVybyB0byBpbmRpY2F0ZSB0aGUgZmlyc3QgaXRlbS4gT3RoZXJ3aXNlIHJldHVybiAtMVxyXG5cdCAqIHRvIGluZGljYXRlIG5vIHNlbGVjdGlvblxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZmluZERlZmF1bHRTZWxlY3Rpb25JbmRleChvcHRpb25zOiBNZW51SXRlbVtdLCBzZWFyY2hUZXh0OiBzdHJpbmcpOiBudW1iZXIge1xyXG5cdFx0bGV0IGluZGV4ID0gLTE7XHJcblxyXG5cdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCl7XHJcblx0XHRcdGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uPT5vcHRpb24gIT0gbnVsbCAmJiBvcHRpb24uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKTtcclxuXHJcblx0XHRcdGlmKHNlYXJjaFRleHQpe1xyXG5cdFx0XHRcdHNlYXJjaFRleHQgPSBzZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xyXG5cdFx0XHRcdGxldCBleGFjdE1hdGNoSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb249Pm9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpID09IHNlYXJjaFRleHQgJiYgb3B0aW9uLmRpc3BsYXkgIT09ICdoZWFkaW5nJyk7XHJcblx0XHRcdFx0aWYoZXhhY3RNYXRjaEluZGV4ID49MCl7XHJcblx0XHRcdFx0XHRpbmRleCA9IGV4YWN0TWF0Y2hJbmRleDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBpbmRleDtcclxuXHR9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250cm9sIGNvbnRyb2wtbGFiZWwte3tsYWJlbFBvc2l0aW9ufX1cIlxyXG4gICAgIFtuZ0NsYXNzXT1cInsnb3Blbic6IG1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJyxcclxuICAgICAgICAgICAgICAgICAnaW52YWxpZCc6IGZvcm1Nb2RlbC50b3VjaGVkICYmIGZvcm1Nb2RlbC5pbnZhbGlkLFxyXG4gICAgICAgICAgICAgICAgICdoYXMtaWNvbic6ICgodGVtcGxhdGVUeXBlID09PSAnaWNvbkFuZExhYmVsJyB8fCB0ZW1wbGF0ZVR5cGUgPT09ICdpY29uTGFiZWxDYXB0aW9uJykgJiYgZm9ybU1vZGVsLnZhbHVlICYmIGZvcm1Nb2RlbC52YWx1ZS5pY29uICYmIGZvcm1Nb2RlbC52YWx1ZS5sYWJlbCA9PT0gdGV4dGJveEZvcm1Nb2RlbC52YWx1ZSksXHJcbiAgICAgICAgICAgICAgICAgJ2lzLXJlYWRvbmx5JzogcmVhZG9ubHksXHJcbiAgICAgICAgICAgICAgICAgJ2lzLWRpc2FibGVkJzogZm9ybU1vZGVsLmRpc2FibGVkLFxyXG4gICAgICAgICAgICAgICAgICdpcy1hbHdheXMtb3Blbic6IGFsd2F5c09wZW59XCI+XHJcblxyXG4gIDxsYWJlbCAqbmdJZj1cImxhYmVsXCI+XHJcbiAgICA8c3Bhbj57e2xhYmVsIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICA8c3BhbiAqbmdJZj1cInZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCAmJiBmb3JtTW9kZWwudG91Y2hlZCAmJiBmb3JtTW9kZWwuaW52YWxpZFwiPiZuYnNwO3t7dmFsaWRhdGlvbkVycm9yc319PC9zcGFuPlxyXG4gICAgPGVjLWhlbHAtcG9wb3ZlciBpZD1cInt7aWR9fV9oZWxwUG9wb3ZlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtaW5saW5lLWJsb2NrIG15LW4zIG14LW4xXCJcclxuICAgICAgICAgICAgICAgICAgICAgdGV4dD1cInt7aGVscFBvcG92ZXIgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb3NpdGlvbj1cInt7aGVscFBvcG92ZXJQb3NpdGlvbn19XCI+XHJcbiAgICA8L2VjLWhlbHAtcG9wb3Zlcj5cclxuICA8L2xhYmVsPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWx3YXlzT3BlbjsgZWxzZSBwb3B1cFRhcmdldFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHRib3gtZ3JvdXAgY29udHJvbC1pbnB1dFwiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInRleHRib3hFbGVtZW50Q2xhc3Nlc1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGV4dGJveFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwIHx8IHRleHRib3hGb3JtTW9kZWwudmFsdWVcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3dubWVudVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNwb3B1cFRhcmdldD5cclxuICA8ZGl2IGNsYXNzPVwidGV4dGJveC1ncm91cCBjb250cm9sLWlucHV0XCJcclxuICAgICAgIFtuZ0NsYXNzXT1cInRleHRib3hFbGVtZW50Q2xhc3Nlc1wiXHJcbiAgICAgICAqZWNQb3B1cD1cImRyb3Bkb3dubWVudVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRleHRib3hcIj48L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdGV4dGJveD5cclxuICA8aSBjbGFzcz1cImVjLWljb24ge3tmb3JtTW9kZWwudmFsdWU/Lmljb259fVwiPjwvaT5cclxuXHJcbiAgPGVjLXRleHRib3ggY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwLWlucHV0IG1iLTBcIlxyXG4gICAgICAgICAgICAgICN0ZXh0Ym94XHJcbiAgICAgICAgICAgICAgW2lkXT1cImlkXCJcclxuICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJ0ZXh0Ym94Rm9ybU1vZGVsXCJcclxuICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1heGxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtaW5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJlZmZlY3RpdmVQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cInRleHRib3hWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5TmF2aWdhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uQmx1cigpXCJcclxuICAgICAgICAgICAgICBbdXBwZXJDYXNlXT1cInVwcGVyQ2FzZVwiXHJcbiAgICAgICAgICAgICAgW3BlbmRpbmddPVwicGVuZGluZyAmJiBhbHdheXNPcGVuXCJcclxuICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cIidvZmYnXCI+PC9lYy10ZXh0Ym94PlxyXG5cclxuICA8ZWMtYnV0dG9uIGNsYXNzPVwidGV4dGJveC1ncm91cC1idG4tcmlnaHRcIlxyXG4gICAgICAgICAgICAgKm5nSWY9XCIhaGlkZVRvZ2dsZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICBbaWRdPVwiaWQgKyAnX2J1dHRvbidcIlxyXG4gICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1Nb2RlbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICBpY29uPVwiaWNvbi1jYXJldC1kb3duXCJcclxuICAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXHJcbiAgICAgICAgICAgICB0eXBlPVwic2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNZW51KCRldmVudClcIlxyXG4gICAgICAgICAgICAgKGtleWRvd24pPVwia2V5TmF2aWdhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJ1wiPjwvZWMtYnV0dG9uPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkcm9wZG93bm1lbnU+XHJcbiAgPGRpdiBjbGFzcz1cInBvcHVwXCJcclxuICAgICAgIGVjT3ZlcmxheVxyXG4gICAgICAgW3N0YXR1c109XCJwZW5kaW5nICYmICFhbHdheXNPcGVuID8gJ3BlbmRpbmcnIDogJ2hhc0RhdGEnXCI+XHJcblxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cImFkZC1uZXcge3thZGROZXdPcHRpb25zPy5jbGFzc0xpc3R9fVwiXHJcbiAgICAgICAgICAgIGlkPVwie3tpZH19X2FkZE5ld1wiXHJcbiAgICAgICAgICAgICNhZGROZXdCdXR0b25cclxuICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cImFkZE5ld1NlbGVjdGVkXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJhZGROZXdcIlxyXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZvdW5kTWF0Y2ggfHwgKGFkZE5ldyA9PT0gJ2R5bmFtaWMnICYmICghdGV4dGJveEZvcm1Nb2RlbC52YWx1ZSB8fCAoZm9ybU1vZGVsLnZhbHVlICYmIHRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09IGZvcm1Nb2RlbC52YWx1ZS5sYWJlbCkpKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkFkZE5ldygkZXZlbnQpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLW5ldy1sYWJlbCBlYy11dGlsLXRydW5jYXRlXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJhZGROZXcgPT09ICdzdGF0aWMnIHx8IGFkZE5ldyA9PT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgdHJhbnNsYXRlPnt7YWRkTmV3T3B0aW9ucz8ubGFiZWx9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImFkZE5ldyA9PT0gJ2R5bmFtaWMnXCI+e3snQWRkJyB8IHRyYW5zbGF0ZX19IDxzdHJvbmcgY2xhc3M9XCJlYy11dGlsLXRydW5jYXRlXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd0ZXh0LXVwcGVyY2FzZSc6IHVwcGVyQ2FzZX1cIj57e3RleHRib3hGb3JtTW9kZWwudmFsdWV9fTwvc3Ryb25nPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8aSBjbGFzcz1cImVjLWljb24ge3thZGROZXdPcHRpb25zPy5pY29ufX1cIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZWMtbWVudSBpZD1cInt7aWR9fV9tZW51XCJcclxuICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItdG9wLTBdPVwiIWZpbHRlcmVkT3B0aW9ucy5sZW5ndGggJiYgaGlkZU5vTWF0Y2hlc1wiXHJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51RWxlbWVudENsYXNzZXNcIlxyXG4gICAgICAgICAgICAgW3RlbXBsYXRlVHlwZV09XCJ0ZW1wbGF0ZVR5cGVcIlxyXG4gICAgICAgICAgICAgW2N1c3RvbU1lbnVUZW1wbGF0ZV09XCJjdXN0b21NZW51VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgW3Nob3dOb0l0ZW1zXT1cIiFoaWRlTm9NYXRjaGVzXCJcclxuICAgICAgICAgICAgIFtub0RhdGFUZXh0XT1cIm5vTWF0Y2hlc1RleHRcIlxyXG4gICAgICAgICAgICAgW2l0ZW1zXT1cImZpbHRlcmVkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRJdGVtXCJcclxuICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwic2VsZWN0ZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgW3ByZXNlcnZlSWNvblNwYWNlXT1cInByZXNlcnZlSWNvblNwYWNlXCJcclxuICAgICAgICAgICAgIFt0cnVuY2F0ZUl0ZW1zXT1cInRydW5jYXRlSXRlbXNcIj48L2VjLW1lbnU+XHJcblxyXG4gICAgPGZvb3RlciAqbmdJZj1cInRvdGFsUmVjb3JkcyAmJiB0b3RhbFJlY29yZHMgPiBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoICYmIGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgIDxzcGFuPnt7ZmlsdGVyZWRPcHRpb25Db3VudH19IHt7J29mJyB8IHRyYW5zbGF0ZX19IHt7dG90YWxSZWNvcmRzfX08L3NwYW4+XHJcbiAgICA8L2Zvb3Rlcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
880
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFtRCxTQUFTLEVBQWMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzFLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUtqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQWUsTUFBTSx5REFBeUQsQ0FBQzs7Ozs7Ozs7Ozs7O0FBeUIvRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQU1ILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBRXJEOzs7OztPQUtHO0lBQzRCLFFBQVE7UUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQWtPRCxZQUNXLHdCQUFrRCxFQUNsRCxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixhQUE0QjtRQUV0QyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFMdkMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsY0FBUyxH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TVUsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBS1UscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUdVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBS1csYUFBYTtzQkFBNUIsS0FBSztnQkFLUyxhQUFhO3NCQUE1QixLQUFLO2dCQVNXLFdBQVc7c0JBQTNCLE1BQU07Z0JBTVUsTUFBTTtzQkFBdEIsTUFBTTtnQkFHc0IsT0FBTztzQkFBbkMsU0FBUzt1QkFBQyxTQUFTO2dCQUt3QixLQUFLO3NCQUFoRCxTQUFTO3VCQUFDLHVCQUF1QjtnQkFNQyxZQUFZO3NCQUE5QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbEJhc2UgfSBmcm9tICcuLi9mb3JtLWNvbnRyb2wtYmFzZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUZXh0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdGlvbi1tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXBIZWxwZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZm9ybS1ncm91cC5oZWxwZXInO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgTWVudVRlbXBsYXRlVHlwZSwgTWVudUhvc3RFbGVtZW50Q2xhc3NlcyB9IGZyb20gJy4uL21lbnUvbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQb3B1cENvbnRhaW5lckRpcmVjdGl2ZSwgUG9wdXBTdGF0dXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGlyZWN0aXZlcy9wb3B1cC9wb3B1cC1jb250YWluZXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2Nyb2xsLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHRoZSBpbnB1dFxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQ29tYm9ib3hNZW51UG9zaXRpb24gPSBcInRvcF9yaWdodFwiIHwgXCJ0b3BfbGVmdFwiIHwgXCJib3R0b21fbGVmdFwiIHwgXCJib3R0b21fcmlnaHRcIjtcclxuXHJcblxyXG4vKipcclxuICogVGhlIHR5cGUgb2YgYWRkIG5ldyBpbXBsZW1lbnRhdGlvbi4gU3RhdGljIGRpc3BsYXlzIGEgc2ltcGxlIHN0YXRpYyBidXR0b24gd2hpbGUgZHluYW1pYyB1cGRhdGVzXHJcbiAqIHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHdpdGggdmFsdWUgb2YgdGhlIHRleHRib3hcclxuICovXHJcbnR5cGUgQWRkTmV3VHlwZSA9IFwiZHluYW1pY1wiIHwgXCJzdGF0aWNcIiB8IGJvb2xlYW47XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIFwiQWRkIG5ld1wiIGJ1dHRvbiB3aGVuIGluIHN0YXRpYyBtb2RlXHJcbiAqL1xyXG50eXBlIEFkZE5ld09wdGlvbnMgPSB7XHJcblx0bGFiZWw/OiBzdHJpbmc7IFx0LyoqIEEgY3VzdG9tIGxhYmVsIHRvIGRpc3BsYXkgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgXCJBZGQgbmV3Li4uXCIgKi9cclxuXHRjbGFzc0xpc3Q/OiBzdHJpbmc7IFx0LyoqIEEgc3RyaW5nIG9mIHNwYWNlLXNlcGFyYXRlZCB1dGlsaXR5IGNsYXNzZXMgd2UnbGwgYXBwbHkgdG8gdGhlIGxhYmVsICovXHJcblx0aWNvbj86IHN0cmluZzsgXHQvKiogQSBjdXN0b20gaWNvbiB0byBkaXNwbGF5IGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0ICdpY29uLWFkZCcgKi9cclxufTtcclxuXHJcblxyXG4vKipcclxuICogU2VsZWN0IGJveCAoc2VsZWN0LCBhdXRvY29tcGxldGUsIGNvbWJvYm94KVxyXG4gKlxyXG4gKiBOT1RFOiBNaW4vbWF4IGxlbmd0aCB2YWxpZGF0aW9uIGlzIGltcGxlbWVudGVkIG9uIHRoZSBpbnRlcm5hbCBlYy10ZXh0Ym94LlxyXG4gKiBWYWx1ZXMgcGFzc2VkIGluIHZpYSBpbnB1dCBwcm9wZXJ0aWVzIChAc2VlIG1heGxlbmd0aCAsIEBzZWUgbWlubGVuZ3RoIClcclxuICogYXJlIHVzZWQgdG8gY3JlYXRlIHZhbGlkYXRvcnMgb24gdGhlIHRleHRib3guICBXaGVuIHRoZSB2YWxpZGF0aW9uIG9uIHRoZVxyXG4gKiB0ZXh0Ym94IGZhaWxzLCB0aGUgdmFsaWRhdGlvbiBlcnJvcihzKSBnZXQgcGFzc2VkIHVwIHRvIHRoZSB7QHNlZSBmb3JtTW9kZWwgfS5cclxuICogV2hlbiBzZXR0aW5nIHVwIHRoaXMgY29tcG9uZW50J3Mge0BzZWUgRm9ybUNvbnRyb2wgfSwgeW91IGRvIE5PVCBuZWVkIHRvIHNldCB0aGVcclxuICogVmFsaWRhdG9ycy5taW5MZW5ndGggb3IgVmFsaWRhdG9ycy5tYXhMZW5ndGggdmFsaWRhdG9ycy5cclxuICpcclxuICogUmVxdWlyZWQgaXMgYWxzbyBwYXNzZWQgdmlhIGlucHV0IHByb3BlcnR5LCBidXQgeW91IFNIT1VMRCBhbHNvIHNldCB1cCB0aGVcclxuICogVmFsaWRhdG9ycy5yZXF1aXJlZCB2YWxpZGF0b3Igb24gdGhpcyBjb21wb25lbnQncyBGb3JtQ29udHJvbC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdlYy1jb21ib2JveCcsXHJcblx0dGVtcGxhdGVVcmw6ICdjb21ib2JveC5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vY29tYm9ib3guY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsb3NlIHRoZSBwb3B1cCBtZW51IG9uIHJlc2l6ZSBzbyB0aGUgd2lkdGggYW5kIHBvc2l0aW9uaW5nIGNhbiBiZSByZWNhbGN1bGF0ZWRcclxuXHQgKiBjb3JyZWN0bHkuIENhbm5vdCBiZSBwbGFjZWQgb24gdGhlIHBvcHVwRGlyZWN0aXZlIGJlY2F1c2Ugb2YgYSBidWcgd2hlcmVcclxuXHQgKiBIb3N0TGlzdGVuZXJzIGZvciBnbG9iYWwgZXZlbnRzIGRvbid0IGZpcmVcclxuXHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0MTkxXHJcblx0ICovXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpIG9uUmVzaXplKCkge1xyXG5cdFx0aWYgKHRoaXMucG9wdXApIHRoaXMucG9wdXAuaGlkZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvdyB0aGUgYWRkIG5ldyBidXR0b24gaW4gdGhlIHBvcHVwXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFkZE5ldz86IEFkZE5ld1R5cGU7XHJcblxyXG5cdC8qKiBDb25maWd1cmUgdGhlIGFkZE5ldyBidXR0b24gbGFiZWwgJiBpY29uIHdoZW4gYWRkTmV3IGlzIHRydWUgYW5kIHNldCB0byBzdGF0aWNcclxuXHQgKiBEZWZhdWx0IGlzIHNldCB0bzogeyBsYWJlbDogJ0FsbCBuZXcuLi4nLCBpY29uOiAnaWNvbi1hZGQnfVxyXG5cdCAqIEBzZWUgQWRkTmV3T3B0aW9uc1xyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqIEBleGFtcGxlXHJcblx0ICogPGVjLWNvbWJvYm94IFthZGROZXddPVwidHJ1ZVwiIFxyXG5cdCAqIFx0ICAgICAgICAgW2FkZE5ld09wdGlvbnNdPVwieyBcclxuKiBcdFx0XHRcdFx0XHRsYWJlbDogJ0hlbHAgbWUgY2hvb3NlLi4uJyxcclxuKiBcdFx0XHRcdFx0XHRpY29uOiAnaWNvbi1zZWFyY2gnLFxyXG4qIFx0XHRcdFx0XHRcdGNsYXNzTGlzdDogJ3RleHQtYm9keS0yIHRleHQtbGluaycgfVwiPlxyXG5cdCAqIDwvZWMtY29tYm9ib3g+XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFkZE5ld09wdGlvbnM/OiBBZGROZXdPcHRpb25zID0geyBcclxuXHRcdGxhYmVsOiAnQWRkIG5ldy4uLicsXHJcblx0XHRpY29uOiAnaWNvbi1hZGQnLFxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIGlucHV0LlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIFRleHRib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWF4bGVuZ3RoPzogbnVtYmVyO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUG9zaXRpb24gb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIHRleHQgYm94XHJcblx0ICogQGRlZmF1bHQgJ2JvdHRvbV9yaWdodCdcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWVudVBvc2l0aW9uPzogQ29tYm9ib3hNZW51UG9zaXRpb24gPSAnYm90dG9tX3JpZ2h0JztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgVGV4dGJveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtaW5sZW5ndGg/OiBudW1iZXI7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBJdGVtcyB0byBzaG93IGluIGNvbWJvYm94IG1lbnVcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBBcnJheTxNZW51SXRlbT4gPSBbXTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BsYXkgdGVtcGxhdGUgZm9yIG1lbnUgaXRlbXNcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB0ZW1wbGF0ZVR5cGU6IE1lbnVUZW1wbGF0ZVR5cGUgPSAnbGFiZWwnO1xyXG5cclxuXHQvKipcclxuICAgICAqIE9wdGlvbmFsIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIG1lbnUgaXRlbXMuIE11c3QgZGVjbGFyZSBhIHRlbXBsYXRlXHJcblx0ICogaW5wdXQgdmFyaWFibGUgY2FsbGVkIFwiaXRlbVwiIGxpa2Ugc286IDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOYW1lIGxldC1pdGVtPixcclxuXHQgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbU1lbnVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gdHJ1ZSwgdGhlIG1lbnUgaXRlbXMgd2lsbCBwcmVzZXJ2ZSB0aGUgaWNvbiBzcGFjZSB3aGVuIHRoZXJlIGlzIG5vIGljb25cclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcHJlc2VydmVJY29uU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogUG9zaXRpb24gdGhlIG1lbnUgYXMgZml4ZWQsIGlkZWFsIHdoZW4gY29tYm9ib3hlcyBhcmUgaW5zaWRlIGRpYWxvZ3NcclxuXHQgKiBEZWZhdWx0aW5nIHRvIHRydWUgc28gYWxsIG1lbnVzIHdpbGwgYmUgYXQgbGVhc3QgdGhlIHdpZHRoIG9mIHRoZVxyXG5cdCAqIHRleHRib3ggKyBidXR0b24sIGJ1dCBjYW4gZ3JvdyB3aWRlciBpZiB0aGUgaW5uZXIgZWxlbWVudHMgbmVlZCBpdFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBwb3B1cEZpeGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcyBmcm9tIHRoZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHRvdGFsUmVjb3Jkcz86IG51bWJlcjtcclxuXHJcblx0LyoqXHJcblx0ICogSWYgc2V0IHRvIHRydWUsIHdlIHdpbGwgdXBwZXJDYXNlIHRoZSB0ZXh0IGJveCBhbmQgYXBwbHkgdGhlIGNsYXNzIG9uIHRoZSBhZGQgYm94XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHVwcGVyQ2FzZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqVGhlIHBsYWNlaG9sZGVyIHRvIHNob3cgaW4gdGhlIGNvbWJvYm94LiBMZWF2ZSBlbXB0eSB0byB1c2UgZGVmYXVsdCBiZWhhdmlvciBkZXRlcm1pbmVkXHJcblx0ICogYnkgd2hldGhlciBBZGQgTmV3IGlzIGVuYWJsZWRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvKiogT2JzZXJ2YWJsZSB0byBzdWJzY3JpYmUgdG8gd2hlbiB0aGUgY29tYm9ib3ggbWVudSBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovXHJcblx0QElucHV0KCkgcHVibGljIGxvYWRPbk9wZW5PYnNlcnZhYmxlPzogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPiB8IHVuZGVmaW5lZDtcclxuXHJcblx0LyoqIERvIG5vdCBkaXNwbGF5IHRoZSB0b2dnbGUgYnV0dG9uIHdoZW4gdHJ1ZSAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBoaWRlVG9nZ2xlQnV0dG9uID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsd2F5cyBzaG93IHRoZSBtZW51IHdoZW4gdGhlIGZvcm1Nb2RlbCBoYXMgYSB2YWx1ZS4gU2V0c1xyXG5cdCAqIGhpZGVUb2dnbGVCdXR0b24gdG8gdHJ1ZSBhbmQgbWVudVN0YXR1cyB0byB2aXNpYmxlIGFzIHdlbGwuXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFsd2F5c09wZW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkaXRvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGVjLW1lbnUgZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtZW51RWxlbWVudENsYXNzZXM6IE1lbnVIb3N0RWxlbWVudENsYXNzZXMgfCBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIC50ZXh0Ym94LWdyb3VwIGVsZW1lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdGV4dGJveEVsZW1lbnRDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKiogSGlkZSAnTm8gbWF0Y2hlcycgbWVzc2FnZSB3aGVuIHRydWUgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgaGlkZU5vTWF0Y2hlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuICAgKiBUZXh0IHRvIHNob3cgd2hlbiB0aGUgbWVudSBpcyBlbXB0eS4gXCJObyBtYXRjaGVzXCIgaXMgdGhlIGRlZmF1bHQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG5vTWF0Y2hlc1RleHQ6IHN0cmluZyA9ICdOb01hdGNoZXNfU0MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBUcnVuY2F0ZSBtZW51IGl0ZW1zIHdoZW4gdHJ1ZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB0cnVuY2F0ZUl0ZW1zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhlIGFkZCBuZXcgYnV0dG9uIHdhcyBjbGlja2VkXHJcblx0ICogQHRvZG8gZGlzY3VzcyBpZiB3ZSBuZWVkIHRvIHNlbmQgYWxvbmcgdGhlIHZhbHVlIG9yIHNob3VsZFxyXG5cdCAqIHRoZSBwYXJlbnQgZ2V0IGl0IGZyb20gdGhlIGZvcm1Nb2RlbFxyXG5cdCAqIChsd2YgMjAxNy4wNy4xMyk6IEkgdGhpbmsgd2UgbWlnaHQgYXMgd2VsbCBzZW5kIHRoZSB2YWx1ZSBhbG9uZyBhbmRcclxuXHQgKiBsZWF2ZSBpdCB1cCB0byB0aGUgcGFyZW50IHRvIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0LlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKSBwdWJsaWMgYWRkTmV3Q2xpY2s6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBOb3RpZnkgcGFyZW50IHdoZW4gdGV4dCB0eXBlZCBpbnRvIHRleHRib3hcclxuXHQgKi9cclxuXHRAT3V0cHV0KCkgcHVibGljIHNlYXJjaDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcblxyXG5cdEBWaWV3Q2hpbGQoJ3RleHRib3gnKSBwdWJsaWMgdGV4dGJveCE6IFRleHRib3hDb21wb25lbnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFjY2VzcyB0byB0aGUgbWVudSdzIGNvbXBvbmVudCB2aWEgdGhlICB7QGxpbmsgUG9wdXBDb250YWluZXJEaXJlY3RpdmV9XHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChQb3B1cENvbnRhaW5lckRpcmVjdGl2ZSkgcHJpdmF0ZSBwb3B1cD86IFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRoZSBhZGQtbmV3IGJ1dHRvbiBlbGVtZW50XHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgnYWRkTmV3QnV0dG9uJykgcHJpdmF0ZSBhZGROZXdCdXR0b24hOiBFbGVtZW50UmVmO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRmlsdGVyZWQgSXRlbXMgdG8gc2hvdyBpbiBjb21ib2JveCBtZW51XHJcblx0ICovXHJcblx0cHVibGljIGZpbHRlcmVkT3B0aW9uczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFja3MgaWYgdGhlIG1lbnUgaXMgb3BlbiBvciBoaWRkZW5cclxuXHQgKi9cclxuXHRwdWJsaWMgbWVudVN0YXR1czogUG9wdXBTdGF0dXMgPSAnaGlkZGVuJztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFBsYWNlaG9sZGVyIHRvIGFzc2lnbiB0byB0ZXh0Ym94XHJcblx0ICovXHJcblx0cHVibGljIGVmZmVjdGl2ZVBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5LXNlbGVjdGVkIG1lbnUgaXRlbVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWxlY3RlZEl0ZW06IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBGb3JtQ29udHJvbCBmb3IgdGhlIHRleHRib3hcclxuXHQgKi9cclxuXHRwdWJsaWMgdGV4dGJveEZvcm1Nb2RlbDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJyk7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFja3Mgd2hldGhlciB0aGUgYWRkIG5ldyBidXR0b24gaXMgc2VsZWN0ZWRcclxuXHQgKi9cclxuXHRwdWJsaWMgYWRkTmV3U2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyB3aGV0aGVyIHRoZSB0ZXh0Ym94Rm9ybU1vZGVsIHZhbHVlIG1hdGNoZXMgYW4gaXRlbSBpbiB0aGUgZmlsdGVyZWRPcHRpb25zXHJcblx0ICovXHJcblx0cHVibGljIGZvdW5kTWF0Y2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogTnVtYmVyIG9mIGZpbHRlcmVkIG9wdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgZm9vdGVyLiAgRXhjbHVkZXMgaGVhZGluZ3MuXHJcblx0ICovXHJcblx0cHVibGljIGZpbHRlcmVkT3B0aW9uQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGV4IG9mIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgb3B0aW9uc1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VsZWN0ZWRJdGVtSW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuXHQvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3IgJ0Nob29zZSBvciBBZGQuLi4nICovXHJcblx0cHJpdmF0ZSBjaG9vc2VPckFkZFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblx0LyoqIFBsYWNlaG9sZGVyIHRleHQgZm9yICdDaG9vc2UnICovXHJcblx0cHJpdmF0ZSBjaG9vc2VQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcblxyXG5cdHByaXZhdGUgaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcm90ZWN0ZWQgdmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlOiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgZm9ybUdyb3VwSGVscGVyOiBGb3JtR3JvdXBIZWxwZXIsXHJcblx0XHRwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG5cdFx0cHJvdGVjdGVkIHNjcm9sbFNlcnZpY2U6IFNjcm9sbFNlcnZpY2VcclxuXHQpIHtcclxuXHRcdHN1cGVyKHZhbGlkYXRpb25NZXNzYWdlU2VydmljZSwgZm9ybUdyb3VwSGVscGVyKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5ndWxhciBvbkNoYW5nZXMgbGlmZWN5Y2xlIGV2ZW50XHJcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXHJcblx0ICovXHJcblx0cHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHRcdHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xyXG5cclxuXHRcdC8vIHdoZW4gb3B0aW9ucyBjaGFuZ2VzXHJcblx0XHRpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcblx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHBvcHVwIHBvc2l0aW9uXHJcblx0XHRcdGlmICh0aGlzLnBvcHVwKSB7XHJcblx0XHRcdFx0dGhpcy5wb3B1cC51cGRhdGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHVwZGF0ZSB2YWxpZGF0b3JzIG9uIHRoZSB0ZXh0Ym94XHJcblx0XHRpZiAoY2hhbmdlcy5yZXF1aXJlZCB8fCBjaGFuZ2VzLm1pbmxlbmd0aCB8fCBjaGFuZ2VzLm1heGxlbmd0aCkge1xyXG5cdFx0XHR0aGlzLnNldFRleHRib3hGb3JtTW9kZWxWYWxpZGF0b3JzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHBsYWNlaG9sZGVyIHRleHQgd2hlbiAnQWRkIE5ldycgaXMgY29uZGl0aW9uYWwuXHJcblx0XHQvLyBuZ09uQ2hhbmdlcygpIGtpY2tzIG9mZiBiZWZvcmUgbmdPbkluaXQsIHNvIGluIG9yZGVyXHJcblx0XHQvLyB0byBub3Qgb3ZlcndyaXRlIGEgdXNlci1wcm92aWRlZCBwbGFjZWhvbGRlciwgZG8gbm90XHJcblx0XHQvLyB1cGRhdGUgcGxhY2Vob2xkZXIgb24gZmlyc3QgY2hhbmdlIChuZ09uSW5pdCB3aWxsIHRha2UgY2FyZSBvZiBpdCkuXHJcblx0XHRpZiAoKGNoYW5nZXMuYWRkTmV3ICYmICFjaGFuZ2VzLmFkZE5ldy5pc0ZpcnN0Q2hhbmdlKCkpIHx8IGNoYW5nZXMucGxhY2Vob2xkZXIpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlclRleHQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmd1bGFyIG9uSW5pdCBsaWZlY3ljbGUgaG9va1xyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuYWx3YXlzT3Blbikge1xyXG5cdFx0XHR0aGlzLmhpZGVUb2dnbGVCdXR0b24gPSB0cnVlO1xyXG5cdFx0XHR0aGlzLm1lbnVTdGF0dXMgPSAndmlzaWJsZSc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gR2V0IHRyYW5zbGF0ZWQgcGxhY2Vob2xkZXIgdGV4dFxyXG5cdFx0dGhpcy5jaG9vc2VPckFkZFBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlIG9yIGFkZCcpfS4uLmA7XHJcblx0XHR0aGlzLmNob29zZVBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlJyl9YDtcclxuXHJcblx0XHR0aGlzLmZvcm1Nb2RlbENoYW5nZWQodGhpcy5mb3JtTW9kZWwudmFsdWUpO1xyXG5cdFx0dGhpcy5zZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpO1xyXG5cclxuXHRcdC8vIEVycm9ycyBmb3IgdGhpcyBjb21wb25lbnQgYXJlIGRpc3BsYXllZCB2aWEgdGhlIHZhbGlkYXRpb25FcnJvcnMgcHJvcGVydHksIHdoaWNoIGlzXHJcblx0XHQvLyBwb3B1bGF0ZWQgd2hlbiB0cmFuc2xhdGVWYWxpZGF0aW9uTWVzc2FnZXMgaXMgcnVuLlxyXG5cdFx0Ly8gV2hlbiB0aGUgaW50ZXJuYWwgVGV4dGJveENvbXBvbmVudCBoYXMgdmFsaWRhdGlvbiBlcnJvcnMsIHdlIHNldCB0aGVtIG9uIHRoZVxyXG5cdFx0Ly8gZm9ybU1vZGVsIGFzIHdlbGwuICBUaGlzIHVwZGF0ZXMgdGhlIHZhbGlkaXR5IG9mIG91ciBDb21ib2JveENvbXBvbmVudCBjb250cm9sLFxyXG5cdFx0Ly8gYnV0IGRvZXMgbm90IHRyaWdnZXIgdHJhbnNsYXRpb24uICBTdWJzY3JpYmUgdG8gc3RhdHVzQ2hhbmdlcyBoZXJlIHNvIGNvbXBvbmVudFxyXG5cdFx0Ly8gdmFsaWRhdGlvbiBlcnJvcnMgd2lsbCBhcHBlYXIgYWxvbmcgd2l0aCB0aGUgQ29tYm9ib3hDb21wb25lbnQncyBsYWJlbC5cclxuXHRcdHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHR0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcblx0XHQpLnN1YnNjcmliZShkYXRhID0+IHRoaXMuZm9ybU1vZGVsQ2hhbmdlZChkYXRhKSk7XHJcblxyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZShcclxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxyXG5cdFx0KS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEZvcm1Nb2RlbFZhbGlkYXRpb25FcnJvcnMoZGF0YSkpO1xyXG5cclxuXHRcdC8vIGRlZmF1bHQgcGxhY2Vob2xkZXJcclxuXHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXJUZXh0KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ3VsYXIgYWZ0ZXJWaWV3SW5pdCBsaWZlY3ljbGUgaG9va1xyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGFsbG93IG92ZXJmbG93IG91dCBvZiB0aGUgc2Nyb2xsUGFyZW50XHJcblx0XHQvLyBwcmV2ZW50cyBtZW51IGZyb20gb2JzY3VyaW5nIHRoZSBjb21ib2JveFxyXG5cdFx0bGV0IHBvcHBlck9wdGlvbnM6IFBvcHBlci5Qb3BwZXJPcHRpb25zID0ge1xyXG5cdFx0XHRtb2RpZmllcnM6IHtcclxuXHRcdFx0XHRwcmV2ZW50T3ZlcmZsb3c6IHtcclxuXHRcdFx0XHRcdGJvdW5kYXJpZXNFbGVtZW50OiAndmlld3BvcnQnXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGNvbnZlcnQgdGhlIENvbWJvYm94TWVudVBvc2l0aW9uIGludG8gYSBQb3BwZXJQbGFjZW1lbnRcclxuXHRcdHN3aXRjaCAodGhpcy5tZW51UG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAoXCJ0b3BfbGVmdFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICd0b3Atc3RhcnQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcInRvcF9yaWdodFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICd0b3AtZW5kJztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAoXCJib3R0b21fbGVmdFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICdib3R0b20tc3RhcnQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcImJvdHRvbV9yaWdodFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICdib3R0b20tZW5kJztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWVudVBvc2l0aW9uIGZvciBDb21ib2JveENvbXBvbmVudC5gKVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNjcm9sbCB0aGUgbWVudSB0byB0aGUgc2VsZWN0ZWQgaXRlbSBvbmNlIHRoZSBwb3B1cCBtZW51IGlzIHJlYWR5XHJcblx0XHRwb3BwZXJPcHRpb25zLm9uQ3JlYXRlID0gKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnNjcm9sbE1lbnUoKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnBvcHVwRml4ZWQpIHtcclxuXHRcdFx0XHR0aGlzLnBvcHVwIS5maXhQb3NpdGlvbigpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMucG9wdXBGaXhlZCkge1xyXG5cdFx0XHRwb3BwZXJPcHRpb25zLm9uVXBkYXRlID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucG9wdXAhLmZpeFBvc2l0aW9uKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBvcHVwLnBvcHBlck9wdGlvbnMgPSBwb3BwZXJPcHRpb25zO1xyXG5cclxuXHRcdHRoaXMucG9wdXAucG9wcGVyU3RhdHVzQ2hhbmdlLnBpcGUoXHJcblx0XHRcdHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuXHRcdCkuc3Vic2NyaWJlKChldmVudDogJ3Zpc2libGUnIHwgJ2hpZGRlbicpID0+IHtcclxuXHRcdFx0XHR0aGlzLm1lbnVTdGF0dXMgPSBldmVudDtcclxuXHJcblx0XHRcdFx0Ly8gU3luY2hyb25pemUgdGhlIGZvcm1Nb2RlbCBhbmQgdGV4dEZvcm1Nb2RlbCB2YWx1ZXMgd2hlbiB0aGVcclxuXHRcdFx0XHQvLyBwb3B1cCBtZW51IGNsb3NlcyBhbmQgdW4tZmlsdGVyIHRoZSBvcHRpb25zIGFuZCByZXNldCB0aGVcclxuXHRcdFx0XHQvLyBzZWxlY3RlZEl0ZW0gYW5kIGluZGV4XHJcblx0XHRcdFx0aWYgKGV2ZW50ID09PSAnaGlkZGVuJykge1xyXG5cdFx0XHRcdFx0dGhpcy5zeW5jTW9kZWxWYWx1ZXMoKTtcclxuXHRcdFx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgZXJyb3JzIG9uIHRoZSB0ZXh0Ym94Rm9ybU1vZGVsLCB3aGljaCB3aWxsIHRoZW4gc2V0IGVycm9ycyBvbiB0aGVcclxuXHQgKiBmb3JtTW9kZWwuIEFsc28gbWFyayB0aGUgZm9ybU1vZGVsIGFzIHRvdWNoZWQgdG8gZGlzcGxheSBhbnkgZXJyb3JzLlxyXG5cdCAqIEBwYXJhbSBlcnJvcnMga2V5KHMpIG9mIFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSBlcnJvcnMgdG8gZGlzcGxheSBvciByZW1vdmVcclxuXHQgKiBAbWVtYmVyb2YgQ29tb2JvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHNldEVycm9ycyhlcnJvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KTogdm9pZCB7XHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0RXJyb3JzKGVycm9ycyk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVW5maWx0ZXIgb3B0aW9ucyBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW0gYW5kIHNlbGVjdGVkSXRlbUluZGV4XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHJlc2V0T3B0aW9ucyhvcHRpb25zPzogTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMub3B0aW9ucztcclxuXHRcdC8vIGRvIG5vdCBjb3VudCBoZWFkaW5nc1xyXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbkNvdW50ID0gdGhpcy5maWx0ZXJlZE9wdGlvbnM/LmZpbHRlcihvID0+IG8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKS5sZW5ndGggfHwgMDtcclxuXHJcblx0XHQvL2lmIHRoZXkgaGF2ZSBubyBzZWFyY2ggdGVybSwgZG9uJ3QgdHJ5IHRvIHNlbGVjdCBhbnl0aGluZyBzbyB0aGV5IGNhbiBjbGVhciB0aGUgYm94IG91dCBieSBoaXR0aW5nIGVudGVyXHJcblx0XHQvL2lmIHRoZXkgaGF2ZSBhIHNlYXJjaCB0ZXJtIGFuZCB0aGUgb3B0aW9ucyBjaGFuZ2VkLCBzZWxlY3QgYW4gb3B0aW9uIGZyb20gdGhlIG1lbnUgc28gdGhleSB3aWxsIGdldCBpdCBhdXRvbWF0aWNhbGx5IGlmIHRoZXkgaGl0IGVudGVyXHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlICE9PSAnJykge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gdGhpcy5maW5kRGVmYXVsdFNlbGVjdGlvbkluZGV4KHRoaXMuZmlsdGVyZWRPcHRpb25zLCB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdIHx8IG51bGw7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSh0aGlzLnNlbGVjdGVkSXRlbUluZGV4KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vaWYgdGhleSBoYXZlIG5vIHNlYXJjaCB0ZXJtIGFuZCB0aGUgb3B0aW9ucyBhcmUgcmVzZXQsIGRvbid0IGF1dG8tcGljayB0aGUgZmlyc3Qgb25lXHJcblx0XHRcdC8vc28gdGhhdCBlbnRlciB3aWxsIGFsbG93IHRoZW0gdG8gd2lwZSBvdXQgdGhlaXIgbGFzdCBzZWxlY3Rpb25cclxuXHRcdFx0dGhpcy5jbGVhclNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlzdGVuIHRvIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIGV2ZW50IGZyb20ge0BsaW5rIE1lbnVDb21wb25lbnR9IGFuZCB1cGRhdGUgdGhlIGZvcm1cclxuXHQgKiBtb2RlbCBhbmQgY2xvc2UgbWVudVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWxlY3RlZENoYW5nZWQoaXRlbTogTWVudUl0ZW0pOiB2b2lkIHtcclxuXHRcdHRoaXMuc2V0Rm9ybU1vZGVsVmFsdWUoaXRlbSk7XHJcblx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93IGFuZCBoaWRlIHRoZSBwb3B1cCBtZW51XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgdG9nZ2xlTWVudShldmVudD86IEV2ZW50KTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChldmVudCkge1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdC8vIFdoZW4gdGhlIHBvcHVwIGlzIGhpZGRlbiBpdCB3aWxsIGVtaXQgaXRzIGNoYW5nZWQgc3RhdHVzIGFuZFxyXG5cdFx0XHRcdC8vIHdlIHdpbGwgcmVzZXQgdmFsdWVzIGlmIG5lZWQgYmUuXHJcblx0XHRcdFx0dGhpcy5wb3B1cC5oaWRlKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0aWYgKHRoaXMubG9hZE9uT3Blbk9ic2VydmFibGUgJiYgIXRoaXMuaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW4pIHtcclxuXHRcdFx0XHRcdHRoaXMucGVuZGluZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5sb2FkT25PcGVuT2JzZXJ2YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgocmVzdWx0OiBNZW51SXRlbVtdKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW4gPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5wZW5kaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdHRoaXMub3B0aW9ucyA9IHJlc3VsdDtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblx0XHRcdFx0XHRcdHRoaXMucG9wdXAhLnNob3coKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnBvcHVwLnNob3coKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBvbkJsdXIoKTogdm9pZCB7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogQ29udHJvbCB0aGUgbWVudSB3aXRoIGtleWJvYXJkIG5hdmlnYXRpb25cclxuXHQgKlxyXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleSNFeGFtcGxlIHwgS2V5Ym9hcmRFdmVudC5rZXl9XHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQva2V5L0tleV9WYWx1ZXMgfCBLZXkgVmFsdWVzfVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIGtleU5hdmlnYXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRjYXNlIFwiQXJyb3dEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJBcnJvd1VwXCI6XHJcblx0XHRcdGNhc2UgXCJVcFwiOlxyXG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0dGhpcy5vbkFycm93RG93blVwKGV2ZW50KTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJCYWNrc3BhY2VcIjpcclxuXHRcdFx0Y2FzZSBcIkRlbGV0ZVwiOlxyXG5cdFx0XHRjYXNlIFwiRGVsXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSBcIlRhYlwiOlxyXG5cdFx0XHRcdC8vIElmIHRhYmJpbmcgZnJvbSB0aGUgdGV4dGJveCB0byB0aGUgYnV0dG9uLCBvdmVycmlkZSB0aGUgdGV4dGJveCBhcyBiZWluZ1xyXG5cdFx0XHRcdC8vIG1hcmtlZCB0b3VjaGVkIHNvIHdlIGRvbid0IHNlZSB0aGUgaW52YWxpZCBzdGF0ZS4gT25seSBzaG93IHRoZSBpbnZhbGlkIHN0YXRlXHJcblx0XHRcdFx0Ly8gd2hlbiB0YWJiaW5nIG91dCBvZiBjb21ib2JveCBmcm9tIHRoZSBidXR0b24gb3IgYmFjayB0YWJiaW5nIGZyb20gdGhlIHRleHRib3hcclxuXHRcdFx0XHQvLyBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiBldmVudC5zcmNFbGVtZW50ICYmIGV2ZW50LnNyY0VsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xyXG5cdFx0XHRcdC8vIFx0aWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH1cclxuXHRcdFx0XHQvLyB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgZXZlbnQuc3JjRWxlbWVudCAmJiBldmVudC5zcmNFbGVtZW50LnRhZ05hbWUgPT09ICdCVVRUT04nKSB7XHJcblx0XHRcdFx0Ly8gXHRpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH1cclxuXHRcdFx0XHQvLyB9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdFx0Ly9pZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGlzIHRoZSBhZGQgbmV3IGJ1dHRvbiBsZXQgaXQgZmlyZSBidXQgZG9uJ3QgYWxsb3dcclxuXHRcdFx0XHRcdC8vdGhlIHRhYiBldmVudCB0byBjYXJyeSB0aGVtIGZvcndhcmQgZnJvbSB3aGVyZXZlciB0aGV5IGxhbmQgLSB0aGV5IHdvdWxkIHNraXAgdGhlIGZpcnN0IGJveCBvbiB0aGUgYWRkIG5ldyBmb3JtXHJcblx0XHRcdFx0XHQvL0luIHRoZSBub3JtYWwgY2FzZSB3ZSB3YW50IHRvIGFsbG93IHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9yIHRoZXkgd29uJ3QgYmUgYWJsZSB0byB0YWIgb3V0IG9mIHRoZSBjb250cm9sIGF0IGFsbC5cclxuXHRcdFx0XHRcdGlmKHRoaXMuYWRkTmV3U2VsZWN0ZWQpe1xyXG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0U2VsZWN0aW9uKGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiRW50ZXJcIjpcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0U2VsZWN0aW9uKGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiRXNjYXBlXCI6XHJcblx0XHRcdGNhc2UgXCJFc2NcIjpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHRcdC8vIEp1c3QgY2xvc2UgdGhlIG1lbnUsIGRvIG5vdCBmb2N1cyB0aGUgbmV4dCBlbGVtZW50IG9uIHRhYlxyXG5cdFx0XHRcdFx0Ly8gdW5sZXNzIHRoZSBtZW51IGlzIGhpZGRlblxyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBDbG9zZSB0aGUgbWVudSBiZWZvcmUgd2UgcmVzZXQgc2VsZWN0ZWRJdGVtIHNvIHdlIGRvbid0IHNlZSB0aGUgaGlnaGxpZ2h0IGNoYW5naW5nXHJcblx0XHRcdFx0XHQvLyB3aGVuIHJlc2V0IHRoZSBzZWxlY3RlZCBpdGVtIGJhY2sgdG8gdGhlIGZvcm1Nb2RlbFxyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIiBcIjpcclxuXHRcdFx0Y2FzZSBcIlNwYWNlYmFyXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nICYmIGV2ZW50LmtleSAhPT0gJ1NoaWZ0Jykge1xyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY2lsaXRhdGVzIGFkZGluZyBpdGVtcyB0byBhIGNvbWJvYm94XHJcblx0ICpcclxuXHQgKiBAcGFyYW0gYWRkRm4gRnVuY3Rpb24gZnJvbSBwYXJlbnQgdGhhdCBzaG91bGQgbWFrZSBhbiBBUEkgcmVxdWVzdCB0byBhZGQgYSBuZXcgaXRlbSB0byB0aGUgY29tYm9ib3gncyBvcHRpb25zXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIGFzeW5jIGFkZE5ld0l0ZW0oYWRkRm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGFkZEZuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGdhdmUgaXQgb3VyIGJlc3QgdHJ5LCBzb21ldGhpbmcgaXMgcmVhbGx5IHdoYWNrLCBzbyBsZXQncyBqdXN0IHNldCB0aGUgZXJyb3JcclxuICAgICAgICAgICAgdGhpcy5zZXRFcnJvcnMoeyAnYWRkbmV3JzogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2dnbGVNZW51KCk7XHJcbiAgICB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZpZ3VyZSBvdXQgd2hldGhlciB0aGV5IGFyZSBhZGRpbmcgbmV3IG9yIGhhdmUgYW4gaXRlbSBzZWxlY3RlZCwgYW5kIGNvbW1pdCBpdCB0byB0aGUgZm9ybSBtb2RlbFxyXG5cdCAqL1xyXG4gIHByaXZhdGUgY29tbWl0U2VsZWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy5vbkFkZE5ldyhldmVudCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuXHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB0ZXh0Ym94IHRvIHRoZSBwYXJlbnQgd2hlbiB0aGUgYWRkIG5ldyBidXR0b24gaXNcclxuXHQgKiBjbGlja2VkXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZXZlbnQgQWRkIG5ldyBidXR0b24gY2xpY2sgb3IgZW50ZXIga2V5IGV2ZW50XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIG9uQWRkTmV3KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHR0aGlzLmFkZE5ld0NsaWNrLmVtaXQodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHRcdHRoaXMucG9wdXA/LmhpZGUoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBOYXZpZ2F0ZSB0aGUgZHJvcGRvd24gbWVudSB1c2luZyB1cCBhbmQgZG93biBhcnJvdyBrZXlzXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZXZlbnQgVXAgb3IgZG93biBhcnJvdyBrZXlkb3duIGV2ZW50XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBvbkFycm93RG93blVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRjYXNlIFwiQXJyb3dEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJEb3duXCI6XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4gJiYgIXRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA8IHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDEpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vaWYgdGhlIGxhc3QgaXRlbSBpcyBhIGhlYWRpbmcgYW5kIHdlIGFyZSBvbiB0aGUgc2Vjb25kIGxhc3QgaXRlbSwgd2Ugc2hvdWxkbid0IGluY3JlbWVudCB0aGUgc2VsZWN0ZWRJdGVtSW5kZXggYmVjYXVzZSB0aGF0IHdvdWxkIHNlbGVjdCB0aGUgaGVhZGluZ1xyXG5cdFx0XHRcdFx0aWYoICEodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAyICYmIHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXgrMV0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSApIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCsrO1xyXG5cdFx0XHRcdFx0XHQvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPCB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAxICYmIHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgrKztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJBcnJvd1VwXCI6XHJcblx0XHRcdGNhc2UgXCJVcFwiOlxyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4gJiYgdGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PT0gMCAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4LS07XHJcblx0XHRcdFx0XHQvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgtLTtcclxuXHJcblx0XHRcdFx0XHRcdC8vaWYgdGhlIHNlbGVjdGVkSXRlbUluZGV4IGlzIC0xLCB0aGF0IG1lYW5zIHRoZSB2ZXJ5IGZpcnN0IGl0ZW0gd2FzIGEgaGVhZGluZyBhbmQgd2UganVzdCBza2lwcGVkIG92ZXIgaXQuXHJcblx0XHRcdFx0XHRcdGlmKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHQvL2lmIHRoZXJlIGlzIGFuIGFkZCBuZXcgYnV0dG9uIHdlIHNob3VsZCBzZWxlY3QgaXQuIG90aGVyd2lzZSB3ZSBzaG91bGQgbG9jayB0aGVtIGF0IGluZGV4IDEgKHJpZ2h0IGJlZm9yZSB0aGUgaGVhZGluZylcclxuXHRcdFx0XHRcdFx0XHRpZih0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gMTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuICAgICAgICAgIFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdO1xyXG5cclxuXHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cclxuXHQvKipcclxuXHJcblx0ICogRmlsdGVyIGFycmF5IG9mIG9wdGlvbnMgYnkgbGFiZWwgb3IgY2FwdGlvbiAoY29udGFpbnMpXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZmlsdGVyVGV4dCBUaGUgdmFsdWUgb2YgdGV4dGJveCB0aGF0IHdlIHdpbGwgZmlsdGVyIG91ciBvcHRpb25zIGJ5XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbHRlck9wdGlvbnNBcnJheShmaWx0ZXJUZXh0OiBzdHJpbmcpOiBBcnJheTxNZW51SXRlbT4ge1xyXG5cdFx0bGV0IHNlYXJjaFRleHQgPSBmaWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRpZiAoZmlsdGVyVGV4dCAmJiBmaWx0ZXJUZXh0ICE9PSAnJykge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcihpdGVtID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPj0gMCB8fCBcclxuXHRcdFx0XHRcdFx0KGl0ZW0uY2FwdGlvbiAmJiBpdGVtLmNhcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID49IDApO1xyXG5cdFx0XHR9KVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBGaW5kIGEgZ2l2ZW4gaXRlbSdzIGluZGV4IGluIHRoZSBmaWx0ZXJlZCBpdGVtcyBhcnJheS5cclxuXHQgKlxyXG5cdCAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kXHJcblx0ICogQHBhcmFtIGl0ZW0gVGhlIG1hdGNoaW5nIGl0ZW0gdG8gZmluZCBpbiB0aGVcclxuXHQgKiBmaWx0ZXJkT3B0aW9ucyBhcnJheS4gV2lsbCB1c2UgdGhlIHNlbGVjdGVkSXRlbSBpZiBub3RoaW5nIGlzIHBhc3NlZC5cclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmRTZWxlY3RlZEl0ZW1JbmRleChpdGVtPzogTWVudUl0ZW0pOiBudW1iZXIge1xyXG5cdFx0bGV0IGl0ZW1Ub0ZpbmQgPSBpdGVtID8gaXRlbSA6IHRoaXMuc2VsZWN0ZWRJdGVtO1xyXG5cclxuXHRcdGlmIChpdGVtVG9GaW5kKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maW5kSW5kZXgoaXRlbSA9PiB7XHJcblx0XHRcdFx0aWYoaXRlbS5pZCAmJiAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmlkKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbCAmJiBpdGVtLmlkID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmlkXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldHVybiBpdGVtLmxhYmVsID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmxhYmVsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIC0xO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlYWN0IHRvIG91ciBmb3JtTW9kZWwgY2hhbmdpbmdcclxuXHQgKlxyXG5cdCAqIFRoZSBmb3JtTW9kZWwgcmVwcmVzZW50cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIE1vZGVsSXRlbVxyXG5cdCAqIFdoZW4gY2hhbmdlZCwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgVGV4dGJveENvbXBvbmVudCBhbmRcclxuXHQgKiBmaW5kIGluZGV4IG9mIGl0ZW0gaW4gb3B0aW9ucyBsaXN0LlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmb3JtTW9kZWxDaGFuZ2VkKGRhdGE/OiBNZW51SXRlbSk6IHZvaWQge1xyXG5cdFx0dGhpcy5zeW5jaHJvbml6ZURpc2FibGVkQXR0cmlidXRlcygpO1xyXG5cclxuXHRcdGlmIChkYXRhKSB7XHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZShkYXRhLnNlbGVjdGVkTGFiZWwgfHwgZGF0YS5sYWJlbCk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gdGhpcy5maW5kU2VsZWN0ZWRJdGVtSW5kZXgoZGF0YSk7XHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID49IDApIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvL1RoZSBob3N0IHdpcGVkIG91dCB0aGUgZGF0YSBleHRlcm5hbGx5LCBjbGVhciB0aGUgdGV4dGJveCBhbmQgdGhlIHRyYWNraW5nIHN0YXRlXHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5yZXNldCgpO1xyXG5cdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2Nyb2xsIHRoZSBtZW51IGlmIHRoZSBjdXJyZW50IHNlbGVjdGVkSXRlbUluZGV4IGlzIG91dCBvZiB2aWV3XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNjcm9sbE1lbnUoa25vd25JbmRleD86IG51bWJlcik6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW1JbmRleCBpbiBjYXNlIG91ciBvcHRpb25zIGNoYW5nZWRcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGtub3duSW5kZXggPT09IHVuZGVmaW5lZCA/IHRoaXMuZmluZFNlbGVjdGVkSXRlbUluZGV4KCkgOiBrbm93bkluZGV4O1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLnNlbGVjdGVkSXRlbSkge1xyXG5cdFx0XHRcdC8vIFRoZSBtZW51IGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgaWRzIGZvciB0aGUgbWVudSBpdGVtcyBpZiB0aGV5IGRvbnQgaGF2ZSB0aGVtLFxyXG5cdFx0XHRcdC8vIHNvIHRoZXkgbmVlZCB0byBiZSBhY2NvdW50ZWQgZm9yIGhlcmUgc2luY2UgdGhlIGNvbWJvYm94IGRvZXNuJ3Qga25vdyBhYm91dCB0aG9zZSBpZHNcclxuXHRcdFx0XHRsZXQgaXRlbVNlbGVjdG9yID0gdGhpcy5zZWxlY3RlZEl0ZW0uaWQgPyBgIyR7dGhpcy5zZWxlY3RlZEl0ZW0uaWR9YCA6IGAjJHt0aGlzLmlkfV9tZW51X2l0ZW0ke3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXh9YDtcclxuXHJcblx0XHRcdFx0Ly90cmlnZ2VyIHRoZSBzY3JvbGxpbmcgYWZ0ZXIgYSB0aWNrIHRvIGFsbG93IHRoZSBtZW51IHRvIGJlIHVwIHRvIGRhdGUgKGFuZCBwZW5kaW5nIG1hc2sgY2xlYXJlZCkgYmVmb3JlIG1lYXN1cmluZ1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoKCk9PntcclxuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxJdGVtQ2VudGVyZWQoYCMke3RoaXMuaWR9X21lbnVfbGlzdGAsIGl0ZW1TZWxlY3Rvcik7XHJcblx0XHRcdFx0fSwgMCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoL0ZpbHRlciBiYXNlZCBvbiB0ZXh0Ym94IGlucHV0XHJcblx0ICogTk9URTogc28gYXMgbm90IHRvIHJlY2VpdmUgYSBub3RpZmljYXRpb24gb24gZXZlcnkga2V5IGV2ZW50LCB3ZSBzdWdnZXN0IHlvdSBkZWJvdW5jZSB5b3VyXHJcblx0ICogc3Vic2NyaXB0aW9uXHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cDovL3JlYWN0aXZleC5pby9yeGpzL2NsYXNzL2VzNi9PYnNlcnZhYmxlLmpzfk9ic2VydmFibGUuaHRtbCNpbnN0YW5jZS1tZXRob2QtZGVib3VuY2VUaW1lIHwgT2JzZXJ2YWJsZS5kZWJvdW5jZVRpbWV9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNlYXJjaEFuZEZpbHRlcihzZWFyY2hUZXh0Pzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG5cdFx0Ly8gYWx3YXlzIGVtaXRcclxuXHRcdHRoaXMuc2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XHJcblxyXG5cdFx0Ly8gZG8gaW50ZXJuYWwgZmlsdGVyaW5nIGlmIG5vIG9uZSdzIHN1YnNjcmliZWQgdG8gb3VyIHNlYXJjaCBlbWl0dGVyXHJcblx0XHRpZiAodGhpcy5zZWFyY2gub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCAmJiBzZWFyY2hUZXh0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dGhpcy5yZXNldE9wdGlvbnModGhpcy5maWx0ZXJPcHRpb25zQXJyYXkoc2VhcmNoVGV4dCkpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQgJiYgIXRoaXMuYWRkTmV3QnV0dG9uKSB7XHJcblx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHtAbGluayBmb3JtTW9kZWwgfSdzIHZhbGlkYXRpb24gZXJyb3JzIGVxdWFsIHRvIHRoZSBpbnRlcm5hbCB0ZXh0Ym94J3MuXHJcblx0ICpcclxuXHQgKiBXaGVuIHRoZSBpbnRlcm5hbCB0ZXh0Ym94IGlzIGludmFsaWQsIG5lZWQgdG8gc2V0IHRoaXMgY29udHJvbCdzXHJcblx0ICogZXJyb3JzIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIG91ciBvd24gbGFiZWwsIG5vdCBUZXh0Ym94Q29udHJvbCdzLlxyXG5cdCAqIFdlIHVzZSBvdXIgb3duIGxhYmVsIHNvIGxhYmVsIHRleHQgd2lsbCB3cmFwIGF0IHRoZSBlbmQgb2YgdGhlIGJ1dHRvbixcclxuXHQgKiBub3QgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dGJveC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0Rm9ybU1vZGVsVmFsaWRhdGlvbkVycm9ycyhkYXRhPzogYW55KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmludmFsaWQpIHtcclxuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKG51bGwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIHRoZSBmb3JtIG1vZGVsIHZhbHVlIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0gb3IgcmVzZXQgZm9ybSBtb2RlbCB2YWx1ZSBpZiBpdGVtIGlzIG51bGxcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0Rm9ybU1vZGVsVmFsdWUoaXRlbTogTWVudUl0ZW0gfCBudWxsKTogdm9pZCB7XHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoaXRlbSA/IChpdGVtLnNlbGVjdGVkTGFiZWwgfHwgaXRlbS5sYWJlbCkgOiAnJyk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5zZXRWYWx1ZShpdGVtKTtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc0RpcnR5KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHZhbGlkYXRvcnMgb24gdGhlIHtAc2VlIHRleHRib3hGb3JtTW9kZWwgfVxyXG5cdCAqXHJcblx0ICogVmFsaWRhdG9ycyBhcmUgY3VycmVudGx5IHNldCBiYXNlZCBvbiB0aGUge0BzZWUgbWF4bGVuZ3RoIH0sXHJcblx0ICoge0BzZWUgbWlubGVuZ3RoIH0sIGFuZCB7QHNlZSByZXF1aXJlZCB9IGlucHV0cy4gIFRoaXMgd29ya3Mgd2VsbFxyXG5cdCAqIHdpdGgge0BzZWUgVGV4dGJveENvbXBvbmVudCB9LCB3aGljaCBuZWVkcyB0aGVzZSBpbnB1dHMgdG8gYXBwbHlcclxuXHQgKiB0aGUgcHJvcGVyIGF0dHJpYnV0ZXMgdG8gaXRzIGlucHV0cy5cclxuXHQgKlxyXG5cdCAqIEEgZnV0dXJlIHJlbGVhc2Ugb2YgQW5ndWxhciB3aWxsIHN1cHBvc2VkbHkgYWRkIHRoZXNlIGF0dHJpYnV0ZXNcclxuXHQgKiBmb3IgeW91LCB3aGljaCB3aWxsIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgVGV4dGJveENvbXBvbmVudCB0byBoYXZlXHJcblx0ICogc3VjaCBpbnB1dHMuICBUaGlzIGNvbXBvbmVudCwgaG93ZXZlciwgd2lsbCBzdGlsbCBuZWVkIHRoZXNlIGlucHV0c1xyXG5cdCAqIGFzIHRoZXJlIGlzIG5vIGN1cnJlbnQgd2F5IHRvIGtub3cgd2hpY2ggdmFsaWRhdG9ycyBhcmUgYXBwbGllZCB0byBpdFxyXG5cdCAqIGZyb20gaXRzIHBhcmVudCBWaWV3IENvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuXHRcdGxldCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcclxuXHJcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMubWlubGVuZ3RoKSB7XHJcblx0XHRcdHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm1pbmxlbmd0aCkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLm1heGxlbmd0aCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5tYXhsZW5ndGgpKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEtlZXAgdGV4dGJveCdzIGRpc2FibGVkIHN0YXR1cyBpbi1zeW5jIHdpdGggY29tYm9ib3gnc1xyXG5cdCAqXHJcblx0ICoge0BsaW5rIFRleHRib3hDb21wb25lbnR9IGdldHMgaXRzIGRpc2FibGVkIHN0YXR1cyBmcm9tIGl0cyB7QGxpbmsgRm9ybUNvbnRyb2x9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHN5bmNocm9uaXplRGlzYWJsZWRBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkICE9PSB0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGUoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuZW5hYmxlKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGUgZm9ybU1vZGVsIHZhbHVlIGFuZCB0ZXh0Ym94IHZhbHVlIGRvIG5vdCBtYXRjaCwgcmVzZXQgdGhlIHRleHRib3ggYW5kIHNlbGVjdGVkSXRlbSB0b1xyXG5cdCAqIHRoZSBmb3JtTW9kbGUgdmFsdWUuIElmIHRoZXJlIGlzIG5vIGZvcm1Nb2RlbCB2YWx1ZSwgbWFrZSBzdXJlIHdlIGNsZWFyIHRoZSB0ZXh0Ym94LiBSZXNldCB0aGVcclxuXHQgKiBmaWx0ZXJlZE9wdGlvbnMgdG8gdGhlIGZ1bGwgbGlzdCBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW1JbmRleFxyXG5cdCAqXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzeW5jTW9kZWxWYWx1ZXMoKTogdm9pZCB7XHJcblx0XHQvLyBJZiB0aGVyZSBpcyBhIGZvcm1Nb2RlbCB2YWx1ZSwgcmVzZXQgdGhlIHNlbGVjdGVkIGl0ZW0uIElmIHRoZXJlIGlzbid0LCBtYWtlXHJcblx0XHQvLyBzdXJlIHdlIGNsZWFyIHRoZSB0ZXh0Ym94XHJcblx0XHRjb25zdCBuZXdMYWJlbCA9IHRoaXMuZm9ybU1vZGVsLnZhbHVlPy5zZWxlY3RlZExhYmVsIHx8IHRoaXMuZm9ybU1vZGVsLnZhbHVlPy5sYWJlbDtcclxuXHRcdGlmICh0aGlzLmZvcm1Nb2RlbC52YWx1ZSAmJiAobmV3TGFiZWwgIT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkpIHtcclxuXHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKG5ld0xhYmVsKTtcclxuXHRcdH0gZWxzZSBpZiAoIXRoaXMuZm9ybU1vZGVsLnZhbHVlKSB7XHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSgnJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoIGFuZCBmaWx0ZXIgdGhlIG9wdGlvbnMgbGlzdCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dGJveCBpbnB1dCBjaGFuZ2VzLiBJZiBhZGROZXcgaXNcclxuXHQgKiBzZXQgYWxzbyBjaGVjayBmb3IgbWF0Y2hlcyBpbiBvdXIgZmlsdGVyZWRPcHRpb25zIHRvIGNvbmRpdGlvbmFsbHkgc2hvdyBhbmQgaGlkZSB0aGUgYWRkIG5ld1xyXG5cdCAqIGJ1dHRvblxyXG5cdCAqXHJcblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvaW5wdXRcclxuXHQgKi9cclxuXHRwdWJsaWMgdGV4dGJveFZhbHVlQ2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2VhcmNoQW5kRmlsdGVyKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSk7XHJcblxyXG5cdFx0aWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSA9PT0gJycpIHtcclxuXHRcdFx0dGhpcy5jbGVhclNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmFkZE5ldykge1xyXG5cdFx0XHRsZXQgbWF0Y2ggPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maW5kKChvcHRpb24pID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5mb3VuZE1hdGNoID0gbWF0Y2ggPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHRoZSBwb3B1cCBtZW51IHBvc2l0aW9uIHdoZW4gaW5wdXQgdmFsdWUgY2hhbmdlc1xyXG5cdFx0aWYgKHRoaXMucG9wdXApIHtcclxuXHRcdFx0dGhpcy5wb3B1cC51cGRhdGUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2xlYXJTZWxlY3RlZEl0ZW0oKTogdm9pZCB7XHJcblx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcblx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gLTE7XHJcblx0fVxyXG5cclxuXHQvKipSZWNvbXB1dGUgd2hhdCB0aGUgcGxhY2Vob2xkZXIgc2hvdWxkIGJlIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHVzZXIgcHJvdmlkZWQgb25lIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYWRkTmV3IGlucHV0ICovXHJcblx0cHJpdmF0ZSB1cGRhdGVQbGFjZWhvbGRlclRleHQoKXtcclxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyKSB7XHJcblx0XHRcdHRoaXMuZWZmZWN0aXZlUGxhY2Vob2xkZXIgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHRoaXMucGxhY2Vob2xkZXIpO1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLmFkZE5ldykge1xyXG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy5jaG9vc2VPckFkZFBsYWNlaG9sZGVyO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5lZmZlY3RpdmVQbGFjZWhvbGRlciA9IHRoaXMuY2hvb3NlUGxhY2Vob2xkZXI7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipGaW5kIHRoZSBvcHRpb24gd2Ugd2FudCB0byBiZSB0aGUgZGVmYXVsdCBzZWxlY3Rpb24uIElmIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLCB1c2UgdGhhdFxyXG5cdCAqIG90aGVyd2lzZSBpZiB0aGVyZSBhcmUgaXRlbXMsIHJldHVybiB6ZXJvIHRvIGluZGljYXRlIHRoZSBmaXJzdCBpdGVtLiBPdGhlcndpc2UgcmV0dXJuIC0xXHJcblx0ICogdG8gaW5kaWNhdGUgbm8gc2VsZWN0aW9uXHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kRGVmYXVsdFNlbGVjdGlvbkluZGV4KG9wdGlvbnM6IE1lbnVJdGVtW10sIHNlYXJjaFRleHQ6IHN0cmluZyk6IG51bWJlciB7XHJcblx0XHRsZXQgaW5kZXggPSAtMTtcclxuXHJcblx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMubGVuZ3RoKXtcclxuXHRcdFx0aW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb249Pm9wdGlvbiAhPSBudWxsICYmIG9wdGlvbi5kaXNwbGF5ICE9PSAnaGVhZGluZycpO1xyXG5cclxuXHRcdFx0aWYoc2VhcmNoVGV4dCl7XHJcblx0XHRcdFx0c2VhcmNoVGV4dCA9IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKS50cmltKCk7XHJcblx0XHRcdFx0bGV0IGV4YWN0TWF0Y2hJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbj0+b3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT0gc2VhcmNoVGV4dCAmJiBvcHRpb24uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKTtcclxuXHRcdFx0XHRpZihleGFjdE1hdGNoSW5kZXggPj0wKXtcclxuXHRcdFx0XHRcdGluZGV4ID0gZXhhY3RNYXRjaEluZGV4O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGluZGV4O1xyXG5cdH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRyb2wgY29udHJvbC1sYWJlbC17e2xhYmVsUG9zaXRpb259fVwiXHJcbiAgICAgW25nQ2xhc3NdPVwieydvcGVuJzogbWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnLFxyXG4gICAgICAgICAgICAgICAgICdpbnZhbGlkJzogZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWQsXHJcbiAgICAgICAgICAgICAgICAgJ2hhcy1pY29uJzogKCh0ZW1wbGF0ZVR5cGUgPT09ICdpY29uQW5kTGFiZWwnIHx8IHRlbXBsYXRlVHlwZSA9PT0gJ2ljb25MYWJlbENhcHRpb24nKSAmJiBmb3JtTW9kZWwudmFsdWUgJiYgZm9ybU1vZGVsLnZhbHVlLmljb24gJiYgZm9ybU1vZGVsLnZhbHVlLmxhYmVsID09PSB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAnaXMtcmVhZG9ubHknOiByZWFkb25seSxcclxuICAgICAgICAgICAgICAgICAnaXMtZGlzYWJsZWQnOiBmb3JtTW9kZWwuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAgJ2lzLWFsd2F5cy1vcGVuJzogYWx3YXlzT3Blbn1cIj5cclxuXHJcbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBuZ1ByZXNlcnZlV2hpdGVzcGFjZXM+XHJcbiAgICAgIDxzcGFuPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDAgJiYgZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWRcIj57e3ZhbGlkYXRpb25FcnJvcnN9fTwvc3Bhbj5cclxuICA8L2xhYmVsPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWx3YXlzT3BlbjsgZWxzZSBwb3B1cFRhcmdldFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHRib3gtZ3JvdXAgY29udHJvbC1pbnB1dFwiIFtuZ0NsYXNzXT1cInRleHRib3hFbGVtZW50Q2xhc3Nlc1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGV4dGJveFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwIHx8IHRleHRib3hGb3JtTW9kZWwudmFsdWVcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3dubWVudVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNwb3B1cFRhcmdldD5cclxuICA8ZGl2IGNsYXNzPVwidGV4dGJveC1ncm91cCBjb250cm9sLWlucHV0XCIgW25nQ2xhc3NdPVwidGV4dGJveEVsZW1lbnRDbGFzc2VzXCIgKmVjUG9wdXA9XCJkcm9wZG93bm1lbnVcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZXh0Ym94XCI+PC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3RleHRib3g+XHJcbiAgPGkgY2xhc3M9XCJlYy1pY29uIHt7Zm9ybU1vZGVsLnZhbHVlPy5pY29ufX1cIj48L2k+XHJcblxyXG4gICAgPGVjLXRleHRib3ggY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwLWlucHV0IG1iLTBcIlxyXG4gICAgICAgICAgICAgICAgI3RleHRib3hcclxuICAgICAgICAgICAgICAgIFtpZF09XCJpZFwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInRleHRib3hGb3JtTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhsZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtaW5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVmZmVjdGl2ZVBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJ0ZXh0Ym94VmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5TmF2aWdhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25CbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgW3VwcGVyQ2FzZV09XCJ1cHBlckNhc2VcIlxyXG4gICAgICAgICAgICAgICAgW3BlbmRpbmddPVwicGVuZGluZyAmJiBhbHdheXNPcGVuXCJcclxuICAgICAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiJ29mZidcIj48L2VjLXRleHRib3g+XHJcblxyXG4gICAgPGVjLWJ1dHRvbiBjbGFzcz1cInRleHRib3gtZ3JvdXAtYnRuLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaGlkZVRvZ2dsZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgIFtpZF09XCJpZCArICdfYnV0dG9uJ1wiXHJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtTW9kZWwuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICBpY29uPVwiaWNvbi1jYXJldC1kb3duXCJcclxuICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNZW51KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlOYXZpZ2F0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJtZW51U3RhdHVzID09PSAndmlzaWJsZSdcIj48L2VjLWJ1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd25tZW51PlxyXG4gIDxkaXYgY2xhc3M9XCJwb3B1cFwiXHJcbiAgICAgICBlY092ZXJsYXlcclxuICAgICAgIFtzdGF0dXNdPVwicGVuZGluZyAmJiAhYWx3YXlzT3BlbiA/ICdwZW5kaW5nJyA6ICdoYXNEYXRhJ1wiPlxyXG5cclxuICAgIDxidXR0b24gY2xhc3M9XCJhZGQtbmV3IHt7YWRkTmV3T3B0aW9ucz8uY2xhc3NMaXN0fX1cIlxyXG4gICAgICAgICAgICBpZD1cInt7aWR9fV9hZGROZXdcIlxyXG4gICAgICAgICAgICAjYWRkTmV3QnV0dG9uXHJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJhZGROZXdTZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiYWRkTmV3XCJcclxuICAgICAgICAgICAgW2hpZGRlbl09XCJmb3VuZE1hdGNoIHx8IChhZGROZXcgPT09ICdkeW5hbWljJyAmJiAoIXRleHRib3hGb3JtTW9kZWwudmFsdWUgfHwgKGZvcm1Nb2RlbC52YWx1ZSAmJiB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlID09PSBmb3JtTW9kZWwudmFsdWUubGFiZWwpKSlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25BZGROZXcoJGV2ZW50KVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImFkZC1uZXctbGFiZWwgZWMtdXRpbC10cnVuY2F0ZVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYWRkTmV3ID09PSAnc3RhdGljJyB8fCBhZGROZXcgPT09IHRydWVcIlxyXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZT57e2FkZE5ld09wdGlvbnM/LmxhYmVsfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJhZGROZXcgPT09ICdkeW5hbWljJ1wiPnt7J0FkZCcgfCB0cmFuc2xhdGV9fSA8c3Ryb25nIFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZWMtdXRpbC10cnVuY2F0ZVwiIFxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndGV4dC11cHBlcmNhc2UnOiB1cHBlckNhc2V9XCI+e3t0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlfX08L3N0cm9uZz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPGkgY2xhc3M9XCJlYy1pY29uIHt7YWRkTmV3T3B0aW9ucz8uaWNvbn19XCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGVjLW1lbnUgaWQ9XCJ7e2lkfX1fbWVudVwiXHJcbiAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXRvcC0wXT1cIiFmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoICYmIGhpZGVOb01hdGNoZXNcIlxyXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUVsZW1lbnRDbGFzc2VzXCJcclxuICAgICAgICAgICAgIFt0ZW1wbGF0ZVR5cGVdPVwidGVtcGxhdGVUeXBlXCJcclxuICAgICAgICAgICAgIFtjdXN0b21NZW51VGVtcGxhdGVdPVwiY3VzdG9tTWVudVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgIFtzaG93Tm9JdGVtc109XCIhaGlkZU5vTWF0Y2hlc1wiXHJcbiAgICAgICAgICAgICBbbm9EYXRhVGV4dF09XCJub01hdGNoZXNUZXh0XCJcclxuICAgICAgICAgICAgIFtpdGVtc109XCJmaWx0ZXJlZE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkSXRlbVwiXHJcbiAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2VkKT1cInNlbGVjdGVkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFtwcmVzZXJ2ZUljb25TcGFjZV09XCJwcmVzZXJ2ZUljb25TcGFjZVwiXHJcbiAgICAgICAgICAgICBbdHJ1bmNhdGVJdGVtc109XCJ0cnVuY2F0ZUl0ZW1zXCI+PC9lYy1tZW51PlxyXG5cclxuICAgIDxmb290ZXIgKm5nSWY9XCJ0b3RhbFJlY29yZHMgJiYgdG90YWxSZWNvcmRzID4gZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAmJiBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID4gMFwiPlxyXG4gICAgICA8c3Bhbj57e2ZpbHRlcmVkT3B0aW9uQ291bnR9fSB7eydvZicgfCB0cmFuc2xhdGV9fSB7e3RvdGFsUmVjb3Jkc319PC9zcGFuPlxyXG4gICAgPC9mb290ZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==