@energycap/components 0.33.5-ECAP-18191-carbon-hub-theme-phase-1.20230606-1102 → 0.33.5-ECAP-18191-carbon-hub-theme-phase-1.20230606-1209
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.
- package/esm2020/lib/controls/button/button.component.mjs +2 -2
- package/esm2020/lib/controls/combobox/combobox.component.mjs +3 -3
- package/fesm2015/energycap-components.mjs +4 -4
- package/fesm2015/energycap-components.mjs.map +1 -1
- package/fesm2020/energycap-components.mjs +4 -4
- package/fesm2020/energycap-components.mjs.map +1 -1
- package/package.json +1 -1
@@ -781,10 +781,10 @@ export class ComboboxComponent extends FormControlBase {
|
|
781
781
|
}
|
782
782
|
}
|
783
783
|
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 });
|
784
|
-
ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ComboboxComponent, selector: "ec-combobox", inputs: { addNew: "addNew", maxlength: "maxlength", menuPosition: "menuPosition", minlength: "minlength", options: "options", templateType: "templateType", customMenuTemplate: "customMenuTemplate", popupFixed: "popupFixed", totalRecords: "totalRecords", upperCase: "upperCase", placeholder: "placeholder", loadOnOpenObservable: "loadOnOpenObservable", hideToggleButton: "hideToggleButton", alwaysOpen: "alwaysOpen", menuElementClasses: "menuElementClasses", textboxElementClasses: "textboxElementClasses", hideNoMatches: "hideNoMatches", noMatchesText: "noMatchesText" }, 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' && 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)\"></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\"\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\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\" translate>Add new...</span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\" [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong></span>\r\n </span>\r\n <i class=\"ec-icon icon-add\"></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)\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptions.length}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-color-primary-dark);font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);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:transparent;background-color:#1a1a231f;background-clip:border-box;background-image:none;color:var(--ec-color-primary-dark);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-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}: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-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}.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{border-color:var(--ec-border-color);background-color:var(--ec-background-color);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgb(255, 228, 51)\" d=\"M31.32 21.69l-.09.18-2.48 4.35c-.36.54-.77.62-1.25.27-.12 0-.2 0-.2-.09L19.53 22v9.37a1.26 1.26 0 0 1-.72.67h-5.26c-.59 0-.83-.3-.83-.89 0-.12.15-.21.15-.27V22l-8 4.71h-.12c-.42.66-.8.21-1.16-.27L1 21.82a.82.82 0 0 1 .35-1.26l.18-.1L9 16 .87 11.47v-.09c0-.36-.39-.74-.09-1.16l2.75-4.35v-.09c0-.42.82-.54 1.29-.36l8 4.62V.89c0-.59.18-.89.77-.89h5c.65 0 .91.3.91.89V10l7.94-4.53c.48-.29.72-.21 1.08.27l2.32 4.35v.09c.66.48.45.89-.08 1.25L23 16l7.91 4.53v.09c-.04.18.53.54.41 1.07z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-color-interactive);box-shadow:0 0 0 .0625rem var(--ec-color-interactive);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 .ec-icon{filter:grayscale(100%);opacity:.65}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:.0625rem;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-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.25;padding:.25rem .5rem;align-items:center;background-color:var(--ec-background-color);display:flex;cursor:pointer;border:0;width:100%}.add-new.is-selected,.add-new.is-highlighted{background-color:var(--ec-background-color-selected)}.add-new:focus{background-color:var(--ec-color-disabled-dark);position:relative;z-index:1;outline:none}.add-new:active{background-color:var(--ec-color-interactive);color:var(--ec-color-primary-light)}.add-new:disabled,.add-new.is-disabled{color:var(--ec-color-secondary-dark);opacity:.65;cursor:default}.add-new .label{align-items:center;display:flex;flex:auto}.add-new .ec-icon+.label{margin:0 .375rem}.add-new:hover:not(:active),.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:active .ec-icon{color:inherit}.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 ::ng-deep button .ec-icon{background-size:1em;background-position:center}.open:not(.is-always-open) .textbox-group ec-textbox ::ng-deep input{border-color:var(--ec-border-color);box-shadow:none}.open:not(.is-always-open) .textbox-group ec-button ::ng-deep button{background-color:var(--ec-background-color-hover);box-shadow:none}\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" }] });
|
784
|
+
ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ComboboxComponent, selector: "ec-combobox", inputs: { addNew: "addNew", maxlength: "maxlength", menuPosition: "menuPosition", minlength: "minlength", options: "options", templateType: "templateType", customMenuTemplate: "customMenuTemplate", popupFixed: "popupFixed", totalRecords: "totalRecords", upperCase: "upperCase", placeholder: "placeholder", loadOnOpenObservable: "loadOnOpenObservable", hideToggleButton: "hideToggleButton", alwaysOpen: "alwaysOpen", menuElementClasses: "menuElementClasses", textboxElementClasses: "textboxElementClasses", hideNoMatches: "hideNoMatches", noMatchesText: "noMatchesText" }, 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' && 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\"\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\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\" translate>Add new...</span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\" [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong></span>\r\n </span>\r\n <i class=\"ec-icon icon-add\"></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)\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptions.length}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-color-primary-dark);font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);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:transparent;background-color:#1a1a231f;background-clip:border-box;background-image:none;color:var(--ec-color-primary-dark);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-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}: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-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}.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{border-color:var(--ec-border-color);background-color:var(--ec-background-color);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgb(255, 228, 51)\" d=\"M31.32 21.69l-.09.18-2.48 4.35c-.36.54-.77.62-1.25.27-.12 0-.2 0-.2-.09L19.53 22v9.37a1.26 1.26 0 0 1-.72.67h-5.26c-.59 0-.83-.3-.83-.89 0-.12.15-.21.15-.27V22l-8 4.71h-.12c-.42.66-.8.21-1.16-.27L1 21.82a.82.82 0 0 1 .35-1.26l.18-.1L9 16 .87 11.47v-.09c0-.36-.39-.74-.09-1.16l2.75-4.35v-.09c0-.42.82-.54 1.29-.36l8 4.62V.89c0-.59.18-.89.77-.89h5c.65 0 .91.3.91.89V10l7.94-4.53c.48-.29.72-.21 1.08.27l2.32 4.35v.09c.66.48.45.89-.08 1.25L23 16l7.91 4.53v.09c-.04.18.53.54.41 1.07z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-color-interactive);box-shadow:0 0 0 .0625rem var(--ec-color-interactive);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 .ec-icon{filter:grayscale(100%);opacity:.65}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:.0625rem;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-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.25;padding:.25rem .5rem;align-items:center;background-color:var(--ec-background-color);display:flex;cursor:pointer;border:0;width:100%}.add-new.is-selected,.add-new.is-highlighted{background-color:var(--ec-background-color-selected)}.add-new:focus{background-color:var(--ec-color-disabled-dark);position:relative;z-index:1;outline:none}.add-new:active{background-color:var(--ec-color-interactive);color:var(--ec-color-primary-light)}.add-new:disabled,.add-new.is-disabled{color:var(--ec-color-secondary-dark);opacity:.65;cursor:default}.add-new .label{align-items:center;display:flex;flex:auto}.add-new .ec-icon+.label{margin:0 .375rem}.add-new:hover:not(:active),.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:active .ec-icon{color:inherit}.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 ::ng-deep button .ec-icon{background-size:1em;background-position:center}.open:not(.is-always-open) .textbox-group ec-textbox ::ng-deep input{border-color:var(--ec-border-color);box-shadow:none}.open:not(.is-always-open) .textbox-group ec-button ::ng-deep button{background-color:var(--ec-background-color-hover);box-shadow:none}\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" }] });
|
785
785
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ComboboxComponent, decorators: [{
|
786
786
|
type: Component,
|
787
|
-
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' && 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)\"></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\"\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\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\" translate>Add new...</span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\" [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong></span>\r\n </span>\r\n <i class=\"ec-icon icon-add\"></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)\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptions.length}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-color-primary-dark);font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);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:transparent;background-color:#1a1a231f;background-clip:border-box;background-image:none;color:var(--ec-color-primary-dark);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-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}: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-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}.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{border-color:var(--ec-border-color);background-color:var(--ec-background-color);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgb(255, 228, 51)\" d=\"M31.32 21.69l-.09.18-2.48 4.35c-.36.54-.77.62-1.25.27-.12 0-.2 0-.2-.09L19.53 22v9.37a1.26 1.26 0 0 1-.72.67h-5.26c-.59 0-.83-.3-.83-.89 0-.12.15-.21.15-.27V22l-8 4.71h-.12c-.42.66-.8.21-1.16-.27L1 21.82a.82.82 0 0 1 .35-1.26l.18-.1L9 16 .87 11.47v-.09c0-.36-.39-.74-.09-1.16l2.75-4.35v-.09c0-.42.82-.54 1.29-.36l8 4.62V.89c0-.59.18-.89.77-.89h5c.65 0 .91.3.91.89V10l7.94-4.53c.48-.29.72-.21 1.08.27l2.32 4.35v.09c.66.48.45.89-.08 1.25L23 16l7.91 4.53v.09c-.04.18.53.54.41 1.07z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-color-interactive);box-shadow:0 0 0 .0625rem var(--ec-color-interactive);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 .ec-icon{filter:grayscale(100%);opacity:.65}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:.0625rem;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-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.25;padding:.25rem .5rem;align-items:center;background-color:var(--ec-background-color);display:flex;cursor:pointer;border:0;width:100%}.add-new.is-selected,.add-new.is-highlighted{background-color:var(--ec-background-color-selected)}.add-new:focus{background-color:var(--ec-color-disabled-dark);position:relative;z-index:1;outline:none}.add-new:active{background-color:var(--ec-color-interactive);color:var(--ec-color-primary-light)}.add-new:disabled,.add-new.is-disabled{color:var(--ec-color-secondary-dark);opacity:.65;cursor:default}.add-new .label{align-items:center;display:flex;flex:auto}.add-new .ec-icon+.label{margin:0 .375rem}.add-new:hover:not(:active),.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:active .ec-icon{color:inherit}.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 ::ng-deep button .ec-icon{background-size:1em;background-position:center}.open:not(.is-always-open) .textbox-group ec-textbox ::ng-deep input{border-color:var(--ec-border-color);box-shadow:none}.open:not(.is-always-open) .textbox-group ec-button ::ng-deep button{background-color:var(--ec-background-color-hover);box-shadow:none}\n"] }]
|
787
|
+
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' && 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\"\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\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\" translate>Add new...</span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\" [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong></span>\r\n </span>\r\n <i class=\"ec-icon icon-add\"></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)\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptions.length}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-color-primary-dark);font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);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:transparent;background-color:#1a1a231f;background-clip:border-box;background-image:none;color:var(--ec-color-primary-dark);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-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}: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-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}.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{border-color:var(--ec-border-color);background-color:var(--ec-background-color);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgb(255, 228, 51)\" d=\"M31.32 21.69l-.09.18-2.48 4.35c-.36.54-.77.62-1.25.27-.12 0-.2 0-.2-.09L19.53 22v9.37a1.26 1.26 0 0 1-.72.67h-5.26c-.59 0-.83-.3-.83-.89 0-.12.15-.21.15-.27V22l-8 4.71h-.12c-.42.66-.8.21-1.16-.27L1 21.82a.82.82 0 0 1 .35-1.26l.18-.1L9 16 .87 11.47v-.09c0-.36-.39-.74-.09-1.16l2.75-4.35v-.09c0-.42.82-.54 1.29-.36l8 4.62V.89c0-.59.18-.89.77-.89h5c.65 0 .91.3.91.89V10l7.94-4.53c.48-.29.72-.21 1.08.27l2.32 4.35v.09c.66.48.45.89-.08 1.25L23 16l7.91 4.53v.09c-.04.18.53.54.41 1.07z\"/></svg>');background-repeat:no-repeat;background-position:.25rem center;background-size:1rem,1rem;padding-left:1.5rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-color-interactive);box-shadow:0 0 0 .0625rem var(--ec-color-interactive);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 .ec-icon{filter:grayscale(100%);opacity:.65}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:.0625rem;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-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.25;padding:.25rem .5rem;align-items:center;background-color:var(--ec-background-color);display:flex;cursor:pointer;border:0;width:100%}.add-new.is-selected,.add-new.is-highlighted{background-color:var(--ec-background-color-selected)}.add-new:focus{background-color:var(--ec-color-disabled-dark);position:relative;z-index:1;outline:none}.add-new:active{background-color:var(--ec-color-interactive);color:var(--ec-color-primary-light)}.add-new:disabled,.add-new.is-disabled{color:var(--ec-color-secondary-dark);opacity:.65;cursor:default}.add-new .label{align-items:center;display:flex;flex:auto}.add-new .ec-icon+.label{margin:0 .375rem}.add-new:hover:not(:active),.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:active .ec-icon{color:inherit}.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 ::ng-deep button .ec-icon{background-size:1em;background-position:center}.open:not(.is-always-open) .textbox-group ec-textbox ::ng-deep input{border-color:var(--ec-border-color);box-shadow:none}.open:not(.is-always-open) .textbox-group ec-button ::ng-deep button{background-color:var(--ec-background-color-hover);box-shadow:none}\n"] }]
|
788
788
|
}], ctorParameters: function () { return [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i3.TranslateService }, { type: i4.ScrollService }]; }, propDecorators: { onResize: [{
|
789
789
|
type: HostListener,
|
790
790
|
args: ['window:resize']
|
@@ -838,4 +838,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
838
838
|
type: ViewChild,
|
839
839
|
args: ['addNewButton']
|
840
840
|
}] } });
|
841
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFtRCxTQUFTLEVBQWMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzFLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUtqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQWUsTUFBTSx5REFBeUQsQ0FBQzs7Ozs7Ozs7Ozs7O0FBZ0IvRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQU1ILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBRXJEOzs7OztPQUtHO0lBQzRCLFFBQVE7UUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQXFNRCxZQUNXLHdCQUFrRCxFQUNsRCxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixhQUE0QjtRQUV0QyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFMdkMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsY0FBUyxH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WUFBWTtzQkFBM0IsS0FBSztnQkFRVSxTQUFTO3NCQUF4QixLQUFLO2dCQVFVLE9BQU87c0JBQXRCLEtBQUs7Z0JBUVUsWUFBWTtzQkFBM0IsS0FBSztnQkFVYSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBUU8sVUFBVTtzQkFBekIsS0FBSztnQkFNVSxZQUFZO3NCQUEzQixLQUFLO2dCQUtVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBTVUsV0FBVztzQkFBMUIsS0FBSztnQkFHVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBR1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQU1VLFVBQVU7c0JBQXpCLEtBQUs7Z0JBS1Usa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUtVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFHVSxhQUFhO3NCQUE1QixLQUFLO2dCQUthLGFBQWE7c0JBQTVCLEtBQUs7Z0JBU1EsV0FBVztzQkFBM0IsTUFBTTtnQkFNVSxNQUFNO3NCQUF0QixNQUFNO2dCQUdzQixPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLFNBQVM7Z0JBS3dCLEtBQUs7c0JBQWhELFNBQVM7dUJBQUMsdUJBQXVCO2dCQU1DLFlBQVk7c0JBQTlDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgVmFsaWRhdG9yRm4gfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gJy4uL2Zvcm0tY29udHJvbC1iYXNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cEhlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtLWdyb3VwLmhlbHBlcic7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51VGVtcGxhdGVUeXBlLCBNZW51SG9zdEVsZW1lbnRDbGFzc2VzIH0gZnJvbSAnLi4vbWVudS9tZW51LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlLCBQb3B1cFN0YXR1cyB9IGZyb20gJy4uLy4uL3NoYXJlZC9kaXJlY3RpdmVzL3BvcHVwL3BvcHVwLWNvbnRhaW5lci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogUG9zaXRpb24gb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIGlucHV0XHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDb21ib2JveE1lbnVQb3NpdGlvbiA9IFwidG9wX3JpZ2h0XCIgfCBcInRvcF9sZWZ0XCIgfCBcImJvdHRvbV9sZWZ0XCIgfCBcImJvdHRvbV9yaWdodFwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGUgdHlwZSBvZiBhZGQgbmV3IGltcGxlbWVudGF0aW9uLiBTdGF0aWMgZGlzcGxheXMgYSBzaW1wbGUgc3RhdGljIGJ1dHRvbiB3aGlsZSBkeW5hbWljIHVwZGF0ZXNcclxuICogdGhlIGxhYmVsIG9mIHRoZSBidXR0b24gd2l0aCB2YWx1ZSBvZiB0aGUgdGV4dGJveFxyXG4gKi9cclxudHlwZSBBZGROZXdUeXBlID0gXCJkeW5hbWljXCIgfCBcInN0YXRpY1wiIHwgYm9vbGVhbjtcclxuXHJcblxyXG4vKipcclxuICogU2VsZWN0IGJveCAoc2VsZWN0LCBhdXRvY29tcGxldGUsIGNvbWJvYm94KVxyXG4gKlxyXG4gKiBOT1RFOiBNaW4vbWF4IGxlbmd0aCB2YWxpZGF0aW9uIGlzIGltcGxlbWVudGVkIG9uIHRoZSBpbnRlcm5hbCBlYy10ZXh0Ym94LlxyXG4gKiBWYWx1ZXMgcGFzc2VkIGluIHZpYSBpbnB1dCBwcm9wZXJ0aWVzIChAc2VlIG1heGxlbmd0aCAsIEBzZWUgbWlubGVuZ3RoIClcclxuICogYXJlIHVzZWQgdG8gY3JlYXRlIHZhbGlkYXRvcnMgb24gdGhlIHRleHRib3guICBXaGVuIHRoZSB2YWxpZGF0aW9uIG9uIHRoZVxyXG4gKiB0ZXh0Ym94IGZhaWxzLCB0aGUgdmFsaWRhdGlvbiBlcnJvcihzKSBnZXQgcGFzc2VkIHVwIHRvIHRoZSB7QHNlZSBmb3JtTW9kZWwgfS5cclxuICogV2hlbiBzZXR0aW5nIHVwIHRoaXMgY29tcG9uZW50J3Mge0BzZWUgRm9ybUNvbnRyb2wgfSwgeW91IGRvIE5PVCBuZWVkIHRvIHNldCB0aGVcclxuICogVmFsaWRhdG9ycy5taW5MZW5ndGggb3IgVmFsaWRhdG9ycy5tYXhMZW5ndGggdmFsaWRhdG9ycy5cclxuICpcclxuICogUmVxdWlyZWQgaXMgYWxzbyBwYXNzZWQgdmlhIGlucHV0IHByb3BlcnR5LCBidXQgeW91IFNIT1VMRCBhbHNvIHNldCB1cCB0aGVcclxuICogVmFsaWRhdG9ycy5yZXF1aXJlZCB2YWxpZGF0b3Igb24gdGhpcyBjb21wb25lbnQncyBGb3JtQ29udHJvbC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdlYy1jb21ib2JveCcsXHJcblx0dGVtcGxhdGVVcmw6ICdjb21ib2JveC5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vY29tYm9ib3guY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsb3NlIHRoZSBwb3B1cCBtZW51IG9uIHJlc2l6ZSBzbyB0aGUgd2lkdGggYW5kIHBvc2l0aW9uaW5nIGNhbiBiZSByZWNhbGN1bGF0ZWRcclxuXHQgKiBjb3JyZWN0bHkuIENhbm5vdCBiZSBwbGFjZWQgb24gdGhlIHBvcHVwRGlyZWN0aXZlIGJlY2F1c2Ugb2YgYSBidWcgd2hlcmVcclxuXHQgKiBIb3N0TGlzdGVuZXJzIGZvciBnbG9iYWwgZXZlbnRzIGRvbid0IGZpcmVcclxuXHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0MTkxXHJcblx0ICovXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpIG9uUmVzaXplKCkge1xyXG5cdFx0aWYgKHRoaXMucG9wdXApIHRoaXMucG9wdXAuaGlkZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvdyB0aGUgYWRkIG5ldyBidXR0b24gaW4gdGhlIHBvcHVwXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFkZE5ldz86IEFkZE5ld1R5cGU7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBpbnB1dC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBUZXh0Ym94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG1heGxlbmd0aD86IG51bWJlcjtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHRoZSB0ZXh0IGJveFxyXG5cdCAqIEBkZWZhdWx0ICdib3R0b21fcmlnaHQnXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG1lbnVQb3NpdGlvbj86IENvbWJvYm94TWVudVBvc2l0aW9uID0gJ2JvdHRvbV9yaWdodCc7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBpbnB1dFxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIFRleHRib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWlubGVuZ3RoPzogbnVtYmVyO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogSXRlbXMgdG8gc2hvdyBpbiBjb21ib2JveCBtZW51XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwbGF5IHRlbXBsYXRlIGZvciBtZW51IGl0ZW1zXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGVUeXBlOiBNZW51VGVtcGxhdGVUeXBlID0gJ2xhYmVsJztcclxuXHJcblx0LyoqXHJcbiAgICAgKiBPcHRpb25hbCBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBtZW51IGl0ZW1zLiBNdXN0IGRlY2xhcmUgYSB0ZW1wbGF0ZSBcclxuXHQgKiBpbnB1dCB2YXJpYWJsZSBjYWxsZWQgXCJpdGVtXCIgbGlrZSBzbzogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU5hbWUgbGV0LWl0ZW0+LCBcclxuXHQgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcblx0ICogXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21NZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUG9zaXRpb24gdGhlIG1lbnUgYXMgZml4ZWQsIGlkZWFsIHdoZW4gY29tYm9ib3hlcyBhcmUgaW5zaWRlIGRpYWxvZ3NcclxuXHQgKiBEZWZhdWx0aW5nIHRvIHRydWUgc28gYWxsIG1lbnVzIHdpbGwgYmUgYXQgbGVhc3QgdGhlIHdpZHRoIG9mIHRoZVxyXG5cdCAqIHRleHRib3ggKyBidXR0b24sIGJ1dCBjYW4gZ3JvdyB3aWRlciBpZiB0aGUgaW5uZXIgZWxlbWVudHMgbmVlZCBpdFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBwb3B1cEZpeGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcyBmcm9tIHRoZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHRvdGFsUmVjb3Jkcz86IG51bWJlcjtcclxuXHJcblx0LyoqXHJcblx0ICogSWYgc2V0IHRvIHRydWUsIHdlIHdpbGwgdXBwZXJDYXNlIHRoZSB0ZXh0IGJveCBhbmQgYXBwbHkgdGhlIGNsYXNzIG9uIHRoZSBhZGQgYm94XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHVwcGVyQ2FzZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqVGhlIHBsYWNlaG9sZGVyIHRvIHNob3cgaW4gdGhlIGNvbWJvYm94LiBMZWF2ZSBlbXB0eSB0byB1c2UgZGVmYXVsdCBiZWhhdmlvciBkZXRlcm1pbmVkXHJcblx0ICogYnkgd2hldGhlciBBZGQgTmV3IGlzIGVuYWJsZWRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvKiogT2JzZXJ2YWJsZSB0byBzdWJzY3JpYmUgdG8gd2hlbiB0aGUgY29tYm9ib3ggbWVudSBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovXHJcblx0QElucHV0KCkgcHVibGljIGxvYWRPbk9wZW5PYnNlcnZhYmxlPzogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPiB8IHVuZGVmaW5lZDtcclxuXHJcblx0LyoqIERvIG5vdCBkaXNwbGF5IHRoZSB0b2dnbGUgYnV0dG9uIHdoZW4gdHJ1ZSAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBoaWRlVG9nZ2xlQnV0dG9uID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsd2F5cyBzaG93IHRoZSBtZW51IHdoZW4gdGhlIGZvcm1Nb2RlbCBoYXMgYSB2YWx1ZS4gU2V0c1xyXG5cdCAqIGhpZGVUb2dnbGVCdXR0b24gdG8gdHJ1ZSBhbmQgbWVudVN0YXR1cyB0byB2aXNpYmxlIGFzIHdlbGwuXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFsd2F5c09wZW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkaXRvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGVjLW1lbnUgZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtZW51RWxlbWVudENsYXNzZXM6IE1lbnVIb3N0RWxlbWVudENsYXNzZXMgfCBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIC50ZXh0Ym94LWdyb3VwIGVsZW1lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdGV4dGJveEVsZW1lbnRDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKiogSGlkZSAnTm8gbWF0Y2hlcycgbWVzc2FnZSB3aGVuIHRydWUgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgaGlkZU5vTWF0Y2hlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuICAgICAqIFRleHQgdG8gc2hvdyB3aGVuIHRoZSBtZW51IGlzIGVtcHR5LiBcIk5vIG1hdGNoZXNcIiBpcyB0aGUgZGVmYXVsdC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG5vTWF0Y2hlc1RleHQ6IHN0cmluZyA9ICdOb01hdGNoZXNfU0MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBOb3RpZnkgdGhlIHBhcmVudCB0aGF0IHRoZSBhZGQgbmV3IGJ1dHRvbiB3YXMgY2xpY2tlZFxyXG5cdCAqIEB0b2RvIGRpc2N1c3MgaWYgd2UgbmVlZCB0byBzZW5kIGFsb25nIHRoZSB2YWx1ZSBvciBzaG91bGRcclxuXHQgKiB0aGUgcGFyZW50IGdldCBpdCBmcm9tIHRoZSBmb3JtTW9kZWxcclxuXHQgKiAobHdmIDIwMTcuMDcuMTMpOiBJIHRoaW5rIHdlIG1pZ2h0IGFzIHdlbGwgc2VuZCB0aGUgdmFsdWUgYWxvbmcgYW5kXHJcblx0ICogbGVhdmUgaXQgdXAgdG8gdGhlIHBhcmVudCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdC5cclxuXHQgKi9cclxuXHRAT3V0cHV0KCkgcHVibGljIGFkZE5ld0NsaWNrOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogTm90aWZ5IHBhcmVudCB3aGVuIHRleHQgdHlwZWQgaW50byB0ZXh0Ym94XHJcblx0ICovXHJcblx0QE91dHB1dCgpIHB1YmxpYyBzZWFyY2g6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG5cclxuXHRAVmlld0NoaWxkKCd0ZXh0Ym94JykgcHVibGljIHRleHRib3ghOiBUZXh0Ym94Q29tcG9uZW50O1xyXG5cclxuXHQvKipcclxuXHQgKiBBY2Nlc3MgdG8gdGhlIG1lbnUncyBjb21wb25lbnQgdmlhIHRoZSAge0BsaW5rIFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlfVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoUG9wdXBDb250YWluZXJEaXJlY3RpdmUpIHByaXZhdGUgcG9wdXA/OiBQb3B1cENvbnRhaW5lckRpcmVjdGl2ZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0aGUgYWRkLW5ldyBidXR0b24gZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoJ2FkZE5ld0J1dHRvbicpIHByaXZhdGUgYWRkTmV3QnV0dG9uITogRWxlbWVudFJlZjtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAgICogRmlsdGVyZWQgSXRlbXMgdG8gc2hvdyBpbiBjb21ib2JveCBtZW51XHJcblx0ICAgKi9cclxuXHRwdWJsaWMgZmlsdGVyZWRPcHRpb25zOiBBcnJheTxNZW51SXRlbT4gPSBbXTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyBpZiB0aGUgbWVudSBpcyBvcGVuIG9yIGhpZGRlblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBtZW51U3RhdHVzOiBQb3B1cFN0YXR1cyA9ICdoaWRkZW4nO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUGxhY2Vob2xkZXIgdG8gYXNzaWduIHRvIHRleHRib3hcclxuXHQgKi9cclxuXHRwdWJsaWMgZWZmZWN0aXZlUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgbWVudSBpdGVtXHJcblx0ICovXHJcblx0cHVibGljIHNlbGVjdGVkSXRlbTogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcm1Db250cm9sIGZvciB0aGUgdGV4dGJveFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0ZXh0Ym94Rm9ybU1vZGVsOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnKTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyB3aGV0aGVyIHRoZSBhZGQgbmV3IGJ1dHRvbiBpcyBzZWxlY3RlZFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhZGROZXdTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVHJhY2tzIHdoZXRoZXIgdGhlIHRleHRib3hGb3JtTW9kZWwgdmFsdWUgbWF0Y2hlcyBhbiBpdGVtIGluIHRoZSBmaWx0ZXJlZE9wdGlvbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgZm91bmRNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogSW5kZXggb2YgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBvcHRpb25zXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZWxlY3RlZEl0ZW1JbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG5cdC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciAnQ2hvb3NlIG9yIEFkZC4uLicgKi9cclxuXHRwcml2YXRlIGNob29zZU9yQWRkUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3IgJ0Nob29zZScgKi9cclxuXHRwcml2YXRlIGNob29zZVBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblx0cHJpdmF0ZSBoYXNEYXRhQmVlbkxvYWRlZE9uT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByb3RlY3RlZCB2YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2U6IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSxcclxuXHRcdHByb3RlY3RlZCBmb3JtR3JvdXBIZWxwZXI6IEZvcm1Hcm91cEhlbHBlcixcclxuXHRcdHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZVxyXG5cdCkge1xyXG5cdFx0c3VwZXIodmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLCBmb3JtR3JvdXBIZWxwZXIpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmd1bGFyIG9uQ2hhbmdlcyBsaWZlY3ljbGUgZXZlbnRcclxuXHQgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3NcclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG5cdFx0c3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcblxyXG5cdFx0Ly8gd2hlbiBvcHRpb25zIGNoYW5nZXNcclxuXHRcdGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcclxuXHRcdFx0dGhpcy5yZXNldE9wdGlvbnMoKTtcclxuXHJcblx0XHRcdC8vIFVwZGF0ZSB0aGUgcG9wdXAgcG9zaXRpb25cclxuXHRcdFx0aWYgKHRoaXMucG9wdXApIHtcclxuXHRcdFx0XHR0aGlzLnBvcHVwLnVwZGF0ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdXBkYXRlIHZhbGlkYXRvcnMgb24gdGhlIHRleHRib3hcclxuXHRcdGlmIChjaGFuZ2VzLnJlcXVpcmVkIHx8IGNoYW5nZXMubWlubGVuZ3RoIHx8IGNoYW5nZXMubWF4bGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMuc2V0VGV4dGJveEZvcm1Nb2RlbFZhbGlkYXRvcnMoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVcGRhdGUgcGxhY2Vob2xkZXIgdGV4dCB3aGVuICdBZGQgTmV3JyBpcyBjb25kaXRpb25hbC5cclxuXHRcdC8vIG5nT25DaGFuZ2VzKCkga2lja3Mgb2ZmIGJlZm9yZSBuZ09uSW5pdCwgc28gaW4gb3JkZXJcclxuXHRcdC8vIHRvIG5vdCBvdmVyd3JpdGUgYSB1c2VyLXByb3ZpZGVkIHBsYWNlaG9sZGVyLCBkbyBub3RcclxuXHRcdC8vIHVwZGF0ZSBwbGFjZWhvbGRlciBvbiBmaXJzdCBjaGFuZ2UgKG5nT25Jbml0IHdpbGwgdGFrZSBjYXJlIG9mIGl0KS5cclxuXHRcdGlmICgoY2hhbmdlcy5hZGROZXcgJiYgIWNoYW5nZXMuYWRkTmV3LmlzRmlyc3RDaGFuZ2UoKSkgfHwgY2hhbmdlcy5wbGFjZWhvbGRlcikge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyVGV4dCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ3VsYXIgb25Jbml0IGxpZmVjeWNsZSBob29rXHJcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXHJcblx0ICovXHJcblx0cHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0c3VwZXIubmdPbkluaXQoKTtcclxuXHJcblx0XHRpZiAodGhpcy5hbHdheXNPcGVuKSB7XHJcblx0XHRcdHRoaXMuaGlkZVRvZ2dsZUJ1dHRvbiA9IHRydWU7XHJcblx0XHRcdHRoaXMubWVudVN0YXR1cyA9ICd2aXNpYmxlJztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBHZXQgdHJhbnNsYXRlZCBwbGFjZWhvbGRlciB0ZXh0XHJcblx0XHR0aGlzLmNob29zZU9yQWRkUGxhY2Vob2xkZXIgPSBgJHt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDaG9vc2Ugb3IgYWRkJyl9Li4uYDtcclxuXHRcdHRoaXMuY2hvb3NlUGxhY2Vob2xkZXIgPSBgJHt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDaG9vc2UnKX1gO1xyXG5cclxuXHRcdHRoaXMuZm9ybU1vZGVsQ2hhbmdlZCh0aGlzLmZvcm1Nb2RlbC52YWx1ZSk7XHJcblx0XHR0aGlzLnNldFRleHRib3hGb3JtTW9kZWxWYWxpZGF0b3JzKCk7XHJcblxyXG5cdFx0Ly8gRXJyb3JzIGZvciB0aGlzIGNvbXBvbmVudCBhcmUgZGlzcGxheWVkIHZpYSB0aGUgdmFsaWRhdGlvbkVycm9ycyBwcm9wZXJ0eSwgd2hpY2ggaXNcclxuXHRcdC8vIHBvcHVsYXRlZCB3aGVuIHRyYW5zbGF0ZVZhbGlkYXRpb25NZXNzYWdlcyBpcyBydW4uXHJcblx0XHQvLyBXaGVuIHRoZSBpbnRlcm5hbCBUZXh0Ym94Q29tcG9uZW50IGhhcyB2YWxpZGF0aW9uIGVycm9ycywgd2Ugc2V0IHRoZW0gb24gdGhlXHJcblx0XHQvLyBmb3JtTW9kZWwgYXMgd2VsbC4gIFRoaXMgdXBkYXRlcyB0aGUgdmFsaWRpdHkgb2Ygb3VyIENvbWJvYm94Q29tcG9uZW50IGNvbnRyb2wsXHJcblx0XHQvLyBidXQgZG9lcyBub3QgdHJpZ2dlciB0cmFuc2xhdGlvbi4gIFN1YnNjcmliZSB0byBzdGF0dXNDaGFuZ2VzIGhlcmUgc28gY29tcG9uZW50XHJcblx0XHQvLyB2YWxpZGF0aW9uIGVycm9ycyB3aWxsIGFwcGVhciBhbG9uZyB3aXRoIHRoZSBDb21ib2JveENvbXBvbmVudCdzIGxhYmVsLlxyXG5cdFx0dGhpcy5mb3JtTW9kZWwudmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHRcdHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuXHRcdCkuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5mb3JtTW9kZWxDaGFuZ2VkKGRhdGEpKTtcclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc3RhdHVzQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHR0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcblx0XHQpLnN1YnNjcmliZShkYXRhID0+IHRoaXMuc2V0Rm9ybU1vZGVsVmFsaWRhdGlvbkVycm9ycyhkYXRhKSk7XHJcblxyXG5cdFx0Ly8gZGVmYXVsdCBwbGFjZWhvbGRlclxyXG5cdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlclRleHQoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5ndWxhciBhZnRlclZpZXdJbml0IGxpZmVjeWNsZSBob29rXHJcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXHJcblx0ICovXHJcblx0cHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHRcdGlmICghdGhpcy5wb3B1cCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYWxsb3cgb3ZlcmZsb3cgb3V0IG9mIHRoZSBzY3JvbGxQYXJlbnRcclxuXHRcdC8vIHByZXZlbnRzIG1lbnUgZnJvbSBvYnNjdXJpbmcgdGhlIGNvbWJvYm94XHJcblx0XHRsZXQgcG9wcGVyT3B0aW9uczogUG9wcGVyLlBvcHBlck9wdGlvbnMgPSB7XHJcblx0XHRcdG1vZGlmaWVyczoge1xyXG5cdFx0XHRcdHByZXZlbnRPdmVyZmxvdzoge1xyXG5cdFx0XHRcdFx0Ym91bmRhcmllc0VsZW1lbnQ6ICd2aWV3cG9ydCdcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gY29udmVydCB0aGUgQ29tYm9ib3hNZW51UG9zaXRpb24gaW50byBhIFBvcHBlclBsYWNlbWVudFxyXG5cdFx0c3dpdGNoICh0aGlzLm1lbnVQb3NpdGlvbikge1xyXG5cdFx0XHRjYXNlIChcInRvcF9sZWZ0XCIpOlxyXG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ3RvcC1zdGFydCc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKFwidG9wX3JpZ2h0XCIpOlxyXG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ3RvcC1lbmQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcImJvdHRvbV9sZWZ0XCIpOlxyXG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ2JvdHRvbS1zdGFydCc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKFwiYm90dG9tX3JpZ2h0XCIpOlxyXG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ2JvdHRvbS1lbmQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZW51UG9zaXRpb24gZm9yIENvbWJvYm94Q29tcG9uZW50LmApXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2Nyb2xsIHRoZSBtZW51IHRvIHRoZSBzZWxlY3RlZCBpdGVtIG9uY2UgdGhlIHBvcHVwIG1lbnUgaXMgcmVhZHlcclxuXHRcdHBvcHBlck9wdGlvbnMub25DcmVhdGUgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSgpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMucG9wdXBGaXhlZCkge1xyXG5cdFx0XHRcdHRoaXMucG9wdXAhLmZpeFBvc2l0aW9uKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5wb3B1cEZpeGVkKSB7XHJcblx0XHRcdHBvcHBlck9wdGlvbnMub25VcGRhdGUgPSAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wb3B1cCEuZml4UG9zaXRpb24oKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucG9wdXAucG9wcGVyT3B0aW9ucyA9IHBvcHBlck9wdGlvbnM7XHJcblxyXG5cdFx0dGhpcy5wb3B1cC5wb3BwZXJTdGF0dXNDaGFuZ2UucGlwZShcclxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxyXG5cdFx0KS5zdWJzY3JpYmUoKGV2ZW50OiAndmlzaWJsZScgfCAnaGlkZGVuJykgPT4ge1xyXG5cdFx0XHRcdHRoaXMubWVudVN0YXR1cyA9IGV2ZW50O1xyXG5cclxuXHRcdFx0XHQvLyBTeW5jaHJvbml6ZSB0aGUgZm9ybU1vZGVsIGFuZCB0ZXh0Rm9ybU1vZGVsIHZhbHVlcyB3aGVuIHRoZVxyXG5cdFx0XHRcdC8vIHBvcHVwIG1lbnUgY2xvc2VzIGFuZCB1bi1maWx0ZXIgdGhlIG9wdGlvbnMgYW5kIHJlc2V0IHRoZVxyXG5cdFx0XHRcdC8vIHNlbGVjdGVkSXRlbSBhbmQgaW5kZXhcclxuXHRcdFx0XHRpZiAoZXZlbnQgPT09ICdoaWRkZW4nKSB7XHJcblx0XHRcdFx0XHR0aGlzLnN5bmNNb2RlbFZhbHVlcygpO1xyXG5cdFx0XHRcdFx0dGhpcy5yZXNldE9wdGlvbnMoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCBlcnJvcnMgb24gdGhlIHRleHRib3hGb3JtTW9kZWwsIHdoaWNoIHdpbGwgdGhlbiBzZXQgZXJyb3JzIG9uIHRoZVxyXG5cdCAqIGZvcm1Nb2RlbC4gQWxzbyBtYXJrIHRoZSBmb3JtTW9kZWwgYXMgdG91Y2hlZCB0byBkaXNwbGF5IGFueSBlcnJvcnMuXHJcblx0ICogQHBhcmFtIGVycm9ycyBrZXkocykgb2YgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIGVycm9ycyB0byBkaXNwbGF5IG9yIHJlbW92ZVxyXG5cdCAqIEBtZW1iZXJvZiBDb21vYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgc2V0RXJyb3JzKGVycm9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0pOiB2b2lkIHtcclxuXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRFcnJvcnMoZXJyb3JzKTtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBVbmZpbHRlciBvcHRpb25zIGFuZCB1cGRhdGUgdGhlIHNlbGVjdGVkSXRlbSBhbmQgc2VsZWN0ZWRJdGVtSW5kZXhcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgcmVzZXRPcHRpb25zKG9wdGlvbnM/OiBNZW51SXRlbVtdKTogdm9pZCB7XHJcblx0XHR0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5vcHRpb25zO1xyXG5cclxuXHRcdC8vaWYgdGhleSBoYXZlIG5vIHNlYXJjaCB0ZXJtLCBkb24ndCB0cnkgdG8gc2VsZWN0IGFueXRoaW5nIHNvIHRoZXkgY2FuIGNsZWFyIHRoZSBib3ggb3V0IGJ5IGhpdHRpbmcgZW50ZXJcclxuXHRcdC8vaWYgdGhleSBoYXZlIGEgc2VhcmNoIHRlcm0gYW5kIHRoZSBvcHRpb25zIGNoYW5nZWQsIHNlbGVjdCBhbiBvcHRpb24gZnJvbSB0aGUgbWVudSBzbyB0aGV5IHdpbGwgZ2V0IGl0IGF1dG9tYXRpY2FsbHkgaWYgdGhleSBoaXQgZW50ZXJcclxuXHRcdGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgIT09ICcnKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSB0aGlzLmZpbmREZWZhdWx0U2VsZWN0aW9uSW5kZXgodGhpcy5maWx0ZXJlZE9wdGlvbnMsIHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSk7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0gfHwgbnVsbDtcclxuXHRcdFx0dGhpcy5zY3JvbGxNZW51KHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly9pZiB0aGV5IGhhdmUgbm8gc2VhcmNoIHRlcm0gYW5kIHRoZSBvcHRpb25zIGFyZSByZXNldCwgZG9uJ3QgYXV0by1waWNrIHRoZSBmaXJzdCBvbmVcclxuXHRcdFx0Ly9zbyB0aGF0IGVudGVyIHdpbGwgYWxsb3cgdGhlbSB0byB3aXBlIG91dCB0aGVpciBsYXN0IHNlbGVjdGlvblxyXG5cdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaXN0ZW4gdG8gdGhlIHNlbGVjdGVkIGNoYW5nZWQgZXZlbnQgZnJvbSB7QGxpbmsgTWVudUNvbXBvbmVudH0gYW5kIHVwZGF0ZSB0aGUgZm9ybVxyXG5cdCAqIG1vZGVsIGFuZCBjbG9zZSBtZW51XHJcblx0ICovXHJcblx0cHVibGljIHNlbGVjdGVkQ2hhbmdlZChpdGVtOiBNZW51SXRlbSk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZXRGb3JtTW9kZWxWYWx1ZShpdGVtKTtcclxuXHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3cgYW5kIGhpZGUgdGhlIHBvcHVwIG1lbnVcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b2dnbGVNZW51KGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcclxuXHRcdGlmICghdGhpcy5wb3B1cCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGV2ZW50KSB7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0Ly8gV2hlbiB0aGUgcG9wdXAgaXMgaGlkZGVuIGl0IHdpbGwgZW1pdCBpdHMgY2hhbmdlZCBzdGF0dXMgYW5kXHJcblx0XHRcdFx0Ly8gd2Ugd2lsbCByZXNldCB2YWx1ZXMgaWYgbmVlZCBiZS5cclxuXHRcdFx0XHR0aGlzLnBvcHVwLmhpZGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRpZiAodGhpcy5sb2FkT25PcGVuT2JzZXJ2YWJsZSAmJiAhdGhpcy5oYXNEYXRhQmVlbkxvYWRlZE9uT3Blbikge1xyXG5cdFx0XHRcdFx0dGhpcy5wZW5kaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLmxvYWRPbk9wZW5PYnNlcnZhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChyZXN1bHQ6IE1lbnVJdGVtW10pID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5oYXNEYXRhQmVlbkxvYWRlZE9uT3BlbiA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLnBlbmRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0dGhpcy5vcHRpb25zID0gcmVzdWx0O1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5yZXNldE9wdGlvbnMoKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5wb3B1cCEuc2hvdygpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMucG9wdXAuc2hvdygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIG9uQmx1cigpOiB2b2lkIHtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBDb250cm9sIHRoZSBtZW51IHdpdGgga2V5Ym9hcmQgbmF2aWdhdGlvblxyXG5cdCAqXHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQva2V5I0V4YW1wbGUgfCBLZXlib2FyZEV2ZW50LmtleX1cclxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkvS2V5X1ZhbHVlcyB8IEtleSBWYWx1ZXN9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMga2V5TmF2aWdhdGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuXHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdGNhc2UgXCJBcnJvd0Rvd25cIjpcclxuXHRcdFx0Y2FzZSBcIkRvd25cIjpcclxuXHRcdFx0Y2FzZSBcIkFycm93VXBcIjpcclxuXHRcdFx0Y2FzZSBcIlVwXCI6XHJcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHR0aGlzLm9uQXJyb3dEb3duVXAoZXZlbnQpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkJhY2tzcGFjZVwiOlxyXG5cdFx0XHRjYXNlIFwiRGVsZXRlXCI6XHJcblx0XHRcdGNhc2UgXCJEZWxcIjpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJykge1xyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIFwiVGFiXCI6XHJcblx0XHRcdFx0Ly8gSWYgdGFiYmluZyBmcm9tIHRoZSB0ZXh0Ym94IHRvIHRoZSBidXR0b24sIG92ZXJyaWRlIHRoZSB0ZXh0Ym94IGFzIGJlaW5nXHJcblx0XHRcdFx0Ly8gbWFya2VkIHRvdWNoZWQgc28gd2UgZG9uJ3Qgc2VlIHRoZSBpbnZhbGlkIHN0YXRlLiBPbmx5IHNob3cgdGhlIGludmFsaWQgc3RhdGVcclxuXHRcdFx0XHQvLyB3aGVuIHRhYmJpbmcgb3V0IG9mIGNvbWJvYm94IGZyb20gdGhlIGJ1dHRvbiBvciBiYWNrIHRhYmJpbmcgZnJvbSB0aGUgdGV4dGJveFxyXG5cdFx0XHRcdC8vIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmIGV2ZW50LnNyY0VsZW1lbnQgJiYgZXZlbnQuc3JjRWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnKSB7XHJcblx0XHRcdFx0Ly8gXHRpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuXHRcdFx0XHQvLyBcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdFx0XHRcdC8vIFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLm1hcmtBc1VudG91Y2hlZCgpO1xyXG5cdFx0XHRcdC8vIFx0fVxyXG5cdFx0XHRcdC8vIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiBldmVudC5zcmNFbGVtZW50ICYmIGV2ZW50LnNyY0VsZW1lbnQudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHtcclxuXHRcdFx0XHQvLyBcdGlmICghZXZlbnQuc2hpZnRLZXkpIHtcclxuXHRcdFx0XHQvLyBcdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdFx0XHRcdC8vIFx0fVxyXG5cdFx0XHRcdC8vIH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0XHQvL2lmIHRoZSBzZWxlY3RlZCBvcHRpb24gaXMgdGhlIGFkZCBuZXcgYnV0dG9uIGxldCBpdCBmaXJlIGJ1dCBkb24ndCBhbGxvd1xyXG5cdFx0XHRcdFx0Ly90aGUgdGFiIGV2ZW50IHRvIGNhcnJ5IHRoZW0gZm9yd2FyZCBmcm9tIHdoZXJldmVyIHRoZXkgbGFuZCAtIHRoZXkgd291bGQgc2tpcCB0aGUgZmlyc3QgYm94IG9uIHRoZSBhZGQgbmV3IGZvcm1cclxuXHRcdFx0XHRcdC8vSW4gdGhlIG5vcm1hbCBjYXNlIHdlIHdhbnQgdG8gYWxsb3cgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb3IgdGhleSB3b24ndCBiZSBhYmxlIHRvIHRhYiBvdXQgb2YgdGhlIGNvbnRyb2wgYXQgYWxsLlxyXG5cdFx0XHRcdFx0aWYodGhpcy5hZGROZXdTZWxlY3RlZCl7XHJcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5jb21taXRTZWxlY3Rpb24oZXZlbnQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJFbnRlclwiOlxyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdFx0dGhpcy5jb21taXRTZWxlY3Rpb24oZXZlbnQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJFc2NhcGVcIjpcclxuXHRcdFx0Y2FzZSBcIkVzY1wiOlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdFx0Ly8gSnVzdCBjbG9zZSB0aGUgbWVudSwgZG8gbm90IGZvY3VzIHRoZSBuZXh0IGVsZW1lbnQgb24gdGFiXHJcblx0XHRcdFx0XHQvLyB1bmxlc3MgdGhlIG1lbnUgaXMgaGlkZGVuXHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRcdC8vIENsb3NlIHRoZSBtZW51IGJlZm9yZSB3ZSByZXNldCBzZWxlY3RlZEl0ZW0gc28gd2UgZG9uJ3Qgc2VlIHRoZSBoaWdobGlnaHQgY2hhbmdpbmdcclxuXHRcdFx0XHRcdC8vIHdoZW4gcmVzZXQgdGhlIHNlbGVjdGVkIGl0ZW0gYmFjayB0byB0aGUgZm9ybU1vZGVsXHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiIFwiOlxyXG5cdFx0XHRjYXNlIFwiU3BhY2ViYXJcIjpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJykge1xyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicgJiYgZXZlbnQua2V5ICE9PSAnU2hpZnQnKSB7XHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjaWxpdGF0ZXMgYWRkaW5nIGl0ZW1zIHRvIGEgY29tYm9ib3hcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBhZGRGbiBGdW5jdGlvbiBmcm9tIHBhcmVudCB0aGF0IHNob3VsZCBtYWtlIGFuIEFQSSByZXF1ZXN0IHRvIGFkZCBhIG5ldyBpdGVtIHRvIHRoZSBjb21ib2JveCdzIG9wdGlvbnNcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgYXN5bmMgYWRkTmV3SXRlbShhZGRGbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xyXG4gICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgYWRkRm4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gV2UgZ2F2ZSBpdCBvdXIgYmVzdCB0cnksIHNvbWV0aGluZyBpcyByZWFsbHkgd2hhY2ssIHNvIGxldCdzIGp1c3Qgc2V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICB0aGlzLnNldEVycm9ycyh7ICdhZGRuZXcnOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRvZ2dsZU1lbnUoKTtcclxuICAgIH1cclxuXHJcblx0LyoqXHJcblx0ICogRmlndXJlIG91dCB3aGV0aGVyIHRoZXkgYXJlIGFkZGluZyBuZXcgb3IgaGF2ZSBhbiBpdGVtIHNlbGVjdGVkLCBhbmQgY29tbWl0IGl0IHRvIHRoZSBmb3JtIG1vZGVsXHJcblx0ICovXHJcbiAgcHJpdmF0ZSBjb21taXRTZWxlY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHR0aGlzLm9uQWRkTmV3KGV2ZW50KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2V0Rm9ybU1vZGVsVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG5cdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHRleHRib3ggdG8gdGhlIHBhcmVudCB3aGVuIHRoZSBhZGQgbmV3IGJ1dHRvbiBpc1xyXG5cdCAqIGNsaWNrZWRcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBldmVudCBBZGQgbmV3IGJ1dHRvbiBjbGljayBvciBlbnRlciBrZXkgZXZlbnRcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgb25BZGROZXcoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdHRoaXMuYWRkTmV3Q2xpY2suZW1pdCh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRlIHRoZSBkcm9wZG93biBtZW51IHVzaW5nIHVwIGFuZCBkb3duIGFycm93IGtleXNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBldmVudCBVcCBvciBkb3duIGFycm93IGtleWRvd24gZXZlbnRcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIG9uQXJyb3dEb3duVXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuXHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdGNhc2UgXCJBcnJvd0Rvd25cIjpcclxuXHRcdFx0Y2FzZSBcIkRvd25cIjpcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT09IC0xICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbiAmJiAhdGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4IDwgdGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoIC0gMSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly9pZiB0aGUgbGFzdCBpdGVtIGlzIGEgaGVhZGluZyBhbmQgd2UgYXJlIG9uIHRoZSBzZWNvbmQgbGFzdCBpdGVtLCB3ZSBzaG91bGRuJ3QgaW5jcmVtZW50IHRoZSBzZWxlY3RlZEl0ZW1JbmRleCBiZWNhdXNlIHRoYXQgd291bGQgc2VsZWN0IHRoZSBoZWFkaW5nXHJcblx0XHRcdFx0XHRpZiggISh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09IHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDIgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCsxXS5kaXNwbGF5ID09PSAnaGVhZGluZycpICkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4Kys7XHJcblx0XHRcdFx0XHRcdC8vIFNraXAgYW55IGluLW1lbnUgaGVhZGluZyBpdGVtc1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA8IHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDEgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCsrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkFycm93VXBcIjpcclxuXHRcdFx0Y2FzZSBcIlVwXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT09IC0xICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbiAmJiB0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID4gLTEpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAwICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbikge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgtLTtcclxuXHRcdFx0XHRcdC8vIFNraXAgYW55IGluLW1lbnUgaGVhZGluZyBpdGVtc1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4XS5kaXNwbGF5ID09PSAnaGVhZGluZycpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleC0tO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly9pZiB0aGUgc2VsZWN0ZWRJdGVtSW5kZXggaXMgLTEsIHRoYXQgbWVhbnMgdGhlIHZlcnkgZmlyc3QgaXRlbSB3YXMgYSBoZWFkaW5nIGFuZCB3ZSBqdXN0IHNraXBwZWQgb3ZlciBpdC5cclxuXHRcdFx0XHRcdFx0aWYodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PSAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdC8vaWYgdGhlcmUgaXMgYW4gYWRkIG5ldyBidXR0b24gd2Ugc2hvdWxkIHNlbGVjdCBpdC4gb3RoZXJ3aXNlIHdlIHNob3VsZCBsb2NrIHRoZW0gYXQgaW5kZXggMSAocmlnaHQgYmVmb3JlIHRoZSBoZWFkaW5nKVxyXG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbikge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSAxO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG4gICAgICAgICAgXHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF07XHJcblxyXG5cdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0Rm9ybU1vZGVsVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zY3JvbGxNZW51KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblxyXG5cdC8qKlxyXG5cclxuXHQgKiBGaWx0ZXIgYXJyYXkgb2Ygb3B0aW9ucyBieSBsYWJlbCAoY29udGFpbnMpXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZmlsdGVyVGV4dCBUaGUgdmFsdWUgb2YgdGV4dGJveCB0aGF0IHdlIHdpbGwgZmlsdGVyIG91ciBvcHRpb25zIGJ5XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbHRlck9wdGlvbnNBcnJheShmaWx0ZXJUZXh0OiBzdHJpbmcpOiBBcnJheTxNZW51SXRlbT4ge1xyXG5cdFx0bGV0IHNlYXJjaFRleHQgPSBmaWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRpZiAoZmlsdGVyVGV4dCAmJiBmaWx0ZXJUZXh0ICE9PSAnJykge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcihpdGVtID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPj0gMDtcclxuXHRcdFx0fSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnM7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRmluZCBhIGdpdmVuIGl0ZW0ncyBpbmRleCBpbiB0aGUgZmlsdGVyZWQgaXRlbXMgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZFxyXG5cdCAqIEBwYXJhbSBpdGVtIFRoZSBtYXRjaGluZyBpdGVtIHRvIGZpbmQgaW4gdGhlXHJcblx0ICogZmlsdGVyZE9wdGlvbnMgYXJyYXkuIFdpbGwgdXNlIHRoZSBzZWxlY3RlZEl0ZW0gaWYgbm90aGluZyBpcyBwYXNzZWQuXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kU2VsZWN0ZWRJdGVtSW5kZXgoaXRlbT86IE1lbnVJdGVtKTogbnVtYmVyIHtcclxuXHRcdGxldCBpdGVtVG9GaW5kID0gaXRlbSA/IGl0ZW0gOiB0aGlzLnNlbGVjdGVkSXRlbTtcclxuXHJcblx0XHRpZiAoaXRlbVRvRmluZCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMuZmluZEluZGV4KGl0ZW0gPT4ge1xyXG5cdFx0XHRcdGlmKGl0ZW0uaWQgJiYgKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW0ubGFiZWwgPT09ICg8TWVudUl0ZW0+aXRlbVRvRmluZCkubGFiZWwgJiYgaXRlbS5pZCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZFxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAtMTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFjdCB0byBvdXIgZm9ybU1vZGVsIGNoYW5naW5nXHJcblx0ICpcclxuXHQgKiBUaGUgZm9ybU1vZGVsIHJlcHJlc2VudHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBNb2RlbEl0ZW1cclxuXHQgKiBXaGVuIGNoYW5nZWQsIHNldCB0aGUgdmFsdWUgb2YgdGhlIFRleHRib3hDb21wb25lbnQgYW5kXHJcblx0ICogZmluZCBpbmRleCBvZiBpdGVtIGluIG9wdGlvbnMgbGlzdC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZm9ybU1vZGVsQ2hhbmdlZChkYXRhPzogTWVudUl0ZW0pOiB2b2lkIHtcclxuXHRcdHRoaXMuc3luY2hyb25pemVEaXNhYmxlZEF0dHJpYnV0ZXMoKTtcclxuXHJcblx0XHRpZiAoZGF0YSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoZGF0YS5sYWJlbCk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gdGhpcy5maW5kU2VsZWN0ZWRJdGVtSW5kZXgoZGF0YSk7XHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID49IDApIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvL1RoZSBob3N0IHdpcGVkIG91dCB0aGUgZGF0YSBleHRlcm5hbGx5LCBjbGVhciB0aGUgdGV4dGJveCBhbmQgdGhlIHRyYWNraW5nIHN0YXRlXHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5yZXNldCgpO1xyXG5cdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2Nyb2xsIHRoZSBtZW51IGlmIHRoZSBjdXJyZW50IHNlbGVjdGVkSXRlbUluZGV4IGlzIG91dCBvZiB2aWV3XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNjcm9sbE1lbnUoa25vd25JbmRleD86IG51bWJlcik6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW1JbmRleCBpbiBjYXNlIG91ciBvcHRpb25zIGNoYW5nZWRcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGtub3duSW5kZXggPT09IHVuZGVmaW5lZCA/IHRoaXMuZmluZFNlbGVjdGVkSXRlbUluZGV4KCkgOiBrbm93bkluZGV4O1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLnNlbGVjdGVkSXRlbSkge1xyXG5cdFx0XHRcdC8vIFRoZSBtZW51IGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgaWRzIGZvciB0aGUgbWVudSBpdGVtcyBpZiB0aGV5IGRvbnQgaGF2ZSB0aGVtLFxyXG5cdFx0XHRcdC8vIHNvIHRoZXkgbmVlZCB0byBiZSBhY2NvdW50ZWQgZm9yIGhlcmUgc2luY2UgdGhlIGNvbWJvYm94IGRvZXNuJ3Qga25vdyBhYm91dCB0aG9zZSBpZHNcclxuXHRcdFx0XHRsZXQgaXRlbVNlbGVjdG9yID0gdGhpcy5zZWxlY3RlZEl0ZW0uaWQgPyBgIyR7dGhpcy5zZWxlY3RlZEl0ZW0uaWR9YCA6IGAjJHt0aGlzLmlkfV9tZW51X2l0ZW0ke3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXh9YDtcclxuXHJcblx0XHRcdFx0Ly90cmlnZ2VyIHRoZSBzY3JvbGxpbmcgYWZ0ZXIgYSB0aWNrIHRvIGFsbG93IHRoZSBtZW51IHRvIGJlIHVwIHRvIGRhdGUgKGFuZCBwZW5kaW5nIG1hc2sgY2xlYXJlZCkgYmVmb3JlIG1lYXN1cmluZ1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoKCk9PntcclxuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxJdGVtQ2VudGVyZWQoYCMke3RoaXMuaWR9X21lbnVfbGlzdGAsIGl0ZW1TZWxlY3Rvcik7XHJcblx0XHRcdFx0fSwgMCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoL0ZpbHRlciBiYXNlZCBvbiB0ZXh0Ym94IGlucHV0XHJcblx0ICogTk9URTogc28gYXMgbm90IHRvIHJlY2VpdmUgYSBub3RpZmljYXRpb24gb24gZXZlcnkga2V5IGV2ZW50LCB3ZSBzdWdnZXN0IHlvdSBkZWJvdW5jZSB5b3VyXHJcblx0ICogc3Vic2NyaXB0aW9uXHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cDovL3JlYWN0aXZleC5pby9yeGpzL2NsYXNzL2VzNi9PYnNlcnZhYmxlLmpzfk9ic2VydmFibGUuaHRtbCNpbnN0YW5jZS1tZXRob2QtZGVib3VuY2VUaW1lIHwgT2JzZXJ2YWJsZS5kZWJvdW5jZVRpbWV9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNlYXJjaEFuZEZpbHRlcihzZWFyY2hUZXh0Pzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG5cdFx0Ly8gYWx3YXlzIGVtaXRcclxuXHRcdHRoaXMuc2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XHJcblxyXG5cdFx0Ly8gZG8gaW50ZXJuYWwgZmlsdGVyaW5nIGlmIG5vIG9uZSdzIHN1YnNjcmliZWQgdG8gb3VyIHNlYXJjaCBlbWl0dGVyXHJcblx0XHRpZiAodGhpcy5zZWFyY2gub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCAmJiBzZWFyY2hUZXh0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dGhpcy5yZXNldE9wdGlvbnModGhpcy5maWx0ZXJPcHRpb25zQXJyYXkoc2VhcmNoVGV4dCkpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQgJiYgIXRoaXMuYWRkTmV3QnV0dG9uKSB7XHJcblx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHtAbGluayBmb3JtTW9kZWwgfSdzIHZhbGlkYXRpb24gZXJyb3JzIGVxdWFsIHRvIHRoZSBpbnRlcm5hbCB0ZXh0Ym94J3MuXHJcblx0ICpcclxuXHQgKiBXaGVuIHRoZSBpbnRlcm5hbCB0ZXh0Ym94IGlzIGludmFsaWQsIG5lZWQgdG8gc2V0IHRoaXMgY29udHJvbCdzXHJcblx0ICogZXJyb3JzIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIG91ciBvd24gbGFiZWwsIG5vdCBUZXh0Ym94Q29udHJvbCdzLlxyXG5cdCAqIFdlIHVzZSBvdXIgb3duIGxhYmVsIHNvIGxhYmVsIHRleHQgd2lsbCB3cmFwIGF0IHRoZSBlbmQgb2YgdGhlIGJ1dHRvbixcclxuXHQgKiBub3QgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dGJveC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0Rm9ybU1vZGVsVmFsaWRhdGlvbkVycm9ycyhkYXRhPzogYW55KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmludmFsaWQpIHtcclxuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKG51bGwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIHRoZSBmb3JtIG1vZGVsIHZhbHVlIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0gb3IgcmVzZXQgZm9ybSBtb2RlbCB2YWx1ZSBpZiBpdGVtIGlzIG51bGxcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0Rm9ybU1vZGVsVmFsdWUoaXRlbTogTWVudUl0ZW0gfCBudWxsKTogdm9pZCB7XHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoaXRlbSA/IGl0ZW0ubGFiZWwgOiAnJyk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5zZXRWYWx1ZShpdGVtKTtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc0RpcnR5KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHZhbGlkYXRvcnMgb24gdGhlIHtAc2VlIHRleHRib3hGb3JtTW9kZWwgfVxyXG5cdCAqXHJcblx0ICogVmFsaWRhdG9ycyBhcmUgY3VycmVudGx5IHNldCBiYXNlZCBvbiB0aGUge0BzZWUgbWF4bGVuZ3RoIH0sXHJcblx0ICoge0BzZWUgbWlubGVuZ3RoIH0sIGFuZCB7QHNlZSByZXF1aXJlZCB9IGlucHV0cy4gIFRoaXMgd29ya3Mgd2VsbFxyXG5cdCAqIHdpdGgge0BzZWUgVGV4dGJveENvbXBvbmVudCB9LCB3aGljaCBuZWVkcyB0aGVzZSBpbnB1dHMgdG8gYXBwbHlcclxuXHQgKiB0aGUgcHJvcGVyIGF0dHJpYnV0ZXMgdG8gaXRzIGlucHV0cy5cclxuXHQgKlxyXG5cdCAqIEEgZnV0dXJlIHJlbGVhc2Ugb2YgQW5ndWxhciB3aWxsIHN1cHBvc2VkbHkgYWRkIHRoZXNlIGF0dHJpYnV0ZXNcclxuXHQgKiBmb3IgeW91LCB3aGljaCB3aWxsIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgVGV4dGJveENvbXBvbmVudCB0byBoYXZlXHJcblx0ICogc3VjaCBpbnB1dHMuICBUaGlzIGNvbXBvbmVudCwgaG93ZXZlciwgd2lsbCBzdGlsbCBuZWVkIHRoZXNlIGlucHV0c1xyXG5cdCAqIGFzIHRoZXJlIGlzIG5vIGN1cnJlbnQgd2F5IHRvIGtub3cgd2hpY2ggdmFsaWRhdG9ycyBhcmUgYXBwbGllZCB0byBpdFxyXG5cdCAqIGZyb20gaXRzIHBhcmVudCBWaWV3IENvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuXHRcdGxldCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcclxuXHJcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMubWlubGVuZ3RoKSB7XHJcblx0XHRcdHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm1pbmxlbmd0aCkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLm1heGxlbmd0aCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5tYXhsZW5ndGgpKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEtlZXAgdGV4dGJveCdzIGRpc2FibGVkIHN0YXR1cyBpbi1zeW5jIHdpdGggY29tYm9ib3gnc1xyXG5cdCAqXHJcblx0ICoge0BsaW5rIFRleHRib3hDb21wb25lbnR9IGdldHMgaXRzIGRpc2FibGVkIHN0YXR1cyBmcm9tIGl0cyB7QGxpbmsgRm9ybUNvbnRyb2x9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHN5bmNocm9uaXplRGlzYWJsZWRBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkICE9PSB0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGUoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuZW5hYmxlKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGUgZm9ybU1vZGVsIHZhbHVlIGFuZCB0ZXh0Ym94IHZhbHVlIGRvIG5vdCBtYXRjaCwgcmVzZXQgdGhlIHRleHRib3ggYW5kIHNlbGVjdGVkSXRlbSB0b1xyXG5cdCAqIHRoZSBmb3JtTW9kbGUgdmFsdWUuIElmIHRoZXJlIGlzIG5vIGZvcm1Nb2RlbCB2YWx1ZSwgbWFrZSBzdXJlIHdlIGNsZWFyIHRoZSB0ZXh0Ym94LiBSZXNldCB0aGVcclxuXHQgKiBmaWx0ZXJlZE9wdGlvbnMgdG8gdGhlIGZ1bGwgbGlzdCBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW1JbmRleFxyXG5cdCAqXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzeW5jTW9kZWxWYWx1ZXMoKTogdm9pZCB7XHJcblx0XHQvLyBJZiB0aGVyZSBpcyBhIGZvcm1Nb2RlbCB2YWx1ZSwgcmVzZXQgdGhlIHNlbGVjdGVkIGl0ZW0uIElmIHRoZXJlIGlzbid0LCBtYWtlXHJcblx0XHQvLyBzdXJlIHdlIGNsZWFyIHRoZSB0ZXh0Ym94XHJcblx0XHRpZiAodGhpcy5mb3JtTW9kZWwudmFsdWUgJiYgdGhpcy5mb3JtTW9kZWwudmFsdWUubGFiZWwgIT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUodGhpcy5mb3JtTW9kZWwudmFsdWUubGFiZWwpO1xyXG5cdFx0fSBlbHNlIGlmICghdGhpcy5mb3JtTW9kZWwudmFsdWUpIHtcclxuXHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKCcnKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2ggYW5kIGZpbHRlciB0aGUgb3B0aW9ucyBsaXN0IHdoZW4gdGhlIHZhbHVlIG9mIHRoZSB0ZXh0Ym94IGlucHV0IGNoYW5nZXMuIElmIGFkZE5ldyBpc1xyXG5cdCAqIHNldCBhbHNvIGNoZWNrIGZvciBtYXRjaGVzIGluIG91ciBmaWx0ZXJlZE9wdGlvbnMgdG8gY29uZGl0aW9uYWxseSBzaG93IGFuZCBoaWRlIHRoZSBhZGQgbmV3XHJcblx0ICogYnV0dG9uXHJcblx0ICpcclxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9pbnB1dFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0ZXh0Ym94VmFsdWVDaGFuZ2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZWFyY2hBbmRGaWx0ZXIodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlID09PSAnJykge1xyXG5cdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuYWRkTmV3KSB7XHJcblx0XHRcdGxldCBtYXRjaCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xyXG5cdFx0XHRcdHJldHVybiBvcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmZvdW5kTWF0Y2ggPSBtYXRjaCA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVcGRhdGUgdGhlIHBvcHVwIG1lbnUgcG9zaXRpb24gd2hlbiBpbnB1dCB2YWx1ZSBjaGFuZ2VzXHJcblx0XHRpZiAodGhpcy5wb3B1cCkge1xyXG5cdFx0XHR0aGlzLnBvcHVwLnVwZGF0ZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjbGVhclNlbGVjdGVkSXRlbSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSAtMTtcclxuXHR9XHJcblxyXG5cdC8qKlJlY29tcHV0ZSB3aGF0IHRoZSBwbGFjZWhvbGRlciBzaG91bGQgYmUgYmFzZWQgb24gd2hldGhlciB0aGUgdXNlciBwcm92aWRlZCBvbmUgYW5kIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhZGROZXcgaW5wdXQgKi9cclxuXHRwcml2YXRlIHVwZGF0ZVBsYWNlaG9sZGVyVGV4dCgpe1xyXG5cdFx0aWYgKHRoaXMucGxhY2Vob2xkZXIpIHtcclxuXHRcdFx0dGhpcy5lZmZlY3RpdmVQbGFjZWhvbGRlciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5wbGFjZWhvbGRlcik7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMuYWRkTmV3KSB7XHJcblx0XHRcdHRoaXMuZWZmZWN0aXZlUGxhY2Vob2xkZXIgPSB0aGlzLmNob29zZU9yQWRkUGxhY2Vob2xkZXI7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy5jaG9vc2VQbGFjZWhvbGRlcjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKkZpbmQgdGhlIG9wdGlvbiB3ZSB3YW50IHRvIGJlIHRoZSBkZWZhdWx0IHNlbGVjdGlvbi4gSWYgdGhlcmUgaXMgYW4gZXhhY3QgbWF0Y2gsIHVzZSB0aGF0XHJcblx0ICogb3RoZXJ3aXNlIGlmIHRoZXJlIGFyZSBpdGVtcywgcmV0dXJuIHplcm8gdG8gaW5kaWNhdGUgdGhlIGZpcnN0IGl0ZW0uIE90aGVyd2lzZSByZXR1cm4gLTFcclxuXHQgKiB0byBpbmRpY2F0ZSBubyBzZWxlY3Rpb25cclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmREZWZhdWx0U2VsZWN0aW9uSW5kZXgob3B0aW9uczogTWVudUl0ZW1bXSwgc2VhcmNoVGV4dDogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRcdGxldCBpbmRleCA9IC0xO1xyXG5cclxuXHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5sZW5ndGgpe1xyXG5cdFx0XHRpbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbj0+b3B0aW9uICE9IG51bGwgJiYgb3B0aW9uLmRpc3BsYXkgIT09ICdoZWFkaW5nJyk7XHJcblx0XHRcdFxyXG5cdFx0XHRpZihzZWFyY2hUZXh0KXtcclxuXHRcdFx0XHRzZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcclxuXHRcdFx0XHRsZXQgZXhhY3RNYXRjaEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uPT5vcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKSA9PSBzZWFyY2hUZXh0ICYmIG9wdGlvbi5kaXNwbGF5ICE9PSAnaGVhZGluZycpO1xyXG5cdFx0XHRcdGlmKGV4YWN0TWF0Y2hJbmRleCA+PTApe1xyXG5cdFx0XHRcdFx0aW5kZXggPSBleGFjdE1hdGNoSW5kZXg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gaW5kZXg7XHJcblx0fVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29udHJvbCBjb250cm9sLWxhYmVsLXt7bGFiZWxQb3NpdGlvbn19XCJcclxuICAgICBbbmdDbGFzc109XCJ7J29wZW4nOiBtZW51U3RhdHVzID09PSAndmlzaWJsZScsXHJcbiAgICAgICAgICAgICAgICAgJ2ludmFsaWQnOiBmb3JtTW9kZWwudG91Y2hlZCAmJiBmb3JtTW9kZWwuaW52YWxpZCxcclxuICAgICAgICAgICAgICAgICAnaGFzLWljb24nOiAodGVtcGxhdGVUeXBlID09PSAnaWNvbkFuZExhYmVsJyAmJiBmb3JtTW9kZWwudmFsdWUgJiYgZm9ybU1vZGVsLnZhbHVlLmljb24gJiYgZm9ybU1vZGVsLnZhbHVlLmxhYmVsID09PSB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAnaXMtcmVhZG9ubHknOiByZWFkb25seSxcclxuICAgICAgICAgICAgICAgICAnaXMtZGlzYWJsZWQnOiBmb3JtTW9kZWwuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAgJ2lzLWFsd2F5cy1vcGVuJzogYWx3YXlzT3Blbn1cIj5cclxuXHJcbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBuZ1ByZXNlcnZlV2hpdGVzcGFjZXM+XHJcbiAgICAgIDxzcGFuPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDAgJiYgZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWRcIj57e3ZhbGlkYXRpb25FcnJvcnN9fTwvc3Bhbj5cclxuICA8L2xhYmVsPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWx3YXlzT3BlbjsgZWxzZSBwb3B1cFRhcmdldFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHRib3gtZ3JvdXAgY29udHJvbC1pbnB1dFwiIFtuZ0NsYXNzXT1cInRleHRib3hFbGVtZW50Q2xhc3Nlc1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGV4dGJveFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwIHx8IHRleHRib3hGb3JtTW9kZWwudmFsdWVcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3dubWVudVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNwb3B1cFRhcmdldD5cclxuICA8ZGl2IGNsYXNzPVwidGV4dGJveC1ncm91cCBjb250cm9sLWlucHV0XCIgW25nQ2xhc3NdPVwidGV4dGJveEVsZW1lbnRDbGFzc2VzXCIgKmVjUG9wdXA9XCJkcm9wZG93bm1lbnVcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZXh0Ym94XCI+PC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3RleHRib3g+XHJcbiAgPGkgY2xhc3M9XCJlYy1pY29uIHt7Zm9ybU1vZGVsLnZhbHVlPy5pY29ufX1cIj48L2k+XHJcblxyXG4gICAgPGVjLXRleHRib3ggY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwLWlucHV0IG1iLTBcIlxyXG4gICAgICAgICAgICAgICAgI3RleHRib3hcclxuICAgICAgICAgICAgICAgIFtpZF09XCJpZFwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInRleHRib3hGb3JtTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhsZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtaW5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVmZmVjdGl2ZVBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJ0ZXh0Ym94VmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5TmF2aWdhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25CbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgW3VwcGVyQ2FzZV09XCJ1cHBlckNhc2VcIlxyXG4gICAgICAgICAgICAgICAgW3BlbmRpbmddPVwicGVuZGluZyAmJiBhbHdheXNPcGVuXCJcclxuICAgICAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiJ29mZidcIj48L2VjLXRleHRib3g+XHJcblxyXG4gICAgPGVjLWJ1dHRvbiBjbGFzcz1cInRleHRib3gtZ3JvdXAtYnRuLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaGlkZVRvZ2dsZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgIFtpZF09XCJpZCArICdfYnV0dG9uJ1wiXHJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtTW9kZWwuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICBpY29uPVwiaWNvbi1jYXJldC1kb3duXCJcclxuICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNZW51KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlOYXZpZ2F0ZSgkZXZlbnQpXCI+PC9lYy1idXR0b24+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3dubWVudT5cclxuICA8ZGl2IGNsYXNzPVwicG9wdXBcIlxyXG4gICAgICAgZWNPdmVybGF5XHJcbiAgICAgICBbc3RhdHVzXT1cInBlbmRpbmcgJiYgIWFsd2F5c09wZW4gPyAncGVuZGluZycgOiAnaGFzRGF0YSdcIj5cclxuXHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYWRkLW5ld1wiXHJcbiAgICAgICAgICAgIGlkPVwie3tpZH19X2FkZE5ld1wiXHJcbiAgICAgICAgICAgICNhZGROZXdCdXR0b25cclxuICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cImFkZE5ld1NlbGVjdGVkXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJhZGROZXdcIlxyXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZvdW5kTWF0Y2ggfHwgKGFkZE5ldyA9PT0gJ2R5bmFtaWMnICYmICghdGV4dGJveEZvcm1Nb2RlbC52YWx1ZSB8fCAoZm9ybU1vZGVsLnZhbHVlICYmIHRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09IGZvcm1Nb2RlbC52YWx1ZS5sYWJlbCkpKVwiXHJcblxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25BZGROZXcoJGV2ZW50KVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImFkZC1uZXctbGFiZWwgZWMtdXRpbC10cnVuY2F0ZVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYWRkTmV3ID09PSAnc3RhdGljJyB8fCBhZGROZXcgPT09IHRydWVcIiB0cmFuc2xhdGU+QWRkIG5ldy4uLjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImFkZE5ldyA9PT0gJ2R5bmFtaWMnXCI+e3snQWRkJyB8IHRyYW5zbGF0ZX19IDxzdHJvbmcgY2xhc3M9XCJlYy11dGlsLXRydW5jYXRlXCIgW25nQ2xhc3NdPVwieyd0ZXh0LXVwcGVyY2FzZSc6IHVwcGVyQ2FzZX1cIj57e3RleHRib3hGb3JtTW9kZWwudmFsdWV9fTwvc3Ryb25nPjwvc3Bhbj5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hZGRcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZWMtbWVudSBpZD1cInt7aWR9fV9tZW51XCJcclxuICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItdG9wLTBdPVwiIWZpbHRlcmVkT3B0aW9ucy5sZW5ndGggJiYgaGlkZU5vTWF0Y2hlc1wiXHJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51RWxlbWVudENsYXNzZXNcIlxyXG4gICAgICAgICAgICAgW3RlbXBsYXRlVHlwZV09XCJ0ZW1wbGF0ZVR5cGVcIlxyXG4gICAgICAgICAgICAgW2N1c3RvbU1lbnVUZW1wbGF0ZV09XCJjdXN0b21NZW51VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgW3Nob3dOb0l0ZW1zXT1cIiFoaWRlTm9NYXRjaGVzXCJcclxuICAgICAgICAgICAgIFtub0RhdGFUZXh0XT1cIm5vTWF0Y2hlc1RleHRcIlxyXG4gICAgICAgICAgICAgW2l0ZW1zXT1cImZpbHRlcmVkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRJdGVtXCJcclxuICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwic2VsZWN0ZWRDaGFuZ2VkKCRldmVudClcIj48L2VjLW1lbnU+XHJcblxyXG4gICAgPGZvb3RlciAqbmdJZj1cInRvdGFsUmVjb3JkcyAmJiB0b3RhbFJlY29yZHMgPiBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoICYmIGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgIDxzcGFuPnt7ZmlsdGVyZWRPcHRpb25zLmxlbmd0aH19IHt7J29mJyB8IHRyYW5zbGF0ZX19IHt7dG90YWxSZWNvcmRzfX08L3NwYW4+XHJcbiAgICA8L2Zvb3Rlcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
|
841
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFtRCxTQUFTLEVBQWMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzFLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUtqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQWUsTUFBTSx5REFBeUQsQ0FBQzs7Ozs7Ozs7Ozs7O0FBZ0IvRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQU1ILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBRXJEOzs7OztPQUtHO0lBQzRCLFFBQVE7UUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQXFNRCxZQUNXLHdCQUFrRCxFQUNsRCxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixhQUE0QjtRQUV0QyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFMdkMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsY0FBUyxH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WUFBWTtzQkFBM0IsS0FBSztnQkFRVSxTQUFTO3NCQUF4QixLQUFLO2dCQVFVLE9BQU87c0JBQXRCLEtBQUs7Z0JBUVUsWUFBWTtzQkFBM0IsS0FBSztnQkFVYSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBUU8sVUFBVTtzQkFBekIsS0FBSztnQkFNVSxZQUFZO3NCQUEzQixLQUFLO2dCQUtVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBTVUsV0FBVztzQkFBMUIsS0FBSztnQkFHVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBR1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQU1VLFVBQVU7c0JBQXpCLEtBQUs7Z0JBS1Usa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUtVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFHVSxhQUFhO3NCQUE1QixLQUFLO2dCQUthLGFBQWE7c0JBQTVCLEtBQUs7Z0JBU1EsV0FBVztzQkFBM0IsTUFBTTtnQkFNVSxNQUFNO3NCQUF0QixNQUFNO2dCQUdzQixPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLFNBQVM7Z0JBS3dCLEtBQUs7c0JBQWhELFNBQVM7dUJBQUMsdUJBQXVCO2dCQU1DLFlBQVk7c0JBQTlDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgVmFsaWRhdG9yRm4gfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gJy4uL2Zvcm0tY29udHJvbC1iYXNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cEhlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtLWdyb3VwLmhlbHBlcic7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51VGVtcGxhdGVUeXBlLCBNZW51SG9zdEVsZW1lbnRDbGFzc2VzIH0gZnJvbSAnLi4vbWVudS9tZW51LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlLCBQb3B1cFN0YXR1cyB9IGZyb20gJy4uLy4uL3NoYXJlZC9kaXJlY3RpdmVzL3BvcHVwL3BvcHVwLWNvbnRhaW5lci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogUG9zaXRpb24gb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIGlucHV0XHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDb21ib2JveE1lbnVQb3NpdGlvbiA9IFwidG9wX3JpZ2h0XCIgfCBcInRvcF9sZWZ0XCIgfCBcImJvdHRvbV9sZWZ0XCIgfCBcImJvdHRvbV9yaWdodFwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGUgdHlwZSBvZiBhZGQgbmV3IGltcGxlbWVudGF0aW9uLiBTdGF0aWMgZGlzcGxheXMgYSBzaW1wbGUgc3RhdGljIGJ1dHRvbiB3aGlsZSBkeW5hbWljIHVwZGF0ZXNcclxuICogdGhlIGxhYmVsIG9mIHRoZSBidXR0b24gd2l0aCB2YWx1ZSBvZiB0aGUgdGV4dGJveFxyXG4gKi9cclxudHlwZSBBZGROZXdUeXBlID0gXCJkeW5hbWljXCIgfCBcInN0YXRpY1wiIHwgYm9vbGVhbjtcclxuXHJcblxyXG4vKipcclxuICogU2VsZWN0IGJveCAoc2VsZWN0LCBhdXRvY29tcGxldGUsIGNvbWJvYm94KVxyXG4gKlxyXG4gKiBOT1RFOiBNaW4vbWF4IGxlbmd0aCB2YWxpZGF0aW9uIGlzIGltcGxlbWVudGVkIG9uIHRoZSBpbnRlcm5hbCBlYy10ZXh0Ym94LlxyXG4gKiBWYWx1ZXMgcGFzc2VkIGluIHZpYSBpbnB1dCBwcm9wZXJ0aWVzIChAc2VlIG1heGxlbmd0aCAsIEBzZWUgbWlubGVuZ3RoIClcclxuICogYXJlIHVzZWQgdG8gY3JlYXRlIHZhbGlkYXRvcnMgb24gdGhlIHRleHRib3guICBXaGVuIHRoZSB2YWxpZGF0aW9uIG9uIHRoZVxyXG4gKiB0ZXh0Ym94IGZhaWxzLCB0aGUgdmFsaWRhdGlvbiBlcnJvcihzKSBnZXQgcGFzc2VkIHVwIHRvIHRoZSB7QHNlZSBmb3JtTW9kZWwgfS5cclxuICogV2hlbiBzZXR0aW5nIHVwIHRoaXMgY29tcG9uZW50J3Mge0BzZWUgRm9ybUNvbnRyb2wgfSwgeW91IGRvIE5PVCBuZWVkIHRvIHNldCB0aGVcclxuICogVmFsaWRhdG9ycy5taW5MZW5ndGggb3IgVmFsaWRhdG9ycy5tYXhMZW5ndGggdmFsaWRhdG9ycy5cclxuICpcclxuICogUmVxdWlyZWQgaXMgYWxzbyBwYXNzZWQgdmlhIGlucHV0IHByb3BlcnR5LCBidXQgeW91IFNIT1VMRCBhbHNvIHNldCB1cCB0aGVcclxuICogVmFsaWRhdG9ycy5yZXF1aXJlZCB2YWxpZGF0b3Igb24gdGhpcyBjb21wb25lbnQncyBGb3JtQ29udHJvbC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdlYy1jb21ib2JveCcsXHJcblx0dGVtcGxhdGVVcmw6ICdjb21ib2JveC5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vY29tYm9ib3guY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsb3NlIHRoZSBwb3B1cCBtZW51IG9uIHJlc2l6ZSBzbyB0aGUgd2lkdGggYW5kIHBvc2l0aW9uaW5nIGNhbiBiZSByZWNhbGN1bGF0ZWRcclxuXHQgKiBjb3JyZWN0bHkuIENhbm5vdCBiZSBwbGFjZWQgb24gdGhlIHBvcHVwRGlyZWN0aXZlIGJlY2F1c2Ugb2YgYSBidWcgd2hlcmVcclxuXHQgKiBIb3N0TGlzdGVuZXJzIGZvciBnbG9iYWwgZXZlbnRzIGRvbid0IGZpcmVcclxuXHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0MTkxXHJcblx0ICovXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpIG9uUmVzaXplKCkge1xyXG5cdFx0aWYgKHRoaXMucG9wdXApIHRoaXMucG9wdXAuaGlkZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvdyB0aGUgYWRkIG5ldyBidXR0b24gaW4gdGhlIHBvcHVwXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFkZE5ldz86IEFkZE5ld1R5cGU7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBpbnB1dC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBUZXh0Ym94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG1heGxlbmd0aD86IG51bWJlcjtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHRoZSB0ZXh0IGJveFxyXG5cdCAqIEBkZWZhdWx0ICdib3R0b21fcmlnaHQnXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG1lbnVQb3NpdGlvbj86IENvbWJvYm94TWVudVBvc2l0aW9uID0gJ2JvdHRvbV9yaWdodCc7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBpbnB1dFxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIFRleHRib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWlubGVuZ3RoPzogbnVtYmVyO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogSXRlbXMgdG8gc2hvdyBpbiBjb21ib2JveCBtZW51XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwbGF5IHRlbXBsYXRlIGZvciBtZW51IGl0ZW1zXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGVUeXBlOiBNZW51VGVtcGxhdGVUeXBlID0gJ2xhYmVsJztcclxuXHJcblx0LyoqXHJcbiAgICAgKiBPcHRpb25hbCBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBtZW51IGl0ZW1zLiBNdXN0IGRlY2xhcmUgYSB0ZW1wbGF0ZSBcclxuXHQgKiBpbnB1dCB2YXJpYWJsZSBjYWxsZWQgXCJpdGVtXCIgbGlrZSBzbzogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU5hbWUgbGV0LWl0ZW0+LCBcclxuXHQgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcblx0ICogXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21NZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUG9zaXRpb24gdGhlIG1lbnUgYXMgZml4ZWQsIGlkZWFsIHdoZW4gY29tYm9ib3hlcyBhcmUgaW5zaWRlIGRpYWxvZ3NcclxuXHQgKiBEZWZhdWx0aW5nIHRvIHRydWUgc28gYWxsIG1lbnVzIHdpbGwgYmUgYXQgbGVhc3QgdGhlIHdpZHRoIG9mIHRoZVxyXG5cdCAqIHRleHRib3ggKyBidXR0b24sIGJ1dCBjYW4gZ3JvdyB3aWRlciBpZiB0aGUgaW5uZXIgZWxlbWVudHMgbmVlZCBpdFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBwb3B1cEZpeGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcyBmcm9tIHRoZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHRvdGFsUmVjb3Jkcz86IG51bWJlcjtcclxuXHJcblx0LyoqXHJcblx0ICogSWYgc2V0IHRvIHRydWUsIHdlIHdpbGwgdXBwZXJDYXNlIHRoZSB0ZXh0IGJveCBhbmQgYXBwbHkgdGhlIGNsYXNzIG9uIHRoZSBhZGQgYm94XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHVwcGVyQ2FzZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqVGhlIHBsYWNlaG9sZGVyIHRvIHNob3cgaW4gdGhlIGNvbWJvYm94LiBMZWF2ZSBlbXB0eSB0byB1c2UgZGVmYXVsdCBiZWhhdmlvciBkZXRlcm1pbmVkXHJcblx0ICogYnkgd2hldGhlciBBZGQgTmV3IGlzIGVuYWJsZWRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvKiogT2JzZXJ2YWJsZSB0byBzdWJzY3JpYmUgdG8gd2hlbiB0aGUgY29tYm9ib3ggbWVudSBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovXHJcblx0QElucHV0KCkgcHVibGljIGxvYWRPbk9wZW5PYnNlcnZhYmxlPzogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPiB8IHVuZGVmaW5lZDtcclxuXHJcblx0LyoqIERvIG5vdCBkaXNwbGF5IHRoZSB0b2dnbGUgYnV0dG9uIHdoZW4gdHJ1ZSAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBoaWRlVG9nZ2xlQnV0dG9uID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsd2F5cyBzaG93IHRoZSBtZW51IHdoZW4gdGhlIGZvcm1Nb2RlbCBoYXMgYSB2YWx1ZS4gU2V0c1xyXG5cdCAqIGhpZGVUb2dnbGVCdXR0b24gdG8gdHJ1ZSBhbmQgbWVudVN0YXR1cyB0byB2aXNpYmxlIGFzIHdlbGwuXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFsd2F5c09wZW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkaXRvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGVjLW1lbnUgZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtZW51RWxlbWVudENsYXNzZXM6IE1lbnVIb3N0RWxlbWVudENsYXNzZXMgfCBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIC50ZXh0Ym94LWdyb3VwIGVsZW1lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdGV4dGJveEVsZW1lbnRDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKiogSGlkZSAnTm8gbWF0Y2hlcycgbWVzc2FnZSB3aGVuIHRydWUgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgaGlkZU5vTWF0Y2hlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuICAgICAqIFRleHQgdG8gc2hvdyB3aGVuIHRoZSBtZW51IGlzIGVtcHR5LiBcIk5vIG1hdGNoZXNcIiBpcyB0aGUgZGVmYXVsdC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG5vTWF0Y2hlc1RleHQ6IHN0cmluZyA9ICdOb01hdGNoZXNfU0MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBOb3RpZnkgdGhlIHBhcmVudCB0aGF0IHRoZSBhZGQgbmV3IGJ1dHRvbiB3YXMgY2xpY2tlZFxyXG5cdCAqIEB0b2RvIGRpc2N1c3MgaWYgd2UgbmVlZCB0byBzZW5kIGFsb25nIHRoZSB2YWx1ZSBvciBzaG91bGRcclxuXHQgKiB0aGUgcGFyZW50IGdldCBpdCBmcm9tIHRoZSBmb3JtTW9kZWxcclxuXHQgKiAobHdmIDIwMTcuMDcuMTMpOiBJIHRoaW5rIHdlIG1pZ2h0IGFzIHdlbGwgc2VuZCB0aGUgdmFsdWUgYWxvbmcgYW5kXHJcblx0ICogbGVhdmUgaXQgdXAgdG8gdGhlIHBhcmVudCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdC5cclxuXHQgKi9cclxuXHRAT3V0cHV0KCkgcHVibGljIGFkZE5ld0NsaWNrOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogTm90aWZ5IHBhcmVudCB3aGVuIHRleHQgdHlwZWQgaW50byB0ZXh0Ym94XHJcblx0ICovXHJcblx0QE91dHB1dCgpIHB1YmxpYyBzZWFyY2g6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG5cclxuXHRAVmlld0NoaWxkKCd0ZXh0Ym94JykgcHVibGljIHRleHRib3ghOiBUZXh0Ym94Q29tcG9uZW50O1xyXG5cclxuXHQvKipcclxuXHQgKiBBY2Nlc3MgdG8gdGhlIG1lbnUncyBjb21wb25lbnQgdmlhIHRoZSAge0BsaW5rIFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlfVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoUG9wdXBDb250YWluZXJEaXJlY3RpdmUpIHByaXZhdGUgcG9wdXA/OiBQb3B1cENvbnRhaW5lckRpcmVjdGl2ZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0aGUgYWRkLW5ldyBidXR0b24gZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoJ2FkZE5ld0J1dHRvbicpIHByaXZhdGUgYWRkTmV3QnV0dG9uITogRWxlbWVudFJlZjtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAgICogRmlsdGVyZWQgSXRlbXMgdG8gc2hvdyBpbiBjb21ib2JveCBtZW51XHJcblx0ICAgKi9cclxuXHRwdWJsaWMgZmlsdGVyZWRPcHRpb25zOiBBcnJheTxNZW51SXRlbT4gPSBbXTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyBpZiB0aGUgbWVudSBpcyBvcGVuIG9yIGhpZGRlblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBtZW51U3RhdHVzOiBQb3B1cFN0YXR1cyA9ICdoaWRkZW4nO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUGxhY2Vob2xkZXIgdG8gYXNzaWduIHRvIHRleHRib3hcclxuXHQgKi9cclxuXHRwdWJsaWMgZWZmZWN0aXZlUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgbWVudSBpdGVtXHJcblx0ICovXHJcblx0cHVibGljIHNlbGVjdGVkSXRlbTogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcm1Db250cm9sIGZvciB0aGUgdGV4dGJveFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0ZXh0Ym94Rm9ybU1vZGVsOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnKTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyB3aGV0aGVyIHRoZSBhZGQgbmV3IGJ1dHRvbiBpcyBzZWxlY3RlZFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhZGROZXdTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVHJhY2tzIHdoZXRoZXIgdGhlIHRleHRib3hGb3JtTW9kZWwgdmFsdWUgbWF0Y2hlcyBhbiBpdGVtIGluIHRoZSBmaWx0ZXJlZE9wdGlvbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgZm91bmRNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogSW5kZXggb2YgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBvcHRpb25zXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZWxlY3RlZEl0ZW1JbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG5cdC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciAnQ2hvb3NlIG9yIEFkZC4uLicgKi9cclxuXHRwcml2YXRlIGNob29zZU9yQWRkUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3IgJ0Nob29zZScgKi9cclxuXHRwcml2YXRlIGNob29zZVBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblx0cHJpdmF0ZSBoYXNEYXRhQmVlbkxvYWRlZE9uT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByb3RlY3RlZCB2YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2U6IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSxcclxuXHRcdHByb3RlY3RlZCBmb3JtR3JvdXBIZWxwZXI6IEZvcm1Hcm91cEhlbHBlcixcclxuXHRcdHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZVxyXG5cdCkge1xyXG5cdFx0c3VwZXIodmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLCBmb3JtR3JvdXBIZWxwZXIpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmd1bGFyIG9uQ2hhbmdlcyBsaWZlY3ljbGUgZXZlbnRcclxuXHQgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3NcclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG5cdFx0c3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcblxyXG5cdFx0Ly8gd2hlbiBvcHRpb25zIGNoYW5nZXNcclxuXHRcdGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcclxuXHRcdFx0dGhpcy5yZXNldE9wdGlvbnMoKTtcclxuXHJcblx0XHRcdC8vIFVwZGF0ZSB0aGUgcG9wdXAgcG9zaXRpb25cclxuXHRcdFx0aWYgKHRoaXMucG9wdXApIHtcclxuXHRcdFx0XHR0aGlzLnBvcHVwLnVwZGF0ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdXBkYXRlIHZhbGlkYXRvcnMgb24gdGhlIHRleHRib3hcclxuXHRcdGlmIChjaGFuZ2VzLnJlcXVpcmVkIHx8IGNoYW5nZXMubWlubGVuZ3RoIHx8IGNoYW5nZXMubWF4bGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMuc2V0VGV4dGJveEZvcm1Nb2RlbFZhbGlkYXRvcnMoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVcGRhdGUgcGxhY2Vob2xkZXIgdGV4dCB3aGVuICdBZGQgTmV3JyBpcyBjb25kaXRpb25hbC5cclxuXHRcdC8vIG5nT25DaGFuZ2VzKCkga2lja3Mgb2ZmIGJlZm9yZSBuZ09uSW5pdCwgc28gaW4gb3JkZXJcclxuXHRcdC8vIHRvIG5vdCBvdmVyd3JpdGUgYSB1c2VyLXByb3ZpZGVkIHBsYWNlaG9sZGVyLCBkbyBub3RcclxuXHRcdC8vIHVwZGF0ZSBwbGFjZWhvbGRlciBvbiBmaXJzdCBjaGFuZ2UgKG5nT25Jbml0IHdpbGwgdGFrZSBjYXJlIG9mIGl0KS5cclxuXHRcdGlmICgoY2hhbmdlcy5hZGROZXcgJiYgIWNoYW5nZXMuYWRkTmV3LmlzRmlyc3RDaGFuZ2UoKSkgfHwgY2hhbmdlcy5wbGFjZWhvbGRlcikge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyVGV4dCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ3VsYXIgb25Jbml0IGxpZmVjeWNsZSBob29rXHJcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXHJcblx0ICovXHJcblx0cHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0c3VwZXIubmdPbkluaXQoKTtcclxuXHJcblx0XHRpZiAodGhpcy5hbHdheXNPcGVuKSB7XHJcblx0XHRcdHRoaXMuaGlkZVRvZ2dsZUJ1dHRvbiA9IHRydWU7XHJcblx0XHRcdHRoaXMubWVudVN0YXR1cyA9ICd2aXNpYmxlJztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBHZXQgdHJhbnNsYXRlZCBwbGFjZWhvbGRlciB0ZXh0XHJcblx0XHR0aGlzLmNob29zZU9yQWRkUGxhY2Vob2xkZXIgPSBgJHt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDaG9vc2Ugb3IgYWRkJyl9Li4uYDtcclxuXHRcdHRoaXMuY2hvb3NlUGxhY2Vob2xkZXIgPSBgJHt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDaG9vc2UnKX1gO1xyXG5cclxuXHRcdHRoaXMuZm9ybU1vZGVsQ2hhbmdlZCh0aGlzLmZvcm1Nb2RlbC52YWx1ZSk7XHJcblx0XHR0aGlzLnNldFRleHRib3hGb3JtTW9kZWxWYWxpZGF0b3JzKCk7XHJcblxyXG5cdFx0Ly8gRXJyb3JzIGZvciB0aGlzIGNvbXBvbmVudCBhcmUgZGlzcGxheWVkIHZpYSB0aGUgdmFsaWRhdGlvbkVycm9ycyBwcm9wZXJ0eSwgd2hpY2ggaXNcclxuXHRcdC8vIHBvcHVsYXRlZCB3aGVuIHRyYW5zbGF0ZVZhbGlkYXRpb25NZXNzYWdlcyBpcyBydW4uXHJcblx0XHQvLyBXaGVuIHRoZSBpbnRlcm5hbCBUZXh0Ym94Q29tcG9uZW50IGhhcyB2YWxpZGF0aW9uIGVycm9ycywgd2Ugc2V0IHRoZW0gb24gdGhlXHJcblx0XHQvLyBmb3JtTW9kZWwgYXMgd2VsbC4gIFRoaXMgdXBkYXRlcyB0aGUgdmFsaWRpdHkgb2Ygb3VyIENvbWJvYm94Q29tcG9uZW50IGNvbnRyb2wsXHJcblx0XHQvLyBidXQgZG9lcyBub3QgdHJpZ2dlciB0cmFuc2xhdGlvbi4gIFN1YnNjcmliZSB0byBzdGF0dXNDaGFuZ2VzIGhlcmUgc28gY29tcG9uZW50XHJcblx0XHQvLyB2YWxpZGF0aW9uIGVycm9ycyB3aWxsIGFwcGVhciBhbG9uZyB3aXRoIHRoZSBDb21ib2JveENvbXBvbmVudCdzIGxhYmVsLlxyXG5cdFx0dGhpcy5mb3JtTW9kZWwudmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHRcdHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuXHRcdCkuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5mb3JtTW9kZWxDaGFuZ2VkKGRhdGEpKTtcclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc3RhdHVzQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHR0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcblx0XHQpLnN1YnNjcmliZShkYXRhID0+IHRoaXMuc2V0Rm9ybU1vZGVsVmFsaWRhdGlvbkVycm9ycyhkYXRhKSk7XHJcblxyXG5cdFx0Ly8gZGVmYXVsdCBwbGFjZWhvbGRlclxyXG5cdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlclRleHQoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5ndWxhciBhZnRlclZpZXdJbml0IGxpZmVjeWNsZSBob29rXHJcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXHJcblx0ICovXHJcblx0cHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHRcdGlmICghdGhpcy5wb3B1cCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYWxsb3cgb3ZlcmZsb3cgb3V0IG9mIHRoZSBzY3JvbGxQYXJlbnRcclxuXHRcdC8vIHByZXZlbnRzIG1lbnUgZnJvbSBvYnNjdXJpbmcgdGhlIGNvbWJvYm94XHJcblx0XHRsZXQgcG9wcGVyT3B0aW9uczogUG9wcGVyLlBvcHBlck9wdGlvbnMgPSB7XHJcblx0XHRcdG1vZGlmaWVyczoge1xyXG5cdFx0XHRcdHByZXZlbnRPdmVyZmxvdzoge1xyXG5cdFx0XHRcdFx0Ym91bmRhcmllc0VsZW1lbnQ6ICd2aWV3cG9ydCdcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gY29udmVydCB0aGUgQ29tYm9ib3hNZW51UG9zaXRpb24gaW50byBhIFBvcHBlclBsYWNlbWVudFxyXG5cdFx0c3dpdGNoICh0aGlzLm1lbnVQb3NpdGlvbikge1xyXG5cdFx0XHRjYXNlIChcInRvcF9sZWZ0XCIpOlxyXG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ3RvcC1zdGFydCc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKFwidG9wX3JpZ2h0XCIpOlxyXG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ3RvcC1lbmQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcImJvdHRvbV9sZWZ0XCIpOlxyXG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ2JvdHRvbS1zdGFydCc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKFwiYm90dG9tX3JpZ2h0XCIpOlxyXG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ2JvdHRvbS1lbmQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZW51UG9zaXRpb24gZm9yIENvbWJvYm94Q29tcG9uZW50LmApXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2Nyb2xsIHRoZSBtZW51IHRvIHRoZSBzZWxlY3RlZCBpdGVtIG9uY2UgdGhlIHBvcHVwIG1lbnUgaXMgcmVhZHlcclxuXHRcdHBvcHBlck9wdGlvbnMub25DcmVhdGUgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSgpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMucG9wdXBGaXhlZCkge1xyXG5cdFx0XHRcdHRoaXMucG9wdXAhLmZpeFBvc2l0aW9uKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5wb3B1cEZpeGVkKSB7XHJcblx0XHRcdHBvcHBlck9wdGlvbnMub25VcGRhdGUgPSAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wb3B1cCEuZml4UG9zaXRpb24oKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucG9wdXAucG9wcGVyT3B0aW9ucyA9IHBvcHBlck9wdGlvbnM7XHJcblxyXG5cdFx0dGhpcy5wb3B1cC5wb3BwZXJTdGF0dXNDaGFuZ2UucGlwZShcclxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxyXG5cdFx0KS5zdWJzY3JpYmUoKGV2ZW50OiAndmlzaWJsZScgfCAnaGlkZGVuJykgPT4ge1xyXG5cdFx0XHRcdHRoaXMubWVudVN0YXR1cyA9IGV2ZW50O1xyXG5cclxuXHRcdFx0XHQvLyBTeW5jaHJvbml6ZSB0aGUgZm9ybU1vZGVsIGFuZCB0ZXh0Rm9ybU1vZGVsIHZhbHVlcyB3aGVuIHRoZVxyXG5cdFx0XHRcdC8vIHBvcHVwIG1lbnUgY2xvc2VzIGFuZCB1bi1maWx0ZXIgdGhlIG9wdGlvbnMgYW5kIHJlc2V0IHRoZVxyXG5cdFx0XHRcdC8vIHNlbGVjdGVkSXRlbSBhbmQgaW5kZXhcclxuXHRcdFx0XHRpZiAoZXZlbnQgPT09ICdoaWRkZW4nKSB7XHJcblx0XHRcdFx0XHR0aGlzLnN5bmNNb2RlbFZhbHVlcygpO1xyXG5cdFx0XHRcdFx0dGhpcy5yZXNldE9wdGlvbnMoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCBlcnJvcnMgb24gdGhlIHRleHRib3hGb3JtTW9kZWwsIHdoaWNoIHdpbGwgdGhlbiBzZXQgZXJyb3JzIG9uIHRoZVxyXG5cdCAqIGZvcm1Nb2RlbC4gQWxzbyBtYXJrIHRoZSBmb3JtTW9kZWwgYXMgdG91Y2hlZCB0byBkaXNwbGF5IGFueSBlcnJvcnMuXHJcblx0ICogQHBhcmFtIGVycm9ycyBrZXkocykgb2YgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIGVycm9ycyB0byBkaXNwbGF5IG9yIHJlbW92ZVxyXG5cdCAqIEBtZW1iZXJvZiBDb21vYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgc2V0RXJyb3JzKGVycm9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0pOiB2b2lkIHtcclxuXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRFcnJvcnMoZXJyb3JzKTtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBVbmZpbHRlciBvcHRpb25zIGFuZCB1cGRhdGUgdGhlIHNlbGVjdGVkSXRlbSBhbmQgc2VsZWN0ZWRJdGVtSW5kZXhcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgcmVzZXRPcHRpb25zKG9wdGlvbnM/OiBNZW51SXRlbVtdKTogdm9pZCB7XHJcblx0XHR0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5vcHRpb25zO1xyXG5cclxuXHRcdC8vaWYgdGhleSBoYXZlIG5vIHNlYXJjaCB0ZXJtLCBkb24ndCB0cnkgdG8gc2VsZWN0IGFueXRoaW5nIHNvIHRoZXkgY2FuIGNsZWFyIHRoZSBib3ggb3V0IGJ5IGhpdHRpbmcgZW50ZXJcclxuXHRcdC8vaWYgdGhleSBoYXZlIGEgc2VhcmNoIHRlcm0gYW5kIHRoZSBvcHRpb25zIGNoYW5nZWQsIHNlbGVjdCBhbiBvcHRpb24gZnJvbSB0aGUgbWVudSBzbyB0aGV5IHdpbGwgZ2V0IGl0IGF1dG9tYXRpY2FsbHkgaWYgdGhleSBoaXQgZW50ZXJcclxuXHRcdGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgIT09ICcnKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSB0aGlzLmZpbmREZWZhdWx0U2VsZWN0aW9uSW5kZXgodGhpcy5maWx0ZXJlZE9wdGlvbnMsIHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSk7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0gfHwgbnVsbDtcclxuXHRcdFx0dGhpcy5zY3JvbGxNZW51KHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly9pZiB0aGV5IGhhdmUgbm8gc2VhcmNoIHRlcm0gYW5kIHRoZSBvcHRpb25zIGFyZSByZXNldCwgZG9uJ3QgYXV0by1waWNrIHRoZSBmaXJzdCBvbmVcclxuXHRcdFx0Ly9zbyB0aGF0IGVudGVyIHdpbGwgYWxsb3cgdGhlbSB0byB3aXBlIG91dCB0aGVpciBsYXN0IHNlbGVjdGlvblxyXG5cdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaXN0ZW4gdG8gdGhlIHNlbGVjdGVkIGNoYW5nZWQgZXZlbnQgZnJvbSB7QGxpbmsgTWVudUNvbXBvbmVudH0gYW5kIHVwZGF0ZSB0aGUgZm9ybVxyXG5cdCAqIG1vZGVsIGFuZCBjbG9zZSBtZW51XHJcblx0ICovXHJcblx0cHVibGljIHNlbGVjdGVkQ2hhbmdlZChpdGVtOiBNZW51SXRlbSk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZXRGb3JtTW9kZWxWYWx1ZShpdGVtKTtcclxuXHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3cgYW5kIGhpZGUgdGhlIHBvcHVwIG1lbnVcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b2dnbGVNZW51KGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcclxuXHRcdGlmICghdGhpcy5wb3B1cCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGV2ZW50KSB7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0Ly8gV2hlbiB0aGUgcG9wdXAgaXMgaGlkZGVuIGl0IHdpbGwgZW1pdCBpdHMgY2hhbmdlZCBzdGF0dXMgYW5kXHJcblx0XHRcdFx0Ly8gd2Ugd2lsbCByZXNldCB2YWx1ZXMgaWYgbmVlZCBiZS5cclxuXHRcdFx0XHR0aGlzLnBvcHVwLmhpZGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRpZiAodGhpcy5sb2FkT25PcGVuT2JzZXJ2YWJsZSAmJiAhdGhpcy5oYXNEYXRhQmVlbkxvYWRlZE9uT3Blbikge1xyXG5cdFx0XHRcdFx0dGhpcy5wZW5kaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLmxvYWRPbk9wZW5PYnNlcnZhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChyZXN1bHQ6IE1lbnVJdGVtW10pID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5oYXNEYXRhQmVlbkxvYWRlZE9uT3BlbiA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLnBlbmRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0dGhpcy5vcHRpb25zID0gcmVzdWx0O1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5yZXNldE9wdGlvbnMoKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5wb3B1cCEuc2hvdygpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMucG9wdXAuc2hvdygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIG9uQmx1cigpOiB2b2lkIHtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBDb250cm9sIHRoZSBtZW51IHdpdGgga2V5Ym9hcmQgbmF2aWdhdGlvblxyXG5cdCAqXHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQva2V5I0V4YW1wbGUgfCBLZXlib2FyZEV2ZW50LmtleX1cclxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkvS2V5X1ZhbHVlcyB8IEtleSBWYWx1ZXN9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMga2V5TmF2aWdhdGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuXHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdGNhc2UgXCJBcnJvd0Rvd25cIjpcclxuXHRcdFx0Y2FzZSBcIkRvd25cIjpcclxuXHRcdFx0Y2FzZSBcIkFycm93VXBcIjpcclxuXHRcdFx0Y2FzZSBcIlVwXCI6XHJcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHR0aGlzLm9uQXJyb3dEb3duVXAoZXZlbnQpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkJhY2tzcGFjZVwiOlxyXG5cdFx0XHRjYXNlIFwiRGVsZXRlXCI6XHJcblx0XHRcdGNhc2UgXCJEZWxcIjpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJykge1xyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIFwiVGFiXCI6XHJcblx0XHRcdFx0Ly8gSWYgdGFiYmluZyBmcm9tIHRoZSB0ZXh0Ym94IHRvIHRoZSBidXR0b24sIG92ZXJyaWRlIHRoZSB0ZXh0Ym94IGFzIGJlaW5nXHJcblx0XHRcdFx0Ly8gbWFya2VkIHRvdWNoZWQgc28gd2UgZG9uJ3Qgc2VlIHRoZSBpbnZhbGlkIHN0YXRlLiBPbmx5IHNob3cgdGhlIGludmFsaWQgc3RhdGVcclxuXHRcdFx0XHQvLyB3aGVuIHRhYmJpbmcgb3V0IG9mIGNvbWJvYm94IGZyb20gdGhlIGJ1dHRvbiBvciBiYWNrIHRhYmJpbmcgZnJvbSB0aGUgdGV4dGJveFxyXG5cdFx0XHRcdC8vIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmIGV2ZW50LnNyY0VsZW1lbnQgJiYgZXZlbnQuc3JjRWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnKSB7XHJcblx0XHRcdFx0Ly8gXHRpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuXHRcdFx0XHQvLyBcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdFx0XHRcdC8vIFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLm1hcmtBc1VudG91Y2hlZCgpO1xyXG5cdFx0XHRcdC8vIFx0fVxyXG5cdFx0XHRcdC8vIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiBldmVudC5zcmNFbGVtZW50ICYmIGV2ZW50LnNyY0VsZW1lbnQudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHtcclxuXHRcdFx0XHQvLyBcdGlmICghZXZlbnQuc2hpZnRLZXkpIHtcclxuXHRcdFx0XHQvLyBcdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdFx0XHRcdC8vIFx0fVxyXG5cdFx0XHRcdC8vIH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0XHQvL2lmIHRoZSBzZWxlY3RlZCBvcHRpb24gaXMgdGhlIGFkZCBuZXcgYnV0dG9uIGxldCBpdCBmaXJlIGJ1dCBkb24ndCBhbGxvd1xyXG5cdFx0XHRcdFx0Ly90aGUgdGFiIGV2ZW50IHRvIGNhcnJ5IHRoZW0gZm9yd2FyZCBmcm9tIHdoZXJldmVyIHRoZXkgbGFuZCAtIHRoZXkgd291bGQgc2tpcCB0aGUgZmlyc3QgYm94IG9uIHRoZSBhZGQgbmV3IGZvcm1cclxuXHRcdFx0XHRcdC8vSW4gdGhlIG5vcm1hbCBjYXNlIHdlIHdhbnQgdG8gYWxsb3cgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb3IgdGhleSB3b24ndCBiZSBhYmxlIHRvIHRhYiBvdXQgb2YgdGhlIGNvbnRyb2wgYXQgYWxsLlxyXG5cdFx0XHRcdFx0aWYodGhpcy5hZGROZXdTZWxlY3RlZCl7XHJcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5jb21taXRTZWxlY3Rpb24oZXZlbnQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJFbnRlclwiOlxyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdFx0dGhpcy5jb21taXRTZWxlY3Rpb24oZXZlbnQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJFc2NhcGVcIjpcclxuXHRcdFx0Y2FzZSBcIkVzY1wiOlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdFx0Ly8gSnVzdCBjbG9zZSB0aGUgbWVudSwgZG8gbm90IGZvY3VzIHRoZSBuZXh0IGVsZW1lbnQgb24gdGFiXHJcblx0XHRcdFx0XHQvLyB1bmxlc3MgdGhlIG1lbnUgaXMgaGlkZGVuXHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRcdC8vIENsb3NlIHRoZSBtZW51IGJlZm9yZSB3ZSByZXNldCBzZWxlY3RlZEl0ZW0gc28gd2UgZG9uJ3Qgc2VlIHRoZSBoaWdobGlnaHQgY2hhbmdpbmdcclxuXHRcdFx0XHRcdC8vIHdoZW4gcmVzZXQgdGhlIHNlbGVjdGVkIGl0ZW0gYmFjayB0byB0aGUgZm9ybU1vZGVsXHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiIFwiOlxyXG5cdFx0XHRjYXNlIFwiU3BhY2ViYXJcIjpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJykge1xyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicgJiYgZXZlbnQua2V5ICE9PSAnU2hpZnQnKSB7XHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjaWxpdGF0ZXMgYWRkaW5nIGl0ZW1zIHRvIGEgY29tYm9ib3hcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBhZGRGbiBGdW5jdGlvbiBmcm9tIHBhcmVudCB0aGF0IHNob3VsZCBtYWtlIGFuIEFQSSByZXF1ZXN0IHRvIGFkZCBhIG5ldyBpdGVtIHRvIHRoZSBjb21ib2JveCdzIG9wdGlvbnNcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgYXN5bmMgYWRkTmV3SXRlbShhZGRGbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xyXG4gICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgYWRkRm4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gV2UgZ2F2ZSBpdCBvdXIgYmVzdCB0cnksIHNvbWV0aGluZyBpcyByZWFsbHkgd2hhY2ssIHNvIGxldCdzIGp1c3Qgc2V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICB0aGlzLnNldEVycm9ycyh7ICdhZGRuZXcnOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRvZ2dsZU1lbnUoKTtcclxuICAgIH1cclxuXHJcblx0LyoqXHJcblx0ICogRmlndXJlIG91dCB3aGV0aGVyIHRoZXkgYXJlIGFkZGluZyBuZXcgb3IgaGF2ZSBhbiBpdGVtIHNlbGVjdGVkLCBhbmQgY29tbWl0IGl0IHRvIHRoZSBmb3JtIG1vZGVsXHJcblx0ICovXHJcbiAgcHJpdmF0ZSBjb21taXRTZWxlY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHR0aGlzLm9uQWRkTmV3KGV2ZW50KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2V0Rm9ybU1vZGVsVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG5cdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHRleHRib3ggdG8gdGhlIHBhcmVudCB3aGVuIHRoZSBhZGQgbmV3IGJ1dHRvbiBpc1xyXG5cdCAqIGNsaWNrZWRcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBldmVudCBBZGQgbmV3IGJ1dHRvbiBjbGljayBvciBlbnRlciBrZXkgZXZlbnRcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgb25BZGROZXcoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdHRoaXMuYWRkTmV3Q2xpY2suZW1pdCh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRlIHRoZSBkcm9wZG93biBtZW51IHVzaW5nIHVwIGFuZCBkb3duIGFycm93IGtleXNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBldmVudCBVcCBvciBkb3duIGFycm93IGtleWRvd24gZXZlbnRcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIG9uQXJyb3dEb3duVXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuXHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdGNhc2UgXCJBcnJvd0Rvd25cIjpcclxuXHRcdFx0Y2FzZSBcIkRvd25cIjpcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT09IC0xICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbiAmJiAhdGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4IDwgdGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoIC0gMSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly9pZiB0aGUgbGFzdCBpdGVtIGlzIGEgaGVhZGluZyBhbmQgd2UgYXJlIG9uIHRoZSBzZWNvbmQgbGFzdCBpdGVtLCB3ZSBzaG91bGRuJ3QgaW5jcmVtZW50IHRoZSBzZWxlY3RlZEl0ZW1JbmRleCBiZWNhdXNlIHRoYXQgd291bGQgc2VsZWN0IHRoZSBoZWFkaW5nXHJcblx0XHRcdFx0XHRpZiggISh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09IHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDIgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCsxXS5kaXNwbGF5ID09PSAnaGVhZGluZycpICkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4Kys7XHJcblx0XHRcdFx0XHRcdC8vIFNraXAgYW55IGluLW1lbnUgaGVhZGluZyBpdGVtc1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA8IHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDEgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCsrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkFycm93VXBcIjpcclxuXHRcdFx0Y2FzZSBcIlVwXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT09IC0xICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbiAmJiB0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID4gLTEpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAwICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbikge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgtLTtcclxuXHRcdFx0XHRcdC8vIFNraXAgYW55IGluLW1lbnUgaGVhZGluZyBpdGVtc1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4XS5kaXNwbGF5ID09PSAnaGVhZGluZycpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleC0tO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly9pZiB0aGUgc2VsZWN0ZWRJdGVtSW5kZXggaXMgLTEsIHRoYXQgbWVhbnMgdGhlIHZlcnkgZmlyc3QgaXRlbSB3YXMgYSBoZWFkaW5nIGFuZCB3ZSBqdXN0IHNraXBwZWQgb3ZlciBpdC5cclxuXHRcdFx0XHRcdFx0aWYodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PSAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdC8vaWYgdGhlcmUgaXMgYW4gYWRkIG5ldyBidXR0b24gd2Ugc2hvdWxkIHNlbGVjdCBpdC4gb3RoZXJ3aXNlIHdlIHNob3VsZCBsb2NrIHRoZW0gYXQgaW5kZXggMSAocmlnaHQgYmVmb3JlIHRoZSBoZWFkaW5nKVxyXG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbikge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSAxO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG4gICAgICAgICAgXHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF07XHJcblxyXG5cdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0Rm9ybU1vZGVsVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zY3JvbGxNZW51KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblxyXG5cdC8qKlxyXG5cclxuXHQgKiBGaWx0ZXIgYXJyYXkgb2Ygb3B0aW9ucyBieSBsYWJlbCAoY29udGFpbnMpXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZmlsdGVyVGV4dCBUaGUgdmFsdWUgb2YgdGV4dGJveCB0aGF0IHdlIHdpbGwgZmlsdGVyIG91ciBvcHRpb25zIGJ5XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbHRlck9wdGlvbnNBcnJheShmaWx0ZXJUZXh0OiBzdHJpbmcpOiBBcnJheTxNZW51SXRlbT4ge1xyXG5cdFx0bGV0IHNlYXJjaFRleHQgPSBmaWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRpZiAoZmlsdGVyVGV4dCAmJiBmaWx0ZXJUZXh0ICE9PSAnJykge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcihpdGVtID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPj0gMDtcclxuXHRcdFx0fSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnM7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRmluZCBhIGdpdmVuIGl0ZW0ncyBpbmRleCBpbiB0aGUgZmlsdGVyZWQgaXRlbXMgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZFxyXG5cdCAqIEBwYXJhbSBpdGVtIFRoZSBtYXRjaGluZyBpdGVtIHRvIGZpbmQgaW4gdGhlXHJcblx0ICogZmlsdGVyZE9wdGlvbnMgYXJyYXkuIFdpbGwgdXNlIHRoZSBzZWxlY3RlZEl0ZW0gaWYgbm90aGluZyBpcyBwYXNzZWQuXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kU2VsZWN0ZWRJdGVtSW5kZXgoaXRlbT86IE1lbnVJdGVtKTogbnVtYmVyIHtcclxuXHRcdGxldCBpdGVtVG9GaW5kID0gaXRlbSA/IGl0ZW0gOiB0aGlzLnNlbGVjdGVkSXRlbTtcclxuXHJcblx0XHRpZiAoaXRlbVRvRmluZCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMuZmluZEluZGV4KGl0ZW0gPT4ge1xyXG5cdFx0XHRcdGlmKGl0ZW0uaWQgJiYgKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW0ubGFiZWwgPT09ICg8TWVudUl0ZW0+aXRlbVRvRmluZCkubGFiZWwgJiYgaXRlbS5pZCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZFxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAtMTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFjdCB0byBvdXIgZm9ybU1vZGVsIGNoYW5naW5nXHJcblx0ICpcclxuXHQgKiBUaGUgZm9ybU1vZGVsIHJlcHJlc2VudHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBNb2RlbEl0ZW1cclxuXHQgKiBXaGVuIGNoYW5nZWQsIHNldCB0aGUgdmFsdWUgb2YgdGhlIFRleHRib3hDb21wb25lbnQgYW5kXHJcblx0ICogZmluZCBpbmRleCBvZiBpdGVtIGluIG9wdGlvbnMgbGlzdC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZm9ybU1vZGVsQ2hhbmdlZChkYXRhPzogTWVudUl0ZW0pOiB2b2lkIHtcclxuXHRcdHRoaXMuc3luY2hyb25pemVEaXNhYmxlZEF0dHJpYnV0ZXMoKTtcclxuXHJcblx0XHRpZiAoZGF0YSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoZGF0YS5sYWJlbCk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gdGhpcy5maW5kU2VsZWN0ZWRJdGVtSW5kZXgoZGF0YSk7XHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID49IDApIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvL1RoZSBob3N0IHdpcGVkIG91dCB0aGUgZGF0YSBleHRlcm5hbGx5LCBjbGVhciB0aGUgdGV4dGJveCBhbmQgdGhlIHRyYWNraW5nIHN0YXRlXHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5yZXNldCgpO1xyXG5cdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2Nyb2xsIHRoZSBtZW51IGlmIHRoZSBjdXJyZW50IHNlbGVjdGVkSXRlbUluZGV4IGlzIG91dCBvZiB2aWV3XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNjcm9sbE1lbnUoa25vd25JbmRleD86IG51bWJlcik6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW1JbmRleCBpbiBjYXNlIG91ciBvcHRpb25zIGNoYW5nZWRcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGtub3duSW5kZXggPT09IHVuZGVmaW5lZCA/IHRoaXMuZmluZFNlbGVjdGVkSXRlbUluZGV4KCkgOiBrbm93bkluZGV4O1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLnNlbGVjdGVkSXRlbSkge1xyXG5cdFx0XHRcdC8vIFRoZSBtZW51IGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgaWRzIGZvciB0aGUgbWVudSBpdGVtcyBpZiB0aGV5IGRvbnQgaGF2ZSB0aGVtLFxyXG5cdFx0XHRcdC8vIHNvIHRoZXkgbmVlZCB0byBiZSBhY2NvdW50ZWQgZm9yIGhlcmUgc2luY2UgdGhlIGNvbWJvYm94IGRvZXNuJ3Qga25vdyBhYm91dCB0aG9zZSBpZHNcclxuXHRcdFx0XHRsZXQgaXRlbVNlbGVjdG9yID0gdGhpcy5zZWxlY3RlZEl0ZW0uaWQgPyBgIyR7dGhpcy5zZWxlY3RlZEl0ZW0uaWR9YCA6IGAjJHt0aGlzLmlkfV9tZW51X2l0ZW0ke3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXh9YDtcclxuXHJcblx0XHRcdFx0Ly90cmlnZ2VyIHRoZSBzY3JvbGxpbmcgYWZ0ZXIgYSB0aWNrIHRvIGFsbG93IHRoZSBtZW51IHRvIGJlIHVwIHRvIGRhdGUgKGFuZCBwZW5kaW5nIG1hc2sgY2xlYXJlZCkgYmVmb3JlIG1lYXN1cmluZ1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoKCk9PntcclxuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxJdGVtQ2VudGVyZWQoYCMke3RoaXMuaWR9X21lbnVfbGlzdGAsIGl0ZW1TZWxlY3Rvcik7XHJcblx0XHRcdFx0fSwgMCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoL0ZpbHRlciBiYXNlZCBvbiB0ZXh0Ym94IGlucHV0XHJcblx0ICogTk9URTogc28gYXMgbm90IHRvIHJlY2VpdmUgYSBub3RpZmljYXRpb24gb24gZXZlcnkga2V5IGV2ZW50LCB3ZSBzdWdnZXN0IHlvdSBkZWJvdW5jZSB5b3VyXHJcblx0ICogc3Vic2NyaXB0aW9uXHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cDovL3JlYWN0aXZleC5pby9yeGpzL2NsYXNzL2VzNi9PYnNlcnZhYmxlLmpzfk9ic2VydmFibGUuaHRtbCNpbnN0YW5jZS1tZXRob2QtZGVib3VuY2VUaW1lIHwgT2JzZXJ2YWJsZS5kZWJvdW5jZVRpbWV9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNlYXJjaEFuZEZpbHRlcihzZWFyY2hUZXh0Pzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG5cdFx0Ly8gYWx3YXlzIGVtaXRcclxuXHRcdHRoaXMuc2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XHJcblxyXG5cdFx0Ly8gZG8gaW50ZXJuYWwgZmlsdGVyaW5nIGlmIG5vIG9uZSdzIHN1YnNjcmliZWQgdG8gb3VyIHNlYXJjaCBlbWl0dGVyXHJcblx0XHRpZiAodGhpcy5zZWFyY2gub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCAmJiBzZWFyY2hUZXh0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dGhpcy5yZXNldE9wdGlvbnModGhpcy5maWx0ZXJPcHRpb25zQXJyYXkoc2VhcmNoVGV4dCkpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQgJiYgIXRoaXMuYWRkTmV3QnV0dG9uKSB7XHJcblx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHtAbGluayBmb3JtTW9kZWwgfSdzIHZhbGlkYXRpb24gZXJyb3JzIGVxdWFsIHRvIHRoZSBpbnRlcm5hbCB0ZXh0Ym94J3MuXHJcblx0ICpcclxuXHQgKiBXaGVuIHRoZSBpbnRlcm5hbCB0ZXh0Ym94IGlzIGludmFsaWQsIG5lZWQgdG8gc2V0IHRoaXMgY29udHJvbCdzXHJcblx0ICogZXJyb3JzIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIG91ciBvd24gbGFiZWwsIG5vdCBUZXh0Ym94Q29udHJvbCdzLlxyXG5cdCAqIFdlIHVzZSBvdXIgb3duIGxhYmVsIHNvIGxhYmVsIHRleHQgd2lsbCB3cmFwIGF0IHRoZSBlbmQgb2YgdGhlIGJ1dHRvbixcclxuXHQgKiBub3QgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dGJveC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0Rm9ybU1vZGVsVmFsaWRhdGlvbkVycm9ycyhkYXRhPzogYW55KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmludmFsaWQpIHtcclxuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKG51bGwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIHRoZSBmb3JtIG1vZGVsIHZhbHVlIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0gb3IgcmVzZXQgZm9ybSBtb2RlbCB2YWx1ZSBpZiBpdGVtIGlzIG51bGxcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0Rm9ybU1vZGVsVmFsdWUoaXRlbTogTWVudUl0ZW0gfCBudWxsKTogdm9pZCB7XHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoaXRlbSA/IGl0ZW0ubGFiZWwgOiAnJyk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5zZXRWYWx1ZShpdGVtKTtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc0RpcnR5KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHZhbGlkYXRvcnMgb24gdGhlIHtAc2VlIHRleHRib3hGb3JtTW9kZWwgfVxyXG5cdCAqXHJcblx0ICogVmFsaWRhdG9ycyBhcmUgY3VycmVudGx5IHNldCBiYXNlZCBvbiB0aGUge0BzZWUgbWF4bGVuZ3RoIH0sXHJcblx0ICoge0BzZWUgbWlubGVuZ3RoIH0sIGFuZCB7QHNlZSByZXF1aXJlZCB9IGlucHV0cy4gIFRoaXMgd29ya3Mgd2VsbFxyXG5cdCAqIHdpdGgge0BzZWUgVGV4dGJveENvbXBvbmVudCB9LCB3aGljaCBuZWVkcyB0aGVzZSBpbnB1dHMgdG8gYXBwbHlcclxuXHQgKiB0aGUgcHJvcGVyIGF0dHJpYnV0ZXMgdG8gaXRzIGlucHV0cy5cclxuXHQgKlxyXG5cdCAqIEEgZnV0dXJlIHJlbGVhc2Ugb2YgQW5ndWxhciB3aWxsIHN1cHBvc2VkbHkgYWRkIHRoZXNlIGF0dHJpYnV0ZXNcclxuXHQgKiBmb3IgeW91LCB3aGljaCB3aWxsIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgVGV4dGJveENvbXBvbmVudCB0byBoYXZlXHJcblx0ICogc3VjaCBpbnB1dHMuICBUaGlzIGNvbXBvbmVudCwgaG93ZXZlciwgd2lsbCBzdGlsbCBuZWVkIHRoZXNlIGlucHV0c1xyXG5cdCAqIGFzIHRoZXJlIGlzIG5vIGN1cnJlbnQgd2F5IHRvIGtub3cgd2hpY2ggdmFsaWRhdG9ycyBhcmUgYXBwbGllZCB0byBpdFxyXG5cdCAqIGZyb20gaXRzIHBhcmVudCBWaWV3IENvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuXHRcdGxldCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcclxuXHJcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMubWlubGVuZ3RoKSB7XHJcblx0XHRcdHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm1pbmxlbmd0aCkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLm1heGxlbmd0aCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5tYXhsZW5ndGgpKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEtlZXAgdGV4dGJveCdzIGRpc2FibGVkIHN0YXR1cyBpbi1zeW5jIHdpdGggY29tYm9ib3gnc1xyXG5cdCAqXHJcblx0ICoge0BsaW5rIFRleHRib3hDb21wb25lbnR9IGdldHMgaXRzIGRpc2FibGVkIHN0YXR1cyBmcm9tIGl0cyB7QGxpbmsgRm9ybUNvbnRyb2x9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHN5bmNocm9uaXplRGlzYWJsZWRBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkICE9PSB0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGUoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuZW5hYmxlKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGUgZm9ybU1vZGVsIHZhbHVlIGFuZCB0ZXh0Ym94IHZhbHVlIGRvIG5vdCBtYXRjaCwgcmVzZXQgdGhlIHRleHRib3ggYW5kIHNlbGVjdGVkSXRlbSB0b1xyXG5cdCAqIHRoZSBmb3JtTW9kbGUgdmFsdWUuIElmIHRoZXJlIGlzIG5vIGZvcm1Nb2RlbCB2YWx1ZSwgbWFrZSBzdXJlIHdlIGNsZWFyIHRoZSB0ZXh0Ym94LiBSZXNldCB0aGVcclxuXHQgKiBmaWx0ZXJlZE9wdGlvbnMgdG8gdGhlIGZ1bGwgbGlzdCBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW1JbmRleFxyXG5cdCAqXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzeW5jTW9kZWxWYWx1ZXMoKTogdm9pZCB7XHJcblx0XHQvLyBJZiB0aGVyZSBpcyBhIGZvcm1Nb2RlbCB2YWx1ZSwgcmVzZXQgdGhlIHNlbGVjdGVkIGl0ZW0uIElmIHRoZXJlIGlzbid0LCBtYWtlXHJcblx0XHQvLyBzdXJlIHdlIGNsZWFyIHRoZSB0ZXh0Ym94XHJcblx0XHRpZiAodGhpcy5mb3JtTW9kZWwudmFsdWUgJiYgdGhpcy5mb3JtTW9kZWwudmFsdWUubGFiZWwgIT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUodGhpcy5mb3JtTW9kZWwudmFsdWUubGFiZWwpO1xyXG5cdFx0fSBlbHNlIGlmICghdGhpcy5mb3JtTW9kZWwudmFsdWUpIHtcclxuXHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKCcnKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2ggYW5kIGZpbHRlciB0aGUgb3B0aW9ucyBsaXN0IHdoZW4gdGhlIHZhbHVlIG9mIHRoZSB0ZXh0Ym94IGlucHV0IGNoYW5nZXMuIElmIGFkZE5ldyBpc1xyXG5cdCAqIHNldCBhbHNvIGNoZWNrIGZvciBtYXRjaGVzIGluIG91ciBmaWx0ZXJlZE9wdGlvbnMgdG8gY29uZGl0aW9uYWxseSBzaG93IGFuZCBoaWRlIHRoZSBhZGQgbmV3XHJcblx0ICogYnV0dG9uXHJcblx0ICpcclxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9pbnB1dFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0ZXh0Ym94VmFsdWVDaGFuZ2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZWFyY2hBbmRGaWx0ZXIodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlID09PSAnJykge1xyXG5cdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuYWRkTmV3KSB7XHJcblx0XHRcdGxldCBtYXRjaCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xyXG5cdFx0XHRcdHJldHVybiBvcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmZvdW5kTWF0Y2ggPSBtYXRjaCA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVcGRhdGUgdGhlIHBvcHVwIG1lbnUgcG9zaXRpb24gd2hlbiBpbnB1dCB2YWx1ZSBjaGFuZ2VzXHJcblx0XHRpZiAodGhpcy5wb3B1cCkge1xyXG5cdFx0XHR0aGlzLnBvcHVwLnVwZGF0ZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjbGVhclNlbGVjdGVkSXRlbSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSAtMTtcclxuXHR9XHJcblxyXG5cdC8qKlJlY29tcHV0ZSB3aGF0IHRoZSBwbGFjZWhvbGRlciBzaG91bGQgYmUgYmFzZWQgb24gd2hldGhlciB0aGUgdXNlciBwcm92aWRlZCBvbmUgYW5kIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhZGROZXcgaW5wdXQgKi9cclxuXHRwcml2YXRlIHVwZGF0ZVBsYWNlaG9sZGVyVGV4dCgpe1xyXG5cdFx0aWYgKHRoaXMucGxhY2Vob2xkZXIpIHtcclxuXHRcdFx0dGhpcy5lZmZlY3RpdmVQbGFjZWhvbGRlciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5wbGFjZWhvbGRlcik7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMuYWRkTmV3KSB7XHJcblx0XHRcdHRoaXMuZWZmZWN0aXZlUGxhY2Vob2xkZXIgPSB0aGlzLmNob29zZU9yQWRkUGxhY2Vob2xkZXI7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy5jaG9vc2VQbGFjZWhvbGRlcjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKkZpbmQgdGhlIG9wdGlvbiB3ZSB3YW50IHRvIGJlIHRoZSBkZWZhdWx0IHNlbGVjdGlvbi4gSWYgdGhlcmUgaXMgYW4gZXhhY3QgbWF0Y2gsIHVzZSB0aGF0XHJcblx0ICogb3RoZXJ3aXNlIGlmIHRoZXJlIGFyZSBpdGVtcywgcmV0dXJuIHplcm8gdG8gaW5kaWNhdGUgdGhlIGZpcnN0IGl0ZW0uIE90aGVyd2lzZSByZXR1cm4gLTFcclxuXHQgKiB0byBpbmRpY2F0ZSBubyBzZWxlY3Rpb25cclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmREZWZhdWx0U2VsZWN0aW9uSW5kZXgob3B0aW9uczogTWVudUl0ZW1bXSwgc2VhcmNoVGV4dDogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRcdGxldCBpbmRleCA9IC0xO1xyXG5cclxuXHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5sZW5ndGgpe1xyXG5cdFx0XHRpbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbj0+b3B0aW9uICE9IG51bGwgJiYgb3B0aW9uLmRpc3BsYXkgIT09ICdoZWFkaW5nJyk7XHJcblx0XHRcdFxyXG5cdFx0XHRpZihzZWFyY2hUZXh0KXtcclxuXHRcdFx0XHRzZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcclxuXHRcdFx0XHRsZXQgZXhhY3RNYXRjaEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uPT5vcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKSA9PSBzZWFyY2hUZXh0ICYmIG9wdGlvbi5kaXNwbGF5ICE9PSAnaGVhZGluZycpO1xyXG5cdFx0XHRcdGlmKGV4YWN0TWF0Y2hJbmRleCA+PTApe1xyXG5cdFx0XHRcdFx0aW5kZXggPSBleGFjdE1hdGNoSW5kZXg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gaW5kZXg7XHJcblx0fVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29udHJvbCBjb250cm9sLWxhYmVsLXt7bGFiZWxQb3NpdGlvbn19XCJcclxuICAgICBbbmdDbGFzc109XCJ7J29wZW4nOiBtZW51U3RhdHVzID09PSAndmlzaWJsZScsXHJcbiAgICAgICAgICAgICAgICAgJ2ludmFsaWQnOiBmb3JtTW9kZWwudG91Y2hlZCAmJiBmb3JtTW9kZWwuaW52YWxpZCxcclxuICAgICAgICAgICAgICAgICAnaGFzLWljb24nOiAodGVtcGxhdGVUeXBlID09PSAnaWNvbkFuZExhYmVsJyAmJiBmb3JtTW9kZWwudmFsdWUgJiYgZm9ybU1vZGVsLnZhbHVlLmljb24gJiYgZm9ybU1vZGVsLnZhbHVlLmxhYmVsID09PSB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAnaXMtcmVhZG9ubHknOiByZWFkb25seSxcclxuICAgICAgICAgICAgICAgICAnaXMtZGlzYWJsZWQnOiBmb3JtTW9kZWwuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAgJ2lzLWFsd2F5cy1vcGVuJzogYWx3YXlzT3Blbn1cIj5cclxuXHJcbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBuZ1ByZXNlcnZlV2hpdGVzcGFjZXM+XHJcbiAgICAgIDxzcGFuPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDAgJiYgZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWRcIj57e3ZhbGlkYXRpb25FcnJvcnN9fTwvc3Bhbj5cclxuICA8L2xhYmVsPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWx3YXlzT3BlbjsgZWxzZSBwb3B1cFRhcmdldFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHRib3gtZ3JvdXAgY29udHJvbC1pbnB1dFwiIFtuZ0NsYXNzXT1cInRleHRib3hFbGVtZW50Q2xhc3Nlc1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGV4dGJveFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwIHx8IHRleHRib3hGb3JtTW9kZWwudmFsdWVcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3dubWVudVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNwb3B1cFRhcmdldD5cclxuICA8ZGl2IGNsYXNzPVwidGV4dGJveC1ncm91cCBjb250cm9sLWlucHV0XCIgW25nQ2xhc3NdPVwidGV4dGJveEVsZW1lbnRDbGFzc2VzXCIgKmVjUG9wdXA9XCJkcm9wZG93bm1lbnVcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZXh0Ym94XCI+PC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3RleHRib3g+XHJcbiAgPGkgY2xhc3M9XCJlYy1pY29uIHt7Zm9ybU1vZGVsLnZhbHVlPy5pY29ufX1cIj48L2k+XHJcblxyXG4gICAgPGVjLXRleHRib3ggY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwLWlucHV0IG1iLTBcIlxyXG4gICAgICAgICAgICAgICAgI3RleHRib3hcclxuICAgICAgICAgICAgICAgIFtpZF09XCJpZFwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInRleHRib3hGb3JtTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhsZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtaW5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVmZmVjdGl2ZVBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJ0ZXh0Ym94VmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5TmF2aWdhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25CbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgW3VwcGVyQ2FzZV09XCJ1cHBlckNhc2VcIlxyXG4gICAgICAgICAgICAgICAgW3BlbmRpbmddPVwicGVuZGluZyAmJiBhbHdheXNPcGVuXCJcclxuICAgICAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiJ29mZidcIj48L2VjLXRleHRib3g+XHJcblxyXG4gICAgPGVjLWJ1dHRvbiBjbGFzcz1cInRleHRib3gtZ3JvdXAtYnRuLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaGlkZVRvZ2dsZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgIFtpZF09XCJpZCArICdfYnV0dG9uJ1wiXHJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtTW9kZWwuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICBpY29uPVwiaWNvbi1jYXJldC1kb3duXCJcclxuICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNZW51KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlOYXZpZ2F0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJtZW51U3RhdHVzID09PSAndmlzaWJsZSdcIj48L2VjLWJ1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd25tZW51PlxyXG4gIDxkaXYgY2xhc3M9XCJwb3B1cFwiXHJcbiAgICAgICBlY092ZXJsYXlcclxuICAgICAgIFtzdGF0dXNdPVwicGVuZGluZyAmJiAhYWx3YXlzT3BlbiA/ICdwZW5kaW5nJyA6ICdoYXNEYXRhJ1wiPlxyXG5cclxuICAgIDxidXR0b24gY2xhc3M9XCJhZGQtbmV3XCJcclxuICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fYWRkTmV3XCJcclxuICAgICAgICAgICAgI2FkZE5ld0J1dHRvblxyXG4gICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwiYWRkTmV3U2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImFkZE5ld1wiXHJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZm91bmRNYXRjaCB8fCAoYWRkTmV3ID09PSAnZHluYW1pYycgJiYgKCF0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlIHx8IChmb3JtTW9kZWwudmFsdWUgJiYgdGV4dGJveEZvcm1Nb2RlbC52YWx1ZSA9PT0gZm9ybU1vZGVsLnZhbHVlLmxhYmVsKSkpXCJcclxuXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkFkZE5ldygkZXZlbnQpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLW5ldy1sYWJlbCBlYy11dGlsLXRydW5jYXRlXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJhZGROZXcgPT09ICdzdGF0aWMnIHx8IGFkZE5ldyA9PT0gdHJ1ZVwiIHRyYW5zbGF0ZT5BZGQgbmV3Li4uPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYWRkTmV3ID09PSAnZHluYW1pYydcIj57eydBZGQnIHwgdHJhbnNsYXRlfX0gPHN0cm9uZyBjbGFzcz1cImVjLXV0aWwtdHJ1bmNhdGVcIiBbbmdDbGFzc109XCJ7J3RleHQtdXBwZXJjYXNlJzogdXBwZXJDYXNlfVwiPnt7dGV4dGJveEZvcm1Nb2RlbC52YWx1ZX19PC9zdHJvbmc+PC9zcGFuPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFkZFwiPjwvaT5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxlYy1tZW51IGlkPVwie3tpZH19X21lbnVcIlxyXG4gICAgICAgICAgICAgW2NsYXNzLmJvcmRlci10b3AtMF09XCIhZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAmJiBoaWRlTm9NYXRjaGVzXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVFbGVtZW50Q2xhc3Nlc1wiXHJcbiAgICAgICAgICAgICBbdGVtcGxhdGVUeXBlXT1cInRlbXBsYXRlVHlwZVwiXHJcbiAgICAgICAgICAgICBbY3VzdG9tTWVudVRlbXBsYXRlXT1cImN1c3RvbU1lbnVUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICBbc2hvd05vSXRlbXNdPVwiIWhpZGVOb01hdGNoZXNcIlxyXG4gICAgICAgICAgICAgW25vRGF0YVRleHRdPVwibm9NYXRjaGVzVGV4dFwiXHJcbiAgICAgICAgICAgICBbaXRlbXNdPVwiZmlsdGVyZWRPcHRpb25zXCJcclxuICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZEl0ZW1cIlxyXG4gICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJzZWxlY3RlZENoYW5nZWQoJGV2ZW50KVwiPjwvZWMtbWVudT5cclxuXHJcbiAgICA8Zm9vdGVyICpuZ0lmPVwidG90YWxSZWNvcmRzICYmIHRvdGFsUmVjb3JkcyA+IGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggJiYgZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgPHNwYW4+e3tmaWx0ZXJlZE9wdGlvbnMubGVuZ3RofX0ge3snb2YnIHwgdHJhbnNsYXRlfX0ge3t0b3RhbFJlY29yZHN9fTwvc3Bhbj5cclxuICAgIDwvZm9vdGVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|