@churchillliving/se-ui-toolkit 6.54.327 → 6.54.329

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.
@@ -1411,11 +1411,11 @@ export class FormComponent {
1411
1411
  overlayPanel?.hide();
1412
1412
  }
1413
1413
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormComponent, deps: [{ token: i1.AuthenticationService }, { token: i2.FormService }, { token: i3.AlertService }, { token: i4.DialogService }, { token: i0.ComponentFactoryResolver }, { token: i5.HyperlinkService }, { token: i0.ChangeDetectorRef }, { token: i6.Router }, { token: i0.ElementRef }, { token: i7.DatePipe }, { token: i8.GridService }, { token: i9.PageLoggerService }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
1414
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: FormComponent, selector: "se-form", inputs: { stickyActions: "stickyActions", form: "form", saveButtonLabel: "saveButtonLabel", cancelButtonLabel: "cancelButtonLabel", hideSaveButton: "hideSaveButton", hideCancelButton: "hideCancelButton", formButtons: "formButtons", loading: "loading", activeTestMode: "activeTestMode" }, outputs: { saveForm: "saveForm", cancelForm: "cancelForm", dropDownChangeEvent: "dropDownChangeEvent", sectionClickedEvent: "sectionClickedEvent" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "viewContainerFormRef", first: true, predicate: ["viewContainerFormRef"], descendants: true }, { propertyName: "dynamicComponentContainer", predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingCopmonent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form && !splitScreen\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" \n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div bottom-0\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i10.Header, selector: "p-header" }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration"] }, { kind: "component", type: i14.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i14.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i15.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i16.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i17.TextInputComponent, selector: "input-control", inputs: ["field"], outputs: ["changePassword", "changeEvent", "clickEvent", "focusEvent"] }, { kind: "component", type: i18.NumericInputComponent, selector: "numeric-control", inputs: ["field"], outputs: ["changeEvent", "selectLookup", "focusOutEvent"] }, { kind: "component", type: i19.CheckboxComponent, selector: "checkbox-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i20.PasswordComponent, selector: "password-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i21.SpacerControlComponent, selector: "spacer-control", inputs: ["formField"] }, { kind: "component", type: i22.TextAreaComponent, selector: "textArea-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i23.CalendarComponent, selector: "calendar-control", inputs: ["defaultDate", "calendarFormat", "formField"], outputs: ["ngModelChange", "onClick", "onFocusOut", "onShow", "onInput"] }, { kind: "component", type: i24.DropdownControlComponent, selector: "dropdown-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "keyupTab"] }, { kind: "component", type: i25.AutoCompleteControlComponent, selector: "autoComplete-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "completeMethod"] }, { kind: "component", type: i26.MultiSelectControlComponent, selector: "multiselect-control", inputs: ["formField"], outputs: ["onChange", "focusOutEvent"] }, { kind: "component", type: i27.HyperlinkControlComponent, selector: "hyperlink-control", inputs: ["formField"], outputs: ["onHyperlinkDialogClick", "onClick", "iframLoadEvent"] }, { kind: "component", type: i28.LookupControlComponent, selector: "lookup-control", inputs: ["formField"], outputs: ["onClick", "onClearLookupValue", "keyupTab"] }, { kind: "component", type: i29.SelectButtonControlComponent, selector: "select-button-control", inputs: ["formField"], outputs: ["onChange", "onFocusOut"] }, { kind: "component", type: i30.NoteDetailControlComponent, selector: "note-detail-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i31.SectionHeaderControlComponent, selector: "section-header-control", inputs: ["formField"] }, { kind: "component", type: i32.AddButtonControlComponent, selector: "add-button-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i33.InputSwitchControlComponent, selector: "Input-switch-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i34.LabelControlComponent, selector: "label-control", inputs: ["formField", "overlayPanel", "labelDisplay"], outputs: ["onMouseEnter", "onMouseLeave", "onClick", "onLoadLabelControlIFrameClick", "onSelectLookupLabelClick"] }, { kind: "component", type: i35.FileUploadComponent, selector: "se-file-upload", inputs: ["acceptFileTypes", "allowMultiple", "fields", "isAzureUpload"], outputs: ["fileUrl", "uploadFileOnReturn"] }, { kind: "component", type: i36.CardComponent, selector: "se-card", inputs: ["data", "width", "height", "card", "setCardData"], outputs: ["selectedCard"] }, { kind: "component", type: i37.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }, { kind: "component", type: i38.SplitterComponent, selector: "se-splitter", inputs: ["panelComponent", "existingCopmonent", "configData"], outputs: ["closePanelEmitter"] }] }); }
1414
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: FormComponent, selector: "se-form", inputs: { stickyActions: "stickyActions", form: "form", saveButtonLabel: "saveButtonLabel", cancelButtonLabel: "cancelButtonLabel", hideSaveButton: "hideSaveButton", hideCancelButton: "hideCancelButton", formButtons: "formButtons", loading: "loading", activeTestMode: "activeTestMode" }, outputs: { saveForm: "saveForm", cancelForm: "cancelForm", dropDownChangeEvent: "dropDownChangeEvent", sectionClickedEvent: "sectionClickedEvent" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "viewContainerFormRef", first: true, predicate: ["viewContainerFormRef"], descendants: true }, { propertyName: "dynamicComponentContainer", predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingCopmonent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form && !splitScreen\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" \n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i10.Header, selector: "p-header" }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration"] }, { kind: "component", type: i14.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i14.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i15.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i16.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i17.TextInputComponent, selector: "input-control", inputs: ["field"], outputs: ["changePassword", "changeEvent", "clickEvent", "focusEvent"] }, { kind: "component", type: i18.NumericInputComponent, selector: "numeric-control", inputs: ["field"], outputs: ["changeEvent", "selectLookup", "focusOutEvent"] }, { kind: "component", type: i19.CheckboxComponent, selector: "checkbox-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i20.PasswordComponent, selector: "password-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i21.SpacerControlComponent, selector: "spacer-control", inputs: ["formField"] }, { kind: "component", type: i22.TextAreaComponent, selector: "textArea-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i23.CalendarComponent, selector: "calendar-control", inputs: ["defaultDate", "calendarFormat", "formField"], outputs: ["ngModelChange", "onClick", "onFocusOut", "onShow", "onInput"] }, { kind: "component", type: i24.DropdownControlComponent, selector: "dropdown-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "keyupTab"] }, { kind: "component", type: i25.AutoCompleteControlComponent, selector: "autoComplete-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "completeMethod"] }, { kind: "component", type: i26.MultiSelectControlComponent, selector: "multiselect-control", inputs: ["formField"], outputs: ["onChange", "focusOutEvent"] }, { kind: "component", type: i27.HyperlinkControlComponent, selector: "hyperlink-control", inputs: ["formField"], outputs: ["onHyperlinkDialogClick", "onClick", "iframLoadEvent"] }, { kind: "component", type: i28.LookupControlComponent, selector: "lookup-control", inputs: ["formField"], outputs: ["onClick", "onClearLookupValue", "keyupTab"] }, { kind: "component", type: i29.SelectButtonControlComponent, selector: "select-button-control", inputs: ["formField"], outputs: ["onChange", "onFocusOut"] }, { kind: "component", type: i30.NoteDetailControlComponent, selector: "note-detail-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i31.SectionHeaderControlComponent, selector: "section-header-control", inputs: ["formField"] }, { kind: "component", type: i32.AddButtonControlComponent, selector: "add-button-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i33.InputSwitchControlComponent, selector: "Input-switch-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i34.LabelControlComponent, selector: "label-control", inputs: ["formField", "overlayPanel", "labelDisplay"], outputs: ["onMouseEnter", "onMouseLeave", "onClick", "onLoadLabelControlIFrameClick", "onSelectLookupLabelClick"] }, { kind: "component", type: i35.FileUploadComponent, selector: "se-file-upload", inputs: ["acceptFileTypes", "allowMultiple", "fields", "isAzureUpload"], outputs: ["fileUrl", "uploadFileOnReturn"] }, { kind: "component", type: i36.CardComponent, selector: "se-card", inputs: ["data", "width", "height", "card", "setCardData"], outputs: ["selectedCard"] }, { kind: "component", type: i37.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }, { kind: "component", type: i38.SplitterComponent, selector: "se-splitter", inputs: ["panelComponent", "existingCopmonent", "configData"], outputs: ["closePanelEmitter"] }] }); }
1415
1415
  }
1416
1416
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormComponent, decorators: [{
1417
1417
  type: Component,
1418
- args: [{ selector: 'se-form', template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingCopmonent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form && !splitScreen\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" \n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div bottom-0\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"] }]
1418
+ args: [{ selector: 'se-form', template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingCopmonent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form && !splitScreen\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" \n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"] }]
1419
1419
  }], ctorParameters: function () { return [{ type: i1.AuthenticationService }, { type: i2.FormService }, { type: i3.AlertService }, { type: i4.DialogService }, { type: i0.ComponentFactoryResolver }, { type: i5.HyperlinkService }, { type: i0.ChangeDetectorRef }, { type: i6.Router }, { type: i0.ElementRef }, { type: i7.DatePipe }, { type: i8.GridService }, { type: i9.PageLoggerService }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { panelOverlayViewContainer: [{
1420
1420
  type: ViewChild,
1421
1421
  args: ['viewContainerRef', { read: ViewContainerRef, static: true }]
@@ -1455,4 +1455,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
1455
1455
  type: HostListener,
1456
1456
  args: ['window:beforeunload', ['$event']]
1457
1457
  }] } });
1458
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVF0QyxNQUFNLE9BQU8sYUFBYTtJQW9CeEIsSUFBYSxjQUFjLENBQUMsR0FBUTtRQUNsQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDaEIsUUFBUSxDQUFDO1NB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U0FBUzsrY0FNWix5QkFBeUI7c0JBRC9CLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFDLElBQUksRUFBQztnQkFHcEUseUJBQXlCO3NCQUR4QixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUdsQyxvQkFBb0I7c0JBQXRELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUV4QixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFLTyxjQUFjO3NCQUExQixLQUFLO2dCQUtJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQStDUCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgQ29tcG9uZW50RmFjdG9yeSwgVmlld0NvbnRhaW5lclJlZiwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBSZW5kZXJlcjIsIE5nWm9uZSwgVmlld0NoaWxkLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlLCBEeW5hbWljRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7IE5vdGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL25vdGVzL25vdGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFRm9ybUNvbnRyb2wsIEVIeXBlcmxpbmssIElGb3JtRmllbGQsIElEeW5hbWljRm9ybSwgSUZvcm1TZWN0aW9uLCBFVmFsaWRhdG9yLCBJRHluYW1pY0NhcmQsIElGb3JtQnV0dG9uLCBFRm9ybWF0VHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsJztcbmltcG9ydCB7IEVQZXJtaXNzaW9uVHlwZSwgSVBlcm1pc3Npb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdXNlci1pbmZvLm1vZGVsJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgdXRpbGl0aWVzIGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdGllcy5zZXJ2aWNlJztcbmltcG9ydCB7IElmcmFtZUNvbXBvbmVudCB9IGZyb20gJy4uL2lmcmFtZS9pZnJhbWUuY29tcG9uZW50JztcbmltcG9ydCB7IElEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbW1vbi5tb2RlbCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgR3JpZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnZUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh5cGVybGlua1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9oeXBlcmxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBkcmFnZ2FibGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSU92ZXJsYXlQYW5lbERhdGEgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJSZWYnLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOnRydWV9KVxuICBwdWJsaWMgcGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZHJlbignZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj47XG5cbiAgQFZpZXdDaGlsZCgndmlld0NvbnRhaW5lckZvcm1SZWYnKSB2aWV3Q29udGFpbmVyRm9ybVJlZiE6IEVsZW1lbnRSZWY7XG4gIFxuICBASW5wdXQoKSBzdGlja3lBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZm9ybTogSUR5bmFtaWNGb3JtO1xuICBASW5wdXQoKSBzYXZlQnV0dG9uTGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBjYW5jZWxCdXR0b25MYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGhpZGVTYXZlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhpZGVDYW5jZWxCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZm9ybUJ1dHRvbnM6IElGb3JtQnV0dG9uW10gPSBbXTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG92ZXJsYXlQYW5lbFN0eWxlOiB7fTtcbiAgcGFuZWxJbmZvOiBhbnk7XG4gIFxuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpIHNhdmVGb3JtOiBFdmVudEVtaXR0ZXI8SUZvcm1TZWN0aW9uW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRm9ybTogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRyb3BEb3duQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VjdGlvbkNsaWNrZWRFdmVudDogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZHluYW1pY0Nhc2UgPSBFRm9ybUNvbnRyb2w7XG4gIHNhdmVGb3JtUGFnZTogU3Vic2NyaXB0aW9uO1xuICBwZXJtaXNzaW9uVHlwZSA9IEVQZXJtaXNzaW9uVHlwZTtcbiAgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gIGlzRm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRm9ybUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjb21wb25lbnRzTGlzdDogSURpY3Rpb25hcnlbXSA9IFtdO1xuICBmaWxlVXBsb2FkVXJsczogYW55O1xuICBzaG93ZmlsZVVwbG9hZEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGNhcmRMaXN0OiBJRHluYW1pY0NhcmQ7XG4gIGNhbGVuZGFyUHJldmlvdXNWYWx1ZTogc3RyaW5nID0gJyc7XG4gIGRlZmF1bHREYXRlOiBzdHJpbmcgPSAnJztcbiAgbG9va3VwRm9jdXNPdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2FsZW5kYXJGb3JtYXQ6IHN0cmluZyA9ICdtbS9kZC95eSc7XG4gIHNldENhcmREYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHNwbGl0U2NyZWVuIDogYm9vbGVhbj0gZmFsc2U7XG4gIGRpYWxvZ1JlZjogYW55O1xuXG4gIC8vIGFwcGx5IGNoZWNrZWQvdW5DaGVja2VkIHByb3AgZm9yIENoZWNrQm94IG9mIHRoZSBGb3JtXG4gIGNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICB1bkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtU2VydmljZTogRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgaHlwZXJsaW5rU2VydmljZSA6IEh5cGVybGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2VMb2dnZXJTZXJ2aWNlOiBQYWdlTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgLy8gYnJvd3NlciB0YWIgY2xvc2UgZXZlbnRcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcsIFsnJGV2ZW50J10pXG4gIGJlZm9yZXVubG9hZEhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCB8fCB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgLy8gdGhpcy5mb3JtU2VydmljZS5zZXRUb29sdGlwKCk7XG4gICAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zIG9uIGZvcm1cbiAgICB0aGlzLnJvbGVzID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyUm9sZXMoKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgLy8gc3RhcnQgY2FyZExpc3QgcmVmZXJlbmNlIGJyZWFrIGZ1bmN0aW9uYWxpdHlcbiAgICAgIGxldCBmb3JtVmFsdWVzID0geyAuLi50aGlzLmZvcm0gfTtcblxuICAgICAgZm9ybVZhbHVlcy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBpZihmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM/Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzLmZvckVhY2goKGhlYWRlckZpZWxkKT0+e1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrRmllbGRSZXF1aXJlZChoZWFkZXJGaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmlzUGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgZmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdGltZSBpbnRvIGRhdGVcbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmIGZpZWxkPy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICBmaWVsZFsncHJldmlvdXNWYWx1ZSddID0gZmllbGQ/LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmXG4gICAgICAgICAgICAgIGZpZWxkPy50aW1lT25seSAmJlxuICAgICAgICAgICAgICAoZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkFVVE9DT01QTEVURSAmJlxuICAgICAgICAgICAgICBmaWVsZD8udmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZD8udmFsdWUubWFwKFxuICAgICAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB2YWx1ZVtmaWVsZD8uZGlzcGxheUZpZWxkXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgICAgICAodmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSB8fFxuICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCcsJywgJzsnKVxuICAgICAgICAgICAgICAgICAgPy5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZD8uZGlzcGxheUZpZWxkXTogdmFsIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCB0aGUgbXVsdGlTZWxlY3Qgc3RyaW5nIHZhbHVlIGluIGFycmF5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMqLFxccyovZywgXCIsXCIpPy50b1N0cmluZygpPy5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gW2ZpZWxkLnZhbHVlXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSB7fTtcbiAgICAgICAgICAgICAgZmllbGQ/LmNhcmQ/LmRhdGE/LmZvckVhY2goKHg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHguZHluYW1pY0Zvcm0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uczogSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtVmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5kIGNhcmRMaXN0IHJlZmVyZW5jZSBicmVhayBmdW5jdGlvbmFsaXR5XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3knIHx8XG4gICAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCkgPT09ICcxJ1xuICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlVc2VyUGVybWlzc2lvbnMoKTtcbiAgICAgIHRoaXMucmVtb3ZlV2hpdGVTcGFjZXMoKTtcbiAgICAgIHRoaXMuc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKTtcbiAgICAgIHRoaXMuc2V0Q2FsYW5kZXJXaWR0aCgpO1xuICAgICAgdGhpcy5vcmRlckZvcm1TZWN0aW9ucygpO1xuICAgICAgdGhpcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKTtcbiAgICAgIHRoaXMubGlzdGVuVG9TcGxpdFNjcmVlbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBvcmRlckZvcm1TZWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5mb3JtICYmIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VySW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0N1cnJlbnRVc2VySW5mbycpKTtcbiAgICAgIGxldCB1c2VyU2VjdGlvbiA9IGN1cnJlbnRVc2VySW5mbz8ucGFnZVNlY3Rpb25zPy5sZW5ndGggPiAwID8gY3VycmVudFVzZXJJbmZvLnBhZ2VTZWN0aW9ucyA6IFtdO1xuICAgICAgY29uc3QgcGFnZVVybCA9IHRoaXMucGFnZU5hbWUoKTtcbiAgICAgIGlmICh1c2VyU2VjdGlvbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICB1c2VyU2VjdGlvbiA9IHVzZXJTZWN0aW9uLnNvcnQoKGEsIGIpID0+IGIuaWQgLSBhLmlkKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJ1c2VyU2VjdGlvbjpcIiwgdXNlclNlY3Rpb24pXG4gICAgICAgIHVzZXJTZWN0aW9uLmZvckVhY2goKHBhZ2VTZWN0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZE5hbWU6IGJvb2xlYW4gPSB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5zb21lKChzZWN0aW9uKSA9PiBwYWdlU2VjdGlvbj8uc2VjdGlvbj8udG9Mb3dlckNhc2UoKSA9PT0gc2VjdGlvbj8ubmFtZT8udG9Mb3dlckNhc2UoKSkgJiYgcGFnZVNlY3Rpb24/LnBhZ2U/LnRvTG93ZXJDYXNlKCkgPT09IHBhZ2VVcmw/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKG1hdGNoZWROYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZpbmRJbmRleCgoc2VjdGlvbikgPT4gcGFnZVNlY3Rpb24/LnNlY3Rpb24/LnRvTG93ZXJDYXNlKCkgPT09IHNlY3Rpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgaWYgKHBhZ2VTZWN0aW9uLnJvbGUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZXM/Lmxlbmd0aCA+IDAgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhwYWdlU2VjdGlvbi5yb2xlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3dhcFNlY3Rpb25zKHBhZ2VTZWN0aW9uLm9yZGVyIC0gMSwgaW5kZXgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dhcFNlY3Rpb25zKHBhZ2VTZWN0aW9uLm9yZGVyIC0gMSwgaW5kZXgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuICBzd2FwU2VjdGlvbnMob3JkZXI6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlT3JkZXJTZWN0aW9uID0geyAuLi50aGlzLmZvcm0uZm9ybVNlY3Rpb25zW29yZGVyXSB9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbb3JkZXJdID0gdGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tpbmRleF07XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tpbmRleF0gPSByZU9yZGVyU2VjdGlvbjtcbiAgfVxuICBwYWdlTmFtZSgpIHtcbiAgICBsZXQgdXJsID0gdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSk7XG4gICAgaWYgKHVybD8uaW5jbHVkZXMoJz8nKSkge1xuICAgICAgdXJsID0gdXJsLnNwbGl0KCc/JylbMF07XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgc2V0Rm9ybVNlY3Rpb24oc2VjdGlvbiwgaW5kZXgsIHBhZ2VTZWN0aW9uKSB7XG4gICAgY29uc3QgcmVPcmRlclNlY3Rpb24gPSB7IC4uLnNlY3Rpb24gfTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5zcGxpY2UocGFnZVNlY3Rpb24/Lm9yZGVyIC0gMSwgMCwgcmVPcmRlclNlY3Rpb24pO1xuICB9XG4gIGNoZWNrRmllbGRSZXF1aXJlZChmaWVsZDogYW55KSB7XG4gICBpZihmaWVsZC52YWxpZGF0aW9ucz8uZmluZCh2YWxpZGF0aW9uPT52YWxpZGF0aW9uLnR5cGU9PT1FVmFsaWRhdG9yLlJFUVVJUkVEKSl7XG4gICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbiAgIH1cbiAgfVxuXG4gIC8vIHNldCBjYWxlbmRhciAyIE9yIDQgZGlnaXQgeWVhciBmb3JtYXRcbiAgY2FsZW5kYXJJbnB1dFZhbHVlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmKCFmb3JtRmllbGQudGltZU9ubHkpe1xuICAgICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGZvcm1GaWVsZC5maWVsZClbMF1cbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAodmFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF2YWw/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgICBpZiAodmFsPy50YXJnZXQ/LnZhbHVlPy5sZW5ndGggPT0gOCB8fCBmb3JtRmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gRUZvcm1hdFR5cGUuU0hPUlREQVRFKSB7XG4gICAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KShcXGR7Mn0pKFxcZHs0fSkvLCAnJDEvJDIvJDMnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodmFsPy50YXJnZXQ/LnZhbHVlLmxlbmd0aCA9PSA2KSB7XG4gICAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KSg/PVxcZCkvZywgJyQxLycpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB2YWw/LnRhcmdldD8udmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHllYXIgPSB2YWw/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCkuc3BsaXQoJy8nKVsyXTtcbiAgICAgICAgaWYgKHllYXI/Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IG5ldyBEYXRlKHZhbD8udGFyZ2V0Py52YWx1ZSk/LnRvTG9jYWxlRGF0ZVN0cmluZyhcbiAgICAgICAgICAgICdlbi1VUydcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXI/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveSc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAgXG4gIH1cblxuICAvLyBzZXQgcGVyY2VudCBhbmQgZGVjaW1hbCB2YWx1ZXNcbiAgc2V0bnVtZXJpY3ZhbHVlcygpIHtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5OVU1FUklDKSB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gZmllbGQ/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICAgKGZpZWxkLnZhbHVlICogMTAwKT8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICApLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlICogMTAwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoXG4gICAgICAgICAgICAgICAgICBkaWdpdHNJbmZvID8gZGlnaXRzSW5mbyA6IDJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBmb3JtIGhhcyBhbnkgZmllbGQgd2l0aCBkeW5hbWljIGNvbXBvbmVudDtcbiAgICogQ3JlYXRlcyBjb21wb25lbnQgaW5zdGFuY2UgdXNpbmcgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAqIEluamVjdHMgY29tcG9uZW50IHRocm91Z2ggdmlld1JlZi5jcmVhdGVDb21wb25lbnQoKVxuICAgKiBQYXNzZXMgZGF0YSB0byBjb21wb25lbnRcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgZXZlbnRzIHBhc3NlZCB0byB0aGUgY29tcG9uZW50c1xuICAgKiBGaW5hbGx5IGZvcmNlcyBBbmd1bGFyIHRvIGRldGVjaCBjaGFuZ2VzXG4gICAqL1xuICBsb2FkU3BsaXRWaWV3KCl7XG4vL2lmIHNob3VsZCBkeW5taWNhbGx5IGNyZWF0ZSBjb21wb25lbnQgaW5zdGVhZCBvZiBuZ0lmIGluIHRoZSBodG1sIGZvciBzcGxpdCBjb21wb25lbnRcbiAgfVxuICBsb2FkRHluYW1pY0NvbXBvbmVudHMoKSB7XG4gICAgdGhpcy5jb21wb25lbnRzTGlzdCA9IFtdO1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnksIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DT01QT05FTlQpIHtcbiAgICAgICAgICBjb25zdCB2aWV3UmVmOiBhbnkgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRDb250YWluZXIuZmluZChcbiAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICB4LmVsZW1lbnQubmF0aXZlRWxlbWVudC5pZCA9PSBgJHtmb3JtU2VjdGlvbi5uYW1lfS0ke2ZpZWxkSW5kZXh9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY29tcG9uZW50OiBDb21wb25lbnQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgaGFuZGxlcnMsXG4gICAgICAgICAgfSA9IGZpZWxkLmNvbXBvbmVudENvbnRyb2w7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxhbnk+ID1cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KENvbXBvbmVudCk7XG4gICAgICAgICAgLy8gUGFzc2luZyBkYXRhIHRvIGNvbXBvbmVudFxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHZpZXdSZWY/LmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICBpZihmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQpe1xuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyhjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgZmllbGQuY29tcG9uZW50Q29udHJvbC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhID8/IHt9KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgbmFtZTogZmllbGQuY29tcG9uZW50Q29udHJvbD8uaWQsXG4gICAgICAgICAgICAgIHZhbHVlOiBjb21wb25lbnRSZWYsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFN1YnNjcmliZXMgdG8gdGhlIGV2ZW50cyBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVycykuZm9yRWFjaCgoW2V2ZW50LCBoYW5kbGVyXTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtldmVudF0gYXMgRXZlbnRFbWl0dGVyPGFueT4pPy5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGludm9rZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vaW52b2tlIHdoZW4gZmlsZSB1cGxvYWQgT1IgZGVsZXRlIGEgZmlsZVxuICBmaWxlT25jaGFuZ2VFdmVudCgpIHtcbiAgICB0aGlzLnNldENhcmREYXRhID0gIXRoaXMuc2V0Q2FyZERhdGE7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gbG9hZCBkeW5hbWljIGNvbXBvbmVudHMgaWYgZXhpc3QgaW4gZm9ybVxuICAgIHRoaXMuc2V0bnVtZXJpY3ZhbHVlcygpO1xuICAgIHRoaXMub25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCk7XG4gICAgdGhpcy5saXN0ZW5Ub1NwbGl0U2NyZWVuQ2hhbmdlKCk7XG4gICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudHMoKTtcbiAgICB0aGlzLnNldENhcmRSZXNwb25zZUlkKCk7XG4gIH1cblxuICBzZXRDYXJkUmVzcG9uc2VJZCgpIHtcbiAgICB1dGlsaXRpZXMub25EeW5hbWljQ2FyZFN0YXRlQ2hhbmdlKCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmKHJlcy5kYXRhPy5pc1NhdmUpe1xuICAgICAgICB0aGlzLnNldENhcmRJZHMocmVzLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXREZWxldGVDYXJkSWQocmVzLmRhdGE/LmNhcmREYXRhLCByZXMuZGF0YT8uZHluYW1pY0Zvcm0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0RGVsZXRlQ2FyZElkKHVwZGF0ZWRDYXJkRGF0YTphbnksIGR5bmFtaWNGb3JtOiBJRHluYW1pY0Zvcm0pe1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChzZWN0aW9uOklGb3JtU2VjdGlvbik9PntcbiAgICAgIGNvbnN0IGNhcmRDb250cm9sID0gc2VjdGlvbi5maWVsZHMuZmluZCgoZmllbGQ6SUZvcm1GaWVsZCk9PiBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCk7XG4gICAgICBpZihjYXJkQ29udHJvbCl7XG4gICAgICAgIGNhcmRDb250cm9sLmNhcmQuZGF0YSA9IHVwZGF0ZWRDYXJkRGF0YTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZHluYW1pY0Zvcm0gPSB0aGlzLmZvcm07XG4gIH1cblxuICBzZXRDYXJkSWRzKHJlcykge1xuICAgIHJlcy5yZWNvcmRzID0gdGhpcy5ncmlkU2VydmljZS5zZXREYXRhRmllbGRzKHJlcy5yZWNvcmRzKTtcbiAgICByZXMucmVjb3Jkcz8uZm9yRWFjaCgocmVjb3JkOiBhbnksIHJlY29yZEluZGV4OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoQ2FyZCA9IHJlcy5jYXJkc0luZm8/LmZpbmQoXG4gICAgICAgIChpbmZvLCBjYXJkSW5kZXgpID0+XG4gICAgICAgICAgcmVjb3JkSW5kZXggPT09IGNhcmRJbmRleCAmJiByZWNvcmRbcmVzLmZpZWxkTmFtZT8udG9Mb3dlckNhc2UoKV1cbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hDYXJkICYmIE9iamVjdC5rZXlzKG1hdGNoQ2FyZCk/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbWF0Y2hDYXJkW3Jlcy5maWVsZE5hbWVdID0gcmVjb3JkW3Jlcy5maWVsZE5hbWU/LnRvTG93ZXJDYXNlKCldO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZDtcbiAgICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmKHJlcy5jYXJkSWQpe1xuICAgICAgICAgIGZvcm1GaWVsZCA9IGZvcm1TZWN0aW9uLmZpZWxkcz8uZmluZChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQgJiYgZmllbGQuaWQgPT09IHJlcy5jYXJkSWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1GaWVsZCA9IGZvcm1TZWN0aW9uLmZpZWxkcz8uZmluZChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZm9ybUZpZWxkKSB7XG4gICAgICAgICAgaWYgKHJlcy5jYXJkc0luZm8/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlcy5jYXJkc0luZm8/LmZvckVhY2goKGNhcmRJZCkgPT4ge1xuICAgICAgICAgICAgICBjYXJkSWQuaWQgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvcm1GaWVsZC5jYXJkLmRhdGEgPSByZXMuY2FyZHNJbmZvO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXRDYXJkRGF0YSA9ICF0aGlzLnNldENhcmREYXRhO1xuICB9XG5cbiAgcmVtb3ZlV2hpdGVTcGFjZXMoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLmNsYXNzKSBzZWN0aW9uLmNsYXNzID0gc2VjdGlvbi5jbGFzcy5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5IWVBFUkxJTksgJiZcbiAgICAgICAgICBmaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5yZXNldENvbmZpZyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGg6ICdoeXBlcmxpbmsnICsgZmllbGQubGFiZWwsXG4gICAgICAgICAgICAgIGNvbXBvbmVudDogZmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLnJvdXRlci5jb25maWcsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYnJvd3NlclRhYkNsb3NlRXZlbnQoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZXZlbnQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpe1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG4gIGxpc3RlblRvU3BsaXRTY3JlZW5DaGFuZ2UoKXtcbiAgICB1dGlsaXRpZXMub25TY3JlZW5TcGxpdENoYW5nZSgpLnN1YnNjcmliZShyZXM9PntcbiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWVzKCk7XG4gICAgICB0aGlzLnBhbmVsSW5mbyA9IHt9O1xuICAgICAgdGhpcy5wYW5lbEluZm8ucGFuZWxDb21wb25lbnQgPSByZXMucGFuZWxDb21wb25lbnQ7XG4gICAgICB0aGlzLnBhbmVsSW5mby5jb25maWdEYXRhID0gcmVzLmNvbmZpZ0RhdGE7XG4gICAgICB0aGlzLnBhbmVsSW5mby5leGlzdGluZ0NvcG1vbmVudCA9ICB0aGlzLnZpZXdDb250YWluZXJGb3JtUmVmPy5uYXRpdmVFbGVtZW50Py5pbm5lckhUTUw7XG4gICAgICB0aGlzLnNwbGl0U2NyZWVuID0gdHJ1ZTtcbiAgICB9KVxuICB9XG5cbiAgc3luY0lucHV0VmFsdWVzKCkge1xuICAgIGNvbnN0IGlucHV0cyA9IHRoaXMudmlld0NvbnRhaW5lckZvcm1SZWY/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cInRleHRcIl0nKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCBpbnB1dC52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbmNsb3NlUGFuZWwoKXtcbiAgdGhpcy5zcGxpdFNjcmVlbiA9IGZhbHNlO1xufVxuICAvKipcbiAgICogTGlzdGVucyBhbnkgY2hhbmdlIGluIER5bmFtaWMgRm9ybSBjb21wb25lbnQgU3RhdGVcbiAgICovXG5cbiAgb25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdXRpbGl0aWVzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5pZCAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZk9iaiA9IHRoaXMuY29tcG9uZW50c0xpc3QuZmluZChcbiAgICAgICAgICAoeCkgPT4geC5uYW1lID09PSByZXNwb25zZS5pZFxuICAgICAgICApO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmT2JqKSB7XG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuZGF0YSA/PyB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBjb21wb25lbnRSZWZPYmoudmFsdWUuaW5zdGFuY2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmKHJlc3BvbnNlPy5sb2FkQ29tcG9uZW50KXtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZk9iai52YWx1ZS5pbnN0YW5jZS5uZ09uSW5pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnNcbiAgYXBwbHlVc2VyUGVybWlzc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKSB7XG4gICAgICBsZXQgdG90YWxGaWVsZHM6IG51bWJlciA9IDA7XG4gICAgICBsZXQgZGlzYWJsZWRGaWVsZHM6IG51bWJlciA9IDA7XG4gICAgICBsZXQgaGlkZGVuRmllbGRzOiBudW1iZXIgPSAwO1xuXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGVybWlzc2lvbnM6IGFueSA9IGZvcm1GaWVsZC5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGxldCBzZWN0aW9uUGVybWlzc2lvbnM6IGFueSA9IFtdO1xuICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9ucykgc2VjdGlvblBlcm1pc3Npb25zID0gZm9ybVNlY3Rpb24ucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBpZiAoIXBlcm1pc3Npb25zKSBwZXJtaXNzaW9ucyA9IHRoaXMuZm9ybS5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGxldCBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChzZWN0aW9uUGVybWlzc2lvbnMgJiYgc2VjdGlvblBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc2VjdGlvblBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb25zICYmIHBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbi5yb2xlcyAmJiBwZXJtaXNzaW9uLnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLlZJRVcgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc1ZhbGlkRWRpdFBlcm1pc3Npb25cbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuRURJVCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQucGVybWlzc2lvbnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5wZXJtaXNzaW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtU2VjdGlvbi5kaXNhYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvdGFsRmllbGRzKys7XG5cbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgZGlzYWJsZWRGaWVsZHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZGVuRmllbGRzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmlzRm9ybURpc2FibGVkID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBkaXNhYmxlZEZpZWxkcztcbiAgICAgIHRoaXMuaXNGb3JtSGlkZGVuID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBoaWRkZW5GaWVsZHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gSUZyYW1lIGluIGh5cGVybGluayBDb250cm9sXG4gICAqL1xuICBzZWN0aW9uRGlzYWJsZWQoZm9ybVNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIGlmIChmb3JtU2VjdGlvbi5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYoZm9ybVNlY3Rpb24uZGlzYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFNlY3Rpb25GaWVsZHMoZm9ybVNlY3Rpb24sIGZhbHNlKTtcbiAgICB9ZWxzZSB7XG4gICAgICByZXR1cm4gZm9ybVNlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uOiBJRm9ybVNlY3Rpb24sIGRpc2FibGVkOiBib29sZWFuKXtcbiAgICBmb3JtU2VjdGlvbi5maWVsZHMubWFwKChmaWVsZDogSUZvcm1GaWVsZCkgPT4ge1xuICAgICAgZmllbGQuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybVNlY3Rpb247XG4gIH1cblxuICBsb2FkSUZyYW1lKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMuaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiAnSHlwZXJsaW5rJyxcbiAgICAgIHdpZHRoOiBmb3JtRmllbGQuaHlwZXJsaW5rPy53aWR0aCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggOiAnOTAlJyxcbiAgICAgIGhlaWdodDogZm9ybUZpZWxkLmh5cGVybGluaz8uaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgIGRhdGE6IHsgdmFsdWU6IGZvcm1GaWVsZC5oeXBlcmxpbms/LmxpbmssIGlGcmFtZUlkOiBmb3JtRmllbGQubGFiZWwgfSxcbiAgICB9KTtcbiAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYocmVmKTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkKTtcbiAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBpZiAoZm9ybUZpZWxkLm9uUmV0dXJuKSB7XG4gICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIERpYWxvZyBpbiBoeXBlcmxpbmsgQ29udHJvbFxuICAgKi9cbiAgaHlwZXJsaW5rRGlhbG9nKGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgZm9ybUZpZWxkOiBJRm9ybUZpZWxkID0gZXZlbnQuZm9ybUZpZWxkO1xuICAgIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuQkxBTkspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zO1xuICAgICAgd2luZG93Lm9wZW4oJ2h5cGVybGluaycgKyBmb3JtRmllbGQubGFiZWwpO1xuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLlNFTEYpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnaHlwZXJsaW5rJyArIGZvcm1GaWVsZC5sYWJlbF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuRElBTE9HKSB7XG4gICAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgICAgaWYgKChldmVudCAmJiBldmVudC5ldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50KSB8fCBmb3JtRmllbGQub3BlbkluTmV3VGFiKSB7XG4gICAgICAgIHRoaXMuaHlwZXJsaW5rU2VydmljZS5vcGVuRGlhbG9nSW5OZXdUYWIoZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQsIGZvcm1GaWVsZC5oeXBlcmxpbms/LnBhcmFtcyk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbihmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCwge1xuICAgICAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgID8gZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgd2lkdGg6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoIDogJycsXG4gICAgICAgICAgc3R5bGU6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyB7fSA6IHsgJ21heC13aWR0aCc6ICdmaXQtY29udGVudCcgfSxcbiAgICAgICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgICAgICBkYXRhOiBmb3JtRmllbGQuaHlwZXJsaW5rLnBhcmFtc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGZvcm1GaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBJZnJhbWUgb24gTGFiZWxcbiAgICovXG4gIGxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoXG4gICAgICAgIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rPy5oZWlnaHRcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodFxuICAgICAgICA6ICc4MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmxpbmtcbiAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLmxpbmtcbiAgICAgICAgICA6ICcnLFxuICAgICAgICBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAnSWZyYW1lQ29tcG9uZW50J1xuICAgICk7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLm9uQ2xpY2spIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpbmQgdGhlIHJlcXVpcmVkIGZpZWxkIGluIGZvcm1cbiAgICovXG4vLyAgIGFwcGx5UmVxdWlyZWRGaWVsZFZhbGlkYXRpb24oKSB7XG4vLyBjb25zb2xlLmxvZygnYXBwbHlpbmcgcmVxdWlyZWRmaWxlZCB2YWxpZGF0aW9ucycpXG4vLyAgICAgaWYgKFxuLy8gICAgICAgdGhpcy5mb3JtICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDBcbi8vICAgICApIHtcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuLy8gICAgICAgICBzZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsIGZpZWxkKVxuLy8gICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4vLyAgICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZCkgPT4ge1xuLy8gICAgICAgICAgICAgICBpZiAodmFsaWQudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsZmllbGQsJ2lzIHJlcXVpcmVkJylcbi8vICAgICAgICAgICAgICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICB9KTtcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfVxuXG4gIHNldEZpbGVVcmxzKGZpbGVVcmxzOiBhbnkpIHtcbiAgICBpZiAoZmlsZVVybHMgJiYgZmlsZVVybHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5maWxlVXBsb2FkVXJscyA9IGZpbGVVcmxzO1xuICAgICAgdGhpcy5zaG93ZmlsZVVwbG9hZEVycm9yID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGaWVsZHNWYWxpdGlvbnMoZmllbGRzOiBJRm9ybUZpZWxkW10pe1xuICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzID0gJyc7XG4gICAgbGV0IHZhbGlkaXR5ID0gdHJ1ZTtcbiAgICBpZiAoZmllbGRzKSB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmaWVsZHMpKSB7XG4gICAgICAgIGZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAvLyBzZXQgdXBsb2FkRmlsZSBVUkwgaW4gRm9ybUZpZWxkIGluIGNhc2Ugb2YgRklMRV9VUExPQURcbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5GSUxFX1VQTE9BRCkge1xuICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5maWxlVXBsb2FkVXJscztcblxuICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHgudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCAmJiAhZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dmaWxlVXBsb2FkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICBpZiAoZmllbGQuY2FyZCAmJiBmaWVsZC5jYXJkLmRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZERhdGEgPSBmaWVsZC5jYXJkLmRhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAoeDogYW55KSA9PiB4LnNlbGVjdGVkQ2FyZCAmJiB4LnNlbGVjdGVkQ2FyZC5sZW5ndGggPiAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0YSAmJiBzZWxlY3RlZERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBmaWVsZC5jYXJkLmRhdGEgPSBzZWxlY3RlZERhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRpdHk7XG4gIH1cbiAgb25TYXZlRm9ybSgpIHtcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIGxldCBpc0FsbEZpZWxkc1ZhbGlkID0gW107XG4gICAgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICBsZXQgbXVsaVNlbGVjdFZhbHVlID0ge307XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNBbGxGaWVsZHNWYWxpZC5wdXNoKHRoaXMuY2hlY2tGaWVsZHNWYWxpdGlvbnMoZm9ybVNlY3Rpb24uZmllbGRzKSk7XG4gICAgICAgIHZhbGlkaXR5ID0gaXNBbGxGaWVsZHNWYWxpZC5ldmVyeSgoZmllbGQpID0+IGZpZWxkID09IHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhbGlkaXR5ID0gdGhpcy5jaGVja0ZpZWxkc1ZhbGl0aW9ucyhmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHMpO1xuICAgICAgICBpc0FsbEZpZWxkc1ZhbGlkLnB1c2godGhpcy5jaGVja0ZpZWxkc1ZhbGl0aW9ucyhmb3JtU2VjdGlvbi5maWVsZHMpKTtcbiAgICAgICAgdmFsaWRpdHkgPSBpc0FsbEZpZWxkc1ZhbGlkLmV2ZXJ5KChmaWVsZCkgPT4gZmllbGQgPT0gdHJ1ZSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICBpZiAodmFsaWRpdHkpIHtcbiAgICAgIC8vIFNhdmUgZ3JpZCBvbiBmb3JtU2F2ZSBCdXR0b25cbiAgICAgIGxldCBjdXN0b21Db21wb25lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIGxldCB0ZW1wVmFsdWU6IGFueSA9IFtdO1xuICAgICAgbGV0IHNhdmVBbGxHcmlkOiBhbnkgPSBbXTtcbiAgICAgIGxldCBnZXRCdG5zOiBhbnkgPSBbXTtcbiAgICAgIC8vIHNldCB2YWx1ZSBhcyAxIG9yIDAgaW4gY2FzZSBvZiBjaGVja2JveFxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcyAmJiB2YWxpZGl0eSkge1xuICAgICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQudmFsdWUgPT09ICcnIHx8IGZpZWxkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb252ZXJ0IGRhdGUgaW50byB0aW1lIGFzIHN0cmluZ1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQudGltZU9ubHkgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykgfHwgZmllbGQudmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1BNJykpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKGZpZWxkLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZmllbGQuc2hvd1RpbWUpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAneXl5eS1NTS1kZCBISDptbTpzcycpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ0FNJykgJiZcbiAgICAgICAgICAgICAgICAhZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCdQTScpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZC52YWx1ZSwgJ2hoOm1tIGEnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTlVNRVJJQykge1xuICAgICAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gZmllbGQ/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRWYWx1ZSA9IGZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLicpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjYWxjdWxhdGVkVmFsdWUgPyBmaWVsZC52YWx1ZSA6IGZpZWxkLnZhbHVlIC8gMTAwKT8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcuJykgJiYgIWNhbGN1bGF0ZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBvZiBhdXRvQ29tcGxldGUgYXMgc3RyaW5nc1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgICAgICAgICFmaWVsZC5zaG93QWxsVmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQudmFsdWUubWFwKFxuICAgICAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB2YWx1ZVtmaWVsZC5kaXNwbGF5RmllbGRdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICh2YWx1ZS50b1N0cmluZygpPy5pbmNsdWRlcygnOycpIHx8XG4gICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0ZW1wVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZUFsbCgnLCcsICc7Jyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgbXVsdGlTZWxlY3QgYXJyYXkgaW50byBzdHJpbmdcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk1VTFRJU0VMRUNUICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpICYmXG4gICAgICAgICAgICAgIGZpZWxkLnNhdmVBc1N0cmluZyAhPT0gZmFsc2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBtdWxpU2VsZWN0VmFsdWVbZmllbGQuZmllbGRdID0gZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZT8udG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSA/IDEgOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2F2ZSBncmlkIG9uIGZvcm1TYXZlIEJ1dHRvblxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DT01QT05FTlQgJiYgIWN1c3RvbUNvbXBvbmVudCkge1xuICAgICAgICAgICAgICBjdXN0b21Db21wb25lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICBzYXZlQWxsR3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJyNzYXZlQWxsR3JpZFZhbHVlcycpO1xuICAgICAgICAgICAgICBnZXRCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnLnNhdmVSb3cnKTtcbiAgICAgICAgICAgICAgaWYgKHNhdmVBbGxHcmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNhdmVBbGxHcmlkWzBdLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybVBhZ2UgPSBpbnRlcnZhbCg3NTApLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybVBhZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChnZXRCdG5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzYXZlUm93QnRuIG9mIGdldEJ0bnMpIHtcbiAgICAgICAgICAgICAgICAgIHNhdmVSb3dCdG4/LmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQoZmFsc2UpO1xuICAgICAgaWYgKCFzYXZlQWxsR3JpZC5sZW5ndGggJiYgIWdldEJ0bnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQudGltZU9ubHkgJiYgZmllbGQuc2hvd1RpbWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBpZiAodHlwZW9mIGZpZWxkLnZhbHVlID09PSAnc3RyaW5nJyAmJiAvXlxcZHsyfTpcXGR7Mn0gW0FQXU0kLy50ZXN0KGZpZWxkLnZhbHVlKSkge1xuICAgICAgICAgICAgICAvLyAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5NVUxUSVNFTEVDVCAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gbXVsaVNlbGVjdFZhbHVlW2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGVtcFZhbHVlXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnLCcsICc7JylcbiAgICAgICAgICAgICAgICA/LnNwbGl0KCc7JylcbiAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZC5kaXNwbGF5RmllbGRdOiB2YWwgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSA9PT0gMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAoZmllbGQudmFsdWUgKiAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgKiAxMDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsRm9ybSgpIHtcbiAgICBpZiAodGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgfHwgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZVxuICAgICAgICAuY29uZmlybSh7XG4gICAgICAgICAga2V5OiAnY2FuY2VsQnV0dG9uJyxcbiAgICAgICAgICBtZXNzYWdlOiAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT8nLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc1swXS5kZXRhaWwgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgfVxuICB9XG5cbiAgbG9va3VwQ2xlYXJWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnZhbHVlKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGNhbGVuZGFyIHdpZHRoXG4gICAqL1xuICBzZXRDYWxhbmRlcldpZHRoKCkge1xuICAgIGNvbnN0IGNhbGFuZGVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wLWNhbGVuZGFyJyk7XG4gICAgbGV0IGZvcm06IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKTtcbiAgICBsZXQgd2lkdGggPSBmb3JtPy5jbGllbnRXaWR0aDtcbiAgICBjYWxhbmRlckVsZW1lbnQ/LmZvckVhY2goKGNhbGFuZGVyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGNhbGFuZGVyT2ZzZXRMZWZ0ID0gY2FsYW5kZXIub2Zmc2V0TGVmdDtcbiAgICAgIGlmIChjYWxhbmRlck9mc2V0TGVmdCA8PSB3aWR0aCAvIDIpIHtcbiAgICAgICAgY2FsYW5kZXIuY2xhc3NMaXN0LmFkZCgnb3Blbi1yaWdodC1zaWRlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IHRoZSBkeW5hbWljIGRpYWxvZyBkYXRhXG4gICAqL1xuICBzZXREaWFsb2dEYXRhKGZvcm1GaWVsZDogSUZvcm1GaWVsZCwgZGF0YTogYW55KTogYW55IHtcbiAgICBpZiAoZGF0YSAmJiBmb3JtRmllbGQpIHtcbiAgICAgIGxldCB2YWx1ZTogYW55O1xuICAgICAgZGF0YSA9IHV0aWxpdGllcy5vYmpDb252ZXJ0VG9Mb3dlcihkYXRhKTtcbiAgICAgIGxldCBzZWxlY3Rpb246IHN0cmluZyA9ICcnO1xuICAgICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAmJiB0eXBlb2YgZm9ybUZpZWxkLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQgJiZcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dC50b1N0cmluZygpLnRyaW0oKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWUudGV4dD8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzcGxheUZpZWxkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZT8udmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIGZvcm1GaWVsZC52YWx1ZS50b1N0cmluZygpLnRyaW0oKSkge1xuICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBkYXRhLmNvbXBvbmVudD8ubmFtZTtcbiAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihkYXRhLmNvbXBvbmVudCwge1xuICAgICAgICAuLi5kYXRhLmRhdGEsXG4gICAgICAgIHN0eWxlQ2xhc3M6ICdsb29rdXAtbW9kZWwnLFxuICAgICAgICBoZWlnaHQ6IGRhdGEuZGF0YT8uaGVpZ2h0ID8gZGF0YS5kYXRhPy5oZWlnaHQgOiAnOTB2aCcsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcbiAgICAgICAgICBmaWVsZDogZm9ybUZpZWxkLmZpZWxkLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZUZpZWxkOiBkYXRhLmRhdGE/LnZhbHVlRmllbGQsXG4gICAgICAgICAgLi4uZGF0YS5kYXRhLmRhdGEsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBmb3JtRmllbGQuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljayhmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGxhYmVsXG4gICAqL1xuICBzZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQ6IGFueSwgZXZlbnQ/OiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBmb3JtRmllbGQubGFiZWwgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbFxuICAgICkge1xuICAgICAgaWYgKChldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uY29tcG9uZW50KSB8fCBmb3JtRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2w/Lm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbC5jb21wb25lbnQsIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uZGF0YS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZWY6IGFueSA9IHRoaXMuc2V0RGlhbG9nRGF0YShcbiAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcbiAgICAgICAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkPy5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmxhYmVsLm9uUmV0dXJuKVxuICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwub25SZXR1cm4oZm9ybUZpZWxkLnZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICh7IGVycm9yIH06IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIGRpYWxvZyByZWYgd2hlbiBwb3B1cCBvcGVuXG4gICAqL1xuICBzZXREeW5hbWljRGlhbG9nUmVmKHJlZjogYW55KXtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2UuZGlhbG9nQ29tcG9uZW50UmVmTWFwLmdldChyZWYpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQgPSBkaWFsb2dSZWY/Lmluc3RhbmNlIGFzIER5bmFtaWNEaWFsb2dDb21wb25lbnQ7XG4gICAgY29uc3QgYXJpYUxhYmVsbGVkQnkgPSBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgZHluYW1pY0NvbXBvbmVudC5nZXRBcmlhTGFiZWxsZWRCeSA9ICgpID0+IGFyaWFMYWJlbGxlZEJ5O1xuICB9XG5cbiAgaW50ZXJjZXB0RGlhbG9nQ2xvc2UoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpIHtcbiAgICAgIGlmIChjb25maXJtKFwiWW91IHdpbGwgbG9zZSBjaGFuZ2VzIG5vdCBzYXZlZCBvbiBwYWdlLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT9cIikgPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC5sb29rdXBDb250cm9sKSB7XG4gICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB0aGlzLmxvb2t1cEZvY3VzT3V0ID0gdHJ1ZTtcbiAgICAgIGxldCB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5zZXREaWFsb2dEYXRhKGZvcm1GaWVsZCwgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpO1xuICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCB8fCB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZD1mYWxzZTtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmZpZWxkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtRmllbGQuZmllbGQpPy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0RGlhbG9nUmVzcG9uc2UoXG4gICAgICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wsXG4gICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubG9va3VwRm9jdXNPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIGZvcm1GaWVsZC5vblJldHVybihmb3JtRmllbGQudmFsdWUsIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgY29uc3QgZm9ybUZpZWxkVmFsdWUgPVxuICAgICAgICAgICAgdHlwZW9mIGZvcm1GaWVsZC52YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBmb3JtRmllbGQudmFsdWUudGV4dFxuICAgICAgICAgICAgICA6IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZT8udGV4dCA6IHZhbHVlO1xuICAgICAgICAgIGlmIChmb3JtRmllbGRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgZXJyb3IgfTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvbkNsaWNrIGV2ZW50IGludm9rZWQgJiYgb3BlbiBEaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZC9sYWJlbFxuICAgKi9cbiAgaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpIHtcbiAgICAgIHRoaXMuc2VsZWN0TG9va3VwTGFiZWwoZm9ybUZpZWxkKTtcbiAgICAgIHRoaXMuc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2V0IENhbGVuZGFyIERhdGUgRm9ybWF0ICYmIHNldCBEYXRlIE1pbnV0ZSBpbnRlcnZhbFxuICAgKi9cbiAgc2V0Q2FsZW5kYXJEYXRlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSKSB7XG4gICAgICAvLyBjb252ZXJ0IHRpbWUgaW50byBkYXRlIGZvcm1hdFxuICAgICAgaWYgKFxuICAgICAgICBmb3JtRmllbGQudGltZU9ubHkgJiZcbiAgICAgICAgKGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fFxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSlcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0VGltZUluRGF0ZShmb3JtRmllbGQudmFsdWUpO1xuICAgICAgfWVsc2UgaWYgKFxuICAgICAgICAoZm9ybUZpZWxkLnNob3dUaW1lIHx8IGZvcm1GaWVsZC50aW1lT25seSkgJiZcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZShcbiAgICAgICAgICB1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKGZvcm1GaWVsZC52YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChmb3JtRmllbGQuc2hvd1RpbWUgfHwgZm9ybUZpZWxkLnRpbWVPbmx5KSAmJlxuICAgICAgICAhZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKG5ldyBEYXRlKCkpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfVxuICBjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZDogYW55KSB7XG4gICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAhPT0gZm9ybUZpZWxkLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgIGZvcm1GaWVsZC5wcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlZCBzZWN0aW9uIENsaWNrZWQgZXZlbnRcbiAgICovXG4gIGNsaWNrZWRTZWN0aW9uKHNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIHRoaXMuc2VjdGlvbkNsaWNrZWRFdmVudC5lbWl0KHNlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIGluIE5vdGVfRmllbGQgY29ucnRyb2xcbiAgICovXG4gIGhhbmRsZU5vdGVGaWVsZERpYWxvZyhmb3JtZmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihOb3Rlc0NvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBmb3JtZmllbGQubGFiZWwgYXMgc3RyaW5nLFxuICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybWZpZWxkLnZhbHVlLFxuICAgICAgICBkaXNhYmxlZFRleHQ6IGZvcm1maWVsZC5kaXNhYmxlZFRleHQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1maWVsZD8uZmllbGQgPyBmb3JtZmllbGQ/LmZpZWxkIDogZm9ybWZpZWxkPy5sYWJlbCk7XG4gICAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGZvcm1maWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1maWVsZC5vblJldHVybihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRDbGFzc05hbWUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKTogc3RyaW5nIHtcbiAgICBpZiAoZm9ybUZpZWxkLmhpZGRlbikgcmV0dXJuICcgaGlkZGVuJztcbiAgICBlbHNlIHJldHVybiAnJztcbiAgfVxuXG4gIGF1dG9TZWFyY2goZXZlbnQ6IGFueSkge1xuICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGRcbiAgICBpZiAoZm9ybUZpZWxkICYmIGV2ZW50ICYmIGV2ZW50LmV2ZW50KSB7XG4gICAgICBmb3JtRmllbGQub25SZXR1cm4oZXZlbnQuZXZlbnQucXVlcnksIGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGludm9rZWQgb25Gb2N1c091dCBFdmVudFxuICAgKi9cbiAgb25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGxldCByZWNvcmQ6IGFueSA9IHt9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIHNlY3Rpb24/LmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChmb3JtRmllbGQuZmllbGQpIHtcbiAgICAgICAgICByZWNvcmRbZm9ybUZpZWxkLmZpZWxkXSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdXRpbGl0aWVzLnNldEh5cGVybGlua1BhcmFtVmFsdWUocmVjb3JkLCB0aGlzLmZvcm0pO1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgICBpZiAoZm9ybUZpZWxkICYmIGZvcm1GaWVsZC5vbkZvY3VzT3V0ICYmIHRoaXMubG9va3VwRm9jdXNPdXQgPT09IGZhbHNlKSB7XG4gICAgICBmb3JtRmllbGQub25Gb2N1c091dChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmFja1NwYWNlRXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKHR5cGVvZiBmb3JtRmllbGQudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUudGV4dCA9IGZvcm1GaWVsZC52YWx1ZS50ZXh0LnN1YnN0cmluZyhcbiAgICAgICAgMCxcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGlmIChmb3JtRmllbGQudmFsdWUudGV4dC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvL3RoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQudmFsdWUgJiYgZm9ybUZpZWxkLnZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjbGVhciB0aGUgZHJvcGRvd24gdmFsdWUgd2hlbiBjbGljayBvbiB4XG4gICAqL1xuICBvbkNsZWFyVmFsdWUoZXZlbnQ6IGFueSkge1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGQ7XG4gICAgdGhpcy5vbkNoYW5nZUV2ZW50KGZvcm1GaWVsZCk7XG4gICAgdGhpcy5kcm9wRG93bkNoYW5nZUV2ZW50LmVtaXQoZm9ybUZpZWxkKTtcbiAgICBpZiAoIWV2ZW50LmV2ZW50LnZhbHVlKSB7XG4gICAgICB0aGlzLm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRHJvcGRvd25WYWx1ZShmb3JtRmllbGQ6IGFueSkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIG9uQ2hhbmdlIEV2ZW50IHdoZW4gVmFsdWUgQ2hhbmdlZFxuICAgKi9cbiAgb25DaGFuZ2VFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KHRydWUpO1xuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHR5cGVPZih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZva2Ugb24gZHluYW1pYyBidXR0b25zIGNsaWNrXG4gICAqL1xuICBvbk5ld0J1dHRvbkNsaWNrKGJ1dHRvbikge1xuICAgIGxldCBzYXZlQWxsR3JpZDogYW55ID0gW107XG4gICAgbGV0IGdldEJ0bnM6IGFueSA9IFtdO1xuICAgIGxldCB2YWxpZGl0eSA9IHRydWU7XG4gICAgbGV0IGVycm9yTWVzc2FnZURldGFpbHMgPSAnJztcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmb3JtU2VjdGlvbi5maWVsZHMpKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkaXR5KSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgZ2V0QnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJy5zYXZlUm93Jyk7XG4gICAgICAgICAgaWYgKHNhdmVBbGxHcmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoZ2V0QnRucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzYXZlUm93QnRuIG9mIGdldEJ0bnMpIHtcbiAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICBidXR0b24uZnVuYygpO1xuICB9XG5cbiAgc2VsZWN0ZWRDYXJkQ2xpY2tFdmVudChkYXRhOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmNhcmQgJiYgZmllbGQuY2FyZC5kYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSBmaWVsZC5jYXJkLmRhdGFbZGF0YS5pbmRleF07XG4gICAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLnNlbGVjdGVkQ2FyZCkge1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5zZWxlY3RlZENhcmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG9ialsnc2VsZWN0ZWRDYXJkJ10gPSAnY2FyZC1hY3RpdmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuc2VsZWN0ZWRDYXJkKSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICdjYXJkLWFjdGl2ZSc7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlUGFzc3dvcmRUeXBlKGZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQudGV4dFR5cGUgPT0gJ3RleHQnKSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAndGV4dCc7XG4gICAgfVxuICB9XG4gIG9uTGlua0NsaWNrKGxpbmssIGZvcm1TZWN0aW9uKXtcbiAgICBpZighbGluay5kaXNhYmxlZCAmJiAhZm9ybVNlY3Rpb24uZGlzYWJsZWQpe1xuICAgICAgbGluay5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG4gIGlzVmFsaWRDb2x1bW4oY29sOiBhbnkpe1xuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29sKSAmJiBjb2wgPiAwICYmIGNvbCA8PSAxMlxuICB9XG4gYXN5bmMgYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudChldmVudCk6IFByb21pc2U8dm9pZD57XG4gIGxldCBob3ZlckRhdGEgOklPdmVybGF5UGFuZWxEYXRhID0gZXZlbnQ/LmhvdmVyRGF0YTtcbiAgbGV0IG92ZXJsYXlQYW5lbDogYW55ID0gZXZlbnQ/Lm92ZXJsYXlQYW5lbDtcbiAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCk9PntcbiAgICAgIGNvbnN0IGRhdGEgPSB7Li4uaG92ZXJEYXRhPy5kYXRhfTtcbiAgICAgIGlmKE9iamVjdD8ua2V5cyhkYXRhKT8ubGVuZ3RoID4gMCl7XG4gICAgICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0Py5rZXlzKGhvdmVyRGF0YT8uZGF0YSk7XG4gICAgICAgIGlmKGRhdGFLZXlzPy5sZW5ndGggPjAgKXtcbiAgICAgICAgICBkYXRhS2V5cy5mb3JFYWNoKGtleT0+e1xuICAgICAgICAgICAgdmFyIHZhbHVlID1kYXRhW2tleV07XG4gICAgICAgICAgICBpZih2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ3snKSAmJiB2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ30nKSl7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZVRvRmluZCA9IHZhbHVlLnJlcGxhY2UoJ3snLCcnKS5yZXBsYWNlKCd9JywnJyk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT0gdXRpbGl0aWVzLmdldEZvcm1GaWVsZFZhbHVlKHRoaXMuZm9ybSwgdmFsdWVUb0ZpbmQpO1xuICAgICAgICAgICAgfWVsc2UgaWYoIXZhbHVlKXtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoZWRLZXlWYWx1ZSA9IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIGtleSk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT1tYXRjaGVkS2V5VmFsdWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaG92ZXJEYXRhPy5zdHlsZSA/ICh0aGlzLm92ZXJsYXlQYW5lbFN0eWxlID0gaG92ZXJEYXRhLnN0eWxlKSA6ICcnO1xuICAgICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWY6YW55ID0gdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyPy5jcmVhdGVDb21wb25lbnQoaG92ZXJEYXRhPy5jb21wb25lbnQpO1xuICAgICAgY29uc29sZS5sb2coY29tcG9uZW50UmVmKVxuICAgICAgaWYoaG92ZXJEYXRhLmRhdGEpe1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY29uZmlnID0gW107XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcuZGF0YSA9IGRhdGE7XG4gICAgICB9XG4gICAgICBvdmVybGF5UGFuZWwuc2hvdyhldmVudD8uZXZlbnQpO1xuICAgICAgXG4gICAgIH0pXG4gIH1cbiAgbW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbCl7XG4gICAgb3ZlcmxheVBhbmVsPy5oaWRlKCk7XG4gIH1cblxufVxuXG4iLCI8c2Utc3BsaXR0ZXIgXG4gICpuZ0lmPVwic3BsaXRTY3JlZW5cIlxuICBbZXhpc3RpbmdDb3Btb25lbnRdPVwicGFuZWxJbmZvLmV4aXN0aW5nQ29wbW9uZW50XCIgXG4gIFtwYW5lbENvbXBvbmVudF09XCJwYW5lbEluZm8ucGFuZWxDb21wb25lbnRcIiBcbiAgW2NvbmZpZ0RhdGFdPVwicGFuZWxJbmZvLmNvbmZpZ0RhdGFcIiBcbiAgKGNsb3NlUGFuZWxFbWl0dGVyKT1cImNsb3NlUGFuZWwoKVwiXG4+PC9zZS1zcGxpdHRlcj5cbjxwLWNvbmZpcm1EaWFsb2cgW3N0eWxlXT1cInsgd2lkdGg6ICc1MHZ3JyB9XCIga2V5PVwiY2FuY2VsQnV0dG9uXCI+PC9wLWNvbmZpcm1EaWFsb2c+XG48ZGl2ICN2aWV3Q29udGFpbmVyRm9ybVJlZj5cbiAgPGZvcm0gKm5nSWY9XCIhaXNGb3JtSGlkZGVuICYmIGZvcm0gJiYgIXNwbGl0U2NyZWVuXCI+XG4gICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBjbGFzcz1cInByb2dyZXNzLXNwaW5uZXIgcC1wcm9ncmVzcy1zcGlubmVyLWNpcmNsZSBjdXN0b20tc3Bpbm5lclwiPjwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtd3JhcFwiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyAnZml4ZWQtaGVpZ2h0Jzogc3RpY2t5QWN0aW9ucyB9XCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZvcm1TZWN0aW9uIG9mIGZvcm0uZm9ybVNlY3Rpb25zXCIgW2NsYXNzXT1cIiFmb3JtU2VjdGlvbi5oaWRkZW4gPyAnY2FyZCB3LTEwMCcgOiAnJ1wiPlxuICAgICAgICAgIDxzcGFuIChjbGljayk9XCJjbGlja2VkU2VjdGlvbihmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZm9ybVNlY3Rpb24gPyAnJyA6IHNlY3Rpb25EaXNhYmxlZChmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaGlkZGVuID8gJ2hpZGRlbicgOiBmb3JtU2VjdGlvbi5jbGFzc1wiPlxuICAgICAgICAgICAgICAgIDxwLWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiBbc2VsZWN0ZWRdPVwiZm9ybVNlY3Rpb24uZXhwYW5kZWQgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1TZWN0aW9uLmFjY29yZGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiIWZvcm1TZWN0aW9uLnNob3dBY2NvcmRpb24gPyAnaGlkZS1hY2NvcmRpYW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJmb3JtU2VjdGlvbi5pY29uXCIgW3RpdGxlXT1cImZvcm1TZWN0aW9uLm5hbWVcIiBjbGFzcz1cIm1yLTEgcGwtMlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1YnNlY3Rpb24taGVhZGVyXCI+e3sgZm9ybVNlY3Rpb24ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcC1oZWFkZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHAtY29sIGZvcm0tY29tcG9uZW50IGFjY29yZGlvbi1oZWFkZXItd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIiFmb3JtU2VjdGlvbi5zaG93QWNjb3JkaW9uXCIgZm9yPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbkhlYWRlck5hbWUgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFt0aXRsZV09XCJmb3JtU2VjdGlvbi5uYW1lXCIgW2NsYXNzXT1cImZvcm1TZWN0aW9uLmljb25cIiBjbGFzcz1cIlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+IHt7IGZvcm1TZWN0aW9uLm5hbWUgfX0gPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGxpbmsgb2YgZm9ybVNlY3Rpb24ubGlua3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1yLTMgY3VzdG9tLWxpbmtcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImxpbmsubmFtZSAmJiFmb3JtU2VjdGlvbi5kaXNhYmxlZCYmIWxpbmsuZGlzYWJsZWQgID8gJ2N1c3RvbS1saW5rJyA6ICdkaXNhYmxlZC1saW5rJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkxpbmtDbGljayhsaW5rLCBmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGluay5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBmb3JtLWNvbXBvbmVudCBmb3JtLWJvZHktd3JhcHBlciBoZWFkZXItZmllbGRzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIihoZWFkZXJGaWVsZC5jb250cm9sPT09J2FkZF9idXR0b24nPyAnIGZvcm0tYnV0dG9uLWZpZWxkLXdyYXBwZXIgJzonJykrXG4gICAgICAgICAgICAgICAgICAgICAgICAoIGlzVmFsaWRDb2x1bW4oaGVhZGVyRmllbGQuY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBoZWFkZXJGaWVsZC5jb2x1bW4gKyBzZXRDbGFzc05hbWUoaGVhZGVyRmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzVmFsaWRDb2x1bW4oZm9ybS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm0uY29sdW1uICsgc2V0Q2xhc3NOYW1lKGhlYWRlckZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBoZWFkZXJGaWVsZC5jb2x1bW4gfHwgZm9ybS5jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgID8gJyBjb2wgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnY29sLTEyIG1kOmNvbC0zIGZsZXggZmxleC1jb2x1bW4nICsgc2V0Q2xhc3NOYW1lKGhlYWRlckZpZWxkKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXJGaWVsZC5jb250cm9sID09PSAnYnJlYWtfbGluZScgPyAnYnJlYWstbGluZScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoZWFkZXJGaWVsZCBvZiBmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM7IGxldCBoZWFkZXJGaWVsZEluZGV4ID0gaW5kZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTd2l0Y2hdPVwiaGVhZGVyRmllbGQuY29udHJvbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBsYWJlbENvbnRyb2wgSHlwZXJsaW5rIG9uIGxvb2t1cCAgQ29udHJvbCBGaWVsZC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiBbb3ZlcmxheVBhbmVsXT1cIm92ZXJsYXlQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbERpc3BsYXldPVwibGFiZWxEaXNwbGF5XCIgKG9uTW91c2VFbnRlcik9XCJhZGREeW5hbWljUGFuZWxPdmVybGF5Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Nb3VzZUxlYXZlKT1cIm1vdXNlTGVhdmVFdmVudCgkZXZlbnQpXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Mb2FkTGFiZWxDb250cm9sSUZyYW1lQ2xpY2spPVwibG9hZExhYmVsQ29udHJvbElGcmFtZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0TG9va3VwTGFiZWxDbGljayk9XCJzZWxlY3RMb29rdXBMYWJlbCgkZXZlbnQ/LmZvcm1GaWVsZCwgJGV2ZW50Py5ldmVudClcIj48L2xhYmVsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWxEaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCIgW2NsYXNzXT1cImhlYWRlckZpZWxkLmxhYmVsLmljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCI+IHt7aGVhZGVyRmllbGQubGFiZWwubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLklOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQtY29udHJvbCBbZmllbGRdPVwiaGVhZGVyRmllbGRcIiAoY2hhbmdlUGFzc3dvcmQpPVwiY2hhbmdlUGFzc3dvcmRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2lucHV0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtZXJpYyBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OVU1FUklDXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1jb250cm9sIFtmaWVsZF09XCJoZWFkZXJGaWVsZFwiIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0TG9va3VwKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENoZWNrYm94IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNIRUNLQk9YXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2hlY2tib3gtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2hlY2tib3gtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYXNzd29yZCBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5QQVNTV09SRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhc3N3b3JkLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXNzd29yZC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TUEFDRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFjZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9zcGFjZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbnB1dCBUZXh0QXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVEFSRUFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QXJlYS1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L3RleHRBcmVhLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWxlbmRhciBDb250cm9sLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBTEVOREFSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FsZW5kYXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgW2RlZmF1bHREYXRlXT1cImRlZmF1bHREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCIgKG9uU2hvdyk9XCJzZXRDYWxlbmRhckRhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiIChuZ01vZGVsQ2hhbmdlKT1cImNhbGVuZGFyQ2hhbmdlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbklucHV0KT1cImNhbGVuZGFySW5wdXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2NhbGVuZGFyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRFJPUERPV05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkcm9wZG93bi1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAoa2V5dXBUYWIpPVwidGFiRm9jdXNFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKCRldmVudClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNsZWFyVmFsdWUoJGV2ZW50KVwiPjwvZHJvcGRvd24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEF1dG9Db21wbGV0ZSBTZWFyY2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFVVE9DT01QTEVURVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF1dG9Db21wbGV0ZS1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCIgKGNvbXBsZXRlTWV0aG9kKT1cImF1dG9TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9hdXRvQ29tcGxldGUtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpLXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTVVMVElTRUxFQ1RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L211bHRpc2VsZWN0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIeXBlcmxpbmstLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSFlQRVJMSU5LXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHlwZXJsaW5rLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkh5cGVybGlua0RpYWxvZ0NsaWNrKT1cImh5cGVybGlua0RpYWxvZygkZXZlbnQpXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmcmFtTG9hZEV2ZW50KT1cImxvYWRJRnJhbWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oeXBlcmxpbmstY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5MT09LVVBfSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb29rdXAtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGtleXVwVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJMb29rdXBWYWx1ZSk9XCJsb29rdXBDbGVhclZhbHVlKCRldmVudClcIj48L2xvb2t1cC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VMRUNUQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0LWJ1dHRvbi1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgRGV0YWlsIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OT1RFX0ZJRUxEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZS1kZXRhaWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlTm90ZUZpZWxkRGlhbG9nKCRldmVudClcIj48L25vdGUtZGV0YWlsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgY29tcG9uZW50LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFQ1RJT05fSEVBREVSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbi1oZWFkZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIE9uQ2xpY2sgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9hZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBSZXBvcnQgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUkVQT1JUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cImhlYWRlckZpZWxkXCIgW2xhYmVsXT1cImhlYWRlckZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaGVhZGVyRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImhlYWRlckZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiaGVhZGVyRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBoZWFkZXJGaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiaGVhZGVyRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhlYWRlckZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TV0lUQ0hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dC1zd2l0Y2gtY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiPjwvSW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgQ29tcG9uZW50IENvbnRhaW5lci0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5oaWRkZW4gPyAnaGlkZGVuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwie3tmb3JtU2VjdGlvbi5uYW1lfX0te3toZWFkZXJGaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ09NUE9ORU5UXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGhlYWRlckZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiaGVhZGVyRmllbGQuc2VsZWN0TXVsdGlwbGVGaWxlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEZpbGVUeXBlc109XCJoZWFkZXJGaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVybCk9XCJzZXRGaWxlVXJscygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERpc3BsYXkgIENhcmQgZmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQVJEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlckZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlckZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChoZWFkZXJGaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtY2FyZCBbY2FyZF09XCJoZWFkZXJGaWVsZC5jYXJkXCIgW3NldENhcmREYXRhXT1cInNldENhcmREYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDYXJkKT1cInNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoJGV2ZW50KVwiPjwvc2UtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBmb3JtLWNvbXBvbmVudCBmb3JtLWJvZHktd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIihmb3JtRmllbGQuY29udHJvbD09PSdhZGRfYnV0dG9uJz8gJyBmb3JtLWJ1dHRvbi1maWVsZC13cmFwcGVyICc6JycpK1xuICAgICAgICAgICAgICAgICAgICAoIGlzVmFsaWRDb2x1bW4oZm9ybUZpZWxkLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBmb3JtRmllbGQuY29sdW1uICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgOiBpc1ZhbGlkQ29sdW1uKGZvcm0uY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm0uY29sdW1uICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtRmllbGQuY29sdW1uIHx8IGZvcm0uY29sdW1uXG4gICAgICAgICAgICAgICAgICAgID8gJyBjb2wgJ1xuICAgICAgICAgICAgICAgICAgICA6ICdjb2wtMTIgbWQ6Y29sLTMgZmxleCBmbGV4LWNvbHVtbicgKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9ybUZpZWxkLmNvbnRyb2wgPT09ICdicmVha19saW5lJyA/ICdicmVhay1saW5lJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmb3JtRmllbGQgb2YgZm9ybVNlY3Rpb24uZmllbGRzOyBsZXQgZm9ybUZpZWxkSW5kZXggPSBpbmRleFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGxhYmVsQ29udHJvbCBIeXBlcmxpbmsgb24gbG9va3VwICBDb250cm9sIEZpZWxkLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIFtvdmVybGF5UGFuZWxdPVwib3ZlcmxheVBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxEaXNwbGF5XT1cImxhYmVsRGlzcGxheVwiIChvbk1vdXNlRW50ZXIpPVwiYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Nb3VzZUxlYXZlKT1cIm1vdXNlTGVhdmVFdmVudChvdmVybGF5UGFuZWwpXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkxvYWRMYWJlbENvbnRyb2xJRnJhbWVDbGljayk9XCJsb2FkTGFiZWxDb250cm9sSUZyYW1lKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdExvb2t1cExhYmVsQ2xpY2spPVwic2VsZWN0TG9va3VwTGFiZWwoJGV2ZW50Py5mb3JtRmllbGQsICRldmVudD8uZXZlbnQpXCI+PC9sYWJlbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYWJlbERpc3BsYXk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiZm9ybUZpZWxkLmxhYmVsLmljb25cIiBbY2xhc3NdPVwiZm9ybUZpZWxkLmxhYmVsLmljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5sYWJlbC5pY29uXCI+IHt7Zm9ybUZpZWxkLmxhYmVsLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nU3dpdGNoXT1cImZvcm1GaWVsZC5jb250cm9sXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTcGFjZXIgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNQQUNFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFjZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiPjwvc3BhY2VyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IFRleHRBcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVEFSRUFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEFyZWEtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC90ZXh0QXJlYS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZXh0IElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQtY29udHJvbCBbZmllbGRdPVwiZm9ybUZpZWxkXCIgKGNoYW5nZVBhc3N3b3JkKT1cImNoYW5nZVBhc3N3b3JkVHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2lucHV0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE51bWJlciBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5VTUVSSUNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1jb250cm9sIFtmaWVsZF09XCJmb3JtRmllbGRcIiAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RMb29rdXApPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYXNzd29yZCBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlBBU1NXT1JEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhc3N3b3JkLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXNzd29yZC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0hFQ0tCT1hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2hlY2tib3gtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2hlY2tib3gtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBTEVOREFSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbGVuZGFyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiBbZGVmYXVsdERhdGVdPVwiZGVmYXVsdERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCIgKG9uU2hvdyk9XCJzZXRDYWxlbmRhckRhdGUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwiY2FsZW5kYXJJbnB1dFZhbHVlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L2NhbGVuZGFyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRFJPUERPV05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcGRvd24tY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChrZXl1cFRhYik9XCJ0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKGZvcm1GaWVsZClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DbGVhclZhbHVlKCRldmVudClcIj48L2Ryb3Bkb3duLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEF1dG9Db21wbGV0ZSBTZWFyY2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXV0b0NvbXBsZXRlLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiIChjb21wbGV0ZU1ldGhvZCk9XCJhdXRvU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L2F1dG9Db21wbGV0ZS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aS1zZWxlY3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5NVUxUSVNFTEVDVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvbXVsdGlzZWxlY3QtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSHlwZXJsaW5rLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5IWVBFUkxJTktcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHlwZXJsaW5rLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSHlwZXJsaW5rRGlhbG9nQ2xpY2spPVwiaHlwZXJsaW5rRGlhbG9nKCRldmVudClcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmcmFtTG9hZEV2ZW50KT1cImxvYWRJRnJhbWUoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaHlwZXJsaW5rLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTE9PS1VQX0lOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvb2t1cC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKGtleXVwVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckxvb2t1cFZhbHVlKT1cImxvb2t1cENsZWFyVmFsdWUoZm9ybUZpZWxkKVwiPjwvbG9va3VwLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1GaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiZm9ybUZpZWxkLnNlbGVjdE11bHRpcGxlRmlsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0RmlsZVR5cGVzXT1cImZvcm1GaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImZvcm1GaWVsZFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVybCk9XCJzZXRGaWxlVXJscygkZXZlbnQpXCIgW2lzQXp1cmVVcGxvYWRdPVwiZm9ybUZpZWxkLmlzQXp1cmVVcGxvYWQgPT0gZmFsc2UgPyBmb3JtRmllbGQuaXNBenVyZVVwbG9hZCA6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VMRUNUQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdC1idXR0b24tY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXNwbGF5ICBDYXJkIGZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FSRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWNhcmQgW2NhcmRdPVwiZm9ybUZpZWxkLmNhcmRcIiBbc2V0Q2FyZERhdGFdPVwic2V0Q2FyZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDYXJkKT1cInNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoJGV2ZW50KVwiPjwvc2UtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIERldGFpbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5PVEVfRklFTERcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZS1kZXRhaWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVOb3RlRmllbGREaWFsb2coZm9ybUZpZWxkKVwiPjwvbm90ZS1kZXRhaWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHluYW1pYyBDb21wb25lbnQgQ29udGFpbmVyLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJmb3JtRmllbGQuaGlkZGVuID8gJ2hpZGRlbicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ7e2Zvcm1TZWN0aW9uLm5hbWV9fS17e2Zvcm1GaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNPTVBPTkVOVFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgY29tcG9uZW50LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUNUSU9OX0hFQURFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uLWhlYWRlci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgT25DbGljayBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZC1idXR0b24tY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCI+PC9hZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIFJlcG9ydCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5SRVBPUlRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cImZvcm1GaWVsZFwiIFtsYWJlbF09XCJmb3JtRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZm9ybUZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJmb3JtRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiZm9ybUZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgZm9ybUZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImZvcm1GaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImZvcm1GaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiZm9ybUZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9ybUZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1dJVENIXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIj48L0lucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cbiAgICAgICAgICAgICAgICA8L3AtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gc2F2ZSBhbmQgY2xvc2UgYnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgYWN0aW9ucy1idXR0b25zLW1haW4td3JhcHBlciBmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiBbbmdDbGFzc109XCJ7IHN0aWNreTogc3RpY2t5QWN0aW9ucyB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lci1zdGlja3kgZm9ybS1jb21wb25lbnQgYWN0aW9ucy1idXR0b25zLXdyYXBwZXItZGl2IGJvdHRvbS0wXCI+XG4gICAgICAgICAgPCEtLSBzYXZlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGVTYXZlQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJzYXZlQnV0dG9uTGFiZWwgPyBzYXZlQnV0dG9uTGFiZWwgOiAnU2F2ZSdcIiBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgZm9ybS1zYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TYXZlRm9ybSgpXCI+PC9idXR0b24+XG4gICAgICAgICAgPCEtLSBjbG9zZSBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlQ2FuY2VsQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2FuY2VsRm9ybSgpXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIFtsYWJlbF09XCJjYW5jZWxCdXR0b25MYWJlbCA/IGNhbmNlbEJ1dHRvbkxhYmVsIDogJ0NhbmNlbCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgbWwtM1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gZHluYW1pYyBidXR0b25zIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBmb3JtQnV0dG9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFidXR0b24uaGlkZGVuXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2xhYmVsXT1cImJ1dHRvbi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uID8gYnV0dG9uLmljb24gOiAnJ1wiIGNsYXNzPVwicC1idXR0b24tc3VjY2VzcyBtbC0zXCIgKGNsaWNrKT1cIm9uTmV3QnV0dG9uQ2xpY2soYnV0dG9uKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWQgPyBidXR0b24uZGlzYWJsZWQgOiBmYWxzZVwiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbiAgPHAtb3ZlcmxheVBhbmVsIFtzdHlsZV09XCJvdmVybGF5UGFuZWxTdHlsZVwiICNvdmVybGF5UGFuZWw+XG4gICAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lclJlZj48L25nLWNvbnRhaW5lcj5cbiAgPC9wLW92ZXJsYXlQYW5lbD5cbjwvZGl2PiJdfQ==
1458
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVF0QyxNQUFNLE9BQU8sYUFBYTtJQW9CeEIsSUFBYSxjQUFjLENBQUMsR0FBUTtRQUNsQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDaEIsUUFBUSxDQUFDO1NB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U0FBUzsrY0FNWix5QkFBeUI7c0JBRC9CLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFDLElBQUksRUFBQztnQkFHcEUseUJBQXlCO3NCQUR4QixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUdsQyxvQkFBb0I7c0JBQXRELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUV4QixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFLTyxjQUFjO3NCQUExQixLQUFLO2dCQUtJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQStDUCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgQ29tcG9uZW50RmFjdG9yeSwgVmlld0NvbnRhaW5lclJlZiwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBSZW5kZXJlcjIsIE5nWm9uZSwgVmlld0NoaWxkLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlLCBEeW5hbWljRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7IE5vdGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL25vdGVzL25vdGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFRm9ybUNvbnRyb2wsIEVIeXBlcmxpbmssIElGb3JtRmllbGQsIElEeW5hbWljRm9ybSwgSUZvcm1TZWN0aW9uLCBFVmFsaWRhdG9yLCBJRHluYW1pY0NhcmQsIElGb3JtQnV0dG9uLCBFRm9ybWF0VHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsJztcbmltcG9ydCB7IEVQZXJtaXNzaW9uVHlwZSwgSVBlcm1pc3Npb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdXNlci1pbmZvLm1vZGVsJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgdXRpbGl0aWVzIGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdGllcy5zZXJ2aWNlJztcbmltcG9ydCB7IElmcmFtZUNvbXBvbmVudCB9IGZyb20gJy4uL2lmcmFtZS9pZnJhbWUuY29tcG9uZW50JztcbmltcG9ydCB7IElEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbW1vbi5tb2RlbCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgR3JpZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnZUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh5cGVybGlua1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9oeXBlcmxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBkcmFnZ2FibGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSU92ZXJsYXlQYW5lbERhdGEgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJSZWYnLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOnRydWV9KVxuICBwdWJsaWMgcGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZHJlbignZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj47XG5cbiAgQFZpZXdDaGlsZCgndmlld0NvbnRhaW5lckZvcm1SZWYnKSB2aWV3Q29udGFpbmVyRm9ybVJlZiE6IEVsZW1lbnRSZWY7XG4gIFxuICBASW5wdXQoKSBzdGlja3lBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZm9ybTogSUR5bmFtaWNGb3JtO1xuICBASW5wdXQoKSBzYXZlQnV0dG9uTGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBjYW5jZWxCdXR0b25MYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGhpZGVTYXZlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhpZGVDYW5jZWxCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZm9ybUJ1dHRvbnM6IElGb3JtQnV0dG9uW10gPSBbXTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG92ZXJsYXlQYW5lbFN0eWxlOiB7fTtcbiAgcGFuZWxJbmZvOiBhbnk7XG4gIFxuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpIHNhdmVGb3JtOiBFdmVudEVtaXR0ZXI8SUZvcm1TZWN0aW9uW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRm9ybTogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRyb3BEb3duQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VjdGlvbkNsaWNrZWRFdmVudDogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZHluYW1pY0Nhc2UgPSBFRm9ybUNvbnRyb2w7XG4gIHNhdmVGb3JtUGFnZTogU3Vic2NyaXB0aW9uO1xuICBwZXJtaXNzaW9uVHlwZSA9IEVQZXJtaXNzaW9uVHlwZTtcbiAgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gIGlzRm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRm9ybUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjb21wb25lbnRzTGlzdDogSURpY3Rpb25hcnlbXSA9IFtdO1xuICBmaWxlVXBsb2FkVXJsczogYW55O1xuICBzaG93ZmlsZVVwbG9hZEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGNhcmRMaXN0OiBJRHluYW1pY0NhcmQ7XG4gIGNhbGVuZGFyUHJldmlvdXNWYWx1ZTogc3RyaW5nID0gJyc7XG4gIGRlZmF1bHREYXRlOiBzdHJpbmcgPSAnJztcbiAgbG9va3VwRm9jdXNPdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2FsZW5kYXJGb3JtYXQ6IHN0cmluZyA9ICdtbS9kZC95eSc7XG4gIHNldENhcmREYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHNwbGl0U2NyZWVuIDogYm9vbGVhbj0gZmFsc2U7XG4gIGRpYWxvZ1JlZjogYW55O1xuXG4gIC8vIGFwcGx5IGNoZWNrZWQvdW5DaGVja2VkIHByb3AgZm9yIENoZWNrQm94IG9mIHRoZSBGb3JtXG4gIGNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICB1bkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtU2VydmljZTogRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgaHlwZXJsaW5rU2VydmljZSA6IEh5cGVybGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2VMb2dnZXJTZXJ2aWNlOiBQYWdlTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgLy8gYnJvd3NlciB0YWIgY2xvc2UgZXZlbnRcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcsIFsnJGV2ZW50J10pXG4gIGJlZm9yZXVubG9hZEhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCB8fCB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgLy8gdGhpcy5mb3JtU2VydmljZS5zZXRUb29sdGlwKCk7XG4gICAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zIG9uIGZvcm1cbiAgICB0aGlzLnJvbGVzID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyUm9sZXMoKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgLy8gc3RhcnQgY2FyZExpc3QgcmVmZXJlbmNlIGJyZWFrIGZ1bmN0aW9uYWxpdHlcbiAgICAgIGxldCBmb3JtVmFsdWVzID0geyAuLi50aGlzLmZvcm0gfTtcblxuICAgICAgZm9ybVZhbHVlcy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBpZihmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM/Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzLmZvckVhY2goKGhlYWRlckZpZWxkKT0+e1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrRmllbGRSZXF1aXJlZChoZWFkZXJGaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmlzUGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgZmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdGltZSBpbnRvIGRhdGVcbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmIGZpZWxkPy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICBmaWVsZFsncHJldmlvdXNWYWx1ZSddID0gZmllbGQ/LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmXG4gICAgICAgICAgICAgIGZpZWxkPy50aW1lT25seSAmJlxuICAgICAgICAgICAgICAoZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkFVVE9DT01QTEVURSAmJlxuICAgICAgICAgICAgICBmaWVsZD8udmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZD8udmFsdWUubWFwKFxuICAgICAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB2YWx1ZVtmaWVsZD8uZGlzcGxheUZpZWxkXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgICAgICAodmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSB8fFxuICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCcsJywgJzsnKVxuICAgICAgICAgICAgICAgICAgPy5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZD8uZGlzcGxheUZpZWxkXTogdmFsIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCB0aGUgbXVsdGlTZWxlY3Qgc3RyaW5nIHZhbHVlIGluIGFycmF5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMqLFxccyovZywgXCIsXCIpPy50b1N0cmluZygpPy5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gW2ZpZWxkLnZhbHVlXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSB7fTtcbiAgICAgICAgICAgICAgZmllbGQ/LmNhcmQ/LmRhdGE/LmZvckVhY2goKHg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHguZHluYW1pY0Zvcm0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uczogSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtVmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5kIGNhcmRMaXN0IHJlZmVyZW5jZSBicmVhayBmdW5jdGlvbmFsaXR5XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3knIHx8XG4gICAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCkgPT09ICcxJ1xuICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlVc2VyUGVybWlzc2lvbnMoKTtcbiAgICAgIHRoaXMucmVtb3ZlV2hpdGVTcGFjZXMoKTtcbiAgICAgIHRoaXMuc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKTtcbiAgICAgIHRoaXMuc2V0Q2FsYW5kZXJXaWR0aCgpO1xuICAgICAgdGhpcy5vcmRlckZvcm1TZWN0aW9ucygpO1xuICAgICAgdGhpcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKTtcbiAgICAgIHRoaXMubGlzdGVuVG9TcGxpdFNjcmVlbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBvcmRlckZvcm1TZWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5mb3JtICYmIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VySW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0N1cnJlbnRVc2VySW5mbycpKTtcbiAgICAgIGxldCB1c2VyU2VjdGlvbiA9IGN1cnJlbnRVc2VySW5mbz8ucGFnZVNlY3Rpb25zPy5sZW5ndGggPiAwID8gY3VycmVudFVzZXJJbmZvLnBhZ2VTZWN0aW9ucyA6IFtdO1xuICAgICAgY29uc3QgcGFnZVVybCA9IHRoaXMucGFnZU5hbWUoKTtcbiAgICAgIGlmICh1c2VyU2VjdGlvbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICB1c2VyU2VjdGlvbiA9IHVzZXJTZWN0aW9uLnNvcnQoKGEsIGIpID0+IGIuaWQgLSBhLmlkKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJ1c2VyU2VjdGlvbjpcIiwgdXNlclNlY3Rpb24pXG4gICAgICAgIHVzZXJTZWN0aW9uLmZvckVhY2goKHBhZ2VTZWN0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZE5hbWU6IGJvb2xlYW4gPSB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5zb21lKChzZWN0aW9uKSA9PiBwYWdlU2VjdGlvbj8uc2VjdGlvbj8udG9Mb3dlckNhc2UoKSA9PT0gc2VjdGlvbj8ubmFtZT8udG9Mb3dlckNhc2UoKSkgJiYgcGFnZVNlY3Rpb24/LnBhZ2U/LnRvTG93ZXJDYXNlKCkgPT09IHBhZ2VVcmw/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKG1hdGNoZWROYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZpbmRJbmRleCgoc2VjdGlvbikgPT4gcGFnZVNlY3Rpb24/LnNlY3Rpb24/LnRvTG93ZXJDYXNlKCkgPT09IHNlY3Rpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgaWYgKHBhZ2VTZWN0aW9uLnJvbGUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZXM/Lmxlbmd0aCA+IDAgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhwYWdlU2VjdGlvbi5yb2xlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3dhcFNlY3Rpb25zKHBhZ2VTZWN0aW9uLm9yZGVyIC0gMSwgaW5kZXgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dhcFNlY3Rpb25zKHBhZ2VTZWN0aW9uLm9yZGVyIC0gMSwgaW5kZXgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuICBzd2FwU2VjdGlvbnMob3JkZXI6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlT3JkZXJTZWN0aW9uID0geyAuLi50aGlzLmZvcm0uZm9ybVNlY3Rpb25zW29yZGVyXSB9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbb3JkZXJdID0gdGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tpbmRleF07XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tpbmRleF0gPSByZU9yZGVyU2VjdGlvbjtcbiAgfVxuICBwYWdlTmFtZSgpIHtcbiAgICBsZXQgdXJsID0gdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSk7XG4gICAgaWYgKHVybD8uaW5jbHVkZXMoJz8nKSkge1xuICAgICAgdXJsID0gdXJsLnNwbGl0KCc/JylbMF07XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgc2V0Rm9ybVNlY3Rpb24oc2VjdGlvbiwgaW5kZXgsIHBhZ2VTZWN0aW9uKSB7XG4gICAgY29uc3QgcmVPcmRlclNlY3Rpb24gPSB7IC4uLnNlY3Rpb24gfTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5zcGxpY2UocGFnZVNlY3Rpb24/Lm9yZGVyIC0gMSwgMCwgcmVPcmRlclNlY3Rpb24pO1xuICB9XG4gIGNoZWNrRmllbGRSZXF1aXJlZChmaWVsZDogYW55KSB7XG4gICBpZihmaWVsZC52YWxpZGF0aW9ucz8uZmluZCh2YWxpZGF0aW9uPT52YWxpZGF0aW9uLnR5cGU9PT1FVmFsaWRhdG9yLlJFUVVJUkVEKSl7XG4gICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbiAgIH1cbiAgfVxuXG4gIC8vIHNldCBjYWxlbmRhciAyIE9yIDQgZGlnaXQgeWVhciBmb3JtYXRcbiAgY2FsZW5kYXJJbnB1dFZhbHVlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmKCFmb3JtRmllbGQudGltZU9ubHkpe1xuICAgICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGZvcm1GaWVsZC5maWVsZClbMF1cbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAodmFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF2YWw/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgICBpZiAodmFsPy50YXJnZXQ/LnZhbHVlPy5sZW5ndGggPT0gOCB8fCBmb3JtRmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gRUZvcm1hdFR5cGUuU0hPUlREQVRFKSB7XG4gICAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KShcXGR7Mn0pKFxcZHs0fSkvLCAnJDEvJDIvJDMnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodmFsPy50YXJnZXQ/LnZhbHVlLmxlbmd0aCA9PSA2KSB7XG4gICAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KSg/PVxcZCkvZywgJyQxLycpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB2YWw/LnRhcmdldD8udmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHllYXIgPSB2YWw/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCkuc3BsaXQoJy8nKVsyXTtcbiAgICAgICAgaWYgKHllYXI/Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IG5ldyBEYXRlKHZhbD8udGFyZ2V0Py52YWx1ZSk/LnRvTG9jYWxlRGF0ZVN0cmluZyhcbiAgICAgICAgICAgICdlbi1VUydcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXI/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveSc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAgXG4gIH1cblxuICAvLyBzZXQgcGVyY2VudCBhbmQgZGVjaW1hbCB2YWx1ZXNcbiAgc2V0bnVtZXJpY3ZhbHVlcygpIHtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5OVU1FUklDKSB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gZmllbGQ/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICAgKGZpZWxkLnZhbHVlICogMTAwKT8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICApLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlICogMTAwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoXG4gICAgICAgICAgICAgICAgICBkaWdpdHNJbmZvID8gZGlnaXRzSW5mbyA6IDJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBmb3JtIGhhcyBhbnkgZmllbGQgd2l0aCBkeW5hbWljIGNvbXBvbmVudDtcbiAgICogQ3JlYXRlcyBjb21wb25lbnQgaW5zdGFuY2UgdXNpbmcgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAqIEluamVjdHMgY29tcG9uZW50IHRocm91Z2ggdmlld1JlZi5jcmVhdGVDb21wb25lbnQoKVxuICAgKiBQYXNzZXMgZGF0YSB0byBjb21wb25lbnRcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgZXZlbnRzIHBhc3NlZCB0byB0aGUgY29tcG9uZW50c1xuICAgKiBGaW5hbGx5IGZvcmNlcyBBbmd1bGFyIHRvIGRldGVjaCBjaGFuZ2VzXG4gICAqL1xuICBsb2FkU3BsaXRWaWV3KCl7XG4vL2lmIHNob3VsZCBkeW5taWNhbGx5IGNyZWF0ZSBjb21wb25lbnQgaW5zdGVhZCBvZiBuZ0lmIGluIHRoZSBodG1sIGZvciBzcGxpdCBjb21wb25lbnRcbiAgfVxuICBsb2FkRHluYW1pY0NvbXBvbmVudHMoKSB7XG4gICAgdGhpcy5jb21wb25lbnRzTGlzdCA9IFtdO1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnksIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DT01QT05FTlQpIHtcbiAgICAgICAgICBjb25zdCB2aWV3UmVmOiBhbnkgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRDb250YWluZXIuZmluZChcbiAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICB4LmVsZW1lbnQubmF0aXZlRWxlbWVudC5pZCA9PSBgJHtmb3JtU2VjdGlvbi5uYW1lfS0ke2ZpZWxkSW5kZXh9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY29tcG9uZW50OiBDb21wb25lbnQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgaGFuZGxlcnMsXG4gICAgICAgICAgfSA9IGZpZWxkLmNvbXBvbmVudENvbnRyb2w7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxhbnk+ID1cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KENvbXBvbmVudCk7XG4gICAgICAgICAgLy8gUGFzc2luZyBkYXRhIHRvIGNvbXBvbmVudFxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHZpZXdSZWY/LmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICBpZihmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQpe1xuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyhjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgZmllbGQuY29tcG9uZW50Q29udHJvbC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhID8/IHt9KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgbmFtZTogZmllbGQuY29tcG9uZW50Q29udHJvbD8uaWQsXG4gICAgICAgICAgICAgIHZhbHVlOiBjb21wb25lbnRSZWYsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFN1YnNjcmliZXMgdG8gdGhlIGV2ZW50cyBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVycykuZm9yRWFjaCgoW2V2ZW50LCBoYW5kbGVyXTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtldmVudF0gYXMgRXZlbnRFbWl0dGVyPGFueT4pPy5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGludm9rZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vaW52b2tlIHdoZW4gZmlsZSB1cGxvYWQgT1IgZGVsZXRlIGEgZmlsZVxuICBmaWxlT25jaGFuZ2VFdmVudCgpIHtcbiAgICB0aGlzLnNldENhcmREYXRhID0gIXRoaXMuc2V0Q2FyZERhdGE7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gbG9hZCBkeW5hbWljIGNvbXBvbmVudHMgaWYgZXhpc3QgaW4gZm9ybVxuICAgIHRoaXMuc2V0bnVtZXJpY3ZhbHVlcygpO1xuICAgIHRoaXMub25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCk7XG4gICAgdGhpcy5saXN0ZW5Ub1NwbGl0U2NyZWVuQ2hhbmdlKCk7XG4gICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudHMoKTtcbiAgICB0aGlzLnNldENhcmRSZXNwb25zZUlkKCk7XG4gIH1cblxuICBzZXRDYXJkUmVzcG9uc2VJZCgpIHtcbiAgICB1dGlsaXRpZXMub25EeW5hbWljQ2FyZFN0YXRlQ2hhbmdlKCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmKHJlcy5kYXRhPy5pc1NhdmUpe1xuICAgICAgICB0aGlzLnNldENhcmRJZHMocmVzLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXREZWxldGVDYXJkSWQocmVzLmRhdGE/LmNhcmREYXRhLCByZXMuZGF0YT8uZHluYW1pY0Zvcm0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0RGVsZXRlQ2FyZElkKHVwZGF0ZWRDYXJkRGF0YTphbnksIGR5bmFtaWNGb3JtOiBJRHluYW1pY0Zvcm0pe1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChzZWN0aW9uOklGb3JtU2VjdGlvbik9PntcbiAgICAgIGNvbnN0IGNhcmRDb250cm9sID0gc2VjdGlvbi5maWVsZHMuZmluZCgoZmllbGQ6SUZvcm1GaWVsZCk9PiBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCk7XG4gICAgICBpZihjYXJkQ29udHJvbCl7XG4gICAgICAgIGNhcmRDb250cm9sLmNhcmQuZGF0YSA9IHVwZGF0ZWRDYXJkRGF0YTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZHluYW1pY0Zvcm0gPSB0aGlzLmZvcm07XG4gIH1cblxuICBzZXRDYXJkSWRzKHJlcykge1xuICAgIHJlcy5yZWNvcmRzID0gdGhpcy5ncmlkU2VydmljZS5zZXREYXRhRmllbGRzKHJlcy5yZWNvcmRzKTtcbiAgICByZXMucmVjb3Jkcz8uZm9yRWFjaCgocmVjb3JkOiBhbnksIHJlY29yZEluZGV4OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoQ2FyZCA9IHJlcy5jYXJkc0luZm8/LmZpbmQoXG4gICAgICAgIChpbmZvLCBjYXJkSW5kZXgpID0+XG4gICAgICAgICAgcmVjb3JkSW5kZXggPT09IGNhcmRJbmRleCAmJiByZWNvcmRbcmVzLmZpZWxkTmFtZT8udG9Mb3dlckNhc2UoKV1cbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hDYXJkICYmIE9iamVjdC5rZXlzKG1hdGNoQ2FyZCk/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbWF0Y2hDYXJkW3Jlcy5maWVsZE5hbWVdID0gcmVjb3JkW3Jlcy5maWVsZE5hbWU/LnRvTG93ZXJDYXNlKCldO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZDtcbiAgICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmKHJlcy5jYXJkSWQpe1xuICAgICAgICAgIGZvcm1GaWVsZCA9IGZvcm1TZWN0aW9uLmZpZWxkcz8uZmluZChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQgJiYgZmllbGQuaWQgPT09IHJlcy5jYXJkSWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1GaWVsZCA9IGZvcm1TZWN0aW9uLmZpZWxkcz8uZmluZChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZm9ybUZpZWxkKSB7XG4gICAgICAgICAgaWYgKHJlcy5jYXJkc0luZm8/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlcy5jYXJkc0luZm8/LmZvckVhY2goKGNhcmRJZCkgPT4ge1xuICAgICAgICAgICAgICBjYXJkSWQuaWQgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvcm1GaWVsZC5jYXJkLmRhdGEgPSByZXMuY2FyZHNJbmZvO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXRDYXJkRGF0YSA9ICF0aGlzLnNldENhcmREYXRhO1xuICB9XG5cbiAgcmVtb3ZlV2hpdGVTcGFjZXMoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLmNsYXNzKSBzZWN0aW9uLmNsYXNzID0gc2VjdGlvbi5jbGFzcy5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5IWVBFUkxJTksgJiZcbiAgICAgICAgICBmaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5yZXNldENvbmZpZyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGg6ICdoeXBlcmxpbmsnICsgZmllbGQubGFiZWwsXG4gICAgICAgICAgICAgIGNvbXBvbmVudDogZmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLnJvdXRlci5jb25maWcsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYnJvd3NlclRhYkNsb3NlRXZlbnQoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZXZlbnQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpe1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG4gIGxpc3RlblRvU3BsaXRTY3JlZW5DaGFuZ2UoKXtcbiAgICB1dGlsaXRpZXMub25TY3JlZW5TcGxpdENoYW5nZSgpLnN1YnNjcmliZShyZXM9PntcbiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWVzKCk7XG4gICAgICB0aGlzLnBhbmVsSW5mbyA9IHt9O1xuICAgICAgdGhpcy5wYW5lbEluZm8ucGFuZWxDb21wb25lbnQgPSByZXMucGFuZWxDb21wb25lbnQ7XG4gICAgICB0aGlzLnBhbmVsSW5mby5jb25maWdEYXRhID0gcmVzLmNvbmZpZ0RhdGE7XG4gICAgICB0aGlzLnBhbmVsSW5mby5leGlzdGluZ0NvcG1vbmVudCA9ICB0aGlzLnZpZXdDb250YWluZXJGb3JtUmVmPy5uYXRpdmVFbGVtZW50Py5pbm5lckhUTUw7XG4gICAgICB0aGlzLnNwbGl0U2NyZWVuID0gdHJ1ZTtcbiAgICB9KVxuICB9XG5cbiAgc3luY0lucHV0VmFsdWVzKCkge1xuICAgIGNvbnN0IGlucHV0cyA9IHRoaXMudmlld0NvbnRhaW5lckZvcm1SZWY/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cInRleHRcIl0nKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCBpbnB1dC52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbmNsb3NlUGFuZWwoKXtcbiAgdGhpcy5zcGxpdFNjcmVlbiA9IGZhbHNlO1xufVxuICAvKipcbiAgICogTGlzdGVucyBhbnkgY2hhbmdlIGluIER5bmFtaWMgRm9ybSBjb21wb25lbnQgU3RhdGVcbiAgICovXG5cbiAgb25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdXRpbGl0aWVzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5pZCAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZk9iaiA9IHRoaXMuY29tcG9uZW50c0xpc3QuZmluZChcbiAgICAgICAgICAoeCkgPT4geC5uYW1lID09PSByZXNwb25zZS5pZFxuICAgICAgICApO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmT2JqKSB7XG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuZGF0YSA/PyB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBjb21wb25lbnRSZWZPYmoudmFsdWUuaW5zdGFuY2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmKHJlc3BvbnNlPy5sb2FkQ29tcG9uZW50KXtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZk9iai52YWx1ZS5pbnN0YW5jZS5uZ09uSW5pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnNcbiAgYXBwbHlVc2VyUGVybWlzc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKSB7XG4gICAgICBsZXQgdG90YWxGaWVsZHM6IG51bWJlciA9IDA7XG4gICAgICBsZXQgZGlzYWJsZWRGaWVsZHM6IG51bWJlciA9IDA7XG4gICAgICBsZXQgaGlkZGVuRmllbGRzOiBudW1iZXIgPSAwO1xuXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGVybWlzc2lvbnM6IGFueSA9IGZvcm1GaWVsZC5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGxldCBzZWN0aW9uUGVybWlzc2lvbnM6IGFueSA9IFtdO1xuICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9ucykgc2VjdGlvblBlcm1pc3Npb25zID0gZm9ybVNlY3Rpb24ucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBpZiAoIXBlcm1pc3Npb25zKSBwZXJtaXNzaW9ucyA9IHRoaXMuZm9ybS5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGxldCBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChzZWN0aW9uUGVybWlzc2lvbnMgJiYgc2VjdGlvblBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc2VjdGlvblBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb25zICYmIHBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbi5yb2xlcyAmJiBwZXJtaXNzaW9uLnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLlZJRVcgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc1ZhbGlkRWRpdFBlcm1pc3Npb25cbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuRURJVCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQucGVybWlzc2lvbnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5wZXJtaXNzaW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtU2VjdGlvbi5kaXNhYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvdGFsRmllbGRzKys7XG5cbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgZGlzYWJsZWRGaWVsZHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZGVuRmllbGRzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmlzRm9ybURpc2FibGVkID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBkaXNhYmxlZEZpZWxkcztcbiAgICAgIHRoaXMuaXNGb3JtSGlkZGVuID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBoaWRkZW5GaWVsZHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gSUZyYW1lIGluIGh5cGVybGluayBDb250cm9sXG4gICAqL1xuICBzZWN0aW9uRGlzYWJsZWQoZm9ybVNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIGlmIChmb3JtU2VjdGlvbi5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYoZm9ybVNlY3Rpb24uZGlzYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFNlY3Rpb25GaWVsZHMoZm9ybVNlY3Rpb24sIGZhbHNlKTtcbiAgICB9ZWxzZSB7XG4gICAgICByZXR1cm4gZm9ybVNlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uOiBJRm9ybVNlY3Rpb24sIGRpc2FibGVkOiBib29sZWFuKXtcbiAgICBmb3JtU2VjdGlvbi5maWVsZHMubWFwKChmaWVsZDogSUZvcm1GaWVsZCkgPT4ge1xuICAgICAgZmllbGQuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybVNlY3Rpb247XG4gIH1cblxuICBsb2FkSUZyYW1lKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMuaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiAnSHlwZXJsaW5rJyxcbiAgICAgIHdpZHRoOiBmb3JtRmllbGQuaHlwZXJsaW5rPy53aWR0aCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggOiAnOTAlJyxcbiAgICAgIGhlaWdodDogZm9ybUZpZWxkLmh5cGVybGluaz8uaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgIGRhdGE6IHsgdmFsdWU6IGZvcm1GaWVsZC5oeXBlcmxpbms/LmxpbmssIGlGcmFtZUlkOiBmb3JtRmllbGQubGFiZWwgfSxcbiAgICB9KTtcbiAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYocmVmKTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkKTtcbiAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBpZiAoZm9ybUZpZWxkLm9uUmV0dXJuKSB7XG4gICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIERpYWxvZyBpbiBoeXBlcmxpbmsgQ29udHJvbFxuICAgKi9cbiAgaHlwZXJsaW5rRGlhbG9nKGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgZm9ybUZpZWxkOiBJRm9ybUZpZWxkID0gZXZlbnQuZm9ybUZpZWxkO1xuICAgIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuQkxBTkspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zO1xuICAgICAgd2luZG93Lm9wZW4oJ2h5cGVybGluaycgKyBmb3JtRmllbGQubGFiZWwpO1xuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLlNFTEYpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnaHlwZXJsaW5rJyArIGZvcm1GaWVsZC5sYWJlbF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuRElBTE9HKSB7XG4gICAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgICAgaWYgKChldmVudCAmJiBldmVudC5ldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50KSB8fCBmb3JtRmllbGQub3BlbkluTmV3VGFiKSB7XG4gICAgICAgIHRoaXMuaHlwZXJsaW5rU2VydmljZS5vcGVuRGlhbG9nSW5OZXdUYWIoZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQsIGZvcm1GaWVsZC5oeXBlcmxpbms/LnBhcmFtcyk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbihmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCwge1xuICAgICAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgID8gZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgd2lkdGg6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoIDogJycsXG4gICAgICAgICAgc3R5bGU6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyB7fSA6IHsgJ21heC13aWR0aCc6ICdmaXQtY29udGVudCcgfSxcbiAgICAgICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgICAgICBkYXRhOiBmb3JtRmllbGQuaHlwZXJsaW5rLnBhcmFtc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGZvcm1GaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBJZnJhbWUgb24gTGFiZWxcbiAgICovXG4gIGxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoXG4gICAgICAgIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rPy5oZWlnaHRcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodFxuICAgICAgICA6ICc4MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmxpbmtcbiAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLmxpbmtcbiAgICAgICAgICA6ICcnLFxuICAgICAgICBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAnSWZyYW1lQ29tcG9uZW50J1xuICAgICk7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLm9uQ2xpY2spIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpbmQgdGhlIHJlcXVpcmVkIGZpZWxkIGluIGZvcm1cbiAgICovXG4vLyAgIGFwcGx5UmVxdWlyZWRGaWVsZFZhbGlkYXRpb24oKSB7XG4vLyBjb25zb2xlLmxvZygnYXBwbHlpbmcgcmVxdWlyZWRmaWxlZCB2YWxpZGF0aW9ucycpXG4vLyAgICAgaWYgKFxuLy8gICAgICAgdGhpcy5mb3JtICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDBcbi8vICAgICApIHtcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuLy8gICAgICAgICBzZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsIGZpZWxkKVxuLy8gICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4vLyAgICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZCkgPT4ge1xuLy8gICAgICAgICAgICAgICBpZiAodmFsaWQudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsZmllbGQsJ2lzIHJlcXVpcmVkJylcbi8vICAgICAgICAgICAgICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICB9KTtcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfVxuXG4gIHNldEZpbGVVcmxzKGZpbGVVcmxzOiBhbnkpIHtcbiAgICBpZiAoZmlsZVVybHMgJiYgZmlsZVVybHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5maWxlVXBsb2FkVXJscyA9IGZpbGVVcmxzO1xuICAgICAgdGhpcy5zaG93ZmlsZVVwbG9hZEVycm9yID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGaWVsZHNWYWxpdGlvbnMoZmllbGRzOiBJRm9ybUZpZWxkW10pe1xuICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzID0gJyc7XG4gICAgbGV0IHZhbGlkaXR5ID0gdHJ1ZTtcbiAgICBpZiAoZmllbGRzKSB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmaWVsZHMpKSB7XG4gICAgICAgIGZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAvLyBzZXQgdXBsb2FkRmlsZSBVUkwgaW4gRm9ybUZpZWxkIGluIGNhc2Ugb2YgRklMRV9VUExPQURcbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5GSUxFX1VQTE9BRCkge1xuICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5maWxlVXBsb2FkVXJscztcblxuICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHgudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCAmJiAhZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dmaWxlVXBsb2FkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICBpZiAoZmllbGQuY2FyZCAmJiBmaWVsZC5jYXJkLmRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZERhdGEgPSBmaWVsZC5jYXJkLmRhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAoeDogYW55KSA9PiB4LnNlbGVjdGVkQ2FyZCAmJiB4LnNlbGVjdGVkQ2FyZC5sZW5ndGggPiAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0YSAmJiBzZWxlY3RlZERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBmaWVsZC5jYXJkLmRhdGEgPSBzZWxlY3RlZERhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRpdHk7XG4gIH1cbiAgb25TYXZlRm9ybSgpIHtcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIGxldCBpc0FsbEZpZWxkc1ZhbGlkID0gW107XG4gICAgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICBsZXQgbXVsaVNlbGVjdFZhbHVlID0ge307XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNBbGxGaWVsZHNWYWxpZC5wdXNoKHRoaXMuY2hlY2tGaWVsZHNWYWxpdGlvbnMoZm9ybVNlY3Rpb24uZmllbGRzKSk7XG4gICAgICAgIHZhbGlkaXR5ID0gaXNBbGxGaWVsZHNWYWxpZC5ldmVyeSgoZmllbGQpID0+IGZpZWxkID09IHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhbGlkaXR5ID0gdGhpcy5jaGVja0ZpZWxkc1ZhbGl0aW9ucyhmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHMpO1xuICAgICAgICBpc0FsbEZpZWxkc1ZhbGlkLnB1c2godGhpcy5jaGVja0ZpZWxkc1ZhbGl0aW9ucyhmb3JtU2VjdGlvbi5maWVsZHMpKTtcbiAgICAgICAgdmFsaWRpdHkgPSBpc0FsbEZpZWxkc1ZhbGlkLmV2ZXJ5KChmaWVsZCkgPT4gZmllbGQgPT0gdHJ1ZSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICBpZiAodmFsaWRpdHkpIHtcbiAgICAgIC8vIFNhdmUgZ3JpZCBvbiBmb3JtU2F2ZSBCdXR0b25cbiAgICAgIGxldCBjdXN0b21Db21wb25lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIGxldCB0ZW1wVmFsdWU6IGFueSA9IFtdO1xuICAgICAgbGV0IHNhdmVBbGxHcmlkOiBhbnkgPSBbXTtcbiAgICAgIGxldCBnZXRCdG5zOiBhbnkgPSBbXTtcbiAgICAgIC8vIHNldCB2YWx1ZSBhcyAxIG9yIDAgaW4gY2FzZSBvZiBjaGVja2JveFxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcyAmJiB2YWxpZGl0eSkge1xuICAgICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQudmFsdWUgPT09ICcnIHx8IGZpZWxkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb252ZXJ0IGRhdGUgaW50byB0aW1lIGFzIHN0cmluZ1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQudGltZU9ubHkgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykgfHwgZmllbGQudmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1BNJykpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKGZpZWxkLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZmllbGQuc2hvd1RpbWUpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAneXl5eS1NTS1kZCBISDptbTpzcycpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ0FNJykgJiZcbiAgICAgICAgICAgICAgICAhZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCdQTScpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZC52YWx1ZSwgJ2hoOm1tIGEnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTlVNRVJJQykge1xuICAgICAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gZmllbGQ/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRWYWx1ZSA9IGZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLicpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjYWxjdWxhdGVkVmFsdWUgPyBmaWVsZC52YWx1ZSA6IGZpZWxkLnZhbHVlIC8gMTAwKT8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcuJykgJiYgIWNhbGN1bGF0ZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBvZiBhdXRvQ29tcGxldGUgYXMgc3RyaW5nc1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgICAgICAgICFmaWVsZC5zaG93QWxsVmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQudmFsdWUubWFwKFxuICAgICAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB2YWx1ZVtmaWVsZC5kaXNwbGF5RmllbGRdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICh2YWx1ZS50b1N0cmluZygpPy5pbmNsdWRlcygnOycpIHx8XG4gICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0ZW1wVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZUFsbCgnLCcsICc7Jyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgbXVsdGlTZWxlY3QgYXJyYXkgaW50byBzdHJpbmdcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk1VTFRJU0VMRUNUICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpICYmXG4gICAgICAgICAgICAgIGZpZWxkLnNhdmVBc1N0cmluZyAhPT0gZmFsc2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBtdWxpU2VsZWN0VmFsdWVbZmllbGQuZmllbGRdID0gZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZT8udG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSA/IDEgOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2F2ZSBncmlkIG9uIGZvcm1TYXZlIEJ1dHRvblxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DT01QT05FTlQgJiYgIWN1c3RvbUNvbXBvbmVudCkge1xuICAgICAgICAgICAgICBjdXN0b21Db21wb25lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICBzYXZlQWxsR3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJyNzYXZlQWxsR3JpZFZhbHVlcycpO1xuICAgICAgICAgICAgICBnZXRCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnLnNhdmVSb3cnKTtcbiAgICAgICAgICAgICAgaWYgKHNhdmVBbGxHcmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNhdmVBbGxHcmlkWzBdLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybVBhZ2UgPSBpbnRlcnZhbCg3NTApLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybVBhZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChnZXRCdG5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzYXZlUm93QnRuIG9mIGdldEJ0bnMpIHtcbiAgICAgICAgICAgICAgICAgIHNhdmVSb3dCdG4/LmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQoZmFsc2UpO1xuICAgICAgaWYgKCFzYXZlQWxsR3JpZC5sZW5ndGggJiYgIWdldEJ0bnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQudGltZU9ubHkgJiYgZmllbGQuc2hvd1RpbWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBpZiAodHlwZW9mIGZpZWxkLnZhbHVlID09PSAnc3RyaW5nJyAmJiAvXlxcZHsyfTpcXGR7Mn0gW0FQXU0kLy50ZXN0KGZpZWxkLnZhbHVlKSkge1xuICAgICAgICAgICAgICAvLyAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5NVUxUSVNFTEVDVCAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gbXVsaVNlbGVjdFZhbHVlW2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGVtcFZhbHVlXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnLCcsICc7JylcbiAgICAgICAgICAgICAgICA/LnNwbGl0KCc7JylcbiAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZC5kaXNwbGF5RmllbGRdOiB2YWwgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSA9PT0gMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAoZmllbGQudmFsdWUgKiAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgKiAxMDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsRm9ybSgpIHtcbiAgICBpZiAodGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgfHwgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZVxuICAgICAgICAuY29uZmlybSh7XG4gICAgICAgICAga2V5OiAnY2FuY2VsQnV0dG9uJyxcbiAgICAgICAgICBtZXNzYWdlOiAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT8nLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc1swXS5kZXRhaWwgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgfVxuICB9XG5cbiAgbG9va3VwQ2xlYXJWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnZhbHVlKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGNhbGVuZGFyIHdpZHRoXG4gICAqL1xuICBzZXRDYWxhbmRlcldpZHRoKCkge1xuICAgIGNvbnN0IGNhbGFuZGVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wLWNhbGVuZGFyJyk7XG4gICAgbGV0IGZvcm06IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKTtcbiAgICBsZXQgd2lkdGggPSBmb3JtPy5jbGllbnRXaWR0aDtcbiAgICBjYWxhbmRlckVsZW1lbnQ/LmZvckVhY2goKGNhbGFuZGVyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGNhbGFuZGVyT2ZzZXRMZWZ0ID0gY2FsYW5kZXIub2Zmc2V0TGVmdDtcbiAgICAgIGlmIChjYWxhbmRlck9mc2V0TGVmdCA8PSB3aWR0aCAvIDIpIHtcbiAgICAgICAgY2FsYW5kZXIuY2xhc3NMaXN0LmFkZCgnb3Blbi1yaWdodC1zaWRlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IHRoZSBkeW5hbWljIGRpYWxvZyBkYXRhXG4gICAqL1xuICBzZXREaWFsb2dEYXRhKGZvcm1GaWVsZDogSUZvcm1GaWVsZCwgZGF0YTogYW55KTogYW55IHtcbiAgICBpZiAoZGF0YSAmJiBmb3JtRmllbGQpIHtcbiAgICAgIGxldCB2YWx1ZTogYW55O1xuICAgICAgZGF0YSA9IHV0aWxpdGllcy5vYmpDb252ZXJ0VG9Mb3dlcihkYXRhKTtcbiAgICAgIGxldCBzZWxlY3Rpb246IHN0cmluZyA9ICcnO1xuICAgICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAmJiB0eXBlb2YgZm9ybUZpZWxkLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQgJiZcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dC50b1N0cmluZygpLnRyaW0oKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWUudGV4dD8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzcGxheUZpZWxkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZT8udmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIGZvcm1GaWVsZC52YWx1ZS50b1N0cmluZygpLnRyaW0oKSkge1xuICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBkYXRhLmNvbXBvbmVudD8ubmFtZTtcbiAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihkYXRhLmNvbXBvbmVudCwge1xuICAgICAgICAuLi5kYXRhLmRhdGEsXG4gICAgICAgIHN0eWxlQ2xhc3M6ICdsb29rdXAtbW9kZWwnLFxuICAgICAgICBoZWlnaHQ6IGRhdGEuZGF0YT8uaGVpZ2h0ID8gZGF0YS5kYXRhPy5oZWlnaHQgOiAnOTB2aCcsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcbiAgICAgICAgICBmaWVsZDogZm9ybUZpZWxkLmZpZWxkLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZUZpZWxkOiBkYXRhLmRhdGE/LnZhbHVlRmllbGQsXG4gICAgICAgICAgLi4uZGF0YS5kYXRhLmRhdGEsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBmb3JtRmllbGQuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljayhmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGxhYmVsXG4gICAqL1xuICBzZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQ6IGFueSwgZXZlbnQ/OiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBmb3JtRmllbGQubGFiZWwgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbFxuICAgICkge1xuICAgICAgaWYgKChldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uY29tcG9uZW50KSB8fCBmb3JtRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2w/Lm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbC5jb21wb25lbnQsIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uZGF0YS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZWY6IGFueSA9IHRoaXMuc2V0RGlhbG9nRGF0YShcbiAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcbiAgICAgICAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkPy5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmxhYmVsLm9uUmV0dXJuKVxuICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwub25SZXR1cm4oZm9ybUZpZWxkLnZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICh7IGVycm9yIH06IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIGRpYWxvZyByZWYgd2hlbiBwb3B1cCBvcGVuXG4gICAqL1xuICBzZXREeW5hbWljRGlhbG9nUmVmKHJlZjogYW55KXtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2UuZGlhbG9nQ29tcG9uZW50UmVmTWFwLmdldChyZWYpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQgPSBkaWFsb2dSZWY/Lmluc3RhbmNlIGFzIER5bmFtaWNEaWFsb2dDb21wb25lbnQ7XG4gICAgY29uc3QgYXJpYUxhYmVsbGVkQnkgPSBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgZHluYW1pY0NvbXBvbmVudC5nZXRBcmlhTGFiZWxsZWRCeSA9ICgpID0+IGFyaWFMYWJlbGxlZEJ5O1xuICB9XG5cbiAgaW50ZXJjZXB0RGlhbG9nQ2xvc2UoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpIHtcbiAgICAgIGlmIChjb25maXJtKFwiWW91IHdpbGwgbG9zZSBjaGFuZ2VzIG5vdCBzYXZlZCBvbiBwYWdlLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT9cIikgPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC5sb29rdXBDb250cm9sKSB7XG4gICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB0aGlzLmxvb2t1cEZvY3VzT3V0ID0gdHJ1ZTtcbiAgICAgIGxldCB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5zZXREaWFsb2dEYXRhKGZvcm1GaWVsZCwgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpO1xuICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCB8fCB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZD1mYWxzZTtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmZpZWxkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtRmllbGQuZmllbGQpPy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0RGlhbG9nUmVzcG9uc2UoXG4gICAgICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wsXG4gICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubG9va3VwRm9jdXNPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIGZvcm1GaWVsZC5vblJldHVybihmb3JtRmllbGQudmFsdWUsIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgY29uc3QgZm9ybUZpZWxkVmFsdWUgPVxuICAgICAgICAgICAgdHlwZW9mIGZvcm1GaWVsZC52YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBmb3JtRmllbGQudmFsdWUudGV4dFxuICAgICAgICAgICAgICA6IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZT8udGV4dCA6IHZhbHVlO1xuICAgICAgICAgIGlmIChmb3JtRmllbGRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgZXJyb3IgfTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvbkNsaWNrIGV2ZW50IGludm9rZWQgJiYgb3BlbiBEaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZC9sYWJlbFxuICAgKi9cbiAgaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpIHtcbiAgICAgIHRoaXMuc2VsZWN0TG9va3VwTGFiZWwoZm9ybUZpZWxkKTtcbiAgICAgIHRoaXMuc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2V0IENhbGVuZGFyIERhdGUgRm9ybWF0ICYmIHNldCBEYXRlIE1pbnV0ZSBpbnRlcnZhbFxuICAgKi9cbiAgc2V0Q2FsZW5kYXJEYXRlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSKSB7XG4gICAgICAvLyBjb252ZXJ0IHRpbWUgaW50byBkYXRlIGZvcm1hdFxuICAgICAgaWYgKFxuICAgICAgICBmb3JtRmllbGQudGltZU9ubHkgJiZcbiAgICAgICAgKGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fFxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSlcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0VGltZUluRGF0ZShmb3JtRmllbGQudmFsdWUpO1xuICAgICAgfWVsc2UgaWYgKFxuICAgICAgICAoZm9ybUZpZWxkLnNob3dUaW1lIHx8IGZvcm1GaWVsZC50aW1lT25seSkgJiZcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZShcbiAgICAgICAgICB1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKGZvcm1GaWVsZC52YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChmb3JtRmllbGQuc2hvd1RpbWUgfHwgZm9ybUZpZWxkLnRpbWVPbmx5KSAmJlxuICAgICAgICAhZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKG5ldyBEYXRlKCkpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfVxuICBjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZDogYW55KSB7XG4gICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAhPT0gZm9ybUZpZWxkLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgIGZvcm1GaWVsZC5wcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlZCBzZWN0aW9uIENsaWNrZWQgZXZlbnRcbiAgICovXG4gIGNsaWNrZWRTZWN0aW9uKHNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIHRoaXMuc2VjdGlvbkNsaWNrZWRFdmVudC5lbWl0KHNlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIGluIE5vdGVfRmllbGQgY29ucnRyb2xcbiAgICovXG4gIGhhbmRsZU5vdGVGaWVsZERpYWxvZyhmb3JtZmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihOb3Rlc0NvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBmb3JtZmllbGQubGFiZWwgYXMgc3RyaW5nLFxuICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybWZpZWxkLnZhbHVlLFxuICAgICAgICBkaXNhYmxlZFRleHQ6IGZvcm1maWVsZC5kaXNhYmxlZFRleHQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1maWVsZD8uZmllbGQgPyBmb3JtZmllbGQ/LmZpZWxkIDogZm9ybWZpZWxkPy5sYWJlbCk7XG4gICAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGZvcm1maWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1maWVsZC5vblJldHVybihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRDbGFzc05hbWUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKTogc3RyaW5nIHtcbiAgICBpZiAoZm9ybUZpZWxkLmhpZGRlbikgcmV0dXJuICcgaGlkZGVuJztcbiAgICBlbHNlIHJldHVybiAnJztcbiAgfVxuXG4gIGF1dG9TZWFyY2goZXZlbnQ6IGFueSkge1xuICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGRcbiAgICBpZiAoZm9ybUZpZWxkICYmIGV2ZW50ICYmIGV2ZW50LmV2ZW50KSB7XG4gICAgICBmb3JtRmllbGQub25SZXR1cm4oZXZlbnQuZXZlbnQucXVlcnksIGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGludm9rZWQgb25Gb2N1c091dCBFdmVudFxuICAgKi9cbiAgb25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGxldCByZWNvcmQ6IGFueSA9IHt9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIHNlY3Rpb24/LmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChmb3JtRmllbGQuZmllbGQpIHtcbiAgICAgICAgICByZWNvcmRbZm9ybUZpZWxkLmZpZWxkXSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdXRpbGl0aWVzLnNldEh5cGVybGlua1BhcmFtVmFsdWUocmVjb3JkLCB0aGlzLmZvcm0pO1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgICBpZiAoZm9ybUZpZWxkICYmIGZvcm1GaWVsZC5vbkZvY3VzT3V0ICYmIHRoaXMubG9va3VwRm9jdXNPdXQgPT09IGZhbHNlKSB7XG4gICAgICBmb3JtRmllbGQub25Gb2N1c091dChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmFja1NwYWNlRXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKHR5cGVvZiBmb3JtRmllbGQudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUudGV4dCA9IGZvcm1GaWVsZC52YWx1ZS50ZXh0LnN1YnN0cmluZyhcbiAgICAgICAgMCxcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGlmIChmb3JtRmllbGQudmFsdWUudGV4dC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvL3RoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQudmFsdWUgJiYgZm9ybUZpZWxkLnZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjbGVhciB0aGUgZHJvcGRvd24gdmFsdWUgd2hlbiBjbGljayBvbiB4XG4gICAqL1xuICBvbkNsZWFyVmFsdWUoZXZlbnQ6IGFueSkge1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGQ7XG4gICAgdGhpcy5vbkNoYW5nZUV2ZW50KGZvcm1GaWVsZCk7XG4gICAgdGhpcy5kcm9wRG93bkNoYW5nZUV2ZW50LmVtaXQoZm9ybUZpZWxkKTtcbiAgICBpZiAoIWV2ZW50LmV2ZW50LnZhbHVlKSB7XG4gICAgICB0aGlzLm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRHJvcGRvd25WYWx1ZShmb3JtRmllbGQ6IGFueSkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIG9uQ2hhbmdlIEV2ZW50IHdoZW4gVmFsdWUgQ2hhbmdlZFxuICAgKi9cbiAgb25DaGFuZ2VFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KHRydWUpO1xuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHR5cGVPZih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZva2Ugb24gZHluYW1pYyBidXR0b25zIGNsaWNrXG4gICAqL1xuICBvbk5ld0J1dHRvbkNsaWNrKGJ1dHRvbikge1xuICAgIGxldCBzYXZlQWxsR3JpZDogYW55ID0gW107XG4gICAgbGV0IGdldEJ0bnM6IGFueSA9IFtdO1xuICAgIGxldCB2YWxpZGl0eSA9IHRydWU7XG4gICAgbGV0IGVycm9yTWVzc2FnZURldGFpbHMgPSAnJztcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmb3JtU2VjdGlvbi5maWVsZHMpKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkaXR5KSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgZ2V0QnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJy5zYXZlUm93Jyk7XG4gICAgICAgICAgaWYgKHNhdmVBbGxHcmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoZ2V0QnRucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzYXZlUm93QnRuIG9mIGdldEJ0bnMpIHtcbiAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICBidXR0b24uZnVuYygpO1xuICB9XG5cbiAgc2VsZWN0ZWRDYXJkQ2xpY2tFdmVudChkYXRhOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmNhcmQgJiYgZmllbGQuY2FyZC5kYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSBmaWVsZC5jYXJkLmRhdGFbZGF0YS5pbmRleF07XG4gICAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLnNlbGVjdGVkQ2FyZCkge1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5zZWxlY3RlZENhcmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG9ialsnc2VsZWN0ZWRDYXJkJ10gPSAnY2FyZC1hY3RpdmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuc2VsZWN0ZWRDYXJkKSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICdjYXJkLWFjdGl2ZSc7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlUGFzc3dvcmRUeXBlKGZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQudGV4dFR5cGUgPT0gJ3RleHQnKSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAndGV4dCc7XG4gICAgfVxuICB9XG4gIG9uTGlua0NsaWNrKGxpbmssIGZvcm1TZWN0aW9uKXtcbiAgICBpZighbGluay5kaXNhYmxlZCAmJiAhZm9ybVNlY3Rpb24uZGlzYWJsZWQpe1xuICAgICAgbGluay5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG4gIGlzVmFsaWRDb2x1bW4oY29sOiBhbnkpe1xuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29sKSAmJiBjb2wgPiAwICYmIGNvbCA8PSAxMlxuICB9XG4gYXN5bmMgYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudChldmVudCk6IFByb21pc2U8dm9pZD57XG4gIGxldCBob3ZlckRhdGEgOklPdmVybGF5UGFuZWxEYXRhID0gZXZlbnQ/LmhvdmVyRGF0YTtcbiAgbGV0IG92ZXJsYXlQYW5lbDogYW55ID0gZXZlbnQ/Lm92ZXJsYXlQYW5lbDtcbiAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCk9PntcbiAgICAgIGNvbnN0IGRhdGEgPSB7Li4uaG92ZXJEYXRhPy5kYXRhfTtcbiAgICAgIGlmKE9iamVjdD8ua2V5cyhkYXRhKT8ubGVuZ3RoID4gMCl7XG4gICAgICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0Py5rZXlzKGhvdmVyRGF0YT8uZGF0YSk7XG4gICAgICAgIGlmKGRhdGFLZXlzPy5sZW5ndGggPjAgKXtcbiAgICAgICAgICBkYXRhS2V5cy5mb3JFYWNoKGtleT0+e1xuICAgICAgICAgICAgdmFyIHZhbHVlID1kYXRhW2tleV07XG4gICAgICAgICAgICBpZih2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ3snKSAmJiB2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ30nKSl7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZVRvRmluZCA9IHZhbHVlLnJlcGxhY2UoJ3snLCcnKS5yZXBsYWNlKCd9JywnJyk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT0gdXRpbGl0aWVzLmdldEZvcm1GaWVsZFZhbHVlKHRoaXMuZm9ybSwgdmFsdWVUb0ZpbmQpO1xuICAgICAgICAgICAgfWVsc2UgaWYoIXZhbHVlKXtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoZWRLZXlWYWx1ZSA9IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIGtleSk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT1tYXRjaGVkS2V5VmFsdWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaG92ZXJEYXRhPy5zdHlsZSA/ICh0aGlzLm92ZXJsYXlQYW5lbFN0eWxlID0gaG92ZXJEYXRhLnN0eWxlKSA6ICcnO1xuICAgICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWY6YW55ID0gdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyPy5jcmVhdGVDb21wb25lbnQoaG92ZXJEYXRhPy5jb21wb25lbnQpO1xuICAgICAgY29uc29sZS5sb2coY29tcG9uZW50UmVmKVxuICAgICAgaWYoaG92ZXJEYXRhLmRhdGEpe1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY29uZmlnID0gW107XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcuZGF0YSA9IGRhdGE7XG4gICAgICB9XG4gICAgICBvdmVybGF5UGFuZWwuc2hvdyhldmVudD8uZXZlbnQpO1xuICAgICAgXG4gICAgIH0pXG4gIH1cbiAgbW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbCl7XG4gICAgb3ZlcmxheVBhbmVsPy5oaWRlKCk7XG4gIH1cblxufVxuXG4iLCI8c2Utc3BsaXR0ZXIgXG4gICpuZ0lmPVwic3BsaXRTY3JlZW5cIlxuICBbZXhpc3RpbmdDb3Btb25lbnRdPVwicGFuZWxJbmZvLmV4aXN0aW5nQ29wbW9uZW50XCIgXG4gIFtwYW5lbENvbXBvbmVudF09XCJwYW5lbEluZm8ucGFuZWxDb21wb25lbnRcIiBcbiAgW2NvbmZpZ0RhdGFdPVwicGFuZWxJbmZvLmNvbmZpZ0RhdGFcIiBcbiAgKGNsb3NlUGFuZWxFbWl0dGVyKT1cImNsb3NlUGFuZWwoKVwiXG4+PC9zZS1zcGxpdHRlcj5cbjxwLWNvbmZpcm1EaWFsb2cgW3N0eWxlXT1cInsgd2lkdGg6ICc1MHZ3JyB9XCIga2V5PVwiY2FuY2VsQnV0dG9uXCI+PC9wLWNvbmZpcm1EaWFsb2c+XG48ZGl2ICN2aWV3Q29udGFpbmVyRm9ybVJlZj5cbiAgPGZvcm0gKm5nSWY9XCIhaXNGb3JtSGlkZGVuICYmIGZvcm0gJiYgIXNwbGl0U2NyZWVuXCI+XG4gICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBjbGFzcz1cInByb2dyZXNzLXNwaW5uZXIgcC1wcm9ncmVzcy1zcGlubmVyLWNpcmNsZSBjdXN0b20tc3Bpbm5lclwiPjwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtd3JhcFwiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyAnZml4ZWQtaGVpZ2h0Jzogc3RpY2t5QWN0aW9ucyB9XCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZvcm1TZWN0aW9uIG9mIGZvcm0uZm9ybVNlY3Rpb25zXCIgW2NsYXNzXT1cIiFmb3JtU2VjdGlvbi5oaWRkZW4gPyAnY2FyZCB3LTEwMCcgOiAnJ1wiPlxuICAgICAgICAgIDxzcGFuIChjbGljayk9XCJjbGlja2VkU2VjdGlvbihmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZm9ybVNlY3Rpb24gPyAnJyA6IHNlY3Rpb25EaXNhYmxlZChmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaGlkZGVuID8gJ2hpZGRlbicgOiBmb3JtU2VjdGlvbi5jbGFzc1wiPlxuICAgICAgICAgICAgICAgIDxwLWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiBbc2VsZWN0ZWRdPVwiZm9ybVNlY3Rpb24uZXhwYW5kZWQgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1TZWN0aW9uLmFjY29yZGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiIWZvcm1TZWN0aW9uLnNob3dBY2NvcmRpb24gPyAnaGlkZS1hY2NvcmRpYW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJmb3JtU2VjdGlvbi5pY29uXCIgW3RpdGxlXT1cImZvcm1TZWN0aW9uLm5hbWVcIiBjbGFzcz1cIm1yLTEgcGwtMlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1YnNlY3Rpb24taGVhZGVyXCI+e3sgZm9ybVNlY3Rpb24ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcC1oZWFkZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHAtY29sIGZvcm0tY29tcG9uZW50IGFjY29yZGlvbi1oZWFkZXItd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIiFmb3JtU2VjdGlvbi5zaG93QWNjb3JkaW9uXCIgZm9yPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbkhlYWRlck5hbWUgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFt0aXRsZV09XCJmb3JtU2VjdGlvbi5uYW1lXCIgW2NsYXNzXT1cImZvcm1TZWN0aW9uLmljb25cIiBjbGFzcz1cIlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+IHt7IGZvcm1TZWN0aW9uLm5hbWUgfX0gPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGxpbmsgb2YgZm9ybVNlY3Rpb24ubGlua3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1yLTMgY3VzdG9tLWxpbmtcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImxpbmsubmFtZSAmJiFmb3JtU2VjdGlvbi5kaXNhYmxlZCYmIWxpbmsuZGlzYWJsZWQgID8gJ2N1c3RvbS1saW5rJyA6ICdkaXNhYmxlZC1saW5rJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkxpbmtDbGljayhsaW5rLCBmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGluay5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBmb3JtLWNvbXBvbmVudCBmb3JtLWJvZHktd3JhcHBlciBoZWFkZXItZmllbGRzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIihoZWFkZXJGaWVsZC5jb250cm9sPT09J2FkZF9idXR0b24nPyAnIGZvcm0tYnV0dG9uLWZpZWxkLXdyYXBwZXIgJzonJykrXG4gICAgICAgICAgICAgICAgICAgICAgICAoIGlzVmFsaWRDb2x1bW4oaGVhZGVyRmllbGQuY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBoZWFkZXJGaWVsZC5jb2x1bW4gKyBzZXRDbGFzc05hbWUoaGVhZGVyRmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzVmFsaWRDb2x1bW4oZm9ybS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm0uY29sdW1uICsgc2V0Q2xhc3NOYW1lKGhlYWRlckZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBoZWFkZXJGaWVsZC5jb2x1bW4gfHwgZm9ybS5jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgID8gJyBjb2wgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnY29sLTEyIG1kOmNvbC0zIGZsZXggZmxleC1jb2x1bW4nICsgc2V0Q2xhc3NOYW1lKGhlYWRlckZpZWxkKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXJGaWVsZC5jb250cm9sID09PSAnYnJlYWtfbGluZScgPyAnYnJlYWstbGluZScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoZWFkZXJGaWVsZCBvZiBmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM7IGxldCBoZWFkZXJGaWVsZEluZGV4ID0gaW5kZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTd2l0Y2hdPVwiaGVhZGVyRmllbGQuY29udHJvbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBsYWJlbENvbnRyb2wgSHlwZXJsaW5rIG9uIGxvb2t1cCAgQ29udHJvbCBGaWVsZC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiBbb3ZlcmxheVBhbmVsXT1cIm92ZXJsYXlQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbERpc3BsYXldPVwibGFiZWxEaXNwbGF5XCIgKG9uTW91c2VFbnRlcik9XCJhZGREeW5hbWljUGFuZWxPdmVybGF5Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Nb3VzZUxlYXZlKT1cIm1vdXNlTGVhdmVFdmVudCgkZXZlbnQpXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Mb2FkTGFiZWxDb250cm9sSUZyYW1lQ2xpY2spPVwibG9hZExhYmVsQ29udHJvbElGcmFtZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0TG9va3VwTGFiZWxDbGljayk9XCJzZWxlY3RMb29rdXBMYWJlbCgkZXZlbnQ/LmZvcm1GaWVsZCwgJGV2ZW50Py5ldmVudClcIj48L2xhYmVsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWxEaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCIgW2NsYXNzXT1cImhlYWRlckZpZWxkLmxhYmVsLmljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCI+IHt7aGVhZGVyRmllbGQubGFiZWwubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLklOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQtY29udHJvbCBbZmllbGRdPVwiaGVhZGVyRmllbGRcIiAoY2hhbmdlUGFzc3dvcmQpPVwiY2hhbmdlUGFzc3dvcmRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2lucHV0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtZXJpYyBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OVU1FUklDXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1jb250cm9sIFtmaWVsZF09XCJoZWFkZXJGaWVsZFwiIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0TG9va3VwKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENoZWNrYm94IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNIRUNLQk9YXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2hlY2tib3gtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2hlY2tib3gtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYXNzd29yZCBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5QQVNTV09SRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhc3N3b3JkLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXNzd29yZC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TUEFDRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFjZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9zcGFjZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbnB1dCBUZXh0QXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVEFSRUFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QXJlYS1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L3RleHRBcmVhLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWxlbmRhciBDb250cm9sLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBTEVOREFSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FsZW5kYXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgW2RlZmF1bHREYXRlXT1cImRlZmF1bHREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCIgKG9uU2hvdyk9XCJzZXRDYWxlbmRhckRhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiIChuZ01vZGVsQ2hhbmdlKT1cImNhbGVuZGFyQ2hhbmdlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbklucHV0KT1cImNhbGVuZGFySW5wdXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2NhbGVuZGFyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRFJPUERPV05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkcm9wZG93bi1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAoa2V5dXBUYWIpPVwidGFiRm9jdXNFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKCRldmVudClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNsZWFyVmFsdWUoJGV2ZW50KVwiPjwvZHJvcGRvd24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEF1dG9Db21wbGV0ZSBTZWFyY2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFVVE9DT01QTEVURVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF1dG9Db21wbGV0ZS1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCIgKGNvbXBsZXRlTWV0aG9kKT1cImF1dG9TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9hdXRvQ29tcGxldGUtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpLXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTVVMVElTRUxFQ1RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L211bHRpc2VsZWN0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIeXBlcmxpbmstLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSFlQRVJMSU5LXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHlwZXJsaW5rLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkh5cGVybGlua0RpYWxvZ0NsaWNrKT1cImh5cGVybGlua0RpYWxvZygkZXZlbnQpXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmcmFtTG9hZEV2ZW50KT1cImxvYWRJRnJhbWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oeXBlcmxpbmstY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5MT09LVVBfSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb29rdXAtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGtleXVwVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJMb29rdXBWYWx1ZSk9XCJsb29rdXBDbGVhclZhbHVlKCRldmVudClcIj48L2xvb2t1cC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VMRUNUQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0LWJ1dHRvbi1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgRGV0YWlsIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OT1RFX0ZJRUxEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZS1kZXRhaWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlTm90ZUZpZWxkRGlhbG9nKCRldmVudClcIj48L25vdGUtZGV0YWlsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgY29tcG9uZW50LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFQ1RJT05fSEVBREVSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbi1oZWFkZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIE9uQ2xpY2sgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9hZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBSZXBvcnQgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUkVQT1JUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cImhlYWRlckZpZWxkXCIgW2xhYmVsXT1cImhlYWRlckZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaGVhZGVyRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImhlYWRlckZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiaGVhZGVyRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBoZWFkZXJGaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiaGVhZGVyRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhlYWRlckZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TV0lUQ0hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dC1zd2l0Y2gtY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiPjwvSW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgQ29tcG9uZW50IENvbnRhaW5lci0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5oaWRkZW4gPyAnaGlkZGVuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwie3tmb3JtU2VjdGlvbi5uYW1lfX0te3toZWFkZXJGaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ09NUE9ORU5UXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGhlYWRlckZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiaGVhZGVyRmllbGQuc2VsZWN0TXVsdGlwbGVGaWxlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEZpbGVUeXBlc109XCJoZWFkZXJGaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVybCk9XCJzZXRGaWxlVXJscygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERpc3BsYXkgIENhcmQgZmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQVJEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlckZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlckZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChoZWFkZXJGaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtY2FyZCBbY2FyZF09XCJoZWFkZXJGaWVsZC5jYXJkXCIgW3NldENhcmREYXRhXT1cInNldENhcmREYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDYXJkKT1cInNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoJGV2ZW50KVwiPjwvc2UtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBmb3JtLWNvbXBvbmVudCBmb3JtLWJvZHktd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIihmb3JtRmllbGQuY29udHJvbD09PSdhZGRfYnV0dG9uJz8gJyBmb3JtLWJ1dHRvbi1maWVsZC13cmFwcGVyICc6JycpK1xuICAgICAgICAgICAgICAgICAgICAoIGlzVmFsaWRDb2x1bW4oZm9ybUZpZWxkLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBmb3JtRmllbGQuY29sdW1uICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgOiBpc1ZhbGlkQ29sdW1uKGZvcm0uY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm0uY29sdW1uICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtRmllbGQuY29sdW1uIHx8IGZvcm0uY29sdW1uXG4gICAgICAgICAgICAgICAgICAgID8gJyBjb2wgJ1xuICAgICAgICAgICAgICAgICAgICA6ICdjb2wtMTIgbWQ6Y29sLTMgZmxleCBmbGV4LWNvbHVtbicgKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9ybUZpZWxkLmNvbnRyb2wgPT09ICdicmVha19saW5lJyA/ICdicmVhay1saW5lJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmb3JtRmllbGQgb2YgZm9ybVNlY3Rpb24uZmllbGRzOyBsZXQgZm9ybUZpZWxkSW5kZXggPSBpbmRleFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGxhYmVsQ29udHJvbCBIeXBlcmxpbmsgb24gbG9va3VwICBDb250cm9sIEZpZWxkLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIFtvdmVybGF5UGFuZWxdPVwib3ZlcmxheVBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxEaXNwbGF5XT1cImxhYmVsRGlzcGxheVwiIChvbk1vdXNlRW50ZXIpPVwiYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Nb3VzZUxlYXZlKT1cIm1vdXNlTGVhdmVFdmVudChvdmVybGF5UGFuZWwpXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkxvYWRMYWJlbENvbnRyb2xJRnJhbWVDbGljayk9XCJsb2FkTGFiZWxDb250cm9sSUZyYW1lKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdExvb2t1cExhYmVsQ2xpY2spPVwic2VsZWN0TG9va3VwTGFiZWwoJGV2ZW50Py5mb3JtRmllbGQsICRldmVudD8uZXZlbnQpXCI+PC9sYWJlbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYWJlbERpc3BsYXk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiZm9ybUZpZWxkLmxhYmVsLmljb25cIiBbY2xhc3NdPVwiZm9ybUZpZWxkLmxhYmVsLmljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5sYWJlbC5pY29uXCI+IHt7Zm9ybUZpZWxkLmxhYmVsLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nU3dpdGNoXT1cImZvcm1GaWVsZC5jb250cm9sXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTcGFjZXIgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNQQUNFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFjZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiPjwvc3BhY2VyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IFRleHRBcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVEFSRUFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEFyZWEtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC90ZXh0QXJlYS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZXh0IElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQtY29udHJvbCBbZmllbGRdPVwiZm9ybUZpZWxkXCIgKGNoYW5nZVBhc3N3b3JkKT1cImNoYW5nZVBhc3N3b3JkVHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2lucHV0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE51bWJlciBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5VTUVSSUNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1jb250cm9sIFtmaWVsZF09XCJmb3JtRmllbGRcIiAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RMb29rdXApPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYXNzd29yZCBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlBBU1NXT1JEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhc3N3b3JkLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXNzd29yZC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0hFQ0tCT1hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2hlY2tib3gtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2hlY2tib3gtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBTEVOREFSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbGVuZGFyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiBbZGVmYXVsdERhdGVdPVwiZGVmYXVsdERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCIgKG9uU2hvdyk9XCJzZXRDYWxlbmRhckRhdGUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwiY2FsZW5kYXJJbnB1dFZhbHVlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L2NhbGVuZGFyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRFJPUERPV05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcGRvd24tY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChrZXl1cFRhYik9XCJ0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKGZvcm1GaWVsZClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DbGVhclZhbHVlKCRldmVudClcIj48L2Ryb3Bkb3duLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEF1dG9Db21wbGV0ZSBTZWFyY2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXV0b0NvbXBsZXRlLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiIChjb21wbGV0ZU1ldGhvZCk9XCJhdXRvU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L2F1dG9Db21wbGV0ZS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aS1zZWxlY3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5NVUxUSVNFTEVDVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvbXVsdGlzZWxlY3QtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSHlwZXJsaW5rLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5IWVBFUkxJTktcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHlwZXJsaW5rLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSHlwZXJsaW5rRGlhbG9nQ2xpY2spPVwiaHlwZXJsaW5rRGlhbG9nKCRldmVudClcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmcmFtTG9hZEV2ZW50KT1cImxvYWRJRnJhbWUoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaHlwZXJsaW5rLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTE9PS1VQX0lOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvb2t1cC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKGtleXVwVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckxvb2t1cFZhbHVlKT1cImxvb2t1cENsZWFyVmFsdWUoZm9ybUZpZWxkKVwiPjwvbG9va3VwLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1GaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiZm9ybUZpZWxkLnNlbGVjdE11bHRpcGxlRmlsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0RmlsZVR5cGVzXT1cImZvcm1GaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImZvcm1GaWVsZFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVybCk9XCJzZXRGaWxlVXJscygkZXZlbnQpXCIgW2lzQXp1cmVVcGxvYWRdPVwiZm9ybUZpZWxkLmlzQXp1cmVVcGxvYWQgPT0gZmFsc2UgPyBmb3JtRmllbGQuaXNBenVyZVVwbG9hZCA6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VMRUNUQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdC1idXR0b24tY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXNwbGF5ICBDYXJkIGZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FSRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWNhcmQgW2NhcmRdPVwiZm9ybUZpZWxkLmNhcmRcIiBbc2V0Q2FyZERhdGFdPVwic2V0Q2FyZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDYXJkKT1cInNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoJGV2ZW50KVwiPjwvc2UtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIERldGFpbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5PVEVfRklFTERcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZS1kZXRhaWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVOb3RlRmllbGREaWFsb2coZm9ybUZpZWxkKVwiPjwvbm90ZS1kZXRhaWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHluYW1pYyBDb21wb25lbnQgQ29udGFpbmVyLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJmb3JtRmllbGQuaGlkZGVuID8gJ2hpZGRlbicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ7e2Zvcm1TZWN0aW9uLm5hbWV9fS17e2Zvcm1GaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNPTVBPTkVOVFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgY29tcG9uZW50LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUNUSU9OX0hFQURFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uLWhlYWRlci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgT25DbGljayBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZC1idXR0b24tY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCI+PC9hZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIFJlcG9ydCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5SRVBPUlRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cImZvcm1GaWVsZFwiIFtsYWJlbF09XCJmb3JtRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZm9ybUZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJmb3JtRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiZm9ybUZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgZm9ybUZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImZvcm1GaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImZvcm1GaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiZm9ybUZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9ybUZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1dJVENIXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIj48L0lucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cbiAgICAgICAgICAgICAgICA8L3AtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gc2F2ZSBhbmQgY2xvc2UgYnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgYWN0aW9ucy1idXR0b25zLW1haW4td3JhcHBlciBmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiBbbmdDbGFzc109XCJ7IHN0aWNreTogc3RpY2t5QWN0aW9ucyB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lci1zdGlja3kgZm9ybS1jb21wb25lbnQgYWN0aW9ucy1idXR0b25zLXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgPCEtLSBzYXZlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGVTYXZlQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJzYXZlQnV0dG9uTGFiZWwgPyBzYXZlQnV0dG9uTGFiZWwgOiAnU2F2ZSdcIiBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgZm9ybS1zYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TYXZlRm9ybSgpXCI+PC9idXR0b24+XG4gICAgICAgICAgPCEtLSBjbG9zZSBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlQ2FuY2VsQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2FuY2VsRm9ybSgpXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIFtsYWJlbF09XCJjYW5jZWxCdXR0b25MYWJlbCA/IGNhbmNlbEJ1dHRvbkxhYmVsIDogJ0NhbmNlbCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgbWwtM1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gZHluYW1pYyBidXR0b25zIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBmb3JtQnV0dG9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFidXR0b24uaGlkZGVuXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2xhYmVsXT1cImJ1dHRvbi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uID8gYnV0dG9uLmljb24gOiAnJ1wiIGNsYXNzPVwicC1idXR0b24tc3VjY2VzcyBtbC0zXCIgKGNsaWNrKT1cIm9uTmV3QnV0dG9uQ2xpY2soYnV0dG9uKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWQgPyBidXR0b24uZGlzYWJsZWQgOiBmYWxzZVwiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbiAgPHAtb3ZlcmxheVBhbmVsIFtzdHlsZV09XCJvdmVybGF5UGFuZWxTdHlsZVwiICNvdmVybGF5UGFuZWw+XG4gICAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lclJlZj48L25nLWNvbnRhaW5lcj5cbiAgPC9wLW92ZXJsYXlQYW5lbD5cbjwvZGl2PiJdfQ==