verben-workflow-ui 0.0.8 → 0.0.9
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.
|
@@ -18,7 +18,6 @@ import * as i5 from "@angular/router";
|
|
|
18
18
|
import * as i6 from "./form-fields.service";
|
|
19
19
|
import * as i7 from "@angular/common";
|
|
20
20
|
import * as i8 from "verben-ng-ui";
|
|
21
|
-
import * as i9 from "../../form-control/form-control.component";
|
|
22
21
|
var TaskUserPropertyName;
|
|
23
22
|
(function (TaskUserPropertyName) {
|
|
24
23
|
TaskUserPropertyName["User"] = "User";
|
|
@@ -805,11 +804,11 @@ export class FormFieldsComponent {
|
|
|
805
804
|
}
|
|
806
805
|
}
|
|
807
806
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldsComponent, deps: [{ token: i1.UtilService }, { token: i2.HttpWebRequestService }, { token: i0.ChangeDetectorRef }, { token: i3.FormBuilder }, { token: i4.EnvironmentService }, { token: i5.Router }, { token: i5.ActivatedRoute }, { token: i6.FormsFieldService }, { token: i7.Location }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
808
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldsComponent, selector: "lib-form-fields", inputs: { path: "path", application: "application", pageSize: "pageSize", searchDebounceTime: "searchDebounceTime" }, outputs: { onViewProcessClicked: "onViewProcessClicked" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, static: true }, { propertyName: "cardDataView", first: true, predicate: ["vdcv"], descendants: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }], ngImport: i0, template: "<header\n class=\"rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\"\n>\n <h4 class=\"font-semibold\">{{formName}}</h4>\n <verben-svg\n (click)=\"goBack()\"\n class=\"cursor-pointer\"\n [width]=\"17\"\n [height]=\"17\"\n [icon]=\"'close'\"\n ></verben-svg>\n</header>\n<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle:true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n [showFilterChild]=\"showFilter\"\n [searchValue]=\"searchTerm\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"onSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n #dt\n [data]=\"properties\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.Name\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"minValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n [ngModel]=\"getStringValue(row, 'MinValue')\"\n (valueChange)=\"convertToInt($event, row, 'MinValue')\"\n inputContainerClass=\"w-[130px]\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"maxValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n inputContainerClass=\"w-[130px]\"\n [ngModel]=\"getStringValue(row, 'MaxValue')\"\n (valueChange)=\"convertToInt($event, row, 'MaxValue')\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"defaultValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'text'\"\n inputContainerClass=\"w-[130px]\"\n [(ngModel)]=\"row.DefaultValue\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"dataType\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <div class=\"flex flex-col gap-1\">\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"row.DataType\"\n >\n </verben-drop-down>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"isRequired\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"row.IsRequired\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-isEditing=\"isEditing\" let-toggleRowEdit=\"toggleRowEdit\" let-row=\"row\" let-value>\n <verben-pop-Up [customStyles]=\"{'z-index': '99'}\" [dropdownOpen]=\"openDropdownId===row.id\"\n [enableMouseLeave]=\"false\" (close)=\"onClose()\">\n <verben-svg class=\"cursor-pointer actions-icon\" (click)=\"openDropdown(row)\" dropdown-trigger\n icon=\"list\"></verben-svg>\n <div class=\"pop-up-content flex flex-col\" *ngIf=\"openDropdownId===row.id\" dropdown-content>\n <div (click)=\"toggleRowEdit()\" class=\"pop-up-value cursor-pointer\">Edit</div>\n <div class=\"pop-up-value cursor-pointer\">Delete</div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template #cellEdit let-isEditing=\"isEditing\" let-toggleRowEdit=\"toggleRowEdit\" let-row=\"row\" let-value>\n <div class=\"flex gap-2 items-center\">\n <verben-svg icon=\"check\" [width]=\"15\" [height]=\"15\"\n (click)=\"saveViaTable(row, toggleRowEdit)\"></verben-svg>\n <verben-svg icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg>\n <verben-svg icon=\"cardViewAlt\" [width]=\"15\" [height]=\"15\" (click)=\"goToCardView(value)\"></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"id\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"userCardClicked(item)\"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <!-- <verben-svg [width]=\"15\" [height]=\"15\" (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"item.children && item.children.length?'visible':'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\" [icon]=\"item.isChildrenExpanded?'minus':'plus'\" /> -->\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <div class=\"flex justify-between mr-4\">\n <div>\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span class=\"flex items-center gap-1 mt-2\">\n <span class=\"!text-[10px] text-[#404040]\"\n >Data Type:</span\n >\n <span class=\"!text-[13px] font-bold\">{{\n item.data.DataType\n }}</span>\n </span>\n </div>\n\n <div>\n <span class=\"!text-[10px] text-[#404040]\"\n >Default Value:</span\n >\n <p class=\"!text-[12px]\">\n {{ item.data.DefaultValue }}\n </p>\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex items-end h-[100%]\">\n <span class=\"enum-val {{item.data.Status}}\">{{item.data.Status}}</span>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view>\n <ng-template #parent>\n <div\n *ngIf=\"this.currentData\"\n class=\"flex flex-col rounded-xl h-full w-full relative gap-6\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n (ngModelChange)=\"updateTable()\"\n [(ngModel)]=\"currentData.data.Name\"\n />\n <div class=\"flex flex-col gap-1\">\n <div>Data Type</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"currentData.data.DataType\"\n (ngModelChange)=\"onDropDownChange($event)\"\n >\n </verben-drop-down>\n </div>\n\n <div>\n <div\n *ngIf=\"\n currentData.data.DataType === 'Int' ||\n currentData.data.DataType === 'Decimal'\n \"\n >\n <verbena-input\n [type]=\"'number'\"\n [placeHolder]=\"'Enter default number'\"\n [ngModel]=\"getStringValue(currentData.data, 'DefaultValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'DefaultValue')\n \"\n name=\"DefaultValue\"\n label=\"Default Value\"\n (ngModelChange)=\"updateTable()\"\n />\n </div>\n <div *ngIf=\"currentData.data.DataType === 'String' || currentData.data.DataType === 'URL'\">\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n [(ngModel)]=\"currentData.data.DefaultValue\"\n name=\"DefaultValue\"\n label=\"Default Value\"\n (ngModelChange)=\"updateTable()\"\n />\n </div>\n \n </div>\n <div>\n <p class=\"mb-2\">Required</p>\n \n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"currentData.data.IsRequired\"\n ></verbena-switch>\n </div>\n <div *ngIf=\"hideMinMax\" class=\" flex flex-col gap-6\">\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MinValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MinValue')\n \"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MaxValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MaxValue')\n \"\n />\n </div>\n <!-- buttons -->\n <div class=\"flex justify-between w-full bottom-8 left-0 right-0\">\n <verbena-button\n class=\"verben-delete-button\"\n text=\"Delete\"\n ></verbena-button>\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <verbena-button\n class=\"verben-primary-button\"\n (click)=\"saveUser()\"\n text=\"Save\"\n ></verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer>\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"!vdcv.hasCurrentItem()\"\n class=\"message-log-button-container flex justify-between\"\n >\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterApplied($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data[0].Properties\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n<div class=\"w-[400px] bg-white p-4 shadow-lg border\">\n <form-control [dataType]=\"dataType2\" [formProperties]=\"data[0].Properties\"></form-control>\n</div>\n", styles: [".view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}::ng-deep .toolbar{margin-bottom:15px}::ng-deep .master-only-container{margin:0!important;padding:0!important}::ng-deep .master-detail-container{margin:0!important;padding:0!important}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid #FFE681}.enum-val{padding:2px 10px;width:100%;min-width:max-content;text-align:center}.enum-val.Active{background-color:#d6f3e6;color:#2db76f}.enum-val.InActive{background-color:#ffdfdf;color:#eb5757}.toggle-container{width:53px;padding:1px;color:#fff;height:22px;position:relative;background-color:#1a237e;border-radius:2rem;cursor:pointer}.toggle-circle{width:50%;height:100%;position:absolute;left:0;padding:5px;top:0;background-color:#fff;border-radius:50%;transform:scale(1);transition:transform .3s}.translate-100{transform:translate(100%)}.translate-0{transform:translate(0)}.toggle-text-on{display:block;font-size:12px;margin-left:4px}.toggle-text-off{display:block;font-size:12px;margin-right:4px;text-align:right}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "groupBy", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowDelete", "selectionChange"] }, { kind: "directive", type: i8.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i8.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i8.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i8.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "exportCustomClass", "selectCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "columnTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showExportChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i8.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "svgPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "styleType", "svg", "svgWidth", "svgHeight", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i8.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "onItemClick", "onCardChildClick"], outputs: ["loadMoreClick"] }, { kind: "component", type: i8.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "dataId"] }, { kind: "component", type: i8.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i8.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i8.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i8.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i8.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied"] }, { kind: "component", type: i8.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated"] }, { kind: "component", type: i8.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions"] }, { kind: "component", type: i8.DataExportComponent, selector: "lib-data-export", inputs: ["data"], outputs: ["exportDataEvent"] }, { kind: "component", type: i8.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i8.VerbenaSwitchComponent, selector: "verbena-switch", inputs: ["label", "checked", "disabled", "offColor", "onColor", "onText", "offText", "width", "height", "customStyles"], outputs: ["change"] }, { kind: "component", type: i9.FormControlComponent, selector: "form-control", inputs: ["dataType", "value", "boolInputType", "formProperties"] }] });
|
|
807
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldsComponent, selector: "lib-form-fields", inputs: { path: "path", application: "application", pageSize: "pageSize", searchDebounceTime: "searchDebounceTime" }, outputs: { onViewProcessClicked: "onViewProcessClicked" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, static: true }, { propertyName: "cardDataView", first: true, predicate: ["vdcv"], descendants: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }], ngImport: i0, template: "<header\n class=\"rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\"\n>\n <h4 class=\"font-semibold\">{{formName}}</h4>\n <verben-svg\n (click)=\"goBack()\"\n class=\"cursor-pointer\"\n [width]=\"17\"\n [height]=\"17\"\n [icon]=\"'close'\"\n ></verben-svg>\n</header>\n<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle:true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n [showFilterChild]=\"showFilter\"\n [searchValue]=\"searchTerm\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"onSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n #dt\n [data]=\"properties\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.Name\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"minValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n [ngModel]=\"getStringValue(row, 'MinValue')\"\n (valueChange)=\"convertToInt($event, row, 'MinValue')\"\n inputContainerClass=\"w-[130px]\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"maxValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n inputContainerClass=\"w-[130px]\"\n [ngModel]=\"getStringValue(row, 'MaxValue')\"\n (valueChange)=\"convertToInt($event, row, 'MaxValue')\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"defaultValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'text'\"\n inputContainerClass=\"w-[130px]\"\n [(ngModel)]=\"row.DefaultValue\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"dataType\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <div class=\"flex flex-col gap-1\">\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"row.DataType\"\n >\n </verben-drop-down>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"isRequired\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"row.IsRequired\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-isEditing=\"isEditing\" let-toggleRowEdit=\"toggleRowEdit\" let-row=\"row\" let-value>\n <verben-pop-Up [customStyles]=\"{'z-index': '99'}\" [dropdownOpen]=\"openDropdownId===row.id\"\n [enableMouseLeave]=\"false\" (close)=\"onClose()\">\n <verben-svg class=\"cursor-pointer actions-icon\" (click)=\"openDropdown(row)\" dropdown-trigger\n icon=\"list\"></verben-svg>\n <div class=\"pop-up-content flex flex-col\" *ngIf=\"openDropdownId===row.id\" dropdown-content>\n <div (click)=\"toggleRowEdit()\" class=\"pop-up-value cursor-pointer\">Edit</div>\n <div class=\"pop-up-value cursor-pointer\">Delete</div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template #cellEdit let-isEditing=\"isEditing\" let-toggleRowEdit=\"toggleRowEdit\" let-row=\"row\" let-value>\n <div class=\"flex gap-2 items-center\">\n <verben-svg icon=\"check\" [width]=\"15\" [height]=\"15\"\n (click)=\"saveViaTable(row, toggleRowEdit)\"></verben-svg>\n <verben-svg icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg>\n <verben-svg icon=\"cardViewAlt\" [width]=\"15\" [height]=\"15\" (click)=\"goToCardView(value)\"></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"id\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"userCardClicked(item)\"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <!-- <verben-svg [width]=\"15\" [height]=\"15\" (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"item.children && item.children.length?'visible':'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\" [icon]=\"item.isChildrenExpanded?'minus':'plus'\" /> -->\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <div class=\"flex justify-between mr-4\">\n <div>\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span class=\"flex items-center gap-1 mt-2\">\n <span class=\"!text-[10px] text-[#404040]\"\n >Data Type:</span\n >\n <span class=\"!text-[13px] font-bold\">{{\n item.data.DataType\n }}</span>\n </span>\n </div>\n\n <div>\n <span class=\"!text-[10px] text-[#404040]\"\n >Default Value:</span\n >\n <p class=\"!text-[12px]\">\n {{ item.data.DefaultValue }}\n </p>\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex items-end h-[100%]\">\n <span class=\"enum-val {{item.data.Status}}\">{{item.data.Status}}</span>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view>\n <ng-template #parent>\n <div\n *ngIf=\"this.currentData\"\n class=\"flex flex-col rounded-xl h-full w-full relative gap-6\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n (ngModelChange)=\"updateTable()\"\n [(ngModel)]=\"currentData.data.Name\"\n />\n <div class=\"flex flex-col gap-1\">\n <div>Data Type</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"currentData.data.DataType\"\n (ngModelChange)=\"onDropDownChange($event)\"\n >\n </verben-drop-down>\n </div>\n\n <div>\n <div *ngIf=\"currentData.data.DataType === 'String' || currentData.data.DataType === 'URL'\">\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n [(ngModel)]=\"currentData.data.DefaultValue\"\n name=\"DefaultValue\"\n label=\"Default Value\"\n (ngModelChange)=\"updateTable()\"\n />\n </div>\n \n </div>\n <div>\n <p class=\"mb-2\">Required</p>\n \n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"currentData.data.IsRequired\"\n ></verbena-switch>\n </div>\n <div *ngIf=\"hideMinMax\" class=\" flex flex-col gap-6\">\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MinValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MinValue')\n \"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MaxValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MaxValue')\n \"\n />\n </div>\n <!-- buttons -->\n <div class=\"flex justify-between w-full bottom-8 left-0 right-0\">\n <verbena-button\n class=\"verben-delete-button\"\n text=\"Delete\"\n ></verbena-button>\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <verbena-button\n class=\"verben-primary-button\"\n (click)=\"saveUser()\"\n text=\"Save\"\n ></verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer>\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"!vdcv.hasCurrentItem()\"\n class=\"message-log-button-container flex justify-between\"\n >\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterApplied($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data[0].Properties\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n<!-- <div class=\"w-[400px] bg-white p-4 shadow-lg border\">\n <form-control [dataType]=\"dataType2\" [formProperties]=\"data[0].Properties\"></form-control>\n</div> -->\n", styles: [".view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}::ng-deep .toolbar{margin-bottom:15px}::ng-deep .master-only-container{margin:0!important;padding:0!important}::ng-deep .master-detail-container{margin:0!important;padding:0!important}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid #FFE681}.enum-val{padding:2px 10px;width:100%;min-width:max-content;text-align:center}.enum-val.Active{background-color:#d6f3e6;color:#2db76f}.enum-val.InActive{background-color:#ffdfdf;color:#eb5757}.toggle-container{width:53px;padding:1px;color:#fff;height:22px;position:relative;background-color:#1a237e;border-radius:2rem;cursor:pointer}.toggle-circle{width:50%;height:100%;position:absolute;left:0;padding:5px;top:0;background-color:#fff;border-radius:50%;transform:scale(1);transition:transform .3s}.translate-100{transform:translate(100%)}.translate-0{transform:translate(0)}.toggle-text-on{display:block;font-size:12px;margin-left:4px}.toggle-text-off{display:block;font-size:12px;margin-right:4px;text-align:right}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "groupBy", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowDelete", "selectionChange"] }, { kind: "directive", type: i8.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i8.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i8.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i8.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "exportCustomClass", "selectCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "columnTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showExportChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i8.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "svgPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "styleType", "svg", "svgWidth", "svgHeight", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i8.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "onItemClick", "onCardChildClick"], outputs: ["loadMoreClick"] }, { kind: "component", type: i8.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "dataId"] }, { kind: "component", type: i8.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i8.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i8.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i8.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i8.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied"] }, { kind: "component", type: i8.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated"] }, { kind: "component", type: i8.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions"] }, { kind: "component", type: i8.DataExportComponent, selector: "lib-data-export", inputs: ["data"], outputs: ["exportDataEvent"] }, { kind: "component", type: i8.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i8.VerbenaSwitchComponent, selector: "verbena-switch", inputs: ["label", "checked", "disabled", "offColor", "onColor", "onText", "offText", "width", "height", "customStyles"], outputs: ["change"] }] });
|
|
809
808
|
}
|
|
810
809
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldsComponent, decorators: [{
|
|
811
810
|
type: Component,
|
|
812
|
-
args: [{ selector: 'lib-form-fields', template: "<header\n class=\"rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\"\n>\n <h4 class=\"font-semibold\">{{formName}}</h4>\n <verben-svg\n (click)=\"goBack()\"\n class=\"cursor-pointer\"\n [width]=\"17\"\n [height]=\"17\"\n [icon]=\"'close'\"\n ></verben-svg>\n</header>\n<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle:true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n [showFilterChild]=\"showFilter\"\n [searchValue]=\"searchTerm\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"onSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n #dt\n [data]=\"properties\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.Name\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"minValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n [ngModel]=\"getStringValue(row, 'MinValue')\"\n (valueChange)=\"convertToInt($event, row, 'MinValue')\"\n inputContainerClass=\"w-[130px]\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"maxValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n inputContainerClass=\"w-[130px]\"\n [ngModel]=\"getStringValue(row, 'MaxValue')\"\n (valueChange)=\"convertToInt($event, row, 'MaxValue')\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"defaultValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'text'\"\n inputContainerClass=\"w-[130px]\"\n [(ngModel)]=\"row.DefaultValue\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"dataType\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <div class=\"flex flex-col gap-1\">\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"row.DataType\"\n >\n </verben-drop-down>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"isRequired\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"row.IsRequired\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-isEditing=\"isEditing\" let-toggleRowEdit=\"toggleRowEdit\" let-row=\"row\" let-value>\n <verben-pop-Up [customStyles]=\"{'z-index': '99'}\" [dropdownOpen]=\"openDropdownId===row.id\"\n [enableMouseLeave]=\"false\" (close)=\"onClose()\">\n <verben-svg class=\"cursor-pointer actions-icon\" (click)=\"openDropdown(row)\" dropdown-trigger\n icon=\"list\"></verben-svg>\n <div class=\"pop-up-content flex flex-col\" *ngIf=\"openDropdownId===row.id\" dropdown-content>\n <div (click)=\"toggleRowEdit()\" class=\"pop-up-value cursor-pointer\">Edit</div>\n <div class=\"pop-up-value cursor-pointer\">Delete</div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template #cellEdit let-isEditing=\"isEditing\" let-toggleRowEdit=\"toggleRowEdit\" let-row=\"row\" let-value>\n <div class=\"flex gap-2 items-center\">\n <verben-svg icon=\"check\" [width]=\"15\" [height]=\"15\"\n (click)=\"saveViaTable(row, toggleRowEdit)\"></verben-svg>\n <verben-svg icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg>\n <verben-svg icon=\"cardViewAlt\" [width]=\"15\" [height]=\"15\" (click)=\"goToCardView(value)\"></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"id\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"userCardClicked(item)\"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <!-- <verben-svg [width]=\"15\" [height]=\"15\" (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"item.children && item.children.length?'visible':'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\" [icon]=\"item.isChildrenExpanded?'minus':'plus'\" /> -->\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <div class=\"flex justify-between mr-4\">\n <div>\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span class=\"flex items-center gap-1 mt-2\">\n <span class=\"!text-[10px] text-[#404040]\"\n >Data Type:</span\n >\n <span class=\"!text-[13px] font-bold\">{{\n item.data.DataType\n }}</span>\n </span>\n </div>\n\n <div>\n <span class=\"!text-[10px] text-[#404040]\"\n >Default Value:</span\n >\n <p class=\"!text-[12px]\">\n {{ item.data.DefaultValue }}\n </p>\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex items-end h-[100%]\">\n <span class=\"enum-val {{item.data.Status}}\">{{item.data.Status}}</span>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view>\n <ng-template #parent>\n <div\n *ngIf=\"this.currentData\"\n class=\"flex flex-col rounded-xl h-full w-full relative gap-6\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n (ngModelChange)=\"updateTable()\"\n [(ngModel)]=\"currentData.data.Name\"\n />\n <div class=\"flex flex-col gap-1\">\n <div>Data Type</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"currentData.data.DataType\"\n (ngModelChange)=\"onDropDownChange($event)\"\n >\n </verben-drop-down>\n </div>\n\n <div>\n <div\n *ngIf=\"\n currentData.data.DataType === 'Int' ||\n currentData.data.DataType === 'Decimal'\n \"\n >\n <verbena-input\n [type]=\"'number'\"\n [placeHolder]=\"'Enter default number'\"\n [ngModel]=\"getStringValue(currentData.data, 'DefaultValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'DefaultValue')\n \"\n name=\"DefaultValue\"\n label=\"Default Value\"\n (ngModelChange)=\"updateTable()\"\n />\n </div>\n <div *ngIf=\"currentData.data.DataType === 'String' || currentData.data.DataType === 'URL'\">\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n [(ngModel)]=\"currentData.data.DefaultValue\"\n name=\"DefaultValue\"\n label=\"Default Value\"\n (ngModelChange)=\"updateTable()\"\n />\n </div>\n \n </div>\n <div>\n <p class=\"mb-2\">Required</p>\n \n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"currentData.data.IsRequired\"\n ></verbena-switch>\n </div>\n <div *ngIf=\"hideMinMax\" class=\" flex flex-col gap-6\">\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MinValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MinValue')\n \"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MaxValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MaxValue')\n \"\n />\n </div>\n <!-- buttons -->\n <div class=\"flex justify-between w-full bottom-8 left-0 right-0\">\n <verbena-button\n class=\"verben-delete-button\"\n text=\"Delete\"\n ></verbena-button>\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <verbena-button\n class=\"verben-primary-button\"\n (click)=\"saveUser()\"\n text=\"Save\"\n ></verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer>\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"!vdcv.hasCurrentItem()\"\n class=\"message-log-button-container flex justify-between\"\n >\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterApplied($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data[0].Properties\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n<div class=\"w-[400px] bg-white p-4 shadow-lg border\">\n <form-control [dataType]=\"dataType2\" [formProperties]=\"data[0].Properties\"></form-control>\n</div>\n", styles: [".view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}::ng-deep .toolbar{margin-bottom:15px}::ng-deep .master-only-container{margin:0!important;padding:0!important}::ng-deep .master-detail-container{margin:0!important;padding:0!important}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid #FFE681}.enum-val{padding:2px 10px;width:100%;min-width:max-content;text-align:center}.enum-val.Active{background-color:#d6f3e6;color:#2db76f}.enum-val.InActive{background-color:#ffdfdf;color:#eb5757}.toggle-container{width:53px;padding:1px;color:#fff;height:22px;position:relative;background-color:#1a237e;border-radius:2rem;cursor:pointer}.toggle-circle{width:50%;height:100%;position:absolute;left:0;padding:5px;top:0;background-color:#fff;border-radius:50%;transform:scale(1);transition:transform .3s}.translate-100{transform:translate(100%)}.translate-0{transform:translate(0)}.toggle-text-on{display:block;font-size:12px;margin-left:4px}.toggle-text-off{display:block;font-size:12px;margin-right:4px;text-align:right}\n"] }]
|
|
811
|
+
args: [{ selector: 'lib-form-fields', template: "<header\n class=\"rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\"\n>\n <h4 class=\"font-semibold\">{{formName}}</h4>\n <verben-svg\n (click)=\"goBack()\"\n class=\"cursor-pointer\"\n [width]=\"17\"\n [height]=\"17\"\n [icon]=\"'close'\"\n ></verben-svg>\n</header>\n<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle:true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n [showFilterChild]=\"showFilter\"\n [searchValue]=\"searchTerm\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"onSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n #dt\n [data]=\"properties\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.Name\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"minValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n [ngModel]=\"getStringValue(row, 'MinValue')\"\n (valueChange)=\"convertToInt($event, row, 'MinValue')\"\n inputContainerClass=\"w-[130px]\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"maxValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n inputContainerClass=\"w-[130px]\"\n [ngModel]=\"getStringValue(row, 'MaxValue')\"\n (valueChange)=\"convertToInt($event, row, 'MaxValue')\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"defaultValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'text'\"\n inputContainerClass=\"w-[130px]\"\n [(ngModel)]=\"row.DefaultValue\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"dataType\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <div class=\"flex flex-col gap-1\">\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"row.DataType\"\n >\n </verben-drop-down>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"isRequired\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"row.IsRequired\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-isEditing=\"isEditing\" let-toggleRowEdit=\"toggleRowEdit\" let-row=\"row\" let-value>\n <verben-pop-Up [customStyles]=\"{'z-index': '99'}\" [dropdownOpen]=\"openDropdownId===row.id\"\n [enableMouseLeave]=\"false\" (close)=\"onClose()\">\n <verben-svg class=\"cursor-pointer actions-icon\" (click)=\"openDropdown(row)\" dropdown-trigger\n icon=\"list\"></verben-svg>\n <div class=\"pop-up-content flex flex-col\" *ngIf=\"openDropdownId===row.id\" dropdown-content>\n <div (click)=\"toggleRowEdit()\" class=\"pop-up-value cursor-pointer\">Edit</div>\n <div class=\"pop-up-value cursor-pointer\">Delete</div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template #cellEdit let-isEditing=\"isEditing\" let-toggleRowEdit=\"toggleRowEdit\" let-row=\"row\" let-value>\n <div class=\"flex gap-2 items-center\">\n <verben-svg icon=\"check\" [width]=\"15\" [height]=\"15\"\n (click)=\"saveViaTable(row, toggleRowEdit)\"></verben-svg>\n <verben-svg icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg>\n <verben-svg icon=\"cardViewAlt\" [width]=\"15\" [height]=\"15\" (click)=\"goToCardView(value)\"></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"id\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"userCardClicked(item)\"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <!-- <verben-svg [width]=\"15\" [height]=\"15\" (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"item.children && item.children.length?'visible':'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\" [icon]=\"item.isChildrenExpanded?'minus':'plus'\" /> -->\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <div class=\"flex justify-between mr-4\">\n <div>\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span class=\"flex items-center gap-1 mt-2\">\n <span class=\"!text-[10px] text-[#404040]\"\n >Data Type:</span\n >\n <span class=\"!text-[13px] font-bold\">{{\n item.data.DataType\n }}</span>\n </span>\n </div>\n\n <div>\n <span class=\"!text-[10px] text-[#404040]\"\n >Default Value:</span\n >\n <p class=\"!text-[12px]\">\n {{ item.data.DefaultValue }}\n </p>\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex items-end h-[100%]\">\n <span class=\"enum-val {{item.data.Status}}\">{{item.data.Status}}</span>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view>\n <ng-template #parent>\n <div\n *ngIf=\"this.currentData\"\n class=\"flex flex-col rounded-xl h-full w-full relative gap-6\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n (ngModelChange)=\"updateTable()\"\n [(ngModel)]=\"currentData.data.Name\"\n />\n <div class=\"flex flex-col gap-1\">\n <div>Data Type</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"currentData.data.DataType\"\n (ngModelChange)=\"onDropDownChange($event)\"\n >\n </verben-drop-down>\n </div>\n\n <div>\n <div *ngIf=\"currentData.data.DataType === 'String' || currentData.data.DataType === 'URL'\">\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n [(ngModel)]=\"currentData.data.DefaultValue\"\n name=\"DefaultValue\"\n label=\"Default Value\"\n (ngModelChange)=\"updateTable()\"\n />\n </div>\n \n </div>\n <div>\n <p class=\"mb-2\">Required</p>\n \n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"currentData.data.IsRequired\"\n ></verbena-switch>\n </div>\n <div *ngIf=\"hideMinMax\" class=\" flex flex-col gap-6\">\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MinValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MinValue')\n \"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MaxValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MaxValue')\n \"\n />\n </div>\n <!-- buttons -->\n <div class=\"flex justify-between w-full bottom-8 left-0 right-0\">\n <verbena-button\n class=\"verben-delete-button\"\n text=\"Delete\"\n ></verbena-button>\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <verbena-button\n class=\"verben-primary-button\"\n (click)=\"saveUser()\"\n text=\"Save\"\n ></verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer>\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"!vdcv.hasCurrentItem()\"\n class=\"message-log-button-container flex justify-between\"\n >\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterApplied($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data[0].Properties\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n<!-- <div class=\"w-[400px] bg-white p-4 shadow-lg border\">\n <form-control [dataType]=\"dataType2\" [formProperties]=\"data[0].Properties\"></form-control>\n</div> -->\n", styles: [".view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}::ng-deep .toolbar{margin-bottom:15px}::ng-deep .master-only-container{margin:0!important;padding:0!important}::ng-deep .master-detail-container{margin:0!important;padding:0!important}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid #FFE681}.enum-val{padding:2px 10px;width:100%;min-width:max-content;text-align:center}.enum-val.Active{background-color:#d6f3e6;color:#2db76f}.enum-val.InActive{background-color:#ffdfdf;color:#eb5757}.toggle-container{width:53px;padding:1px;color:#fff;height:22px;position:relative;background-color:#1a237e;border-radius:2rem;cursor:pointer}.toggle-circle{width:50%;height:100%;position:absolute;left:0;padding:5px;top:0;background-color:#fff;border-radius:50%;transform:scale(1);transition:transform .3s}.translate-100{transform:translate(100%)}.translate-0{transform:translate(0)}.toggle-text-on{display:block;font-size:12px;margin-left:4px}.toggle-text-off{display:block;font-size:12px;margin-right:4px;text-align:right}\n"] }]
|
|
813
812
|
}], ctorParameters: () => [{ type: i1.UtilService }, { type: i2.HttpWebRequestService }, { type: i0.ChangeDetectorRef }, { type: i3.FormBuilder }, { type: i4.EnvironmentService }, { type: i5.Router }, { type: i5.ActivatedRoute }, { type: i6.FormsFieldService }, { type: i7.Location }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { path: [{
|
|
814
813
|
type: Input
|
|
815
814
|
}], fileInput: [{
|
|
@@ -833,4 +832,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
833
832
|
}], onViewProcessClicked: [{
|
|
834
833
|
type: Output
|
|
835
834
|
}] } });
|
|
836
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWdyb3VwL2Zvcm0tZmllbGRzL2Zvcm0tZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1ncm91cC9mb3JtLWZpZWxkcy9mb3JtLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsa0JBQWtCLEVBQ2xCLGNBQWMsR0FNZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7QUFNcEQsSUFBSyxvQkFTSjtBQVRE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LENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7WUFDakMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7d0dBcjVCVSxtQkFBbUI7NEZBQW5CLG1CQUFtQix5bEJDN0VoQyw0MGtCQStlQTs7NEZEbGFhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7eVdBU2pCLElBQUk7c0JBQWIsS0FBSztnQkFJb0MsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNyQixZQUFZO3NCQUE5QixTQUFTO3VCQUFDLE1BQU07Z0JBQ0MsUUFBUTtzQkFBekIsU0FBUzt1QkFBQyxLQUFLO2dCQUNDLFNBQVM7c0JBQXpCLFNBQVM7dUJBQUMsSUFBSTtnQkFDTixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDYXJkRGF0YSxcbiAgQ2FyZERhdGFWaWV3Q29tcG9uZW50LFxuICBDb2x1bW5EZWZpbml0aW9uLFxuICBDb25kaXRpb25hbE9wdGlvbnMsXG4gIERhdGFGaWx0ZXJUeXBlLFxuICBEYXRhVGFibGVDb21wb25lbnQsXG4gIERhdGFWaWV3Q29tcG9uZW50LFxuICBEcm9wZG93bkNoYW5nZUV2ZW50LFxuICBEcm9wZG93bkxvYWRFdmVudCxcbiAgSURhdGFGaWx0ZXIsXG59IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBiYXNlU3R5bGUgfSBmcm9tICcuLi9iYXNlLXRhYmxlLXN0eWxlJztcbmltcG9ydCB7IFV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IEh0dHBXZWJSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2h0dHAtd2ViLXJlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL0Vycm9yUmVzcG9uc2UnO1xuaW1wb3J0IHsgUGFnZWRSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvUGFnZWRSZXN1bHQnO1xuaW1wb3J0IHsgU2VhcmNoUHJvcGVydHlWYWx1ZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9TZWFyY2hQcm9wZXJ0eVZhbHVlJztcbmltcG9ydCB7IFNlYXJjaE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1NlYXJjaE9wZXJhdG9yJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5U2lnbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9TZWFyY2hQcm9wZXJ0eVNpZ24nO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9TZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN0YXR1cyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9zdGF0dXMnO1xuaW1wb3J0IHsgT2JqZWN0U3RhdGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvb2JqZWN0LXN0YXRlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9EYXRhVHlwZSc7XG5pbXBvcnQgeyBGb3Jtc0ZpZWxkU2VydmljZSB9IGZyb20gJy4vZm9ybS1maWVsZHMuc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL0Zvcm1FbnRpdHknO1xuaW1wb3J0IHsgRm9ybVByb3BlcnR5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL0Zvcm1Qcm9wZXJ0eSc7XG5cbmVudW0gVGFza1VzZXJQcm9wZXJ0eU5hbWUge1xuICBVc2VyID0gJ1VzZXInLFxuICBEYXRlID0gJ0RhdGUnLFxuICBSb2xlID0gJ1JvbGUnLFxuICBTZXJ2aWNlID0gJ1NlcnZpY2UnLFxuICBBcHBsaWNhdGlvbiA9ICdBcHBsaWNhdGlvbicsXG4gIFRlbmFudCA9ICdUZW5hbnQnLFxuICBFbWFpbCA9ICdFbWFpbCcsXG4gIFN0YXR1cyA9ICdTdGF0dXMnLFxufVxuZW51bSBUYXNrVXNlclByb3BlcnR5TWFwIHtcbiAgVXNlciA9ICdOYW1lJyxcbiAgRGF0ZSA9ICdDcmVhdGVkQXQnLFxuICBSb2xlID0gJ1JvbGVJRCcsXG4gIFNlcnZpY2UgPSAnU2VydmljZU5hbWUnLFxuICBBcHBsaWNhdGlvbiA9ICdBcHBsaWNhdGlvbicsXG4gIFRlbmFudCA9ICdUZW5hbnRJZCcsXG4gIEVtYWlsID0gJ01haWxBZGRyZXNzJyxcbiAgU3RhdHVzID0gJ1N0YXR1cycsXG59XG5cbmVudW0gRmlsdGVyVHlwZXMge1xuICBCZWZvcmUgPSBTZWFyY2hQcm9wZXJ0eVNpZ24uTFQsXG4gIE9uID0gU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICBBZnRlciA9IFNlYXJjaFByb3BlcnR5U2lnbi5HVCxcbiAgTkVRID0gU2VhcmNoUHJvcGVydHlTaWduLk5FUSxcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWZvcm0tZmllbGRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Zvcm0tZmllbGRzLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtRmllbGRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgdmlzaWJsZUNvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxGb3JtUHJvcGVydHk+W10gPSBbXTtcbiAgc3R5bGVzID0gYmFzZVN0eWxlO1xuICBkYXRhOiBGb3JtRW50aXR5W10gPSBbXTtcbiAgaGlkZU1pbk1heDpib29sZWFuPXRydWVcbiAgQElucHV0ICgpIHBhdGg6IHN0cmluZyA9ICcvZG9jdW1lbnRhdGlvbi93b3JrZmxvdy1mb3Jtcy9maWVsZHMnO1xuICBjYXJkRGF0YTogQ2FyZERhdGFbXSA9IFtdO1xuICBxdWVyeVBhcmFtczogYW55ID0ge307XG4gIGN1cnJlbnREYXRhOiBDYXJkRGF0YSB8IG51bGwgPSBudWxsO1xuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBmaWxlSW5wdXQhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd2ZGN2JykgY2FyZERhdGFWaWV3ITogQ2FyZERhdGFWaWV3Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCd2ZHYnKSBkYXRhVmlldyE6IERhdGFWaWV3Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdkdCcpIHRhYmxlVmlldyE6IERhdGFUYWJsZUNvbXBvbmVudDxGb3JtRW50aXR5PjtcbiAgQElucHV0KCkgYXBwbGljYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIEBJbnB1dCgpIHNlYXJjaERlYm91bmNlVGltZTogbnVtYmVyID0gNTAwO1xuICBAT3V0cHV0KCkgb25WaWV3UHJvY2Vzc0NsaWNrZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBjdXJyZW50RXhwYW5kZWRDYXJkOiBDYXJkRGF0YSB8IG51bGwgPSBudWxsO1xuICBwYWdlU3RhdGU6IFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+IHwgbnVsbCA9IG51bGw7XG4gIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBvcGVuRHJvcGRvd25JZDogc3RyaW5nIHwgbnVsbHwgbnVtYmVyID0gbnVsbDtcbiAgY3VycmVudEZpbHRlcnM6IElEYXRhRmlsdGVyW10gPSBbXTtcbiAgY3VycmVudFNvcnRzOiBJRGF0YUZpbHRlcltdID0gW107XG4gIHNlbGVjdGVkRmlsdGVyVGFibGVDb3VudDpudW1iZXI9MFxuICBzaG93RmlsdGVyOmJvb2xlYW49ZmFsc2VcbiAgZm9ybU5hbWU6c3RyaW5nPScnXG4gIHNlYXJjaFRlcm0kID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcm9wZXJ0aWVzOkZvcm1Qcm9wZXJ0eVtdPVtdXG4gIHNlYXJjaFRlcm06c3RyaW5nPScnXG4gIHNraXA9MFxuICBJZDpzdHJpbmc9JydcbiAgc3RhdHVzT3B0aW9uczogU3RhdHVzW10gPSBPYmplY3QudmFsdWVzKFN0YXR1cyk7XG4gIGRhdGFUeXBlOiBEYXRhVHlwZVtdID0gT2JqZWN0LnZhbHVlcyhEYXRhVHlwZSk7XG4gIGRhdGFUeXBlMjogRGF0YVR5cGU9RGF0YVR5cGUuU3RyaW5nXG4gIHVzZXJzOiBGb3JtRW50aXR5W10gPSBbXTtcblxuICB2aXNpYmxlQ29sdW1uczogSURhdGFGaWx0ZXJbXSA9IFtdO1xuXG4gIGZpbHRlckFycmF5OiBJRGF0YUZpbHRlcltdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdOYW1lJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0RhdGFUeXBlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0RlZmF1bHRWYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIFxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdNYXhWYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5OdW1iZXIsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6J01pblZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTonSXNSZXF1aXJlZCcsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5Cb29sLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgIFxuICBdO1xuXG4gIHNvcnRPcHRpb25zOiBJRGF0YUZpbHRlcltdID1bXG4gICAge1xuICAgICAgbmFtZTogJ05hbWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGF0YVR5cGUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGVmYXVsdFZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAgXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ01heFZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLk51bWJlcixcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTonTWluVmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOidJc1JlcXVpcmVkJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgXG4gIF07XG5cbiAgcHJpdmF0ZSBjdXJyZW50U2VhcmNoVGVybTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB1dGlsU2VydmljZTogVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXJ2ZXI6IEh0dHBXZWJSZXF1ZXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBlbnZTdmM6IEVudmlyb25tZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgdGFza1VzZXJzU3ZjOiBGb3Jtc0ZpZWxkU2VydmljZSxcbiAgICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbkRlZiA9IHRhc2tVc2Vyc1N2Yy5mb3JtRmllbGRDb2x1bW5zO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0YXNrVXNlcnNTdmMuZm9ybUZpZWxkQ29sdW1ucy5tYXAoKGNvbCkgPT4gKHtcbiAgICAgIGNoZWNrZWQ6IHRydWUsXG4gICAgICBuYW1lOiB0eXBlb2YgY29sLmhlYWRlciA9PT0gJ3N0cmluZycgPyBjb2wuaGVhZGVyIDogY29sLmlkLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuQm9vbCxcbiAgICB9KSk7XG4gIH1cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICB0aGlzLnNlYXJjaFRlcm0kXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5zZWFyY2hEZWJvdW5jZVRpbWUpKSAvLyBBZGp1c3QgZGVib3VuY2UgdGltZSBoZXJlIChpbiBtcylcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHNlYXJjaFRlcm0pID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VhcmNoVGVybSA9IHNlYXJjaFRlcm07XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyc0FuZFNvcnRzKHRydWUpO1xuICAgICAgfSk7XG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtcykgPT4ge1xuICAgICAgY29uc3QgSWQgPSBwYXJhbXNbJ0Zvcm1JZCddO1xuICAgICAgY29uc3QgTmFtZSA9IHBhcmFtc1snTmFtZSddO1xuICAgICAgdGhpcy5JZD1JZFxuICAgICAgdGhpcy5mb3JtTmFtZT1OYW1lXG4gICAgICBpZiAoSWQpIHtcbiAgICAgICAgdGhpcy5nZXRQcm9wZXJ0aWVzKElkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgYXN5bmMgcG9zdFNlYXJjaChwYXlsb2FkOiBhbnkpIHtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgYEZvcm0vU2VhcmNoRm9ybUVudGl0aWVzLzAvJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICBwYXlsb2FkXG4gICAgKTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICBcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG4gICAgICB0aGlzLmRhdGE9cmVzdWx0XG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICAgIC8vIHRoaXMuc2V0VXBDYXJkRGF0YUV4dHJhKHRoaXMuZGF0YSlcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgb25Ecm9wRG93bkNoYW5nZShldmVudDpzdHJpbmcpe1xuICAgIGlmKCBldmVudCl7XG4gICAgICB0aGlzLmNoZWNrTWluTWF4KGV2ZW50KVxuICAgIH1cbiAgXG4gIH1cbiAgYXN5bmMgZ2V0UHJvcGVydGllcyhJZDogc3RyaW5nKTogUHJvbWlzZTxGb3JtRW50aXR5W10gfCB1bmRlZmluZWQ+IHtcbiAgICB2YXIgcGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gW1xuICAgICAge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6IGBJZGAsXG4gICAgICAgIEVudGl0eVZhbHVlOiBJZCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9LFxuICAgIF07XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBGb3JtL1NlYXJjaEZvcm1FbnRpdGllcy8ke3RoaXMuc2tpcH0vJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICBwYXlsb2FkXG4gICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG4gICAgICB0aGlzLmRhdGEgPSByZXN1bHQ7XG4gICAgICB0aGlzLmRhdGEubWFwKHggPT4geC5Qcm9wZXJ0aWVzLmZvckVhY2goKHAsaSk9PnAuaWQ9aSkpO1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgXG4gICAgfVxuICB9XG5cblxuICBvblVzZXJTZWxlY3RlZChldmVudDogRHJvcGRvd25DaGFuZ2VFdmVudCwgaXRlbTogRm9ybUVudGl0eSkge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXJzLmZpbmQoKHgpID0+IHguTmFtZSA9PSBldmVudC52YWx1ZSk7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIGl0ZW0uTmFtZSA9IHVzZXIuTmFtZTtcbiAgICAgIGl0ZW0uRGVzY3JpcHRpb24gPSB1c2VyLkRlc2NyaXB0aW9uO1xuICAgICAgaXRlbS5Qcm9wZXJ0aWVzID0gdXNlci5Qcm9wZXJ0aWVzO1xuICAgICAgaXRlbS5Jc1ZhbGlkYXRlZCA9IHVzZXIuSXNWYWxpZGF0ZWQ7XG4gICAgfVxuICB9XG4gIG9uQ2xlYXIoZXZlbnQ6IEV2ZW50LCBpdGVtOiBGb3JtRW50aXR5KSB7XG4gICAgaXRlbS5OYW1lID0gJyc7XG4gICAgaXRlbS5EZXNjcmlwdGlvbiA9ICcnO1xuICAgIGl0ZW0uUHJvcGVydGllcyA9IFtdO1xuICAgIGl0ZW0uSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgfVxuICBhc3luYyBnZXRGb3JtcygpOiBQcm9taXNlPEZvcm1FbnRpdHlbXSB8IHVuZGVmaW5lZD4ge1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgIGBGb3JtL0dldEZvcm1FbnRpdGllc1dpdGhQYXJhbXMvR3JvdXAvMC8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZVN0YXRlID0gcmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+O1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4pLlJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdDtcbiAgICAgIHRoaXMuc2V0VXBDYXJkRGF0YSgpO1xuICAgICAgdGhpcy5wcm9wZXJ0aWVzPXJlc3VsdFswXS5Qcm9wZXJ0aWVzXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICBnZXRJdGVtTGFiZWwobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy51c2Vycy5maW5kKCh1c2VyKSA9PiB1c2VyLk5hbWUgPT09IG5hbWUpO1xuICAgIGNvbnN0IG90aGVyQ2hlY2sgPSB0aGlzLmRhdGEuZmluZCgoZGF0YSkgPT4gZGF0YS5OYW1lID09PSBuYW1lKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uTmFtZSA6IG90aGVyQ2hlY2sgPyBvdGhlckNoZWNrLk5hbWUgOiAnJztcbiAgfVxuXG4gIGdldEFzeW5jTGFiZWwodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YS5maW5kKCh4KSA9PiB4Lk5hbWUgPT0gdmFsdWUpO1xuXG4gICAgcmV0dXJuIGRhdGEgPyBkYXRhLk5hbWUgOiAnJztcbiAgfVxuXG4gIGFzeW5jIGxvYWRNb3JlKCkge1xuICAgIGlmICghdGhpcy5wYWdlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID1cbiAgICAgIHRoaXMuY3VycmVudEZpbHRlcnMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5jdXJyZW50U29ydHMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCkubGVuZ3RoID4gMFxuICAgICAgICA/IGF3YWl0IHRoaXMubG9hZE1vcmVGaWx0ZXJzQW5kU29ydHMoKVxuICAgICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgICAgIGBUYXNrVXNlci9HZXRUYXNrVXNlcnMvJHt0aGlzLnBhZ2VTdGF0ZS5Ta2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PikuUmVzdWx0O1xuICAgICAgXG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KFxuICAgICAgICByZXN1bHQubWFwKCh4KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLngsXG4gICAgICAgICAgICBpZDogeC5OYW1lLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhRXh0cmEocmVzdWx0KTtcbiAgICB9XG4gIH1cbiAgY2FyZENsaWNrZWQoaXRlbTogQ2FyZERhdGEsIHRvZ2dsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuY3VycmVudERhdGEgPSB0aGlzLmNhcmREYXRhVmlldy5vbkl0ZW1DbGljayhpdGVtKTtcbiAgICBpZiAodG9nZ2xlVmlldykge1xuICAgICAgdGhpcy5kYXRhVmlldy50b2dnbGVWaWV3KCk7XG4gICAgfVxuICB9XG4gIHRvZ2dsZUNoaWxkcmVuKGl0ZW06IENhcmREYXRhKSB7XG4gICAgdmFyIGN1cnJUb2dnbGVTdGF0ZSA9IGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkO1xuICAgIHRoaXMuY2FyZERhdGEuZm9yRWFjaCgoXykgPT4ge1xuICAgICAgXy5pc0NoaWxkcmVuRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBpdGVtLmlzQ2hpbGRyZW5FeHBhbmRlZCA9ICFjdXJyVG9nZ2xlU3RhdGU7XG4gICAgaWYgKGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQgPSBpdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBzZXRVcENhcmREYXRhKCkge1xuICBcbiAgICBjb25zdCBjYXJkRGF0YTogQ2FyZERhdGFbXSA9IHRoaXMuZGF0YVswXT8uUHJvcGVydGllcz8ubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi54LFxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIHRpdGxlOiB4Lk5hbWUsXG4gICAgICAgIGRhdGE6IHgsXG4gICAgICAgIGJvZHk6IFtdLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgIH0pO1xuICBcbiAgICB0aGlzLmNhcmREYXRhID0gY2FyZERhdGE7IC8vIEFzc2lnbiB0aGUgdHJhbnNmb3JtZWQgYXJyYXkgdG8gYGNhcmREYXRhYFxuICB9XG4gIFxuICBvcGVuRHJvcGRvd24oaXRlbTogRm9ybVByb3BlcnR5KTogdm9pZCB7XG4gICAgdGhpcy5vcGVuRHJvcGRvd25JZCA9IHRoaXMub3BlbkRyb3Bkb3duSWQgPT09IGl0ZW0uaWQgPyBudWxsIDogaXRlbS5pZDtcbiAgfVxuICBcbiAgY2xvc2VQb3BVcChyb3c6IEZvcm1Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW5Ecm9wZG93bklkID09PSByb3cuaWQpIHtcbiAgICAgIHRoaXMub3BlbkRyb3Bkb3duSWQgPSBudWxsOyAvLyBQcm9wZXJseSByZXNldCB3aGVuIGNsb3NpbmdcbiAgICB9XG4gICAgdGhpcy5vbkNsb3NlKCk7IC8vIENhbGwgYW55IGFkZGl0aW9uYWwgbG9naWMgZm9yIGNsb3N1cmVcbiAgfVxuICBzZXRVcENhcmREYXRhRXh0cmEoYmFzZURhdGE6IEZvcm1FbnRpdHlbXSkge1xuICAgIGNvbnN0IGNhcmREYXRhOiBDYXJkRGF0YVtdID0gYmFzZURhdGEubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIHRpdGxlOiB4Lk5hbWUsXG4gICAgICAgIGRhdGE6IHgsXG4gICAgICAgIGJvZHk6IFtdLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuY2FyZERhdGEgPSB0aGlzLmNhcmREYXRhLmNvbmNhdChjYXJkRGF0YSk7XG4gIH1cblxuICBnb1RvQ2FyZFZpZXcoZGF0YTogRm9ybVByb3BlcnR5KSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuY2FyZERhdGEuZmluZCgoeCkgPT4geC5kYXRhID09IGRhdGEpO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICB0aGlzLnVzZXJDYXJkQ2xpY2tlZChpdGVtLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnb1RvVGFibGVWaWV3KCkge1xuICAgIGlmICghdGhpcy5jdXJyZW50RGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRhdGFWaWV3LnRvZ2dsZVZpZXcoKTtcbiAgICBjb25zdCBpZCA9IHRoaXMuY3VycmVudERhdGEuZGF0YSA/IHRoaXMuY3VycmVudERhdGEuZGF0YS5JZCA6ICcnO1xuICAgIGlmIChpZC50cmltKCkubGVuZ3RoID4gMCAmJiAhdGhpcy50YWJsZVZpZXcuaXNSb3dFZGl0aW5nKGlkKSkge1xuICAgICAgdGhpcy50YWJsZVZpZXcudG9nZ2xlUm93RWRpdChpZCk7XG4gICAgfVxuICB9XG5cbiAgdmlld1Byb2Nlc3Nlcyhjb2RlOiBzdHJpbmcpIHtcbiAgICBpZiAoY29kZS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vblZpZXdQcm9jZXNzQ2xpY2tlZC5lbWl0KGNvZGUpO1xuICB9XG5cbiAgdXNlckNhcmRDbGlja2VkKGl0ZW06IENhcmREYXRhLCB0b2dnbGVWaWV3OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLmNhcmREYXRhLmZvckVhY2goKGNhcmQpID0+IChjYXJkLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICBpdGVtLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmN1cnJlbnREYXRhID0gdGhpcy5jYXJkRGF0YVZpZXcub25JdGVtQ2xpY2soaXRlbSk7XG4gICAgaWYgKHRvZ2dsZVZpZXcpIHtcbiAgICAgIHRoaXMuZGF0YVZpZXcudG9nZ2xlVmlldygpO1xuICAgIH1cbiAgfVxuICBcblxuICBhc3luYyBzYXZlRm9ybVByb3BlcnR5KCkge1xuICAgIGlmICghdGhpcy5jdXJyZW50RGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1Qcm9wZXJ0eTogRm9ybUVudGl0eVtdID0gdGhpcy5kYXRhO1xuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQVBJIGNhbGwgdG8gc2F2ZSB1c2VyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICBgRm9ybS9TYXZlRm9ybUVudGl0aWVzYCxcbiAgICAgICAgZm9ybVByb3BlcnR5LFxuICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgKTtcblxuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgICBpZiAoIShyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSkge1xuICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdGb3JtIHByb3BlcnR5IHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBGb3JtRW50aXR5W107XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHVzZXJSZXN1bHQgPSByZXN1bHRbMF07XG5cbiAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmRhdGEuZmluZEluZGV4KFxuICAgICAgICAgICAgKHgpID0+IHggPT09IHRoaXMuY3VycmVudERhdGE/LmRhdGFcbiAgICAgICAgICApO1xuXG4gICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgICAvLyBPcHRpb25hbDogSGFuZGxlIGVycm9ycyBpZiBuZWVkZWRcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZ5KHZhbDphbnkpe1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWwpXG4gIH1cbiAgYXN5bmMgc2F2ZVVzZXIoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudERhdGEpIHtcbiAgICAgIHZhciBwcm9wZXJ0eTogRm9ybVByb3BlcnR5ID0gdGhpcy5jdXJyZW50RGF0YS5kYXRhIGFzIEZvcm1Qcm9wZXJ0eTtcbiAgICAgIHByb3BlcnR5Lk1heFZhbHVlID0gTnVtYmVyKHByb3BlcnR5Lk1heFZhbHVlKTtcbiAgICAgIHByb3BlcnR5Lk1pblZhbHVlID0gTnVtYmVyKHByb3BlcnR5Lk1pblZhbHVlKTtcbiAgXG4gICAgICBpZiAodGhpcy5jdXJyZW50RGF0YS5kYXRhLk5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdOYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIFxuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gIFxuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSB0aGlzLmRhdGEubWFwKChmb3JtKSA9PiB7XG4gIFxuICAgICAgICBjb25zdCBwcm9wZXJ0eUluZGV4ID0gZm9ybS5Qcm9wZXJ0aWVzLmZpbmRJbmRleChcbiAgICAgICAgICAocCkgPT4gcC5pZCA9PT0gcHJvcGVydHkuaWRcbiAgICAgICAgKTtcbiAgXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZGV4ID4gLTEpIHtcbiAgICAgICAgICBmb3JtLlByb3BlcnRpZXNbcHJvcGVydHlJbmRleF0gPSBwcm9wZXJ0eTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtLlByb3BlcnRpZXMgPSBbLi4uZm9ybS5Qcm9wZXJ0aWVzLCBwcm9wZXJ0eV07XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLkRhdGFTdGF0ZSA9XG4gICAgICAgICAgZm9ybS5EYXRhU3RhdGUgPT09IE9iamVjdFN0YXRlLk5ld1xuICAgICAgICAgICAgPyBPYmplY3RTdGF0ZS5OZXdcbiAgICAgICAgICAgIDogT2JqZWN0U3RhdGUuQ2hhbmdlZDtcbiAgXG4gICAgICAgIHJldHVybiBmb3JtO1xuICAgICAgfSk7XG4gIFxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgYEZvcm0vU2F2ZUZvcm1FbnRpdGllc2AsXG4gICAgICAgIHVwZGF0ZWREYXRhLFxuICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgKTtcbiAgXG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gIFxuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcblxuICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdGb3JtIHByb3BlcnR5IHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgRm9ybUVudGl0eVtdO1xuICBcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIHVzZXJSZXN1bHQgPSByZXN1bHRbMF07XG4gICAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5kYXRhLmZpbmRJbmRleChcbiAgICAgICAgICAgICh4KSA9PiB4ID09PSB0aGlzLmN1cnJlbnREYXRhPy5kYXRhXG4gICAgICAgICAgKTtcbiAgXG4gICAgICAgICAgaWYgKGl0ZW1JbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Qcm9wZXJ0aWVzID0gdXNlclJlc3VsdC5Qcm9wZXJ0aWVzO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gWy4uLnRoaXMuZGF0YV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jIHNhdmVWaWFUYWJsZShyb3c6IEZvcm1Qcm9wZXJ0eSwgY2FsbEJhY2s6ICgpID0+IGFueSkge1xuICAgIGlmICghcm93KSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9wZXJ0eTogRm9ybVByb3BlcnR5ID0ge1xuICAgICAgLi4ucm93LFxuICAgICAgTWF4VmFsdWU6IE51bWJlcihyb3cuTWF4VmFsdWUpLFxuICAgICAgTWluVmFsdWU6IE51bWJlcihyb3cuTWluVmFsdWUpXG4gICAgfTtcbiAgXG4gICAgaWYgKHByb3BlcnR5Lk5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93SW5mbygnTmFtZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIFxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICBcbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMuZGF0YS5tYXAoKGZvcm0pID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5SW5kZXggPSBmb3JtLlByb3BlcnRpZXMuZmluZEluZGV4KChwKSA9PiBwLmlkID09PSBwcm9wZXJ0eS5pZCk7XG4gIFxuICAgICAgaWYgKHByb3BlcnR5SW5kZXggPiAtMSkge1xuICAgICAgICBmb3JtLlByb3BlcnRpZXNbcHJvcGVydHlJbmRleF0gPSBwcm9wZXJ0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm0uUHJvcGVydGllcyA9IFsuLi5mb3JtLlByb3BlcnRpZXMsIHByb3BlcnR5XTtcbiAgICAgIH1cbiAgXG4gICAgICBmb3JtLkRhdGFTdGF0ZSA9IGZvcm0uRGF0YVN0YXRlID09PSBPYmplY3RTdGF0ZS5OZXcgPyBPYmplY3RTdGF0ZS5OZXcgOiBPYmplY3RTdGF0ZS5DaGFuZ2VkO1xuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfSk7XG4gIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICBgRm9ybS9TYXZlRm9ybUVudGl0aWVzYCxcbiAgICAgICAgdXBkYXRlZERhdGEsXG4gICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgICApO1xuICBcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgXG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgXG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdGb3JtIHByb3BlcnR5IHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICBcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBGb3JtRW50aXR5W107XG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IHJlc3VsdFswXTtcbiAgXG4gICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuZGF0YS5maW5kSW5kZXgoKHgpID0+XG4gICAgICAgICAgeC5Qcm9wZXJ0aWVzLnNvbWUoKHApID0+IHAuaWQgPT09IHJvdy5pZClcbiAgICAgICAgKTtcbiAgXG4gICAgICAgIGlmIChpdGVtSW5kZXggPiAtMSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlByb3BlcnRpZXMgPSB1c2VyUmVzdWx0LlByb3BlcnRpZXM7XG4gICAgICAgICAgdGhpcy5kYXRhLm1hcCh4ID0+IHguUHJvcGVydGllcy5mb3JFYWNoKChwLGkpPT5wLmlkPWkpKTtcbiAgICAgICAgICB0aGlzLmRhdGEgPSBbLi4udGhpcy5kYXRhXTsgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgXG4gICAgICB0aGlzLmNsb3NlUG9wVXAocm93KTtcbiAgICAgIGNhbGxCYWNrKCk7XG4gIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignRmFpbGVkIHRvIHNhdmUgdGhlIGZvcm0gcHJvcGVydHknKTtcbiAgICB9XG4gIH1cbiAgXG4gIFxuXG4gIFxuICB0b2dnbGVJc1ZhbGlkYXRlKHZhbHVlOiBib29sZWFuLCByb3c6IEZvcm1Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gIXZhbHVlO1xuICAgIHJvdy5Jc1JlcXVpcmVkID0gbmV3VmFsdWU7XG4gICAgY29uc29sZS5sb2cocm93KTtcbiAgfVxuXG4gIHVwZGF0ZVRhYmxlKCkge1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5tYXAoKHgpID0+IHgpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZGF0YSk7XG4gIH1cbiAgXG4gIGNvbnZlcnRUb0ludCh2YWx1ZTogYW55LCBkYXRhOiBhbnkscHJvcDogc3RyaW5nKSB7XG4gICAgZGF0YVtwcm9wXSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgfVxuICBnZXRTdHJpbmdWYWx1ZShkYXRhOiBhbnkscHJvcDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0YVtwcm9wXS50b1N0cmluZygpO1xuICB9XG4gXG4gIFxuICBjaGVja01pbk1heCh2YWx1ZTpzdHJpbmcpe1xuICAgIHZhciBzaG93TWlubWF4PWZhbHNlXG4gICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICAgIHNob3dNaW5tYXg9dHJ1ZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0ludCc6XG4gICAgICAgICAgICAgIHNob3dNaW5tYXg9dHJ1ZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0RlY2ltYWwnOlxuICAgICAgICAgICAgc2hvd01pbm1heD10cnVlXG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdGbG9hdCc6XG4gICAgICAgICAgICAgIHNob3dNaW5tYXg9dHJ1ZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuaGlkZU1pbk1heD1zaG93TWlubWF4XG4gIH1cbiAgXG5cbiAgbmF2aWdhdGVUb0ZpZWxkcygpIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMucXVlcnlQYXJhbXM7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3RoaXMucGF0aH1gXSwgeyBxdWVyeVBhcmFtcyB9KTtcbiAgfVxuICBvbkNsb3NlKCkge1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gIH1cblxuXG5cbiAgXG4gIGdvQmFjaygpIHtcbiAgICB0aGlzLl9sb2NhdGlvbi5iYWNrKCk7XG4gIH1cbiAgaXNEcm9wZG93bk9wZW4oaXRlbTogYW55KTogYm9vbGVhbiB7XG5cblxuICAgICAgcmV0dXJuIHRoaXMub3BlbkRyb3Bkb3duSWQgPT09IGl0ZW0uaWQ7XG4gICAgIFxuICBcbiAgfVxuXG4gIG9uVmlld0NoYW5nZShpc0dyaWRWaWV3OiBib29sZWFuKTogdm9pZCB7fVxuXG4gIG9uU3RhdGVDaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgdmFyIG5ld1VzZXI6IEZvcm1Qcm9wZXJ0eSA9IHtcbiAgICAgICAgICBNYXhWYWx1ZTogMTAwLFxuICAgICAgICAgIE5hbWU6ICcnLFxuICAgICAgICAgIFZhbHVlOiAnJyxcbiAgICAgICAgICBNaW5WYWx1ZTogMTAwLFxuICAgICAgICAgIElzUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIERhdGFUeXBlOiBEYXRhVHlwZS5TdHJpbmcsXG4gICAgICAgICAgRGVmYXVsdFZhbHVlOiAnJyxcbiAgICAgICAgICBpZDonJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjYXJkRGF0YTogQ2FyZERhdGEgPSB7XG4gICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIHRpdGxlOiBuZXdVc2VyLk5hbWUsXG4gICAgICAgICAgZGF0YTogbmV3VXNlcixcbiAgICAgICAgICBib2R5OiBbXSxcbiAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5jYXJkRGF0YS5wdXNoKGNhcmREYXRhKTtcbiAgICAgICAgdGhpcy51c2VyQ2FyZENsaWNrZWQoY2FyZERhdGEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LmlzVGFibGVWaWV3ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmaWx0ZXInOlxuICAgICAgICAgIHRoaXMuc2hvd0ZpbHRlciA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJlc2V0KCl7XG4gICAgdGhpcy5za2lwPTBcbiAgICB0aGlzLnBhZ2VTaXplPTEwXG4gIH1cbiAgYXN5bmMgb25TZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuc2VhcmNoVGVybSA9IGV2ZW50LnZhbHVlO1xuICAgICB0aGlzLnJlc2V0KClcbiAgICBpZiAoIXRoaXMuc2VhcmNoVGVybSkge1xuICAgICAgIHRoaXMuZ2V0UHJvcGVydGllcyh0aGlzLklkKVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuIFxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgYEZvcm0vR2V0Rm9ybUVudGl0aWVzV2l0aFBhcmFtLyR7dGhpcy5zZWFyY2hUZXJtfS8ke3RoaXMuc2tpcH0vJHt0aGlzLnBhZ2VTaXplfS9DcmVhdGVkQXQvYXNjYFxuICAgICAgKTtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHNlYXJjaDonLCByZXMpO1xuICAgIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG4gICAgICAgIHRoaXMuZGF0YT1yZXN1bHRcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2V0VXBDYXJkRGF0YSgpO1xuICAgICAgICBcbiAgICAgIFxuICBcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignU2VhcmNoIGVycm9yOicsIGVycm9yKTtcbiAgIFxuICAgIH0gZmluYWxseSB7XG5cbiAgICB9XG4gIH1cbiAgc2hvd1RhYmxlVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZFJvd3M6IEZvcm1Qcm9wZXJ0eVtdKSB7fVxuICByZXRyeU1lc3NhZ2UoKSB7fVxuXG4gIG9uQ29sdW1uc1VwZGF0ZWQodXBkYXRlZENvbHVtbnM6IElEYXRhRmlsdGVyW10pIHtcbiAgICBjb25zdCB1cGRhdGVkQ29sdW1uRGVmOiBDb2x1bW5EZWZpbml0aW9uPEZvcm1Qcm9wZXJ0eT5bXSA9IFtdO1xuICAgIHVwZGF0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdDb2wgPSB0aGlzLnRhc2tVc2Vyc1N2Yy5mb3JtRmllbGRDb2x1bW5zLmZpbmQoXG4gICAgICAgIChjb2x1bW4pID0+IGNvbHVtbi5oZWFkZXIgPT09IGNvbC5uYW1lIHx8IGNvbHVtbi5pZCA9PT0gY29sLm5hbWVcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdDb2wpIHtcbiAgICAgICAgdXBkYXRlZENvbHVtbkRlZi5wdXNoKG1hdGNoaW5nQ29sKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudmlzaWJsZUNvbHVtbkRlZiA9IFsuLi51cGRhdGVkQ29sdW1uRGVmXTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpbHRlcnNBbmRTb3J0cyhpc1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKCFpc1NlYXJjaCkge1xuICAgICAgdGhpcy5kYXRhVmlldy5vbkNsZWFyU2VhcmNoKCk7XG4gICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtID0gJyc7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICBjb25zdCBjbGlja0V2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICB2aWV3OiB3aW5kb3csXG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY2xpY2tFdmVudCk7XG4gICAgfVxuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRhc2tVc2VyUHJvcGVydHlNYXBbeC5uYW1lIGFzIGtleW9mIHR5cGVvZiBUYXNrVXNlclByb3BlcnR5TWFwXSxcbiAgICAgICAgRW50aXR5VmFsdWU6IHgudmFsdWUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246XG4gICAgICAgICAgeC5jb25kaXRpb24gJiYgT2JqZWN0LmtleXMoRmlsdGVyVHlwZXMpLmluY2x1ZGVzKHguY29uZGl0aW9uKVxuICAgICAgICAgICAgPyAoRmlsdGVyVHlwZXNbXG4gICAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGFza1VzZXJQcm9wZXJ0eU5hbWUuRGF0ZVxuICAgICAgICAgICAgPyBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5EYXRlXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLlN0cmluZyxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgLy8gcGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgIFByb3BlcnR5TmFtZTogJ0FQSUtleScsXG4gICAgLy8gICBFbnRpdHlWYWx1ZTogdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQVBJS2V5LFxuICAgIC8vICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyB9KTtcbiAgICBjb25zdCBzb3J0UGFyYW06IHsgUGFyYW06IHN0cmluZzsgT3JkZXI6IHN0cmluZyB9IHwgbnVsbCA9XG4gICAgICB0aGlzLmN1cnJlbnRTb3J0cy5sZW5ndGggPiAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgUGFyYW06XG4gICAgICAgICAgICAgIFRhc2tVc2VyUHJvcGVydHlNYXBbXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U29ydHNbMF0ubmFtZSBhcyBrZXlvZiB0eXBlb2YgVGFza1VzZXJQcm9wZXJ0eU1hcFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgT3JkZXI6IHRoaXMuY3VycmVudFNvcnRzWzBdLnZhbHVlLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHNlYXJjaFRlcm1FeGlzdHMgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IHNlYXJjaFRlcm1FeGlzdHNcbiAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICAgIGBUYXNrVXNlci9HZXRUYXNrVXNlcldpdGhQYXJhbS8ke3RoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpfS8wLyR7XG4gICAgICAgICAgICB0aGlzLnBhZ2VTaXplXG4gICAgICAgICAgfWAsXG4gICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgICAgKVxuICAgICAgOiBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgIHNvcnRQYXJhbVxuICAgICAgICAgICAgPyBgVGFza1VzZXIvU2VhcmNoVGFza1VzZXJzLzAvJHt0aGlzLnBhZ2VTaXplfS8ke3NvcnRQYXJhbS5QYXJhbX0vJHtzb3J0UGFyYW0uT3JkZXJ9YFxuICAgICAgICAgICAgOiBgVGFza1VzZXIvU2VhcmNoVGFza1VzZXJzLzAvJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgdGhpcy5jdXJyZW50RmlsdGVycyA9IFtdO1xuICAgICAgdGhpcy5jdXJyZW50U29ydHMgPSBbXTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZVN0YXRlID0gcmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+O1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4pLlJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIGlkOiB4LklkLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgbG9hZE1vcmVGaWx0ZXJzQW5kU29ydHMoKTogUHJvbWlzZTxcbiAgICBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PiB8IHVuZGVmaW5lZFxuICA+IHtcbiAgICBpZiAoIXRoaXMucGFnZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRhc2tVc2VyUHJvcGVydHlNYXBbeC5uYW1lIGFzIGtleW9mIHR5cGVvZiBUYXNrVXNlclByb3BlcnR5TWFwXSxcbiAgICAgICAgRW50aXR5VmFsdWU6IHgudmFsdWUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246XG4gICAgICAgICAgeC5jb25kaXRpb24gJiYgT2JqZWN0LmtleXMoRmlsdGVyVHlwZXMpLmluY2x1ZGVzKHguY29uZGl0aW9uKVxuICAgICAgICAgICAgPyAoRmlsdGVyVHlwZXNbXG4gICAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGFza1VzZXJQcm9wZXJ0eU5hbWUuRGF0ZVxuICAgICAgICAgICAgPyBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5EYXRlXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLlN0cmluZyxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3Qgc29ydFBhcmFtOiB7IFBhcmFtOiBzdHJpbmc7IE9yZGVyOiBzdHJpbmcgfSB8IG51bGwgPVxuICAgICAgdGhpcy5jdXJyZW50U29ydHMubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIFBhcmFtOlxuICAgICAgICAgICAgICBUYXNrVXNlclByb3BlcnR5TWFwW1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNvcnRzWzBdLm5hbWUgYXMga2V5b2YgdHlwZW9mIFRhc2tVc2VyUHJvcGVydHlNYXBcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIE9yZGVyOiB0aGlzLmN1cnJlbnRTb3J0c1swXS52YWx1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBzZWFyY2hUZXJtRXhpc3RzID0gdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBzZWFyY2hUZXJtRXhpc3RzXG4gICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgICBgVGFza1VzZXIvR2V0VGFza1VzZXJXaXRoUGFyYW0vJHt0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKX0vJHtcbiAgICAgICAgICAgIHRoaXMucGFnZVN0YXRlLlNraXBcbiAgICAgICAgICB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgICAgIClcbiAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgICBzb3J0UGFyYW1cbiAgICAgICAgICAgID8gYFRhc2tVc2VyL1NlYXJjaFRhc2tVc2Vycy8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX0vJHtzb3J0UGFyYW0uUGFyYW19LyR7c29ydFBhcmFtLk9yZGVyfWBcbiAgICAgICAgICAgIDogYFRhc2tVc2VyL1NlYXJjaFRhc2tVc2Vycy8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuIG9uRmlsdGVyQXBwbGllZChhcHBsaWVkRmlsdGVyOiBJRGF0YUZpbHRlcltdKSB7XG4gICBcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcHBsaWVkRmlsdGVyKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlclRhYmxlQ291bnQgPSBhcHBsaWVkRmlsdGVyLmxlbmd0aDtcblxuICAgICAgdGhpcy5zaG93RmlsdGVyID0gZmFsc2U7XG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGFwcGxpZWRGaWx0ZXJcbiAgICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY2hlY2tlZClcbiAgICAgICAgLm1hcCgoZmlsdGVyKSA9PiAoe1xuICAgICAgICAgIFByb3BlcnR5TmFtZTogZmlsdGVyLm5hbWUsXG4gICAgICAgICAgRW50aXR5VmFsdWU6IGZpbHRlci52YWx1ZSxcbiAgICAgICAgICBUeXBlOiBmaWx0ZXIudHlwZSxcbiAgICAgICAgICBPcGVyYXRvcjogJ0FuZCcsXG4gICAgICAgICAgU2lnbjogdGhpcy5nZXRDb25kaXRpb24oZmlsdGVyLmNvbmRpdGlvbiksXG4gICAgICAgIH0pKTtcblxuICAgICAgdGhpcy5wb3N0U2VhcmNoKHF1ZXJ5UGFyYW1zKTtcbiAgICB9XG4gIH1cbiAgZ2V0Q29uZGl0aW9uKHZhbHVlOiBhbnkpe1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgQ29uZGl0aW9uYWxPcHRpb25zLk9uOlxuICAgICAgICByZXR1cm4gU2VhcmNoUHJvcGVydHlTaWduLkVRO1xuICAgICAgY2FzZSBDb25kaXRpb25hbE9wdGlvbnMuQWZ0ZXI6XG4gICAgICAgIHJldHVybiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVE7XG4gICAgICBjYXNlIENvbmRpdGlvbmFsT3B0aW9ucy5CZWZvcmU6XG4gICAgICAgIHJldHVybiBTZWFyY2hQcm9wZXJ0eVNpZ24uTFQ7XG4gICAgICBjYXNlIENvbmRpdGlvbmFsT3B0aW9ucy5Ob3RFcXVhbDpcbiAgICAgICAgcmV0dXJuIFNlYXJjaFByb3BlcnR5U2lnbi5ORVE7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWUgXG4gICAgfVxuICB9XG4gIG9uU29ydFVwZGF0ZWQodXBkYXRlZFNvcnRzOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgdGhpcy5jdXJyZW50U29ydHMgPSB1cGRhdGVkU29ydHM7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHMoKTtcbiAgfVxuXG4gIGhhbmRsZVNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtJC5uZXh0KGV2ZW50LnZhbHVlKTtcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydChleHBvcnRlZERhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ0V4cG9ydGVkIGRhdGE6JywgZXhwb3J0ZWREYXRhKTtcbiAgICB0aGlzLmRvd25sb2FkQ1NWKGV4cG9ydGVkRGF0YSk7XG4gIH1cbiAgcHJpdmF0ZSBkb3dubG9hZENTVihkYXRhOiBQYXJ0aWFsPGFueT5bXSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyhkYXRhWzBdKTtcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gW1xuICAgICAgaGVhZGVycy5qb2luKCcsJyksXG4gICAgICAuLi5kYXRhLm1hcCgocm93KSA9PiBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiByb3dbaGVhZGVyXSkuam9pbignLCcpKSxcbiAgICBdLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZDb250ZW50XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgaWYgKGxpbmsuZG93bmxvYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsICdleHBvcnQuY3N2Jyk7XG4gICAgICBsaW5rLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgIH1cbiAgfVxufVxuIiwiPGhlYWRlclxuICBjbGFzcz1cInJvdW5kZWQtbGcgc2hhZG93LWxnIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBweC02IHB5LTIgYmctWyNENEEwMDc3M11cIlxuPlxuICA8aDQgY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3tmb3JtTmFtZX19PC9oND5cbiAgPHZlcmJlbi1zdmdcbiAgICAoY2xpY2spPVwiZ29CYWNrKClcIlxuICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgIFt3aWR0aF09XCIxN1wiXG4gICAgW2hlaWdodF09XCIxN1wiXG4gICAgW2ljb25dPVwiJ2Nsb3NlJ1wiXG4gID48L3ZlcmJlbi1zdmc+XG48L2hlYWRlcj5cbjxkaXYgI21lc3NhZ2VMb2cgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IG1lc3NhZ2UtbG9nLWNvbnRhaW5lclwiPlxuICA8dmVyYmVuLWRhdGEtdmlld1xuICAgICN2ZHZcbiAgICBbdmlld1N0YXRlXT1cIntcbiAgICAgICAgaXNTZWFyY2g6IHRydWUsXG4gICAgICAgIGlzQ29sdW1uOiB0cnVlLFxuICAgICAgICBpc0ZpbHRlcjogdHJ1ZSxcbiAgICAgICAgaXNTb3J0OiB0cnVlLFxuICAgICAgICBpc0V4cG9ydDogdHJ1ZSxcbiAgICAgICAgaXNTZWxlY3Q6IHRydWUsXG4gICAgICAgIGlzQ3JlYXRlOiB0cnVlLFxuICAgICAgICBpc1RvZ2dsZTp0cnVlLFxuICAgICAgfVwiXG4gICAgW2J1dHRvbkNsYXNzXT1cIidteS1jdXN0b20tYnV0dG9uLWNsYXNzJ1wiXG4gICAgW2ljb25DbGFzc109XCInbXktaWNvbi1jbGFzcydcIlxuICAgIFthY3RpdmVJY29uQ2xhc3NdPVwiJ215LWFjdGl2ZS1pY29uLWNsYXNzJ1wiXG4gICAgW3NlbGVjdGVkQ29sdW1uQ291bnRdPVwiMFwiXG4gICAgW3NlbGVjdGVkU29ydENvdW50XT1cIjBcIlxuICAgIFtzZWxlY3RlZEZpbHRlclRhYmxlQ291bnRdPVwiMFwiXG4gICAgW3Nob3dGaWx0ZXJDaGlsZF09XCJzaG93RmlsdGVyXCJcbiAgICBbc2VhcmNoVmFsdWVdPVwic2VhcmNoVGVybVwiXG4gICAgKHZpZXdDaGFuZ2UpPVwib25WaWV3Q2hhbmdlKCRldmVudClcIlxuICAgIChzdGF0ZUNoYW5nZSk9XCJvblN0YXRlQ2hhbmdlKCRldmVudClcIlxuICAgIChvblNlYXJjaENoYW5nZSk9XCJvblNlYXJjaCgkZXZlbnQpXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgdGFibGUtY29udGVudD5cbiAgICAgIDxsaWItZGF0YS10YWJsZVxuICAgICAgICAjZHRcbiAgICAgICAgW2RhdGFdPVwicHJvcGVydGllc1wiXG4gICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5EZWZcIlxuICAgICAgICBbc3R5bGVDb25maWddPVwic3R5bGVzXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzZWxlY3RcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsXG4gICAgICAgICAgICBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd1NlbGVjdGlvbj1cInRvZ2dsZVJvd1NlbGVjdGlvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVJvd1NlbGVjdGlvbigpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNoZWFkZXJcbiAgICAgICAgICAgIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXNvbWVSb3dzU2VsZWN0ZWQ9XCJzb21lUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgIGxldC10b2dnbGVBbGxSb3dzPVwidG9nZ2xlQWxsUm93c1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVBbGxSb3dzKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJuYW1lXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICB7eyB2YWx1ZS5OYW1lIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICBpbnB1dENvbnRhaW5lckNsYXNzPVwidy1maXRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5OYW1lXCJcbiAgICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwibWluVmFsdWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIHt7IHZhbHVlIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICBbdHlwZV09XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKHJvdywgJ01pblZhbHVlJylcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY29udmVydFRvSW50KCRldmVudCwgcm93LCAnTWluVmFsdWUnKVwiXG4gICAgICAgICAgICAgIGlucHV0Q29udGFpbmVyQ2xhc3M9XCJ3LVsxMzBweF1cIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJtYXhWYWx1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIFt0eXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgaW5wdXRDb250YWluZXJDbGFzcz1cInctWzEzMHB4XVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKHJvdywgJ01heFZhbHVlJylcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY29udmVydFRvSW50KCRldmVudCwgcm93LCAnTWF4VmFsdWUnKVwiXG4gICAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImRlZmF1bHRWYWx1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIGlucHV0Q29udGFpbmVyQ2xhc3M9XCJ3LVsxMzBweF1cIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5EZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJkYXRhVHlwZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNoYW5nZSBEYXRhIFR5cGVcIlxuICAgICAgICAgICAgICAgIFsob3B0aW9ucyldPVwiZGF0YVR5cGVcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LkRhdGFUeXBlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJpc1JlcXVpcmVkXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICA8dmVyYmVuLXN2ZyAqbmdJZj1cInZhbHVlID09PSB0cnVlXCIgW2ljb25dPVwiJ2NoZWNrJ1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnICpuZ0lmPVwidmFsdWUgPT09IGZhbHNlXCIgW2ljb25dPVwiJ2Vycm9yJ1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLXN3aXRjaFxuICAgICAgICAgICAgICBbb25Db2xvcl09XCInIzFBMjM3RSdcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5Jc1JlcXVpcmVkXCJcbiAgICAgICAgICAgID48L3ZlcmJlbmEtc3dpdGNoPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiYWN0aW9uc1wiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCIgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCIgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIDx2ZXJiZW4tcG9wLVVwICBbY3VzdG9tU3R5bGVzXT1cInsnei1pbmRleCc6ICc5OSd9XCIgW2Ryb3Bkb3duT3Blbl09XCJvcGVuRHJvcGRvd25JZD09PXJvdy5pZFwiXG4gICAgICAgICAgICAgIFtlbmFibGVNb3VzZUxlYXZlXT1cImZhbHNlXCIgKGNsb3NlKT1cIm9uQ2xvc2UoKVwiPlxuICAgICAgICAgICAgICA8dmVyYmVuLXN2ZyBjbGFzcz1cImN1cnNvci1wb2ludGVyIGFjdGlvbnMtaWNvblwiIChjbGljayk9XCJvcGVuRHJvcGRvd24ocm93KVwiIGRyb3Bkb3duLXRyaWdnZXJcbiAgICAgICAgICAgICAgICBpY29uPVwibGlzdFwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcC11cC1jb250ZW50IGZsZXggZmxleC1jb2xcIiAgKm5nSWY9XCJvcGVuRHJvcGRvd25JZD09PXJvdy5pZFwiIGRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwidG9nZ2xlUm93RWRpdCgpXCIgY2xhc3M9XCJwb3AtdXAtdmFsdWUgY3Vyc29yLXBvaW50ZXJcIj5FZGl0PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcC11cC12YWx1ZSBjdXJzb3ItcG9pbnRlclwiPkRlbGV0ZTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbEVkaXQgbGV0LWlzRWRpdGluZz1cImlzRWRpdGluZ1wiIGxldC10b2dnbGVSb3dFZGl0PVwidG9nZ2xlUm93RWRpdFwiIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHZlcmJlbi1zdmcgaWNvbj1cImNoZWNrXCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVWaWFUYWJsZShyb3csIHRvZ2dsZVJvd0VkaXQpXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8dmVyYmVuLXN2ZyBpY29uPVwiZGVsZXRlXCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgPHZlcmJlbi1zdmcgaWNvbj1cImNhcmRWaWV3QWx0XCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiIChjbGljayk9XCJnb1RvQ2FyZFZpZXcodmFsdWUpXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2xpYi1kYXRhLXRhYmxlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2FyZC1jb250ZW50PlxuICAgICAgPHZlcmJlbi1jYXJkLWRhdGEtdmlld1xuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMnB4XCJcbiAgICAgICAgI3ZkY3ZcbiAgICAgICAgZGF0YUlkPVwiSWRcIlxuICAgICAgICBib3JkZXI9XCI1cHhcIlxuICAgICAgICBbY2FyZERhdGFMaXN0XT1cImNhcmREYXRhXCJcbiAgICAgICAgcmJnQ29sb3I9XCIjZjVmNmY5XCJcbiAgICAgICAgbWc9XCIwcHhcIlxuICAgICAgPlxuICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhLXZpZXcgY2xhc3M9XCJzcGFjZS15LTdcIj5cbiAgICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhXG4gICAgICAgICAgICAjdmxjZFxuICAgICAgICAgICAgW3BhcmVudF09XCJ2ZGN2XCJcbiAgICAgICAgICAgIGRhdGFJZD1cImlkXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYmctc2Vjb25kYXJ5LTEwMCByb3VuZGVkLXhsIGJvcmRlci1wcmltYXJ5IGJvcmRlci1bMXB4XVwiXG4gICAgICAgICAgICBbY2FyZERhdGFMaXN0XT1cImNhcmREYXRhXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcmQgbGV0LWl0ZW0+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidXNlckNhcmRDbGlja2VkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggY3Vyc29yLXBvaW50ZXIgaC1bbWF4LWNvbnRlbnRdXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiIChjbGljayk9XCJ0b2dnbGVDaGlsZHJlbihpdGVtKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aD8ndmlzaWJsZSc6J2ludmlzaWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1zLWNlbnRlciBmbGV4ICBwci0xIGN1cnNvci1wb2ludGVyXCIgW2ljb25dPVwiaXRlbS5pc0NoaWxkcmVuRXhwYW5kZWQ/J21pbnVzJzoncGx1cydcIiAvPiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgYmctc2Vjb25kYXJ5IHJvdW5kZWQteGxcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTMgcm91bmRlZC14bCByb3VuZGVkLXRyLW5vbmUgcm91bmRlZC1ici1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA/ICdiZy1wcmltYXJ5JyA6ICdiZy1zZWNvbmRhcnktMjAwJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTMgcHgtNCBmbGV4LTEgaC1bMTAwJV1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBmbGV4LTEgZ2FwLTEganVzdGlmeS1iZXR3ZWVuIGgtWzEwMCVdXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LTEgY2FyZC1taW4taGVpZ2h0IGp1c3RpZnktYmV0d2VlbiBoLVsxMDAlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIG1yLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXktMCBmb250LWJvbGQgdGV4dC1bIzQwNDA0MF0gbGVhZGluZy1bMTkuNXB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5kYXRhLk5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIhdGV4dC1bMTBweF0gdGV4dC1bIzQwNDA0MF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+RGF0YSBUeXBlOjwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIhdGV4dC1bMTNweF0gZm9udC1ib2xkXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kYXRhLkRhdGFUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIhdGV4dC1bMTBweF0gdGV4dC1bIzQwNDA0MF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPkRlZmF1bHQgVmFsdWU6PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiIXRleHQtWzEycHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmRhdGEuRGVmYXVsdFZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1lbmQgaC1bMTAwJV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnVtLXZhbCB7e2l0ZW0uZGF0YS5TdGF0dXN9fVwiPnt7aXRlbS5kYXRhLlN0YXR1c319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC92ZXJiZW4tbGVmdC1jYXJkLWRhdGE+XG4gICAgICAgIDwvdmVyYmVuLWxlZnQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgIDx2ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwYXJlbnQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5jdXJyZW50RGF0YVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCByb3VuZGVkLXhsIGgtZnVsbCB3LWZ1bGwgcmVsYXRpdmUgZ2FwLTZcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJOYW1lXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIk5hbWVcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVRhYmxlKClcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudERhdGEuZGF0YS5OYW1lXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PkRhdGEgVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDaGFuZ2UgRGF0YSBUeXBlXCJcbiAgICAgICAgICAgICAgICAgIFsob3B0aW9ucyldPVwiZGF0YVR5cGVcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRHJvcERvd25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlID09PSAnSW50JyB8fFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlID09PSAnRGVjaW1hbCdcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0VudGVyIGRlZmF1bHQgbnVtYmVyJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKGN1cnJlbnREYXRhLmRhdGEsICdEZWZhdWx0VmFsdWUnKVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9JbnQoJGV2ZW50LCBjdXJyZW50RGF0YS5kYXRhLCAnRGVmYXVsdFZhbHVlJylcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cIkRlZmF1bHRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRGVmYXVsdCBWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVRhYmxlKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudERhdGEuZGF0YS5EYXRhVHlwZSA9PT0gJ1N0cmluZycgfHwgY3VycmVudERhdGEuZGF0YS5EYXRhVHlwZSA9PT0gJ1VSTCdcIj5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInRW50ZXIgZGVmYXVsdCB0ZXh0J1wiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudERhdGEuZGF0YS5EZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiRGVmYXVsdFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJEZWZhdWx0IFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlVGFibGUoKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+UmVxdWlyZWQ8L3A+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDx2ZXJiZW5hLXN3aXRjaFxuICAgICAgICAgICAgICAgICAgW29uQ29sb3JdPVwiJyMxQTIzN0UnXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudERhdGEuZGF0YS5Jc1JlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICA+PC92ZXJiZW5hLXN3aXRjaD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGlkZU1pbk1heFwiIGNsYXNzPVwiIGZsZXggZmxleC1jb2wgZ2FwLTZcIj5cbiAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgICBuYW1lPVwibWluVmFsdWVcIlxuICAgICAgICAgICAgICBsYWJlbD1cIk1pbiBWYWx1ZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVRhYmxlKClcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRTdHJpbmdWYWx1ZShjdXJyZW50RGF0YS5kYXRhLCAnTWluVmFsdWUnKVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9JbnQoJGV2ZW50LCBjdXJyZW50RGF0YS5kYXRhLCAnTWluVmFsdWUnKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIFt0eXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgbmFtZT1cIm1heFZhbHVlXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJNYXggVmFsdWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVUYWJsZSgpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0U3RyaW5nVmFsdWUoY3VycmVudERhdGEuZGF0YSwgJ01heFZhbHVlJylcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgY29udmVydFRvSW50KCRldmVudCwgY3VycmVudERhdGEuZGF0YSwgJ01heFZhbHVlJylcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBidXR0b25zIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gdy1mdWxsIGJvdHRvbS04IGxlZnQtMCByaWdodC0wXCI+XG4gICAgICAgICAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInZlcmJlbi1kZWxldGUtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHRleHQ9XCJEZWxldGVcIlxuICAgICAgICAgICAgICAgID48L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tc3dpdGNoLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvVGFibGVWaWV3KClcIlxuICAgICAgICAgICAgICAgICAgICB0ZXh0PVwiU3dpdGNoIFRvIFRhYmxlXCJcbiAgICAgICAgICAgICAgICAgID48L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVVc2VyKClcIlxuICAgICAgICAgICAgICAgICAgICB0ZXh0PVwiU2F2ZVwiXG4gICAgICAgICAgICAgICAgICA+PC92ZXJiZW5hLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3ZlcmJlbi1yaWdodC1jYXJkLWRhdGEtdmlldz5cbiAgICAgICAgPCEtLSA8dmVyYmVuLXJpZ2h0LWNhcmQtZGF0YS12aWV3PlxuICAgICAgICAgICAgeWVzaGhoaGhoXG4gICAgICAgICAgPC92ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+IC0tPlxuXG4gICAgICAgIDx2ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cIiF2ZGN2Lmhhc0N1cnJlbnRJdGVtKClcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1lc3NhZ2UtbG9nLWJ1dHRvbi1jb250YWluZXIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgICBbZm9udFdlaWdodF09XCInYm9sZCdcIlxuICAgICAgICAgICAgICAgIFtiZ0NvbG9yXT1cIicjOEU4RDg3J1wiXG4gICAgICAgICAgICAgICAgW2JvcmRlclJhZGl1c109XCInNHB4J1wiXG4gICAgICAgICAgICAgICAgW3RleHRDb2xvcl09XCInI2ZmZidcIlxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidEZWxldGUnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB7e1xuICAgICAgICAgICAgICAgIHZkY3YuaGFzQ3VycmVudEl0ZW0oKSA/ICdmbGV4LTEnIDogJydcbiAgICAgICAgICAgICAgfX0ganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC01XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiXG4gICAgICAgICAgICAgICAgPnt7IGNhcmREYXRhLmxlbmd0aCB9fSByZWNvcmRzIGxvYWRlZDwvc3BhblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyPlxuICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjb2x1bW4tY29udGVudD5cbiAgICAgIDx2ZXJiZW4tdmlzaWJsZS1jb2x1bW5cbiAgICAgICAgKGNvbHVtbnNVcGRhdGVkKT1cIm9uQ29sdW1uc1VwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgIHdpZHRoPVwiNDAwcHhcIlxuICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgIFtkaXNwbGF5ZWRDb2x1bW5zXT1cIjVcIlxuICAgICAgPjwvdmVyYmVuLXZpc2libGUtY29sdW1uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgZmlsdGVyLWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLXRhYmxlLWZpbHRlclxuICAgICAgICAoZmlsdGVyc0FwcGxpZWQpPVwib25GaWx0ZXJBcHBsaWVkKCRldmVudClcIlxuICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICB3aWR0aD1cIjQyMHB4XCJcbiAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgdGVydGlhcnlDb2xvcj1cIiM0MDQwNDBcIlxuICAgICAgICBbZmlsdGVyT3B0aW9uc109XCJmaWx0ZXJBcnJheVwiXG4gICAgICAgIFttYXhGaWx0ZXJMZW5ndGhdPVwiM1wiXG4gICAgICA+PC92ZXJiZW4tdGFibGUtZmlsdGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc29ydC1jb250ZW50PlxuICAgICAgPHZlcmJlbi1zb3J0LXRhYmxlXG4gICAgICAgIChzZWxlY3RlZE9wdGlvbnMpPVwib25Tb3J0VXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiXG4gICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgd2lkdGg9XCI0MDBweFwiXG4gICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiXG4gICAgICAgIHRlcnRpYXJ5Q29sb3I9XCIjNDA0MDQwXCJcbiAgICAgICAgW2VuYWJsZURyYWdBbmREcm9wXT1cInRydWVcIlxuICAgICAgICBbc29ydE9wdGlvbnNdPVwic29ydE9wdGlvbnNcIlxuICAgICAgPjwvdmVyYmVuLXNvcnQtdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBleHBvcnQtY29udGVudD5cbiAgICAgIDxsaWItZGF0YS1leHBvcnQgW2RhdGFdPVwiZGF0YVswXS5Qcm9wZXJ0aWVzXCIgKGV4cG9ydERhdGFFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiPlxuICAgICAgPC9saWItZGF0YS1leHBvcnQ+XG4gICAgPC9kaXY+XG4gIDwvdmVyYmVuLWRhdGEtdmlldz5cbiAgPGRpdiAqbmdJZj1cInZkdi5pc1RhYmxlVmlld1wiIGNsYXNzPVwiZmxleCBnYXAtMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1sb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgIFtmb250V2VpZ2h0XT1cIidib2xkJ1wiXG4gICAgICAgIFtiZ0NvbG9yXT1cIicjOEU4RDg3J1wiXG4gICAgICAgIFtib3JkZXJSYWRpdXNdPVwiJzRweCdcIlxuICAgICAgICBbdGV4dENvbG9yXT1cIicjZmZmJ1wiXG4gICAgICAgIFt0ZXh0XT1cIidEZWxldGUnXCJcbiAgICAgID5cbiAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC01XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInBhZ2luYXRvci10ZXh0XCI+e3sgY2FyZERhdGEubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibG9hZE1vcmUoKVwiIGNsYXNzPVwibG9hZC1tb3JlIHZpZXctbGlua3NcIj5cbiAgICAgICAgTG9hZCBtb3JlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3LVs0MDBweF0gYmctd2hpdGUgcC00IHNoYWRvdy1sZyBib3JkZXJcIj5cbiAgPGZvcm0tY29udHJvbCAgW2RhdGFUeXBlXT1cImRhdGFUeXBlMlwiIFtmb3JtUHJvcGVydGllc109XCJkYXRhWzBdLlByb3BlcnRpZXNcIj48L2Zvcm0tY29udHJvbD5cbjwvZGl2PlxuIl19
|
|
835
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWdyb3VwL2Zvcm0tZmllbGRzL2Zvcm0tZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1ncm91cC9mb3JtLWZpZWxkcy9mb3JtLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsa0JBQWtCLEVBQ2xCLGNBQWMsR0FNZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7OztBQU1wRCxJQUFLLG9CQVNKO0FBVEQs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Q0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztZQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQzt3R0FyNUJVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLHlsQkM3RWhDLDJsakJBNmRBOzs0RkRoWmEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjt5V0FTakIsSUFBSTtzQkFBYixLQUFLO2dCQUlvQyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ3JCLFlBQVk7c0JBQTlCLFNBQVM7dUJBQUMsTUFBTTtnQkFDQyxRQUFRO3NCQUF6QixTQUFTO3VCQUFDLEtBQUs7Z0JBQ0MsU0FBUztzQkFBekIsU0FBUzt1QkFBQyxJQUFJO2dCQUNOLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0ksb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENhcmREYXRhLFxuICBDYXJkRGF0YVZpZXdDb21wb25lbnQsXG4gIENvbHVtbkRlZmluaXRpb24sXG4gIENvbmRpdGlvbmFsT3B0aW9ucyxcbiAgRGF0YUZpbHRlclR5cGUsXG4gIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgRGF0YVZpZXdDb21wb25lbnQsXG4gIERyb3Bkb3duQ2hhbmdlRXZlbnQsXG4gIERyb3Bkb3duTG9hZEV2ZW50LFxuICBJRGF0YUZpbHRlcixcbn0gZnJvbSAndmVyYmVuLW5nLXVpJztcbmltcG9ydCB7IGJhc2VTdHlsZSB9IGZyb20gJy4uL2Jhc2UtdGFibGUtc3R5bGUnO1xuaW1wb3J0IHsgVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgSHR0cFdlYlJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHR0cC13ZWItcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvRXJyb3JSZXNwb25zZSc7XG5pbXBvcnQgeyBQYWdlZFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9QYWdlZFJlc3VsdCc7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1NlYXJjaFByb3BlcnR5VmFsdWUnO1xuaW1wb3J0IHsgU2VhcmNoT3BlcmF0b3IgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvU2VhcmNoT3BlcmF0b3InO1xuaW1wb3J0IHsgU2VhcmNoUHJvcGVydHlTaWduIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1NlYXJjaFByb3BlcnR5U2lnbic7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL1NlYXJjaFByb3BlcnR5VmFsdWVUeXBlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3N0YXR1cyc7XG5pbXBvcnQgeyBPYmplY3RTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9vYmplY3Qtc3RhdGUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL0RhdGFUeXBlJztcbmltcG9ydCB7IEZvcm1zRmllbGRTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLWZpZWxkcy5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1FbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvRm9ybUVudGl0eSc7XG5pbXBvcnQgeyBGb3JtUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvRm9ybVByb3BlcnR5JztcblxuZW51bSBUYXNrVXNlclByb3BlcnR5TmFtZSB7XG4gIFVzZXIgPSAnVXNlcicsXG4gIERhdGUgPSAnRGF0ZScsXG4gIFJvbGUgPSAnUm9sZScsXG4gIFNlcnZpY2UgPSAnU2VydmljZScsXG4gIEFwcGxpY2F0aW9uID0gJ0FwcGxpY2F0aW9uJyxcbiAgVGVuYW50ID0gJ1RlbmFudCcsXG4gIEVtYWlsID0gJ0VtYWlsJyxcbiAgU3RhdHVzID0gJ1N0YXR1cycsXG59XG5lbnVtIFRhc2tVc2VyUHJvcGVydHlNYXAge1xuICBVc2VyID0gJ05hbWUnLFxuICBEYXRlID0gJ0NyZWF0ZWRBdCcsXG4gIFJvbGUgPSAnUm9sZUlEJyxcbiAgU2VydmljZSA9ICdTZXJ2aWNlTmFtZScsXG4gIEFwcGxpY2F0aW9uID0gJ0FwcGxpY2F0aW9uJyxcbiAgVGVuYW50ID0gJ1RlbmFudElkJyxcbiAgRW1haWwgPSAnTWFpbEFkZHJlc3MnLFxuICBTdGF0dXMgPSAnU3RhdHVzJyxcbn1cblxuZW51bSBGaWx0ZXJUeXBlcyB7XG4gIEJlZm9yZSA9IFNlYXJjaFByb3BlcnR5U2lnbi5MVCxcbiAgT24gPSBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gIEFmdGVyID0gU2VhcmNoUHJvcGVydHlTaWduLkdULFxuICBORVEgPSBTZWFyY2hQcm9wZXJ0eVNpZ24uTkVRLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZm9ybS1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1maWVsZHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZm9ybS1maWVsZHMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1GaWVsZHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICB2aXNpYmxlQ29sdW1uRGVmOiBDb2x1bW5EZWZpbml0aW9uPEZvcm1Qcm9wZXJ0eT5bXSA9IFtdO1xuICBzdHlsZXMgPSBiYXNlU3R5bGU7XG4gIGRhdGE6IEZvcm1FbnRpdHlbXSA9IFtdO1xuICBoaWRlTWluTWF4OmJvb2xlYW49dHJ1ZVxuICBASW5wdXQgKCkgcGF0aDogc3RyaW5nID0gJy9kb2N1bWVudGF0aW9uL3dvcmtmbG93LWZvcm1zL2ZpZWxkcyc7XG4gIGNhcmREYXRhOiBDYXJkRGF0YVtdID0gW107XG4gIHF1ZXJ5UGFyYW1zOiBhbnkgPSB7fTtcbiAgY3VycmVudERhdGE6IENhcmREYXRhIHwgbnVsbCA9IG51bGw7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIGZpbGVJbnB1dCE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3ZkY3YnKSBjYXJkRGF0YVZpZXchOiBDYXJkRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3ZkdicpIGRhdGFWaWV3ITogRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2R0JykgdGFibGVWaWV3ITogRGF0YVRhYmxlQ29tcG9uZW50PEZvcm1FbnRpdHk+O1xuICBASW5wdXQoKSBhcHBsaWNhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgQElucHV0KCkgc2VhcmNoRGVib3VuY2VUaW1lOiBudW1iZXIgPSA1MDA7XG4gIEBPdXRwdXQoKSBvblZpZXdQcm9jZXNzQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGN1cnJlbnRFeHBhbmRlZENhcmQ6IENhcmREYXRhIHwgbnVsbCA9IG51bGw7XG4gIHBhZ2VTdGF0ZTogUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4gfCBudWxsID0gbnVsbDtcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIG9wZW5Ecm9wZG93bklkOiBzdHJpbmcgfCBudWxsfCBudW1iZXIgPSBudWxsO1xuICBjdXJyZW50RmlsdGVyczogSURhdGFGaWx0ZXJbXSA9IFtdO1xuICBjdXJyZW50U29ydHM6IElEYXRhRmlsdGVyW10gPSBbXTtcbiAgc2VsZWN0ZWRGaWx0ZXJUYWJsZUNvdW50Om51bWJlcj0wXG4gIHNob3dGaWx0ZXI6Ym9vbGVhbj1mYWxzZVxuICBmb3JtTmFtZTpzdHJpbmc9JydcbiAgc2VhcmNoVGVybSQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByb3BlcnRpZXM6Rm9ybVByb3BlcnR5W109W11cbiAgc2VhcmNoVGVybTpzdHJpbmc9JydcbiAgc2tpcD0wXG4gIElkOnN0cmluZz0nJ1xuICBzdGF0dXNPcHRpb25zOiBTdGF0dXNbXSA9IE9iamVjdC52YWx1ZXMoU3RhdHVzKTtcbiAgZGF0YVR5cGU6IERhdGFUeXBlW10gPSBPYmplY3QudmFsdWVzKERhdGFUeXBlKTtcbiAgZGF0YVR5cGUyOiBEYXRhVHlwZT1EYXRhVHlwZS5TdHJpbmdcbiAgdXNlcnM6IEZvcm1FbnRpdHlbXSA9IFtdO1xuXG4gIHZpc2libGVDb2x1bW5zOiBJRGF0YUZpbHRlcltdID0gW107XG5cbiAgZmlsdGVyQXJyYXk6IElEYXRhRmlsdGVyW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogJ05hbWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGF0YVR5cGUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGVmYXVsdFZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAgXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ01heFZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLk51bWJlcixcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTonTWluVmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOidJc1JlcXVpcmVkJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgXG4gIF07XG5cbiAgc29ydE9wdGlvbnM6IElEYXRhRmlsdGVyW10gPVtcbiAgICB7XG4gICAgICBuYW1lOiAnTmFtZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdEYXRhVHlwZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdEZWZhdWx0VmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICBcbiAgICB7XG4gICAgICBuYW1lOiAnVmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTWF4VmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuTnVtYmVyLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOidNaW5WYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6J0lzUmVxdWlyZWQnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuQm9vbCxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICBcbiAgXTtcblxuICBwcml2YXRlIGN1cnJlbnRTZWFyY2hUZXJtOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHNlcnZlcjogSHR0cFdlYlJlcXVlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGVudlN2YzogRW52aXJvbm1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSB0YXNrVXNlcnNTdmM6IEZvcm1zRmllbGRTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2xvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcbiAgKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uRGVmID0gdGFza1VzZXJzU3ZjLmZvcm1GaWVsZENvbHVtbnM7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRhc2tVc2Vyc1N2Yy5mb3JtRmllbGRDb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgY2hlY2tlZDogdHJ1ZSxcbiAgICAgIG5hbWU6IHR5cGVvZiBjb2wuaGVhZGVyID09PSAnc3RyaW5nJyA/IGNvbC5oZWFkZXIgOiBjb2wuaWQsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5Cb29sLFxuICAgIH0pKTtcbiAgfVxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIHRoaXMuc2VhcmNoVGVybSRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLnNlYXJjaERlYm91bmNlVGltZSkpIC8vIEFkanVzdCBkZWJvdW5jZSB0aW1lIGhlcmUgKGluIG1zKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAoc2VhcmNoVGVybSkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtID0gc2VhcmNoVGVybTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHModHJ1ZSk7XG4gICAgICB9KTtcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBJZCA9IHBhcmFtc1snRm9ybUlkJ107XG4gICAgICBjb25zdCBOYW1lID0gcGFyYW1zWydOYW1lJ107XG4gICAgICB0aGlzLklkPUlkXG4gICAgICB0aGlzLmZvcm1OYW1lPU5hbWVcbiAgICAgIGlmIChJZCkge1xuICAgICAgICB0aGlzLmdldFByb3BlcnRpZXMoSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBhc3luYyBwb3N0U2VhcmNoKHBheWxvYWQ6IGFueSkge1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgRm9ybS9TZWFyY2hGb3JtRW50aXRpZXMvMC8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgIHBheWxvYWRcbiAgICApO1xuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgIFxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIHRoaXMucGFnZVN0YXRlID0gcmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+O1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4pLlJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YT1yZXN1bHRcbiAgICAgIHRoaXMuc2V0VXBDYXJkRGF0YSgpO1xuICAgICAgLy8gdGhpcy5zZXRVcENhcmREYXRhRXh0cmEodGhpcy5kYXRhKVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICBvbkRyb3BEb3duQ2hhbmdlKGV2ZW50OnN0cmluZyl7XG4gICAgaWYoIGV2ZW50KXtcbiAgICAgIHRoaXMuY2hlY2tNaW5NYXgoZXZlbnQpXG4gICAgfVxuICBcbiAgfVxuICBhc3luYyBnZXRQcm9wZXJ0aWVzKElkOiBzdHJpbmcpOiBQcm9taXNlPEZvcm1FbnRpdHlbXSB8IHVuZGVmaW5lZD4ge1xuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXG4gICAgICB7XG4gICAgICAgIFByb3BlcnR5TmFtZTogYElkYCxcbiAgICAgICAgRW50aXR5VmFsdWU6IElkLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFR5cGU6IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLlN0cmluZyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgYEZvcm0vU2VhcmNoRm9ybUVudGl0aWVzLyR7dGhpcy5za2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgIHBheWxvYWRcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4pLlJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YS5tYXAoeCA9PiB4LlByb3BlcnRpZXMuZm9yRWFjaCgocCxpKT0+cC5pZD1pKSk7XG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICBcbiAgICB9XG4gIH1cblxuXG4gIG9uVXNlclNlbGVjdGVkKGV2ZW50OiBEcm9wZG93bkNoYW5nZUV2ZW50LCBpdGVtOiBGb3JtRW50aXR5KSB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcnMuZmluZCgoeCkgPT4geC5OYW1lID09IGV2ZW50LnZhbHVlKTtcbiAgICBpZiAodXNlcikge1xuICAgICAgaXRlbS5OYW1lID0gdXNlci5OYW1lO1xuICAgICAgaXRlbS5EZXNjcmlwdGlvbiA9IHVzZXIuRGVzY3JpcHRpb247XG4gICAgICBpdGVtLlByb3BlcnRpZXMgPSB1c2VyLlByb3BlcnRpZXM7XG4gICAgICBpdGVtLklzVmFsaWRhdGVkID0gdXNlci5Jc1ZhbGlkYXRlZDtcbiAgICB9XG4gIH1cbiAgb25DbGVhcihldmVudDogRXZlbnQsIGl0ZW06IEZvcm1FbnRpdHkpIHtcbiAgICBpdGVtLk5hbWUgPSAnJztcbiAgICBpdGVtLkRlc2NyaXB0aW9uID0gJyc7XG4gICAgaXRlbS5Qcm9wZXJ0aWVzID0gW107XG4gICAgaXRlbS5Jc1ZhbGlkYXRlZCA9IGZhbHNlO1xuICB9XG4gIGFzeW5jIGdldEZvcm1zKCk6IFByb21pc2U8Rm9ybUVudGl0eVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgYEZvcm0vR2V0Rm9ybUVudGl0aWVzV2l0aFBhcmFtcy9Hcm91cC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PikuUmVzdWx0O1xuICAgICAgdGhpcy5kYXRhID0gcmVzdWx0O1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgICB0aGlzLnByb3BlcnRpZXM9cmVzdWx0WzBdLlByb3BlcnRpZXNcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIGdldEl0ZW1MYWJlbChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnVzZXJzLmZpbmQoKHVzZXIpID0+IHVzZXIuTmFtZSA9PT0gbmFtZSk7XG4gICAgY29uc3Qgb3RoZXJDaGVjayA9IHRoaXMuZGF0YS5maW5kKChkYXRhKSA9PiBkYXRhLk5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5OYW1lIDogb3RoZXJDaGVjayA/IG90aGVyQ2hlY2suTmFtZSA6ICcnO1xuICB9XG5cbiAgZ2V0QXN5bmNMYWJlbCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhLmZpbmQoKHgpID0+IHguTmFtZSA9PSB2YWx1ZSk7XG5cbiAgICByZXR1cm4gZGF0YSA/IGRhdGEuTmFtZSA6ICcnO1xuICB9XG5cbiAgYXN5bmMgbG9hZE1vcmUoKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2VTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPVxuICAgICAgdGhpcy5jdXJyZW50RmlsdGVycy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmN1cnJlbnRTb3J0cy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gYXdhaXQgdGhpcy5sb2FkTW9yZUZpbHRlcnNBbmRTb3J0cygpXG4gICAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICAgICAgYFRhc2tVc2VyL0dldFRhc2tVc2Vycy8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG4gICAgICBcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoXG4gICAgICAgIHJlc3VsdC5tYXAoKHgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ueCxcbiAgICAgICAgICAgIGlkOiB4Lk5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGFFeHRyYShyZXN1bHQpO1xuICAgIH1cbiAgfVxuICBjYXJkQ2xpY2tlZChpdGVtOiBDYXJkRGF0YSwgdG9nZ2xlVmlldzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IHRoaXMuY2FyZERhdGFWaWV3Lm9uSXRlbUNsaWNrKGl0ZW0pO1xuICAgIGlmICh0b2dnbGVWaWV3KSB7XG4gICAgICB0aGlzLmRhdGFWaWV3LnRvZ2dsZVZpZXcoKTtcbiAgICB9XG4gIH1cbiAgdG9nZ2xlQ2hpbGRyZW4oaXRlbTogQ2FyZERhdGEpIHtcbiAgICB2YXIgY3VyclRvZ2dsZVN0YXRlID0gaXRlbS5pc0NoaWxkcmVuRXhwYW5kZWQ7XG4gICAgdGhpcy5jYXJkRGF0YS5mb3JFYWNoKChfKSA9PiB7XG4gICAgICBfLmlzQ2hpbGRyZW5FeHBhbmRlZCA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkID0gIWN1cnJUb2dnbGVTdGF0ZTtcbiAgICBpZiAoaXRlbS5pc0NoaWxkcmVuRXhwYW5kZWQpIHtcbiAgICAgIHRoaXMuY3VycmVudEV4cGFuZGVkQ2FyZCA9IGl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudEV4cGFuZGVkQ2FyZCA9IG51bGw7XG4gICAgfVxuICB9XG4gIHNldFVwQ2FyZERhdGEoKSB7XG4gIFxuICAgIGNvbnN0IGNhcmREYXRhOiBDYXJkRGF0YVtdID0gdGhpcy5kYXRhWzBdPy5Qcm9wZXJ0aWVzPy5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLngsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IHguTmFtZSxcbiAgICAgICAgZGF0YTogeCxcbiAgICAgICAgYm9keTogW10sXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG4gIFxuICAgIHRoaXMuY2FyZERhdGEgPSBjYXJkRGF0YTsgLy8gQXNzaWduIHRoZSB0cmFuc2Zvcm1lZCBhcnJheSB0byBgY2FyZERhdGFgXG4gIH1cbiAgXG4gIG9wZW5Ecm9wZG93bihpdGVtOiBGb3JtUHJvcGVydHkpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5Ecm9wZG93bklkID0gdGhpcy5vcGVuRHJvcGRvd25JZCA9PT0gaXRlbS5pZCA/IG51bGwgOiBpdGVtLmlkO1xuICB9XG4gIFxuICBjbG9zZVBvcFVwKHJvdzogRm9ybVByb3BlcnR5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlbkRyb3Bkb3duSWQgPT09IHJvdy5pZCkge1xuICAgICAgdGhpcy5vcGVuRHJvcGRvd25JZCA9IG51bGw7IC8vIFByb3Blcmx5IHJlc2V0IHdoZW4gY2xvc2luZ1xuICAgIH1cbiAgICB0aGlzLm9uQ2xvc2UoKTsgLy8gQ2FsbCBhbnkgYWRkaXRpb25hbCBsb2dpYyBmb3IgY2xvc3VyZVxuICB9XG4gIHNldFVwQ2FyZERhdGFFeHRyYShiYXNlRGF0YTogRm9ybUVudGl0eVtdKSB7XG4gICAgY29uc3QgY2FyZERhdGE6IENhcmREYXRhW10gPSBiYXNlRGF0YS5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IHguTmFtZSxcbiAgICAgICAgZGF0YTogeCxcbiAgICAgICAgYm9keTogW10sXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5jYXJkRGF0YSA9IHRoaXMuY2FyZERhdGEuY29uY2F0KGNhcmREYXRhKTtcbiAgfVxuXG4gIGdvVG9DYXJkVmlldyhkYXRhOiBGb3JtUHJvcGVydHkpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5jYXJkRGF0YS5maW5kKCh4KSA9PiB4LmRhdGEgPT0gZGF0YSk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHRoaXMudXNlckNhcmRDbGlja2VkKGl0ZW0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdvVG9UYWJsZVZpZXcoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0YVZpZXcudG9nZ2xlVmlldygpO1xuICAgIGNvbnN0IGlkID0gdGhpcy5jdXJyZW50RGF0YS5kYXRhID8gdGhpcy5jdXJyZW50RGF0YS5kYXRhLklkIDogJyc7XG4gICAgaWYgKGlkLnRyaW0oKS5sZW5ndGggPiAwICYmICF0aGlzLnRhYmxlVmlldy5pc1Jvd0VkaXRpbmcoaWQpKSB7XG4gICAgICB0aGlzLnRhYmxlVmlldy50b2dnbGVSb3dFZGl0KGlkKTtcbiAgICB9XG4gIH1cblxuICB2aWV3UHJvY2Vzc2VzKGNvZGU6IHN0cmluZykge1xuICAgIGlmIChjb2RlLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9uVmlld1Byb2Nlc3NDbGlja2VkLmVtaXQoY29kZSk7XG4gIH1cblxuICB1c2VyQ2FyZENsaWNrZWQoaXRlbTogQ2FyZERhdGEsIHRvZ2dsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY2FyZERhdGEuZm9yRWFjaCgoY2FyZCkgPT4gKGNhcmQuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuY3VycmVudERhdGEgPSB0aGlzLmNhcmREYXRhVmlldy5vbkl0ZW1DbGljayhpdGVtKTtcbiAgICBpZiAodG9nZ2xlVmlldykge1xuICAgICAgdGhpcy5kYXRhVmlldy50b2dnbGVWaWV3KCk7XG4gICAgfVxuICB9XG4gIFxuXG4gIGFzeW5jIHNhdmVGb3JtUHJvcGVydHkoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybVByb3BlcnR5OiBGb3JtRW50aXR5W10gPSB0aGlzLmRhdGE7XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBUEkgY2FsbCB0byBzYXZlIHVzZXJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBGb3JtL1NhdmVGb3JtRW50aXRpZXNgLFxuICAgICAgICBmb3JtUHJvcGVydHksXG4gICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgICApO1xuXG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG5cbiAgICAgIGlmICghKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpKSB7XG4gICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ0Zvcm0gcHJvcGVydHkgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzIGFzIEZvcm1FbnRpdHlbXTtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IHJlc3VsdFswXTtcblxuICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuZGF0YS5maW5kSW5kZXgoXG4gICAgICAgICAgICAoeCkgPT4geCA9PT0gdGhpcy5jdXJyZW50RGF0YT8uZGF0YVxuICAgICAgICAgICk7XG5cbiAgICAgICAgIFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICAgIC8vIE9wdGlvbmFsOiBIYW5kbGUgZXJyb3JzIGlmIG5lZWRlZFxuICAgIH1cbiAgfVxuICBzdHJpbmdpZnkodmFsOmFueSl7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgfVxuICBhc3luYyBzYXZlVXNlcigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50RGF0YSkge1xuICAgICAgdmFyIHByb3BlcnR5OiBGb3JtUHJvcGVydHkgPSB0aGlzLmN1cnJlbnREYXRhLmRhdGEgYXMgRm9ybVByb3BlcnR5O1xuICAgICAgcHJvcGVydHkuTWF4VmFsdWUgPSBOdW1iZXIocHJvcGVydHkuTWF4VmFsdWUpO1xuICAgICAgcHJvcGVydHkuTWluVmFsdWUgPSBOdW1iZXIocHJvcGVydHkuTWluVmFsdWUpO1xuICBcbiAgICAgIGlmICh0aGlzLmN1cnJlbnREYXRhLmRhdGEuTmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ05hbWUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgXG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgXG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMuZGF0YS5tYXAoKGZvcm0pID0+IHtcbiAgXG4gICAgICAgIGNvbnN0IHByb3BlcnR5SW5kZXggPSBmb3JtLlByb3BlcnRpZXMuZmluZEluZGV4KFxuICAgICAgICAgIChwKSA9PiBwLmlkID09PSBwcm9wZXJ0eS5pZFxuICAgICAgICApO1xuICBcbiAgICAgICAgaWYgKHByb3BlcnR5SW5kZXggPiAtMSkge1xuICAgICAgICAgIGZvcm0uUHJvcGVydGllc1twcm9wZXJ0eUluZGV4XSA9IHByb3BlcnR5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm0uUHJvcGVydGllcyA9IFsuLi5mb3JtLlByb3BlcnRpZXMsIHByb3BlcnR5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm0uRGF0YVN0YXRlID1cbiAgICAgICAgICBmb3JtLkRhdGFTdGF0ZSA9PT0gT2JqZWN0U3RhdGUuTmV3XG4gICAgICAgICAgICA/IE9iamVjdFN0YXRlLk5ld1xuICAgICAgICAgICAgOiBPYmplY3RTdGF0ZS5DaGFuZ2VkO1xuICBcbiAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgICB9KTtcbiAgXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICBgRm9ybS9TYXZlRm9ybUVudGl0aWVzYCxcbiAgICAgICAgdXBkYXRlZERhdGEsXG4gICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgICApO1xuICBcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgXG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuXG4gICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ0Zvcm0gcHJvcGVydHkgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBGb3JtRW50aXR5W107XG4gIFxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgdXNlclJlc3VsdCA9IHJlc3VsdFswXTtcbiAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmRhdGEuZmluZEluZGV4KFxuICAgICAgICAgICAgKHgpID0+IHggPT09IHRoaXMuY3VycmVudERhdGE/LmRhdGFcbiAgICAgICAgICApO1xuICBcbiAgICAgICAgICBpZiAoaXRlbUluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlByb3BlcnRpZXMgPSB1c2VyUmVzdWx0LlByb3BlcnRpZXM7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBbLi4udGhpcy5kYXRhXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYXN5bmMgc2F2ZVZpYVRhYmxlKHJvdzogRm9ybVByb3BlcnR5LCBjYWxsQmFjazogKCkgPT4gYW55KSB7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcblxuICAgIGNvbnN0IHByb3BlcnR5OiBGb3JtUHJvcGVydHkgPSB7XG4gICAgICAuLi5yb3csXG4gICAgICBNYXhWYWx1ZTogTnVtYmVyKHJvdy5NYXhWYWx1ZSksXG4gICAgICBNaW5WYWx1ZTogTnVtYmVyKHJvdy5NaW5WYWx1ZSlcbiAgICB9O1xuICBcbiAgICBpZiAocHJvcGVydHkuTmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdOYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gIFxuICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gdGhpcy5kYXRhLm1hcCgoZm9ybSkgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydHlJbmRleCA9IGZvcm0uUHJvcGVydGllcy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IHByb3BlcnR5LmlkKTtcbiAgXG4gICAgICBpZiAocHJvcGVydHlJbmRleCA+IC0xKSB7XG4gICAgICAgIGZvcm0uUHJvcGVydGllc1twcm9wZXJ0eUluZGV4XSA9IHByb3BlcnR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybS5Qcm9wZXJ0aWVzID0gWy4uLmZvcm0uUHJvcGVydGllcywgcHJvcGVydHldO1xuICAgICAgfVxuICBcbiAgICAgIGZvcm0uRGF0YVN0YXRlID0gZm9ybS5EYXRhU3RhdGUgPT09IE9iamVjdFN0YXRlLk5ldyA/IE9iamVjdFN0YXRlLk5ldyA6IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9KTtcbiAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBGb3JtL1NhdmVGb3JtRW50aXRpZXNgLFxuICAgICAgICB1cGRhdGVkRGF0YSxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgICk7XG4gIFxuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICBcbiAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICBcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ0Zvcm0gcHJvcGVydHkgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIFxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzIGFzIEZvcm1FbnRpdHlbXTtcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB1c2VyUmVzdWx0ID0gcmVzdWx0WzBdO1xuICBcbiAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5kYXRhLmZpbmRJbmRleCgoeCkgPT5cbiAgICAgICAgICB4LlByb3BlcnRpZXMuc29tZSgocCkgPT4gcC5pZCA9PT0gcm93LmlkKVxuICAgICAgICApO1xuICBcbiAgICAgICAgaWYgKGl0ZW1JbmRleCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUHJvcGVydGllcyA9IHVzZXJSZXN1bHQuUHJvcGVydGllcztcbiAgICAgICAgICB0aGlzLmRhdGEubWFwKHggPT4geC5Qcm9wZXJ0aWVzLmZvckVhY2goKHAsaSk9PnAuaWQ9aSkpO1xuICAgICAgICAgIHRoaXMuZGF0YSA9IFsuLi50aGlzLmRhdGFdOyBcbiAgICAgICAgfVxuICAgICAgfVxuICBcbiAgICAgIHRoaXMuY2xvc2VQb3BVcChyb3cpO1xuICAgICAgY2FsbEJhY2soKTtcbiAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKCdGYWlsZWQgdG8gc2F2ZSB0aGUgZm9ybSBwcm9wZXJ0eScpO1xuICAgIH1cbiAgfVxuICBcbiAgXG5cbiAgXG4gIHRvZ2dsZUlzVmFsaWRhdGUodmFsdWU6IGJvb2xlYW4sIHJvdzogRm9ybVByb3BlcnR5KTogdm9pZCB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSAhdmFsdWU7XG4gICAgcm93LklzUmVxdWlyZWQgPSBuZXdWYWx1ZTtcbiAgICBjb25zb2xlLmxvZyhyb3cpO1xuICB9XG5cbiAgdXBkYXRlVGFibGUoKSB7XG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLm1hcCgoeCkgPT4geCk7XG4gICAgY29uc29sZS5sb2codGhpcy5kYXRhKTtcbiAgfVxuICBcbiAgY29udmVydFRvSW50KHZhbHVlOiBhbnksIGRhdGE6IGFueSxwcm9wOiBzdHJpbmcpIHtcbiAgICBkYXRhW3Byb3BdID0gcGFyc2VJbnQodmFsdWUpO1xuICB9XG4gIGdldFN0cmluZ1ZhbHVlKGRhdGE6IGFueSxwcm9wOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXRhW3Byb3BdLnRvU3RyaW5nKCk7XG4gIH1cbiBcbiAgXG4gIGNoZWNrTWluTWF4KHZhbHVlOnN0cmluZyl7XG4gICAgdmFyIHNob3dNaW5tYXg9ZmFsc2VcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgICAgc2hvd01pbm1heD10cnVlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnSW50JzpcbiAgICAgICAgICAgICAgc2hvd01pbm1heD10cnVlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnRGVjaW1hbCc6XG4gICAgICAgICAgICBzaG93TWlubWF4PXRydWVcbiAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0Zsb2F0JzpcbiAgICAgICAgICAgICAgc2hvd01pbm1heD10cnVlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5oaWRlTWluTWF4PXNob3dNaW5tYXhcbiAgfVxuICBcblxuICBuYXZpZ2F0ZVRvRmllbGRzKCkge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5xdWVyeVBhcmFtcztcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dGhpcy5wYXRofWBdLCB7IHF1ZXJ5UGFyYW1zIH0pO1xuICB9XG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG5cblxuICBcbiAgZ29CYWNrKCkge1xuICAgIHRoaXMuX2xvY2F0aW9uLmJhY2soKTtcbiAgfVxuICBpc0Ryb3Bkb3duT3BlbihpdGVtOiBhbnkpOiBib29sZWFuIHtcblxuXG4gICAgICByZXR1cm4gdGhpcy5vcGVuRHJvcGRvd25JZCA9PT0gaXRlbS5pZDtcbiAgICAgXG4gIFxuICB9XG5cbiAgb25WaWV3Q2hhbmdlKGlzR3JpZFZpZXc6IGJvb2xlYW4pOiB2b2lkIHt9XG5cbiAgb25TdGF0ZUNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdjcmVhdGUnOlxuICAgICAgICB2YXIgbmV3VXNlcjogRm9ybVByb3BlcnR5ID0ge1xuICAgICAgICAgIE1heFZhbHVlOiAxMDAsXG4gICAgICAgICAgTmFtZTogJycsXG4gICAgICAgICAgVmFsdWU6ICcnLFxuICAgICAgICAgIE1pblZhbHVlOiAxMDAsXG4gICAgICAgICAgSXNSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgRGF0YVR5cGU6IERhdGFUeXBlLlN0cmluZyxcbiAgICAgICAgICBEZWZhdWx0VmFsdWU6ICcnLFxuICAgICAgICAgIGlkOicnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNhcmREYXRhOiBDYXJkRGF0YSA9IHtcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgdGl0bGU6IG5ld1VzZXIuTmFtZSxcbiAgICAgICAgICBkYXRhOiBuZXdVc2VyLFxuICAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNhcmREYXRhLnB1c2goY2FyZERhdGEpO1xuICAgICAgICB0aGlzLnVzZXJDYXJkQ2xpY2tlZChjYXJkRGF0YSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuaXNUYWJsZVZpZXcgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgICAgdGhpcy5zaG93RmlsdGVyID0gZXZlbnQudmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmVzZXQoKXtcbiAgICB0aGlzLnNraXA9MFxuICAgIHRoaXMucGFnZVNpemU9MTBcbiAgfVxuICBhc3luYyBvblNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gZXZlbnQudmFsdWU7XG4gICAgIHRoaXMucmVzZXQoKVxuICAgIGlmICghdGhpcy5zZWFyY2hUZXJtKSB7XG4gICAgICAgdGhpcy5nZXRQcm9wZXJ0aWVzKHRoaXMuSWQpXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICBgRm9ybS9HZXRGb3JtRW50aXRpZXNXaXRoUGFyYW0vJHt0aGlzLnNlYXJjaFRlcm19LyR7dGhpcy5za2lwfS8ke3RoaXMucGFnZVNpemV9L0NyZWF0ZWRBdC9hc2NgXG4gICAgICApO1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgc2VhcmNoOicsIHJlcyk7XG4gICAgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4pLlJlc3VsdDtcbiAgICAgICAgdGhpcy5kYXRhPXJlc3VsdFxuICAgICAgICBcbiAgICAgICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgICAgIFxuICAgICAgXG4gIFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTZWFyY2ggZXJyb3I6JywgZXJyb3IpO1xuICAgXG4gICAgfSBmaW5hbGx5IHtcblxuICAgIH1cbiAgfVxuICBzaG93VGFibGVWaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGVkUm93czogRm9ybVByb3BlcnR5W10pIHt9XG4gIHJldHJ5TWVzc2FnZSgpIHt9XG5cbiAgb25Db2x1bW5zVXBkYXRlZCh1cGRhdGVkQ29sdW1uczogSURhdGFGaWx0ZXJbXSkge1xuICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5EZWY6IENvbHVtbkRlZmluaXRpb248Rm9ybVByb3BlcnR5PltdID0gW107XG4gICAgdXBkYXRlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZ0NvbCA9IHRoaXMudGFza1VzZXJzU3ZjLmZvcm1GaWVsZENvbHVtbnMuZmluZChcbiAgICAgICAgKGNvbHVtbikgPT4gY29sdW1uLmhlYWRlciA9PT0gY29sLm5hbWUgfHwgY29sdW1uLmlkID09PSBjb2wubmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaGluZ0NvbCkge1xuICAgICAgICB1cGRhdGVkQ29sdW1uRGVmLnB1c2gobWF0Y2hpbmdDb2wpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy52aXNpYmxlQ29sdW1uRGVmID0gWy4uLnVwZGF0ZWRDb2x1bW5EZWZdO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmlsdGVyc0FuZFNvcnRzKGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzU2VhcmNoKSB7XG4gICAgICB0aGlzLmRhdGFWaWV3Lm9uQ2xlYXJTZWFyY2goKTtcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSAnJztcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIHZpZXc6IHdpbmRvdyxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjbGlja0V2ZW50KTtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGFza1VzZXJQcm9wZXJ0eU1hcFt4Lm5hbWUgYXMga2V5b2YgdHlwZW9mIFRhc2tVc2VyUHJvcGVydHlNYXBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUYXNrVXNlclByb3BlcnR5TmFtZS5EYXRlXG4gICAgICAgICAgICA/IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLkRhdGVcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICAvLyBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgUHJvcGVydHlOYW1lOiAnQVBJS2V5JyxcbiAgICAvLyAgIEVudGl0eVZhbHVlOiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgLy8gICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vIH0pO1xuICAgIGNvbnN0IHNvcnRQYXJhbTogeyBQYXJhbTogc3RyaW5nOyBPcmRlcjogc3RyaW5nIH0gfCBudWxsID1cbiAgICAgIHRoaXMuY3VycmVudFNvcnRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBQYXJhbTpcbiAgICAgICAgICAgICAgVGFza1VzZXJQcm9wZXJ0eU1hcFtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTb3J0c1swXS5uYW1lIGFzIGtleW9mIHR5cGVvZiBUYXNrVXNlclByb3BlcnR5TWFwXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBPcmRlcjogdGhpcy5jdXJyZW50U29ydHNbMF0udmFsdWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgICAgYFRhc2tVc2VyL0dldFRhc2tVc2VyV2l0aFBhcmFtLyR7dGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCl9LzAvJHtcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemVcbiAgICAgICAgICB9YCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgICApXG4gICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgc29ydFBhcmFtXG4gICAgICAgICAgICA/IGBUYXNrVXNlci9TZWFyY2hUYXNrVXNlcnMvMC8ke3RoaXMucGFnZVNpemV9LyR7c29ydFBhcmFtLlBhcmFtfS8ke3NvcnRQYXJhbS5PcmRlcn1gXG4gICAgICAgICAgICA6IGBUYXNrVXNlci9TZWFyY2hUYXNrVXNlcnMvMC8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgICAgICk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzID0gW107XG4gICAgICB0aGlzLmN1cnJlbnRTb3J0cyA9IFtdO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PikuUmVzdWx0O1xuICAgICAgdGhpcy5kYXRhID0gcmVzdWx0Lm1hcCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLngsXG4gICAgICAgICAgaWQ6IHguSWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0VXBDYXJkRGF0YSgpO1xuICAgIH1cbiAgfVxuICBhc3luYyBsb2FkTW9yZUZpbHRlcnNBbmRTb3J0cygpOiBQcm9taXNlPFxuICAgIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+IHwgdW5kZWZpbmVkXG4gID4ge1xuICAgIGlmICghdGhpcy5wYWdlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGFza1VzZXJQcm9wZXJ0eU1hcFt4Lm5hbWUgYXMga2V5b2YgdHlwZW9mIFRhc2tVc2VyUHJvcGVydHlNYXBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUYXNrVXNlclByb3BlcnR5TmFtZS5EYXRlXG4gICAgICAgICAgICA/IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLkRhdGVcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBzb3J0UGFyYW06IHsgUGFyYW06IHN0cmluZzsgT3JkZXI6IHN0cmluZyB9IHwgbnVsbCA9XG4gICAgICB0aGlzLmN1cnJlbnRTb3J0cy5sZW5ndGggPiAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgUGFyYW06XG4gICAgICAgICAgICAgIFRhc2tVc2VyUHJvcGVydHlNYXBbXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U29ydHNbMF0ubmFtZSBhcyBrZXlvZiB0eXBlb2YgVGFza1VzZXJQcm9wZXJ0eU1hcFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgT3JkZXI6IHRoaXMuY3VycmVudFNvcnRzWzBdLnZhbHVlLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHNlYXJjaFRlcm1FeGlzdHMgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IHNlYXJjaFRlcm1FeGlzdHNcbiAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICAgIGBUYXNrVXNlci9HZXRUYXNrVXNlcldpdGhQYXJhbS8ke3RoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpfS8ke1xuICAgICAgICAgICAgdGhpcy5wYWdlU3RhdGUuU2tpcFxuICAgICAgICAgIH0vJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgICAgKVxuICAgICAgOiBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgIHNvcnRQYXJhbVxuICAgICAgICAgICAgPyBgVGFza1VzZXIvU2VhcmNoVGFza1VzZXJzLyR7dGhpcy5wYWdlU3RhdGUuU2tpcH0vJHt0aGlzLnBhZ2VTaXplfS8ke3NvcnRQYXJhbS5QYXJhbX0vJHtzb3J0UGFyYW0uT3JkZXJ9YFxuICAgICAgICAgICAgOiBgVGFza1VzZXIvU2VhcmNoVGFza1VzZXJzLyR7dGhpcy5wYWdlU3RhdGUuU2tpcH0vJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gb25GaWx0ZXJBcHBsaWVkKGFwcGxpZWRGaWx0ZXI6IElEYXRhRmlsdGVyW10pIHtcbiAgIFxuICAgIGlmIChBcnJheS5pc0FycmF5KGFwcGxpZWRGaWx0ZXIpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVyVGFibGVDb3VudCA9IGFwcGxpZWRGaWx0ZXIubGVuZ3RoO1xuXG4gICAgICB0aGlzLnNob3dGaWx0ZXIgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gYXBwbGllZEZpbHRlclxuICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jaGVja2VkKVxuICAgICAgICAubWFwKChmaWx0ZXIpID0+ICh7XG4gICAgICAgICAgUHJvcGVydHlOYW1lOiBmaWx0ZXIubmFtZSxcbiAgICAgICAgICBFbnRpdHlWYWx1ZTogZmlsdGVyLnZhbHVlLFxuICAgICAgICAgIFR5cGU6IGZpbHRlci50eXBlLFxuICAgICAgICAgIE9wZXJhdG9yOiAnQW5kJyxcbiAgICAgICAgICBTaWduOiB0aGlzLmdldENvbmRpdGlvbihmaWx0ZXIuY29uZGl0aW9uKSxcbiAgICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnBvc3RTZWFyY2gocXVlcnlQYXJhbXMpO1xuICAgIH1cbiAgfVxuICBnZXRDb25kaXRpb24odmFsdWU6IGFueSl7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBDb25kaXRpb25hbE9wdGlvbnMuT246XG4gICAgICAgIHJldHVybiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVE7XG4gICAgICBjYXNlIENvbmRpdGlvbmFsT3B0aW9ucy5BZnRlcjpcbiAgICAgICAgcmV0dXJuIFNlYXJjaFByb3BlcnR5U2lnbi5FUTtcbiAgICAgIGNhc2UgQ29uZGl0aW9uYWxPcHRpb25zLkJlZm9yZTpcbiAgICAgICAgcmV0dXJuIFNlYXJjaFByb3BlcnR5U2lnbi5MVDtcbiAgICAgIGNhc2UgQ29uZGl0aW9uYWxPcHRpb25zLk5vdEVxdWFsOlxuICAgICAgICByZXR1cm4gU2VhcmNoUHJvcGVydHlTaWduLk5FUTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZSBcbiAgICB9XG4gIH1cbiAgb25Tb3J0VXBkYXRlZCh1cGRhdGVkU29ydHM6IElEYXRhRmlsdGVyW10pIHtcbiAgICB0aGlzLmN1cnJlbnRTb3J0cyA9IHVwZGF0ZWRTb3J0cztcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcnNBbmRTb3J0cygpO1xuICB9XG5cbiAgaGFuZGxlU2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0kLm5leHQoZXZlbnQudmFsdWUpO1xuICB9XG5cbiAgaGFuZGxlRXhwb3J0KGV4cG9ydGVkRGF0YTogUGFydGlhbDxhbnk+W10pIHtcbiAgICAvLyBjb25zb2xlLmxvZygnRXhwb3J0ZWQgZGF0YTonLCBleHBvcnRlZERhdGEpO1xuICAgIHRoaXMuZG93bmxvYWRDU1YoZXhwb3J0ZWREYXRhKTtcbiAgfVxuICBwcml2YXRlIGRvd25sb2FkQ1NWKGRhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGRhdGFbMF0pO1xuICAgIGNvbnN0IGNzdkNvbnRlbnQgPSBbXG4gICAgICBoZWFkZXJzLmpvaW4oJywnKSxcbiAgICAgIC4uLmRhdGEubWFwKChyb3cpID0+IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHJvd1toZWFkZXJdKS5qb2luKCcsJykpLFxuICAgIF0uam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBpZiAobGluay5kb3dubG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ2V4cG9ydC5jc3YnKTtcbiAgICAgIGxpbmsuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG59XG4iLCI8aGVhZGVyXG4gIGNsYXNzPVwicm91bmRlZC1sZyBzaGFkb3ctbGcgZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIHB4LTYgcHktMiBiZy1bI0Q0QTAwNzczXVwiXG4+XG4gIDxoNCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57e2Zvcm1OYW1lfX08L2g0PlxuICA8dmVyYmVuLXN2Z1xuICAgIChjbGljayk9XCJnb0JhY2soKVwiXG4gICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgW3dpZHRoXT1cIjE3XCJcbiAgICBbaGVpZ2h0XT1cIjE3XCJcbiAgICBbaWNvbl09XCInY2xvc2UnXCJcbiAgPjwvdmVyYmVuLXN2Zz5cbjwvaGVhZGVyPlxuPGRpdiAjbWVzc2FnZUxvZyBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgbWVzc2FnZS1sb2ctY29udGFpbmVyXCI+XG4gIDx2ZXJiZW4tZGF0YS12aWV3XG4gICAgI3ZkdlxuICAgIFt2aWV3U3RhdGVdPVwie1xuICAgICAgICBpc1NlYXJjaDogdHJ1ZSxcbiAgICAgICAgaXNDb2x1bW46IHRydWUsXG4gICAgICAgIGlzRmlsdGVyOiB0cnVlLFxuICAgICAgICBpc1NvcnQ6IHRydWUsXG4gICAgICAgIGlzRXhwb3J0OiB0cnVlLFxuICAgICAgICBpc1NlbGVjdDogdHJ1ZSxcbiAgICAgICAgaXNDcmVhdGU6IHRydWUsXG4gICAgICAgIGlzVG9nZ2xlOnRydWUsXG4gICAgICB9XCJcbiAgICBbYnV0dG9uQ2xhc3NdPVwiJ215LWN1c3RvbS1idXR0b24tY2xhc3MnXCJcbiAgICBbaWNvbkNsYXNzXT1cIidteS1pY29uLWNsYXNzJ1wiXG4gICAgW2FjdGl2ZUljb25DbGFzc109XCInbXktYWN0aXZlLWljb24tY2xhc3MnXCJcbiAgICBbc2VsZWN0ZWRDb2x1bW5Db3VudF09XCIwXCJcbiAgICBbc2VsZWN0ZWRTb3J0Q291bnRdPVwiMFwiXG4gICAgW3NlbGVjdGVkRmlsdGVyVGFibGVDb3VudF09XCIwXCJcbiAgICBbc2hvd0ZpbHRlckNoaWxkXT1cInNob3dGaWx0ZXJcIlxuICAgIFtzZWFyY2hWYWx1ZV09XCJzZWFyY2hUZXJtXCJcbiAgICAodmlld0NoYW5nZSk9XCJvblZpZXdDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHN0YXRlQ2hhbmdlKT1cIm9uU3RhdGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKG9uU2VhcmNoQ2hhbmdlKT1cIm9uU2VhcmNoKCRldmVudClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIm10LTJcIiB0YWJsZS1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLXRhYmxlXG4gICAgICAgICNkdFxuICAgICAgICBbZGF0YV09XCJwcm9wZXJ0aWVzXCJcbiAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbkRlZlwiXG4gICAgICAgIFtzdHlsZUNvbmZpZ109XCJzdHlsZXNcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInNlbGVjdFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxcbiAgICAgICAgICAgIGxldC1pc1NlbGVjdGVkPVwiaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICBsZXQtdG9nZ2xlUm93U2VsZWN0aW9uPVwidG9nZ2xlUm93U2VsZWN0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlUm93U2VsZWN0aW9uKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2hlYWRlclxuICAgICAgICAgICAgbGV0LWFsbFJvd3NTZWxlY3RlZD1cImFsbFJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICBsZXQtc29tZVJvd3NTZWxlY3RlZD1cInNvbWVSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZUFsbFJvd3M9XCJ0b2dnbGVBbGxSb3dzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsUm93c1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzb21lUm93c1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUFsbFJvd3MoKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cIm5hbWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIHt7IHZhbHVlLk5hbWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIGlucHV0Q29udGFpbmVyQ2xhc3M9XCJ3LWZpdFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93Lk5hbWVcIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJtaW5WYWx1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIFt0eXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0U3RyaW5nVmFsdWUocm93LCAnTWluVmFsdWUnKVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJjb252ZXJ0VG9JbnQoJGV2ZW50LCByb3csICdNaW5WYWx1ZScpXCJcbiAgICAgICAgICAgICAgaW5wdXRDb250YWluZXJDbGFzcz1cInctWzEzMHB4XVwiXG4gICAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cIm1heFZhbHVlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXVwZGF0ZVZhbHVlPVwidXBkYXRlVmFsdWVcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgICBpbnB1dENvbnRhaW5lckNsYXNzPVwidy1bMTMwcHhdXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0U3RyaW5nVmFsdWUocm93LCAnTWF4VmFsdWUnKVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJjb252ZXJ0VG9JbnQoJGV2ZW50LCByb3csICdNYXhWYWx1ZScpXCJcbiAgICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiZGVmYXVsdFZhbHVlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXVwZGF0ZVZhbHVlPVwidXBkYXRlVmFsdWVcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgaW5wdXRDb250YWluZXJDbGFzcz1cInctWzEzMHB4XVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LkRlZmF1bHRWYWx1ZVwiXG4gICAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImRhdGFUeXBlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXVwZGF0ZVZhbHVlPVwidXBkYXRlVmFsdWVcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hhbmdlIERhdGEgVHlwZVwiXG4gICAgICAgICAgICAgICAgWyhvcHRpb25zKV09XCJkYXRhVHlwZVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuRGF0YVR5cGVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImlzUmVxdWlyZWRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnICpuZ0lmPVwidmFsdWUgPT09IHRydWVcIiBbaWNvbl09XCInY2hlY2snXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgPHZlcmJlbi1zdmcgKm5nSWY9XCJ2YWx1ZSA9PT0gZmFsc2VcIiBbaWNvbl09XCInZXJyb3InXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXVwZGF0ZVZhbHVlPVwidXBkYXRlVmFsdWVcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZlcmJlbmEtc3dpdGNoXG4gICAgICAgICAgICAgIFtvbkNvbG9yXT1cIicjMUEyMzdFJ1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LklzUmVxdWlyZWRcIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1zd2l0Y2g+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJhY3Rpb25zXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIiBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIiBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgPHZlcmJlbi1wb3AtVXAgIFtjdXN0b21TdHlsZXNdPVwieyd6LWluZGV4JzogJzk5J31cIiBbZHJvcGRvd25PcGVuXT1cIm9wZW5Ecm9wZG93bklkPT09cm93LmlkXCJcbiAgICAgICAgICAgICAgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIiAoY2xvc2UpPVwib25DbG9zZSgpXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgYWN0aW9ucy1pY29uXCIgKGNsaWNrKT1cIm9wZW5Ecm9wZG93bihyb3cpXCIgZHJvcGRvd24tdHJpZ2dlclxuICAgICAgICAgICAgICAgIGljb249XCJsaXN0XCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wLXVwLWNvbnRlbnQgZmxleCBmbGV4LWNvbFwiICAqbmdJZj1cIm9wZW5Ecm9wZG93bklkPT09cm93LmlkXCIgZHJvcGRvd24tY29udGVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJ0b2dnbGVSb3dFZGl0KClcIiBjbGFzcz1cInBvcC11cC12YWx1ZSBjdXJzb3ItcG9pbnRlclwiPkVkaXQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wLXVwLXZhbHVlIGN1cnNvci1wb2ludGVyXCI+RGVsZXRlPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC92ZXJiZW4tcG9wLVVwPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsRWRpdCBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCIgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCIgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8dmVyYmVuLXN2ZyBpY29uPVwiY2hlY2tcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZVZpYVRhYmxlKHJvdywgdG9nZ2xlUm93RWRpdClcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnIGljb249XCJkZWxldGVcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8dmVyYmVuLXN2ZyBpY29uPVwiY2FyZFZpZXdBbHRcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCIgKGNsaWNrKT1cImdvVG9DYXJkVmlldyh2YWx1ZSlcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbGliLWRhdGEtdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjYXJkLWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLWNhcmQtZGF0YS12aWV3XG4gICAgICAgIGJvcmRlclJhZGl1cz1cIjEycHhcIlxuICAgICAgICAjdmRjdlxuICAgICAgICBkYXRhSWQ9XCJJZFwiXG4gICAgICAgIGJvcmRlcj1cIjVweFwiXG4gICAgICAgIFtjYXJkRGF0YUxpc3RdPVwiY2FyZERhdGFcIlxuICAgICAgICByYmdDb2xvcj1cIiNmNWY2ZjlcIlxuICAgICAgICBtZz1cIjBweFwiXG4gICAgICA+XG4gICAgICAgIDx2ZXJiZW4tbGVmdC1jYXJkLWRhdGEtdmlldyBjbGFzcz1cInNwYWNlLXktN1wiPlxuICAgICAgICAgIDx2ZXJiZW4tbGVmdC1jYXJkLWRhdGFcbiAgICAgICAgICAgICN2bGNkXG4gICAgICAgICAgICBbcGFyZW50XT1cInZkY3ZcIlxuICAgICAgICAgICAgZGF0YUlkPVwiaWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJiZy1zZWNvbmRhcnktMTAwIHJvdW5kZWQteGwgYm9yZGVyLXByaW1hcnkgYm9yZGVyLVsxcHhdXCJcbiAgICAgICAgICAgIFtjYXJkRGF0YUxpc3RdPVwiY2FyZERhdGFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2FyZCBsZXQtaXRlbT5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1c2VyQ2FyZENsaWNrZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBjdXJzb3ItcG9pbnRlciBoLVttYXgtY29udGVudF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCIgKGNsaWNrKT1cInRvZ2dsZUNoaWxkcmVuKGl0ZW0pOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoPyd2aXNpYmxlJzonaW52aXNpYmxlJ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbXMtY2VudGVyIGZsZXggIHByLTEgY3Vyc29yLXBvaW50ZXJcIiBbaWNvbl09XCJpdGVtLmlzQ2hpbGRyZW5FeHBhbmRlZD8nbWludXMnOidwbHVzJ1wiIC8+IC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBiZy1zZWNvbmRhcnkgcm91bmRlZC14bFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMyByb3VuZGVkLXhsIHJvdW5kZWQtdHItbm9uZSByb3VuZGVkLWJyLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNlbGVjdGVkID8gJ2JnLXByaW1hcnknIDogJ2JnLXNlY29uZGFyeS0yMDAnXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMyBweC00IGZsZXgtMSBoLVsxMDAlXVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLXN0YXJ0IGZsZXgtMSBnYXAtMSBqdXN0aWZ5LWJldHdlZW4gaC1bMTAwJV1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtMSBjYXJkLW1pbi1oZWlnaHQganVzdGlmeS1iZXR3ZWVuIGgtWzEwMCVdXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gbXItNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJteS0wIGZvbnQtYm9sZCB0ZXh0LVsjNDA0MDQwXSBsZWFkaW5nLVsxOS41cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmRhdGEuTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiF0ZXh0LVsxMHB4XSB0ZXh0LVsjNDA0MDQwXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5EYXRhIFR5cGU6PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiF0ZXh0LVsxM3B4XSBmb250LWJvbGRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRhdGEuRGF0YVR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiF0ZXh0LVsxMHB4XSB0ZXh0LVsjNDA0MDQwXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+RGVmYXVsdCBWYWx1ZTo8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCIhdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGF0YS5EZWZhdWx0VmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWVuZCBoLVsxMDAlXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVudW0tdmFsIHt7aXRlbS5kYXRhLlN0YXR1c319XCI+e3tpdGVtLmRhdGEuU3RhdHVzfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3ZlcmJlbi1sZWZ0LWNhcmQtZGF0YT5cbiAgICAgICAgPC92ZXJiZW4tbGVmdC1jYXJkLWRhdGEtdmlldz5cbiAgICAgICAgPHZlcmJlbi1yaWdodC1jYXJkLWRhdGEtdmlldz5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BhcmVudD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLmN1cnJlbnREYXRhXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJvdW5kZWQteGwgaC1mdWxsIHctZnVsbCByZWxhdGl2ZSBnYXAtNlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cIk5hbWVcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiTmFtZVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlVGFibGUoKVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RGF0YS5kYXRhLk5hbWVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgICAgICAgIDxkaXY+RGF0YSBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNoYW5nZSBEYXRhIFR5cGVcIlxuICAgICAgICAgICAgICAgICAgWyhvcHRpb25zKV09XCJkYXRhVHlwZVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnREYXRhLmRhdGEuRGF0YVR5cGVcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Ecm9wRG93bkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC92ZXJiZW4tZHJvcC1kb3duPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlID09PSAnU3RyaW5nJyB8fCBjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlID09PSAnVVJMJ1wiPlxuICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cIidFbnRlciBkZWZhdWx0IHRleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RGF0YS5kYXRhLkRlZmF1bHRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJEZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkRlZmF1bHQgVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVUYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5SZXF1aXJlZDwvcD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPHZlcmJlbmEtc3dpdGNoXG4gICAgICAgICAgICAgICAgICBbb25Db2xvcl09XCInIzFBMjM3RSdcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RGF0YS5kYXRhLklzUmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgID48L3ZlcmJlbmEtc3dpdGNoPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoaWRlTWluTWF4XCIgY2xhc3M9XCIgZmxleCBmbGV4LWNvbCBnYXAtNlwiPlxuICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICBbdHlwZV09XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJtaW5WYWx1ZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTWluIFZhbHVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlVGFibGUoKVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKGN1cnJlbnREYXRhLmRhdGEsICdNaW5WYWx1ZScpXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb0ludCgkZXZlbnQsIGN1cnJlbnREYXRhLmRhdGEsICdNaW5WYWx1ZScpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgICBuYW1lPVwibWF4VmFsdWVcIlxuICAgICAgICAgICAgICBsYWJlbD1cIk1heCBWYWx1ZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVRhYmxlKClcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRTdHJpbmdWYWx1ZShjdXJyZW50RGF0YS5kYXRhLCAnTWF4VmFsdWUnKVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9JbnQoJGV2ZW50LCBjdXJyZW50RGF0YS5kYXRhLCAnTWF4VmFsdWUnKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIGJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiB3LWZ1bGwgYm90dG9tLTggbGVmdC0wIHJpZ2h0LTBcIj5cbiAgICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLWRlbGV0ZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgdGV4dD1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZlcmJlbi1zd2l0Y2gtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9UYWJsZVZpZXcoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRleHQ9XCJTd2l0Y2ggVG8gVGFibGVcIlxuICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tcHJpbWFyeS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZVVzZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRleHQ9XCJTYXZlXCJcbiAgICAgICAgICAgICAgICAgID48L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdmVyYmVuLXJpZ2h0LWNhcmQtZGF0YS12aWV3PlxuICAgICAgICA8IS0tIDx2ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgICAgICB5ZXNoaGhoaGhcbiAgICAgICAgICA8L3ZlcmJlbi1yaWdodC1jYXJkLWRhdGEtdmlldz4gLS0+XG5cbiAgICAgICAgPHZlcmJlbi1jYXJkLWRhdGEtdmlldy1mb290ZXI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiIXZkY3YuaGFzQ3VycmVudEl0ZW0oKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWVzc2FnZS1sb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtmb250V2VpZ2h0XT1cIidib2xkJ1wiXG4gICAgICAgICAgICAgICAgW2JnQ29sb3JdPVwiJyM4RThEODcnXCJcbiAgICAgICAgICAgICAgICBbYm9yZGVyUmFkaXVzXT1cIic0cHgnXCJcbiAgICAgICAgICAgICAgICBbdGV4dENvbG9yXT1cIicjZmZmJ1wiXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiJ0RlbGV0ZSdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IHt7XG4gICAgICAgICAgICAgICAgdmRjdi5oYXNDdXJyZW50SXRlbSgpID8gJ2ZsZXgtMScgOiAnJ1xuICAgICAgICAgICAgICB9fSBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgZ2FwLTVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2luYXRvci10ZXh0XCJcbiAgICAgICAgICAgICAgICA+e3sgY2FyZERhdGEubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3ZlcmJlbi1jYXJkLWRhdGEtdmlldy1mb290ZXI+XG4gICAgICA8L3ZlcmJlbi1jYXJkLWRhdGEtdmlldz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNvbHVtbi1jb250ZW50PlxuICAgICAgPHZlcmJlbi12aXNpYmxlLWNvbHVtblxuICAgICAgICAoY29sdW1uc1VwZGF0ZWQpPVwib25Db2x1bW5zVXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiXG4gICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgd2lkdGg9XCI0MDBweFwiXG4gICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiXG4gICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5zXCJcbiAgICAgICAgW2Rpc3BsYXllZENvbHVtbnNdPVwiNVwiXG4gICAgICA+PC92ZXJiZW4tdmlzaWJsZS1jb2x1bW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBmaWx0ZXItY29udGVudD5cbiAgICAgIDx2ZXJiZW4tdGFibGUtZmlsdGVyXG4gICAgICAgIChmaWx0ZXJzQXBwbGllZCk9XCJvbkZpbHRlckFwcGxpZWQoJGV2ZW50KVwiXG4gICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgIHdpZHRoPVwiNDIwcHhcIlxuICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICB0ZXJ0aWFyeUNvbG9yPVwiIzQwNDA0MFwiXG4gICAgICAgIFtmaWx0ZXJPcHRpb25zXT1cImZpbHRlckFycmF5XCJcbiAgICAgICAgW21heEZpbHRlckxlbmd0aF09XCIzXCJcbiAgICAgID48L3ZlcmJlbi10YWJsZS1maWx0ZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzb3J0LWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLXNvcnQtdGFibGVcbiAgICAgICAgKHNlbGVjdGVkT3B0aW9ucyk9XCJvblNvcnRVcGRhdGVkKCRldmVudClcIlxuICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICB3aWR0aD1cIjQwMHB4XCJcbiAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgdGVydGlhcnlDb2xvcj1cIiM0MDQwNDBcIlxuICAgICAgICBbZW5hYmxlRHJhZ0FuZERyb3BdPVwidHJ1ZVwiXG4gICAgICAgIFtzb3J0T3B0aW9uc109XCJzb3J0T3B0aW9uc1wiXG4gICAgICA+PC92ZXJiZW4tc29ydC10YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGV4cG9ydC1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLWV4cG9ydCBbZGF0YV09XCJkYXRhWzBdLlByb3BlcnRpZXNcIiAoZXhwb3J0RGF0YUV2ZW50KT1cImhhbmRsZUV4cG9ydCgkZXZlbnQpXCI+XG4gICAgICA8L2xpYi1kYXRhLWV4cG9ydD5cbiAgICA8L2Rpdj5cbiAgPC92ZXJiZW4tZGF0YS12aWV3PlxuICA8ZGl2ICpuZ0lmPVwidmR2LmlzVGFibGVWaWV3XCIgY2xhc3M9XCJmbGV4IGdhcC0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWxvZy1idXR0b24tY29udGFpbmVyIGZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgW2ZvbnRXZWlnaHRdPVwiJ2JvbGQnXCJcbiAgICAgICAgW2JnQ29sb3JdPVwiJyM4RThEODcnXCJcbiAgICAgICAgW2JvcmRlclJhZGl1c109XCInNHB4J1wiXG4gICAgICAgIFt0ZXh0Q29sb3JdPVwiJyNmZmYnXCJcbiAgICAgICAgW3RleHRdPVwiJ0RlbGV0ZSdcIlxuICAgICAgPlxuICAgICAgPC92ZXJiZW5hLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgZ2FwLTVcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicGFnaW5hdG9yLXRleHRcIj57eyBjYXJkRGF0YS5sZW5ndGggfX0gcmVjb3JkcyBsb2FkZWQ8L3NwYW4+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZSgpXCIgY2xhc3M9XCJsb2FkLW1vcmUgdmlldy1saW5rc1wiPlxuICAgICAgICBMb2FkIG1vcmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPCEtLSA8ZGl2IGNsYXNzPVwidy1bNDAwcHhdIGJnLXdoaXRlIHAtNCBzaGFkb3ctbGcgYm9yZGVyXCI+XG4gIDxmb3JtLWNvbnRyb2wgIFtkYXRhVHlwZV09XCJkYXRhVHlwZTJcIiBbZm9ybVByb3BlcnRpZXNdPVwiZGF0YVswXS5Qcm9wZXJ0aWVzXCI+PC9mb3JtLWNvbnRyb2w+XG48L2Rpdj4gLS0+XG4iXX0=
|