ng-zenduit 2.0.18 → 2.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/filter/zendu-filter.component.mjs +5 -4
- package/esm2020/lib/ng-zenduit.module.mjs +1 -6
- package/esm2020/lib/pagination-bar/pageItem.mjs +1 -1
- package/esm2020/lib/pagination-bar/zendu-pagination-bar.component.mjs +46 -47
- package/esm2020/lib/sort-header/zendu-sort-header.component.mjs +4 -4
- package/esm2020/public-api.mjs +1 -2
- package/fesm2015/ng-zenduit.mjs +767 -845
- package/fesm2015/ng-zenduit.mjs.map +1 -1
- package/fesm2020/ng-zenduit.mjs +777 -855
- package/fesm2020/ng-zenduit.mjs.map +1 -1
- package/icons/arrow-down.svg +3 -0
- package/lib/ng-zenduit.module.d.ts +28 -29
- package/lib/pagination-bar/pageItem.d.ts +7 -4
- package/lib/pagination-bar/zendu-pagination-bar.component.d.ts +5 -16
- package/package.json +1 -1
- package/public-api.d.ts +0 -1
- package/styles/all.scss +0 -1
- package/esm2020/lib/pagination/zendu-pagination.component.mjs +0 -75
- package/lib/pagination/zendu-pagination.component.d.ts +0 -16
- package/styles/table.scss +0 -107
|
@@ -14,7 +14,8 @@ import * as i7 from "../groups/zendu-groups.component";
|
|
|
14
14
|
import * as i8 from "../radio-button/radio-button.component";
|
|
15
15
|
import * as i9 from "../icon/zendu-icon.component";
|
|
16
16
|
import * as i10 from "../spinner/zendu-spinner.component";
|
|
17
|
-
import * as i11 from "
|
|
17
|
+
import * as i11 from "../button/zen-button.component";
|
|
18
|
+
import * as i12 from "@ngx-translate/core";
|
|
18
19
|
export class ZenduFilterComponent {
|
|
19
20
|
constructor(renderer) {
|
|
20
21
|
this.renderer = renderer;
|
|
@@ -739,10 +740,10 @@ export class ZenduFilterComponent {
|
|
|
739
740
|
}
|
|
740
741
|
}
|
|
741
742
|
ZenduFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduFilterComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
742
|
-
ZenduFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduFilterComponent, selector: "zen-filter", inputs: { config: "config", filter: "filter", position: "position", resetBehavior: "resetBehavior", isVisible: "isVisible", customTrigger: "customTrigger", imageUrl: "imageUrl", label: "label", showOptions: "showOptions", customOptions: "customOptions", wrapperBodyClass: "wrapperBodyClass", customPosition: "customPosition" }, outputs: { filterChange: "filterChange", isVisibleChange: "isVisibleChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:resize": "windowSizeHandling($event)", "window:scroll": "windowScroll($event)", "window:keydown": "onWindowKeyDown($event)" } }, viewQueries: [{ propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true }, { propertyName: "_componentElement", first: true, predicate: ["mainComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <button (click)=\"toggle()\"\n class=\"button-stroked filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .filter{color:#828282;position:relative;border-color:#ececed;padding:0 7px;height:38px}.filters-component .filter zen-icon{background:#828282}.filters-component .filter.applied{color:var(--color-primary, #2188d9);background:#f4f9fd;border:1px solid var(--color-primary, #2188d9)}.filters-component .filter.applied zen-icon{background:var(--color-primary, #2188d9)}.filters-component .filter .dot{background:var(--color-primary, #2188d9);width:4px;height:4px;position:absolute;border-radius:50%;left:42px;top:9px}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "labelColor", "disabled", "disableValueChange", "indeterminate", "imageUrl", "size", "supportingText"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduToggleSlideComponent, selector: "zen-toggle-slide", inputs: ["enabled", "disabled"], outputs: ["enabledChange"] }, { kind: "component", type: i5.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "disabled", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i6.ZenduDatepickerComponent, selector: "zen-datepicker", inputs: ["date", "showTime", "showSeconds", "showDate", "parentContainer", "containerClass", "minDate", "maxDate", "boxDesign", "highlightDays", "autoConfirm", "hint", "highlightError", "disabled", "readonly", "xPosition", "yPosition", "dispalyOverParent"], outputs: ["dateChange"] }, { kind: "component", type: i7.ZenduGroupsComponent, selector: "zen-groups", inputs: ["dataSource", "filteredDataSource", "hideSelectAll", "isSelectedAll", "inline", "width", "placeholder", "hideSearch", "idProp", "displayProp"], outputs: ["isSelectedAllChange", "checkedChange"] }, { kind: "component", type: i8.ZenduRadioButtonComponent, selector: "zen-radio", inputs: ["selected", "label", "value", "name", "disabled", "imageUrl", "size", "supportingText"], outputs: ["radioChange"] }, { kind: "component", type: i9.ZenduIconComponent, selector: "zen-icon", inputs: ["src", "name", "size", "color", "theme", "customColor"] }, { kind: "component", type: i10.ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] });
|
|
743
|
+
ZenduFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduFilterComponent, selector: "zen-filter", inputs: { config: "config", filter: "filter", position: "position", resetBehavior: "resetBehavior", isVisible: "isVisible", customTrigger: "customTrigger", imageUrl: "imageUrl", label: "label", showOptions: "showOptions", customOptions: "customOptions", wrapperBodyClass: "wrapperBodyClass", customPosition: "customPosition" }, outputs: { filterChange: "filterChange", isVisibleChange: "isVisibleChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:resize": "windowSizeHandling($event)", "window:scroll": "windowScroll($event)", "window:keydown": "onWindowKeyDown($event)" } }, viewQueries: [{ propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true }, { propertyName: "_componentElement", first: true, predicate: ["mainComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <zen-button (click)=\"toggle()\"\n [variant]=\"isApplied ? 'secondary' : 'secondary-gray'\"\n size=\"sm\"\n class=\"filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </zen-button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "labelColor", "disabled", "disableValueChange", "indeterminate", "imageUrl", "size", "supportingText"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduToggleSlideComponent, selector: "zen-toggle-slide", inputs: ["enabled", "disabled"], outputs: ["enabledChange"] }, { kind: "component", type: i5.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "disabled", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i6.ZenduDatepickerComponent, selector: "zen-datepicker", inputs: ["date", "showTime", "showSeconds", "showDate", "parentContainer", "containerClass", "minDate", "maxDate", "boxDesign", "highlightDays", "autoConfirm", "hint", "highlightError", "disabled", "readonly", "xPosition", "yPosition", "dispalyOverParent"], outputs: ["dateChange"] }, { kind: "component", type: i7.ZenduGroupsComponent, selector: "zen-groups", inputs: ["dataSource", "filteredDataSource", "hideSelectAll", "isSelectedAll", "inline", "width", "placeholder", "hideSearch", "idProp", "displayProp"], outputs: ["isSelectedAllChange", "checkedChange"] }, { kind: "component", type: i8.ZenduRadioButtonComponent, selector: "zen-radio", inputs: ["selected", "label", "value", "name", "disabled", "imageUrl", "size", "supportingText"], outputs: ["radioChange"] }, { kind: "component", type: i9.ZenduIconComponent, selector: "zen-icon", inputs: ["src", "name", "size", "color", "theme", "customColor"] }, { kind: "component", type: i10.ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "component", type: i11.ZenButtonComponent, selector: "zen-button", inputs: ["variant", "buttonType", "icon", "size", "destructive", "disabled", "fullWidth", "type"] }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] });
|
|
743
744
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduFilterComponent, decorators: [{
|
|
744
745
|
type: Component,
|
|
745
|
-
args: [{ selector: 'zen-filter', template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <button (click)=\"toggle()\"\n class=\"button-stroked filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .filter{color:#828282;position:relative;border-color:#ececed;padding:0 7px;height:38px}.filters-component .filter zen-icon{background:#828282}.filters-component .filter.applied{color:var(--color-primary, #2188d9);background:#f4f9fd;border:1px solid var(--color-primary, #2188d9)}.filters-component .filter.applied zen-icon{background:var(--color-primary, #2188d9)}.filters-component .filter .dot{background:var(--color-primary, #2188d9);width:4px;height:4px;position:absolute;border-radius:50%;left:42px;top:9px}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"] }]
|
|
746
|
+
args: [{ selector: 'zen-filter', template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <zen-button (click)=\"toggle()\"\n [variant]=\"isApplied ? 'secondary' : 'secondary-gray'\"\n size=\"sm\"\n class=\"filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </zen-button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"] }]
|
|
746
747
|
}], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { config: [{
|
|
747
748
|
type: Input
|
|
748
749
|
}], filter: [{
|
|
@@ -790,4 +791,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
790
791
|
type: HostListener,
|
|
791
792
|
args: ['window:keydown', ['$event']]
|
|
792
793
|
}] } });
|
|
793
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFTL0QsTUFBTSxPQUFPLG9CQUFvQjtJQXlEL0IsWUFBbUIsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXhEN0IsV0FBTSxHQUFrQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUl0QyxhQUFRLEdBQUcsT0FBTyxDQUFDO1FBRW5CLGtCQUFhLEdBQXdCLE9BQU8sQ0FBQztRQUU1QyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFM0MsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVqQixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFL0Msa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFZdEIsbUJBQWMsR0FBeUIsT0FBTyxDQUFDO1FBRWpELGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVqQixzQkFBaUIsR0FB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YUFDMUQ7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7a0hBdjJCVSxvQkFBb0I7c0dBQXBCLG9CQUFvQix3M0JDOUJqQyx3bGhCQTJRQTs0RkQ3T2Esb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLFlBQVk7Z0dBS2IsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFFRSxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUUsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBMEJxQyxTQUFTO3NCQUFuRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR3pDLGlCQUFpQjtzQkFEaEIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWdEN0MsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXVCNUMsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVekMsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVekMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGF0YVNvdXJjZSxcbiAgRmlsdGVyc0NvbmZpZyxcbiAgRmlsdGVyc0NvbmZpZ0l0ZW0sXG4gIE11bHRpU2VsZWN0SXRlbSxcbn0gZnJvbSAnLi9maWx0ZXJzQ29uZmlnJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoLnVuaXFieSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC9tb21lbnQnO1xuaW1wb3J0IHsgWmVuZHVTZWFyY2hCb3hDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtYm94L3plbmR1LXNlYXJjaC1ib3guY29tcG9uZW50JztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IERBVEVQSUNLRVJfUE9TSVRJT04gfSBmcm9tICcuLi9kYXRlcGlja2VyL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi9kYXRlUmFuZ2UnO1xuaW1wb3J0IHsgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3plbi1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vemVuZHUtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFplbmR1RmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnOiBGaWx0ZXJzQ29uZmlnID0geyBpdGVtczogW10gfTtcblxuICBASW5wdXQoKSBmaWx0ZXI6IG9iamVjdDtcblxuICBASW5wdXQoKSBwb3NpdGlvbiA9ICdyaWdodCc7XG5cbiAgQElucHV0KCkgcmVzZXRCZWhhdmlvcjogJ3NldF9hbGwnIHwgJ2NsZWFyJyA9ICdjbGVhcic7XG5cbiAgQE91dHB1dCgpIGZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuXG4gIEBJbnB1dCgpIGlzVmlzaWJsZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBpc1Zpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQElucHV0KCkgY3VzdG9tVHJpZ2dlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGltYWdlVXJsOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcblxuICBASW5wdXQoKSBzaG93T3B0aW9uczogYm9vbGVhbjtcblxuICBASW5wdXQoKSBjdXN0b21PcHRpb25zOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgd3JhcHBlckJvZHlDbGFzczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGN1c3RvbVBvc2l0aW9uOiAnZml4ZWQnIHwgJ2Fic29sdXRlJyA9ICdmaXhlZCc7XG5cbiAgcHVibGljIHNlYXJjaFRleHQgPSAnJztcblxuICBwdWJsaWMgaXNBcHBsaWVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsYXN0QXBwbGllZEZpbHRlcjogYW55ID0ge307XG5cbiAgcHJpdmF0ZSByZXNldGVkRmlsdGVyOiBhbnk7XG5cbiAgcHVibGljIG1lbnVMZWZ0ID0gJzBweCc7XG5cbiAgcHVibGljIG1lbnVSaWdodCA9ICcwcHgnO1xuXG4gIHB1YmxpYyBtZW51VG9wID0gJzBweCc7XG5cbiAgcHVibGljIG1lbnVCb3R0b20gPSAnMHB4JztcblxuICBwdWJsaWMgc2hvd05vRmlsdGVyUmVzdWx0OiBib29sZWFuO1xuXG4gIHB1YmxpYyBlcnJvck1lc3NhZ2U6IHN0cmluZ1tdID0gW107XG5cbiAgcHVibGljIGRhdGVwaWNrZXJQb3NpdGlvbiA9IERBVEVQSUNLRVJfUE9TSVRJT047XG5cbiAgcHVibGljIHNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaEJveCcsIHsgc3RhdGljOiBmYWxzZSB9KSBzZWFyY2hCb3g6IFplbmR1U2VhcmNoQm94Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ21haW5Db21wb25lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgX2NvbXBvbmVudEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuY29uZmlnICYmIGNoYW5nZXMuY29uZmlnLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgLy8gaW5pdCB2YWx1ZXNcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgICAgaXRlbS5kYXRhU291cmNlID0gaXRlbS5kYXRhU291cmNlXG4gICAgICAgICAgICA/IHRoaXMuZXh0cmFjdFVuaXF1ZURhdGFTb3VyY2UoaXRlbS5kYXRhU291cmNlKVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnICYmICFpdGVtLmRhdGVSYW5nZSkge1xuICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG5cbiAgICAgICAgICAvLyBpbml0IGRhdGUgcmFuZ2Ugb3B0aW9uc1xuICAgICAgICAgIGlmIChpdGVtLnNob3dEYXRlUmFuZ2VPcHRpb25zICYmICFpdGVtLmRhdGVSYW5nZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbS5kYXRlUmFuZ2VPcHRpb25zID0gdGhpcy5nZXREZWZhdWx0RGF0ZVJhbmdlT3B0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScgJiYgIWl0ZW0ubnVtYmVyUmFuZ2UpIHtcbiAgICAgICAgICBpdGVtLm51bWJlclJhbmdlID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGl0ZW0uc2hvd1RpbWUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIGl0ZW0uc2hvd1RpbWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcblxuICAgICAgdGhpcy5yZXNldGVkRmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcbiAgICAgIHRoaXMuZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcbiAgICAgIHRoaXMubGFzdEFwcGxpZWRGaWx0ZXIgPSBVdGlsLmNsb25lKHRoaXMuZmlsdGVyKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5maWx0ZXIgJiYgY2hhbmdlcy5maWx0ZXIuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyID0gVXRpbC5jbG9uZShjaGFuZ2VzLmZpbHRlci5jdXJyZW50VmFsdWUpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUFwcGxpZWRTdGF0ZSgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmlzVmlzaWJsZSAmJiBjaGFuZ2VzLmlzVmlzaWJsZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlUGxhY2VtZW50KHRoaXMuY3VzdG9tUG9zaXRpb24pO1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaEJveCgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBvdXRzaWRlSGFuZGxpbmcoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAvLyBlbGVtZW50IG5vdCBpbiB0aGUgRE9NXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGhpZGUgdGhlIG1lbnUgZm9yIG91dHNpZGUgY2xpY2tcbiAgICB0aGlzLmhpZGUoKTtcblxuICAgIC8vIHJlc3RvcmUgdmFsdWVzXG4gICAgdGhpcy5yZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgd2luZG93U2l6ZUhhbmRsaW5nKCkge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxuICB3aW5kb3dTY3JvbGwoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUGxhY2VtZW50KHRoaXMuY3VzdG9tUG9zaXRpb24pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxuICBvbldpbmRvd0tleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ1BhZ2VVcCcgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ1BhZ2VEb3duJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnSG9tZScgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0VuZCdcbiAgICApIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSAmJlxuICAgICAgICAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYnV0dG9uLXN0cm9rZWQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgdGhpcy5yZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzU2VhcmNoQm94KCkge1xuICAgIHRoaXMuc2VhcmNoQm94LmRvRm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc01lbnVJc1Zpc2libGUoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpZiAoaXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICBpZiAoaXRlbS5pc0xvYWRpbmdOb3cgfHwgaXRlbS5jYW5Mb2FkTW9yZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICAgIHJldHVybiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZT8ubGVuZ3RoID4gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSAmJiB0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgIGlmICghaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFVuaXF1ZURhdGFTb3VyY2UoXG4gICAgYXJyYXk6IHtcbiAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgfVtdXG4gICk6IE11bHRpU2VsZWN0SXRlbVtdIHtcbiAgICBjb25zdCBpdGVtcyA9IGFycmF5LmZpbHRlcigoZWwpID0+IHtcbiAgICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgICB0eXBlb2YgZWwuaWQgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB0eXBlb2YgZWwuaWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIDogZWwuaWQgJiYgdHlwZW9mIGVsLm5hbWUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB0eXBlb2YgZWwubmFtZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgOiBlbC5uYW1lXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuaXFJdGVtcyA9IHVuaXFCeShpdGVtcywgKGVsKSA9PiBlbC5pZCk7XG4gICAgLy8gYWRkIGluZGV4IHRvIGVhY2ggdW5pcUl0ZW1zXG4gICAgdW5pcUl0ZW1zLmZvckVhY2goXG4gICAgICAoZWw6IE11bHRpU2VsZWN0SXRlbSwgaW5kZXg6IG51bWJlcikgPT4gKGVsLmluZGV4ID0gaW5kZXgpXG4gICAgKTtcbiAgICByZXR1cm4gdW5pcUl0ZW1zO1xuICB9XG5cbiAgcHVibGljIG9uU2VsZWN0QWxsKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG4gICAgaXRlbS5kYXRhU291cmNlLmZvckVhY2goKGQpID0+IChkLmNoZWNrZWQgPSBpdGVtLmlzU2VsZWN0ZWRBbGwpKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0l0ZW1BY3RpdmUoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiBib29sZWFuIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICBjb25zdCBjaGVja2VkSXRlbXMgPSBpdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChlbCkgPT4gZWwuY2hlY2tlZCk7XG4gICAgICBpdGVtLmlzU2VsZWN0ZWRBbGwgPSBjaGVja2VkSXRlbXMubGVuZ3RoID09PSBpdGVtLmRhdGFTb3VyY2UubGVuZ3RoO1xuICAgICAgcmV0dXJuIGNoZWNrZWRJdGVtcy5sZW5ndGggPiAwO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gaXRlbS5yYWRpb09wdGlvbnMuc29tZSgocm8pID0+IHJvLnNlbGVjdGVkKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ251bWJlclJhbmdlJykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oaXRlbS5udW1iZXJSYW5nZS5mcm9tIHx8IGl0ZW0ubnVtYmVyUmFuZ2UudG8pO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZGF0ZVJhbmdlJykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oaXRlbS5kYXRlUmFuZ2Uuc3RhcnQgfHwgaXRlbS5kYXRlUmFuZ2UuZW5kKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihpdGVtLmRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlYXJjaFRleHRDaGFuZ2VkKCkge1xuICAgIC8vIHJ1biB0aGUgbGF6eSBsb2FkaW5nXG4gICAgLy8gdGhlIGZpbHRlckl0ZW1zIGNhbGxlZCBmcm9tIG9uQ2hhbmdlcywgc28gY2FsbCBsYXp5IGxvYWRpbmcgb25seSBvbiBzZWFyY2ggY2hhbmdlXG4gICAgdGhpcy5yZXNldExhenlMb2FkaW5nU291cmNlcyhmYWxzZSk7XG5cbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKHNob3dTZWxlY3RlZE9uVG9wOiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZ0l0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIGlmIChjb25maWdJdGVtLmlzTGF6eUxvYWRpbmcpIHtcbiAgICAgICAgY29uZmlnSXRlbS5jYW5Mb2FkTW9yZSA9IHRydWU7XG4gICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gW107XG4gICAgICAgIHJlcXVlc3RzLnB1c2godGhpcy5sb2FkTW9yZShjb25maWdJdGVtLCBzaG93U2VsZWN0ZWRPblRvcCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHJlcXVlc3RzKTtcblxuICAgIC8vIGZpbHRlciBub24tbGF6eSBsb2FkaW5nIGl0ZW1zXG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtcygpIHtcbiAgICBsZXQgaGFzRGF0YSA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBjb25maWdJdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoY29uZmlnSXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgIGlmIChjb25maWdJdGVtLmlzTGF6eUxvYWRpbmcpIHtcbiAgICAgICAgICBpZiAoY29uZmlnSXRlbS5pc0xvYWRpbmdOb3cpIHtcbiAgICAgICAgICAgIC8vIG1hcmsgYXMgZGF0YSBhdmFpbGFibGUgaW4gbG9hZGluZyBzdGF0ZVxuICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXNUcmVlID0gdGhpcy5oYXNUcmVlRGF0YShjb25maWdJdGVtKTtcbiAgICAgICAgICBpZiAoaXNUcmVlICYmIHRoaXMuc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgLy8gQnVpbGQgYSBsb2NhbCBsb29rdXAgbWFwIGZvciBhbmNlc3RvciB0cmF2ZXJzYWxcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFwID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIERhdGFTb3VyY2U+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGNvbmZpZ0l0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBsb2NhbE1hcC5zZXQoZWwuaWQsIGVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yIHRyZWUgZGF0YSwgaW5jbHVkZSBtYXRjaGluZyBpdGVtcyBhbmQgdGhlaXIgYW5jZXN0b3JzXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ0lkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWROYW1lID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgZWwubmFtZSA9PT0gJ251bWJlcicgPyBlbC5uYW1lLnRvU3RyaW5nKCkgOiBlbC5uYW1lO1xuICAgICAgICAgICAgICBpZiAocHJlcGFyZWROYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdJZHMuYWRkKGVsLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIGFuY2VzdG9yc1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50ID0gZWw7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQucGFyZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgIG1hdGNoaW5nSWRzLmFkZChjdXJyZW50LnBhcmVudElkKTtcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBsb2NhbE1hcC5nZXQoY3VycmVudC5wYXJlbnRJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWwpID0+IG1hdGNoaW5nSWRzLmhhcyhlbC5pZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBBdXRvLWV4cGFuZCBwYXJlbnRzIHdoZW4gc2VhcmNoaW5nXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgIGlmIChlbC5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZWwuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSB0aGlzLnNvcnRUcmVlT3JkZXIoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UsIGxvY2FsTWFwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChlbCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlZE5hbWUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBlbC5uYW1lID09PSAnbnVtYmVyJyA/IGVsLm5hbWUudG9TdHJpbmcoKSA6IGVsLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBwcmVwYXJlZE5hbWVcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1RyZWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgbG9jYWxNYXAgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciwgRGF0YVNvdXJjZT4oKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsb2NhbE1hcC5zZXQoZWwuaWQsIGVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IHRoaXMuc29ydFRyZWVPcmRlcihjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSwgbG9jYWxNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb25maWdJdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgJiZcbiAgICAgICAgICAhQm9vbGVhbihjb25maWdJdGVtLmRhdGVSYW5nZS5zdGFydCB8fCBjb25maWdJdGVtLmRhdGVSYW5nZS5lbmQpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgJiZcbiAgICAgICAgICAhQm9vbGVhbihjb25maWdJdGVtLm51bWJlclJhbmdlLmZyb20gfHwgY29uZmlnSXRlbS5udW1iZXJSYW5nZS50bylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2hvd05vRmlsdGVyUmVzdWx0ID0gdGhpcy5zZWFyY2hUZXh0ICYmICFoYXNEYXRhO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRNb3JlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtLCBzaG93U2VsZWN0ZWRPblRvcDogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBpdGVtLmlzTG9hZGluZ05vdyA9IHRydWU7XG4gICAgICBpZiAoIWl0ZW0ubGF6eUxvYWRlcikge1xuICAgICAgICB0aHJvdyBgbG9hZGVyIGlzIG5vdCBhdmFpbGFibGVgO1xuICAgICAgfVxuICAgICAgaWYgKCFpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2FkIGZpcnN0IDEwIHJlY29yZHMgZm9yIHRoZSB0aGUgZmlyc3QgdGltZVxuICAgICAgY29uc3QgbGltaXQgPSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGggPT0gMCA/IDEwIDogMTAwO1xuICAgICAgY29uc3QgbmV3SXRlbXMgPSBhd2FpdCBpdGVtLmxhenlMb2FkZXIoXG4gICAgICAgIHsgdGV4dDogdGhpcy5zZWFyY2hUZXh0IHx8ICcnIH0sXG4gICAgICAgIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmxlbmd0aCxcbiAgICAgICAgbGltaXRcbiAgICAgICk7XG5cbiAgICAgIGl0ZW0uY2FuTG9hZE1vcmUgPSBuZXdJdGVtcy5sZW5ndGggPT0gbGltaXQ7XG5cbiAgICAgIC8vIHRoZSBmaWx0ZXJlZERhdGFTb3VyY2UgY29udGFpbnMgdGhlIGl0ZW1zIHRoYXQgaXMgdmlzaWxpYmxlIHRvIHVzZXIgYXQgdGhlIGN1cnJlbnQgbW9tZW50XG4gICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmNvbmNhdChuZXdJdGVtcyk7XG5cbiAgICAgIC8vIHRoZSBkYXRhU291cmNlIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBpdGVtc1xuICAgICAgY29uc3QgY2hlY2tlZElkcyA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpXG4gICAgICAgIC5tYXAoKGkpID0+IGkuaWQpO1xuXG4gICAgICBpZiAoc2hvd1NlbGVjdGVkT25Ub3ApIHtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBjaGVja2VkIGl0ZW1zIGZpcnN0XG4gICAgICAgIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UuZmlsdGVyKFxuICAgICAgICAgIChpKSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhpLmlkKVxuICAgICAgICApO1xuICAgICAgICAvLyBhZGQgYWxsIGNoZWNrZWQgaXRlbXMgdG8gdGhlIHRvcFxuICAgICAgICBjb25zdCBjaGVja2VkSXRlbXMgPSBpdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpO1xuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGNoZWNrZWRJdGVtcy5jb25jYXQoaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbWFyayBhcyBjaGVja2VkIGJhc2VkIG9uIHRoZSBkYXRhU291cmNlXG4gICAgICAgIGZvciAobGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICAgIGRzSXRlbS5jaGVja2VkID0gY2hlY2tlZElkcy5pbmNsdWRlcyhkc0l0ZW0uaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGl0ZW0uaXNMb2FkaW5nTm93ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZUl0ZW0oaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpdGVtLmV4cGFuZGVkID0gIWl0ZW0uZXhwYW5kZWQ7XG5cbiAgICBpZiAoaXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCkge1xuICAgICAgICBpZiAoaXRlbS5jYW5Mb2FkTW9yZSAhPT0gZmFsc2UgJiYgIWl0ZW0uZmlsdGVyZWREYXRhU291cmNlPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmxvYWRNb3JlKGl0ZW0sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWx0ZXJzKCkge1xuICAgIGxldCBzZWxlY3RBbGwgPSB0aGlzLnJlc2V0QmVoYXZpb3IgPT09ICdzZXRfYWxsJztcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9ucyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgIGl0ZW0uaXNTZWxlY3RlZEFsbCA9IHNlbGVjdEFsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGRzSXRlbSBvZiBpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICBkc0l0ZW0uY2hlY2tlZCA9IHNlbGVjdEFsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5kYXRlUmFuZ2UpIHtcbiAgICAgICAgaXRlbS5kYXRlUmFuZ2UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0ubnVtYmVyUmFuZ2UpIHtcbiAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHsgZnJvbTogbnVsbCwgdG86IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uZGF0ZSkge1xuICAgICAgICBpdGVtLmRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgaXRlbS5lbmFibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGl0ZW0ucmFkaW9PcHRpb25zLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5pZCA9PT0gaXRlbS5zZWxlY3RlZFJhZGlvKSB7XG4gICAgICAgICAgICBlLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbXVsdGlzZWxlY3QnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFJdGVtIG9mIGl0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBkYXRhSXRlbS5jaGVja2VkID0gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgPyBzZWxlY3Rpb24uaW5jbHVkZXMoZGF0YUl0ZW0uaWQpXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgICAgaXRlbS5kYXRlUmFuZ2UgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XSB8fCB7XG4gICAgICAgICAgICBzdGFydDogbnVsbCxcbiAgICAgICAgICAgIGVuZDogbnVsbCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldIHx8IHt9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIGl0ZW0uZGF0ZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgaXRlbS5zZWxlY3RlZFJhZGlvID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KCkge1xuICAgIHRoaXMucmVzZXRGaWx0ZXJzKCk7XG5cbiAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgdGhpcy5yZXNldGVkRmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcblxuICAgIHRoaXMucmVzZXRMYXp5TG9hZGluZ1NvdXJjZXMoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5KCkge1xuICAgIHRoaXMuZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBjb25zdCBpdGVtRmxhZyA9IHRoaXMub25DaGVja1ZhbGlkaXR5KGl0ZXJhdG9yKTtcbiAgICAgIGlmICghaXRlbUZsYWcpIHtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZXJyb3JNZXNzYWdlID0gW10pLCA1MDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5sYXN0QXBwbGllZEZpbHRlciA9IFV0aWwuY2xvbmUodGhpcy5maWx0ZXIpO1xuXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcik7XG5cbiAgICAvLyB1cGRhdGUgdGhlIGFwcGx5IHN0YXRlXG4gICAgdGhpcy51cGRhdGVBcHBsaWVkU3RhdGUoKTtcblxuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBcHBsaWVkU3RhdGUoKSB7XG4gICAgdGhpcy5pc0FwcGxpZWQgPSBmYWxzZTtcbiAgICAvLyBzaG93aW5nIGNoZWNrZWQgaXRlbXMgb24gdG9wIG9mIHRoZSBsaXN0XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgIC8vIHJlc29ydCBmaXJzdCBiYXNlZCBvbiBpbmRleFxuICAgICAgICBpdGVtLmRhdGFTb3VyY2Uuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuXG4gICAgICAgIC8vIHRoZW4gc29ydCBiYXNlZCBvbiBjaGVja2VkIGl0ZW1zIGFnYWluXG4gICAgICAgIGl0ZW0uZGF0YVNvdXJjZS5zb3J0KFxuICAgICAgICAgIChhOiBEYXRhU291cmNlLCBiOiBEYXRhU291cmNlKSA9PlxuICAgICAgICAgICAgTnVtYmVyKGIuY2hlY2tlZCB8fCAwKSAtIE51bWJlcihhLmNoZWNrZWQgfHwgMClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLnJlc2V0ZWRGaWx0ZXIpIHtcbiAgICAgICAgLy8gRmlsdGVyIHdhcyByZXNldCwgc28gY29tcGFyZSB0aGUgcmVzZXQgZmlsdGVyIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IGZpbHRlclxuICAgICAgICAvLyBXaGVuIHVzZXIgY2xpY2sgb24gUmVzZXQgYW5kIFRoZW4gQXBwbHksIGZpbHRlciBtdXN0IHVuaGlnaGxpZ2h0ZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucmVzZXRlZEZpbHRlcikgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmlzQXBwbGllZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNBcHBsaWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlckNsYXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGlvbi1tZW51LWJvZHknKTtcbiAgICBpZiAodGhpcy53cmFwcGVyQm9keUNsYXNzKSB7XG4gICAgICB3cmFwcGVyQ2xhc3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLndyYXBwZXJCb2R5Q2xhc3N9YCk7XG4gICAgfVxuICAgIGlmICh3cmFwcGVyQ2xhc3MpIHtcbiAgICAgIHdyYXBwZXJDbGFzcy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdhdXRvJyB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEZpbHRlck9iamVjdCgpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7fTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbXVsdGlzZWxlY3QnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGFTb3VyY2UgJiYgaXRlbS5kYXRhU291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZElkcyA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAgICAgICAuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpXG4gICAgICAgICAgICAgIC5tYXAoKGkpID0+IGkuaWQpO1xuXG4gICAgICAgICAgICBpZiAoY2hlY2tlZElkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGNoZWNrZWRJZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGVSYW5nZSAmJiBpdGVtLmRhdGVSYW5nZS5zdGFydCAmJiBpdGVtLmRhdGVSYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmRhdGVSYW5nZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpdGVtLm51bWJlclJhbmdlICYmXG4gICAgICAgICAgICB0eXBlb2YgaXRlbT8ubnVtYmVyUmFuZ2U/LmZyb20gPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2YgaXRlbT8ubnVtYmVyUmFuZ2U/LnRvID09PSAnbnVtYmVyJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGl0ZW0ubnVtYmVyUmFuZ2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGUpIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmRhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGl0ZW0ucmFkaW9PcHRpb25zLmZpbmQoKHJvKSA9PiByby5zZWxlY3RlZCk/LmlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcblxuICAgIHRoaXMuaXNWaXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHJhZGlvQ2hhbmdlZCh2YWx1ZTogc3RyaW5nLCBpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSk6IHZvaWQge1xuICAgIGl0ZW0ucmFkaW9PcHRpb25zLmZvckVhY2goKG9wdCkgPT4gKG9wdC5zZWxlY3RlZCA9IG9wdC5pZCA9PT0gdmFsdWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0NoYW5nZWQoaXRlbTogRGF0YVNvdXJjZSwgY29uZmlnSXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiB2b2lkIHtcbiAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAvLyBzdG9yZSB0aGUgY2hlY2sgaXRlbXMgaW4gdGhlIGRhdGEgc291cmNlXG4gICAgICBjb25zdCBleGlzdEl0ZW0gPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmluZCgoaSkgPT4gaS5pZCA9PSBpdGVtLmlkKTtcbiAgICAgIGlmIChleGlzdEl0ZW0pIHtcbiAgICAgICAgZXhpc3RJdGVtLmNoZWNrZWQgPSBpdGVtLmNoZWNrZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25maWdJdGVtLmRhdGFTb3VyY2UucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICAgIC8vIGtlZXAgb25seSBjaGVja2VkXG4gICAgICBjb25maWdJdGVtLmRhdGFTb3VyY2UgPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChkKSA9PiBkLmNoZWNrZWQpO1xuICAgIH1cbiAgICAvLyBGb3IgdHJlZSBpdGVtcywgemVuLWdyb3VwcyBoYW5kbGVzIGNhc2NhZGUgaW50ZXJuYWxseVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmlzVmlzaWJsZSA9ICF0aGlzLmlzVmlzaWJsZTtcbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoQm94KCk7XG5cbiAgICBpZiAodGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHRoaXMucmVzZXRMYXp5TG9hZGluZ1NvdXJjZXModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2hlY2tWYWxpZGl0eShpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSkge1xuICAgIGlmIChpdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdHlwZW9mIGl0ZW0ubnVtYmVyUmFuZ2UudG8gPT09ICdudW1iZXInICYmXG4gICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSA+IGl0ZW0ubnVtYmVyUmFuZ2UudG9cbiAgICAgICkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5wdXNoKFxuICAgICAgICAgIGBJbnZhbGlkIE51bWJlciByYW5nZTogVGhlIE1pbiBudW1iZXIgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgTWF4IG51bWJlci5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaXRlbS5kYXRlUmFuZ2Uuc3RhcnQgJiZcbiAgICAgICAgaXRlbS5kYXRlUmFuZ2UuZW5kICYmXG4gICAgICAgIG5ldyBEYXRlKGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0KSA+IG5ldyBEYXRlKGl0ZW0uZGF0ZVJhbmdlLmVuZClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5wdXNoKFxuICAgICAgICAgIGBJbnZhbGlkIERhdGUgcmFuZ2U6IFRoZSBTdGFydCBkYXRlIGNhbm5vdCBiZSBhZnRlciB0aGUgRW5kIGRhdGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVBsYWNlbWVudChwb3M6ICdmaXhlZCcgfCAnYWJzb2x1dGUnID0gJ2ZpeGVkJykge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY29udGFpbmVyID0gaG9zdC5xdWVyeVNlbGVjdG9yKCcubWVudS1jb250ZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPVxuICAgICAgcG9zID09PSAnZml4ZWQnXG4gICAgICAgID8gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHJpZ2h0ID0gcmVjdC5yaWdodDtcbiAgICBjb25zdCB0b3AgPSByZWN0LnRvcDtcbiAgICBjb25zdCBib3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0b3A7XG5cbiAgICBpZiAocG9zID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNvbnRhaW5lciwgJ2Fic29sdXRlJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGNvbnRhaW5lciwgJ2luc2V0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY29udGFpbmVyLCAnYWJzb2x1dGUnKTtcbiAgICB9XG5cbiAgICBpZiAocG9zID09PSAnZml4ZWQnKSB7XG4gICAgICBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnYXV0bycpKSB7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxQb3NpdGlvbiA9IHRoaXMuZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMubWVudVJpZ2h0ID1cbiAgICAgICAgICBob3Jpem9udGFsUG9zaXRpb24gPT09ICdsZWZ0J1xuICAgICAgICAgICAgPyBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJpZ2h0fXB4YFxuICAgICAgICAgICAgOiAndW5zZXQnO1xuICAgICAgICB0aGlzLm1lbnVMZWZ0ID0gaG9yaXpvbnRhbFBvc2l0aW9uID09PSAncmlnaHQnID8gYCR7bGVmdH1weGAgOiAndW5zZXQnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdsZWZ0JykpIHtcbiAgICAgICAgdGhpcy5tZW51UmlnaHQgPSBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJpZ2h0fXB4YDtcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9ICd1bnNldCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lbnVMZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICAgIHRoaXMubWVudVJpZ2h0ID0gJ3Vuc2V0JztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2F1dG8nKSkge1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbFBvc2l0aW9uID0gdGhpcy5nZXRWZXJ0aWNhbFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMubWVudVRvcCA9XG4gICAgICAgICAgdmVydGljYWxQb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyBgJHt0b3AgKyA0Mn1weGAgOiAndW5zZXQnO1xuICAgICAgICB0aGlzLm1lbnVCb3R0b20gPSB2ZXJ0aWNhbFBvc2l0aW9uID09PSAndG9wJyA/IGAke2JvdHRvbX1weGAgOiAndW5zZXQnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSkge1xuICAgICAgICB0aGlzLm1lbnVUb3AgPSAndW5zZXQnO1xuICAgICAgICB0aGlzLm1lbnVCb3R0b20gPSBgJHtib3R0b20gKyAxMH1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lbnVUb3AgPSBgJHt0b3AgKyA1NX1weGA7XG4gICAgICAgIHRoaXMubWVudUJvdHRvbSA9ICd1bnNldCc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB2ZXJ0aWNhbENsYXNzID0gJyc7XG4gICAgICBsZXQgaG9yaXpvbnRhbENsYXNzID0gJyc7XG5cbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdhdXRvJykpIHtcbiAgICAgICAgaG9yaXpvbnRhbENsYXNzID0gdGhpcy5nZXRIb3Jpem9udGFsUG9zaXRpb24oKTtcbiAgICAgICAgdmVydGljYWxDbGFzcyA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaG9yaXpvbnRhbENsYXNzID0gdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnbGVmdCcpID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgICAgdmVydGljYWxDbGFzcyA9IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ3RvcCcpID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgICAgIH1cbiAgICAgIFtcbiAgICAgICAgJ2Ryb3Bkb3duLWxlZnQnLFxuICAgICAgICAnZHJvcGRvd24tcmlnaHQnLFxuICAgICAgICAnZHJvcGRvd24tdG9wJyxcbiAgICAgICAgJ2Ryb3Bkb3duLWJvdHRvbScsXG4gICAgICBdLmZvckVhY2goKGMpID0+IHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY29udGFpbmVyLCBjKSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNvbnRhaW5lciwgYGRyb3Bkb3duLSR7aG9yaXpvbnRhbENsYXNzfWApO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsIGBkcm9wZG93bi0ke3ZlcnRpY2FsQ2xhc3N9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJ0aWNhbFBvc2l0aW9uKCk6ICdib3R0b20nIHwgJ3RvcCcge1xuICAgIGNvbnN0IHRvcCA9XG4gICAgICB0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIHJldHVybiB0b3AgPiB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk6ICdyaWdodCcgfCAnbGVmdCcge1xuICAgIGNvbnN0IGxlZnQgPVxuICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgcmV0dXJuIGxlZnQgPiB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgPyAnbGVmdCcgOiAncmlnaHQnO1xuICB9XG5cbiAgcHVibGljIGdldERlZmF1bHREYXRlUmFuZ2VPcHRpb25zKCk6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGF0ZVJhbmdlOiBEYXRlUmFuZ2U7XG4gIH1bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1RvZGF5JyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICAgIGVuZDogbW9tZW50KCkuZW5kT2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1llc3RlcmRheScsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5cycpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICAgIGVuZDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKS5lbmRPZignZGF5JykudG9EYXRlKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnVGhpcyBXZWVrJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCd3ZWVrJykudG9EYXRlKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnTGFzdCBXZWVrJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDcsICdkYXlzJykuc3RhcnRPZignd2VlaycpLnRvRGF0ZSgpLFxuICAgICAgICAgIGVuZDogbW9tZW50KCkuc3VidHJhY3QoNywgJ2RheXMnKS5lbmRPZignd2VlaycpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1RoaXMgTW9udGgnLFxuICAgICAgICBkYXRlUmFuZ2U6IHtcbiAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0xhc3QgTW9udGgnLFxuICAgICAgICBkYXRlUmFuZ2U6IHtcbiAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ21vbnRoJykuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0VHJlZU9yZGVyKGl0ZW1zOiBEYXRhU291cmNlW10sIHRyZWVNYXA6IE1hcDxzdHJpbmcgfCBudW1iZXIsIERhdGFTb3VyY2U+KTogRGF0YVNvdXJjZVtdIHtcbiAgICBjb25zdCBpdGVtU2V0ID0gbmV3IFNldChpdGVtcy5tYXAoaSA9PiBpLmlkKSk7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuICAgIGNvbnN0IG9yZGVyZWQ6IERhdGFTb3VyY2VbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ID0gKGl0ZW06IERhdGFTb3VyY2UpID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhpdGVtLmlkKSkgcmV0dXJuO1xuICAgICAgaWYgKCFpdGVtU2V0LmhhcyhpdGVtLmlkKSkgcmV0dXJuO1xuICAgICAgdmlzaXRlZC5hZGQoaXRlbS5pZCk7XG4gICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSB0cmVlTWFwLmdldChjaGlsZElkKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZpc2l0KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKGl0ZW0ucGFyZW50SWQgPT0gbnVsbCkge1xuICAgICAgICB2aXNpdChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGl0ZW0uaWQpKSB7XG4gICAgICAgIG9yZGVyZWQucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yZGVyZWQ7XG4gIH1cblxuICBwdWJsaWMgaGFzVHJlZURhdGEoY29uZmlnSXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29uZmlnSXRlbS5kYXRhU291cmNlPy5zb21lKGQgPT4gZC5jaGlsZHJlbj8ubGVuZ3RoID4gMCkgfHwgZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRGF0ZVJhbmdlT3B0aW9uQ2xpY2soaXRlbSwgb3B0aW9uKSB7XG4gICAgaXRlbS5kYXRlUmFuZ2UgPSBvcHRpb24uZGF0ZVJhbmdlO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zW2l0ZW0ua2V5XSA9IG9wdGlvbi5uYW1lO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUN1c3RvbURhdGVSYW5nZUNsaWNrKGl0ZW0pIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPSAnQ3VzdG9tJztcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVFbmREYXRlQ2hhbmdlKGl0ZW0pIHtcbiAgICBpZiAoIWl0ZW0uc2hvd1RpbWUpIHtcbiAgICAgIGl0ZW0uZGF0ZVJhbmdlLmVuZCA9IG1vbWVudChpdGVtLmRhdGVSYW5nZS5lbmQpLmVuZE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc011bHRpc2VsZWN0SXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLml0ZW1zLnNvbWUoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnICYmIGl0ZW0uZGF0YVNvdXJjZT8ubGVuZ3RoID4gMFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0JyAmJiBpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgY291bnQgKz0gaXRlbS5kYXRhU291cmNlLmZpbHRlcigoZCkgPT4gZC5jaGVja2VkKS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZpbHRlcnMtY29tcG9uZW50XCJcbiAgICAgI21haW5Db21wb25lbnRcbiAgICAgY2xpY2stb3V0PVwiaXNWaXNpYmxlICYmIGhpZGUoKVwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21UcmlnZ2VyXCI+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1zdHJva2VkIGZpbHRlciB7e2lzQXBwbGllZCA/ICdhcHBsaWVkJyA6ICcnfX1cIj5cbiAgICAgICAgICAgIDx6ZW4taWNvbiBbc3JjXT1cImltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImltYWdlVXJsXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmlsdGVyLWljb24gbWF0ZXJpYWwtaWNvbnNcIlxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaW1hZ2VVcmxcIj5maWx0ZXJfbGlzdDwvaT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGVudCAqbmdJZj1cImN1c3RvbVRyaWdnZXJcIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8ZGl2IFtoaWRkZW5dPVwiIWlzVmlzaWJsZVwiXG4gICAgICAgICBjbGFzcz1cImFjdGlvbi1tZW51IG1lbnUtY29udGVudFwiXG4gICAgICAgICBbY2xhc3MuY3VzdG9tVHJpZ2dlcl09XCJjdXN0b21UcmlnZ2VyXCJcbiAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2xlZnQnOiBtZW51TGVmdCwgJ3JpZ2h0JzogbWVudVJpZ2h0LCAndG9wJzogbWVudVRvcCwgJ2JvdHRvbSc6IG1lbnVCb3R0b20gIH1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWhlYWRlclwiPlxuICAgICAgICAgICAgPHplbi1zZWFyY2gtYm94IFsodGV4dCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlYXJjaEJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0Q2hhbmdlKT1cInNlYXJjaFRleHRDaGFuZ2VkKClcIj48L3plbi1zZWFyY2gtYm94PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLW1lbnUtYm9keSBpdGVtcy13cmFwcGVyXCJcbiAgICAgICAgICAgICBuZ0NsYXNzPVwie3t3cmFwcGVyQm9keUNsYXNzfX1cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlcnJvck1lc3NhZ2UubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXJyb3ItbXNnXCI+e3tpdGVtIHwgdHJhbnNsYXRlIH19PC9saT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbmZpZy5pdGVtc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01lbnVJc1Zpc2libGUoaXRlbSlcIj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIERpdmlkZXIgYmV0d2VlbiB0d28gZmlsdGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZGl2aWRlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmlsdGVyLWRpdmlkZXJcIj48L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQm9vbGVhbiB0b2dnbGUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICd0b2dnbGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtIHRvZ2dsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tpdGVtLnRpdGxlIHwgdHJhbnNsYXRlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tdG9nZ2xlLXNsaWRlIFsoZW5hYmxlZCldPVwiaXRlbS5lbmFibGVkXCI+PC96ZW4tdG9nZ2xlLXNsaWRlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWl0ZW0gZXhwYW5kZXItaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgIT0gJ3RvZ2dsZScgJiYgaXRlbS50eXBlICE9ICdkaXZpZGVyJyAmJiAhaXRlbS5kaXNhYmxlQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVJdGVtKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cGFuZGVyLXRpdGxlXCI+e3tpdGVtLnRpdGxlIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGV4cGFuZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXRlbS5leHBhbmRlZH1cIj5leHBhbmRfbW9yZTwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtIHNlY3Rpb24tdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlICE9ICd0b2dnbGUnICYmIGl0ZW0udHlwZSAhPSAnZGl2aWRlcicgJiYgaXRlbS5kaXNhYmxlQ29sbGFwc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmV4cGFuZGVkIHx8IGl0ZW0uZGlzYWJsZUNvbGxhcHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJpdGVtLnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpc2VsZWN0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aXNlbGVjdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMYXp5IGxvYWRpbmcgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaXNMYXp5TG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZHNJdGVtIG9mIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBkcy1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1iYWRnZV09XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1jaGVja2JveCBbKGNoZWNrZWQpXT1cImRzSXRlbS5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZVVybF09XCJkc0l0ZW0uaW1hZ2VVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiY2hlY2tDaGFuZ2VkKGRzSXRlbSwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImRzSXRlbS5iYWRnZUJnQ29sb3IgPyAnJyA6IChkc0l0ZW0ubmFtZT8udG9TdHJpbmcoKSB8IHRyYW5zbGF0ZSlcIj48L3plbi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRzSXRlbS5iYWRnZUJnQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLWl0ZW0tYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZCc6IGRzSXRlbS5iYWRnZUJnQ29sb3IsICdjb2xvcic6IGRzSXRlbS5iYWRnZUNvbG9yfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkc0l0ZW0ubmFtZT8udG9TdHJpbmcoKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uY2FuTG9hZE1vcmUgJiYgIWl0ZW0uaXNMb2FkaW5nTm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvYWRNb3JlKGl0ZW0sIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1zdHJva2VkIGZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snTG9hZCBNb3JlJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmlzTG9hZGluZ05vd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG9hZGVyLW1vcmUtc3Bpbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tc3Bpbm5lciBzaXplPVwic21hbGxcIj48L3plbi1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5pc0xhenlMb2FkaW5nICYmICFoYXNUcmVlRGF0YShpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLWNoZWNrYm94IGRzLWl0ZW0gc2VsZWN0LWFsbFwiICpuZ0lmPVwiIWl0ZW0uaGlkZVNlbGVjdEFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggKm5nSWY9XCJpdGVtLmRhdGFTb3VyY2UubGVuZ3RoID09PSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhjaGVja2VkKV09XCJpdGVtLmlzU2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaXNJdGVtQWN0aXZlKGl0ZW0pICYmICFpdGVtLmlzU2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidTZWxlY3QgQWxsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJvblNlbGVjdEFsbChpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3ggZHMtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYmFkZ2VdPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggWyhjaGVja2VkKV09XCJkc0l0ZW0uY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZHNJdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZChkc0l0ZW0sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yID8gJycgOiAoZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUpXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1pdGVtLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQnOiBkc0l0ZW0uYmFkZ2VCZ0NvbG9yLCAnY29sb3InOiBkc0l0ZW0uYmFkZ2VDb2xvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUcmVlIHZpZXcgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1ncm91cHMgKm5nSWY9XCIhaXRlbS5pc0xhenlMb2FkaW5nICYmIGhhc1RyZWVEYXRhKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiaXRlbS5kYXRhU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmVkRGF0YVNvdXJjZV09XCJpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0QWxsXT1cIml0ZW0uaGlkZVNlbGVjdEFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGlzU2VsZWN0ZWRBbGwpXT1cIml0ZW0uaXNTZWxlY3RlZEFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWdyb3Vwcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSByYW5nZSBwaWNrZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVSYW5nZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgT3B0aW9ucyBkYXRlIHJhbmdlIHZpZXcgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5kYXRlUmFuZ2VPcHRpb25zPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBpdGVtLmRhdGVSYW5nZU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXJhZGlvIFt2YWx1ZV09XCJvcHRpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPT09IG9wdGlvbi5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFkaW9DaGFuZ2UpPVwiaGFuZGxlRGF0ZVJhbmdlT3B0aW9uQ2xpY2soaXRlbSwgb3B0aW9uKVwiPjwvemVuLXJhZGlvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tcmFkaW8gW3ZhbHVlXT1cIidDdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ3VzdG9tJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zW2l0ZW0ua2V5XSA9PT0gJ0N1c3RvbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhZGlvQ2hhbmdlKT1cImhhbmRsZUN1c3RvbURhdGVSYW5nZUNsaWNrKGl0ZW0pXCI+PC96ZW4tcmFkaW8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID09PSAnQ3VzdG9tJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J0Zyb20nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVSYW5nZS5zdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRzLWl0ZW0gZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snVG8nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVSYW5nZS5lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImhhbmRsZUVuZERhdGVDaGFuZ2UoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgRGVmYXVsdCBkYXRlIHJhbmdlIHZpZXcgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uZGF0ZVJhbmdlT3B0aW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J0Zyb20nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2Uuc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5UG9zaXRpb25dPVwiaXRlbS5jb25maWc/LnlQb3NpdGlvbiA/PyBkYXRlcGlja2VyUG9zaXRpb24uQVVUT1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snVG8nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2UuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJoYW5kbGVFbmREYXRlQ2hhbmdlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC96ZW4tZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSBwaWNrZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydEYXRlJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50Q29udGFpbmVyXT1cIm1haW5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOdW1iZXIgcmFuZ2UgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlclJhbmdlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1yb3cgbnVtYmVyLXJhbmdlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J01pbicgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm1hdGVyaWFsLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ubnVtYmVyUmFuZ2UuZnJvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J01heCcgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm1hdGVyaWFsLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ubnVtYmVyUmFuZ2UudG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmFkaW8gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaXRlbS5yYWRpb09wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1yYWRpbyBbdmFsdWVdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwib3B0aW9uLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyYWRpb0NoYW5nZSk9XCJyYWRpb0NoYW5nZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIj48L3plbi1yYWRpbz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93Tm9GaWx0ZXJSZXN1bHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuby1pdGVtXCI+e3snTm8gUmVzdWx0cyBGb3VuZCcgfCB0cmFuc2xhdGV9fS4uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLW1lbnUtZm9vdGVyIGZpbHRlci1mb290ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtY291bnRcIiAqbmdJZj1cImhhc011bHRpc2VsZWN0SXRlbXNcIj57eyBzZWxlY3RlZENvdW50IH19IHt7J1NlbGVjdGVkJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1mb290ZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlc2V0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItYnRuLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtc2VsZWN0aW9uXT1cInNlbGVjdGVkQ291bnQgPiAwICYmIGhhc011bHRpc2VsZWN0SXRlbXNcIj5cbiAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgRmlsdGVyJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYXBwbHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1idG4tYXBwbHlcIj5cbiAgICAgICAgICAgICAgICAgICAge3snQXBwbHknIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
794
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBUy9ELE1BQU0sT0FBTyxvQkFBb0I7SUF5RC9CLFlBQW1CLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUF4RDdCLFdBQU0sR0FBa0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFJdEMsYUFBUSxHQUFHLE9BQU8sQ0FBQztRQUVuQixrQkFBYSxHQUF3QixPQUFPLENBQUM7UUFFNUMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTNDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFakIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRS9DLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBWXRCLG1CQUFjLEdBQXlCLE9BQU8sQ0FBQztRQUVqRCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFakIsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBSTdCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFJbkIsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFFNUIsdUJBQWtCLEdBQUcsbUJBQW1CLENBQUM7UUFFekMsNkJBQXdCLEdBQThCLEVBQUUsQ0FBQztJQU12QixDQUFDO0lBRW5DLFdBQVcsQ0FBQyxPQUFZO1FBQzdCLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtZQUNqRCxjQUFjO1lBQ2QsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVTt3QkFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO3dCQUMvQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNSO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBRTVDLDBCQUEwQjtvQkFDMUIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFO3dCQUMvRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7cUJBQzNEO2lCQUNGO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztpQkFDdkI7Z0JBRUQsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO29CQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztpQkFDdEI7YUFDRjtZQUVELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUVuQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDakQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVqRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUMzQjtRQUVELElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtZQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBR0QsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLE9BQU87U0FDUjtRQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQyx5QkFBeUI7WUFDekIsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN6RCxPQUFPO1NBQ1I7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVosaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFHRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUdELFlBQVk7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBR0QsZUFBZSxDQUFDLEtBQW9CO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLE9BQU87U0FDUjtRQUVELElBQ0UsS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTO1lBQ3ZCLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVztZQUN6QixLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVE7WUFDdEIsS0FBSyxDQUFDLEdBQUcsS0FBSyxVQUFVO1lBQ3hCLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTTtZQUNwQixLQUFLLENBQUMsR0FBRyxLQUFLLEtBQUssRUFDbkI7WUFDQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztZQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ25DLE9BQU87YUFDUjtZQUVELElBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUNyRCxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQzVDO2dCQUNBLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sZUFBZSxDQUFDLElBQXVCO1FBQzVDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLEVBQUU7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDNUM7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtnQkFDbkMsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sdUJBQXVCLENBQzdCLEtBR0c7UUFFSCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDaEMsT0FBTyxPQUFPLENBQ1osT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLFFBQVE7Z0JBQ3ZCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssU0FBUztnQkFDNUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVE7b0JBQ3RDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUztvQkFDOUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQ1osQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLDhCQUE4QjtRQUM5QixTQUFTLENBQUMsT0FBTyxDQUNmLENBQUMsRUFBbUIsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FDM0QsQ0FBQztRQUNGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxXQUFXLENBQUMsSUFBdUI7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQXVCO1FBQ3pDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUU7WUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDcEUsT0FBTyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNoQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDaEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3BEO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRTtZQUN0QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUNwQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzVEO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUMvQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLHVCQUF1QjtRQUN2QixvRkFBb0Y7UUFDcEYsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLGlCQUEwQjtRQUM5RCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtZQUMxQyxJQUFJLFVBQVUsQ0FBQyxhQUFhLEVBQUU7Z0JBQzVCLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixVQUFVLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO2dCQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQzthQUM3RDtTQUNGO1FBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVCLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXBCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDMUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRTtnQkFDckMsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFO29CQUM1QixJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUU7d0JBQzNCLDBDQUEwQzt3QkFDMUMsT0FBTyxHQUFHLElBQUksQ0FBQztxQkFDaEI7eUJBQU0sSUFBSSxVQUFVLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxFQUFFO3dCQUNoRCxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUNoQjtpQkFDRjtxQkFBTTtvQkFDTCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUM3QixrREFBa0Q7d0JBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO3dCQUN4RCxLQUFLLE1BQU0sRUFBRSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7NEJBQ3RDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzt5QkFDekI7d0JBRUQsNERBQTREO3dCQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQzt3QkFDL0MsS0FBSyxNQUFNLEVBQUUsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFOzRCQUN0QyxNQUFNLFlBQVksR0FDaEIsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQzs0QkFDN0QsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRTtnQ0FDdEUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQ3ZCLG9CQUFvQjtnQ0FDcEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO2dDQUNqQixPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUU7b0NBQ3ZCLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29DQUNsQyxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0NBQ3pDLElBQUksQ0FBQyxPQUFPO3dDQUFFLE1BQU07aUNBQ3JCOzZCQUNGO3lCQUNGO3dCQUNELFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDMUQsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUMvQixDQUFDO3dCQUNGLHFDQUFxQzt3QkFDckMsS0FBSyxNQUFNLEVBQUUsSUFBSSxVQUFVLENBQUMsa0JBQWtCLEVBQUU7NEJBQzlDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7Z0NBQ3ZCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOzZCQUNsQjt5QkFDRjt3QkFDRCxVQUFVLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7cUJBQzdGO3lCQUFNO3dCQUNMLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFOzRCQUNsRSxNQUFNLFlBQVksR0FDaEIsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQzs0QkFDN0QsT0FBTyxZQUFZO2lDQUNoQixXQUFXLEVBQUU7aUNBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxNQUFNLEVBQUU7NEJBQ1YsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUM7NEJBQ3hELEtBQUssTUFBTSxFQUFFLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRTtnQ0FDdEMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDOzZCQUN6Qjs0QkFDRCxVQUFVLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7eUJBQzdGO3FCQUNGO29CQUVELElBQUksVUFBVSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRTt3QkFDeEMsT0FBTyxHQUFHLElBQUksQ0FBQztxQkFDaEI7aUJBQ0Y7YUFDRjtpQkFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO2dCQUMxQyxJQUNFLElBQUksQ0FBQyxVQUFVO29CQUNmLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQ2hFO29CQUNBLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7aUJBQ3BDO2FBQ0Y7aUJBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRTtnQkFDNUMsSUFDRSxJQUFJLENBQUMsVUFBVTtvQkFDZixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUNsRTtvQkFDQSxVQUFVLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO2lCQUNwQzthQUNGO1NBQ0Y7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUF1QixFQUFFLGlCQUEwQjtRQUN2RSxJQUFJO1lBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLE1BQU0seUJBQXlCLENBQUM7YUFDakM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO2FBQzlCO1lBRUQsK0NBQStDO1lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM3RCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQ3BDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFLEVBQy9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQzlCLEtBQUssQ0FDTixDQUFDO1lBRUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQztZQUU1Qyw0RkFBNEY7WUFDNUYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkUsNkNBQTZDO1lBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVO2lCQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7aUJBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXBCLElBQUksaUJBQWlCLEVBQUU7Z0JBQ3JCLGlDQUFpQztnQkFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQ3RELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNsQyxDQUFDO2dCQUNGLG1DQUFtQztnQkFDbkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDeEU7aUJBQU07Z0JBQ0wsMENBQTBDO2dCQUMxQyxLQUFLLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtvQkFDMUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDakQ7YUFDRjtTQUNGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRU0sVUFBVSxDQUFDLElBQXVCO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxFQUFFO29CQUNsRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDNUI7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUM7UUFDakQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUVuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7Z0JBRS9CLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDcEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7aUJBQzVCO2FBQ0Y7WUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUM3QztZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQzdDO1lBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNiLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzthQUN4QjtZQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtnQkFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUU7d0JBQy9CLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3FCQUNuQjt5QkFBTTt3QkFDTCxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztxQkFDcEI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtTQUNGO0lBQ0gsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ3BDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxhQUFhO29CQUNoQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQ25CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBRW5ELEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTs0QkFDdEMsUUFBUSxDQUFDLE9BQU8sR0FBRyxTQUFTO2dDQUMxQixDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dDQUNqQyxDQUFDLENBQUMsS0FBSyxDQUFDO3lCQUNYO3FCQUNGO29CQUNELE1BQU07Z0JBQ1IsS0FBSyxXQUFXO29CQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTt3QkFDbkQsS0FBSyxFQUFFLElBQUk7d0JBQ1gsR0FBRyxFQUFFLElBQUk7cUJBQ1YsQ0FBQztvQkFDRixNQUFNO2dCQUNSLEtBQUssYUFBYTtvQkFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDMUQsTUFBTTtnQkFDUixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNsRCxNQUFNO2dCQUNSLEtBQUssTUFBTTtvQkFDVCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdDLE1BQU07Z0JBQ1IsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdEQsTUFBTTthQUNUO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtZQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNqQjtTQUNGO1FBQ0QsSUFBSSxRQUFRLEVBQUU7WUFDWixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pELE9BQU87U0FDUjthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBDLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLDJDQUEyQztRQUMzQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUU7Z0JBQy9CLDhCQUE4QjtnQkFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFbEQseUNBQXlDO2dCQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDbEIsQ0FBQyxDQUFhLEVBQUUsQ0FBYSxFQUFFLEVBQUUsQ0FDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQ2xELENBQUM7YUFDSDtTQUNGO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsK0VBQStFO2dCQUMvRSxxRUFBcUU7Z0JBQ3JFLElBQ0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ2xFO29CQUNBLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2lCQUN2QjthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ3ZCO1NBQ0Y7UUFFRCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsSUFBSSxZQUFZLEVBQUU7WUFDaEIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFbEIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtZQUNwQyxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssYUFBYTtvQkFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO3dCQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVTs2QkFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDOzZCQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFFcEIsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFOzRCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQzt5QkFDL0I7cUJBQ0Y7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLFdBQVc7b0JBQ2QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO3dCQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7cUJBQ25DO29CQUNELE1BQU07Z0JBQ1IsS0FBSyxhQUFhO29CQUNoQixJQUNFLElBQUksQ0FBQyxXQUFXO3dCQUNoQixPQUFPLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxLQUFLLFFBQVE7d0JBQzNDLE9BQU8sSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEtBQUssUUFBUSxFQUN6Qzt3QkFDQSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7cUJBQ3JDO29CQUNELE1BQU07Z0JBQ1IsS0FBSyxRQUFRO29CQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7b0JBQ3pDLE1BQU07Z0JBQ1IsS0FBSyxNQUFNO29CQUNULElBQUksSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7cUJBQzlCO29CQUNELE1BQU07Z0JBQ1IsS0FBSyxPQUFPO29CQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ25FLE1BQU07YUFDVDtTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFhLEVBQUUsSUFBdUI7UUFDeEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFnQixFQUFFLFVBQTZCO1FBQ2pFLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRTtZQUM1QiwyQ0FBMkM7WUFDM0MsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLElBQUksU0FBUyxFQUFFO2dCQUNiLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUNsQztpQkFBTTtnQkFDTCxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNsQztZQUNELG9CQUFvQjtZQUNwQixVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDeEU7UUFDRCx3REFBd0Q7SUFDMUQsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsSUFBdUI7UUFDNUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRTtZQUMvQixJQUNFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssUUFBUTtnQkFDekMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxRQUFRO2dCQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFDM0M7Z0JBQ0EsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ3BCLDZFQUE2RSxDQUM5RSxDQUFDO2dCQUNGLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7WUFDN0IsSUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRztnQkFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUM3RDtnQkFDQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDcEIsa0VBQWtFLENBQ25FLENBQUM7Z0JBQ0YsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sZUFBZSxDQUFDLE1BQTRCLE9BQU87UUFDeEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQTRCLENBQUM7UUFDakUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQWdCLENBQUM7UUFDckUsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBRXZCLE1BQU0sSUFBSSxHQUNSLEdBQUcsS0FBSyxPQUFPO1lBQ2IsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM5QixDQUFDLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFFeEMsSUFBSSxHQUFHLEtBQUssVUFBVSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDL0M7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNsRDtRQUVELElBQUksR0FBRyxLQUFLLE9BQU8sRUFBRTtZQUNuQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNsQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsU0FBUztvQkFDWixrQkFBa0IsS0FBSyxNQUFNO3dCQUMzQixDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssSUFBSTt3QkFDbEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLGtCQUFrQixLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2FBQ3hFO2lCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssSUFBSSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQzthQUN6QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO2FBQzFCO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLE9BQU87b0JBQ1YsZ0JBQWdCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsVUFBVSxHQUFHLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2FBQ3hFO2lCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDO2FBQ3RDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO2FBQzNCO1NBQ0Y7YUFBTTtZQUNMLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7WUFFekIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEMsZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMvQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDNUM7aUJBQU07Z0JBQ0wsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDcEUsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQzthQUNsRTtZQUNEO2dCQUNFLGVBQWU7Z0JBQ2YsZ0JBQWdCO2dCQUNoQixjQUFjO2dCQUNkLGlCQUFpQjthQUNsQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFlBQVksZUFBZSxFQUFFLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsWUFBWSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ25FLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUN6RCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLE1BQU0sSUFBSSxHQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDcEUsT0FBTyxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ3pELENBQUM7SUFFTSwwQkFBMEI7UUFJL0IsT0FBTztZQUNMO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLFNBQVMsRUFBRTtvQkFDVCxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRTtvQkFDdkMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUU7aUJBQ3BDO2FBQ0Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsV0FBVztnQkFDakIsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUU7b0JBQzNELEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUU7aUJBQ3hEO2FBQ0Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsV0FBVztnQkFDakIsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFO29CQUN4QyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtpQkFDckM7YUFDRjtZQUNEO2dCQUNFLElBQUksRUFBRSxXQUFXO2dCQUNqQixTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtvQkFDNUQsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtpQkFDekQ7YUFDRjtZQUNEO2dCQUNFLElBQUksRUFBRSxZQUFZO2dCQUNsQixTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUU7b0JBQ3pDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFO2lCQUN0QzthQUNGO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLFNBQVMsRUFBRTtvQkFDVCxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFO29CQUM5RCxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFO2lCQUMzRDthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBbUIsRUFBRSxPQUF5QztRQUNsRixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRTtZQUNqQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFBRSxPQUFPO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQUUsT0FBTztZQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7Z0JBQ3pCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDbkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxLQUFLLEVBQUU7d0JBQ1QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUNkO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUM7UUFDRixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO2dCQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDYjtTQUNGO1FBQ0QsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1NBQ0Y7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sV0FBVyxDQUFDLFVBQTZCO1FBQzlDLE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDM0UsQ0FBQztJQUVNLDBCQUEwQixDQUFDLElBQUksRUFBRSxNQUFNO1FBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDeEQsQ0FBQztJQUVNLDBCQUEwQixDQUFDLElBQUk7UUFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDckQsQ0FBQztJQUVNLG1CQUFtQixDQUFDLElBQUk7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUMzQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbEQsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO2FBQzFEO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O2tIQXYyQlUsb0JBQW9CO3NHQUFwQixvQkFBb0IsdzNCQzlCakMsb3NoQkE2UUE7NEZEL09hLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxZQUFZO2dHQUtiLE1BQU07c0JBQWQsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUUsU0FBUztzQkFBakIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUVFLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQTBCcUMsU0FBUztzQkFBbkQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUd6QyxpQkFBaUI7c0JBRGhCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFnRDdDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF1QjVDLGtCQUFrQjtzQkFEakIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXpDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXpDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEZpbHRlcnNDb25maWcsXG4gIEZpbHRlcnNDb25maWdJdGVtLFxuICBNdWx0aVNlbGVjdEl0ZW0sXG59IGZyb20gJy4vZmlsdGVyc0NvbmZpZyc7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC51bmlxYnknO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQvbW9tZW50JztcbmltcG9ydCB7IFplbmR1U2VhcmNoQm94Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWJveC96ZW5kdS1zZWFyY2gtYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBEQVRFUElDS0VSX1BPU0lUSU9OIH0gZnJvbSAnLi4vZGF0ZXBpY2tlci9kYXRlcGlja2VyJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4vZGF0ZVJhbmdlJztcbmltcG9ydCB7IFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd6ZW4tZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3plbmR1LWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3plbmR1LWZpbHRlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBaZW5kdUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZzogRmlsdGVyc0NvbmZpZyA9IHsgaXRlbXM6IFtdIH07XG5cbiAgQElucHV0KCkgZmlsdGVyOiBvYmplY3Q7XG5cbiAgQElucHV0KCkgcG9zaXRpb24gPSAncmlnaHQnO1xuXG4gIEBJbnB1dCgpIHJlc2V0QmVoYXZpb3I6ICdzZXRfYWxsJyB8ICdjbGVhcicgPSAnY2xlYXInO1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcblxuICBASW5wdXQoKSBpc1Zpc2libGUgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgaXNWaXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBJbnB1dCgpIGN1c3RvbVRyaWdnZXIgPSBmYWxzZTtcblxuICBASW5wdXQoKSBpbWFnZVVybDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgc2hvd09wdGlvbnM6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgY3VzdG9tT3B0aW9uczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHdyYXBwZXJCb2R5Q2xhc3M6IHN0cmluZztcblxuICBASW5wdXQoKSBjdXN0b21Qb3NpdGlvbjogJ2ZpeGVkJyB8ICdhYnNvbHV0ZScgPSAnZml4ZWQnO1xuXG4gIHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgcHVibGljIGlzQXBwbGllZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgbGFzdEFwcGxpZWRGaWx0ZXI6IGFueSA9IHt9O1xuXG4gIHByaXZhdGUgcmVzZXRlZEZpbHRlcjogYW55O1xuXG4gIHB1YmxpYyBtZW51TGVmdCA9ICcwcHgnO1xuXG4gIHB1YmxpYyBtZW51UmlnaHQgPSAnMHB4JztcblxuICBwdWJsaWMgbWVudVRvcCA9ICcwcHgnO1xuXG4gIHB1YmxpYyBtZW51Qm90dG9tID0gJzBweCc7XG5cbiAgcHVibGljIHNob3dOb0ZpbHRlclJlc3VsdDogYm9vbGVhbjtcblxuICBwdWJsaWMgZXJyb3JNZXNzYWdlOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBkYXRlcGlja2VyUG9zaXRpb24gPSBEQVRFUElDS0VSX1BPU0lUSU9OO1xuXG4gIHB1YmxpYyBzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBAVmlld0NoaWxkKCdzZWFyY2hCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VhcmNoQm94OiBaZW5kdVNlYXJjaEJveENvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCdtYWluQ29tcG9uZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIF9jb21wb25lbnRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgY29uc3RydWN0b3IocHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpZyAmJiBjaGFuZ2VzLmNvbmZpZy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIGluaXQgdmFsdWVzXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICAgIGl0ZW0uZGF0YVNvdXJjZSA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAgICAgPyB0aGlzLmV4dHJhY3RVbmlxdWVEYXRhU291cmNlKGl0ZW0uZGF0YVNvdXJjZSlcbiAgICAgICAgICAgIDogW107XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZGF0ZVJhbmdlJyAmJiAhaXRlbS5kYXRlUmFuZ2UpIHtcbiAgICAgICAgICBpdGVtLmRhdGVSYW5nZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuXG4gICAgICAgICAgLy8gaW5pdCBkYXRlIHJhbmdlIG9wdGlvbnNcbiAgICAgICAgICBpZiAoaXRlbS5zaG93RGF0ZVJhbmdlT3B0aW9ucyAmJiAhaXRlbS5kYXRlUmFuZ2VPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlT3B0aW9ucyA9IHRoaXMuZ2V0RGVmYXVsdERhdGVSYW5nZU9wdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnICYmICFpdGVtLm51bWJlclJhbmdlKSB7XG4gICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLnNob3dUaW1lICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBpdGVtLnNob3dUaW1lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG5cbiAgICAgIHRoaXMucmVzZXRlZEZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgICB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyID0gVXRpbC5jbG9uZSh0aGlzLmZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuZmlsdGVyICYmIGNoYW5nZXMuZmlsdGVyLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5sYXN0QXBwbGllZEZpbHRlciA9IFV0aWwuY2xvbmUoY2hhbmdlcy5maWx0ZXIuY3VycmVudFZhbHVlKTtcblxuICAgICAgdGhpcy51cGRhdGVBcHBsaWVkU3RhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5pc1Zpc2libGUgJiYgY2hhbmdlcy5pc1Zpc2libGUuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hCb3goKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgb3V0c2lkZUhhbmRsaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgLy8gZWxlbWVudCBub3QgaW4gdGhlIERPTVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBoaWRlIHRoZSBtZW51IGZvciBvdXRzaWRlIGNsaWNrXG4gICAgdGhpcy5oaWRlKCk7XG5cbiAgICAvLyByZXN0b3JlIHZhbHVlc1xuICAgIHRoaXMucmVzdG9yZVByZXZpb3VzQXBwbGllZCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIHdpbmRvd1NpemVIYW5kbGluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgd2luZG93U2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25XaW5kb3dLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdQYWdlVXAnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdQYWdlRG93bicgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0hvbWUnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdFbmQnXG4gICAgKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiZcbiAgICAgICAgIXRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2J1dHRvbi1zdHJva2VkJylcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHRoaXMucmVzdG9yZVByZXZpb3VzQXBwbGllZCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb2N1c1NlYXJjaEJveCgpIHtcbiAgICB0aGlzLnNlYXJjaEJveC5kb0ZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgaXNNZW51SXNWaXNpYmxlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG4gICAgaWYgKGl0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgaWYgKGl0ZW0uaXNMb2FkaW5nTm93IHx8IGl0ZW0uY2FuTG9hZE1vcmUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VhcmNoVGV4dCkge1xuICAgICAgICByZXR1cm4gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2U/Lmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgJiYgdGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICBpZiAoIWl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RVbmlxdWVEYXRhU291cmNlKFxuICAgIGFycmF5OiB7XG4gICAgICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgbmFtZTogc3RyaW5nIHwgbnVtYmVyO1xuICAgIH1bXVxuICApOiBNdWx0aVNlbGVjdEl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBhcnJheS5maWx0ZXIoKGVsKSA9PiB7XG4gICAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgICAgdHlwZW9mIGVsLmlkID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gdHlwZW9mIGVsLmlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA6IGVsLmlkICYmIHR5cGVvZiBlbC5uYW1lID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gdHlwZW9mIGVsLm5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIDogZWwubmFtZVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmlxSXRlbXMgPSB1bmlxQnkoaXRlbXMsIChlbCkgPT4gZWwuaWQpO1xuICAgIC8vIGFkZCBpbmRleCB0byBlYWNoIHVuaXFJdGVtc1xuICAgIHVuaXFJdGVtcy5mb3JFYWNoKFxuICAgICAgKGVsOiBNdWx0aVNlbGVjdEl0ZW0sIGluZGV4OiBudW1iZXIpID0+IChlbC5pbmRleCA9IGluZGV4KVxuICAgICk7XG4gICAgcmV0dXJuIHVuaXFJdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdEFsbChpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSkge1xuICAgIGl0ZW0uZGF0YVNvdXJjZS5mb3JFYWNoKChkKSA9PiAoZC5jaGVja2VkID0gaXRlbS5pc1NlbGVjdGVkQWxsKSk7XG4gIH1cblxuICBwdWJsaWMgaXNJdGVtQWN0aXZlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogYm9vbGVhbiB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgY29uc3QgY2hlY2tlZEl0ZW1zID0gaXRlbS5kYXRhU291cmNlLmZpbHRlcigoZWwpID0+IGVsLmNoZWNrZWQpO1xuICAgICAgaXRlbS5pc1NlbGVjdGVkQWxsID0gY2hlY2tlZEl0ZW1zLmxlbmd0aCA9PT0gaXRlbS5kYXRhU291cmNlLmxlbmd0aDtcbiAgICAgIHJldHVybiBjaGVja2VkSXRlbXMubGVuZ3RoID4gMDtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGl0ZW0ucmFkaW9PcHRpb25zLnNvbWUoKHJvKSA9PiByby5zZWxlY3RlZCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSB8fCBpdGVtLm51bWJlclJhbmdlLnRvKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0IHx8IGl0ZW0uZGF0ZVJhbmdlLmVuZCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oaXRlbS5kYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2hUZXh0Q2hhbmdlZCgpIHtcbiAgICAvLyBydW4gdGhlIGxhenkgbG9hZGluZ1xuICAgIC8vIHRoZSBmaWx0ZXJJdGVtcyBjYWxsZWQgZnJvbSBvbkNoYW5nZXMsIHNvIGNhbGwgbGF6eSBsb2FkaW5nIG9ubHkgb24gc2VhcmNoIGNoYW5nZVxuICAgIHRoaXMucmVzZXRMYXp5TG9hZGluZ1NvdXJjZXMoZmFsc2UpO1xuXG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNldExhenlMb2FkaW5nU291cmNlcyhzaG93U2VsZWN0ZWRPblRvcDogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWdJdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAgIGNvbmZpZ0l0ZW0uY2FuTG9hZE1vcmUgPSB0cnVlO1xuICAgICAgICBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgICByZXF1ZXN0cy5wdXNoKHRoaXMubG9hZE1vcmUoY29uZmlnSXRlbSwgc2hvd1NlbGVjdGVkT25Ub3ApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cyk7XG5cbiAgICAvLyBmaWx0ZXIgbm9uLWxhenkgbG9hZGluZyBpdGVtc1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVySXRlbXMoKSB7XG4gICAgbGV0IGhhc0RhdGEgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgY29uZmlnSXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGNvbmZpZ0l0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZ0l0ZW0uaXNMb2FkaW5nTm93KSB7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIGRhdGEgYXZhaWxhYmxlIGluIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2U/Lmxlbmd0aCkge1xuICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGlzVHJlZSA9IHRoaXMuaGFzVHJlZURhdGEoY29uZmlnSXRlbSk7XG4gICAgICAgICAgaWYgKGlzVHJlZSAmJiB0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgbG9jYWwgbG9va3VwIG1hcCBmb3IgYW5jZXN0b3IgdHJhdmVyc2FsXG4gICAgICAgICAgICBjb25zdCBsb2NhbE1hcCA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBEYXRhU291cmNlPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgbG9jYWxNYXAuc2V0KGVsLmlkLCBlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciB0cmVlIGRhdGEsIGluY2x1ZGUgbWF0Y2hpbmcgaXRlbXMgYW5kIHRoZWlyIGFuY2VzdG9yc1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgY29uZmlnSXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkTmFtZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGVsLm5hbWUgPT09ICdudW1iZXInID8gZWwubmFtZS50b1N0cmluZygpIDogZWwubmFtZTtcbiAgICAgICAgICAgICAgaWYgKHByZXBhcmVkTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoaW5nSWRzLmFkZChlbC5pZCk7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGFsbCBhbmNlc3RvcnNcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudCA9IGVsO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50LnBhcmVudElkKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGluZ0lkcy5hZGQoY3VycmVudC5wYXJlbnRJZCk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbG9jYWxNYXAuZ2V0KGN1cnJlbnQucGFyZW50SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsKSA9PiBtYXRjaGluZ0lkcy5oYXMoZWwuaWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gQXV0by1leHBhbmQgcGFyZW50cyB3aGVuIHNlYXJjaGluZ1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBpZiAoZWwuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVsLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gdGhpcy5zb3J0VHJlZU9yZGVyKGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlLCBsb2NhbE1hcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcigoZWwpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWROYW1lID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgZWwubmFtZSA9PT0gJ251bWJlcicgPyBlbC5uYW1lLnRvU3RyaW5nKCkgOiBlbC5uYW1lO1xuICAgICAgICAgICAgICByZXR1cm4gcHJlcGFyZWROYW1lXG4gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNUcmVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFwID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIERhdGFTb3VyY2U+KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgY29uZmlnSXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxNYXAuc2V0KGVsLmlkLCBlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSB0aGlzLnNvcnRUcmVlT3JkZXIoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UsIGxvY2FsTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS50eXBlID09PSAnZGF0ZVJhbmdlJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ICYmXG4gICAgICAgICAgIUJvb2xlYW4oY29uZmlnSXRlbS5kYXRlUmFuZ2Uuc3RhcnQgfHwgY29uZmlnSXRlbS5kYXRlUmFuZ2UuZW5kKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZ0l0ZW0udHlwZSA9PT0gJ251bWJlclJhbmdlJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ICYmXG4gICAgICAgICAgIUJvb2xlYW4oY29uZmlnSXRlbS5udW1iZXJSYW5nZS5mcm9tIHx8IGNvbmZpZ0l0ZW0ubnVtYmVyUmFuZ2UudG8pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNob3dOb0ZpbHRlclJlc3VsdCA9IHRoaXMuc2VhcmNoVGV4dCAmJiAhaGFzRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkTW9yZShpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSwgc2hvd1NlbGVjdGVkT25Ub3A6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaXRlbS5pc0xvYWRpbmdOb3cgPSB0cnVlO1xuICAgICAgaWYgKCFpdGVtLmxhenlMb2FkZXIpIHtcbiAgICAgICAgdGhyb3cgYGxvYWRlciBpcyBub3QgYXZhaWxhYmxlYDtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpIHtcbiAgICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gbG9hZCBmaXJzdCAxMCByZWNvcmRzIGZvciB0aGUgdGhlIGZpcnN0IHRpbWVcbiAgICAgIGNvbnN0IGxpbWl0ID0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoID09IDAgPyAxMCA6IDEwMDtcbiAgICAgIGNvbnN0IG5ld0l0ZW1zID0gYXdhaXQgaXRlbS5sYXp5TG9hZGVyKFxuICAgICAgICB7IHRleHQ6IHRoaXMuc2VhcmNoVGV4dCB8fCAnJyB9LFxuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGgsXG4gICAgICAgIGxpbWl0XG4gICAgICApO1xuXG4gICAgICBpdGVtLmNhbkxvYWRNb3JlID0gbmV3SXRlbXMubGVuZ3RoID09IGxpbWl0O1xuXG4gICAgICAvLyB0aGUgZmlsdGVyZWREYXRhU291cmNlIGNvbnRhaW5zIHRoZSBpdGVtcyB0aGF0IGlzIHZpc2lsaWJsZSB0byB1c2VyIGF0IHRoZSBjdXJyZW50IG1vbWVudFxuICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5jb25jYXQobmV3SXRlbXMpO1xuXG4gICAgICAvLyB0aGUgZGF0YVNvdXJjZSBjb250YWlucyB0aGUgc2VsZWN0ZWQgaXRlbXNcbiAgICAgIGNvbnN0IGNoZWNrZWRJZHMgPSBpdGVtLmRhdGFTb3VyY2VcbiAgICAgICAgLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKVxuICAgICAgICAubWFwKChpKSA9PiBpLmlkKTtcblxuICAgICAgaWYgKHNob3dTZWxlY3RlZE9uVG9wKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgY2hlY2tlZCBpdGVtcyBmaXJzdFxuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmZpbHRlcihcbiAgICAgICAgICAoaSkgPT4gIWNoZWNrZWRJZHMuaW5jbHVkZXMoaS5pZClcbiAgICAgICAgKTtcbiAgICAgICAgLy8gYWRkIGFsbCBjaGVja2VkIGl0ZW1zIHRvIHRoZSB0b3BcbiAgICAgICAgY29uc3QgY2hlY2tlZEl0ZW1zID0gaXRlbS5kYXRhU291cmNlLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKTtcbiAgICAgICAgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBjaGVja2VkSXRlbXMuY29uY2F0KGl0ZW0uZmlsdGVyZWREYXRhU291cmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1hcmsgYXMgY2hlY2tlZCBiYXNlZCBvbiB0aGUgZGF0YVNvdXJjZVxuICAgICAgICBmb3IgKGxldCBkc0l0ZW0gb2YgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpIHtcbiAgICAgICAgICBkc0l0ZW0uY2hlY2tlZCA9IGNoZWNrZWRJZHMuaW5jbHVkZXMoZHNJdGVtLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpdGVtLmlzTG9hZGluZ05vdyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVJdGVtKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG4gICAgaXRlbS5leHBhbmRlZCA9ICFpdGVtLmV4cGFuZGVkO1xuXG4gICAgaWYgKGl0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgaWYgKGl0ZW0uZXhwYW5kZWQpIHtcbiAgICAgICAgaWYgKGl0ZW0uY2FuTG9hZE1vcmUgIT09IGZhbHNlICYmICFpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5sb2FkTW9yZShpdGVtLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RmlsdGVycygpIHtcbiAgICBsZXQgc2VsZWN0QWxsID0gdGhpcy5yZXNldEJlaGF2aW9yID09PSAnc2V0X2FsbCc7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZU9wdGlvbnMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICBpdGVtLmlzU2VsZWN0ZWRBbGwgPSBzZWxlY3RBbGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBkc0l0ZW0gb2YgaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgZHNJdGVtLmNoZWNrZWQgPSBzZWxlY3RBbGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uZGF0ZVJhbmdlKSB7XG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLm51bWJlclJhbmdlKSB7XG4gICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UgPSB7IGZyb206IG51bGwsIHRvOiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLmRhdGUpIHtcbiAgICAgICAgaXRlbS5kYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgIGl0ZW0uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICBpdGVtLnJhZGlvT3B0aW9ucy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuaWQgPT09IGl0ZW0uc2VsZWN0ZWRSYWRpbykge1xuICAgICAgICAgICAgZS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGUuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZVByZXZpb3VzQXBwbGllZCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBkYXRhSXRlbSBvZiBpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgZGF0YUl0ZW0uY2hlY2tlZCA9IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgID8gc2VsZWN0aW9uLmluY2x1ZGVzKGRhdGFJdGVtLmlkKVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV0gfHwge1xuICAgICAgICAgICAgc3RhcnQ6IG51bGwsXG4gICAgICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XSB8fCB7fTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgICBpdGVtLmRhdGVSYW5nZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICBpdGVtLmRhdGUgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgIGl0ZW0uc2VsZWN0ZWRSYWRpbyA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xuXG4gICAgdGhpcy5maWx0ZXIgPSB0aGlzLmdldEZpbHRlck9iamVjdCgpO1xuICAgIHRoaXMucmVzZXRlZEZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG5cbiAgICB0aGlzLnJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseSgpIHtcbiAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBpdGVyYXRvciBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgY29uc3QgaXRlbUZsYWcgPSB0aGlzLm9uQ2hlY2tWYWxpZGl0eShpdGVyYXRvcik7XG4gICAgICBpZiAoIWl0ZW1GbGFnKSB7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLmVycm9yTWVzc2FnZSA9IFtdKSwgNTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gW107XG4gICAgfVxuICAgIHRoaXMubGFzdEFwcGxpZWRGaWx0ZXIgPSBVdGlsLmNsb25lKHRoaXMuZmlsdGVyKTtcblxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXIpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBhcHBseSBzdGF0ZVxuICAgIHRoaXMudXBkYXRlQXBwbGllZFN0YXRlKCk7XG5cbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQXBwbGllZFN0YXRlKCkge1xuICAgIHRoaXMuaXNBcHBsaWVkID0gZmFsc2U7XG4gICAgLy8gc2hvd2luZyBjaGVja2VkIGl0ZW1zIG9uIHRvcCBvZiB0aGUgbGlzdFxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICAvLyByZXNvcnQgZmlyc3QgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgaXRlbS5kYXRhU291cmNlLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcblxuICAgICAgICAvLyB0aGVuIHNvcnQgYmFzZWQgb24gY2hlY2tlZCBpdGVtcyBhZ2FpblxuICAgICAgICBpdGVtLmRhdGFTb3VyY2Uuc29ydChcbiAgICAgICAgICAoYTogRGF0YVNvdXJjZSwgYjogRGF0YVNvdXJjZSkgPT5cbiAgICAgICAgICAgIE51bWJlcihiLmNoZWNrZWQgfHwgMCkgLSBOdW1iZXIoYS5jaGVja2VkIHx8IDApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5yZXNldGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIEZpbHRlciB3YXMgcmVzZXQsIHNvIGNvbXBhcmUgdGhlIHJlc2V0IGZpbHRlciBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBmaWx0ZXJcbiAgICAgICAgLy8gV2hlbiB1c2VyIGNsaWNrIG9uIFJlc2V0IGFuZCBUaGVuIEFwcGx5LCBmaWx0ZXIgbXVzdCB1bmhpZ2hsaWdodGVkXG4gICAgICAgIGlmIChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnJlc2V0ZWRGaWx0ZXIpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pc0FwcGxpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzQXBwbGllZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXJDbGFzcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3Rpb24tbWVudS1ib2R5Jyk7XG4gICAgaWYgKHRoaXMud3JhcHBlckJvZHlDbGFzcykge1xuICAgICAgd3JhcHBlckNsYXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7dGhpcy53cmFwcGVyQm9keUNsYXNzfWApO1xuICAgIH1cbiAgICBpZiAod3JhcHBlckNsYXNzKSB7XG4gICAgICB3cmFwcGVyQ2xhc3Muc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnYXV0bycgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJPYmplY3QoKSB7XG4gICAgY29uc3QgZmlsdGVyID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ211bHRpc2VsZWN0JzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRhU291cmNlICYmIGl0ZW0uZGF0YVNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRJZHMgPSBpdGVtLmRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgLmZpbHRlcigoaSkgPT4gaS5jaGVja2VkKVxuICAgICAgICAgICAgICAubWFwKChpKSA9PiBpLmlkKTtcblxuICAgICAgICAgICAgaWYgKGNoZWNrZWRJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBjaGVja2VkSWRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRlUmFuZ2UgJiYgaXRlbS5kYXRlUmFuZ2Uuc3RhcnQgJiYgaXRlbS5kYXRlUmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5kYXRlUmFuZ2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0/Lm51bWJlclJhbmdlPy5mcm9tID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0/Lm51bWJlclJhbmdlPy50byA9PT0gJ251bWJlcidcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLm51bWJlclJhbmdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICBpZiAoaXRlbS5kYXRlKSB7XG4gICAgICAgICAgICBmaWx0ZXJbaXRlbS5rZXldID0gaXRlbS5kYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLnJhZGlvT3B0aW9ucy5maW5kKChybykgPT4gcm8uc2VsZWN0ZWQpPy5pZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgcHVibGljIGhpZGUoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG5cbiAgICB0aGlzLmlzVmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyByYWRpb0NoYW5nZWQodmFsdWU6IHN0cmluZywgaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiB2b2lkIHtcbiAgICBpdGVtLnJhZGlvT3B0aW9ucy5mb3JFYWNoKChvcHQpID0+IChvcHQuc2VsZWN0ZWQgPSBvcHQuaWQgPT09IHZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tDaGFuZ2VkKGl0ZW06IERhdGFTb3VyY2UsIGNvbmZpZ0l0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogdm9pZCB7XG4gICAgaWYgKGNvbmZpZ0l0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgLy8gc3RvcmUgdGhlIGNoZWNrIGl0ZW1zIGluIHRoZSBkYXRhIHNvdXJjZVxuICAgICAgY29uc3QgZXhpc3RJdGVtID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbmQoKGkpID0+IGkuaWQgPT0gaXRlbS5pZCk7XG4gICAgICBpZiAoZXhpc3RJdGVtKSB7XG4gICAgICAgIGV4aXN0SXRlbS5jaGVja2VkID0gaXRlbS5jaGVja2VkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmlnSXRlbS5kYXRhU291cmNlLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICAvLyBrZWVwIG9ubHkgY2hlY2tlZFxuICAgICAgY29uZmlnSXRlbS5kYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcigoZCkgPT4gZC5jaGVja2VkKTtcbiAgICB9XG4gICAgLy8gRm9yIHRyZWUgaXRlbXMsIHplbi1ncm91cHMgaGFuZGxlcyBjYXNjYWRlIGludGVybmFsbHlcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XG4gICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gICAgdGhpcy5mb2N1c1NlYXJjaEJveCgpO1xuXG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLnJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNoZWNrVmFsaWRpdHkoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBpdGVtLm51bWJlclJhbmdlLmZyb20gPT09ICdudW1iZXInICYmXG4gICAgICAgIHR5cGVvZiBpdGVtLm51bWJlclJhbmdlLnRvID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBpdGVtLm51bWJlclJhbmdlLmZyb20gPiBpdGVtLm51bWJlclJhbmdlLnRvXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICBgSW52YWxpZCBOdW1iZXIgcmFuZ2U6IFRoZSBNaW4gbnVtYmVyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIE1heCBudW1iZXIuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0ICYmXG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlLmVuZCAmJlxuICAgICAgICBuZXcgRGF0ZShpdGVtLmRhdGVSYW5nZS5zdGFydCkgPiBuZXcgRGF0ZShpdGVtLmRhdGVSYW5nZS5lbmQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICBgSW52YWxpZCBEYXRlIHJhbmdlOiBUaGUgU3RhcnQgZGF0ZSBjYW5ub3QgYmUgYWZ0ZXIgdGhlIEVuZCBkYXRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQbGFjZW1lbnQocG9zOiAnZml4ZWQnIHwgJ2Fic29sdXRlJyA9ICdmaXhlZCcpIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGhvc3QucXVlcnlTZWxlY3RvcignLm1lbnUtY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID1cbiAgICAgIHBvcyA9PT0gJ2ZpeGVkJ1xuICAgICAgICA/IGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgOiBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IHJlY3QubGVmdDtcbiAgICBjb25zdCByaWdodCA9IHJlY3QucmlnaHQ7XG4gICAgY29uc3QgdG9wID0gcmVjdC50b3A7XG4gICAgY29uc3QgYm90dG9tID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wO1xuXG4gICAgaWYgKHBvcyA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsICdhYnNvbHV0ZScpO1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShjb250YWluZXIsICdpbnNldCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNvbnRhaW5lciwgJ2Fic29sdXRlJyk7XG4gICAgfVxuXG4gICAgaWYgKHBvcyA9PT0gJ2ZpeGVkJykge1xuICAgICAgaWYgKHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2F1dG8nKSkge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsUG9zaXRpb24gPSB0aGlzLmdldEhvcml6b250YWxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm1lbnVSaWdodCA9XG4gICAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uID09PSAnbGVmdCdcbiAgICAgICAgICAgID8gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGBcbiAgICAgICAgICAgIDogJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9IGhvcml6b250YWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IGAke2xlZnR9cHhgIDogJ3Vuc2V0JztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnbGVmdCcpKSB7XG4gICAgICAgIHRoaXMubWVudVJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGA7XG4gICAgICAgIHRoaXMubWVudUxlZnQgPSAndW5zZXQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgICB0aGlzLm1lbnVSaWdodCA9ICd1bnNldCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdhdXRvJykpIHtcbiAgICAgICAgY29uc3QgdmVydGljYWxQb3NpdGlvbiA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm1lbnVUb3AgPVxuICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb24gPT09ICdib3R0b20nID8gYCR7dG9wICsgNDJ9cHhgIDogJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51Qm90dG9tID0gdmVydGljYWxQb3NpdGlvbiA9PT0gJ3RvcCcgPyBgJHtib3R0b219cHhgIDogJ3Vuc2V0JztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygndG9wJykpIHtcbiAgICAgICAgdGhpcy5tZW51VG9wID0gJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51Qm90dG9tID0gYCR7Ym90dG9tICsgMTB9cHhgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZW51VG9wID0gYCR7dG9wICsgNTV9cHhgO1xuICAgICAgICB0aGlzLm1lbnVCb3R0b20gPSAndW5zZXQnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmVydGljYWxDbGFzcyA9ICcnO1xuICAgICAgbGV0IGhvcml6b250YWxDbGFzcyA9ICcnO1xuXG4gICAgICBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnYXV0bycpKSB7XG4gICAgICAgIGhvcml6b250YWxDbGFzcyA9IHRoaXMuZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG4gICAgICAgIHZlcnRpY2FsQ2xhc3MgPSB0aGlzLmdldFZlcnRpY2FsUG9zaXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhvcml6b250YWxDbGFzcyA9IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2xlZnQnKSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICAgIHZlcnRpY2FsQ2xhc3MgPSB0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgICB9XG4gICAgICBbXG4gICAgICAgICdkcm9wZG93bi1sZWZ0JyxcbiAgICAgICAgJ2Ryb3Bkb3duLXJpZ2h0JyxcbiAgICAgICAgJ2Ryb3Bkb3duLXRvcCcsXG4gICAgICAgICdkcm9wZG93bi1ib3R0b20nLFxuICAgICAgXS5mb3JFYWNoKChjKSA9PiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNvbnRhaW5lciwgYykpO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsIGBkcm9wZG93bi0ke2hvcml6b250YWxDbGFzc31gKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY29udGFpbmVyLCBgZHJvcGRvd24tJHt2ZXJ0aWNhbENsYXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVydGljYWxQb3NpdGlvbigpOiAnYm90dG9tJyB8ICd0b3AnIHtcbiAgICBjb25zdCB0b3AgPVxuICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICByZXR1cm4gdG9wID4gd2luZG93LmlubmVySGVpZ2h0IC8gMiA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIH1cblxuICBwcml2YXRlIGdldEhvcml6b250YWxQb3NpdGlvbigpOiAncmlnaHQnIHwgJ2xlZnQnIHtcbiAgICBjb25zdCBsZWZ0ID1cbiAgICAgIHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHJldHVybiBsZWZ0ID4gd2luZG93LmlubmVyV2lkdGggLyAyID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWZhdWx0RGF0ZVJhbmdlT3B0aW9ucygpOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRhdGVSYW5nZTogRGF0ZVJhbmdlO1xuICB9W10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdUb2RheScsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdZZXN0ZXJkYXknLFxuICAgICAgICBkYXRlUmFuZ2U6IHtcbiAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJykuZW5kT2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1RoaXMgV2VlaycsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCd3ZWVrJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignd2VlaycpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0xhc3QgV2VlaycsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCg3LCAnZGF5cycpLnN0YXJ0T2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDcsICdkYXlzJykuZW5kT2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdUaGlzIE1vbnRoJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdMYXN0IE1vbnRoJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc29ydFRyZWVPcmRlcihpdGVtczogRGF0YVNvdXJjZVtdLCB0cmVlTWFwOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBEYXRhU291cmNlPik6IERhdGFTb3VyY2VbXSB7XG4gICAgY29uc3QgaXRlbVNldCA9IG5ldyBTZXQoaXRlbXMubWFwKGkgPT4gaS5pZCkpO1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcbiAgICBjb25zdCBvcmRlcmVkOiBEYXRhU291cmNlW10gPSBbXTtcbiAgICBjb25zdCB2aXNpdCA9IChpdGVtOiBEYXRhU291cmNlKSA9PiB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoaXRlbS5pZCkpIHJldHVybjtcbiAgICAgIGlmICghaXRlbVNldC5oYXMoaXRlbS5pZCkpIHJldHVybjtcbiAgICAgIHZpc2l0ZWQuYWRkKGl0ZW0uaWQpO1xuICAgICAgb3JkZXJlZC5wdXNoKGl0ZW0pO1xuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2YgaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gdHJlZU1hcC5nZXQoY2hpbGRJZCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICB2aXNpdChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnBhcmVudElkID09IG51bGwpIHtcbiAgICAgICAgdmlzaXQoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhpdGVtLmlkKSkge1xuICAgICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlcmVkO1xuICB9XG5cbiAgcHVibGljIGhhc1RyZWVEYXRhKGNvbmZpZ0l0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpZ0l0ZW0uZGF0YVNvdXJjZT8uc29tZShkID0+IGQuY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHx8IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURhdGVSYW5nZU9wdGlvbkNsaWNrKGl0ZW0sIG9wdGlvbikge1xuICAgIGl0ZW0uZGF0ZVJhbmdlID0gb3B0aW9uLmRhdGVSYW5nZTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPSBvcHRpb24ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXN0b21EYXRlUmFuZ2VDbGljayhpdGVtKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID0gJ0N1c3RvbSc7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW5kRGF0ZUNoYW5nZShpdGVtKSB7XG4gICAgaWYgKCFpdGVtLnNob3dUaW1lKSB7XG4gICAgICBpdGVtLmRhdGVSYW5nZS5lbmQgPSBtb21lbnQoaXRlbS5kYXRlUmFuZ2UuZW5kKS5lbmRPZignZGF5JykudG9EYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBoYXNNdWx0aXNlbGVjdEl0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pdGVtcy5zb21lKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0JyAmJiBpdGVtLmRhdGFTb3VyY2U/Lmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcgJiYgaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgIGNvdW50ICs9IGl0ZW0uZGF0YVNvdXJjZS5maWx0ZXIoKGQpID0+IGQuY2hlY2tlZCkubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmaWx0ZXJzLWNvbXBvbmVudFwiXG4gICAgICNtYWluQ29tcG9uZW50XG4gICAgIGNsaWNrLW91dD1cImlzVmlzaWJsZSAmJiBoaWRlKClcIj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tVHJpZ2dlclwiPlxuICAgICAgICA8emVuLWJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICAgICAgICAgICAgICBbdmFyaWFudF09XCJpc0FwcGxpZWQgPyAnc2Vjb25kYXJ5JyA6ICdzZWNvbmRhcnktZ3JheSdcIlxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlciB7e2lzQXBwbGllZCA/ICdhcHBsaWVkJyA6ICcnfX1cIj5cbiAgICAgICAgICAgIDx6ZW4taWNvbiBbc3JjXT1cImltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImltYWdlVXJsXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmlsdGVyLWljb24gbWF0ZXJpYWwtaWNvbnNcIlxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaW1hZ2VVcmxcIj5maWx0ZXJfbGlzdDwvaT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC96ZW4tYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJjdXN0b21UcmlnZ2VyXCI+PC9uZy1jb250ZW50PlxuXG4gICAgPGRpdiBbaGlkZGVuXT1cIiFpc1Zpc2libGVcIlxuICAgICAgICAgY2xhc3M9XCJhY3Rpb24tbWVudSBtZW51LWNvbnRlbnRcIlxuICAgICAgICAgW2NsYXNzLmN1c3RvbVRyaWdnZXJdPVwiY3VzdG9tVHJpZ2dlclwiXG4gICAgICAgICBbbmdTdHlsZV09XCJ7ICdsZWZ0JzogbWVudUxlZnQsICdyaWdodCc6IG1lbnVSaWdodCwgJ3RvcCc6IG1lbnVUb3AsICdib3R0b20nOiBtZW51Qm90dG9tICB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbWVudS1oZWFkZXJcIj5cbiAgICAgICAgICAgIDx6ZW4tc2VhcmNoLWJveCBbKHRleHQpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzZWFyY2hCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGV4dENoYW5nZSk9XCJzZWFyY2hUZXh0Q2hhbmdlZCgpXCI+PC96ZW4tc2VhcmNoLWJveD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWJvZHkgaXRlbXMtd3JhcHBlclwiXG4gICAgICAgICAgICAgbmdDbGFzcz1cInt7d3JhcHBlckJvZHlDbGFzc319XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3JNZXNzYWdlLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBlcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVycm9yLW1zZ1wiPnt7aXRlbSB8IHRyYW5zbGF0ZSB9fTwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb25maWcuaXRlbXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNZW51SXNWaXNpYmxlKGl0ZW0pXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXZpZGVyIGJldHdlZW4gdHdvIGZpbHRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2RpdmlkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZpbHRlci1kaXZpZGVyXCI+PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJvb2xlYW4gdG9nZ2xlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAndG9nZ2xlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbSB0b2dnbGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLXRvZ2dsZS1zbGlkZSBbKGVuYWJsZWQpXT1cIml0ZW0uZW5hYmxlZFwiPjwvemVuLXRvZ2dsZS1zbGlkZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1pdGVtIGV4cGFuZGVyLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlICE9ICd0b2dnbGUnICYmIGl0ZW0udHlwZSAhPSAnZGl2aWRlcicgJiYgIWl0ZW0uZGlzYWJsZUNvbGxhcHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbShpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBhbmRlci10aXRsZVwiPnt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBleHBhbmQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGl0ZW0uZXhwYW5kZWR9XCI+ZXhwYW5kX21vcmU8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbSBzZWN0aW9uLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSAhPSAndG9nZ2xlJyAmJiBpdGVtLnR5cGUgIT0gJ2RpdmlkZXInICYmIGl0ZW0uZGlzYWJsZUNvbGxhcHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udGl0bGUgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5leHBhbmRlZCB8fCBpdGVtLmRpc2FibGVDb2xsYXBzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiaXRlbS50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbXVsdGlzZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGF6eSBsb2FkaW5nIG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmlzTGF6eUxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3ggZHMtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYmFkZ2VdPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggWyhjaGVja2VkKV09XCJkc0l0ZW0uY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZHNJdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZChkc0l0ZW0sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yID8gJycgOiAoZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUpXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1pdGVtLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQnOiBkc0l0ZW0uYmFkZ2VCZ0NvbG9yLCAnY29sb3InOiBkc0l0ZW0uYmFkZ2VDb2xvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmNhbkxvYWRNb3JlICYmICFpdGVtLmlzTG9hZGluZ05vd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZShpdGVtLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tc3Ryb2tlZCBmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0xvYWQgTW9yZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5pc0xvYWRpbmdOb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvYWRlci1tb3JlLXNwaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXNwaW5uZXIgc2l6ZT1cInNtYWxsXCI+PC96ZW4tc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uaXNMYXp5TG9hZGluZyAmJiAhaGFzVHJlZURhdGEoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBkcy1pdGVtIHNlbGVjdC1hbGxcIiAqbmdJZj1cIiFpdGVtLmhpZGVTZWxlY3RBbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94ICpuZ0lmPVwiaXRlbS5kYXRhU291cmNlLmxlbmd0aCA9PT0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2hlY2tlZCldPVwiaXRlbS5pc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzSXRlbUFjdGl2ZShpdGVtKSAmJiAhaXRlbS5pc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IEFsbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwib25TZWxlY3RBbGwoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkc0l0ZW0gb2YgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtLWNoZWNrYm94IGRzLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJhZGdlXT1cImRzSXRlbS5iYWRnZUJnQ29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94IFsoY2hlY2tlZCldPVwiZHNJdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cImRzSXRlbS5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJjaGVja0NoYW5nZWQoZHNJdGVtLCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZHNJdGVtLmJhZGdlQmdDb2xvciA/ICcnIDogKGRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlKVwiPjwvemVuLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItaXRlbS1iYWRnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kJzogZHNJdGVtLmJhZGdlQmdDb2xvciwgJ2NvbG9yJzogZHNJdGVtLmJhZGdlQ29sb3J9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVHJlZSB2aWV3IG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZ3JvdXBzICpuZ0lmPVwiIWl0ZW0uaXNMYXp5TG9hZGluZyAmJiBoYXNUcmVlRGF0YShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cIml0ZW0uZGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJlZERhdGFTb3VyY2VdPVwiaXRlbS5maWx0ZXJlZERhdGFTb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdEFsbF09XCJpdGVtLmhpZGVTZWxlY3RBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5saW5lXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhpc1NlbGVjdGVkQWxsKV09XCJpdGVtLmlzU2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJjaGVja0NoYW5nZWQoJGV2ZW50LCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1ncm91cHM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGUgcmFuZ2UgcGlja2VyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidkYXRlUmFuZ2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gIE9wdGlvbnMgZGF0ZSByYW5nZSB2aWV3ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uZGF0ZVJhbmdlT3B0aW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaXRlbS5kYXRlUmFuZ2VPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1yYWRpbyBbdmFsdWVdPVwib3B0aW9uLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubmFtZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID09PSBvcHRpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhZGlvQ2hhbmdlKT1cImhhbmRsZURhdGVSYW5nZU9wdGlvbkNsaWNrKGl0ZW0sIG9wdGlvbilcIj48L3plbi1yYWRpbz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXJhZGlvIFt2YWx1ZV09XCInQ3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0N1c3RvbScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPT09ICdDdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyYWRpb0NoYW5nZSk9XCJoYW5kbGVDdXN0b21EYXRlUmFuZ2VDbGljayhpdGVtKVwiPjwvemVuLXJhZGlvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zW2l0ZW0ua2V5XSA9PT0gJ0N1c3RvbSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydGcm9tJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWRhdGVwaWNrZXIgY2xhc3M9XCJ3aWR0aC1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2Uuc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J1RvJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWRhdGVwaWNrZXIgY2xhc3M9XCJ3aWR0aC1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2UuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5UG9zaXRpb25dPVwiaXRlbS5jb25maWc/LnlQb3NpdGlvbiA/PyBkYXRlcGlja2VyUG9zaXRpb24uQVVUT1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJoYW5kbGVFbmREYXRlQ2hhbmdlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gIERlZmF1bHQgZGF0ZSByYW5nZSB2aWV3ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtLmRhdGVSYW5nZU9wdGlvbnM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRzLWl0ZW0gZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydGcm9tJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGRhdGUpXT1cIml0ZW0uZGF0ZVJhbmdlLnN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50Q29udGFpbmVyXT1cIm1haW5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J1RvJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGRhdGUpXT1cIml0ZW0uZGF0ZVJhbmdlLmVuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiaGFuZGxlRW5kRGF0ZUNoYW5nZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGUgcGlja2VyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snRGF0ZScgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIHJhbmdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXJSYW5nZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItcm93IG51bWJlci1yYW5nZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydNaW4nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLm51bWJlclJhbmdlLmZyb21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydNYXgnIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLm51bWJlclJhbmdlLnRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJhZGlvIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidyYWRpbydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGl0ZW0ucmFkaW9PcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtLXJhZGlvIGRzLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tcmFkaW8gW3ZhbHVlXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubmFtZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cIm9wdGlvbi5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJvcHRpb24uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFkaW9DaGFuZ2UpPVwicmFkaW9DaGFuZ2VkKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCI+PC96ZW4tcmFkaW8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd05vRmlsdGVyUmVzdWx0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm8taXRlbVwiPnt7J05vIFJlc3VsdHMgRm91bmQnIHwgdHJhbnNsYXRlfX0uLjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWZvb3RlciBmaWx0ZXItZm9vdGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLWNvdW50XCIgKm5nSWY9XCJoYXNNdWx0aXNlbGVjdEl0ZW1zXCI+e3sgc2VsZWN0ZWRDb3VudCB9fSB7eydTZWxlY3RlZCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItZm9vdGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyZXNldCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLWJ0bi1jbGVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXNlbGVjdGlvbl09XCJzZWxlY3RlZENvdW50ID4gMCAmJiBoYXNNdWx0aXNlbGVjdEl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J0NsZWFyIEZpbHRlcicgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFwcGx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItYnRuLWFwcGx5XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J0FwcGx5JyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
|