mmhglobal-dynamicform 2.34.0 → 2.36.0
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/README.md +29 -0
- package/esm2020/lib/components/datalistingfieldbase.component.mjs +2 -2
- package/esm2020/lib/components/fieldbase.component.mjs +4 -1
- package/esm2020/lib/embed-components/input-field-addons/input-field-addons.component.mjs +1 -1
- package/esm2020/lib/kcard/kcard.component.mjs +1 -1
- package/esm2020/lib/services/main.service.mjs +2 -2
- package/esm2020/lib/services/zcomponent.debug.service.mjs +61 -53
- package/esm2020/lib/sfdatetimepicker/sfdatetimepicker.component.mjs +5 -3
- package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +1 -1
- package/esm2020/lib/uibulletin/uibulletin.component.mjs +1 -1
- package/esm2020/lib/uicontent/uicontent.component.mjs +5 -3
- package/esm2020/lib/virtual-scroll/virtual-scroll.component.mjs +20 -3
- package/esm2020/lib/zbuttons/zbuttons.component.mjs +1 -1
- package/esm2020/lib/zcard/zcard.component.mjs +2 -2
- package/esm2020/lib/zdatetime/zdatetime.component.mjs +1 -1
- package/esm2020/lib/zform/zform.component.mjs +4 -3
- package/esm2020/lib/zgrid/container/zgrid-container.component.mjs +1 -1
- package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +139 -139
- package/esm2020/lib/zgrid/zgrid.component.mjs +57 -33
- package/esm2020/lib/zgrid/zgrid.service.mjs +62 -58
- package/esm2020/lib/zinput-container/zinput-container.component.mjs +2 -2
- package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +1 -1
- package/esm2020/lib/zmodal/zmodal.component.mjs +1 -1
- package/esm2020/lib/zreport/zreport.component.mjs +11 -14
- package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +30 -23
- package/esm2020/lib/ztab/ztab.component.mjs +2 -2
- package/esm2020/lib/ztree/ztree.component.mjs +1 -1
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +1 -1
- package/esm2020/lib/zudf/zudf.component.mjs +45 -10
- package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +1 -1
- package/fesm2015/mmhglobal-dynamicform.mjs +466 -377
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +445 -347
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/lib/components/fieldbase.component.d.ts +1 -0
- package/lib/services/zcomponent.debug.service.d.ts +1 -0
- package/lib/sfdatetimepicker/sfdatetimepicker.component.d.ts +1 -0
- package/lib/uicontent/uicontent.component.d.ts +2 -0
- package/lib/virtual-scroll/virtual-scroll.component.d.ts +1 -0
- package/lib/zgrid/zgrid.binding.directive.d.ts +5 -6
- package/lib/zgrid/zgrid.component.d.ts +5 -3
- package/lib/zgrid/zgrid.service.d.ts +10 -16
- package/lib/zreport/zreport.component.d.ts +0 -1
- package/lib/zselectmultiple/zselectmultiple.component.d.ts +4 -1
- package/lib/zudf/zudf.component.d.ts +5 -2
- package/package.json +1 -1
|
@@ -12,8 +12,7 @@ import { DataListingFieldBase } from "../components/datalistingfieldbase.compone
|
|
|
12
12
|
import { hideAndShowVerticalAnimation } from "../animations/component-animations";
|
|
13
13
|
import { ComponentConstant } from "../constants/constant";
|
|
14
14
|
import { ElementContainerDirective } from "../directives/elementcontainer.directive";
|
|
15
|
-
import { ZGroup, ZComponentHelper } from 'mmhglobal-zcore';
|
|
16
|
-
import { GridSettingType, GridStateLogicType } from "./zgrid.service";
|
|
15
|
+
import { ZGroup, ZComponentHelper, StateType } from 'mmhglobal-zcore';
|
|
17
16
|
import * as i0 from "@angular/core";
|
|
18
17
|
import * as i1 from "../services/zcomponent.service";
|
|
19
18
|
import * as i2 from "mmhglobal-zcore";
|
|
@@ -40,7 +39,7 @@ import * as i22 from "./zgrid.binding.directive";
|
|
|
40
39
|
import * as i23 from "@progress/kendo-angular-buttons";
|
|
41
40
|
import * as i24 from "../pipe/htmlSanitize.pipe";
|
|
42
41
|
export class ZgridComponent extends DataListingFieldBase {
|
|
43
|
-
constructor(componentService, fontAweSomeService, activatedRoute, router, formBuilder, webApiService, toastService, zcoreService, storageService, mainService, cdr, gridService,
|
|
42
|
+
constructor(componentService, fontAweSomeService, activatedRoute, router, formBuilder, webApiService, toastService, zcoreService, storageService, mainService, cdr, gridService, stateSettingService, resourceApiService, authService) {
|
|
44
43
|
super(componentService);
|
|
45
44
|
this.componentService = componentService;
|
|
46
45
|
this.fontAweSomeService = fontAweSomeService;
|
|
@@ -54,8 +53,9 @@ export class ZgridComponent extends DataListingFieldBase {
|
|
|
54
53
|
this.mainService = mainService;
|
|
55
54
|
this.cdr = cdr;
|
|
56
55
|
this.gridService = gridService;
|
|
57
|
-
this.
|
|
56
|
+
this.stateSettingService = stateSettingService;
|
|
58
57
|
this.resourceApiService = resourceApiService;
|
|
58
|
+
this.authService = authService;
|
|
59
59
|
// @ViewChild(ZGridBindingDirective, { static: false }) zgrid: ZGridBindingDirective;
|
|
60
60
|
this.zgrid = null;
|
|
61
61
|
this.oauthUrl = null;
|
|
@@ -123,12 +123,12 @@ export class ZgridComponent extends DataListingFieldBase {
|
|
|
123
123
|
console.log(this.data);
|
|
124
124
|
}
|
|
125
125
|
};
|
|
126
|
-
this.
|
|
126
|
+
this.environment = this.zcoreService.getEnvironment();
|
|
127
|
+
this.oauthUrl = this.environment.e1OauthUrl + "/";
|
|
127
128
|
this.allResults = this.allResults.bind(this);
|
|
128
129
|
this.refreshData = this.refreshData.bind(this);
|
|
129
130
|
this.clearData = this.clearData.bind(this);
|
|
130
131
|
}
|
|
131
|
-
;
|
|
132
132
|
ngOnInit() {
|
|
133
133
|
super.setupInnerField();
|
|
134
134
|
this.setupFilterFeature();
|
|
@@ -145,6 +145,7 @@ export class ZgridComponent extends DataListingFieldBase {
|
|
|
145
145
|
}
|
|
146
146
|
ngAfterViewChecked() {
|
|
147
147
|
const isBackNavigated = (sessionStorage.getItem("navigatedReloadGrid") === 'true');
|
|
148
|
+
this.showHideRestoreGridSettingButton();
|
|
148
149
|
if (isBackNavigated) {
|
|
149
150
|
if (!this.isUseLocalData()) {
|
|
150
151
|
this.getData();
|
|
@@ -679,35 +680,53 @@ export class ZgridComponent extends DataListingFieldBase {
|
|
|
679
680
|
}
|
|
680
681
|
saveGridSettings() {
|
|
681
682
|
const gridStateLogic = this.gridService.getGridStateLogic(this.data);
|
|
682
|
-
const cacheName = this.
|
|
683
|
-
|
|
684
|
-
const
|
|
685
|
-
|
|
683
|
+
const cacheName = this.stateSettingService.getStorageCacheKey(StateType.savedSetting, this.data);
|
|
684
|
+
const previousCachedData = this.gridService.getStateCacheByName(cacheName);
|
|
685
|
+
const columnConfigurations = ZComponentHelper.getGridColumnsConfig(this.zgrid.grid.columns);
|
|
686
|
+
const settingConfig = { columnConfigurations };
|
|
687
|
+
this.zgrid.gridSetting = {
|
|
688
|
+
...this.zgrid.gridSetting,
|
|
689
|
+
columnConfigurations
|
|
686
690
|
};
|
|
687
|
-
if (gridStateLogic ===
|
|
691
|
+
if (gridStateLogic === StateType.cachedDataSetting) {
|
|
688
692
|
settingConfig.gridState = this.zgrid.gridSetting.gridState;
|
|
689
693
|
}
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
694
|
+
this.gridService.setStateToCache(cacheName, settingConfig);
|
|
695
|
+
const stateSettingInfo = {
|
|
696
|
+
projectCode: this.environment.projectCodes[0],
|
|
697
|
+
fieldElementName: this.data.FieldElementName,
|
|
698
|
+
componentUniqueKey: this.data.CacheInfo.Name ?? this.data.FieldElementName,
|
|
699
|
+
userId: this.authService.e1Token.userName,
|
|
700
|
+
stateType: StateType.savedSetting,
|
|
701
|
+
stateData: JSON.stringify(settingConfig),
|
|
702
|
+
storageCacheName: cacheName
|
|
695
703
|
};
|
|
696
|
-
|
|
704
|
+
if (previousCachedData && previousCachedData.id) {
|
|
705
|
+
stateSettingInfo.id = previousCachedData.id;
|
|
706
|
+
}
|
|
707
|
+
// dont need to wait, as it will first save to the browser storage.
|
|
708
|
+
this.stateSettingService.saveStateSetting(stateSettingInfo).subscribe();
|
|
697
709
|
this.showHideRestoreGridSettingButton();
|
|
698
710
|
this.toastService.show('Grid Setting Saved', "top", true, 2000, 'success');
|
|
699
711
|
}
|
|
700
712
|
restoreGridSettings() {
|
|
713
|
+
// Ensure columns are sorted based on their original order
|
|
701
714
|
this.columns.sort((a, b) => a.originalOrderIndex - b.originalOrderIndex);
|
|
702
|
-
|
|
715
|
+
// Generate grid columns and load data
|
|
716
|
+
this.generateGridColumns().subscribe(() => {
|
|
703
717
|
this.getData();
|
|
704
718
|
});
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
719
|
+
// Call the gridService.getStateCache and handle the result via subscription
|
|
720
|
+
this.gridService.getStateCache(StateType.savedSetting, this.data).subscribe((cachedData) => {
|
|
721
|
+
if (cachedData) {
|
|
722
|
+
// Cache found, proceed with deletion
|
|
723
|
+
this.gridService.deleteStateCache(StateType.savedSetting, this.data);
|
|
724
|
+
// Toggle visibility of the restore button
|
|
725
|
+
this.showHideRestoreGridSettingButton();
|
|
726
|
+
// Delete the state setting based on the cache data ID
|
|
727
|
+
this.stateSettingService.deleteStateSetting(cachedData.id).subscribe();
|
|
728
|
+
}
|
|
729
|
+
});
|
|
711
730
|
}
|
|
712
731
|
gridCallback(group) {
|
|
713
732
|
if (this.data['AfterloadCallback']) {
|
|
@@ -730,7 +749,6 @@ export class ZgridComponent extends DataListingFieldBase {
|
|
|
730
749
|
Type: this.data.GridButtonFieldName_WF ? "zworkflowbuttons" : "zbuttons"
|
|
731
750
|
};
|
|
732
751
|
}
|
|
733
|
-
this.showHideRestoreGridSettingButton();
|
|
734
752
|
}
|
|
735
753
|
setDateColForFiltering() {
|
|
736
754
|
const gridData = this.getGridData();
|
|
@@ -747,9 +765,15 @@ export class ZgridComponent extends DataListingFieldBase {
|
|
|
747
765
|
}
|
|
748
766
|
showHideRestoreGridSettingButton() {
|
|
749
767
|
if (this.data.CacheInfo?.EnableSaveState) {
|
|
750
|
-
|
|
751
|
-
const
|
|
752
|
-
|
|
768
|
+
this.showRestoreGridSettingButton = false;
|
|
769
|
+
const stateType = this.gridService.getGridStateLogic(this.data);
|
|
770
|
+
if (stateType === StateType.savedSetting || stateType === StateType.savedAndCachedDataSetting) {
|
|
771
|
+
const settingCacheName = this.stateSettingService.getStorageCacheKey(stateType, this.data);
|
|
772
|
+
const settingCacheValue = localStorage.getItem(settingCacheName);
|
|
773
|
+
if (settingCacheValue) {
|
|
774
|
+
this.showRestoreGridSettingButton = true;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
753
777
|
}
|
|
754
778
|
}
|
|
755
779
|
//#endregion
|
|
@@ -1113,20 +1137,20 @@ export class ZgridComponent extends DataListingFieldBase {
|
|
|
1113
1137
|
this.zgrid.gridSetting.gridState.skip = 0;
|
|
1114
1138
|
}
|
|
1115
1139
|
}
|
|
1116
|
-
ZgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgridComponent, deps: [{ token: i1.ZComponentService }, { token: i2.FontAweSomeService }, { token: i3.ActivatedRoute }, { token: i3.Router }, { token: i4.FormBuilder }, { token: i2.WebApiService }, { token: i2.ToastService }, { token: i2.ZCoreService }, { token: i2.StorageSessionService }, { token: i5.MainService }, { token: i0.ChangeDetectorRef }, { token: i6.ZGridService }, { token: i2.
|
|
1117
|
-
ZgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZgridComponent, selector: "app-zgrid", viewQueries: [{ propertyName: "tooltipDir", first: true, predicate: TooltipDirective, descendants: true }, { propertyName: "elementContainer", first: true, predicate: ElementContainerDirective, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div class=\"grid-container e1tag-style\" [ngClass]=\"data.Class\" [style]=\"componentProperties.style.style\">\r\n\r\n <!-- <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div> -->\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <kendo-popover #gridPopOver [position]=\"data.PopOverPosition || 'bottom'\" [templateData]=\"getContextData.bind(this)\">\r\n <!-- <ng-template kendoPopoverTitleTemplate let-data=\"data\" >\r\n <div [style]=\"data.TitleStyle\" *ngIf=\"data && data.Title\" [innerHTML]=\"data.Title\"></div>\r\n </ng-template> -->\r\n <ng-template kendoPopoverBodyTemplate let-data=\"data\">\r\n <div [style]=\"data.BodyStyle\" class=\"popoverbody\" *ngIf=\"data && data.Body\" [innerHTML]=\"data.Body | htmlSanitize\" [ngClass]=\"data.BodyClass\" (mouseleave)=\"closePopOver.call(this, $event)\"></div>\r\n </ng-template>\r\n </kendo-popover>\r\n\r\n <div kendoTooltip showOn=\"none\" [tooltipTemplate]=\"template\" filter=\".k-grid td\" (mouseover)=\"showTooltip($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n <div kendoPopoverContainer [popover]=\"gridPopOver\" filter=\"div.gridCell.withPopoverInGrid\" showOn=\"none\" kendoPopoverContainer #popovercontainer=\"kendoPopoverContainer\">\r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject, gridSetting: gridSetting}\" [ngClass]=\"data.Class\" class=\"desktop-grid e1tag-style2\"\r\n [scrollable]=\"data.scrollAble === false ? 'none' : 'scrollable'\"\r\n [pageable]=\"pageable\"\r\n [class.hiden-pager]=\"!pageable\"\r\n [pageSize]=\"gridSetting.gridState.take\"\r\n [skip]=\"gridSetting.gridState.skip\"\r\n [sort]=\"gridSetting.gridState.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"gridSetting.gridState.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"rowSelection\"\r\n [style]=\"componentProperties.style.style2\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\"\r\n (columnResize)=\"adjustWidthUponResize()\"\r\n (excelExport)=\"onExcelExport($event)\"\r\n [rowClass]=\"rowCallback.bind(this)\">\r\n <ng-template kendoGridToolbarTemplate\r\n *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.Title || data.GridButtonFieldName_WF || data.GridButtonFieldName || data.EnableGridCommand || data.EnableCustomAddCommand || data.EnableCustomResetCommand\">\r\n <div class=\"toolbar-left-item\" *ngIf=\"gridTitle || data.AllowRefreshButton || data.AllowExport\">\r\n <!-- <fa-icon *ngIf=\"data.Icon\" class=\"gridTitleIcon\" [icon]=\"data.Icon\"></fa-icon> -->\r\n <kendo-label class=\"gridTitle\" *ngIf=\"gridTitle\">{{ gridTitle }}</kendo-label>\r\n <button title=\"Refresh\" type=\"button\" class=\"left-buttons refresh-button\" kendoButton (click)=\"refreshData()\"\r\n *ngIf=\"data.AllowRefreshButton\">\r\n <span class=\"k-icon k-grid-button k-i-refresh-sm\"></span>\r\n </button>\r\n <div class=\"toolbar-left-item-second-container\" *ngIf=\"data.AllowExport\" [class.with-grid-title]=\"gridTitle || data.AllowRefreshButton\">\r\n <button type=\"button\" class=\"left-buttons export-button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\">\r\n <!-- <span class=\"k-icon k-i-file-excel\"></span> -->\r\n <fa-icon icon=\"download\"></fa-icon>\r\n <span class=\"export-to-excel-button-text\">{{ getToolBarItemLabelName('Download as Excel') }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"toolbar-right-item\" *ngIf=\"gridBtn || data.CacheInfo?.EnableSaveState || gridDefaultStateExist || data.EnableGridCommand || data.EnableCustomAddCommand || data.EnableCustomResetCommand\">\r\n <app-zworkflowbuttons *ngIf=\"gridBtn && gridBtn.Type === 'zworkflowbuttons'\" [data]=\"gridBtn\" [group]=\"group\" [form]=\"form\"></app-zworkflowbuttons>\r\n <app-zbuttons *ngIf=\"gridBtn && gridBtn.Type === 'zbuttons'\" [data]=\"gridBtn\" [group]=\"group\" [form]=\"form\"></app-zbuttons>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.CacheInfo?.EnableSaveState\">\r\n <span class=\"k-icon k-icon-with-text k-i-star\"></span>{{ getToolBarItemLabelName('Save Settings') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"showRestoreGridSettingButton\">\r\n <span class=\"k-icon k-icon-with-text k-i-star-outline\"></span>{{ getToolBarItemLabelName('Restore Settings') }}\r\n </button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-add\"></span>{{ getToolBarItemLabelName(data.AddCommandButtonName ? data.AddCommandButtonName: 'Add') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"gridCustomAddCommand(group)\" *ngIf=\"data.EnableCustomAddCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-add\"></span>{{ getToolBarItemLabelName(data.AddCommandButtonName ? data.AddCommandButtonName: 'Add') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"gridCustomResetCommand(group)\" *ngIf=\"data.EnableCustomResetCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-trash\"></span>{{ getToolBarItemLabelName(data.ResetCommandButtonName ? data.ResetCommandButtonName: 'Reset') }}\r\n </button>\r\n </div>\r\n <div class=\"filter-container\" *ngIf=\"data.GridFilterBarField\">\r\n <div class=\"normal-filter-container\">\r\n <app-zform class=\"filter-fields\" [group]=\"filterGroup\" [fieldName]=\"data.GridFilterBarField\"></app-zform>\r\n <div class=\"filter-buttons\" [ngClass]=\"data.Class\">\r\n <ion-button fill=\"solid\" size=\"default\" strong=\"true\" color=\"primary\" (click)=\"search()\">\r\n <fa-icon icon=\"search\"></fa-icon>\r\n <span class=\"btn-label ion-text-capitalize\">{{ getToolBarItemLabelName('Search') }}</span>\r\n </ion-button>\r\n <ion-button fill=\"outline\" size=\"default\" strong=\"true\" color=\"primary\" (click)=\"cancelEdit()\" *ngIf=\"data.IsShowGridCancelFilterButton\">\r\n <fa-icon icon=\"times\"></fa-icon>\r\n </ion-button>\r\n <ion-button fill=\"solid\" size=\"default\" strong=\"true\" [ngClass]=\"isShowAdvFilter ? 'toggleOn' : 'toggleOff'\" (click)=\"advancedSearch()\" *ngIf=\"data.GridAdvFilterBarField\">\r\n <fa-icon icon=\"sliders-h\"></fa-icon>\r\n </ion-button>\r\n </div>\r\n </div>\r\n <app-zform *ngIf=\"data.GridAdvFilterBarField\" class=\"to-preload-the-fields\" [group]=\"advfilterGroup\" [fieldName]=\"data.GridAdvFilterBarField\" style=\"display:none;\"></app-zform>\r\n <div class=\"adv-filter-container\" *ngIf=\"isShowAdvFilter\" [@hideAndShowAnimation]>\r\n <div class=\"adv-filter-seperator\">\r\n <span>\r\n {{ getToolBarItemLabelName('Advanced Search') }}\r\n </span>\r\n </div>\r\n <app-zform class=\"advfilter-fields\" [group]=\"advfilterGroup\" [fieldName]=\"data.GridAdvFilterBarField\"></app-zform>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\" [locked]=\"checkboxColumnPinned\">\r\n </kendo-grid-checkbox-column>\r\n <kendo-grid-column [style]=\"getGridColumnStyle()\" class=\"e1tag-style3\" *ngFor=\"let col of columns;\" [field]=\"col.field\" [title]=\"col.title\" [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\" [filter]=\"col.filter\" [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\" [headerStyle]=\"getGridHeaderStyle()\" headerClass=\"e1tag-style4\"\r\n [footerStyle]=\"getGridFooterStyle()\" footerClass=\"e1tag-style9\" [hidden]=\"col.hidden\"\r\n [format]=\"col.format\" [class]=\"col.Class\" [locked]=\"locked(col)\" editor=\"numeric\" [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" class=\"date-range-filter\"\r\n [filter]=\"filter\" [field]=\"col.field\" [data]=\"data\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType === 'checkbox'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-boolean-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n </kendo-grid-boolean-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n -l\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\"\r\n [ngSwitch]=\"col.fieldType\" [ngClass]=\"getClass(dataItem, col)\" [style]=\"getCellStyle(col, dataItem)\" [attr.data-id]=\"dataItem.Id\" [attr.column-name]=\"col.field\"\r\n (mouseenter)=\"showPopOver(col, $event)\" (mouseleave)=\"closePopOver($event)\">\r\n <span *ngSwitchCase=\"'zdate'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.gridCellReplaceValue && getIconName(col.gridCellReplaceValue, dataItem[col.field]) !== ''\">\r\n <fa-icon [icon]=\"getIconName(col.gridCellReplaceValue, dataItem[col.field])\"></fa-icon>\r\n </div>\r\n <div *ngIf=\"!col.gridCellReplaceValue\" [ngSwitch]=\"cellStyleCondition(col, dataItem[col.field])\">\r\n <span *ngSwitchCase=true>\r\n <div class=\"cellStyleConditionDefault\" [style]=\"setCellStyleCondition(col, dataItem[col.field])\">\r\n <span class=\"grid-cell-data\">{{ dataItem[col.field] }} </span>\r\n </div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <span class=\"grid-cell-data\">{{ dataItem[col.field] }} </span>\r\n </span>\r\n </div>\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && isInlineFormGroupHasValue() && !isInlineEditInputFieldLoading && !col.gridCellReplaceValue\" [style]=\"componentProperties.style.style5\"\r\n [ngClass]=\"getClass(dataItem, col)\" class=\"e1tag-style5\" [style]=\"getCellStyleForInlineEdit(col, dataItem, rowIndex)\">\r\n <app-zinput-container [data]=\"getInlineField(col.field)\" [group]=\"group\"\r\n [form]=\"getInlineForm(dataItem, rowIndex)\" [containerField]=\"containerField\" [style]=\"componentProperties.style.style6\" class=\"e1tag-style6\">\r\n </app-zinput-container>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\" [style]=\"componentProperties.style.style7\" class=\"e1tag-style7\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableCustomRemoveCommand\" width=\"180\" [columnMenu]=\"false\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\" let-dataItem let-rowIndex=\"rowIndex\">\r\n <button type=\"button\" kendoButton (click)=\"gridCustomRemoveCommand(dataItem, rowIndex)\" *ngIf=\"data.EnableCustomRemoveCommand\">\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <app-context-menu [data]=\"data\" [group]=\"group\" [form]=\"form\" #dataitemcontextmenu></app-context-menu>\r\n </div>\r\n </div>\r\n <!-- for DEC auto scrolling -->\r\n <div id=\"end-of-grid\"></div>\r\n</div>\r\n\r\n", styles: [".grid-container.align-with-input{margin:0 25px 0 10px}:host ::ng-deep kendo-treelist.desktop-grid,:host ::ng-deep kendo-grid.desktop-grid{border-width:0px;width:100%;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-content,:host ::ng-deep kendo-grid.desktop-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar{margin-bottom:15px;padding:5px 0 0;display:flex;flex-direction:row;border:none;background:transparent;border-bottom:1px solid var(--ion-app-seperator-line-color)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-input,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-picker,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar .k-input,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar .k-picker{width:100%}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button{font-size:calc(var(--button-font-size) - 1px);margin-left:8px;margin-right:2px;border-radius:var(--button-border-radius);background:#fff;border:none;box-shadow:none;padding:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button.left-buttons,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button.left-buttons,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button.left-buttons{margin:auto 0 auto 5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-grid-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-grid-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-grid-button{padding:0 6px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button fa-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button fa-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button fa-icon{color:var(--ion-color-primary)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon{font-size:calc(var(--button-font-size) + 8px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon-with-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon-with-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon-with-text{margin-right:2px;font-size:calc(var(--button-font-size) + 2px);padding-bottom:3px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button:hover{background:rgba(var(--ion-color-primary-rgb),.2)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container{margin-top:auto;padding-bottom:1px;gap:5px;display:flex}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container.with-grid-title{margin-left:10px;border-left:1px solid #c9c9c9;padding-left:8px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text{height:18px;gap:8px;display:flex;margin:auto}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel{margin-top:-1px;font-size:calc(var(--button-font-size) + 6px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text{margin:auto}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container{flex:1 1 100%;border:1px solid var(--ion-app-seperator-line-color);display:grid}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container{display:grid;grid-template-columns:80% 20%;width:100%}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons{display:flex;margin:auto 5px auto auto;padding:0 5px;position:relative}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons.filter-field-layout-type2,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons.filter-field-layout-type2{top:12px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button{font-size:var(--button-font-size);margin-left:10px;height:calc(var(--input-field-height) + 2px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOn,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOn{--background: rgba(var(--ion-color-primary-rgb), 15%);--background-hover: rgba(var(--ion-color-primary-rgb), 10%);--color: var(--ion-color-primary);--border-color: var(--ion-color-primary)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOff,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOff{--background: var(--disabled-input-field-backgroundcolor);--border-color: var(--z-placeholder-color);--color: var(--z-placeholder-color);--background-hover: #efefef}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button .btn-label,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button .btn-label{padding-left:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container{margin-top:10px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator{width:100%;height:calc(var(--content-font-size) - 1px);border-bottom:1px solid var(--ion-color-primary);text-align:center}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator span,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator span{font-size:calc(var(--content-font-size) + 3px);background:#fff;padding:0 20px;color:var(--ion-color-primary);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid.toolbar-no-border .k-toolbar,:host ::ng-deep kendo-grid.desktop-grid.toolbar-no-border .k-toolbar{margin-bottom:0;border-width:0px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-aria-root,:host ::ng-deep kendo-grid.desktop-grid .k-grid-aria-root{border:1px solid var(--ion-color-primary);border-radius:5px 5px 0 0}:host ::ng-deep kendo-treelist.desktop-grid.hiden-pager .k-grid-aria-root,:host ::ng-deep kendo-grid.desktop-grid.hiden-pager .k-grid-aria-root{border-radius:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header{font-weight:600;font-size:var(--grid-header-font-size);background:rgba(var(--ion-color-primary-rgb),.25);color:#000}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-cell-inner>.k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-cell-inner>.k-link{padding:12px 12px 8px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-grid-filter,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-grid-filter.k-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu.k-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-active .k-grid-filter.k-state-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu.k-state-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-grid-filter,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-grid-filter.k-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu.k-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-active .k-grid-filter.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-state-active{color:#000;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-dropdown-wrap,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-dropdown-wrap{background:var(--ion-color-primary-contrast);color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-button{color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator{display:flex}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator>.k-button.k-clear-button-visible,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator>.k-button.k-clear-button-visible{margin-left:4px}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr,:host ::ng-deep kendo-grid.desktop-grid tbody>tr{background:rgba(var(--ion-color-primary-rgb),.08);font-size:var(--grid-cell-font-size)}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-alt{background:rgba(var(--ion-color-primary-rgb),.01)}:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected.k-alt,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected.k-alt>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected.k-alt,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected.k-alt>td,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-selected.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-selected.k-alt>td,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-state-selected.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-selected>td,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-selected.k-alt>td{background:rgba(var(--ion-color-secondary-rgb),.8);color:var(--ion-color-secondary-contrast);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr:hover,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-hover,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr:hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-hover{background-color:rgba(var(--ion-color-secondary-rgb),.15)}:host ::ng-deep kendo-treelist.desktop-grid tbody td>.gridCell>span>div>span,:host ::ng-deep kendo-grid.desktop-grid tbody td>.gridCell>span>div>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager{background-color:rgba(var(--ion-color-primary-rgb),.25);color:#000;border:1px solid var(--ion-color-primary);border-top:none;border-radius:0 0 5px 5px;font-size:calc(var(--grid-cell-font-size) - 2px);padding:2px 10px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link{color:#000;border-radius:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover{color:#fff;background-image:linear-gradient(rgba(var(--ion-color-primary-rgb),.7),rgba(var(--ion-color-primary-rgb),.8))}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected.k-state-hover{color:var(--ion-color-primary);background:var(--ion-color-primary-contrast);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid.cellWrapText td>.gridCell>span>div>span,:host ::ng-deep kendo-grid.desktop-grid.cellWrapText td>.gridCell>span>div>span{white-space:pre-line}:host ::ng-deep kendo-treelist .cellStyleConditionDefault,:host ::ng-deep kendo-grid .cellStyleConditionDefault{border-radius:5px;text-align:center}:host ::ng-deep kendo-treelist .rightAligned,:host ::ng-deep kendo-grid .rightAligned{text-align:right}:host ::ng-deep kendo-treelist .centerAligned,:host ::ng-deep kendo-grid .centerAligned{text-align:center}.gridTitle{font-size:calc(var(--grid-header-font-size) + 8px);font-weight:700;margin:auto 5px;color:var(--ion-color-dark);padding-top:2px;display:inherit}.gridTitleIcon{color:var(--ion-color-dark);font-size:calc(var(--grid-header-font-size) + 2px);display:block;margin:auto 0;padding-top:2px}.refresh-btn{zoom:.8}.refresh-btn>.k-i-refresh-sm{transform:rotate(30deg);font-size:1.4rem}.toolbar-left-item{flex-grow:1;display:flex}.toolbar-right-item{bottom:2px;position:relative}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-dark)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;inset:100px 0 0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"], components: [{ type: i7.PopoverComponent, selector: "kendo-popover", inputs: ["position", "offset", "width", "height", "title", "subtitle", "body", "callout", "animation", "templateData"], outputs: ["show", "shown", "hide", "hidden"] }, { type: i8.GridComponent, selector: "kendo-grid", inputs: ["data", "pageSize", "height", "rowHeight", "detailRowHeight", "skip", "scrollable", "selectable", "sort", "trackBy", "filter", "group", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "navigable", "navigatable", "autoSize", "rowClass", "rowSticky", "rowSelected", "cellSelected", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "isDetailExpanded", "isGroupExpanded"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "dataStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { type: i9.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional"], exportAs: ["kendoLabel"] }, { type: i10.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i11.ZworkflowbuttonsComponent, selector: "app-zworkflowbuttons" }, { type: i12.ZbuttonsComponent, selector: "app-zbuttons" }, { type: i13.ZformComponent, selector: "app-zform", inputs: ["group", "fieldName"] }, { type: i14.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i8.CheckboxColumnComponent, selector: "kendo-grid-checkbox-column", inputs: ["showSelectAll"] }, { type: i8.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterable", "editable"] }, { type: i8.NumericFilterCellComponent, selector: "kendo-grid-numeric-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i8.EqualFilterOperatorComponent, selector: "kendo-filter-eq-operator" }, { type: i8.NotEqualFilterOperatorComponent, selector: "kendo-filter-neq-operator" }, { type: i8.LessFilterOperatorComponent, selector: "kendo-filter-lt-operator" }, { type: i8.LessOrEqualToFilterOperatorComponent, selector: "kendo-filter-lte-operator" }, { type: i8.GreaterFilterOperatorComponent, selector: "kendo-filter-gt-operator" }, { type: i8.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-filter-gte-operator" }, { type: i8.IsNullFilterOperatorComponent, selector: "kendo-filter-isnull-operator" }, { type: i8.IsNotNullFilterOperatorComponent, selector: "kendo-filter-isnotnull-operator" }, { type: i15.DateRangeFilterCellComponent, selector: "date-range-filter-cell", inputs: ["filter", "field", "data"] }, { type: i8.DateFilterCellComponent, selector: "kendo-grid-date-filter-cell", inputs: ["showOperators"] }, { type: i8.BooleanFilterCellComponent, selector: "kendo-grid-boolean-filter-cell" }, { type: i8.StringFilterCellComponent, selector: "kendo-grid-string-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i8.ContainsFilterOperatorComponent, selector: "kendo-filter-contains-operator" }, { type: i8.StartsWithFilterOperatorComponent, selector: "kendo-filter-startswith-operator" }, { type: i8.EndsWithFilterOperatorComponent, selector: "kendo-filter-endswith-operator" }, { type: i16.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i17.PopupComponent, selector: "kendo-popup", inputs: ["animate", "anchor", "anchorAlign", "collision", "popupAlign", "copyAnchorStyles", "popupClass", "positionMode", "offset", "margin"], outputs: ["anchorViewportLeave", "close", "open", "positionChange"], exportAs: ["kendo-popup"] }, { type: i14.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i16.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "errorIcon", "clearButtonIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { type: i18.ZInputContainerComponent, selector: "app-zinput-container" }, { type: i8.CommandColumnComponent, selector: "kendo-grid-command-column" }, { type: i8.ExcelComponent, selector: "kendo-grid-excel", inputs: ["fileName", "filterable", "creator", "date", "forceProxy", "proxyURL", "fetchData", "paddingCellOptions", "headerPaddingCellOptions", "collapsible"] }, { type: i19.ContextMenuComponent, selector: "app-context-menu", inputs: ["target", "selectedData"] }], directives: [{ type: i20.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i21.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i7.PopoverBodyTemplateDirective, selector: "[kendoPopoverBodyTemplate]" }, { type: i20.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.TooltipDirective, selector: "[kendoTooltip]", inputs: ["filter", "position", "titleTemplate", "showOn", "showAfter", "callout", "closable", "offset", "tooltipWidth", "tooltipHeight", "tooltipClass", "collision", "closeTitle", "tooltipTemplate"], exportAs: ["kendoTooltip"] }, { type: i7.PopoverContainerDirective, selector: "[kendoPopoverContainer]", inputs: ["filter"], exportAs: ["kendoPopoverContainer"] }, { type: i22.ZGridBindingDirective, selector: "[zgridbinding]", inputs: ["zgridbinding"] }, { type: i8.SelectionDirective, selector: "[kendoGridSelectBy]" }, { type: i8.ToolbarTemplateDirective, selector: "[kendoGridToolbarTemplate]", inputs: ["position"] }, { type: i23.ButtonDirective, selector: "button[kendoButton], span[kendoButton]", inputs: ["toggleable", "togglable", "selected", "tabIndex", "icon", "iconClass", "imageUrl", "disabled", "size", "rounded", "fillMode", "themeColor", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { type: i8.ExcelCommandDirective, selector: "[kendoGridExcelCommand]" }, { type: i8.AddCommandDirective, selector: "[kendoGridAddCommand]" }, { type: i20.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i20.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i20.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i8.FilterCellTemplateDirective, selector: "[kendoGridFilterCellTemplate]" }, { type: i20.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i8.EditTemplateDirective, selector: "[kendoGridEditTemplate]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i8.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { type: i8.FooterTemplateDirective, selector: "[kendoGridFooterTemplate]" }, { type: i8.FocusableDirective, selector: "[kendoGridFocusable], [kendoGridEditCommand], [kendoGridRemoveCommand], [kendoGridSaveCommand], [kendoGridCancelCommand], [kendoGridSelectionCheckbox] ", inputs: ["kendoGridFocusable"] }, { type: i8.SaveCommandDirective, selector: "[kendoGridSaveCommand]" }, { type: i8.CancelCommandDirective, selector: "[kendoGridCancelCommand]" }, { type: i8.EditCommandDirective, selector: "[kendoGridEditCommand]" }, { type: i8.RemoveCommandDirective, selector: "[kendoGridRemoveCommand]" }], pipes: { "htmlSanitize": i24.HtmlSanitizePipe, "date": i20.DatePipe, "number": i20.DecimalPipe }, animations: [
|
|
1140
|
+
ZgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgridComponent, deps: [{ token: i1.ZComponentService }, { token: i2.FontAweSomeService }, { token: i3.ActivatedRoute }, { token: i3.Router }, { token: i4.FormBuilder }, { token: i2.WebApiService }, { token: i2.ToastService }, { token: i2.ZCoreService }, { token: i2.StorageSessionService }, { token: i5.MainService }, { token: i0.ChangeDetectorRef }, { token: i6.ZGridService }, { token: i2.StateSettingService }, { token: i2.ResourceApiService }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1141
|
+
ZgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZgridComponent, selector: "app-zgrid", viewQueries: [{ propertyName: "tooltipDir", first: true, predicate: TooltipDirective, descendants: true }, { propertyName: "elementContainer", first: true, predicate: ElementContainerDirective, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div class=\"grid-container e1tag-style\" [ngClass]=\"data.Class\" [style]=\"componentProperties.style.style\">\r\n\r\n <!-- <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div> -->\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <kendo-popover #gridPopOver [position]=\"data.PopOverPosition || 'bottom'\" [templateData]=\"getContextData.bind(this)\">\r\n <!-- <ng-template kendoPopoverTitleTemplate let-data=\"data\" >\r\n <div [style]=\"data.TitleStyle\" *ngIf=\"data && data.Title\" [innerHTML]=\"data.Title\"></div>\r\n </ng-template> -->\r\n <ng-template kendoPopoverBodyTemplate let-data=\"data\">\r\n <div [style]=\"data.BodyStyle\" class=\"popoverbody\" *ngIf=\"data && data.Body\" [innerHTML]=\"data.Body | htmlSanitize\" [ngClass]=\"data.BodyClass\" (mouseleave)=\"closePopOver.call(this, $event)\"></div>\r\n </ng-template>\r\n </kendo-popover>\r\n\r\n <div kendoTooltip showOn=\"none\" [tooltipTemplate]=\"template\" filter=\".k-grid td\" (mouseover)=\"showTooltip($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n <div kendoPopoverContainer [popover]=\"gridPopOver\" filter=\"div.gridCell.withPopoverInGrid\" showOn=\"none\" kendoPopoverContainer #popovercontainer=\"kendoPopoverContainer\">\r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject, gridSetting: gridSetting}\" [ngClass]=\"data.Class\" class=\"desktop-grid e1tag-style2\"\r\n [scrollable]=\"data.scrollAble === false ? 'none' : 'scrollable'\"\r\n [pageable]=\"pageable\"\r\n [class.hiden-pager]=\"!pageable\"\r\n [pageSize]=\"gridSetting.gridState.take\"\r\n [skip]=\"gridSetting.gridState.skip\"\r\n [sort]=\"gridSetting.gridState.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"gridSetting.gridState.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"rowSelection\"\r\n [style]=\"componentProperties.style.style2\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\"\r\n (columnResize)=\"adjustWidthUponResize()\"\r\n (excelExport)=\"onExcelExport($event)\"\r\n [rowClass]=\"rowCallback.bind(this)\">\r\n <ng-template kendoGridToolbarTemplate\r\n *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.CacheInfo?.EnableSaveState || data.Title || data.GridButtonFieldName_WF || data.GridButtonFieldName || data.EnableGridCommand || data.EnableCustomAddCommand || data.EnableCustomResetCommand\">\r\n <div class=\"toolbar-left-item\" *ngIf=\"gridTitle || data.AllowRefreshButton || data.AllowExport\">\r\n <!-- <fa-icon *ngIf=\"data.Icon\" class=\"gridTitleIcon\" [icon]=\"data.Icon\"></fa-icon> -->\r\n <kendo-label class=\"gridTitle\" *ngIf=\"gridTitle\">{{ gridTitle }}</kendo-label>\r\n <button title=\"Refresh\" type=\"button\" class=\"left-buttons refresh-button\" kendoButton (click)=\"refreshData()\"\r\n *ngIf=\"data.AllowRefreshButton\">\r\n <span class=\"k-icon k-grid-button k-i-refresh-sm\"></span>\r\n </button>\r\n <div class=\"toolbar-left-item-second-container\" *ngIf=\"data.AllowExport\" [class.with-grid-title]=\"gridTitle || data.AllowRefreshButton\">\r\n <button type=\"button\" class=\"left-buttons export-button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\">\r\n <!-- <span class=\"k-icon k-i-file-excel\"></span> -->\r\n <fa-icon icon=\"download\"></fa-icon>\r\n <span class=\"export-to-excel-button-text\">{{ getToolBarItemLabelName('Download as Excel') }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"toolbar-right-item\" *ngIf=\"gridBtn || data.CacheInfo?.EnableSaveState || gridDefaultStateExist || data.EnableGridCommand || data.EnableCustomAddCommand || data.EnableCustomResetCommand\">\r\n <app-zworkflowbuttons *ngIf=\"gridBtn && gridBtn.Type === 'zworkflowbuttons'\" [data]=\"gridBtn\" [group]=\"group\" [form]=\"form\"></app-zworkflowbuttons>\r\n <app-zbuttons *ngIf=\"gridBtn && gridBtn.Type === 'zbuttons'\" [data]=\"gridBtn\" [group]=\"group\" [form]=\"form\"></app-zbuttons>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.CacheInfo?.EnableSaveState\">\r\n <span class=\"k-icon k-icon-with-text k-i-star\"></span>{{ getToolBarItemLabelName('Save Settings') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"showRestoreGridSettingButton\">\r\n <span class=\"k-icon k-icon-with-text k-i-star-outline\"></span>{{ getToolBarItemLabelName('Restore Settings') }}\r\n </button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-add\"></span>{{ getToolBarItemLabelName(data.AddCommandButtonName ? data.AddCommandButtonName: 'Add') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"gridCustomAddCommand(group)\" *ngIf=\"data.EnableCustomAddCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-add\"></span>{{ getToolBarItemLabelName(data.AddCommandButtonName ? data.AddCommandButtonName: 'Add') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"gridCustomResetCommand(group)\" *ngIf=\"data.EnableCustomResetCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-trash\"></span>{{ getToolBarItemLabelName(data.ResetCommandButtonName ? data.ResetCommandButtonName: 'Reset') }}\r\n </button>\r\n </div>\r\n <div class=\"filter-container\" *ngIf=\"data.GridFilterBarField\">\r\n <div class=\"normal-filter-container\">\r\n <app-zform class=\"filter-fields\" [group]=\"filterGroup\" [fieldName]=\"data.GridFilterBarField\"></app-zform>\r\n <div class=\"filter-buttons\" [ngClass]=\"data.Class\">\r\n <ion-button fill=\"solid\" size=\"default\" strong=\"true\" color=\"primary\" (click)=\"search()\">\r\n <fa-icon icon=\"search\"></fa-icon>\r\n <span class=\"btn-label ion-text-capitalize\">{{ getToolBarItemLabelName('Search') }}</span>\r\n </ion-button>\r\n <ion-button fill=\"outline\" size=\"default\" strong=\"true\" color=\"primary\" (click)=\"cancelEdit()\" *ngIf=\"data.IsShowGridCancelFilterButton\">\r\n <fa-icon icon=\"times\"></fa-icon>\r\n </ion-button>\r\n <ion-button fill=\"solid\" size=\"default\" strong=\"true\" [ngClass]=\"isShowAdvFilter ? 'toggleOn' : 'toggleOff'\" (click)=\"advancedSearch()\" *ngIf=\"data.GridAdvFilterBarField\">\r\n <fa-icon icon=\"sliders-h\"></fa-icon>\r\n </ion-button>\r\n </div>\r\n </div>\r\n <app-zform *ngIf=\"data.GridAdvFilterBarField\" class=\"to-preload-the-fields\" [group]=\"advfilterGroup\" [fieldName]=\"data.GridAdvFilterBarField\" style=\"display:none;\"></app-zform>\r\n <div class=\"adv-filter-container\" *ngIf=\"isShowAdvFilter\" [@hideAndShowAnimation]>\r\n <div class=\"adv-filter-seperator\">\r\n <span>\r\n {{ getToolBarItemLabelName('Advanced Search') }}\r\n </span>\r\n </div>\r\n <app-zform class=\"advfilter-fields\" [group]=\"advfilterGroup\" [fieldName]=\"data.GridAdvFilterBarField\"></app-zform>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\" [locked]=\"checkboxColumnPinned\">\r\n </kendo-grid-checkbox-column>\r\n <kendo-grid-column [style]=\"getGridColumnStyle()\" class=\"e1tag-style3\" *ngFor=\"let col of columns;\" [field]=\"col.field\" [title]=\"col.title\" [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\" [filter]=\"col.filter\" [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\" [headerStyle]=\"getGridHeaderStyle()\" headerClass=\"e1tag-style4\"\r\n [footerStyle]=\"getGridFooterStyle()\" footerClass=\"e1tag-style9\" [hidden]=\"col.hidden\"\r\n [format]=\"col.format\" [class]=\"col.Class\" [locked]=\"locked(col)\" editor=\"numeric\" [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" class=\"date-range-filter\"\r\n [filter]=\"filter\" [field]=\"col.field\" [data]=\"data\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType === 'checkbox'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-boolean-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n </kendo-grid-boolean-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n -l\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\"\r\n [ngSwitch]=\"col.fieldType\" [ngClass]=\"getClass(dataItem, col)\" [style]=\"getCellStyle(col, dataItem)\" [attr.data-id]=\"dataItem.Id\" [attr.column-name]=\"col.field\"\r\n (mouseenter)=\"showPopOver(col, $event)\" (mouseleave)=\"closePopOver($event)\">\r\n <span *ngSwitchCase=\"'zdate'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.gridCellReplaceValue && getIconName(col.gridCellReplaceValue, dataItem[col.field]) !== ''\">\r\n <fa-icon [icon]=\"getIconName(col.gridCellReplaceValue, dataItem[col.field])\"></fa-icon>\r\n </div>\r\n <div *ngIf=\"!col.gridCellReplaceValue\" [ngSwitch]=\"cellStyleCondition(col, dataItem[col.field])\">\r\n <span *ngSwitchCase=true>\r\n <div class=\"cellStyleConditionDefault\" [style]=\"setCellStyleCondition(col, dataItem[col.field])\">\r\n <span class=\"grid-cell-data\">{{ dataItem[col.field] }} </span>\r\n </div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <span class=\"grid-cell-data\">{{ dataItem[col.field] }} </span>\r\n </span>\r\n </div>\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && isInlineFormGroupHasValue() && !isInlineEditInputFieldLoading && !col.gridCellReplaceValue\" [style]=\"componentProperties.style.style5\"\r\n [ngClass]=\"getClass(dataItem, col)\" class=\"e1tag-style5\" [style]=\"getCellStyleForInlineEdit(col, dataItem, rowIndex)\">\r\n <app-zinput-container [data]=\"getInlineField(col.field)\" [group]=\"group\"\r\n [form]=\"getInlineForm(dataItem, rowIndex)\" [containerField]=\"containerField\" [style]=\"componentProperties.style.style6\" class=\"e1tag-style6\">\r\n </app-zinput-container>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\" [style]=\"componentProperties.style.style7\" class=\"e1tag-style7\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableCustomRemoveCommand\" width=\"180\" [columnMenu]=\"false\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\" let-dataItem let-rowIndex=\"rowIndex\">\r\n <button type=\"button\" kendoButton (click)=\"gridCustomRemoveCommand(dataItem, rowIndex)\" *ngIf=\"data.EnableCustomRemoveCommand\">\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <app-context-menu [data]=\"data\" [group]=\"group\" [form]=\"form\" #dataitemcontextmenu></app-context-menu>\r\n </div>\r\n </div>\r\n <!-- for DEC auto scrolling -->\r\n <div id=\"end-of-grid\"></div>\r\n</div>\r\n\r\n", styles: [".grid-container.align-with-input{margin:0 25px 0 10px}:host ::ng-deep kendo-treelist.desktop-grid,:host ::ng-deep kendo-grid.desktop-grid{border-width:0px;width:100%;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-content,:host ::ng-deep kendo-grid.desktop-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar{margin-bottom:15px;padding:5px 0 0;display:flex;flex-direction:row;border:none;background:transparent;border-bottom:1px solid var(--ion-app-seperator-line-color)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-input,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-picker,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar .k-input,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar .k-picker{width:100%}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button{font-size:calc(var(--button-font-size) - 1px);margin-left:8px;margin-right:2px;border-radius:var(--button-border-radius);background:#fff;border:none;box-shadow:none;padding:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button.left-buttons,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button.left-buttons,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button.left-buttons{margin:auto 0 auto 5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-grid-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-grid-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-grid-button{padding:0 6px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button fa-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button fa-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button fa-icon{color:var(--ion-color-primary)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon{font-size:calc(var(--button-font-size) + 8px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon-with-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon-with-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon-with-text{margin-right:2px;font-size:calc(var(--button-font-size) + 2px);padding-bottom:3px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button:hover{background:rgba(var(--ion-color-primary-rgb),.2)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container{margin-top:auto;padding-bottom:1px;gap:5px;display:flex}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container.with-grid-title{margin-left:10px;border-left:1px solid #c9c9c9;padding-left:8px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text{height:18px;gap:8px;display:flex;margin:auto}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel{margin-top:-1px;font-size:calc(var(--button-font-size) + 6px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text{margin:auto}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container{flex:1 1 100%;border:1px solid var(--ion-app-seperator-line-color);display:grid}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container{display:grid;grid-template-columns:80% 20%;width:100%}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons{display:flex;margin:auto 5px auto auto;padding:0 5px;position:relative}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons.filter-field-layout-type2,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons.filter-field-layout-type2{top:12px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button{font-size:var(--button-font-size);margin-left:10px;height:calc(var(--input-field-height) + 2px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOn,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOn{--background: rgba(var(--ion-color-primary-rgb), 15%);--background-hover: rgba(var(--ion-color-primary-rgb), 10%);--color: var(--ion-color-primary);--border-color: var(--ion-color-primary)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOff,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOff{--background: var(--disabled-input-field-backgroundcolor);--border-color: var(--z-placeholder-color);--color: var(--z-placeholder-color);--background-hover: #efefef}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button .btn-label,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button .btn-label{padding-left:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container{margin-top:10px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator{width:100%;height:calc(var(--content-font-size) - 1px);border-bottom:1px solid var(--ion-color-primary);text-align:center}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator span,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator span{font-size:calc(var(--content-font-size) + 3px);background:#fff;padding:0 20px;color:var(--ion-color-primary);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid.toolbar-no-border .k-toolbar,:host ::ng-deep kendo-grid.desktop-grid.toolbar-no-border .k-toolbar{margin-bottom:0;border-width:0px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-aria-root,:host ::ng-deep kendo-grid.desktop-grid .k-grid-aria-root{border:1px solid var(--ion-color-primary);border-radius:5px 5px 0 0}:host ::ng-deep kendo-treelist.desktop-grid.hiden-pager .k-grid-aria-root,:host ::ng-deep kendo-grid.desktop-grid.hiden-pager .k-grid-aria-root{border-radius:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header{font-weight:600;font-size:var(--grid-header-font-size);background:rgba(var(--ion-color-primary-rgb),.25);color:#000}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-cell-inner>.k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-cell-inner>.k-link{padding:12px 12px 8px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-grid-filter,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-grid-filter.k-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu.k-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-active .k-grid-filter.k-state-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu.k-state-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-grid-filter,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-grid-filter.k-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu.k-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-active .k-grid-filter.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-state-active{color:#000;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-dropdown-wrap,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-dropdown-wrap{background:var(--ion-color-primary-contrast);color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-button{color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator{display:flex}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator>.k-button.k-clear-button-visible,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator>.k-button.k-clear-button-visible{margin-left:4px}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr,:host ::ng-deep kendo-grid.desktop-grid tbody>tr{background:rgba(var(--ion-color-primary-rgb),.08);font-size:var(--grid-cell-font-size)}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-alt{background:rgba(var(--ion-color-primary-rgb),.01)}:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected.k-alt,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected.k-alt>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected.k-alt,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected.k-alt>td,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-selected.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-selected.k-alt>td,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-state-selected.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-selected>td,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-selected.k-alt>td{background:rgba(var(--ion-color-secondary-rgb),.8);color:var(--ion-color-secondary-contrast);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr:hover,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-hover,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr:hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-hover{background-color:rgba(var(--ion-color-secondary-rgb),.15)}:host ::ng-deep kendo-treelist.desktop-grid tbody td>.gridCell>span>div>span,:host ::ng-deep kendo-grid.desktop-grid tbody td>.gridCell>span>div>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager{background-color:rgba(var(--ion-color-primary-rgb),.25);color:#000;border:1px solid var(--ion-color-primary);border-top:none;border-radius:0 0 5px 5px;font-size:calc(var(--grid-cell-font-size) - 2px);padding:2px 10px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link{color:#000;border-radius:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover{color:#fff;background-image:linear-gradient(rgba(var(--ion-color-primary-rgb),.7),rgba(var(--ion-color-primary-rgb),.8))}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected.k-state-hover{color:var(--ion-color-primary);background:var(--ion-color-primary-contrast);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid.cellWrapText td>.gridCell>span>div>span,:host ::ng-deep kendo-grid.desktop-grid.cellWrapText td>.gridCell>span>div>span{white-space:pre-line}:host ::ng-deep kendo-treelist .cellStyleConditionDefault,:host ::ng-deep kendo-grid .cellStyleConditionDefault{border-radius:5px;text-align:center}:host ::ng-deep kendo-treelist .rightAligned,:host ::ng-deep kendo-grid .rightAligned{text-align:right}:host ::ng-deep kendo-treelist .centerAligned,:host ::ng-deep kendo-grid .centerAligned{text-align:center}.gridTitle{font-size:calc(var(--grid-header-font-size) + 8px);font-weight:700;margin:auto 5px;color:var(--ion-color-dark);padding-top:2px;display:inherit}.gridTitleIcon{color:var(--ion-color-dark);font-size:calc(var(--grid-header-font-size) + 2px);display:block;margin:auto 0;padding-top:2px}.refresh-btn{zoom:.8}.refresh-btn>.k-i-refresh-sm{transform:rotate(30deg);font-size:1.4rem}.toolbar-left-item{flex-grow:1;display:flex}.toolbar-right-item{bottom:2px;position:relative}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-dark)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;inset:100px 0 0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"], components: [{ type: i7.PopoverComponent, selector: "kendo-popover", inputs: ["position", "offset", "width", "height", "title", "subtitle", "body", "callout", "animation", "templateData"], outputs: ["show", "shown", "hide", "hidden"] }, { type: i8.GridComponent, selector: "kendo-grid", inputs: ["data", "pageSize", "height", "rowHeight", "detailRowHeight", "skip", "scrollable", "selectable", "sort", "trackBy", "filter", "group", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "navigable", "navigatable", "autoSize", "rowClass", "rowSticky", "rowSelected", "cellSelected", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "isDetailExpanded", "isGroupExpanded"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "dataStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { type: i9.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional"], exportAs: ["kendoLabel"] }, { type: i10.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i11.ZworkflowbuttonsComponent, selector: "app-zworkflowbuttons" }, { type: i12.ZbuttonsComponent, selector: "app-zbuttons" }, { type: i13.ZformComponent, selector: "app-zform", inputs: ["group", "fieldName"] }, { type: i14.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i8.CheckboxColumnComponent, selector: "kendo-grid-checkbox-column", inputs: ["showSelectAll"] }, { type: i8.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterable", "editable"] }, { type: i8.NumericFilterCellComponent, selector: "kendo-grid-numeric-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i8.EqualFilterOperatorComponent, selector: "kendo-filter-eq-operator" }, { type: i8.NotEqualFilterOperatorComponent, selector: "kendo-filter-neq-operator" }, { type: i8.LessFilterOperatorComponent, selector: "kendo-filter-lt-operator" }, { type: i8.LessOrEqualToFilterOperatorComponent, selector: "kendo-filter-lte-operator" }, { type: i8.GreaterFilterOperatorComponent, selector: "kendo-filter-gt-operator" }, { type: i8.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-filter-gte-operator" }, { type: i8.IsNullFilterOperatorComponent, selector: "kendo-filter-isnull-operator" }, { type: i8.IsNotNullFilterOperatorComponent, selector: "kendo-filter-isnotnull-operator" }, { type: i15.DateRangeFilterCellComponent, selector: "date-range-filter-cell", inputs: ["filter", "field", "data"] }, { type: i8.DateFilterCellComponent, selector: "kendo-grid-date-filter-cell", inputs: ["showOperators"] }, { type: i8.BooleanFilterCellComponent, selector: "kendo-grid-boolean-filter-cell" }, { type: i8.StringFilterCellComponent, selector: "kendo-grid-string-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i8.ContainsFilterOperatorComponent, selector: "kendo-filter-contains-operator" }, { type: i8.StartsWithFilterOperatorComponent, selector: "kendo-filter-startswith-operator" }, { type: i8.EndsWithFilterOperatorComponent, selector: "kendo-filter-endswith-operator" }, { type: i16.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i17.PopupComponent, selector: "kendo-popup", inputs: ["animate", "anchor", "anchorAlign", "collision", "popupAlign", "copyAnchorStyles", "popupClass", "positionMode", "offset", "margin"], outputs: ["anchorViewportLeave", "close", "open", "positionChange"], exportAs: ["kendo-popup"] }, { type: i14.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i16.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "errorIcon", "clearButtonIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { type: i18.ZInputContainerComponent, selector: "app-zinput-container" }, { type: i8.CommandColumnComponent, selector: "kendo-grid-command-column" }, { type: i8.ExcelComponent, selector: "kendo-grid-excel", inputs: ["fileName", "filterable", "creator", "date", "forceProxy", "proxyURL", "fetchData", "paddingCellOptions", "headerPaddingCellOptions", "collapsible"] }, { type: i19.ContextMenuComponent, selector: "app-context-menu", inputs: ["target", "selectedData"] }], directives: [{ type: i20.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i21.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i7.PopoverBodyTemplateDirective, selector: "[kendoPopoverBodyTemplate]" }, { type: i20.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.TooltipDirective, selector: "[kendoTooltip]", inputs: ["filter", "position", "titleTemplate", "showOn", "showAfter", "callout", "closable", "offset", "tooltipWidth", "tooltipHeight", "tooltipClass", "collision", "closeTitle", "tooltipTemplate"], exportAs: ["kendoTooltip"] }, { type: i7.PopoverContainerDirective, selector: "[kendoPopoverContainer]", inputs: ["filter"], exportAs: ["kendoPopoverContainer"] }, { type: i22.ZGridBindingDirective, selector: "[zgridbinding]", inputs: ["zgridbinding"] }, { type: i8.SelectionDirective, selector: "[kendoGridSelectBy]" }, { type: i8.ToolbarTemplateDirective, selector: "[kendoGridToolbarTemplate]", inputs: ["position"] }, { type: i23.ButtonDirective, selector: "button[kendoButton], span[kendoButton]", inputs: ["toggleable", "togglable", "selected", "tabIndex", "icon", "iconClass", "imageUrl", "disabled", "size", "rounded", "fillMode", "themeColor", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { type: i8.ExcelCommandDirective, selector: "[kendoGridExcelCommand]" }, { type: i8.AddCommandDirective, selector: "[kendoGridAddCommand]" }, { type: i20.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i20.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i20.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i8.FilterCellTemplateDirective, selector: "[kendoGridFilterCellTemplate]" }, { type: i20.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i8.EditTemplateDirective, selector: "[kendoGridEditTemplate]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i8.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { type: i8.FooterTemplateDirective, selector: "[kendoGridFooterTemplate]" }, { type: i8.FocusableDirective, selector: "[kendoGridFocusable], [kendoGridEditCommand], [kendoGridRemoveCommand], [kendoGridSaveCommand], [kendoGridCancelCommand], [kendoGridSelectionCheckbox] ", inputs: ["kendoGridFocusable"] }, { type: i8.SaveCommandDirective, selector: "[kendoGridSaveCommand]" }, { type: i8.CancelCommandDirective, selector: "[kendoGridCancelCommand]" }, { type: i8.EditCommandDirective, selector: "[kendoGridEditCommand]" }, { type: i8.RemoveCommandDirective, selector: "[kendoGridRemoveCommand]" }], pipes: { "htmlSanitize": i24.HtmlSanitizePipe, "date": i20.DatePipe, "number": i20.DecimalPipe }, animations: [
|
|
1118
1142
|
hideAndShowVerticalAnimation
|
|
1119
1143
|
] });
|
|
1120
1144
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgridComponent, decorators: [{
|
|
1121
1145
|
type: Component,
|
|
1122
1146
|
args: [{ selector: "app-zgrid", animations: [
|
|
1123
1147
|
hideAndShowVerticalAnimation
|
|
1124
|
-
], template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div class=\"grid-container e1tag-style\" [ngClass]=\"data.Class\" [style]=\"componentProperties.style.style\">\r\n\r\n <!-- <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div> -->\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <kendo-popover #gridPopOver [position]=\"data.PopOverPosition || 'bottom'\" [templateData]=\"getContextData.bind(this)\">\r\n <!-- <ng-template kendoPopoverTitleTemplate let-data=\"data\" >\r\n <div [style]=\"data.TitleStyle\" *ngIf=\"data && data.Title\" [innerHTML]=\"data.Title\"></div>\r\n </ng-template> -->\r\n <ng-template kendoPopoverBodyTemplate let-data=\"data\">\r\n <div [style]=\"data.BodyStyle\" class=\"popoverbody\" *ngIf=\"data && data.Body\" [innerHTML]=\"data.Body | htmlSanitize\" [ngClass]=\"data.BodyClass\" (mouseleave)=\"closePopOver.call(this, $event)\"></div>\r\n </ng-template>\r\n </kendo-popover>\r\n\r\n <div kendoTooltip showOn=\"none\" [tooltipTemplate]=\"template\" filter=\".k-grid td\" (mouseover)=\"showTooltip($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n <div kendoPopoverContainer [popover]=\"gridPopOver\" filter=\"div.gridCell.withPopoverInGrid\" showOn=\"none\" kendoPopoverContainer #popovercontainer=\"kendoPopoverContainer\">\r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject, gridSetting: gridSetting}\" [ngClass]=\"data.Class\" class=\"desktop-grid e1tag-style2\"\r\n [scrollable]=\"data.scrollAble === false ? 'none' : 'scrollable'\"\r\n [pageable]=\"pageable\"\r\n [class.hiden-pager]=\"!pageable\"\r\n [pageSize]=\"gridSetting.gridState.take\"\r\n [skip]=\"gridSetting.gridState.skip\"\r\n [sort]=\"gridSetting.gridState.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"gridSetting.gridState.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"rowSelection\"\r\n [style]=\"componentProperties.style.style2\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\"\r\n (columnResize)=\"adjustWidthUponResize()\"\r\n (excelExport)=\"onExcelExport($event)\"\r\n [rowClass]=\"rowCallback.bind(this)\">\r\n <ng-template kendoGridToolbarTemplate\r\n *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.Title || data.GridButtonFieldName_WF || data.GridButtonFieldName || data.EnableGridCommand || data.EnableCustomAddCommand || data.EnableCustomResetCommand\">\r\n <div class=\"toolbar-left-item\" *ngIf=\"gridTitle || data.AllowRefreshButton || data.AllowExport\">\r\n <!-- <fa-icon *ngIf=\"data.Icon\" class=\"gridTitleIcon\" [icon]=\"data.Icon\"></fa-icon> -->\r\n <kendo-label class=\"gridTitle\" *ngIf=\"gridTitle\">{{ gridTitle }}</kendo-label>\r\n <button title=\"Refresh\" type=\"button\" class=\"left-buttons refresh-button\" kendoButton (click)=\"refreshData()\"\r\n *ngIf=\"data.AllowRefreshButton\">\r\n <span class=\"k-icon k-grid-button k-i-refresh-sm\"></span>\r\n </button>\r\n <div class=\"toolbar-left-item-second-container\" *ngIf=\"data.AllowExport\" [class.with-grid-title]=\"gridTitle || data.AllowRefreshButton\">\r\n <button type=\"button\" class=\"left-buttons export-button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\">\r\n <!-- <span class=\"k-icon k-i-file-excel\"></span> -->\r\n <fa-icon icon=\"download\"></fa-icon>\r\n <span class=\"export-to-excel-button-text\">{{ getToolBarItemLabelName('Download as Excel') }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"toolbar-right-item\" *ngIf=\"gridBtn || data.CacheInfo?.EnableSaveState || gridDefaultStateExist || data.EnableGridCommand || data.EnableCustomAddCommand || data.EnableCustomResetCommand\">\r\n <app-zworkflowbuttons *ngIf=\"gridBtn && gridBtn.Type === 'zworkflowbuttons'\" [data]=\"gridBtn\" [group]=\"group\" [form]=\"form\"></app-zworkflowbuttons>\r\n <app-zbuttons *ngIf=\"gridBtn && gridBtn.Type === 'zbuttons'\" [data]=\"gridBtn\" [group]=\"group\" [form]=\"form\"></app-zbuttons>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.CacheInfo?.EnableSaveState\">\r\n <span class=\"k-icon k-icon-with-text k-i-star\"></span>{{ getToolBarItemLabelName('Save Settings') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"showRestoreGridSettingButton\">\r\n <span class=\"k-icon k-icon-with-text k-i-star-outline\"></span>{{ getToolBarItemLabelName('Restore Settings') }}\r\n </button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-add\"></span>{{ getToolBarItemLabelName(data.AddCommandButtonName ? data.AddCommandButtonName: 'Add') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"gridCustomAddCommand(group)\" *ngIf=\"data.EnableCustomAddCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-add\"></span>{{ getToolBarItemLabelName(data.AddCommandButtonName ? data.AddCommandButtonName: 'Add') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"gridCustomResetCommand(group)\" *ngIf=\"data.EnableCustomResetCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-trash\"></span>{{ getToolBarItemLabelName(data.ResetCommandButtonName ? data.ResetCommandButtonName: 'Reset') }}\r\n </button>\r\n </div>\r\n <div class=\"filter-container\" *ngIf=\"data.GridFilterBarField\">\r\n <div class=\"normal-filter-container\">\r\n <app-zform class=\"filter-fields\" [group]=\"filterGroup\" [fieldName]=\"data.GridFilterBarField\"></app-zform>\r\n <div class=\"filter-buttons\" [ngClass]=\"data.Class\">\r\n <ion-button fill=\"solid\" size=\"default\" strong=\"true\" color=\"primary\" (click)=\"search()\">\r\n <fa-icon icon=\"search\"></fa-icon>\r\n <span class=\"btn-label ion-text-capitalize\">{{ getToolBarItemLabelName('Search') }}</span>\r\n </ion-button>\r\n <ion-button fill=\"outline\" size=\"default\" strong=\"true\" color=\"primary\" (click)=\"cancelEdit()\" *ngIf=\"data.IsShowGridCancelFilterButton\">\r\n <fa-icon icon=\"times\"></fa-icon>\r\n </ion-button>\r\n <ion-button fill=\"solid\" size=\"default\" strong=\"true\" [ngClass]=\"isShowAdvFilter ? 'toggleOn' : 'toggleOff'\" (click)=\"advancedSearch()\" *ngIf=\"data.GridAdvFilterBarField\">\r\n <fa-icon icon=\"sliders-h\"></fa-icon>\r\n </ion-button>\r\n </div>\r\n </div>\r\n <app-zform *ngIf=\"data.GridAdvFilterBarField\" class=\"to-preload-the-fields\" [group]=\"advfilterGroup\" [fieldName]=\"data.GridAdvFilterBarField\" style=\"display:none;\"></app-zform>\r\n <div class=\"adv-filter-container\" *ngIf=\"isShowAdvFilter\" [@hideAndShowAnimation]>\r\n <div class=\"adv-filter-seperator\">\r\n <span>\r\n {{ getToolBarItemLabelName('Advanced Search') }}\r\n </span>\r\n </div>\r\n <app-zform class=\"advfilter-fields\" [group]=\"advfilterGroup\" [fieldName]=\"data.GridAdvFilterBarField\"></app-zform>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\" [locked]=\"checkboxColumnPinned\">\r\n </kendo-grid-checkbox-column>\r\n <kendo-grid-column [style]=\"getGridColumnStyle()\" class=\"e1tag-style3\" *ngFor=\"let col of columns;\" [field]=\"col.field\" [title]=\"col.title\" [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\" [filter]=\"col.filter\" [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\" [headerStyle]=\"getGridHeaderStyle()\" headerClass=\"e1tag-style4\"\r\n [footerStyle]=\"getGridFooterStyle()\" footerClass=\"e1tag-style9\" [hidden]=\"col.hidden\"\r\n [format]=\"col.format\" [class]=\"col.Class\" [locked]=\"locked(col)\" editor=\"numeric\" [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" class=\"date-range-filter\"\r\n [filter]=\"filter\" [field]=\"col.field\" [data]=\"data\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType === 'checkbox'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-boolean-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n </kendo-grid-boolean-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n -l\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\"\r\n [ngSwitch]=\"col.fieldType\" [ngClass]=\"getClass(dataItem, col)\" [style]=\"getCellStyle(col, dataItem)\" [attr.data-id]=\"dataItem.Id\" [attr.column-name]=\"col.field\"\r\n (mouseenter)=\"showPopOver(col, $event)\" (mouseleave)=\"closePopOver($event)\">\r\n <span *ngSwitchCase=\"'zdate'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.gridCellReplaceValue && getIconName(col.gridCellReplaceValue, dataItem[col.field]) !== ''\">\r\n <fa-icon [icon]=\"getIconName(col.gridCellReplaceValue, dataItem[col.field])\"></fa-icon>\r\n </div>\r\n <div *ngIf=\"!col.gridCellReplaceValue\" [ngSwitch]=\"cellStyleCondition(col, dataItem[col.field])\">\r\n <span *ngSwitchCase=true>\r\n <div class=\"cellStyleConditionDefault\" [style]=\"setCellStyleCondition(col, dataItem[col.field])\">\r\n <span class=\"grid-cell-data\">{{ dataItem[col.field] }} </span>\r\n </div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <span class=\"grid-cell-data\">{{ dataItem[col.field] }} </span>\r\n </span>\r\n </div>\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && isInlineFormGroupHasValue() && !isInlineEditInputFieldLoading && !col.gridCellReplaceValue\" [style]=\"componentProperties.style.style5\"\r\n [ngClass]=\"getClass(dataItem, col)\" class=\"e1tag-style5\" [style]=\"getCellStyleForInlineEdit(col, dataItem, rowIndex)\">\r\n <app-zinput-container [data]=\"getInlineField(col.field)\" [group]=\"group\"\r\n [form]=\"getInlineForm(dataItem, rowIndex)\" [containerField]=\"containerField\" [style]=\"componentProperties.style.style6\" class=\"e1tag-style6\">\r\n </app-zinput-container>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\" [style]=\"componentProperties.style.style7\" class=\"e1tag-style7\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableCustomRemoveCommand\" width=\"180\" [columnMenu]=\"false\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\" let-dataItem let-rowIndex=\"rowIndex\">\r\n <button type=\"button\" kendoButton (click)=\"gridCustomRemoveCommand(dataItem, rowIndex)\" *ngIf=\"data.EnableCustomRemoveCommand\">\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <app-context-menu [data]=\"data\" [group]=\"group\" [form]=\"form\" #dataitemcontextmenu></app-context-menu>\r\n </div>\r\n </div>\r\n <!-- for DEC auto scrolling -->\r\n <div id=\"end-of-grid\"></div>\r\n</div>\r\n\r\n", styles: [".grid-container.align-with-input{margin:0 25px 0 10px}:host ::ng-deep kendo-treelist.desktop-grid,:host ::ng-deep kendo-grid.desktop-grid{border-width:0px;width:100%;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-content,:host ::ng-deep kendo-grid.desktop-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar{margin-bottom:15px;padding:5px 0 0;display:flex;flex-direction:row;border:none;background:transparent;border-bottom:1px solid var(--ion-app-seperator-line-color)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-input,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-picker,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar .k-input,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar .k-picker{width:100%}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button{font-size:calc(var(--button-font-size) - 1px);margin-left:8px;margin-right:2px;border-radius:var(--button-border-radius);background:#fff;border:none;box-shadow:none;padding:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button.left-buttons,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button.left-buttons,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button.left-buttons{margin:auto 0 auto 5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-grid-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-grid-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-grid-button{padding:0 6px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button fa-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button fa-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button fa-icon{color:var(--ion-color-primary)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon{font-size:calc(var(--button-font-size) + 8px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon-with-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon-with-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon-with-text{margin-right:2px;font-size:calc(var(--button-font-size) + 2px);padding-bottom:3px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button:hover{background:rgba(var(--ion-color-primary-rgb),.2)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container{margin-top:auto;padding-bottom:1px;gap:5px;display:flex}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container.with-grid-title{margin-left:10px;border-left:1px solid #c9c9c9;padding-left:8px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text{height:18px;gap:8px;display:flex;margin:auto}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel{margin-top:-1px;font-size:calc(var(--button-font-size) + 6px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text{margin:auto}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container{flex:1 1 100%;border:1px solid var(--ion-app-seperator-line-color);display:grid}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container{display:grid;grid-template-columns:80% 20%;width:100%}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons{display:flex;margin:auto 5px auto auto;padding:0 5px;position:relative}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons.filter-field-layout-type2,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons.filter-field-layout-type2{top:12px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button{font-size:var(--button-font-size);margin-left:10px;height:calc(var(--input-field-height) + 2px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOn,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOn{--background: rgba(var(--ion-color-primary-rgb), 15%);--background-hover: rgba(var(--ion-color-primary-rgb), 10%);--color: var(--ion-color-primary);--border-color: var(--ion-color-primary)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOff,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOff{--background: var(--disabled-input-field-backgroundcolor);--border-color: var(--z-placeholder-color);--color: var(--z-placeholder-color);--background-hover: #efefef}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button .btn-label,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button .btn-label{padding-left:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container{margin-top:10px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator{width:100%;height:calc(var(--content-font-size) - 1px);border-bottom:1px solid var(--ion-color-primary);text-align:center}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator span,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator span{font-size:calc(var(--content-font-size) + 3px);background:#fff;padding:0 20px;color:var(--ion-color-primary);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid.toolbar-no-border .k-toolbar,:host ::ng-deep kendo-grid.desktop-grid.toolbar-no-border .k-toolbar{margin-bottom:0;border-width:0px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-aria-root,:host ::ng-deep kendo-grid.desktop-grid .k-grid-aria-root{border:1px solid var(--ion-color-primary);border-radius:5px 5px 0 0}:host ::ng-deep kendo-treelist.desktop-grid.hiden-pager .k-grid-aria-root,:host ::ng-deep kendo-grid.desktop-grid.hiden-pager .k-grid-aria-root{border-radius:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header{font-weight:600;font-size:var(--grid-header-font-size);background:rgba(var(--ion-color-primary-rgb),.25);color:#000}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-cell-inner>.k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-cell-inner>.k-link{padding:12px 12px 8px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-grid-filter,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-grid-filter.k-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu.k-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-active .k-grid-filter.k-state-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu.k-state-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-grid-filter,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-grid-filter.k-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu.k-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-active .k-grid-filter.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-state-active{color:#000;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-dropdown-wrap,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-dropdown-wrap{background:var(--ion-color-primary-contrast);color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-button{color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator{display:flex}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator>.k-button.k-clear-button-visible,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator>.k-button.k-clear-button-visible{margin-left:4px}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr,:host ::ng-deep kendo-grid.desktop-grid tbody>tr{background:rgba(var(--ion-color-primary-rgb),.08);font-size:var(--grid-cell-font-size)}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-alt{background:rgba(var(--ion-color-primary-rgb),.01)}:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected.k-alt,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected.k-alt>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected.k-alt,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected.k-alt>td,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-selected.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-selected.k-alt>td,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-state-selected.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-selected>td,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-selected.k-alt>td{background:rgba(var(--ion-color-secondary-rgb),.8);color:var(--ion-color-secondary-contrast);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr:hover,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-hover,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr:hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-hover{background-color:rgba(var(--ion-color-secondary-rgb),.15)}:host ::ng-deep kendo-treelist.desktop-grid tbody td>.gridCell>span>div>span,:host ::ng-deep kendo-grid.desktop-grid tbody td>.gridCell>span>div>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager{background-color:rgba(var(--ion-color-primary-rgb),.25);color:#000;border:1px solid var(--ion-color-primary);border-top:none;border-radius:0 0 5px 5px;font-size:calc(var(--grid-cell-font-size) - 2px);padding:2px 10px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link{color:#000;border-radius:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover{color:#fff;background-image:linear-gradient(rgba(var(--ion-color-primary-rgb),.7),rgba(var(--ion-color-primary-rgb),.8))}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected.k-state-hover{color:var(--ion-color-primary);background:var(--ion-color-primary-contrast);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid.cellWrapText td>.gridCell>span>div>span,:host ::ng-deep kendo-grid.desktop-grid.cellWrapText td>.gridCell>span>div>span{white-space:pre-line}:host ::ng-deep kendo-treelist .cellStyleConditionDefault,:host ::ng-deep kendo-grid .cellStyleConditionDefault{border-radius:5px;text-align:center}:host ::ng-deep kendo-treelist .rightAligned,:host ::ng-deep kendo-grid .rightAligned{text-align:right}:host ::ng-deep kendo-treelist .centerAligned,:host ::ng-deep kendo-grid .centerAligned{text-align:center}.gridTitle{font-size:calc(var(--grid-header-font-size) + 8px);font-weight:700;margin:auto 5px;color:var(--ion-color-dark);padding-top:2px;display:inherit}.gridTitleIcon{color:var(--ion-color-dark);font-size:calc(var(--grid-header-font-size) + 2px);display:block;margin:auto 0;padding-top:2px}.refresh-btn{zoom:.8}.refresh-btn>.k-i-refresh-sm{transform:rotate(30deg);font-size:1.4rem}.toolbar-left-item{flex-grow:1;display:flex}.toolbar-right-item{bottom:2px;position:relative}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-dark)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;inset:100px 0 0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"] }]
|
|
1125
|
-
}], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.FontAweSomeService }, { type: i3.ActivatedRoute }, { type: i3.Router }, { type: i4.FormBuilder }, { type: i2.WebApiService }, { type: i2.ToastService }, { type: i2.ZCoreService }, { type: i2.StorageSessionService }, { type: i5.MainService }, { type: i0.ChangeDetectorRef }, { type: i6.ZGridService }, { type: i2.
|
|
1148
|
+
], template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div class=\"grid-container e1tag-style\" [ngClass]=\"data.Class\" [style]=\"componentProperties.style.style\">\r\n\r\n <!-- <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div> -->\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <kendo-popover #gridPopOver [position]=\"data.PopOverPosition || 'bottom'\" [templateData]=\"getContextData.bind(this)\">\r\n <!-- <ng-template kendoPopoverTitleTemplate let-data=\"data\" >\r\n <div [style]=\"data.TitleStyle\" *ngIf=\"data && data.Title\" [innerHTML]=\"data.Title\"></div>\r\n </ng-template> -->\r\n <ng-template kendoPopoverBodyTemplate let-data=\"data\">\r\n <div [style]=\"data.BodyStyle\" class=\"popoverbody\" *ngIf=\"data && data.Body\" [innerHTML]=\"data.Body | htmlSanitize\" [ngClass]=\"data.BodyClass\" (mouseleave)=\"closePopOver.call(this, $event)\"></div>\r\n </ng-template>\r\n </kendo-popover>\r\n\r\n <div kendoTooltip showOn=\"none\" [tooltipTemplate]=\"template\" filter=\".k-grid td\" (mouseover)=\"showTooltip($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n <div kendoPopoverContainer [popover]=\"gridPopOver\" filter=\"div.gridCell.withPopoverInGrid\" showOn=\"none\" kendoPopoverContainer #popovercontainer=\"kendoPopoverContainer\">\r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject, gridSetting: gridSetting}\" [ngClass]=\"data.Class\" class=\"desktop-grid e1tag-style2\"\r\n [scrollable]=\"data.scrollAble === false ? 'none' : 'scrollable'\"\r\n [pageable]=\"pageable\"\r\n [class.hiden-pager]=\"!pageable\"\r\n [pageSize]=\"gridSetting.gridState.take\"\r\n [skip]=\"gridSetting.gridState.skip\"\r\n [sort]=\"gridSetting.gridState.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"gridSetting.gridState.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"rowSelection\"\r\n [style]=\"componentProperties.style.style2\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\"\r\n (columnResize)=\"adjustWidthUponResize()\"\r\n (excelExport)=\"onExcelExport($event)\"\r\n [rowClass]=\"rowCallback.bind(this)\">\r\n <ng-template kendoGridToolbarTemplate\r\n *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.CacheInfo?.EnableSaveState || data.Title || data.GridButtonFieldName_WF || data.GridButtonFieldName || data.EnableGridCommand || data.EnableCustomAddCommand || data.EnableCustomResetCommand\">\r\n <div class=\"toolbar-left-item\" *ngIf=\"gridTitle || data.AllowRefreshButton || data.AllowExport\">\r\n <!-- <fa-icon *ngIf=\"data.Icon\" class=\"gridTitleIcon\" [icon]=\"data.Icon\"></fa-icon> -->\r\n <kendo-label class=\"gridTitle\" *ngIf=\"gridTitle\">{{ gridTitle }}</kendo-label>\r\n <button title=\"Refresh\" type=\"button\" class=\"left-buttons refresh-button\" kendoButton (click)=\"refreshData()\"\r\n *ngIf=\"data.AllowRefreshButton\">\r\n <span class=\"k-icon k-grid-button k-i-refresh-sm\"></span>\r\n </button>\r\n <div class=\"toolbar-left-item-second-container\" *ngIf=\"data.AllowExport\" [class.with-grid-title]=\"gridTitle || data.AllowRefreshButton\">\r\n <button type=\"button\" class=\"left-buttons export-button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\">\r\n <!-- <span class=\"k-icon k-i-file-excel\"></span> -->\r\n <fa-icon icon=\"download\"></fa-icon>\r\n <span class=\"export-to-excel-button-text\">{{ getToolBarItemLabelName('Download as Excel') }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"toolbar-right-item\" *ngIf=\"gridBtn || data.CacheInfo?.EnableSaveState || gridDefaultStateExist || data.EnableGridCommand || data.EnableCustomAddCommand || data.EnableCustomResetCommand\">\r\n <app-zworkflowbuttons *ngIf=\"gridBtn && gridBtn.Type === 'zworkflowbuttons'\" [data]=\"gridBtn\" [group]=\"group\" [form]=\"form\"></app-zworkflowbuttons>\r\n <app-zbuttons *ngIf=\"gridBtn && gridBtn.Type === 'zbuttons'\" [data]=\"gridBtn\" [group]=\"group\" [form]=\"form\"></app-zbuttons>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.CacheInfo?.EnableSaveState\">\r\n <span class=\"k-icon k-icon-with-text k-i-star\"></span>{{ getToolBarItemLabelName('Save Settings') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"showRestoreGridSettingButton\">\r\n <span class=\"k-icon k-icon-with-text k-i-star-outline\"></span>{{ getToolBarItemLabelName('Restore Settings') }}\r\n </button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-add\"></span>{{ getToolBarItemLabelName(data.AddCommandButtonName ? data.AddCommandButtonName: 'Add') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"gridCustomAddCommand(group)\" *ngIf=\"data.EnableCustomAddCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-add\"></span>{{ getToolBarItemLabelName(data.AddCommandButtonName ? data.AddCommandButtonName: 'Add') }}\r\n </button>\r\n <button type=\"button\" kendoButton (click)=\"gridCustomResetCommand(group)\" *ngIf=\"data.EnableCustomResetCommand\">\r\n <span class=\"k-icon k-icon-with-text k-i-trash\"></span>{{ getToolBarItemLabelName(data.ResetCommandButtonName ? data.ResetCommandButtonName: 'Reset') }}\r\n </button>\r\n </div>\r\n <div class=\"filter-container\" *ngIf=\"data.GridFilterBarField\">\r\n <div class=\"normal-filter-container\">\r\n <app-zform class=\"filter-fields\" [group]=\"filterGroup\" [fieldName]=\"data.GridFilterBarField\"></app-zform>\r\n <div class=\"filter-buttons\" [ngClass]=\"data.Class\">\r\n <ion-button fill=\"solid\" size=\"default\" strong=\"true\" color=\"primary\" (click)=\"search()\">\r\n <fa-icon icon=\"search\"></fa-icon>\r\n <span class=\"btn-label ion-text-capitalize\">{{ getToolBarItemLabelName('Search') }}</span>\r\n </ion-button>\r\n <ion-button fill=\"outline\" size=\"default\" strong=\"true\" color=\"primary\" (click)=\"cancelEdit()\" *ngIf=\"data.IsShowGridCancelFilterButton\">\r\n <fa-icon icon=\"times\"></fa-icon>\r\n </ion-button>\r\n <ion-button fill=\"solid\" size=\"default\" strong=\"true\" [ngClass]=\"isShowAdvFilter ? 'toggleOn' : 'toggleOff'\" (click)=\"advancedSearch()\" *ngIf=\"data.GridAdvFilterBarField\">\r\n <fa-icon icon=\"sliders-h\"></fa-icon>\r\n </ion-button>\r\n </div>\r\n </div>\r\n <app-zform *ngIf=\"data.GridAdvFilterBarField\" class=\"to-preload-the-fields\" [group]=\"advfilterGroup\" [fieldName]=\"data.GridAdvFilterBarField\" style=\"display:none;\"></app-zform>\r\n <div class=\"adv-filter-container\" *ngIf=\"isShowAdvFilter\" [@hideAndShowAnimation]>\r\n <div class=\"adv-filter-seperator\">\r\n <span>\r\n {{ getToolBarItemLabelName('Advanced Search') }}\r\n </span>\r\n </div>\r\n <app-zform class=\"advfilter-fields\" [group]=\"advfilterGroup\" [fieldName]=\"data.GridAdvFilterBarField\"></app-zform>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\" [locked]=\"checkboxColumnPinned\">\r\n </kendo-grid-checkbox-column>\r\n <kendo-grid-column [style]=\"getGridColumnStyle()\" class=\"e1tag-style3\" *ngFor=\"let col of columns;\" [field]=\"col.field\" [title]=\"col.title\" [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\" [filter]=\"col.filter\" [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\" [headerStyle]=\"getGridHeaderStyle()\" headerClass=\"e1tag-style4\"\r\n [footerStyle]=\"getGridFooterStyle()\" footerClass=\"e1tag-style9\" [hidden]=\"col.hidden\"\r\n [format]=\"col.format\" [class]=\"col.Class\" [locked]=\"locked(col)\" editor=\"numeric\" [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" class=\"date-range-filter\"\r\n [filter]=\"filter\" [field]=\"col.field\" [data]=\"data\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType === 'checkbox'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-boolean-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n </kendo-grid-boolean-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [showOperators]=\"data.IsShowGridFilterOperator\" [column]=\"column\"\r\n [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n -l\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\"\r\n [ngSwitch]=\"col.fieldType\" [ngClass]=\"getClass(dataItem, col)\" [style]=\"getCellStyle(col, dataItem)\" [attr.data-id]=\"dataItem.Id\" [attr.column-name]=\"col.field\"\r\n (mouseenter)=\"showPopOver(col, $event)\" (mouseleave)=\"closePopOver($event)\">\r\n <span *ngSwitchCase=\"'zdate'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\" class=\"grid-cell-data\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.gridCellReplaceValue && getIconName(col.gridCellReplaceValue, dataItem[col.field]) !== ''\">\r\n <fa-icon [icon]=\"getIconName(col.gridCellReplaceValue, dataItem[col.field])\"></fa-icon>\r\n </div>\r\n <div *ngIf=\"!col.gridCellReplaceValue\" [ngSwitch]=\"cellStyleCondition(col, dataItem[col.field])\">\r\n <span *ngSwitchCase=true>\r\n <div class=\"cellStyleConditionDefault\" [style]=\"setCellStyleCondition(col, dataItem[col.field])\">\r\n <span class=\"grid-cell-data\">{{ dataItem[col.field] }} </span>\r\n </div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <span class=\"grid-cell-data\">{{ dataItem[col.field] }} </span>\r\n </span>\r\n </div>\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && isInlineFormGroupHasValue() && !isInlineEditInputFieldLoading && !col.gridCellReplaceValue\" [style]=\"componentProperties.style.style5\"\r\n [ngClass]=\"getClass(dataItem, col)\" class=\"e1tag-style5\" [style]=\"getCellStyleForInlineEdit(col, dataItem, rowIndex)\">\r\n <app-zinput-container [data]=\"getInlineField(col.field)\" [group]=\"group\"\r\n [form]=\"getInlineForm(dataItem, rowIndex)\" [containerField]=\"containerField\" [style]=\"componentProperties.style.style6\" class=\"e1tag-style6\">\r\n </app-zinput-container>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\" [style]=\"componentProperties.style.style7\" class=\"e1tag-style7\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: col.FormatOptions ?? 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableCustomRemoveCommand\" width=\"180\" [columnMenu]=\"false\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\" let-dataItem let-rowIndex=\"rowIndex\">\r\n <button type=\"button\" kendoButton (click)=\"gridCustomRemoveCommand(dataItem, rowIndex)\" *ngIf=\"data.EnableCustomRemoveCommand\">\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <app-context-menu [data]=\"data\" [group]=\"group\" [form]=\"form\" #dataitemcontextmenu></app-context-menu>\r\n </div>\r\n </div>\r\n <!-- for DEC auto scrolling -->\r\n <div id=\"end-of-grid\"></div>\r\n</div>\r\n\r\n", styles: [".grid-container.align-with-input{margin:0 25px 0 10px}:host ::ng-deep kendo-treelist.desktop-grid,:host ::ng-deep kendo-grid.desktop-grid{border-width:0px;width:100%;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-content,:host ::ng-deep kendo-grid.desktop-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar{margin-bottom:15px;padding:5px 0 0;display:flex;flex-direction:row;border:none;background:transparent;border-bottom:1px solid var(--ion-app-seperator-line-color)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-input,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-picker,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar .k-input,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar .k-picker{width:100%}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button{font-size:calc(var(--button-font-size) - 1px);margin-left:8px;margin-right:2px;border-radius:var(--button-border-radius);background:#fff;border:none;box-shadow:none;padding:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button.left-buttons,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button.left-buttons,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button.left-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button.left-buttons{margin:auto 0 auto 5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-grid-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-grid-button,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-grid-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-grid-button{padding:0 6px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button fa-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button fa-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button fa-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button fa-icon{color:var(--ion-color-primary)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon{font-size:calc(var(--button-font-size) + 8px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon-with-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon-with-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button .k-icon-with-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button .k-icon-with-text{margin-right:2px;font-size:calc(var(--button-font-size) + 2px);padding-bottom:3px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item .k-button:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item .k-button:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item .k-button:hover,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item .k-button:hover{background:rgba(var(--ion-color-primary-rgb),.2)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container{margin-top:auto;padding-bottom:1px;gap:5px;display:flex}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container.with-grid-title,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container.with-grid-title{margin-left:10px;border-left:1px solid #c9c9c9;padding-left:8px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text{height:18px;gap:8px;display:flex;margin:auto}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .k-i-file-excel{margin-top:-1px;font-size:calc(var(--button-font-size) + 6px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-left-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.toolbar-right-item>.toolbar-left-item-second-container .k-button.k-grid-excel>.k-button-text .export-to-excel-button-text{margin:auto}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container{flex:1 1 100%;border:1px solid var(--ion-app-seperator-line-color);display:grid}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container{display:grid;grid-template-columns:80% 20%;width:100%}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons{display:flex;margin:auto 5px auto auto;padding:0 5px;position:relative}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons.filter-field-layout-type2,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons.filter-field-layout-type2{top:12px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button{font-size:var(--button-font-size);margin-left:10px;height:calc(var(--input-field-height) + 2px)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOn,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOn{--background: rgba(var(--ion-color-primary-rgb), 15%);--background-hover: rgba(var(--ion-color-primary-rgb), 10%);--color: var(--ion-color-primary);--border-color: var(--ion-color-primary)}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOff,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button.toggleOff{--background: var(--disabled-input-field-backgroundcolor);--border-color: var(--z-placeholder-color);--color: var(--z-placeholder-color);--background-hover: #efefef}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button .btn-label,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.normal-filter-container>.filter-buttons>ion-button .btn-label{padding-left:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container{margin-top:10px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator{width:100%;height:calc(var(--content-font-size) - 1px);border-bottom:1px solid var(--ion-color-primary);text-align:center}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator span,:host ::ng-deep kendo-grid.desktop-grid .k-toolbar>.filter-container>.adv-filter-container>.adv-filter-seperator span{font-size:calc(var(--content-font-size) + 3px);background:#fff;padding:0 20px;color:var(--ion-color-primary);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid.toolbar-no-border .k-toolbar,:host ::ng-deep kendo-grid.desktop-grid.toolbar-no-border .k-toolbar{margin-bottom:0;border-width:0px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-aria-root,:host ::ng-deep kendo-grid.desktop-grid .k-grid-aria-root{border:1px solid var(--ion-color-primary);border-radius:5px 5px 0 0}:host ::ng-deep kendo-treelist.desktop-grid.hiden-pager .k-grid-aria-root,:host ::ng-deep kendo-grid.desktop-grid.hiden-pager .k-grid-aria-root{border-radius:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header{font-weight:600;font-size:var(--grid-header-font-size);background:rgba(var(--ion-color-primary-rgb),.25);color:#000}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-cell-inner>.k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-cell-inner>.k-link{padding:12px 12px 8px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-grid-filter,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-grid-filter.k-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu.k-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-active .k-grid-filter.k-state-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-header-column-menu.k-state-active,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-grid-filter,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-grid-filter.k-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu.k-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-active .k-grid-filter.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-header-column-menu.k-state-active,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-hierarchy-cell .k-icon.k-state-active{color:#000;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-dropdown-wrap,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-dropdown-wrap{background:var(--ion-color-primary-contrast);color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-button,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdown .k-button,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell .k-dropdowntree .k-button{color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator{display:flex}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator>.k-button.k-clear-button-visible,:host ::ng-deep kendo-grid.desktop-grid .k-grid-header .k-filtercell>.k-filtercell-wrapper>.k-filtercell-operator>.k-button.k-clear-button-visible{margin-left:4px}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr,:host ::ng-deep kendo-grid.desktop-grid tbody>tr{background:rgba(var(--ion-color-primary-rgb),.08);font-size:var(--grid-cell-font-size)}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-alt{background:rgba(var(--ion-color-primary-rgb),.01)}:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected.k-alt,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected.k-alt>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected.k-alt,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected.k-alt>td,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-selected.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-selected.k-alt>td,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid tbody>td.k-state-selected.k-alt,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-selected>td,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-selected.k-alt>td{background:rgba(var(--ion-color-secondary-rgb),.8);color:var(--ion-color-secondary-contrast);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr:hover,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-hover,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr:hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-hover,:host ::ng-deep kendo-grid.desktop-grid tbody>tr.k-state-hover{background-color:rgba(var(--ion-color-secondary-rgb),.15)}:host ::ng-deep kendo-treelist.desktop-grid tbody td>.gridCell>span>div>span,:host ::ng-deep kendo-grid.desktop-grid tbody td>.gridCell>span>div>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager{background-color:rgba(var(--ion-color-primary-rgb),.25);color:#000;border:1px solid var(--ion-color-primary);border-top:none;border-radius:0 0 5px 5px;font-size:calc(var(--grid-cell-font-size) - 2px);padding:2px 10px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link{color:#000;border-radius:5px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-hover :host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-hover{color:#fff;background-image:linear-gradient(rgba(var(--ion-color-primary-rgb),.7),rgba(var(--ion-color-primary-rgb),.8))}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected.k-state-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected.k-hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected:hover,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-numbers .k-link.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-refresh.k-state-selected.k-state-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-selected.k-hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected:hover,:host ::ng-deep kendo-grid.desktop-grid .k-grid-pager .k-pager-nav.k-link.k-state-selected.k-state-hover{color:var(--ion-color-primary);background:var(--ion-color-primary-contrast);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid.cellWrapText td>.gridCell>span>div>span,:host ::ng-deep kendo-grid.desktop-grid.cellWrapText td>.gridCell>span>div>span{white-space:pre-line}:host ::ng-deep kendo-treelist .cellStyleConditionDefault,:host ::ng-deep kendo-grid .cellStyleConditionDefault{border-radius:5px;text-align:center}:host ::ng-deep kendo-treelist .rightAligned,:host ::ng-deep kendo-grid .rightAligned{text-align:right}:host ::ng-deep kendo-treelist .centerAligned,:host ::ng-deep kendo-grid .centerAligned{text-align:center}.gridTitle{font-size:calc(var(--grid-header-font-size) + 8px);font-weight:700;margin:auto 5px;color:var(--ion-color-dark);padding-top:2px;display:inherit}.gridTitleIcon{color:var(--ion-color-dark);font-size:calc(var(--grid-header-font-size) + 2px);display:block;margin:auto 0;padding-top:2px}.refresh-btn{zoom:.8}.refresh-btn>.k-i-refresh-sm{transform:rotate(30deg);font-size:1.4rem}.toolbar-left-item{flex-grow:1;display:flex}.toolbar-right-item{bottom:2px;position:relative}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-dark)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;inset:100px 0 0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"] }]
|
|
1149
|
+
}], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.FontAweSomeService }, { type: i3.ActivatedRoute }, { type: i3.Router }, { type: i4.FormBuilder }, { type: i2.WebApiService }, { type: i2.ToastService }, { type: i2.ZCoreService }, { type: i2.StorageSessionService }, { type: i5.MainService }, { type: i0.ChangeDetectorRef }, { type: i6.ZGridService }, { type: i2.StateSettingService }, { type: i2.ResourceApiService }, { type: i2.AuthService }]; }, propDecorators: { tooltipDir: [{
|
|
1126
1150
|
type: ViewChild,
|
|
1127
1151
|
args: [TooltipDirective]
|
|
1128
1152
|
}], elementContainer: [{
|
|
1129
1153
|
type: ViewChild,
|
|
1130
1154
|
args: [ElementContainerDirective, { static: true }]
|
|
1131
1155
|
}] } });
|
|
1132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXFCLFNBQVMsRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsV0FBVyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUYsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JELE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHbkUsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRXBGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXJGLE9BQU8sRUFFRyxNQUFNLEVBQWMsZ0JBQWdCLEVBRTdDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGVBQWUsRUFBRSxr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LENBQUM7WUFDaEIsS0FBSyxVQUFVO2dCQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRTtvQkFDdEMsT0FBTyxVQUFVLENBQUM7aUJBQ25CO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2Q7Z0JBQ0UsT0FBTyxHQUFHLENBQUM7U0FDZDtJQUNILENBQUM7SUFDRCxZQUFZO0lBRVosc0NBQXNDO0lBQ3RDLElBQVcsWUFBWSxDQUFDLFFBQWdCO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFXLFlBQVksQ0FBQyxLQUFZO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDOzsyR0EvdkNVLGNBQWM7K0ZBQWQsY0FBYyw2RkFDZCxnQkFBZ0IsbUZBQ2hCLHlCQUF5QixxRkM3RHRDLDBuM0JBOFlBLGk3dkNEeFZjO1FBQ1YsNEJBQTRCO0tBQzdCOzJGQUdVLGNBQWM7a0JBVDFCLFNBQVM7K0JBQ0UsV0FBVyxjQUdUO3dCQUNWLDRCQUE0QjtxQkFDN0I7c2VBSW1DLFVBQVU7c0JBQTdDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUM2QixnQkFBZ0I7c0JBQXZFLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBWaWV3Q2hpbGQsIEFmdGVyVmlld0NoZWNrZWQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBkZWxheSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHRhcCwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRXhjZWxFeHBvcnREYXRhIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZXhjZWwtZXhwb3J0JztcclxuaW1wb3J0IHsgR3JpZEl0ZW0sIFNlbGVjdGFibGVTZXR0aW5ncywgU2VsZWN0aW9uRXZlbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkJztcclxuaW1wb3J0IHsgU29ydERlc2NyaXB0b3IsIFN0YXRlLCBwcm9jZXNzIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1kYXRhLXF1ZXJ5XCI7XHJcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci10b29sdGlwJztcclxuaW1wb3J0IHsgR3JpZERhdGFSZXN1bHQsIERhdGFTdGF0ZUNoYW5nZUV2ZW50LCBQYWdlQ2hhbmdlRXZlbnQsIENlbGxDbGlja0V2ZW50LCBHcmlkQ29tcG9uZW50LCBSb3dBcmdzIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWRcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGF0YUxpc3RpbmdGaWVsZEJhc2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9kYXRhbGlzdGluZ2ZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGhpZGVBbmRTaG93VmVydGljYWxBbmltYXRpb24gfSBmcm9tIFwiLi4vYW5pbWF0aW9ucy9jb21wb25lbnQtYW5pbWF0aW9uc1wiO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb25zdGFudCB9IGZyb20gXCIuLi9jb25zdGFudHMvY29uc3RhbnRcIjtcclxuaW1wb3J0IHsgTWFpblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvbWFpbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRDb250YWluZXJEaXJlY3RpdmUgfSBmcm9tIFwiLi4vZGlyZWN0aXZlcy9lbGVtZW50Y29udGFpbmVyLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgfSBmcm9tIFwiLi96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQge1xyXG4gIFdlYkFwaVNlcnZpY2UsIFRvYXN0U2VydmljZSxcclxuICBaRmllbGQsIFpHcm91cCwgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBaQ29yZVNlcnZpY2UsIFN0b3JhZ2VTZXNzaW9uU2VydmljZSwgRm9udEF3ZVNvbWVTZXJ2aWNlLFxyXG4gIFpHcmlkUG9zdEFwaVBhcmFtcywgWkdyaWRTZXR0aW5ncywgWkdyaWRDdXN0b21Db2x1bW4sIE9mZmxpbmVEYXRhYmFzZVNlcnZpY2UsIEpzb25DYWNoZSwgUmVzb3VyY2VBcGlTZXJ2aWNlXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgR3JpZFNldHRpbmdUeXBlLCBHcmlkU3RhdGVMb2dpY1R5cGUsIFpHcmlkU2VydmljZSB9IGZyb20gXCIuL3pncmlkLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgWkdyaWQge1xyXG4gIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gIHN0YXRlOiBTdGF0ZTtcclxuICBjb2x1bW5zOiBhbnlbXTtcclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybDogc3RyaW5nO1xyXG4gIGRhdGE6IFpGaWVsZDtcclxuICBncm91cDogWkdyb3VwO1xyXG4gIHpncmlkOiBaR3JpZEJpbmRpbmdEaXJlY3RpdmU7XHJcbiAgaW5saW5lRWRpdGVkRm9ybUdyb3VwczogRm9ybUdyb3VwO1xyXG4gIGdldEdyaWREYXRhOiAoKSA9PiBhbnlbXTtcclxuICBnZXREYXRhOiAoKSA9PiB2b2lkO1xyXG4gIGNsZWFyRGF0YTogKCkgPT4gdm9pZDtcclxuICBzZXREYXRhOiAoZGF0YTogYW55KSA9PiB2b2lkO1xyXG4gIHNldENvbHVtbnM6IChjb2x1bW5GaWVsZHNOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikgPT4gdm9pZDtcclxuICAkc2V0Q29sdW1uczogKGNvbHVtbkZpZWxkc05hbWU6IHN0cmluZywgY29sdW1uczogQXJyYXk8WkdyaWRDdXN0b21Db2x1bW4+KSA9PiBPYnNlcnZhYmxlPGFueT47XHJcbiAgZ2V0Rm9ybUNvbnRyb2xEYXRhKCk6IGFueVtdO1xyXG59XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXpncmlkXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96Z3JpZC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96Z3JpZC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICBoaWRlQW5kU2hvd1ZlcnRpY2FsQW5pbWF0aW9uXHJcbiAgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFpncmlkQ29tcG9uZW50IGV4dGVuZHMgRGF0YUxpc3RpbmdGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZChUb29sdGlwRGlyZWN0aXZlKSBwdWJsaWMgdG9vbHRpcERpcjogVG9vbHRpcERpcmVjdGl2ZTtcclxuICBAVmlld0NoaWxkKEVsZW1lbnRDb250YWluZXJEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGVsZW1lbnRDb250YWluZXIhOiBFbGVtZW50Q29udGFpbmVyRGlyZWN0aXZlO1xyXG4gIC8vIEBWaWV3Q2hpbGQoWkdyaWRCaW5kaW5nRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UgfSkgemdyaWQ6IFpHcmlkQmluZGluZ0RpcmVjdGl2ZTtcclxuXHJcbiAgemdyaWQ6IGFueSA9IG51bGw7XHJcbiAgb2F1dGhVcmw6IHN0cmluZyA9IG51bGw7XHJcbiAgZ3JpZERhdGE6IEdyaWREYXRhUmVzdWx0O1xyXG4gIHNlbGVjdGFibGVTZXR0aW5nczogU2VsZWN0YWJsZVNldHRpbmdzO1xyXG4gIHJvd1NlbGVjdGlvbjogc3RyaW5nW10gPSBbXTtcclxuICBteVNlbGVjdGlvbiA9IG5ldyBNYXAoKTtcclxuICBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzID0ge307XHJcbiAgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwOyAvLyBmb3Iga2VuZG8gZ3JpZCBidWlsdC1pblxyXG4gIHB1YmxpYyBwcmV2aW91c05leHQ6IGJvb2xlYW47XHJcbiAgcHVibGljIGdyaWRCdG47XHJcbiAgcHVibGljIHBhZ2VhYmxlOiBhbnkgPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyR3JvdXAgPSBuZXcgWkdyb3VwKCk7XHJcbiAgcHVibGljIGFkdmZpbHRlckdyb3VwID0gbmV3IFpHcm91cCgpO1xyXG4gIHB1YmxpYyBpc1Nob3dBZHZGaWx0ZXIgPSBmYWxzZTtcclxuICBwdWJsaWMgZ3JpZFRpdGxlOiBhbnk7XHJcbiAgcHVibGljIGlzSW5saW5lRWRpdElucHV0RmllbGRMb2FkaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0ZW1wSW5saW5lRWRpdGVkRm9ybUdyb3VwcztcclxuICBwcml2YXRlIGlzQ29sdW1uSGVhZGVyVHJhbnNsYXRlZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93UmVzdG9yZUdyaWRTZXR0aW5nQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNoZWNrYm94Q29sdW1uUGlubmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICBwYXJhbXM6IFpHcmlkUG9zdEFwaVBhcmFtcyA9IHtcclxuICAgIHJlZmVySWQ6IG51bGwsXHJcbiAgICBwYWdlTm86IDAsXHJcbiAgICBwYWdlU2l6ZTogMjAsXHJcbiAgICBzb3J0Q29sdW1uTmFtZTogXCJcIixcclxuICAgIHNvcnRPcmRlcjogXCJcIixcclxuICAgIHNvcnRDb2x1bW5OYW1lczogW10sXHJcbiAgICBzb3J0T3JkZXJzOiBbXSxcclxuICAgIGZpbHRlclBhcmFtczogW10sXHJcbiAgICBwYXJhbWV0ZXJzOiBcIlwiLFxyXG4gICAgZmlsdGVyczogXCJcIixcclxuICAgIGNvbHVtbnM6IFwiXCIsXHJcbiAgICBncmFudFR5cGU6IDRcclxuICB9O1xyXG5cclxuICBncmlkU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICBjb2x1bW5zOiBhbnlbXTtcclxuICBnZW5lcmF0ZUhpZGRlbkNvbHVtbnNGaWVsZDogYW55W107XHJcbiAgZWRpdGFibGVDb2x1bW5zOiBhbnlbXTtcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwYWdlU2l6ZXM6IGJvb2xlYW4gfCBhbnlbXTtcclxuICBncmlkU3RvcmFnZUtleTogc3RyaW5nO1xyXG4gIGdyaWREZWZhdWx0U3RhdGVFeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTmV3OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGVkaXRlZFJvd0luZGV4OiBudW1iZXI7XHJcbiAgcHVibGljIGdyaWRTZXR0aW5nOiBaR3JpZFNldHRpbmdzO1xyXG4gIDtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjb21wb25lbnRTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZSxcclxuICAgIHB1YmxpYyBmb250QXdlU29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSxcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSB3ZWJBcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1haW5TZXJ2aWNlOiBNYWluU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IFpHcmlkU2VydmljZSxcclxuICAgIHByaXZhdGUgb2ZmbGluZURhdGFiYXNlU2VydmljZTogT2ZmbGluZURhdGFiYXNlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpO1xyXG4gICAgdGhpcy5vYXV0aFVybCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCkuZTFPYXV0aFVybCArIFwiL1wiO1xyXG4gICAgdGhpcy5hbGxSZXN1bHRzID0gdGhpcy5hbGxSZXN1bHRzLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoRGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5jbGVhckRhdGEgPSB0aGlzLmNsZWFyRGF0YS5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBzdXBlci5zZXR1cElubmVyRmllbGQoKTtcclxuICAgIHRoaXMuc2V0dXBGaWx0ZXJGZWF0dXJlKCk7XHJcbiAgICB0aGlzLnNldHVwR3JpZEJ1dHRvbnMoKTtcclxuICAgIHRoaXMuc2V0dXBHcmlkQ29tcG9uZW50QXR0cmlidXRlcygpO1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZyA9IHsgZ3JpZFN0YXRlOiB0aGlzLmdyaWRTZXJ2aWNlLnNldHVwR3JpZFNldHRpbmcodGhpcy5kYXRhKSB9O1xyXG5cclxuICAgIHRoaXMuc2V0dXBTdWJzY3JpcHRpb25Gb3JHcmlkU3ViamVjdCgpO1xyXG5cclxuICAgIHN1cGVyLnRyYW5zbGF0ZVRvb2xCYXJJdGVtcygpLnBpcGUodGFwKCgpID0+IHtcclxuICAgICAgdGhpcy5ncmlkQ2FsbGJhY2sodGhpcy5ncm91cCk7XHJcbiAgICB9KSkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZGVjcmVtZW50Q29tcG9uZW50Q291bnRlckZvckZpZWxkKHRoaXMuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XHJcbiAgICBjb25zdCBpc0JhY2tOYXZpZ2F0ZWQgPSAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIm5hdmlnYXRlZFJlbG9hZEdyaWRcIikgPT09ICd0cnVlJyk7XHJcblxyXG4gICAgaWYgKGlzQmFja05hdmlnYXRlZCkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNVc2VMb2NhbERhdGEoKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoXCJuYXZpZ2F0ZWRSZWxvYWRHcmlkXCIsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIEdyaWQgU3RhdGUgKHBhZ2luYXRpb24sIHNvcnRhYmxlLCBmaWx0ZXIsIG9yZGVyaW5nKVxyXG4gIHB1YmxpYyBkYXRhU3RhdGVDaGFuZ2Uoc3RhdGU6IERhdGFTdGF0ZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNVc2VMb2NhbERhdGEoKSkge1xyXG4gICAgICB0aGlzLnpncmlkLmRhdGFTdGF0ZUNoYW5nZShzdGF0ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyYWJsZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRhYmxlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9ja2VkKGNvbFNldHRpbmc6IGFueSkge1xyXG4gICAgaWYgKGNvbFNldHRpbmdbJ3Bpbm5lZExlZnQnXSA9PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHVibGljIG9uRXhjZWxFeHBvcnQoZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBjb2xSZXF1aXJlZEZvcm1hdCA9IFtdO1xyXG5cclxuICAgIC8vIENvbGxlY3QgY29sdW1ucyB0aGF0IGhhdmUgYSBzcGVjaWZpYyBFeGNlbCBjZWxsIGZvcm1hdFxyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgaWYgKGNvbC5FeGNlbENlbGxGb3JtYXQpIHtcclxuICAgICAgICBjb2xSZXF1aXJlZEZvcm1hdC5wdXNoKHsgY29sTmFtZTogY29sLkRpc3BsYXlOYW1lID8/IGNvbC5OYW1lLCBjZWxsRm9ybWF0OiBjb2wuRXhjZWxDZWxsRm9ybWF0LCBjb2xJbmRleDogbnVsbCB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGNvbFJlcXVpcmVkRm9ybWF0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZS53b3JrYm9vay5zaGVldHNbMF0ucm93cy5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgIGlmIChyb3cudHlwZSA9PT0gJ2hlYWRlcicpIHtcclxuICAgICAgICAvLyBDaGVjayBoZWFkZXIgY2VsbHMgdG8gZmluZCBtYXRjaGluZyBjb2x1bW4gbmFtZXMgYW5kIHN0b3JlIHRoZWlyIGluZGV4XHJcbiAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGwsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBjb2xSZXF1aXJlZEZvcm1hdC5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjZWxsLnZhbHVlID09PSBjb2wuY29sTmFtZSkge1xyXG4gICAgICAgICAgICAgIGNvbC5jb2xJbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChyb3cudHlwZSA9PT0gJ2RhdGEnKSB7XHJcbiAgICAgICAgLy8gQXBwbHkgdGhlIGZvcm1hdCB0byBjZWxscyBpbiBkYXRhIHJvd3MgaWYgdGhlaXIgaW5kZXggbWF0Y2hlc1xyXG4gICAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgY29sUmVxdWlyZWRGb3JtYXQuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IGNvbC5jb2xJbmRleCkge1xyXG4gICAgICAgICAgICAgIGNlbGwuZm9ybWF0ID0gY29sLmNlbGxGb3JtYXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBHcmlkIENvbHVtbnNcclxuICBwdWJsaWMgaXNTZWxlY3RPcHRpb24oKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgY2hlY2tib3hPbmx5OiBmYWxzZSxcclxuICAgICAgICBtb2RlOiAodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnM/LnRvTG93ZXJDYXNlKCkgPT09IFwibXVsdGlwbGVcIikgPyBcIm11bHRpcGxlXCIgOiBcInNpbmdsZVwiXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENvbHVtbnMoY29sdW1uTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBBcnJheTxaR3JpZEN1c3RvbUNvbHVtbj4pIHtcclxuICAgIHRoaXMuZ3JvdXBbY29sdW1uTmFtZV0gPSB0aGlzLndyYXBDb2x1bW5OYW1lc0luRmllbGRFbGVtZW50KGNvbHVtbnMpO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgJHNldENvbHVtbnMoY29sdW1uTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBBcnJheTxaR3JpZEN1c3RvbUNvbHVtbj4pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5ncm91cFtjb2x1bW5OYW1lXSA9IHRoaXMud3JhcENvbHVtbk5hbWVzSW5GaWVsZEVsZW1lbnQoY29sdW1ucyk7XHJcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdyYXBDb2x1bW5OYW1lc0luRmllbGRFbGVtZW50KGNvbHVtbkxpc3Q6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikge1xyXG4gICAgcmV0dXJuIG9mKGNvbHVtbkxpc3QubWFwKGMgPT4ge1xyXG4gICAgICBjb25zdCBpc0hpZGRlbjogYm9vbGVhbiA9IGMuSGlkZGVuO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIE5hbWU6IGMuTmFtZSxcclxuICAgICAgICBWYWx1ZTogYy5Db2RlLFxyXG4gICAgICAgIFR5cGU6IGMuVHlwZSxcclxuICAgICAgICBncmlkQ29sVmlzaWJsZTogIWlzSGlkZGVuLFxyXG4gICAgICAgIEVuYWJsZUdyaWRWYWx1ZTogYy5FbmFibGVHcmlkVmFsdWUgfHwgZmFsc2UsXHJcbiAgICAgICAgd2lkdGg6IDEwMCArIGMuTmFtZS5sZW5ndGggKiA0LFxyXG4gICAgICAgIGVuYWJsZUZpbHRlcmluZzogZmFsc2UsXHJcbiAgICAgICAgZW5hYmxlU29ydGluZzogdHJ1ZSxcclxuICAgICAgICBlbmFibGVQaW5uaW5nOiB0cnVlLFxyXG4gICAgICAgIERpdkNsYXNzOiBcImNvbC14cy0xMiBjb2wtc20tNlwiLFxyXG4gICAgICAgIElzRWRpdGFibGVJbkdyaWQ6IGMuRWRpdGFibGVcclxuICAgICAgfTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVHcmlkQ29sdW1ucyhncmlkU2V0dGluZz86IFpHcmlkU2V0dGluZ3MpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgY29sdW1uRmllbGRzJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmRhdGEuQ29sdW1uRmllbGRzLFxyXG4gICAgICB0aGlzLmdyb3VwXHJcbiAgICApIHx8IG9mKFtdKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGF0YS5Db2x1bW5GaWVsZHMpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkL0VtcHR5IGdyaWQoJyArIHRoaXMuZGF0YS5OYW1lICsgJykgY29sdW1uRmllbGQnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbHVtbkZpZWxkcyQpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0ZhaWwgdG8gZ2VuZXJhdGUgZ3JpZCBjb2x1bW4gZmllbGRzLicpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmRhdGEuQ29sdW1uRmllbGRzKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5ncm91cCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbkZpZWxkcyQucGlwZShcclxuICAgICAgdGFwKGNvbHVtbkZpZWxkID0+IHtcclxuICAgICAgICBpZiAoIWNvbHVtbkZpZWxkKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQvRW1wdHkgZ3JpZCgnICsgdGhpcy5kYXRhLk5hbWUgKyAnKSBkYXRhIHRvIGdlbmVyYXRlIGNvbHVtbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgICAgICAgY29uc3QgZ2VuZXJhdGVIaWRkZW5Db2x1bW5zID0gW107XHJcblxyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh7XHJcbiAgICAgICAgICAgIGNvbHVtbkZpZWxkOiBjb2x1bW5GaWVsZCxcclxuICAgICAgICAgICAgY29sdW1uczogdGhpcy5jb2x1bW5zLFxyXG4gICAgICAgICAgICBncm91cDogdGhpcy5ncm91cCxcclxuICAgICAgICAgICAgY29sdW1uQ29uZmlndXJhdGlvbnM6IGdyaWRTZXR0aW5nPy5jb2x1bW5Db25maWd1cmF0aW9ucyxcclxuICAgICAgICAgICAgZ2VuZXJhdGVIaWRkZW5Db2x1bW5zOiBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMsXHJcbiAgICAgICAgICAgIGdyaWRBdHRyaWJ1dGVzOiB0aGlzLmRhdGFcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGlmIChnZW5lcmF0ZUhpZGRlbkNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlSGlkZGVuQ29sdW1uc0ZpZWxkID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IGdlbmVyYXRlSGlkZGVuQ29sdW1uc0ZpZWxkID0gZ2VuZXJhdGVIaWRkZW5Db2x1bW5zLm1hcChmaWVsZCA9PiAoeyBmaWVsZDogZmllbGQsIFZpc2libGU6IHRydWUsIElzUmVxdWlyZWQ6IGZhbHNlLCBWYWx1ZTogZmllbGQgfSkpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGdlbmVyYXRlSGlkZGVuQ29sdW1uc0ZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnNGaWVsZC5wdXNoKGZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcih0aGlzLmNvbHVtbnMpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldEljb25OYW1lKGdyaWRDZWxsUmVwbGFjZVZhbHVlOiBhbnksIHZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChncmlkQ2VsbFJlcGxhY2VWYWx1ZSAmJiBncmlkQ2VsbFJlcGxhY2VWYWx1ZVt2YWx1ZV0pIHtcclxuICAgICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0Rm9udEF3ZXNvbWUoZ3JpZENlbGxSZXBsYWNlVmFsdWVbdmFsdWVdLCB0aGlzLmZvbnRBd2VTb21lU2VydmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGdyaWQgc3R5bGluZ1xyXG4gIHB1YmxpYyBjZWxsU3R5bGVDb25kaXRpb24oY29sLCBjb2xWYWx1ZTogYW55KSB7XHJcbiAgICBpZiAoY29sWydDZWxsU3R5bGVDb25kaXRpb24nXSkge1xyXG4gICAgICBjb25zdCBjb25kaXRpb25IaWdobGlnaHRjb2w6IFtdID0gY29sWydDZWxsU3R5bGVDb25kaXRpb24nXTtcclxuICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9IGZhbHNlO1xyXG5cclxuICAgICAgY29uZGl0aW9uSGlnaGxpZ2h0Y29sLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKCFjb25kaXRpb25SZXN1bHQpIHtcclxuICAgICAgICAgIGlmIChkYXRhWydWYWx1ZSddID09IGNvbFZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBjb25kaXRpb25SZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2VsbFN0eWxlQ29uZGl0aW9uKGNvbCwgY29sVmFsdWU6IGFueSkge1xyXG4gICAgaWYgKGNvbFsnQ2VsbFN0eWxlQ29uZGl0aW9uJ10pIHtcclxuICAgICAgY29uc3QgY29uZGl0aW9uSGlnaGxpZ2h0Y29sOiBbXSA9IGNvbFsnQ2VsbFN0eWxlQ29uZGl0aW9uJ107XHJcbiAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSAnJztcclxuXHJcbiAgICAgIGNvbmRpdGlvbkhpZ2hsaWdodGNvbC5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhWydWYWx1ZSddID09IGNvbFZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVsnQmFja2dyb3VuZENvbG9yJ10pIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ID0gJ2JhY2tncm91bmQtY29sb3I6JyArIGRhdGFbJ0JhY2tncm91bmRDb2xvciddICsgJzsnO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhWydDb2xvciddKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdCArPSAnY29sb3I6JyArIGRhdGFbJ0NvbG9yJ10gKyAnOyc7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFbJ1N0eWxlRXhwcmVzc2lvbiddKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdCArPSBkYXRhWydTdHlsZUV4cHJlc3Npb24nXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGNvbmRpdGlvblJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPbmNlbGwgY2xpY2sgaGFuZGxpbmdcclxuICAvLyAxLiBpbkNlbGwgRWRpdFxyXG4gIC8vIDIuIE9uSXRlbUNsaWNrXHJcbiAgLy8gMy4gTmF2aWdhdGUgdG8gRm9ybSBQYWdlXHJcbiAgLy8gNC4gU2hvdyBGb3JtIFBhZ2UgaW4gdGhlIHNhbWUgcGFnZSAoREVDIGFuZCBEcmF3ZXIpXHJcbiAgcHVibGljIGNlbGxDbGlja0hhbmRsZXIoZXZlbnQ6IENlbGxDbGlja0V2ZW50KSB7XHJcbiAgICAvLyBSaWdodCBjbGljayBoYW5kbGVyXHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJjb250ZXh0bWVudVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0YUl0ZW1Db250ZXh0TWVudS5zaG93Q29udGV4dE1lbnVNYW51YWxseShldmVudCwgZXZlbnQuZGF0YUl0ZW0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGlzYWJsZUFsbENvbHVtbkNlbGxDbGlja0hhbmRsZXIgPSB0aGlzLmRhdGEuRGlzYWJsZUNlbGxDbGlja0hhbmRsZXIgPyB0aGlzLmRhdGEuRGlzYWJsZUNlbGxDbGlja0hhbmRsZXIgOiBmYWxzZTtcclxuICAgIGNvbnN0IGlzQ29tbWFuZENvbHVtbiA9IGV2ZW50LmNvbHVtbi5jb25zdHJ1Y3Rvci5uYW1lID09ICdDb21tYW5kQ29sdW1uQ29tcG9uZW50JyA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy50b29sdGlwRGlyKSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcERpci5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFkaXNhYmxlQWxsQ29sdW1uQ2VsbENsaWNrSGFuZGxlciAmJiAhaXNDb21tYW5kQ29sdW1uKSB7XHJcbiAgICAgIGNvbnN0IGluQ2VsbEVkaXRhYmxlID0gdGhpcy5kYXRhLkluQ2VsbEVkaXRhYmxlID8gdGhpcy5kYXRhLkluQ2VsbEVkaXRhYmxlIDogZmFsc2U7XHJcbiAgICAgIGlmIChpbkNlbGxFZGl0YWJsZSkge1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihzID0+IHMuaXNFZGl0YWJsZUluRGF0YUl0ZW0gPT09IHRydWUpO1xyXG4gICAgICAgIGlmICghIXRoaXMuZWRpdGFibGVDb2x1bW5zKSB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRhYmxlQ29sdW1ucy5tYXAocyA9PiBldmVudC5zZW5kZXIuZWRpdENlbGwoZXZlbnQucm93SW5kZXgsIGV2ZW50LmNvbHVtbkluZGV4LCB0aGlzLmNyZWF0ZUZvcm1Hcm91cChldmVudC5kYXRhSXRlbSwgcy5maWVsZCkpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJjZWxsQ2xpY2sgZXZlbnQ6IFwiLCBldmVudCk7XHJcbiAgICAgICAgLy90aGlzLmNhY2hlU2VydmljZS5zZXQoJ2xhc3RDbGlja2VkR3JpZFJlY29yZCcsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5Pbkl0ZW1DbGljaykge1xyXG4gICAgICAgICAgY29uc3QgZnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuT25JdGVtQ2xpY2spO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGxGdW5jID0gZnVuYy5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgICAgICAgY2FsbEZ1bmMoZXZlbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIHN0b3JlIGNsaWNrZWQgaWQgYW5kIGFjdGlvbiBhcyBlZGl0IHRvIHRoZSBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICAgIC8vIE9uSXRlbUNsaWNrLCBwcm9qZWN0IGhhdmUgdG8gc2V0IHRoZW1zZWxmLlxyXG4gICAgICAgICAgdGhpcy5tYWluU2VydmljZS5zZXROYXZpZ2F0aW9uUGFyYW1zKFtldmVudC5kYXRhSXRlbS5JZCwgJ2VkaXQnXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVkaXRNb2RlbChldmVudC5kYXRhSXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0Q2VsbENsb3NlSGFuZGxlcihhcmdzOiBhbnkpIHtcclxuICAgIGNvbnN0IHsgZm9ybUdyb3VwLCBkYXRhSXRlbSB9ID0gYXJncztcclxuICAgIGlmICghZm9ybUdyb3VwLnZhbGlkKSB7XHJcbiAgICAgIGFyZ3MucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0gZWxzZSBpZiAoZm9ybUdyb3VwLmRpcnR5KSB7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihzID0+IHMuaXNFZGl0YWJsZUluRGF0YUl0ZW0gPT09IHRydWUpO1xyXG4gICAgICB0aGlzLmVkaXRhYmxlQ29sdW1ucy5tYXAocyA9PlxyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YUl0ZW0sIHsgW3MuZmllbGRdOiBmb3JtR3JvdXAudmFsdWVbcy5maWVsZF0gfSkpO1xyXG4gICAgICAvLyB0aGlzLm15U2VsZWN0aW9uLm1hcChzID0+IChzLklkID09PSBkYXRhSXRlbS5JZCkgPyBPYmplY3QuYXNzaWduKHMsIGRhdGFJdGVtKSA6IG51bGwpO1xyXG5cclxuICAgICAgLy8gSW5pdGlhbGl6ZSBteVNlbGVjdGlvbiBpZiBpdCdzIHVuZGVmaW5lZFxyXG4gICAgICAgIGlmICghdGhpcy5teVNlbGVjdGlvbikgeyBcclxuICAgICAgICAgIHRoaXMubXlTZWxlY3Rpb24gPSBuZXcgTWFwKCk7XHJcbiAgICAgIH0gXHJcbiAgICAgIFxyXG4gICAgICB0aGlzLm15U2VsZWN0aW9uLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICBpZiAodmFsdWUuSWQgPT09IGRhdGFJdGVtLklkKSB7XHJcbiAgICAgICAgICB0aGlzLm15U2VsZWN0aW9uLnNldChrZXksIHsgLi4udmFsdWUsIC4uLmRhdGFJdGVtIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25OYXZpZ2F0ZVRvKGV2ZW50OiBhbnksIGNsaWNrQWN0aW9uOiBhbnksIHJvd0RhdGE6IGFueSwgY2VsbERhdGE6IHN0cmluZykge1xyXG4gICAgLy8gY29uc3QgbiA9IGNvbFNldHRpbmcubmF2aWdhdGVUby5yZXBsYWNlKCcvOmlkJywgY2VsbERhdGEpO1xyXG4gICAgY29uc3QgbiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBjbGlja0FjdGlvbi5DbGljayk7XHJcbiAgICBpZiAobikge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6ICd6Z3JpZC1vbk5hdmlnYXRlVG8nLFxyXG4gICAgICAgIHRhcmdldDogY2xpY2tBY3Rpb24uQ2xpY2ssXHJcbiAgICAgICAgcm93RGF0YTogcm93RGF0YSxcclxuICAgICAgICBkYXRhOiBjZWxsRGF0YVxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVkaXRNb2RlbChkYXRhSXRlbTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkVkaXRDbGlja1VSTCkge1xyXG4gICAgICAvLyBFZGl0IGluY2VsbCBmaWVsZFxyXG4gICAgICBjb25zdCBjb2xGaWVsZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLkNvbHVtbkZpZWxkcywgdGhpcy5ncm91cCk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcInpncmlkLWNlbGxDbGlja1wiLFxyXG4gICAgICAgIHRhcmdldDogdGhpcy5kYXRhLkVkaXRDbGlja1VSTCxcclxuICAgICAgICBkYXRhOiBkYXRhSXRlbSxcclxuICAgICAgICBjb2x1bW5GaWVsZHMkOiBjb2xGaWVsZHNcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5kYXRhWydDb250YWluZXJGb3JtJ10pIHtcclxuICAgICAgdGhpcy5zaG93Rm9ybVBhZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5ncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAvL3NraXBMb2NhdGlvbkNoYW5nZTogZmFsc2VcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLy8vIFdoZW4gY2xpY2tlZCByb3V0ZSB0byBwYWdlXHJcbiAgICAgIC8vdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZ3JvdXAuZWRpdE1vZGVsVVJMLCBkYXRhSXRlbS5JZCwgJ2VkaXQnXSwge1xyXG4gICAgICAvLyAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZVxyXG4gICAgICAvL30pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQnRuQ2xpY2soZXZlbnQ6IGFueSwgY29sU2V0dGluZzogYW55LCByb3dEYXRhOiBhbnksIGNlbGxEYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMub25OYXZpZ2F0ZVRvKGV2ZW50LCBjb2xTZXR0aW5nLCByb3dEYXRhLCBjZWxsRGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZvcm1Hcm91cChkYXRhSXRlbTogYW55LCBmaWVsZE5hbWU6IGFueSk6IEZvcm1Hcm91cCB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIFtmaWVsZE5hbWVdOiBkYXRhSXRlbVtmaWVsZE5hbWVdXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBIZWxwZXIgZnVuY3Rpb25zXHJcbiAgcHVibGljIGdldENsYXNzKGRhdGFJdGVtOiBhbnksIGNvbDogYW55KSB7XHJcbiAgICBsZXQgbmdDbGFzcyA9IFwiZ3JpZENlbGwgXCI7XHJcbiAgICBpZiAoY29sLmZpZWxkVHlwZSA9PT0gJ251bWJlcicgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ2N1cnJlbmN5JyB8fCBjb2wuZmllbGRUeXBlID09PSAnem51bWVyaWMnKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gXCJyaWdodEFsaWduZWQgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFJdGVtW2NvbC5maWVsZCArICdfQ2xhc3MnXSkge1xyXG4gICAgICBuZ0NsYXNzICs9IGRhdGFJdGVtW2NvbC5maWVsZCArICdfQ2xhc3MnXSArIFwiIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2wuQ2xhc3MpIHtcclxuICAgICAgbmdDbGFzcyArPSBjb2wuQ2xhc3MgKyBcIiBcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sLlBvcE92ZXJDb250ZW50KSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gXCIgd2l0aFBvcG92ZXJJbkdyaWRcIjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmdDbGFzcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtYXQoY29sOiBhbnksIGRlZmF1bHRGb3JtYXQ/OiBhbnkpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIlwiO1xyXG4gICAgaWYgKGNvbC5Gb3JtYXRPcHRpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9ybWF0ID0gZGVmYXVsdEZvcm1hdCA/IGRlZmF1bHRGb3JtYXQgOiBcIlwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZm9ybWF0QXJyID0gY29sLkZvcm1hdE9wdGlvbnMuc3BsaXQoXCIuXCIpXHJcbiAgICAgIGxldCBkcCA9IDA7XHJcblxyXG4gICAgICBpZiAoZm9ybWF0QXJyLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICBkcCA9IGZvcm1hdEFyclsxXS5sZW5ndGg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkcCAhPT0gMCkge1xyXG4gICAgICAgIGZvcm1hdCA9IFwiMS5cIiArIGRwICsgXCItXCIgKyBkcDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm1hdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhbGxSZXN1bHRzKCk6IE9ic2VydmFibGU8RXhjZWxFeHBvcnREYXRhPiB7XHJcbiAgICBjb25zdCBncmlkQ29udHJvbCA9IHRoaXMuemdyaWQgYXMgWkdyaWQ7XHJcbiAgICBjb25zdCBncmlkQ29tcG9uZW50ID0gdGhpcy56Z3JpZC5ncmlkIGFzIEdyaWRDb21wb25lbnQ7XHJcbiAgICBjb25zdCBkYXRhID0gZ3JpZENvbXBvbmVudC5kYXRhIGFzIEdyaWREYXRhUmVzdWx0O1xyXG5cclxuICAgIGNvbnN0IHJlc291cmNlVVJMRm9yR2VuZXJhdGVEYXRhID0gdGhpcy5kYXRhLkV4cG9ydERhdGFSZXNvdXJjZVVSTCA/IHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTCh0aGlzLmRhdGEuRXhwb3J0RGF0YVJlc291cmNlVVJMKSA6IGdyaWRDb250cm9sLnBhZ2luYXRpb25BcGlQb3N0VXJsO1xyXG5cclxuICAgIC8vIE5lZWQgdG8gY2xvbmUsIGlmIG5vdCB3aWxsIGFmZmVjdCB0aGUgZ3JpZCBwYXJhbXMuXHJcbiAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcmFtcyk7XHJcbiAgICBwYXJhbXMucGFnZU5vID0gMDtcclxuICAgIHBhcmFtcy5wYWdlU2l6ZSA9IGRhdGEudG90YWw7XHJcblxyXG4gICAgY29uc3QgZGF0ZVRpbWVSZWdleCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0oPzpbVFxcc11cXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHsxLDd9KT8oPzpafFtcXCtcXC1dXFxkezJ9OlxcZHsyfSk/KT8kLztcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBjb252ZXJ0IGRhdGUgc3RyaW5ncyB0byBEYXRlIG9iamVjdHNcclxuICAgIGNvbnN0IGNvbnZlcnREYXRlU3RyaW5nc1RvRGF0ZXMgPSAoaXRlbXM6IGFueVtdKSA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbSA9IHsgLi4uaXRlbSB9O1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld0l0ZW0pIHtcclxuICAgICAgICAgIGlmIChuZXdJdGVtLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXdJdGVtW2tleV07XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyBhbmQgbWF0Y2hlcyB0aGUgZGF0ZVRpbWVSZWdleCBwYXR0ZXJuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIGRhdGVUaW1lUmVnZXgudGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICBuZXdJdGVtW2tleV0gPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChyZXNvdXJjZVVSTEZvckdlbmVyYXRlRGF0YSwgcGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIENvbnZlcnQgZGF0ZSBzdHJpbmdzIHRvIERhdGUgb2JqZWN0c1xyXG4gICAgICAgIGRhdGEuZGF0YVNldCA9IGNvbnZlcnREYXRlU3RyaW5nc1RvRGF0ZXMoZGF0YS5kYXRhU2V0KTtcclxuXHJcbiAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzdWx0IGZvciBFeGNlbCBleHBvcnRcclxuICAgICAgICBjb25zdCByZXN1bHQ6IEV4Y2VsRXhwb3J0RGF0YSA9IHtcclxuICAgICAgICAgIGRhdGE6IHByb2Nlc3MoZGF0YS5kYXRhU2V0LCB7fSkuZGF0YVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hHcmlkKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGNvbnN0IF9ncmlkT3B0aW9uU2VnbWVudCA9IGV2ZW50LnRhcmdldC50cmltKCkuc3BsaXQoJy4nKTtcclxuICAgIGNvbnN0IF9ncmlkT3B0aW9uID0gX2dyaWRPcHRpb25TZWdtZW50WzFdO1xyXG4gICAgaWYgKF9ncmlkT3B0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW19ncmlkT3B0aW9uXSBhcyBaR3JpZDtcclxuICAgICAgaWYgKHpncmlkQ29udHJvbCkge1xyXG4gICAgICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBmaW5kIGdyaWQgdmFsdWU6ICcgKyBfZ3JpZE9wdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdJbnZhbGlkIHJlZnJlc2hHcmlkIGV2ZW50OiAnLCBldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaERhdGEoKSB7XHJcbiAgICB0aGlzLmdldERhdGEoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckRhdGEoKSB7XHJcbiAgICB0aGlzLnpncmlkLmNsZWFyRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dUb29sdGlwKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRhdGEuSXNTaG93VG9vbFRpcCA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGxldCBpc0NvbW1hbmRDb2x1bW4gPSBmYWxzZTtcclxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgIGlmIChkYXRhID09ICdrLWNvbW1hbmQtY2VsbCcpIHtcclxuICAgICAgICBpc0NvbW1hbmRDb2x1bW4gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWlzQ29tbWFuZENvbHVtbiAmJlxyXG4gICAgICAoXHJcbiAgICAgICAgKChlbGVtZW50Lm5vZGVOYW1lID09PSAnVEQnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdUSCcpICYmIGVsZW1lbnQub2Zmc2V0V2lkdGggPCAoZWxlbWVudC5zY3JvbGxXaWR0aCkpIHx8XHJcbiAgICAgICAgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdTUEFOJyAmJiBlbGVtZW50LmNsYXNzTGlzdCAmJiBlbGVtZW50LmNsYXNzTGlzdC5sZW5ndGggPiAwICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdncmlkLWNlbGwtZGF0YScpICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCA8IChlbGVtZW50LnBhcmVudEVsZW1lbnQuc2Nyb2xsV2lkdGgpKSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnRvb2x0aXBEaXIudG9nZ2xlKGVsZW1lbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcERpci5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm93U2VsZWN0aW9uS2V5ID0gKGNvbnRleHQ6IFJvd0FyZ3MpOiBhbnkgPT4ge1xyXG4gICAgLy8gR2VuZXJhdGUgYSB1bmlxdWUga2V5IHVzaW5nIGVpdGhlciB0aGlzLmRhdGEuVW5pcXVlS2V5IG9yIGNvbnRleHQuZGF0YUl0ZW0uSWQuXHJcbiAgICBjb25zdCBrZXkgPSAodGhpcy5kYXRhLlVuaXF1ZUtleSA/PyBjb250ZXh0LmRhdGFJdGVtLklkKTsvLyArIFwiIFwiICsgY29udGV4dC5pbmRleDtcclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLlVuaXF1ZUtleSAmJiBjb250ZXh0LmRhdGFJdGVtLklkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0EgdW5pcXVlIGNvbHVtbiBmaWVsZCBpcyByZXF1aXJlZC4gRW5zdXJlIGVpdGhlciB0aGUgSWQgY29sdW1uIGlzIHByZXNlbnQgb3IgdGhlIFVuaXF1ZUtleSBwcm9wZXJ0eSBpcyBzZXQgZm9yIHpncmlkLicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluaXRpYWxpemUgbXlTZWxlY3Rpb24gaWYgaXQncyB1bmRlZmluZWRcclxuICAgIGlmICghdGhpcy5teVNlbGVjdGlvbikgeyBcclxuICAgICAgdGhpcy5teVNlbGVjdGlvbiA9IG5ldyBNYXAoKTtcclxuICB9XHJcblxyXG4gICAgLy8gU3RvcmUgdGhlIGRhdGEgaXRlbSBpbiB0aGUgbXlTZWxlY3Rpb24gbWFwIHdpdGggdGhlIGdlbmVyYXRlZCBrZXkuXHJcbiAgICB0aGlzLm15U2VsZWN0aW9uLnNldChrZXksIGNvbnRleHQuZGF0YUl0ZW0pO1xyXG5cclxuICAgIC8vIFJldHVybiB0aGUgZ2VuZXJhdGVkIGtleS5cclxuICAgIHJldHVybiBrZXk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRWYWx1ZXMoKTogYW55IHtcclxuICAgIC8vIE1hcCBlYWNoIGtleSBpbiByb3dTZWxlY3Rpb24gdG8gaXRzIGNvcnJlc3BvbmRpbmcgZGF0YSBpdGVtIGluIHRoZSBteVNlbGVjdGlvbiBtYXAuXHJcbiAgICBjb25zdCBzZWxlY3RlZFJlY29yZCA9IHRoaXMucm93U2VsZWN0aW9uLm1hcChrZXkgPT4gdGhpcy5teVNlbGVjdGlvbi5nZXQoa2V5KSk7XHJcbiBcclxuICAgIC8vIFJldHVybiB0aGUgYXJyYXkgb2Ygc2VsZWN0ZWQgcmVjb3Jkcy5cclxuICAgIHJldHVybiBzZWxlY3RlZFJlY29yZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIC8vIENoZWNrIGlmIG15U2VsZWN0aW9uIGlzIGRlZmluZWQgYmVmb3JlIHRyeWluZyB0byBjbGVhciBpdFxyXG4gICAgaWYgKHRoaXMubXlTZWxlY3Rpb24pIHtcclxuICAgICAgICAvLyBDbGVhciB0aGUgbWFwIHRoYXQgc3RvcmVzIHNlbGVjdGVkIGRhdGEgaXRlbXMuXHJcbiAgICAgICAgdGhpcy5teVNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBPcHRpb25hbGx5LCB5b3UgY2FuIGluaXRpYWxpemUgaXQgaWYgaXQncyB1bmRlZmluZWRcclxuICAgICAgICB0aGlzLm15U2VsZWN0aW9uID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gQ2xlYXIgdGhlIGFycmF5IHRoYXQgdHJhY2tzIHNlbGVjdGVkIGtleXMuXHJcbiAgICB0aGlzLnJvd1NlbGVjdGlvbiA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy56Z3JpZCkge1xyXG4gICAgICB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMgPSB7fTtcclxuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xyXG4gICAgICB0aGlzLnpncmlkLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCd0aGlzLnpncmlkIGlzIHVuZGVmaW5lZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHcmlkRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLmlzVXNlTG9jYWxEYXRhKCkgPyAodGhpcy56Z3JpZC5kYXRhIHx8IHRoaXMuemdyaWQub3JpZ2luYWxEYXRhKSA6ICh0aGlzLnpncmlkLmdyaWQuZGF0YSAmJiB0aGlzLnpncmlkLmdyaWQuZGF0YS5kYXRhID8gdGhpcy56Z3JpZC5ncmlkLmRhdGEuZGF0YSA6IFtdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRhID0gKGdEYXRhOiBhbnkpID0+IHtcclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzVXNlTG9jYWxEYXRhKCkpIHtcclxuICAgICAgICB0aGlzLnpncmlkLmRhdGEgPSBnRGF0YTtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YS5EaXNhYmxlQXV0b0FwcGVuZEdyaWREYXRlRmlsdGVyQ29sKSB7XHJcbiAgICAgICAgICB0aGlzLnNldERhdGVDb2xGb3JGaWx0ZXJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy56Z3JpZC5ncmlkLmRhdGEgPSB7XHJcbiAgICAgICAgICBkYXRhOiBnRGF0YSxcclxuICAgICAgICAgIHRvdGFsOiBnRGF0YS50b3RhbENvdW50XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0dXBHcmlkV2l0aElubGluZUVkaXQoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZygnemdyaWQgaXMgbnVsbCBmb3Igc2V0RGF0YS4nKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5kYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRIZWFkZXJUZXh0KGNvbHVtbk5hbWU6IHN0cmluZywgbmV3SGVhZGVyVGl0bGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZ3JpZENvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XHJcbiAgICBncmlkQ29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoY29sLk5hbWUgPT09IGNvbHVtbk5hbWUpIHtcclxuICAgICAgICBjb2wudGl0bGUgPSBuZXdIZWFkZXJUaXRsZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBHcmlkSXRlbSk6IGFueSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKGl0ZW0uZGF0YVsnSWQnXSB8fCBpbmRleCk7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVXNlTG9jYWxEYXRhKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EYXRhU291cmNlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkodGhpcy5kYXRhLlJlc291cmNlVVJMKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBncmlkIHNldHVwXHJcbiAgcHJpdmF0ZSBzZXR1cEdyaWRDb21wb25lbnRBdHRyaWJ1dGVzKCkge1xyXG4gICAgLy8gR3JpZCBkZWZhdWx0IHNldHRpbmdcclxuICAgIHRoaXMuZ3JpZFRpdGxlID0gdGhpcy5kYXRhLlRpdGxlO1xyXG4gICAgdGhpcy5jb2x1bW5zID0gW107XHJcbiAgICB0aGlzLnBhZ2VTaXplcyA9IFs1LCAxMCwgMjAsIDUwLCAxMDAsIDIwMCwgNTAwXTtcclxuICAgIHRoaXMucHJldmlvdXNOZXh0ID0gdGhpcy5kYXRhWydFbmFibGVQcmV2aW91c05leHRCdXR0b24nXSB8fCBmYWxzZTtcclxuXHJcbiAgICAvLyBbTW9iaWxlXSBEaXNhYmxlIHBhZ2Ugc2l6ZXMgaWYgUGFnZVNpemVzIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlIG9yIG9uIGEgbW9iaWxlIHNjcmVlbi5cclxuICAgIGlmICh0aGlzLmRhdGEuUGFnZVNpemVzID09PSBmYWxzZSB8fCB0aGlzLmlzTW9iaWxlU2NyZWVuKCkpIHtcclxuICAgICAgdGhpcy5wYWdlU2l6ZXMgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb25maWd1cmUgcGFnaW5hdGlvbiBzZXR0aW5ncy5cclxuICAgIHRoaXMucGFnZWFibGUgPSB0aGlzLmRhdGEucGFnZUFibGUgIT0gdW5kZWZpbmVkID8gdGhpcy5kYXRhLnBhZ2VBYmxlIDoge1xyXG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgICBidXR0b25Db3VudDogMyxcclxuICAgICAgcGFnZVNpemVzOiB0aGlzLnBhZ2VTaXplcyxcclxuICAgICAgcHJldmlvdXNOZXh0OiB0aGlzLnByZXZpb3VzTmV4dCxcclxuICAgIH07XHJcblxyXG4gICAgLy8gQ29uZmlndXJlIGdyaWQgc2VsZWN0aW9uIG9wdGlvbnMgaWYgc2V0IFNlbGVjdE9wdGlvbnMgaW4gZmllbGQgZWxlbWVudCBhdHRyaWJ1dGUuXHJcbiAgICBpZiAodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpIHtcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBFcnJvcjogZ3JpZCgke3RoaXMuZGF0YS5OYW1lfSksIHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zIHNob3VsZCBiZSBhIHN0cmluZyB3aXRoIHZhbHVlICdzaW5nbGUnIG9yICdtdWx0aXBsZScuYCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICBtb2RlOiB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucy50b0xvd2VyQ2FzZSgpID09PSAnc2luZ2xlJyA/ICdzaW5nbGUnIDogJ211bHRpcGxlJ1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBCaW5kIGNvbXBvbmVudCB0byBncm91cCB1c2luZyB0aGUgcHJvdmlkZWQgVmFsdWUgc2V0IGluIGZpZWxkIGVsZW1lbnQgYXR0cmlidXRlLlxyXG4gICAgaWYgKHRoaXMuZGF0YS5WYWx1ZS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICB0aGlzLmdyb3VwW3RoaXMuZGF0YS5WYWx1ZS5zbGljZSg2KV0gPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cFN1YnNjcmlwdGlvbkZvckdyaWRTdWJqZWN0KCkge1xyXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBhbnkgZXhpc3Rpbmcgc3Vic2NyaXB0aW9ucyB0byBhdm9pZCBtZW1vcnkgbGVha3MuXHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGcm9tIGhlcmUgd2lsbCBjYWxsIHpncmlkLmJpbmRpbmcuZGlyZWN0aXZlLlxyXG4gICAgLy8gU3Vic2NyaWJlIHRvIGdldCBmcm9tIGRpcmVjdGl2ZSBhbmQgc2V0IHRvIGNvbXBvbmVudFxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmdyaWRTdWJqZWN0LnBpcGUoXHJcbiAgICAgIHRhcChncmlkRGlyZWN0aXZlID0+IHtcclxuICAgICAgICAvLyBTZXQgdGhlIHpncmlkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBlbWl0dGVkIGdyaWREaXJlY3RpdmUuXHJcbiAgICAgICAgdGhpcy56Z3JpZCA9IGdyaWREaXJlY3RpdmU7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgY29sdW1ucyBwcm9wZXJ0eSB3aXRoIHRoZSBncmlkIGNvbHVtbnMgZnJvbSBncmlkRGlyZWN0aXZlLlxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuemdyaWQuZ3JpZFNldHRpbmcuY29sdW1ucztcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgYXV0b21hdGljIGFwcGVuZGluZyBvZiBhIGdyaWQgZGF0ZSBmaWx0ZXIgY29sdW1uIGlzIG5vdCBkaXNhYmxlZC5cclxuICAgICAgICBpZiAoIXRoaXMuZGF0YS5EaXNhYmxlQXV0b0FwcGVuZEdyaWREYXRlRmlsdGVyQ29sKSB7XHJcbiAgICAgICAgICB0aGlzLnNldERhdGVDb2xGb3JGaWx0ZXJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCB1cCBncmlkIHdpdGggaW5saW5lIGVkaXRpbmcuXHJcbiAgICAgICAgdGhpcy5zZXR1cEdyaWRXaXRoSW5saW5lRWRpdCgpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdXAgYSBwb3BvdmVyIGZlYXR1cmUgYmFzZWQgb24gY29sdW1ucyBhbmQgZ3JpZCBkYXRhLlxyXG4gICAgICAgIHRoaXMuc2V0dXBQb3BvdmVyRmVhdHVyZSh0aGlzLmNvbHVtbnMsIHRoaXMuZ2V0R3JpZERhdGEoKSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGNvbHVtbiBoZWFkZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHRyYW5zbGF0ZWQuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb2x1bW5IZWFkZXJUcmFuc2xhdGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTWFyayBjb2x1bW4gaGVhZGVycyBhcyB0cmFuc2xhdGVkIGFuZCBwZXJmb3JtIHRoZSB0cmFuc2xhdGlvbi5cclxuICAgICAgICB0aGlzLmlzQ29sdW1uSGVhZGVyVHJhbnNsYXRlZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcih0aGlzLmNvbHVtbnMpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKF8gPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tib3hDb2x1bW5QaW5uZWQgPSB0aGlzLmRhdGEuU2VsZWN0T3B0aW9uc1Bpbm5lZDtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZUdyaWRTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmRhdGEpO1xyXG4gICAgY29uc3QgY2FjaGVOYW1lID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVDYWNoZVN0b3JhZ2VLZXkoR3JpZFNldHRpbmdUeXBlLlNhdmVkU2V0dGluZywgdGhpcy5kYXRhKTtcclxuXHJcbiAgICB0aGlzLnpncmlkLmdyaWRTZXR0aW5nLmNvbHVtbkNvbmZpZ3VyYXRpb25zID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1uc0NvbmZpZyh0aGlzLnpncmlkLmdyaWQuY29sdW1ucyk7XHJcblxyXG4gICAgY29uc3Qgc2V0dGluZ0NvbmZpZzogWkdyaWRTZXR0aW5ncyA9IHtcclxuICAgICAgY29sdW1uQ29uZmlndXJhdGlvbnM6IHRoaXMuemdyaWQuZ3JpZFNldHRpbmcuY29sdW1uQ29uZmlndXJhdGlvbnNcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGdyaWRTdGF0ZUxvZ2ljID09PSBHcmlkU3RhdGVMb2dpY1R5cGUuU2V0dGluZ09ubHkpIHtcclxuICAgICAgc2V0dGluZ0NvbmZpZy5ncmlkU3RhdGUgPSB0aGlzLnpncmlkLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBncmlkU2V0dGluZyA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdDb25maWcpO1xyXG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShjYWNoZU5hbWUsIGdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICBjb25zdCBqc29uQ2FjaGU6IEpzb25DYWNoZSA9IHtcclxuICAgICAgRmlsZU5hbWU6IGNhY2hlTmFtZSxcclxuICAgICAgSnNvbkNvbnRlbnQ6IGdyaWRTZXR0aW5nXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnNhdmVKc29uQ2FjaGUoanNvbkNhY2hlKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLnNob3dIaWRlUmVzdG9yZUdyaWRTZXR0aW5nQnV0dG9uKCk7XHJcbiAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KCdHcmlkIFNldHRpbmcgU2F2ZWQnLCBcInRvcFwiLCB0cnVlLCAyMDAwLCAnc3VjY2VzcycpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc3RvcmVHcmlkU2V0dGluZ3MoKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMuc29ydCgoYSwgYikgPT4gYS5vcmlnaW5hbE9yZGVySW5kZXggLSBiLm9yaWdpbmFsT3JkZXJJbmRleCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjYWNoZU5hbWUgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUNhY2hlU3RvcmFnZUtleShHcmlkU2V0dGluZ1R5cGUuU2F2ZWRTZXR0aW5nLCB0aGlzLmRhdGEpO1xyXG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShjYWNoZU5hbWUpO1xyXG5cclxuICAgIHRoaXMuc2hvd0hpZGVSZXN0b3JlR3JpZFNldHRpbmdCdXR0b24oKTtcclxuXHJcbiAgICB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UucmVtb3ZlSnNvbkNhY2hlKHtcclxuICAgICAgRmlsZU5hbWU6IGNhY2hlTmFtZVxyXG4gICAgfSkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ3JpZENhbGxiYWNrKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICh0aGlzLmRhdGFbJ0FmdGVybG9hZENhbGxiYWNrJ10pIHtcclxuICAgICAgY29uc3QgbWUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzKTtcclxuXHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcInpncmlkLUFmdGVybG9hZENhbGxiYWNrXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGFbJ0FmdGVybG9hZENhbGxiYWNrJ10sXHJcbiAgICAgICAgZGF0YTogbWVcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEdyaWRCdXR0b25zKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lX1dGIHx8IHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEJ0biA9IHtcclxuICAgICAgICBSZWFkT25seTogZmFsc2UsXHJcbiAgICAgICAgVmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBJc1JlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgICBXb3JrZmxvd0NvZGU6IHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lX1dGLFxyXG4gICAgICAgIFZhbHVlOiB0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZSxcclxuICAgICAgICBUeXBlOiB0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZV9XRiA/IFwiendvcmtmbG93YnV0dG9uc1wiIDogXCJ6YnV0dG9uc1wiXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNob3dIaWRlUmVzdG9yZUdyaWRTZXR0aW5nQnV0dG9uKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGVDb2xGb3JGaWx0ZXJpbmcoKSB7XHJcbiAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIGlmICh0aGlzLmlzVXNlTG9jYWxEYXRhKCkgJiYgZ3JpZERhdGEgJiYgZ3JpZERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBkYXRlQ29sID0gT2JqZWN0LmtleXMoZ3JpZERhdGFbMF0pLmZpbHRlcih4ID0+IHguaW5jbHVkZXMoXCJEYXRlXCIpICYmICF4LmVuZHNXaXRoKENvbXBvbmVudENvbnN0YW50LkdyaWRDb2xEYXRlRmlsdGVyU3VmZml4KSk7XHJcbiAgICAgIGlmIChkYXRlQ29sICYmIGRhdGVDb2wubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGdyaWREYXRhLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICBkYXRlQ29sLmZvckVhY2goY29sTmFtZSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGFbYCR7Y29sTmFtZX0ke0NvbXBvbmVudENvbnN0YW50LkdyaWRDb2xEYXRlRmlsdGVyU3VmZml4fWBdID0gbmV3IERhdGUoZGF0YVtjb2xOYW1lXSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93SGlkZVJlc3RvcmVHcmlkU2V0dGluZ0J1dHRvbigpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuQ2FjaGVJbmZvPy5FbmFibGVTYXZlU3RhdGUpIHtcclxuICAgICAgY29uc3Qgc2V0dGluZ0NhY2hlTmFtZSA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlQ2FjaGVTdG9yYWdlS2V5KEdyaWRTZXR0aW5nVHlwZS5TYXZlZFNldHRpbmcsIHRoaXMuZGF0YSk7XHJcbiAgICAgIGNvbnN0IHNldHRpbmdDYWNoZVZhbHVlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzZXR0aW5nQ2FjaGVOYW1lKTtcclxuXHJcbiAgICAgIHRoaXMuc2hvd1Jlc3RvcmVHcmlkU2V0dGluZ0J1dHRvbiA9IHNldHRpbmdDYWNoZVZhbHVlID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEdyaWQgY29uZmlndXJhdGlvbiBmdW5jdGlvblxyXG4gIHB1YmxpYyBncmlkQ3VzdG9tQWRkQ29tbWFuZChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIC8vIGRlY2xhcmUgYnV0dG9uIG9uY2xpY2sgZXZlbnQgbmFtZSBiYXNlIG9uIGdyaWQgbmFtZSArIHByZWZpeFxyXG4gICAgY29uc3QgZ3JpZEFkZEJ1dHRvbkV2ZW50TmFtZSA9IHRoaXMuZGF0YS5OYW1lICsgJ19DdXN0b21BZGRCdXR0b25PbkNsaWNrJztcclxuICAgIGlmICghdGhpcy5ncm91cFtncmlkQWRkQnV0dG9uRXZlbnROYW1lXSkge1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdyb3VwW2dyaWRBZGRCdXR0b25FdmVudE5hbWVdKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBncmlkQ3VzdG9tUmVzZXRDb21tYW5kKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZGVjbGFyZSBidXR0b24gb25jbGljayBldmVudCBuYW1lIGJhc2Ugb24gZ3JpZCBuYW1lICsgcHJlZml4XHJcbiAgICBjb25zdCBncmlkUmVzZXRCdXR0b25FdmVudE5hbWUgPSB0aGlzLmRhdGEuTmFtZSArICdfQ3VzdG9tUmVzZXRCdXR0b25PbkNsaWNrJztcclxuICAgIGlmICghdGhpcy5ncm91cFtncmlkUmVzZXRCdXR0b25FdmVudE5hbWVdKSB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBbZ3JpZFJlc2V0QnV0dG9uRXZlbnROYW1lXShncm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ3JpZEN1c3RvbVJlbW92ZUNvbW1hbmQoZGF0YUl0ZW06IGFueSwgcm93SW5kZXg6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBkZWNsYXJlIGJ1dHRvbiBvbmNsaWNrIGV2ZW50IG5hbWUgYmFzZSBvbiBncmlkIG5hbWUgKyBwcmVmaXhcclxuICAgIGNvbnN0IGdyaWRSZXNldEJ1dHRvbkV2ZW50TmFtZSA9IHRoaXMuZGF0YS5OYW1lICsgJ19DdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrJztcclxuICAgIGlmICghdGhpcy5ncm91cFtncmlkUmVzZXRCdXR0b25FdmVudE5hbWVdKSB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBbZ3JpZFJlc2V0QnV0dG9uRXZlbnROYW1lXShkYXRhSXRlbSwgcm93SW5kZXgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIElubGluZSBFZGl0XHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtQ29udHJvbHMoZ3JpZENvbHM6IEFycmF5PGFueT4pIHtcclxuICAgIGxldCBjb3VudGVySW5kZXggPSAwO1xyXG4gICAgLy8gVG8gZm9yY2UgZWxlbWVudCB0byByZWJpbmQgZGF0YVxyXG4gICAgdGhpcy5pc0lubGluZUVkaXRJbnB1dEZpZWxkTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnpncmlkLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICBvZihbXSkucGlwZShkZWxheSgwKSwgdGFwKCgpID0+IHtcclxuICAgICAgdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzID0gdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzIHx8IHt9O1xyXG4gICAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZ3JpZERhdGEpKSB7XHJcbiAgICAgICAgZ3JpZERhdGEuZm9yRWFjaChkID0+IHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0ge307XHJcbiAgICAgICAgICBncmlkQ29scy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBaQ29tcG9uZW50SGVscGVyLmlzVmlzaWJsZUZvcm1Db250cm9sKHRoaXMsIGMuZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCBpc1JlcXVpcmVkID0gWkNvbXBvbmVudEhlbHBlci5pc1JlcXVpcmVkRm9ybUNvbnRyb2wodGhpcywgYy5maWVsZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBaQ29tcG9uZW50SGVscGVyLmdldFZhbGlkYXRvcnMoYy5maWVsZCwgaXNWaXNpYmxlLCBpc1JlcXVpcmVkLCB0aGlzLmdyb3VwKTtcclxuICAgICAgICAgICAgaXRlbXNbYy5maWVsZF0gPSBuZXcgRm9ybUNvbnRyb2woZFtjLmZpZWxkXSwgdmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoaXRlbXMpO1xyXG5cclxuICAgICAgICAgIGlmIChkW1wiSWRcIl0pIHtcclxuICAgICAgICAgICAgaXRlbXNbXCJJZFwiXSA9IGl0ZW1zW1wiSWRcIl0gfHwgbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGRbXCJJZFwiXSwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRbXCJJZFwiXSA9IGNvdW50ZXJJbmRleCsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzW2RbXCJJZFwiXV0gPSBmb3JtR3JvdXA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc0lubGluZUVkaXRJbnB1dEZpZWxkTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnpncmlkLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRlbXBJbmxpbmVFZGl0ZWRGb3JtR3JvdXBzID0gdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzO1xyXG4gICAgfSkpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldElubGluZUZpZWxkKHZhbHVlOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZCh4ID0+IHguVmFsdWUgPT09IHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJbmxpbmVGb3JtKGRhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlcikge1xyXG4gICAgdmFyIGtleSA9IChkYXRhW1wiSWRcIl0gfHwgZGF0YVtcIklkXCJdID09IDApID8gZGF0YVtcIklkXCJdIDogcm93SW5kZXg7XHJcbiAgICBpZiAodGhpcy5pc0lubGluZUVkaXRJbnB1dEZpZWxkTG9hZGluZykge1xyXG4gICAgICByZXR1cm4gdGhpcy50ZW1wSW5saW5lRWRpdGVkRm9ybUdyb3Vwc1trZXldIHx8IHRoaXMudGVtcElubGluZUVkaXRlZEZvcm1Hcm91cHNbMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzW2tleV07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybUNvbnRyb2xEYXRhKCk6IGFueVtdIHtcclxuICAgIGNvbnN0IGRhdGEgPSBbXTtcclxuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMpKSB7XHJcbiAgICAgIGRhdGEucHVzaCh0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHNba10/LnZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEdyaWRXaXRoSW5saW5lRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmhhc0lubGluZUVkaXRDb2x1bW4odGhpcy5jb2x1bW5zKSkge1xyXG4gICAgICB0aGlzLnRlbXBJbmxpbmVFZGl0ZWRGb3JtR3JvdXBzID0gdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzO1xyXG4gICAgICB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMgPSB7fTtcclxuICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHModGhpcy5jb2x1bW5zLmNvbmNhdCh0aGlzLmdlbmVyYXRlSGlkZGVuQ29sdW1uc0ZpZWxkIHx8IFtdKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNJbmxpbmVGb3JtR3JvdXBIYXNWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMgJiYgT2JqZWN0LmtleXModGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzKS5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNJbmxpbmVFZGl0Q29sdW1uKGdyaWRDb2xzKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZ3JpZENvbHMgJiYgZ3JpZENvbHMuc29tZShjID0+IGMuaXNFZGl0YWJsZUluR3JpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2VsbFN0eWxlRm9ySW5saW5lRWRpdChjb2x1bW5GaWVsZDogWkZpZWxkLCBkYXRhSXRlbTogYW55LCByb3dJbmRleDogbnVtYmVyKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldElubGluZUZvcm0oZGF0YUl0ZW0sIHJvd0luZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICBpZiAoIWZvcm0pIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc3R5bGUgPSBjb2x1bW5GaWVsZFtgU3R5bGUxMGBdO1xyXG4gICAgY29uc3QgZnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBzdHlsZSk7XHJcbiAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgY2FsbEZ1bmMgPSBmdW5jLmJpbmQodGhpcy5ncm91cC5jdHJsU2NvcGUpO1xyXG4gICAgICByZXR1cm4gY2FsbEZ1bmMoZm9ybS52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgZnVuYyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIGZ1bmM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3R5bGU7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gRXZlbnRcclxuICAvLyBTb3VyY2U6IGh0dHBzOi8vd3d3LnRlbGVyaWsuY29tL2ZvcnVtcy9rZW5kby1hbmd1bGFyLWdyaWQtYmxhbmstc3BhY2UtaW4tdGhlLWVuZC13aGVuLXlvdS1yZXNpemUocmVkdWNlKS1hbnktY29sdW1uXHJcbiAgcHVibGljIGFkanVzdFdpZHRoVXBvblJlc2l6ZSgpIHtcclxuICAgIGNvbnN0IHRhYmxlV2lkdGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmstZ3JpZC10YWJsZVwiKVtgb2Zmc2V0V2lkdGhgXTtcclxuICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuay1ncmlkLWNvbnRlbnRcIilbYG9mZnNldFdpZHRoYF07XHJcbiAgICBpZiAodGFibGVXaWR0aCA8IGNvbnRlbnRXaWR0aCkge1xyXG4gICAgICBjb25zdCBjdXJyZW50TGFzdENvbFdpZHRoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5rLWdyaWQtY29udGVudCAuay1ncmlkLXRhYmxlIHRyIHRkOmxhc3Qtb2YtdHlwZVwiKVtgb2Zmc2V0V2lkdGhgXTtcclxuXHJcbiAgICAgIHRoaXMuY29sdW1uc1t0aGlzLmNvbHVtbnMubGVuZ3RoIC0gMV0ud2lkdGggPSBjdXJyZW50TGFzdENvbFdpZHRoICsgKGNvbnRlbnRXaWR0aCAtIHRhYmxlV2lkdGgpIC0gMTA7IC8vIGFjY291bnQgZm9yIHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gb25DaGFuZ2UgRXZlbnRzXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNVc2VMb2NhbERhdGEoKSkge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy56Z3JpZC5ncmlkU2V0dGluZyk7XHJcbiAgICAgIHRoaXMuemdyaWQuZmlsdGVyQ2hhbmdlKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlKGV2ZW50OiBQYWdlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc1VzZUxvY2FsRGF0YSgpKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnpncmlkLmdyaWRTZXR0aW5nKTtcclxuICAgICAgdGhpcy56Z3JpZC5wYWdlQ2hhbmdlKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzb3J0Q2hhbmdlKHNvcnQ6IFNvcnREZXNjcmlwdG9yW10pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc1VzZUxvY2FsRGF0YSgpKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnpncmlkLmdyaWRTZXR0aW5nKTtcclxuICAgICAgdGhpcy56Z3JpZC5zb3J0Q2hhbmdlKHNvcnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGluQ2VsbENoZWNrQm94T25DaGFuZ2UoZXZlbnQ6IGFueSwgcm93SW5kZXg6IGFueSwgY29sdW1uOiBhbnkpIHtcclxuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LmRldGFpbC5jaGVja2VkO1xyXG4gICAgY29uc3QgZ0RhdGEgPSB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICBnRGF0YVtyb3dJbmRleF1bY29sdW1uLlZhbHVlXSA9IGlzQ2hlY2tlZDtcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gY29tbWFuZCBoYW5kbGVyXHJcbiAgcHVibGljIGFkZEhhbmRsZXIoeyBzZW5kZXIgfSkge1xyXG4gICAgdGhpcy5pc05ldyA9IHRydWU7XHJcblxyXG4gICAgLy8gY2xvc2UgYW55IGV4aXN0aW5nIGVkaXRvclxyXG4gICAgdGhpcy5jbG9zZUVkaXRvcihzZW5kZXIpO1xyXG5cclxuICAgIC8vIGxvb3AgYWxsIGNvbHVtbiB0byBnZXQgdmFsaWRhdGlvbiBhbmQgY3JlYXRlIGZvcm0gY29udHJvbFxyXG4gICAgY29uc3QgY29sRm9ybUNvbnRyb2wgPSB7fTtcclxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuICAgICAgaWYgKGNvbC5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIGlmIChjb2wuVHlwZSA9PT0gJ3p0ZXh0ZWRpdG9yJykge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFpDb21wb25lbnRIZWxwZXIucmVxdWlyZWRWYWxpZGF0b3JfV2l0aG91dFdoaXRlU3BhY2VzX1RleHRFZGl0b3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChaQ29tcG9uZW50SGVscGVyLnJlcXVpcmVkVmFsaWRhdG9yX1dpdGhvdXRXaGl0ZVNwYWNlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2wuVmFsaWRhdG9yUGF0dGVybikge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oY29sLlZhbGlkYXRvclBhdHRlcm4pKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29sRm9ybUNvbnRyb2xbY29sLlZhbHVlXSA9IG5ldyBGb3JtQ29udHJvbChudWxsLCB2YWxpZGF0b3JzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIHNldCBmb3JtIGNvbnRyb2wgb2JqZWN0IHRvIGZvcm0gZ3JvdXBcclxuICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChjb2xGb3JtQ29udHJvbCk7XHJcblxyXG4gICAgLy8gYWRkIHRvIGdyaWQgcm93XHJcbiAgICBzZW5kZXIuYWRkUm93KHRoaXMuZm9ybUdyb3VwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlSGFuZGxlcih7IHNlbmRlciwgcm93SW5kZXgsIGZvcm1Hcm91cCwgaXNOZXcgfSk6IHZvaWQge1xyXG4gICAgLy8gR2V0IHRoZSBleGlzdGluZyBkYXRhIGZyb20gdGhlIGdyaWRcclxuICAgIGNvbnN0IGdyaWRFeGlzdGluZ0RhdGEgPSB0aGlzLmdldEdyaWREYXRhKCk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZvcm0gaXMgdmFsaWRcclxuICAgIGlmIChmb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgLy8gQ2hlY2sgZm9yIGEgdW5pcXVlIGtleSBmaWVsZFxyXG4gICAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmRhdGFbJ1VuaXF1ZUtleSddO1xyXG4gICAgICBpZiAodW5pcXVlS2V5KSB7XHJcbiAgICAgICAgLy8gR2V0IHRoZSB1bmlxdWUga2V5IHZhbHVlIGZyb20gdGhlIGZvcm1cclxuICAgICAgICBjb25zdCBmb3JtVW5pcXVlS2V5VmFsdWUgPSBmb3JtR3JvdXAudmFsdWVbdW5pcXVlS2V5XTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgdmFsdWVcclxuICAgICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IGdyaWRFeGlzdGluZ0RhdGEuc29tZShkYXRhID0+IHtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIC8vIElmIGVkaXRpbmcgYW4gZXhpc3Rpbmcgcm93LCBza2lwIHRoZSBjdXJyZW50IHJvdyBiZWluZyBlZGl0ZWRcclxuICAgICAgICAgICAgIWlzTmV3ICYmXHJcbiAgICAgICAgICAgIHJvd0luZGV4ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVuaXF1ZSBrZXkgdmFsdWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGdyaWRcclxuICAgICAgICAgICAgZGF0YVt1bmlxdWVLZXldID09PSBmb3JtVW5pcXVlS2V5VmFsdWUgJiZcclxuICAgICAgICAgICAgLy8gU2tpcCBjaGVja2luZyBhZ2FpbnN0IHRoZSBjdXJyZW50IHJvdyBiZWluZyBlZGl0ZWRcclxuICAgICAgICAgICAgZGF0YVt1bmlxdWVLZXldICE9PSBncmlkRXhpc3RpbmdEYXRhW3Jvd0luZGV4XVt1bmlxdWVLZXldXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSB2YWx1ZSwgc2hvdyBhbiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm4gd2l0aG91dCBzYXZpbmdcclxuICAgICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coJ0Vycm9yIG9jY3VyOiBEdXBsaWNhdGVkIHVuaXF1ZSBmaWVsZCBlbnRyeS4nLCAndG9wJywgdHJ1ZSwgMzAwMCwgJ2RhbmdlcicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSWYgdGhlIHVuaXF1ZSBrZXkgdmFsdWUgaXMgdmFsaWQgYW5kIHRoZXJlIGFyZSBubyBkdXBsaWNhdGVzLCBzYXZlIHRoZSBkYXRhXHJcbiAgICAgIGlmIChpc05ldykge1xyXG4gICAgICAgIC8vIEFkZCBhIG5ldyByb3cgdG8gdGhlIGdyaWQgZGF0YVxyXG4gICAgICAgIGdyaWRFeGlzdGluZ0RhdGEucHVzaChmb3JtR3JvdXAudmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFVwZGF0ZSBhbiBleGlzdGluZyByb3cgaW4gdGhlIGdyaWQgZGF0YVxyXG4gICAgICAgIGdyaWRFeGlzdGluZ0RhdGFbcm93SW5kZXhdID0gZm9ybUdyb3VwLnZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBVcGRhdGUgdGhlIGdyaWQgZGF0YSBhbmQgY2xvc2UgdGhlIHJvdyBlZGl0b3JcclxuICAgICAgdGhpcy5zZXREYXRhKGdyaWRFeGlzdGluZ0RhdGEpO1xyXG4gICAgICBzZW5kZXIuY2xvc2VSb3cocm93SW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbEhhbmRsZXIoeyBzZW5kZXIsIHJvd0luZGV4IH0pIHtcclxuICAgIC8vIGNhbmNlbCBhbnkgZXhpc3RpbmcgZWRpdG9yXHJcbiAgICBzZW5kZXIuY2xvc2VSb3cocm93SW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRIYW5kbGVyKHsgc2VuZGVyLCByb3dJbmRleCwgZGF0YUl0ZW0gfSkge1xyXG4gICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSByb3cgYmVpbmcgZWRpdGVkIGlzIG5vdCBhIG5ldyByb3dcclxuICAgIHRoaXMuaXNOZXcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBDbG9zZSBhbnkgZXhpc3RpbmcgZWRpdG9yXHJcbiAgICB0aGlzLmNsb3NlRWRpdG9yKHNlbmRlcik7XHJcblxyXG4gICAgLy8gbG9vcCBhbGwgY29sdW1uIHRvIGdldCB2YWxpZGF0aW9uIGFuZCBjcmVhdGUgZm9ybSBjb250cm9sLCBhcHBlbmQgY3VycmVudCByb3cgdmFsdWVcclxuICAgIGNvbnN0IGNvbEZvcm1Db250cm9sID0ge307XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgICAgIGlmIChjb2wuSXNSZXF1aXJlZCkge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICBpZiAoY29sLlR5cGUgPT09ICd6dGV4dGVkaXRvcicpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChaQ29tcG9uZW50SGVscGVyLnJlcXVpcmVkVmFsaWRhdG9yX1dpdGhvdXRXaGl0ZVNwYWNlc19UZXh0RWRpdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goWkNvbXBvbmVudEhlbHBlci5yZXF1aXJlZFZhbGlkYXRvcl9XaXRob3V0V2hpdGVTcGFjZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sLlZhbGlkYXRvclBhdHRlcm4pIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbEZvcm1Db250cm9sW2NvbC5WYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2woZGF0YUl0ZW1bY29sLlZhbHVlXSwgdmFsaWRhdG9ycyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzZXQgZm9ybSBjb250cm9sIG9iamVjdCB0byBmb3JtIGdyb3VwXHJcbiAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoY29sRm9ybUNvbnRyb2wpO1xyXG5cclxuICAgIC8vIFNldCB0aGUgZm9ybSBncm91cCBvbiB0aGUgcm93IGJlaW5nIGVkaXRlZFxyXG4gICAgdGhpcy5lZGl0ZWRSb3dJbmRleCA9IHJvd0luZGV4O1xyXG4gICAgc2VuZGVyLmVkaXRSb3cocm93SW5kZXgsIHRoaXMuZm9ybUdyb3VwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVIYW5kbGVyKHsgc2VuZGVyLCBkYXRhSXRlbSB9KSB7XHJcbiAgICBjb25zdCBnRGF0YSA9IHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJdGVtSW5kZXgoZGF0YUl0ZW0sIGdEYXRhLCB0aGlzLmRhdGFbJ1VuaXF1ZUtleSddKTtcclxuICAgIGdEYXRhLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBkYXRhIGluIHRoZSBncmlkXHJcbiAgICB0aGlzLnNldERhdGEoZ0RhdGEpO1xyXG5cclxuICAgIHNlbmRlci5jYW5jZWxDZWxsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlRWRpdG9yKGdyaWQsIHJvd0luZGV4ID0gdGhpcy5lZGl0ZWRSb3dJbmRleCkge1xyXG4gICAgZ3JpZC5jbG9zZVJvdyhyb3dJbmRleCk7XHJcbiAgICB0aGlzLmVkaXRlZFJvd0luZGV4ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEl0ZW1JbmRleChpdGVtOiBhbnksIGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBkYXRhLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgaWYgKGRhdGFbaWR4XVtrZXldID09PSBpdGVtW2tleV0pIHtcclxuICAgICAgICByZXR1cm4gaWR4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEdyaWQgRmlsdGVyXHJcbiAgcHJpdmF0ZSBzZXR1cEZpbHRlckZlYXR1cmUoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkdyaWRGaWx0ZXJCYXJGaWVsZCkge1xyXG4gICAgICB0aGlzLmZpbHRlckdyb3VwID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kYXRhLkdyaWRBZHZGaWx0ZXJCYXJGaWVsZCkge1xyXG4gICAgICB0aGlzLmFkdmZpbHRlckdyb3VwID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VhcmNoKCkge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZmlsdGVyR3JvdXAuZm9ybTtcclxuICAgIGNvbnN0IGNvbnRyb2xzID0gZm9ybS5jb250cm9scztcclxuXHJcbiAgICBpZiAodGhpcy5pc1Nob3dBZHZGaWx0ZXIpIHtcclxuICAgICAgY29uc3QgYWR2Zm9ybSA9IHRoaXMuYWR2ZmlsdGVyR3JvdXAuZm9ybTtcclxuICAgICAgY29uc3QgYWR2Y29udHJvbHMgPSBhZHZmb3JtLmNvbnRyb2xzO1xyXG4gICAgICBmb3IgKGNvbnN0IGMgb2YgT2JqZWN0LmtleXMoYWR2Y29udHJvbHMpKSB7XHJcbiAgICAgICAgY29udHJvbHNbY10gPSBhZHZjb250cm9sc1tjXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuRmlsdGVyU2VhcmNoKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcInpncmlkLWZpbHRlcnNlYXJjaFwiLFxyXG4gICAgICAgIHRhcmdldDogdGhpcy5kYXRhLkZpbHRlclNlYXJjaCxcclxuICAgICAgICBkYXRhOiB7IGZvcm1jb250cm9sczogY29udHJvbHMgfSxcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgICBPYmplY3Qua2V5cyhjb250cm9scykuZm9yRWFjaChjb250cm9sTmFtZSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xzW2NvbnRyb2xOYW1lXS52YWx1ZSkge1xyXG4gICAgICAgICAgY29uc3QgZmllbGQgPSBaQ29tcG9uZW50SGVscGVyLmdldEZpZWxkRnJvbUZpZWxkc0J5VmFsdWUodGhpcy5maWx0ZXJHcm91cC5maWVsZHMsIGNvbnRyb2xOYW1lKSB8fCBaQ29tcG9uZW50SGVscGVyLmdldEZpZWxkRnJvbUZpZWxkc0J5VmFsdWUodGhpcy5hZHZmaWx0ZXJHcm91cC5maWVsZHMsIGNvbnRyb2xOYW1lKTtcclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKHtcclxuICAgICAgICAgICAga2V5OiBmaWVsZC5WYWx1ZUV4cHIgfHwgZmllbGQuVmFsdWUsXHJcbiAgICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvckJ5RmllbGRUeXBlKGZpZWxkKSxcclxuICAgICAgICAgICAgdmFsdWU6IGNvbnRyb2xzW2NvbnRyb2xOYW1lXS52YWx1ZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYW5jZWxFZGl0KCkge1xyXG4gICAgdGhpcy5jbGVhckZpbHRlckRhdGEodGhpcy5maWx0ZXJHcm91cCk7XHJcbiAgICBpZiAodGhpcy5kYXRhLkdyaWRBZHZGaWx0ZXJCYXJGaWVsZCkge1xyXG4gICAgICB0aGlzLmNsZWFyRmlsdGVyRGF0YSh0aGlzLmFkdmZpbHRlckdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJGaWx0ZXJEYXRhKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGZvcm0gPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IGNvbnRyb2xzID0gZm9ybS5jb250cm9scztcclxuICAgIE9iamVjdC5rZXlzKGNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2xOYW1lID0+IHtcclxuICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKGNvbnRyb2xOYW1lLCBudWxsLCBncm91cCwgdHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZHZhbmNlZFNlYXJjaCgpIHtcclxuICAgIHRoaXMuaXNTaG93QWR2RmlsdGVyID0gIXRoaXMuaXNTaG93QWR2RmlsdGVyO1xyXG4gICAgaWYgKCF0aGlzLmlzU2hvd0FkdkZpbHRlcikge1xyXG4gICAgICB0aGlzLmNsZWFyRmlsdGVyRGF0YSh0aGlzLmFkdmZpbHRlckdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyT3BlcmF0b3JCeUZpZWxkVHlwZShmaWVsZDogWkZpZWxkKSB7XHJcbiAgICBzd2l0Y2ggKGZpZWxkLlR5cGUpIHtcclxuICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxyXG4gICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICBjYXNlIFwiZW1haWxcIjpcclxuICAgICAgY2FzZSBcInBhc3N3b3JkXCI6XHJcbiAgICAgIGNhc2UgXCJ0ZWxcIjpcclxuICAgICAgY2FzZSBcInRleHRcIjpcclxuICAgICAgY2FzZSBcInVybFwiOlxyXG4gICAgICBjYXNlIFwiY3VycmVuY3lcIjpcclxuICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgaWYgKCFmaWVsZFsnRmlsdGVyQ29udGFpbnNVc2luZ0VxdWFsJ10pIHtcclxuICAgICAgICAgIHJldHVybiBcImNvbnRhaW5zXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIj09XCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiPVwiO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGdyaWQgY29tbW9uIHNldHRpbmcgZnVuY3Rpb25cclxuICBwdWJsaWMgc2V0IHNldEdyaWRUaXRsZShuZXdUaXRsZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmdyaWRUaXRsZSA9IG5ld1RpdGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzZXRHcmlkU3RhdGUoc3RhdGU6IFN0YXRlKSB7XHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA9IHN0YXRlO1xyXG4gICAgdGhpcy56Z3JpZC5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBzdGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRHcmlkVG9GaXJzdFBhZ2UoKSB7XHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5za2lwID0gMDtcclxuICAgIHRoaXMuemdyaWQuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNraXAgPSAwO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8IS0tXHJcbjxkaXYgc3R5bGU9XCJtYXJnaW46IDEwcHhcIj5cclxuICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBrLWZvcm1cIj5cclxuICAgICAgICAgIDxmaWVsZHNldD5cclxuICAgICAgICAgICAgPGxlZ2VuZD5CaW5kaW5nIHR5cGVzPC9sZWdlbmQ+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrLWZvcm0tZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPkJpbmQgdGhlIGRhdGEgdG86PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiYmluZGluZ1R5cGVcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwibW9kZVwiIGlkPVwiYXJyYXlcIiB2YWx1ZT1cImFycmF5XCIgY2xhc3M9XCJrLXJhZGlvXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQmluZGluZ1R5cGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiay1yYWRpby1sYWJlbFwiIGZvcj1cImFycmF5XCI+QXJyYXkgb2JqZWN0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImJpbmRpbmdUeXBlXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVcIiBpZD1cImdyaWREYXRhUmVzdWx0XCIgdmFsdWU9XCJncmlkRGF0YVJlc3VsdFwiIGNsYXNzPVwiay1yYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUJpbmRpbmdUeXBlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstcmFkaW8tbGFiZWxcIiBmb3I9XCJncmlkRGF0YVJlc3VsdFwiPkdyaWREYXRhUmVzdWx0IG9iamVjdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJiaW5kaW5nVHlwZVwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlXCIgaWQ9XCJhc3luY1wiIHZhbHVlPVwiYXN5bmNcIiBjbGFzcz1cImstcmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VCaW5kaW5nVHlwZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJrLXJhZGlvLWxhYmVsXCIgZm9yPVwiYXN5bmNcIj5Bc3luY2hyb25vdXMgc291cmNlPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+IC0tPlxyXG48ZGl2IGNsYXNzPVwiZ3JpZC1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbbmdDbGFzc109XCJkYXRhLkNsYXNzXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGVcIj5cclxuXHJcbiAgPCEtLSA8ZGl2ICpuZ0lmPVwiZGF0YS5UaXRsZVwiIGNsYXNzPVwiZ3JpZFRpdGxlXCI+e3tkYXRhLlRpdGxlfX08L2Rpdj4gLS0+XHJcbiAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBsZXQtYW5jaG9yPlxyXG4gICAgPHNwYW4+e3sgYW5jaG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJUZXh0IH19PC9zcGFuPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPGtlbmRvLXBvcG92ZXIgI2dyaWRQb3BPdmVyIFtwb3NpdGlvbl09XCJkYXRhLlBvcE92ZXJQb3NpdGlvbiB8fCAnYm90dG9tJ1wiIFt0ZW1wbGF0ZURhdGFdPVwiZ2V0Q29udGV4dERhdGEuYmluZCh0aGlzKVwiPlxyXG4gICAgPCEtLSA8bmctdGVtcGxhdGUga2VuZG9Qb3BvdmVyVGl0bGVUZW1wbGF0ZSBsZXQtZGF0YT1cImRhdGFcIiA+XHJcbiAgICAgIDxkaXYgW3N0eWxlXT1cImRhdGEuVGl0bGVTdHlsZVwiICpuZ0lmPVwiZGF0YSAmJiBkYXRhLlRpdGxlXCIgW2lubmVySFRNTF09XCJkYXRhLlRpdGxlXCI+PC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPiAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1BvcG92ZXJCb2R5VGVtcGxhdGUgbGV0LWRhdGE9XCJkYXRhXCI+XHJcbiAgICAgIDxkaXYgW3N0eWxlXT1cImRhdGEuQm9keVN0eWxlXCIgY2xhc3M9XCJwb3BvdmVyYm9keVwiICpuZ0lmPVwiZGF0YSAmJiBkYXRhLkJvZHlcIiBbaW5uZXJIVE1MXT1cImRhdGEuQm9keSB8IGh0bWxTYW5pdGl6ZVwiIFtuZ0NsYXNzXT1cImRhdGEuQm9keUNsYXNzXCIgKG1vdXNlbGVhdmUpPVwiY2xvc2VQb3BPdmVyLmNhbGwodGhpcywgJGV2ZW50KVwiPjwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2tlbmRvLXBvcG92ZXI+XHJcblxyXG4gIDxkaXYga2VuZG9Ub29sdGlwIHNob3dPbj1cIm5vbmVcIiBbdG9vbHRpcFRlbXBsYXRlXT1cInRlbXBsYXRlXCIgZmlsdGVyPVwiLmstZ3JpZCB0ZFwiIChtb3VzZW92ZXIpPVwic2hvd1Rvb2x0aXAoJGV2ZW50KVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiIGNsYXNzPVwiZTF0YWctc3R5bGUxXCI+XHJcbiAgICA8ZGl2IGtlbmRvUG9wb3ZlckNvbnRhaW5lciBbcG9wb3Zlcl09XCJncmlkUG9wT3ZlclwiIGZpbHRlcj1cImRpdi5ncmlkQ2VsbC53aXRoUG9wb3ZlckluR3JpZFwiIHNob3dPbj1cIm5vbmVcIiBrZW5kb1BvcG92ZXJDb250YWluZXIgI3BvcG92ZXJjb250YWluZXI9XCJrZW5kb1BvcG92ZXJDb250YWluZXJcIj5cclxuICAgICAgPGtlbmRvLWdyaWQgW3pncmlkYmluZGluZ109XCJ7ZGF0YTogZGF0YSwgZ3JvdXA6IGdyb3VwLCBwYXJhbXM6IHBhcmFtcywgZ3JpZFN1YmplY3Q6IGdyaWRTdWJqZWN0LCBncmlkU2V0dGluZzogZ3JpZFNldHRpbmd9XCIgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiIGNsYXNzPVwiZGVza3RvcC1ncmlkIGUxdGFnLXN0eWxlMlwiXHJcbiAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cImRhdGEuc2Nyb2xsQWJsZSA9PT0gZmFsc2UgPyAnbm9uZScgOiAnc2Nyb2xsYWJsZSdcIlxyXG4gICAgICAgICAgICAgICAgICBbcGFnZWFibGVdPVwicGFnZWFibGVcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuaGlkZW4tcGFnZXJdPVwiIXBhZ2VhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cImdyaWRTZXR0aW5nLmdyaWRTdGF0ZS50YWtlXCJcclxuICAgICAgICAgICAgICAgICAgW3NraXBdPVwiZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNraXBcIlxyXG4gICAgICAgICAgICAgICAgICBbc29ydF09XCJncmlkU2V0dGluZy5ncmlkU3RhdGUuc29ydFwiXHJcbiAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJ7YWxsb3dVbnNvcnQ6IHRydWUsbW9kZTogJ211bHRpcGxlJ31cIlxyXG4gICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5maWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLmVuYWJsZUZpbHRlcmluZyAhPT0gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbcmVvcmRlcmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5NZW51XT1cImRhdGEuRGlzYWJsZUdyaWRDb2x1bW5NZW51ID8gZmFsc2UgOiB7IGZpbHRlcjogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCJcclxuICAgICAgICAgICAgICAgICAgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2tIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoY2VsbENsb3NlKT1cImVkaXRDZWxsQ2xvc2VIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoZGF0YVN0YXRlQ2hhbmdlKT1cImRhdGFTdGF0ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHNvcnRDaGFuZ2UpPVwic29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJmaWx0ZXJDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtrZW5kb0dyaWRTZWxlY3RCeV09XCJyb3dTZWxlY3Rpb25LZXlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkS2V5cyldPVwicm93U2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCJcclxuICAgICAgICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXHJcbiAgICAgICAgICAgICAgICAgIChjYW5jZWwpPVwiY2FuY2VsSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHNhdmUpPVwic2F2ZUhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChyZW1vdmUpPVwicmVtb3ZlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGVkaXQpPVwiZWRpdEhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChhZGQpPVwiYWRkSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGNvbHVtblJlc2l6ZSk9XCJhZGp1c3RXaWR0aFVwb25SZXNpemUoKVwiXHJcbiAgICAgICAgICAgICAgICAgIChleGNlbEV4cG9ydCk9XCJvbkV4Y2VsRXhwb3J0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICBbcm93Q2xhc3NdPVwicm93Q2FsbGJhY2suYmluZCh0aGlzKVwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRUb29sYmFyVGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLkFsbG93UmVmcmVzaEJ1dHRvbiB8fCBkYXRhLkFsbG93RXhwb3J0IHx8IGRhdGEuQWxsb3dTYXZlU3RhdGUgfHwgZGF0YS5UaXRsZSB8fCBkYXRhLkdyaWRCdXR0b25GaWVsZE5hbWVfV0YgfHwgZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lIHx8IGRhdGEuRW5hYmxlR3JpZENvbW1hbmQgfHwgZGF0YS5FbmFibGVDdXN0b21BZGRDb21tYW5kIHx8IGRhdGEuRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1sZWZ0LWl0ZW1cIiAqbmdJZj1cImdyaWRUaXRsZSB8fCBkYXRhLkFsbG93UmVmcmVzaEJ1dHRvbiB8fCBkYXRhLkFsbG93RXhwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGZhLWljb24gKm5nSWY9XCJkYXRhLkljb25cIiBjbGFzcz1cImdyaWRUaXRsZUljb25cIiBbaWNvbl09XCJkYXRhLkljb25cIj48L2ZhLWljb24+IC0tPlxyXG4gICAgICAgICAgICA8a2VuZG8tbGFiZWwgY2xhc3M9XCJncmlkVGl0bGVcIiAqbmdJZj1cImdyaWRUaXRsZVwiPnt7IGdyaWRUaXRsZSB9fTwva2VuZG8tbGFiZWw+XHJcbiAgICAgICAgICAgIDxidXR0b24gdGl0bGU9XCJSZWZyZXNoXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibGVmdC1idXR0b25zIHJlZnJlc2gtYnV0dG9uXCIga2VuZG9CdXR0b24gKGNsaWNrKT1cInJlZnJlc2hEYXRhKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5BbGxvd1JlZnJlc2hCdXR0b25cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWdyaWQtYnV0dG9uIGstaS1yZWZyZXNoLXNtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2xiYXItbGVmdC1pdGVtLXNlY29uZC1jb250YWluZXJcIiAqbmdJZj1cImRhdGEuQWxsb3dFeHBvcnRcIiBbY2xhc3Mud2l0aC1ncmlkLXRpdGxlXT1cImdyaWRUaXRsZSB8fCBkYXRhLkFsbG93UmVmcmVzaEJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibGVmdC1idXR0b25zIGV4cG9ydC1idXR0b25cIiBrZW5kb0dyaWRFeGNlbENvbW1hbmQgKm5nSWY9XCJkYXRhLkFsbG93RXhwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1maWxlLWV4Y2VsXCI+PC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJkb3dubG9hZFwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LXRvLWV4Y2VsLWJ1dHRvbi10ZXh0XCI+e3sgZ2V0VG9vbEJhckl0ZW1MYWJlbE5hbWUoJ0Rvd25sb2FkIGFzIEV4Y2VsJykgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1yaWdodC1pdGVtXCIgKm5nSWY9XCJncmlkQnRuIHx8IGRhdGEuQ2FjaGVJbmZvPy5FbmFibGVTYXZlU3RhdGUgfHwgZ3JpZERlZmF1bHRTdGF0ZUV4aXN0IHx8IGRhdGEuRW5hYmxlR3JpZENvbW1hbmQgfHwgZGF0YS5FbmFibGVDdXN0b21BZGRDb21tYW5kIHx8IGRhdGEuRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kXCI+XHJcbiAgICAgICAgICAgIDxhcHAtendvcmtmbG93YnV0dG9ucyAqbmdJZj1cImdyaWRCdG4gJiYgZ3JpZEJ0bi5UeXBlID09PSAnendvcmtmbG93YnV0dG9ucydcIiBbZGF0YV09XCJncmlkQnRuXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXp3b3JrZmxvd2J1dHRvbnM+XHJcbiAgICAgICAgICAgIDxhcHAtemJ1dHRvbnMgKm5nSWY9XCJncmlkQnRuICYmIGdyaWRCdG4uVHlwZSA9PT0gJ3pidXR0b25zJ1wiIFtkYXRhXT1cImdyaWRCdG5cIiBbZ3JvdXBdPVwiZ3JvdXBcIiBbZm9ybV09XCJmb3JtXCI+PC9hcHAtemJ1dHRvbnM+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJzYXZlR3JpZFNldHRpbmdzKClcIiAqbmdJZj1cImRhdGEuQ2FjaGVJbmZvPy5FbmFibGVTYXZlU3RhdGVcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWljb24td2l0aC10ZXh0IGstaS1zdGFyXCI+PC9zcGFuPnt7IGdldFRvb2xCYXJJdGVtTGFiZWxOYW1lKCdTYXZlIFNldHRpbmdzJykgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJyZXN0b3JlR3JpZFNldHRpbmdzKClcIiAqbmdJZj1cInNob3dSZXN0b3JlR3JpZFNldHRpbmdCdXR0b25cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWljb24td2l0aC10ZXh0IGstaS1zdGFyLW91dGxpbmVcIj48L3NwYW4+e3sgZ2V0VG9vbEJhckl0ZW1MYWJlbE5hbWUoJ1Jlc3RvcmUgU2V0dGluZ3MnKSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIga2VuZG9HcmlkQWRkQ29tbWFuZCAqbmdJZj1cImRhdGEuRW5hYmxlR3JpZENvbW1hbmRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWljb24td2l0aC10ZXh0IGstaS1hZGRcIj48L3NwYW4+e3sgZ2V0VG9vbEJhckl0ZW1MYWJlbE5hbWUoZGF0YS5BZGRDb21tYW5kQnV0dG9uTmFtZSA/IGRhdGEuQWRkQ29tbWFuZEJ1dHRvbk5hbWU6ICdBZGQnKSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIga2VuZG9CdXR0b24gKGNsaWNrKT1cImdyaWRDdXN0b21BZGRDb21tYW5kKGdyb3VwKVwiICpuZ0lmPVwiZGF0YS5FbmFibGVDdXN0b21BZGRDb21tYW5kXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pY29uLXdpdGgtdGV4dCBrLWktYWRkXCI+PC9zcGFuPnt7IGdldFRvb2xCYXJJdGVtTGFiZWxOYW1lKGRhdGEuQWRkQ29tbWFuZEJ1dHRvbk5hbWUgPyBkYXRhLkFkZENvbW1hbmRCdXR0b25OYW1lOiAnQWRkJykgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJncmlkQ3VzdG9tUmVzZXRDb21tYW5kKGdyb3VwKVwiICpuZ0lmPVwiZGF0YS5FbmFibGVDdXN0b21SZXNldENvbW1hbmRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWljb24td2l0aC10ZXh0IGstaS10cmFzaFwiPjwvc3Bhbj57eyBnZXRUb29sQmFySXRlbUxhYmVsTmFtZShkYXRhLlJlc2V0Q29tbWFuZEJ1dHRvbk5hbWUgPyBkYXRhLlJlc2V0Q29tbWFuZEJ1dHRvbk5hbWU6ICdSZXNldCcpIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWNvbnRhaW5lclwiICpuZ0lmPVwiZGF0YS5HcmlkRmlsdGVyQmFyRmllbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vcm1hbC1maWx0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16Zm9ybSBjbGFzcz1cImZpbHRlci1maWVsZHNcIiBbZ3JvdXBdPVwiZmlsdGVyR3JvdXBcIiBbZmllbGROYW1lXT1cImRhdGEuR3JpZEZpbHRlckJhckZpZWxkXCI+PC9hcHAtemZvcm0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1idXR0b25zXCIgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cInNvbGlkXCIgc2l6ZT1cImRlZmF1bHRcIiBzdHJvbmc9XCJ0cnVlXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNlYXJjaCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJzZWFyY2hcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWxhYmVsIGlvbi10ZXh0LWNhcGl0YWxpemVcIj57eyBnZXRUb29sQmFySXRlbUxhYmVsTmFtZSgnU2VhcmNoJykgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwib3V0bGluZVwiIHNpemU9XCJkZWZhdWx0XCIgc3Ryb25nPVwidHJ1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJjYW5jZWxFZGl0KClcIiAqbmdJZj1cImRhdGEuSXNTaG93R3JpZENhbmNlbEZpbHRlckJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwidGltZXNcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwic29saWRcIiBzaXplPVwiZGVmYXVsdFwiIHN0cm9uZz1cInRydWVcIiBbbmdDbGFzc109XCJpc1Nob3dBZHZGaWx0ZXIgPyAndG9nZ2xlT24nIDogJ3RvZ2dsZU9mZidcIiAoY2xpY2spPVwiYWR2YW5jZWRTZWFyY2goKVwiICpuZ0lmPVwiZGF0YS5HcmlkQWR2RmlsdGVyQmFyRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInNsaWRlcnMtaFwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxhcHAtemZvcm0gKm5nSWY9XCJkYXRhLkdyaWRBZHZGaWx0ZXJCYXJGaWVsZFwiIGNsYXNzPVwidG8tcHJlbG9hZC10aGUtZmllbGRzXCIgW2dyb3VwXT1cImFkdmZpbHRlckdyb3VwXCIgW2ZpZWxkTmFtZV09XCJkYXRhLkdyaWRBZHZGaWx0ZXJCYXJGaWVsZFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvYXBwLXpmb3JtPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWR2LWZpbHRlci1jb250YWluZXJcIiAqbmdJZj1cImlzU2hvd0FkdkZpbHRlclwiIFtAaGlkZUFuZFNob3dBbmltYXRpb25dPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZHYtZmlsdGVyLXNlcGVyYXRvclwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGdldFRvb2xCYXJJdGVtTGFiZWxOYW1lKCdBZHZhbmNlZCBTZWFyY2gnKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxhcHAtemZvcm0gY2xhc3M9XCJhZHZmaWx0ZXItZmllbGRzXCIgW2dyb3VwXT1cImFkdmZpbHRlckdyb3VwXCIgW2ZpZWxkTmFtZV09XCJkYXRhLkdyaWRBZHZGaWx0ZXJCYXJGaWVsZFwiPjwvYXBwLXpmb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPGtlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uICpuZ0lmPVwiISFkYXRhLlNlbGVjdE9wdGlvbnNcIiBbd2lkdGhdPVwiNjBcIiBzaG93U2VsZWN0QWxsPVwidHJ1ZVwiIFtjb2x1bW5NZW51XT1cInRydWVcIiBbbG9ja2VkXT1cImNoZWNrYm94Q29sdW1uUGlubmVkXCI+XHJcbiAgICAgICAgPC9rZW5kby1ncmlkLWNoZWNrYm94LWNvbHVtbj5cclxuICAgICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gW3N0eWxlXT1cImdldEdyaWRDb2x1bW5TdHlsZSgpXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTNcIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7XCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiIFt0aXRsZV09XCJjb2wudGl0bGVcIiBbd2lkdGhdPVwiY29sLndpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pblJlc2l6YWJsZVdpZHRoXT1cImNvbC5taW5SZXNpemFibGVXaWR0aFwiIFtmaWx0ZXJdPVwiY29sLmZpbHRlclwiIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGUoY29sLmVuYWJsZUZpbHRlcmluZylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwic29ydGFibGUoY29sLmVuYWJsZVNvcnRpbmcpXCIgW2hlYWRlclN0eWxlXT1cImdldEdyaWRIZWFkZXJTdHlsZSgpXCIgaGVhZGVyQ2xhc3M9XCJlMXRhZy1zdHlsZTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVyU3R5bGVdPVwiZ2V0R3JpZEZvb3RlclN0eWxlKClcIiBmb290ZXJDbGFzcz1cImUxdGFnLXN0eWxlOVwiIFtoaWRkZW5dPVwiY29sLmhpZGRlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwiY29sLmZvcm1hdFwiIFtjbGFzc109XCJjb2wuQ2xhc3NcIiBbbG9ja2VkXT1cImxvY2tlZChjb2wpXCIgZWRpdG9yPVwibnVtZXJpY1wiIFtjb2x1bW5NZW51XT1cIiFjb2wuZGlzYWJsZUNvbHVtbk1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbZWRpdG9yXT1cImNvbC5lZGl0b3JUeXBlXCI+XHJcbiAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImNvbC5maWVsZFR5cGUgPT09ICdudW1iZXInXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICdjdXJyZW5jeSdcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3pudW1lcmljJ1wiPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1udW1lcmljLWZpbHRlci1jZWxsIFtzaG93T3BlcmF0b3JzXT1cImRhdGEuSXNTaG93R3JpZEZpbHRlck9wZXJhdG9yXCIgW2NvbHVtbl09XCJjb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiIG9wZXJhdG9yPVwiZXFcIj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1uZXEtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtbnVtZXJpYy1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiY29sLmZpZWxkVHlwZSA9PSAnemRhdGUnXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6dGltZSdcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3pkYXRldGltZSdcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3p1aWRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IHRydWVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCIgb3BlcmF0b3I9XCJsdGVcIj5cclxuICAgICAgICAgICAgICAgICAgPGRhdGUtcmFuZ2UtZmlsdGVyLWNlbGwgW3Nob3dPcGVyYXRvcnNdPVwiZGF0YS5Jc1Nob3dHcmlkRmlsdGVyT3BlcmF0b3JcIiBjbGFzcz1cImRhdGUtcmFuZ2UtZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgW2RhdGFdPVwiZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGF0ZS1yYW5nZS1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5maWx0ZXJCeURhdGVSYW5nZSA9PT0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1ncmlkLWRhdGUtZmlsdGVyLWNlbGwgW3Nob3dPcGVyYXRvcnNdPVwiZGF0YS5Jc1Nob3dHcmlkRmlsdGVyT3BlcmF0b3JcIiBbY29sdW1uXT1cImNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImx0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImNvbC5maWVsZFR5cGUgPT09ICdjaGVja2JveCdcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtYm9vbGVhbi1maWx0ZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJlcVwiPlxyXG4gICAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLWJvb2xlYW4tZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1jZWxsIFtzaG93T3BlcmF0b3JzXT1cImRhdGEuSXNTaG93R3JpZEZpbHRlck9wZXJhdG9yXCIgW2NvbHVtbl09XCJjb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJjb250YWluc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWNvbnRhaW5zLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWNvbnRhaW5zLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWVxLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1uZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItc3RhcnRzd2l0aC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1zdGFydHN3aXRoLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWVuZHN3aXRoLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWVuZHN3aXRoLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1zdHJpbmctZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gR3JpZCBFZGl0IFRlbXBsYXRlIC0tPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEVkaXRUZW1wbGF0ZSAqbmdJZj1cImRhdGEuRW5hYmxlR3JpZENvbW1hbmQgXCIgbGV0LWRhdGFJdGVtPVwiZGF0YUl0ZW1cIiBsZXQtY29sdW1uPVwiY29sXCIgbGV0LWZvcm1Hcm91cD1cImZvcm1Hcm91cFwiIGxldC1pc05ldz1cImlzTmV3XCI+XHJcbiAgICAgICAgICAgIDxkaXYgW25nU3dpdGNoXT1cImNvbC5maWVsZFR5cGVcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLW51bWVyaWN0ZXh0Ym94ICNjZWxsQW5jaG9yIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZClcIj48L2tlbmRvLW51bWVyaWN0ZXh0Ym94PlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLXBvcHVwIFthbmNob3JdPVwiY2VsbEFuY2hvci5udW1lcmljSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIShpc05ldyAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBDbGFzcz1cImstd2lkZ2V0IGstdG9vbHRpcCBrLXRvb2x0aXAtdmFsaWRhdGlvbiBrLWludmFsaWQtbXNnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogMnB4OyBvcGFjaXR5OiAwLjU7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5lcnJvcnM/LnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgY29sLk5hbWUgfX0gcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5lcnJvcnM/LnBhdHRlcm5cIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA/IGNvbC5WYWxpZGF0b3JNZXNzYWdlIDogXCJQbGVhc2UgY2hlY2sgdGhlIGlucHV0IHZhbHVlLlwiIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9rZW5kby1wb3B1cD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tdGV4dGJveCAjY2VsbEFuY2hvciBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpXCI+PC9rZW5kby10ZXh0Ym94PlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLXBvcHVwIFthbmNob3JdPVwiY2VsbEFuY2hvci5pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhKGlzTmV3ICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cENsYXNzPVwiay13aWRnZXQgay10b29sdGlwIGstdG9vbHRpcC12YWxpZGF0aW9uIGstaW52YWxpZC1tc2dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAycHg7IG9wYWNpdHk6IDAuNTtcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXdhcm5pbmdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS08aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCI+e3sgY29sLk5hbWUgfX0gaXMgcmVxdWlyZWQuPC9pb24tbGFiZWw+LS0+XHJcbiAgICAgICAgICAgICAgICAgIC1sXHJcblxyXG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5lcnJvcnM/LnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgY29sLk5hbWUgfX0gcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5lcnJvcnM/LnBhdHRlcm5cIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA/IGNvbC5WYWxpZGF0b3JNZXNzYWdlIDogXCJQbGVhc2UgY2hlY2sgdGhlIGlucHV0IHZhbHVlLlwiIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9rZW5kby1wb3B1cD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZSBsZXQtZGF0YUl0ZW0gbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbjogMXB4IDA7XCIgKm5nSWY9XCIhY29sLmNsaWNrYWJsZUljb25zICYmIGNvbC5pc0VkaXRhYmxlSW5HcmlkICE9PSB0cnVlXCJcclxuICAgICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiIFtuZ0NsYXNzXT1cImdldENsYXNzKGRhdGFJdGVtLCBjb2wpXCIgW3N0eWxlXT1cImdldENlbGxTdHlsZShjb2wsIGRhdGFJdGVtKVwiIFthdHRyLmRhdGEtaWRdPVwiZGF0YUl0ZW0uSWRcIiBbYXR0ci5jb2x1bW4tbmFtZV09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNob3dQb3BPdmVyKGNvbCwgJGV2ZW50KVwiIChtb3VzZWxlYXZlKT1cImNsb3NlUG9wT3ZlcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZSdcIiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogY29sLkZvcm1hdE9wdGlvbnMgPz8gJ2RkL01NL3l5eXknIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenRpbWUnXCIgY2xhc3M9XCJncmlkLWNlbGwtZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6IGNvbC5Gb3JtYXRPcHRpb25zID8/ICdISDptbScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6c2hvcnRkYXRlJ1wiIGNsYXNzPVwiZ3JpZC1jZWxsLWRhdGFcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiBjb2wuRm9ybWF0T3B0aW9ucyA/PyAnTU1NIHl5eXknIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGV0aW1lJ1wiIGNsYXNzPVwiZ3JpZC1jZWxsLWRhdGFcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiBjb2wuRm9ybWF0T3B0aW9ucyA/PyAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dWlkYXRldGltZSdcIiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogY29sLkZvcm1hdE9wdGlvbnMgPz8gJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiIGNsYXNzPVwiZ3JpZC1jZWxsLWRhdGFcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBudW1iZXIgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgbnVtYmVyOiBnZXRGb3JtYXQoY29sLCAnMS4yLTInKSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pudW1lcmljJ1wiIGNsYXNzPVwiZ3JpZC1jZWxsLWRhdGFcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBudW1iZXI6IGdldEZvcm1hdChjb2wpIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIndXJsJ1wiIHN0eWxlPVwiY29sb3I6IGJsdWU7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcIiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiA1cHggMDtcIiAqbmdJZj1cImNvbC5ncmlkQ2VsbFJlcGxhY2VWYWx1ZSAmJiBnZXRJY29uTmFtZShjb2wuZ3JpZENlbGxSZXBsYWNlVmFsdWUsIGRhdGFJdGVtW2NvbC5maWVsZF0pICE9PSAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJnZXRJY29uTmFtZShjb2wuZ3JpZENlbGxSZXBsYWNlVmFsdWUsIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbC5ncmlkQ2VsbFJlcGxhY2VWYWx1ZVwiIFtuZ1N3aXRjaF09XCJjZWxsU3R5bGVDb25kaXRpb24oY29sLCBkYXRhSXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPXRydWU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbGxTdHlsZUNvbmRpdGlvbkRlZmF1bHRcIiBbc3R5bGVdPVwic2V0Q2VsbFN0eWxlQ29uZGl0aW9uKGNvbCwgZGF0YUl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JpZC1jZWxsLWRhdGFcIj57eyBkYXRhSXRlbVtjb2wuZmllbGRdIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JpZC1jZWxsLWRhdGFcIj57eyBkYXRhSXRlbVtjb2wuZmllbGRdIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIiEhY29sLm5hdmlnYXRlVG9cIiAoY2xpY2spPVwib25OYXZpZ2F0ZVRvKCRldmVudCwgY29sLCBkYXRhSXRlbSwgZGF0YUl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJsaWdodFwiIHNpemU9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICB7eyBjb2wuQ2xpY2thYmxlSWNvbnMgfX1cclxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9IFwiZW5kXCIgbmFtZT1cImFycm93LWZvcndhcmRcIj48L2lvbi1pY29uPlxyXG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDVweCAwO1wiICpuZ0lmPVwiY29sLmlzRWRpdGFibGVJbkdyaWQgPT09IHRydWUgJiYgaXNJbmxpbmVGb3JtR3JvdXBIYXNWYWx1ZSgpICYmICFpc0lubGluZUVkaXRJbnB1dEZpZWxkTG9hZGluZyAmJiAhY29sLmdyaWRDZWxsUmVwbGFjZVZhbHVlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1XCJcclxuICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRDbGFzcyhkYXRhSXRlbSwgY29sKVwiIGNsYXNzPVwiZTF0YWctc3R5bGU1XCIgW3N0eWxlXT1cImdldENlbGxTdHlsZUZvcklubGluZUVkaXQoY29sLCBkYXRhSXRlbSwgcm93SW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16aW5wdXQtY29udGFpbmVyIFtkYXRhXT1cImdldElubGluZUZpZWxkKGNvbC5maWVsZClcIiBbZ3JvdXBdPVwiZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJnZXRJbmxpbmVGb3JtKGRhdGFJdGVtLCByb3dJbmRleClcIiBbY29udGFpbmVyRmllbGRdPVwiY29udGFpbmVyRmllbGRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTZcIiBjbGFzcz1cImUxdGFnLXN0eWxlNlwiPlxyXG4gICAgICAgICAgICAgIDwvYXBwLXppbnB1dC1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sLmNsaWNrYWJsZUljb25zXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiaWNvbi5DbGFzcyA/IGljb24uQ2xhc3MgOiAnJ1wiICpuZ0lmPVwiISFpY29uICYmICghIWRhdGFJdGVtLldGU19TdGF0dXNDb2RlICYmICEhaWNvbilcclxuICAgICAgICAgICAgICA/IGRhdGFJdGVtLldGU19TdGF0dXNDb2RlICE9PSBpY29uLldGU19TdGF0dXNDb2RlXHJcbiAgICAgICAgICAgICAgOiB0cnVlO1xyXG4gICAgICAgICAgICBlbHNlIGRpc2FibGVkQnV0dG9uXCIgKGNsaWNrKT1cIm9uQnRuQ2xpY2soJGV2ZW50LCBpY29uLCBkYXRhSXRlbSwgZGF0YUl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICAgIHt7aWNvbi5OYW1lIHx8IGRhdGFJdGVtW2NvbC5maWVsZF19fSA8ZmEtaWNvbiBbaWNvbl09XCJpY29uLkljb25cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHg7XCI+XHJcbiAgICAgICAgICAgICAgICA8L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzYWJsZWRCdXR0b24+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8IS0tIDxzdHJvbmc+e3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fTwvc3Ryb25nPiAtLT5cclxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInt7ZGF0YUl0ZW0uRGlzY29udGludWVkID8gJ2Rpc2NvbnRpbnVlZCcgOiAnYWN0aXZlJ319XCI+XHJcbiAgICAgICAgICAgICAge3tkYXRhSXRlbS5EaXNjb250aW51ZWQgPyBcImRpc2NvbnRpbnVlZFwiIDogXCJhY3RpdmVcIn19XHJcbiAgICAgICAgICAgIDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZvb3RlclRlbXBsYXRlIGxldC1jb2x1bW4gbGV0LWNvbHVtbkluZGV4PVwiY29sdW1uSW5kZXhcIiAqbmdJZj1cImRhdGEuRW5hYmxlQWdncmVnYXRlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDVweCAwO1wiIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU3XCIgY2xhc3M9XCJlMXRhZy1zdHlsZTdcIj5cclxuICAgICAgICAgICAgICB7e2NvbC5hZ2dyZWdhdGVUeXBlfX1cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogY29sLkZvcm1hdE9wdGlvbnMgPz8gJ2RkL01NL3l5eXknIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenRpbWUnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiBjb2wuRm9ybWF0T3B0aW9ucyA/PyAnSEg6bW0nIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenNob3J0ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6IGNvbC5Gb3JtYXRPcHRpb25zID8/ICdNTU0geXl5eScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiBjb2wuRm9ybWF0T3B0aW9ucyA/PyAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6IGNvbC5Gb3JtYXRPcHRpb25zID8/ICdkZC9NTS95eXl5IGhoOm1tOnNzIGFhJyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IG51bWJlciB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgbnVtYmVyOiBnZXRGb3JtYXQoY29sLCAnMS4yLjInKSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pudW1lcmljJ1wiPlxyXG4gICAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgbnVtYmVyOiBnZXRGb3JtYXQoY29sKSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3VybCdcIiBzdHlsZT1cImNvbG9yOiBibHVlOyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XHJcbiAgICAgICAgPGtlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4gKm5nSWY9XCJkYXRhLkVuYWJsZUdyaWRDb21tYW5kXCIgd2lkdGg9XCIxODBcIiBbY29sdW1uTWVudV09XCJmYWxzZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlOFwiIGNsYXNzPVwiZTF0YWctc3R5bGU4XCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlIGxldC1pc05ldz1cImlzTmV3XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkU2F2ZUNvbW1hbmQ+XHJcbiAgICAgICAgICAgICAge3sgaXNOZXcgPyAnU2F2ZScgOiAnVXBkYXRlJyB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBrZW5kb0dyaWRDYW5jZWxDb21tYW5kIFtwcmltYXJ5XT1cInRydWVcIj5cclxuICAgICAgICAgICAgICB7eyBpc05ldyA/ICdEaXNjYXJkIGNoYW5nZXMnIDogJ0NhbmNlbCcgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkRWRpdENvbW1hbmQ+XHJcbiAgICAgICAgICAgICAge3sgXCJFZGl0XCIgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkUmVtb3ZlQ29tbWFuZD5cclxuICAgICAgICAgICAgICB7eyBcIlJlbW92ZVwiIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2tlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4+XHJcbiAgICAgICAgPGtlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4gKm5nSWY9XCJkYXRhLkVuYWJsZUN1c3RvbVJlbW92ZUNvbW1hbmRcIiB3aWR0aD1cIjE4MFwiIFtjb2x1bW5NZW51XT1cImZhbHNlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU4XCIgY2xhc3M9XCJlMXRhZy1zdHlsZThcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWlzTmV3PVwiaXNOZXdcIiBsZXQtZGF0YUl0ZW0gbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIga2VuZG9CdXR0b24gKGNsaWNrKT1cImdyaWRDdXN0b21SZW1vdmVDb21tYW5kKGRhdGFJdGVtLCByb3dJbmRleClcIiAqbmdJZj1cImRhdGEuRW5hYmxlQ3VzdG9tUmVtb3ZlQ29tbWFuZFwiPlxyXG4gICAgICAgICAgICAgIHt7IFwiUmVtb3ZlXCIgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwva2VuZG8tZ3JpZC1jb21tYW5kLWNvbHVtbj5cclxuICAgICAgICA8a2VuZG8tZ3JpZC1leGNlbCBmaWxlTmFtZT1cIkV4cG9ydC54bHN4XCIgW2ZldGNoRGF0YV09XCJhbGxSZXN1bHRzXCI+PC9rZW5kby1ncmlkLWV4Y2VsPlxyXG4gICAgICA8L2tlbmRvLWdyaWQ+XHJcbiAgICAgIDxhcHAtY29udGV4dC1tZW51IFtkYXRhXT1cImRhdGFcIiBbZ3JvdXBdPVwiZ3JvdXBcIiBbZm9ybV09XCJmb3JtXCIgI2RhdGFpdGVtY29udGV4dG1lbnU+PC9hcHAtY29udGV4dC1tZW51PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLSBmb3IgREVDIGF1dG8gc2Nyb2xsaW5nIC0tPlxyXG4gIDxkaXYgaWQ9XCJlbmQtb2YtZ3JpZFwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbiJdfQ==
|
|
1156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXFCLFNBQVMsRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsV0FBVyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUYsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JELE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHbkUsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRXBGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBR3JGLE9BQU8sRUFFRyxNQUFNLEVBQWMsZ0JBQWdCLEVBQzhCLFNBQVMsRUFDcEYsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUMsRUFBRTtvQkFDdEMsT0FBTyxVQUFVLENBQUM7aUJBQ25CO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2Q7Z0JBQ0UsT0FBTyxHQUFHLENBQUM7U0FDZDtJQUNILENBQUM7SUFDRCxZQUFZO0lBRVosc0NBQXNDO0lBQ3RDLElBQVcsWUFBWSxDQUFDLFFBQWdCO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFXLFlBQVksQ0FBQyxLQUFZO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDOzsyR0E1eENVLGNBQWM7K0ZBQWQsY0FBYyw2RkFDZCxnQkFBZ0IsbUZBQ2hCLHlCQUF5QixxRkM3RHRDLHNvM0JBOFlBLHk2dkNEeFZjO1FBQ1YsNEJBQTRCO0tBQzdCOzJGQUdVLGNBQWM7a0JBVDFCLFNBQVM7K0JBQ0UsV0FBVyxjQUdUO3dCQUNWLDRCQUE0QjtxQkFDN0I7NmZBSW1DLFVBQVU7c0JBQTdDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUM2QixnQkFBZ0I7c0JBQXZFLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBWaWV3Q2hpbGQsIEFmdGVyVmlld0NoZWNrZWQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBkZWxheSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHRhcCwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRXhjZWxFeHBvcnREYXRhIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZXhjZWwtZXhwb3J0JztcclxuaW1wb3J0IHsgR3JpZEl0ZW0sIFNlbGVjdGFibGVTZXR0aW5ncywgU2VsZWN0aW9uRXZlbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkJztcclxuaW1wb3J0IHsgU29ydERlc2NyaXB0b3IsIFN0YXRlLCBwcm9jZXNzIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1kYXRhLXF1ZXJ5XCI7XHJcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci10b29sdGlwJztcclxuaW1wb3J0IHsgR3JpZERhdGFSZXN1bHQsIERhdGFTdGF0ZUNoYW5nZUV2ZW50LCBQYWdlQ2hhbmdlRXZlbnQsIENlbGxDbGlja0V2ZW50LCBHcmlkQ29tcG9uZW50LCBSb3dBcmdzIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWRcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGF0YUxpc3RpbmdGaWVsZEJhc2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9kYXRhbGlzdGluZ2ZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGhpZGVBbmRTaG93VmVydGljYWxBbmltYXRpb24gfSBmcm9tIFwiLi4vYW5pbWF0aW9ucy9jb21wb25lbnQtYW5pbWF0aW9uc1wiO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb25zdGFudCB9IGZyb20gXCIuLi9jb25zdGFudHMvY29uc3RhbnRcIjtcclxuaW1wb3J0IHsgTWFpblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvbWFpbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRDb250YWluZXJEaXJlY3RpdmUgfSBmcm9tIFwiLi4vZGlyZWN0aXZlcy9lbGVtZW50Y29udGFpbmVyLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgfSBmcm9tIFwiLi96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBaR3JpZFNlcnZpY2UgfSBmcm9tIFwiLi96Z3JpZC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgV2ViQXBpU2VydmljZSwgVG9hc3RTZXJ2aWNlLFxyXG4gIFpGaWVsZCwgWkdyb3VwLCBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpDb3JlU2VydmljZSwgU3RvcmFnZVNlc3Npb25TZXJ2aWNlLCBGb250QXdlU29tZVNlcnZpY2UsXHJcbiAgWkdyaWRQb3N0QXBpUGFyYW1zLCBaR3JpZFNldHRpbmdzLCBaR3JpZEN1c3RvbUNvbHVtbiwgUmVzb3VyY2VBcGlTZXJ2aWNlLCBTdGF0ZVR5cGUsIFN0YXRlU2V0dGluZ0luZm8sIEF1dGhTZXJ2aWNlLCBTdGF0ZVNldHRpbmdTZXJ2aWNlXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgWkdyaWQge1xyXG4gIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gIHN0YXRlOiBTdGF0ZTtcclxuICBjb2x1bW5zOiBhbnlbXTtcclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybDogc3RyaW5nO1xyXG4gIGRhdGE6IFpGaWVsZDtcclxuICBncm91cDogWkdyb3VwO1xyXG4gIHpncmlkOiBaR3JpZEJpbmRpbmdEaXJlY3RpdmU7XHJcbiAgaW5saW5lRWRpdGVkRm9ybUdyb3VwczogRm9ybUdyb3VwO1xyXG4gIGdldEdyaWREYXRhOiAoKSA9PiBhbnlbXTtcclxuICBnZXREYXRhOiAoKSA9PiB2b2lkO1xyXG4gIGNsZWFyRGF0YTogKCkgPT4gdm9pZDtcclxuICBzZXREYXRhOiAoZGF0YTogYW55KSA9PiB2b2lkO1xyXG4gIHNldENvbHVtbnM6IChjb2x1bW5GaWVsZHNOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikgPT4gdm9pZDtcclxuICAkc2V0Q29sdW1uczogKGNvbHVtbkZpZWxkc05hbWU6IHN0cmluZywgY29sdW1uczogQXJyYXk8WkdyaWRDdXN0b21Db2x1bW4+KSA9PiBPYnNlcnZhYmxlPGFueT47XHJcbiAgZ2V0Rm9ybUNvbnRyb2xEYXRhKCk6IGFueVtdO1xyXG59XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXpncmlkXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96Z3JpZC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96Z3JpZC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICBoaWRlQW5kU2hvd1ZlcnRpY2FsQW5pbWF0aW9uXHJcbiAgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFpncmlkQ29tcG9uZW50IGV4dGVuZHMgRGF0YUxpc3RpbmdGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZChUb29sdGlwRGlyZWN0aXZlKSBwdWJsaWMgdG9vbHRpcERpcjogVG9vbHRpcERpcmVjdGl2ZTtcclxuICBAVmlld0NoaWxkKEVsZW1lbnRDb250YWluZXJEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGVsZW1lbnRDb250YWluZXIhOiBFbGVtZW50Q29udGFpbmVyRGlyZWN0aXZlO1xyXG4gIC8vIEBWaWV3Q2hpbGQoWkdyaWRCaW5kaW5nRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UgfSkgemdyaWQ6IFpHcmlkQmluZGluZ0RpcmVjdGl2ZTtcclxuXHJcbiAgemdyaWQ6IGFueSA9IG51bGw7XHJcbiAgb2F1dGhVcmw6IHN0cmluZyA9IG51bGw7XHJcbiAgZ3JpZERhdGE6IEdyaWREYXRhUmVzdWx0O1xyXG4gIHNlbGVjdGFibGVTZXR0aW5nczogU2VsZWN0YWJsZVNldHRpbmdzO1xyXG4gIHJvd1NlbGVjdGlvbjogc3RyaW5nW10gPSBbXTtcclxuICBteVNlbGVjdGlvbiA9IG5ldyBNYXAoKTtcclxuICBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzID0ge307XHJcbiAgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwOyAvLyBmb3Iga2VuZG8gZ3JpZCBidWlsdC1pblxyXG4gIHB1YmxpYyBwcmV2aW91c05leHQ6IGJvb2xlYW47XHJcbiAgcHVibGljIGdyaWRCdG47XHJcbiAgcHVibGljIHBhZ2VhYmxlOiBhbnkgPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyR3JvdXAgPSBuZXcgWkdyb3VwKCk7XHJcbiAgcHVibGljIGFkdmZpbHRlckdyb3VwID0gbmV3IFpHcm91cCgpO1xyXG4gIHB1YmxpYyBpc1Nob3dBZHZGaWx0ZXIgPSBmYWxzZTtcclxuICBwdWJsaWMgZ3JpZFRpdGxlOiBhbnk7XHJcbiAgcHVibGljIGlzSW5saW5lRWRpdElucHV0RmllbGRMb2FkaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0ZW1wSW5saW5lRWRpdGVkRm9ybUdyb3VwcztcclxuICBwcml2YXRlIGlzQ29sdW1uSGVhZGVyVHJhbnNsYXRlZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93UmVzdG9yZUdyaWRTZXR0aW5nQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNoZWNrYm94Q29sdW1uUGlubmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICBwYXJhbXM6IFpHcmlkUG9zdEFwaVBhcmFtcyA9IHtcclxuICAgIHJlZmVySWQ6IG51bGwsXHJcbiAgICBwYWdlTm86IDAsXHJcbiAgICBwYWdlU2l6ZTogMjAsXHJcbiAgICBzb3J0Q29sdW1uTmFtZTogXCJcIixcclxuICAgIHNvcnRPcmRlcjogXCJcIixcclxuICAgIHNvcnRDb2x1bW5OYW1lczogW10sXHJcbiAgICBzb3J0T3JkZXJzOiBbXSxcclxuICAgIGZpbHRlclBhcmFtczogW10sXHJcbiAgICBwYXJhbWV0ZXJzOiBcIlwiLFxyXG4gICAgZmlsdGVyczogXCJcIixcclxuICAgIGNvbHVtbnM6IFwiXCIsXHJcbiAgICBncmFudFR5cGU6IDRcclxuICB9O1xyXG5cclxuICBncmlkU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICBjb2x1bW5zOiBhbnlbXTtcclxuICBnZW5lcmF0ZUhpZGRlbkNvbHVtbnNGaWVsZDogYW55W107XHJcbiAgZWRpdGFibGVDb2x1bW5zOiBhbnlbXTtcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwYWdlU2l6ZXM6IGJvb2xlYW4gfCBhbnlbXTtcclxuICBncmlkU3RvcmFnZUtleTogc3RyaW5nO1xyXG4gIGdyaWREZWZhdWx0U3RhdGVFeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTmV3OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGVkaXRlZFJvd0luZGV4OiBudW1iZXI7XHJcbiAgcHVibGljIGdyaWRTZXR0aW5nOiBaR3JpZFNldHRpbmdzO1xyXG4gIHByaXZhdGUgZW52aXJvbm1lbnQ6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZm9udEF3ZVNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpjb3JlU2VydmljZTogWkNvcmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYWluU2VydmljZTogTWFpblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBaR3JpZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0YXRlU2V0dGluZ1NlcnZpY2U6IFN0YXRlU2V0dGluZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlc291cmNlQXBpU2VydmljZTogUmVzb3VyY2VBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpO1xyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCk7XHJcbiAgICB0aGlzLm9hdXRoVXJsID0gdGhpcy5lbnZpcm9ubWVudC5lMU9hdXRoVXJsICsgXCIvXCI7XHJcbiAgICB0aGlzLmFsbFJlc3VsdHMgPSB0aGlzLmFsbFJlc3VsdHMuYmluZCh0aGlzKTtcclxuICAgIHRoaXMucmVmcmVzaERhdGEgPSB0aGlzLnJlZnJlc2hEYXRhLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLmNsZWFyRGF0YSA9IHRoaXMuY2xlYXJEYXRhLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLnNldHVwSW5uZXJGaWVsZCgpO1xyXG4gICAgdGhpcy5zZXR1cEZpbHRlckZlYXR1cmUoKTtcclxuICAgIHRoaXMuc2V0dXBHcmlkQnV0dG9ucygpO1xyXG4gICAgdGhpcy5zZXR1cEdyaWRDb21wb25lbnRBdHRyaWJ1dGVzKCk7XHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nID0geyBncmlkU3RhdGU6IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0dXBHcmlkU2V0dGluZyh0aGlzLmRhdGEpIH07XHJcblxyXG4gICAgdGhpcy5zZXR1cFN1YnNjcmlwdGlvbkZvckdyaWRTdWJqZWN0KCk7XHJcblxyXG4gICAgc3VwZXIudHJhbnNsYXRlVG9vbEJhckl0ZW1zKCkucGlwZSh0YXAoKCkgPT4ge1xyXG4gICAgICB0aGlzLmdyaWRDYWxsYmFjayh0aGlzLmdyb3VwKTtcclxuICAgIH0pKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWNyZW1lbnRDb21wb25lbnRDb3VudGVyRm9yRmllbGQodGhpcy5kYXRhKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcclxuICAgIGNvbnN0IGlzQmFja05hdmlnYXRlZCA9IChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwibmF2aWdhdGVkUmVsb2FkR3JpZFwiKSA9PT0gJ3RydWUnKTtcclxuICAgIHRoaXMuc2hvd0hpZGVSZXN0b3JlR3JpZFNldHRpbmdCdXR0b24oKTtcclxuXHJcbiAgICBpZiAoaXNCYWNrTmF2aWdhdGVkKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1VzZUxvY2FsRGF0YSgpKSB7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldChcIm5hdmlnYXRlZFJlbG9hZEdyaWRcIiwgSlNPTi5zdHJpbmdpZnkoZmFsc2UpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR3JpZCBTdGF0ZSAocGFnaW5hdGlvbiwgc29ydGFibGUsIGZpbHRlciwgb3JkZXJpbmcpXHJcbiAgcHVibGljIGRhdGFTdGF0ZUNoYW5nZShzdGF0ZTogRGF0YVN0YXRlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc1VzZUxvY2FsRGF0YSgpKSB7XHJcbiAgICAgIHRoaXMuemdyaWQuZGF0YVN0YXRlQ2hhbmdlKHN0YXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJhYmxlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc29ydGFibGUodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2NrZWQoY29sU2V0dGluZzogYW55KSB7XHJcbiAgICBpZiAoY29sU2V0dGluZ1sncGlubmVkTGVmdCddID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwdWJsaWMgb25FeGNlbEV4cG9ydChlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbFJlcXVpcmVkRm9ybWF0ID0gW107XHJcblxyXG4gICAgLy8gQ29sbGVjdCBjb2x1bW5zIHRoYXQgaGF2ZSBhIHNwZWNpZmljIEV4Y2VsIGNlbGwgZm9ybWF0XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBpZiAoY29sLkV4Y2VsQ2VsbEZvcm1hdCkge1xyXG4gICAgICAgIGNvbFJlcXVpcmVkRm9ybWF0LnB1c2goeyBjb2xOYW1lOiBjb2wuRGlzcGxheU5hbWUgPz8gY29sLk5hbWUsIGNlbGxGb3JtYXQ6IGNvbC5FeGNlbENlbGxGb3JtYXQsIGNvbEluZGV4OiBudWxsIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoY29sUmVxdWlyZWRGb3JtYXQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBlLndvcmtib29rLnNoZWV0c1swXS5yb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgaWYgKHJvdy50eXBlID09PSAnaGVhZGVyJykge1xyXG4gICAgICAgIC8vIENoZWNrIGhlYWRlciBjZWxscyB0byBmaW5kIG1hdGNoaW5nIGNvbHVtbiBuYW1lcyBhbmQgc3RvcmUgdGhlaXIgaW5kZXhcclxuICAgICAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIGNvbFJlcXVpcmVkRm9ybWF0LmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKGNlbGwudmFsdWUgPT09IGNvbC5jb2xOYW1lKSB7XHJcbiAgICAgICAgICAgICAgY29sLmNvbEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJvdy50eXBlID09PSAnZGF0YScpIHtcclxuICAgICAgICAvLyBBcHBseSB0aGUgZm9ybWF0IHRvIGNlbGxzIGluIGRhdGEgcm93cyBpZiB0aGVpciBpbmRleCBtYXRjaGVzXHJcbiAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGwsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBjb2xSZXF1aXJlZEZvcm1hdC5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gY29sLmNvbEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgY2VsbC5mb3JtYXQgPSBjb2wuY2VsbEZvcm1hdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIEdyaWQgQ29sdW1uc1xyXG4gIHB1YmxpYyBpc1NlbGVjdE9wdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykge1xyXG4gICAgICB0aGlzLnNlbGVjdGFibGVTZXR0aW5ncyA9IHtcclxuICAgICAgICBjaGVja2JveE9ubHk6IGZhbHNlLFxyXG4gICAgICAgIG1vZGU6ICh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucz8udG9Mb3dlckNhc2UoKSA9PT0gXCJtdWx0aXBsZVwiKSA/IFwibXVsdGlwbGVcIiA6IFwic2luZ2xlXCJcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q29sdW1ucyhjb2x1bW5OYW1lOiBzdHJpbmcsIGNvbHVtbnM6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikge1xyXG4gICAgdGhpcy5ncm91cFtjb2x1bW5OYW1lXSA9IHRoaXMud3JhcENvbHVtbk5hbWVzSW5GaWVsZEVsZW1lbnQoY29sdW1ucyk7XHJcbiAgICB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyAkc2V0Q29sdW1ucyhjb2x1bW5OYW1lOiBzdHJpbmcsIGNvbHVtbnM6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICB0aGlzLmdyb3VwW2NvbHVtbk5hbWVdID0gdGhpcy53cmFwQ29sdW1uTmFtZXNJbkZpZWxkRWxlbWVudChjb2x1bW5zKTtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd3JhcENvbHVtbk5hbWVzSW5GaWVsZEVsZW1lbnQoY29sdW1uTGlzdDogQXJyYXk8WkdyaWRDdXN0b21Db2x1bW4+KSB7XHJcbiAgICByZXR1cm4gb2YoY29sdW1uTGlzdC5tYXAoYyA9PiB7XHJcbiAgICAgIGNvbnN0IGlzSGlkZGVuOiBib29sZWFuID0gYy5IaWRkZW47XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgTmFtZTogYy5OYW1lLFxyXG4gICAgICAgIFZhbHVlOiBjLkNvZGUsXHJcbiAgICAgICAgVHlwZTogYy5UeXBlLFxyXG4gICAgICAgIGdyaWRDb2xWaXNpYmxlOiAhaXNIaWRkZW4sXHJcbiAgICAgICAgRW5hYmxlR3JpZFZhbHVlOiBjLkVuYWJsZUdyaWRWYWx1ZSB8fCBmYWxzZSxcclxuICAgICAgICB3aWR0aDogMTAwICsgYy5OYW1lLmxlbmd0aCAqIDQsXHJcbiAgICAgICAgZW5hYmxlRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVTb3J0aW5nOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZVBpbm5pbmc6IHRydWUsXHJcbiAgICAgICAgRGl2Q2xhc3M6IFwiY29sLXhzLTEyIGNvbC1zbS02XCIsXHJcbiAgICAgICAgSXNFZGl0YWJsZUluR3JpZDogYy5FZGl0YWJsZVxyXG4gICAgICB9O1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUdyaWRDb2x1bW5zKGdyaWRTZXR0aW5nPzogWkdyaWRTZXR0aW5ncyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBjb2x1bW5GaWVsZHMkOiBPYnNlcnZhYmxlPGFueT4gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgIHRoaXMuZGF0YS5Db2x1bW5GaWVsZHMsXHJcbiAgICAgIHRoaXMuZ3JvdXBcclxuICAgICkgfHwgb2YoW10pO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhLkNvbHVtbkZpZWxkcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQvRW1wdHkgZ3JpZCgnICsgdGhpcy5kYXRhLk5hbWUgKyAnKSBjb2x1bW5GaWVsZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29sdW1uRmllbGRzJCkge1xyXG4gICAgICBjb25zb2xlLmxvZygnRmFpbCB0byBnZW5lcmF0ZSBncmlkIGNvbHVtbiBmaWVsZHMuJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZGF0YS5Db2x1bW5GaWVsZHMpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sdW1uRmllbGRzJC5waXBlKFxyXG4gICAgICB0YXAoY29sdW1uRmllbGQgPT4ge1xyXG4gICAgICAgIGlmICghY29sdW1uRmllbGQpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZC9FbXB0eSBncmlkKCcgKyB0aGlzLmRhdGEuTmFtZSArICcpIGRhdGEgdG8gZ2VuZXJhdGUgY29sdW1uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XHJcbiAgICAgICAgICBjb25zdCBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgPSBbXTtcclxuXHJcbiAgICAgICAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKHtcclxuICAgICAgICAgICAgY29sdW1uRmllbGQ6IGNvbHVtbkZpZWxkLFxyXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXHJcbiAgICAgICAgICAgIGdyb3VwOiB0aGlzLmdyb3VwLFxyXG4gICAgICAgICAgICBjb2x1bW5Db25maWd1cmF0aW9uczogZ3JpZFNldHRpbmc/LmNvbHVtbkNvbmZpZ3VyYXRpb25zLFxyXG4gICAgICAgICAgICBnZW5lcmF0ZUhpZGRlbkNvbHVtbnM6IGdlbmVyYXRlSGlkZGVuQ29sdW1ucyxcclxuICAgICAgICAgICAgZ3JpZEF0dHJpYnV0ZXM6IHRoaXMuZGF0YVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKGdlbmVyYXRlSGlkZGVuQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVIaWRkZW5Db2x1bW5zRmllbGQgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVIaWRkZW5Db2x1bW5zRmllbGQgPSBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMubWFwKGZpZWxkID0+ICh7IGZpZWxkOiBmaWVsZCwgVmlzaWJsZTogdHJ1ZSwgSXNSZXF1aXJlZDogZmFsc2UsIFZhbHVlOiBmaWVsZCB9KSk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZ2VuZXJhdGVIaWRkZW5Db2x1bW5zRmllbGQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlSGlkZGVuQ29sdW1uc0ZpZWxkLnB1c2goZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gc3VwZXIudHJhbnNsYXRlQ29sdW1uSGVhZGVyKHRoaXMuY29sdW1ucyk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0SWNvbk5hbWUoZ3JpZENlbGxSZXBsYWNlVmFsdWU6IGFueSwgdmFsdWU6IGFueSkge1xyXG4gICAgaWYgKGdyaWRDZWxsUmVwbGFjZVZhbHVlICYmIGdyaWRDZWxsUmVwbGFjZVZhbHVlW3ZhbHVlXSkge1xyXG4gICAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRGb250QXdlc29tZShncmlkQ2VsbFJlcGxhY2VWYWx1ZVt2YWx1ZV0sIHRoaXMuZm9udEF3ZVNvbWVTZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gZ3JpZCBzdHlsaW5nXHJcbiAgcHVibGljIGNlbGxTdHlsZUNvbmRpdGlvbihjb2wsIGNvbFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChjb2xbJ0NlbGxTdHlsZUNvbmRpdGlvbiddKSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvbkhpZ2hsaWdodGNvbDogW10gPSBjb2xbJ0NlbGxTdHlsZUNvbmRpdGlvbiddO1xyXG4gICAgICBsZXQgY29uZGl0aW9uUmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgICBjb25kaXRpb25IaWdobGlnaHRjb2wuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICBpZiAoIWNvbmRpdGlvblJlc3VsdCkge1xyXG4gICAgICAgICAgaWYgKGRhdGFbJ1ZhbHVlJ10gPT0gY29sVmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGNvbmRpdGlvblJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDZWxsU3R5bGVDb25kaXRpb24oY29sLCBjb2xWYWx1ZTogYW55KSB7XHJcbiAgICBpZiAoY29sWydDZWxsU3R5bGVDb25kaXRpb24nXSkge1xyXG4gICAgICBjb25zdCBjb25kaXRpb25IaWdobGlnaHRjb2w6IFtdID0gY29sWydDZWxsU3R5bGVDb25kaXRpb24nXTtcclxuICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9ICcnO1xyXG5cclxuICAgICAgY29uZGl0aW9uSGlnaGxpZ2h0Y29sLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGFbJ1ZhbHVlJ10gPT0gY29sVmFsdWUpIHtcclxuICAgICAgICAgIGlmIChkYXRhWydCYWNrZ3JvdW5kQ29sb3InXSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSAnYmFja2dyb3VuZC1jb2xvcjonICsgZGF0YVsnQmFja2dyb3VuZENvbG9yJ10gKyAnOyc7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFbJ0NvbG9yJ10pIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ICs9ICdjb2xvcjonICsgZGF0YVsnQ29sb3InXSArICc7JztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZGF0YVsnU3R5bGVFeHByZXNzaW9uJ10pIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ICs9IGRhdGFbJ1N0eWxlRXhwcmVzc2lvbiddO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gY29uZGl0aW9uUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIE9uY2VsbCBjbGljayBoYW5kbGluZ1xyXG4gIC8vIDEuIGluQ2VsbCBFZGl0XHJcbiAgLy8gMi4gT25JdGVtQ2xpY2tcclxuICAvLyAzLiBOYXZpZ2F0ZSB0byBGb3JtIFBhZ2VcclxuICAvLyA0LiBTaG93IEZvcm0gUGFnZSBpbiB0aGUgc2FtZSBwYWdlIChERUMgYW5kIERyYXdlcilcclxuICBwdWJsaWMgY2VsbENsaWNrSGFuZGxlcihldmVudDogQ2VsbENsaWNrRXZlbnQpIHtcclxuICAgIC8vIFJpZ2h0IGNsaWNrIGhhbmRsZXJcclxuICAgIGlmIChldmVudC50eXBlID09PSBcImNvbnRleHRtZW51XCIpIHtcclxuICAgICAgdGhpcy5kYXRhSXRlbUNvbnRleHRNZW51LnNob3dDb250ZXh0TWVudU1hbnVhbGx5KGV2ZW50LCBldmVudC5kYXRhSXRlbSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaXNhYmxlQWxsQ29sdW1uQ2VsbENsaWNrSGFuZGxlciA9IHRoaXMuZGF0YS5EaXNhYmxlQ2VsbENsaWNrSGFuZGxlciA/IHRoaXMuZGF0YS5EaXNhYmxlQ2VsbENsaWNrSGFuZGxlciA6IGZhbHNlO1xyXG4gICAgY29uc3QgaXNDb21tYW5kQ29sdW1uID0gZXZlbnQuY29sdW1uLmNvbnN0cnVjdG9yLm5hbWUgPT0gJ0NvbW1hbmRDb2x1bW5Db21wb25lbnQnID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLnRvb2x0aXBEaXIpIHtcclxuICAgICAgdGhpcy50b29sdGlwRGlyLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWRpc2FibGVBbGxDb2x1bW5DZWxsQ2xpY2tIYW5kbGVyICYmICFpc0NvbW1hbmRDb2x1bW4pIHtcclxuICAgICAgY29uc3QgaW5DZWxsRWRpdGFibGUgPSB0aGlzLmRhdGEuSW5DZWxsRWRpdGFibGUgPyB0aGlzLmRhdGEuSW5DZWxsRWRpdGFibGUgOiBmYWxzZTtcclxuICAgICAgaWYgKGluQ2VsbEVkaXRhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKHMgPT4gcy5pc0VkaXRhYmxlSW5EYXRhSXRlbSA9PT0gdHJ1ZSk7XHJcbiAgICAgICAgaWYgKCEhdGhpcy5lZGl0YWJsZUNvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zLm1hcChzID0+IGV2ZW50LnNlbmRlci5lZGl0Q2VsbChldmVudC5yb3dJbmRleCwgZXZlbnQuY29sdW1uSW5kZXgsIHRoaXMuY3JlYXRlRm9ybUdyb3VwKGV2ZW50LmRhdGFJdGVtLCBzLmZpZWxkKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImNlbGxDbGljayBldmVudDogXCIsIGV2ZW50KTtcclxuICAgICAgICAvL3RoaXMuY2FjaGVTZXJ2aWNlLnNldCgnbGFzdENsaWNrZWRHcmlkUmVjb3JkJywgZXZlbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kYXRhLk9uSXRlbUNsaWNrKSB7XHJcbiAgICAgICAgICBjb25zdCBmdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5Pbkl0ZW1DbGljayk7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbEZ1bmMgPSBmdW5jLmJpbmQodGhpcy5ncm91cC5jdHJsU2NvcGUpO1xyXG4gICAgICAgICAgICBjYWxsRnVuYyhldmVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gc3RvcmUgY2xpY2tlZCBpZCBhbmQgYWN0aW9uIGFzIGVkaXQgdG8gdGhlIHNlc3Npb24gc3RvcmFnZVxyXG4gICAgICAgICAgLy8gT25JdGVtQ2xpY2ssIHByb2plY3QgaGF2ZSB0byBzZXQgdGhlbXNlbGYuXHJcbiAgICAgICAgICB0aGlzLm1haW5TZXJ2aWNlLnNldE5hdmlnYXRpb25QYXJhbXMoW2V2ZW50LmRhdGFJdGVtLklkLCAnZWRpdCddKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWRpdE1vZGVsKGV2ZW50LmRhdGFJdGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRDZWxsQ2xvc2VIYW5kbGVyKGFyZ3M6IGFueSkge1xyXG4gICAgY29uc3QgeyBmb3JtR3JvdXAsIGRhdGFJdGVtIH0gPSBhcmdzO1xyXG4gICAgaWYgKCFmb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgYXJncy5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfSBlbHNlIGlmIChmb3JtR3JvdXAuZGlydHkpIHtcclxuICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKHMgPT4gcy5pc0VkaXRhYmxlSW5EYXRhSXRlbSA9PT0gdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zLm1hcChzID0+XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkYXRhSXRlbSwgeyBbcy5maWVsZF06IGZvcm1Hcm91cC52YWx1ZVtzLmZpZWxkXSB9KSk7XHJcbiAgICAgIC8vIHRoaXMubXlTZWxlY3Rpb24ubWFwKHMgPT4gKHMuSWQgPT09IGRhdGFJdGVtLklkKSA/IE9iamVjdC5hc3NpZ24ocywgZGF0YUl0ZW0pIDogbnVsbCk7XHJcblxyXG4gICAgICAvLyBJbml0aWFsaXplIG15U2VsZWN0aW9uIGlmIGl0J3MgdW5kZWZpbmVkXHJcbiAgICAgIGlmICghdGhpcy5teVNlbGVjdGlvbikge1xyXG4gICAgICAgIHRoaXMubXlTZWxlY3Rpb24gPSBuZXcgTWFwKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubXlTZWxlY3Rpb24uZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgIGlmICh2YWx1ZS5JZCA9PT0gZGF0YUl0ZW0uSWQpIHtcclxuICAgICAgICAgIHRoaXMubXlTZWxlY3Rpb24uc2V0KGtleSwgeyAuLi52YWx1ZSwgLi4uZGF0YUl0ZW0gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk5hdmlnYXRlVG8oZXZlbnQ6IGFueSwgY2xpY2tBY3Rpb246IGFueSwgcm93RGF0YTogYW55LCBjZWxsRGF0YTogc3RyaW5nKSB7XHJcbiAgICAvLyBjb25zdCBuID0gY29sU2V0dGluZy5uYXZpZ2F0ZVRvLnJlcGxhY2UoJy86aWQnLCBjZWxsRGF0YSk7XHJcbiAgICBjb25zdCBuID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGNsaWNrQWN0aW9uLkNsaWNrKTtcclxuICAgIGlmIChuKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogJ3pncmlkLW9uTmF2aWdhdGVUbycsXHJcbiAgICAgICAgdGFyZ2V0OiBjbGlja0FjdGlvbi5DbGljayxcclxuICAgICAgICByb3dEYXRhOiByb3dEYXRhLFxyXG4gICAgICAgIGRhdGE6IGNlbGxEYXRhXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZWRpdE1vZGVsKGRhdGFJdGVtOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuRWRpdENsaWNrVVJMKSB7XHJcbiAgICAgIC8vIEVkaXQgaW5jZWxsIGZpZWxkXHJcbiAgICAgIGNvbnN0IGNvbEZpZWxkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuQ29sdW1uRmllbGRzLCB0aGlzLmdyb3VwKTtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiemdyaWQtY2VsbENsaWNrXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuRWRpdENsaWNrVVJMLFxyXG4gICAgICAgIGRhdGE6IGRhdGFJdGVtLFxyXG4gICAgICAgIGNvbHVtbkZpZWxkcyQ6IGNvbEZpZWxkc1xyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmRhdGFbJ0NvbnRhaW5lckZvcm0nXSkge1xyXG4gICAgICB0aGlzLnNob3dGb3JtUGFnZS5lbWl0KHRydWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmdyb3VwLmVkaXRNb2RlbFVSTF0sIHtcclxuICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIC8vc2tpcExvY2F0aW9uQ2hhbmdlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vLy8gV2hlbiBjbGlja2VkIHJvdXRlIHRvIHBhZ2VcclxuICAgICAgLy90aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5ncm91cC5lZGl0TW9kZWxVUkwsIGRhdGFJdGVtLklkLCAnZWRpdCddLCB7XHJcbiAgICAgIC8vICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlXHJcbiAgICAgIC8vfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25CdG5DbGljayhldmVudDogYW55LCBjb2xTZXR0aW5nOiBhbnksIHJvd0RhdGE6IGFueSwgY2VsbERhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5vbk5hdmlnYXRlVG8oZXZlbnQsIGNvbFNldHRpbmcsIHJvd0RhdGEsIGNlbGxEYXRhKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRm9ybUdyb3VwKGRhdGFJdGVtOiBhbnksIGZpZWxkTmFtZTogYW55KTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgW2ZpZWxkTmFtZV06IGRhdGFJdGVtW2ZpZWxkTmFtZV1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEhlbHBlciBmdW5jdGlvbnNcclxuICBwdWJsaWMgZ2V0Q2xhc3MoZGF0YUl0ZW06IGFueSwgY29sOiBhbnkpIHtcclxuICAgIGxldCBuZ0NsYXNzID0gXCJncmlkQ2VsbCBcIjtcclxuICAgIGlmIChjb2wuZmllbGRUeXBlID09PSAnbnVtYmVyJyB8fCBjb2wuZmllbGRUeXBlID09PSAnY3VycmVuY3knIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6bnVtZXJpYycpIHtcclxuICAgICAgbmdDbGFzcyArPSBcInJpZ2h0QWxpZ25lZCBcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YUl0ZW1bY29sLmZpZWxkICsgJ19DbGFzcyddKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gZGF0YUl0ZW1bY29sLmZpZWxkICsgJ19DbGFzcyddICsgXCIgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbC5DbGFzcykge1xyXG4gICAgICBuZ0NsYXNzICs9IGNvbC5DbGFzcyArIFwiIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2wuUG9wT3ZlckNvbnRlbnQpIHtcclxuICAgICAgbmdDbGFzcyArPSBcIiB3aXRoUG9wb3ZlckluR3JpZFwiO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZ0NsYXNzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm1hdChjb2w6IGFueSwgZGVmYXVsdEZvcm1hdD86IGFueSkge1xyXG4gICAgbGV0IGZvcm1hdCA9IFwiXCI7XHJcbiAgICBpZiAoY29sLkZvcm1hdE9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3JtYXQgPSBkZWZhdWx0Rm9ybWF0ID8gZGVmYXVsdEZvcm1hdCA6IFwiXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBmb3JtYXRBcnIgPSBjb2wuRm9ybWF0T3B0aW9ucy5zcGxpdChcIi5cIilcclxuICAgICAgbGV0IGRwID0gMDtcclxuXHJcbiAgICAgIGlmIChmb3JtYXRBcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGRwID0gZm9ybWF0QXJyWzFdLmxlbmd0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRwICE9PSAwKSB7XHJcbiAgICAgICAgZm9ybWF0ID0gXCIxLlwiICsgZHAgKyBcIi1cIiArIGRwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFsbFJlc3VsdHMoKTogT2JzZXJ2YWJsZTxFeGNlbEV4cG9ydERhdGE+IHtcclxuICAgIGNvbnN0IGdyaWRDb250cm9sID0gdGhpcy56Z3JpZCBhcyBaR3JpZDtcclxuICAgIGNvbnN0IGdyaWRDb21wb25lbnQgPSB0aGlzLnpncmlkLmdyaWQgYXMgR3JpZENvbXBvbmVudDtcclxuICAgIGNvbnN0IGRhdGEgPSBncmlkQ29tcG9uZW50LmRhdGEgYXMgR3JpZERhdGFSZXN1bHQ7XHJcblxyXG4gICAgY29uc3QgcmVzb3VyY2VVUkxGb3JHZW5lcmF0ZURhdGEgPSB0aGlzLmRhdGEuRXhwb3J0RGF0YVJlc291cmNlVVJMID8gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKHRoaXMuZGF0YS5FeHBvcnREYXRhUmVzb3VyY2VVUkwpIDogZ3JpZENvbnRyb2wucGFnaW5hdGlvbkFwaVBvc3RVcmw7XHJcblxyXG4gICAgLy8gTmVlZCB0byBjbG9uZSwgaWYgbm90IHdpbGwgYWZmZWN0IHRoZSBncmlkIHBhcmFtcy5cclxuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucGFyYW1zKTtcclxuICAgIHBhcmFtcy5wYWdlTm8gPSAwO1xyXG4gICAgcGFyYW1zLnBhZ2VTaXplID0gZGF0YS50b3RhbDtcclxuXHJcbiAgICBjb25zdCBkYXRlVGltZVJlZ2V4ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSg/OltUXFxzXVxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsN30pPyg/Olp8W1xcK1xcLV1cXGR7Mn06XFxkezJ9KT8pPyQvO1xyXG5cclxuICAgIC8vIEZ1bmN0aW9uIHRvIGNvbnZlcnQgZGF0ZSBzdHJpbmdzIHRvIERhdGUgb2JqZWN0c1xyXG4gICAgY29uc3QgY29udmVydERhdGVTdHJpbmdzVG9EYXRlcyA9IChpdGVtczogYW55W10pID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICBjb25zdCBuZXdJdGVtID0geyAuLi5pdGVtIH07XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3SXRlbSkge1xyXG4gICAgICAgICAgaWYgKG5ld0l0ZW0uaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ld0l0ZW1ba2V5XTtcclxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nIGFuZCBtYXRjaGVzIHRoZSBkYXRlVGltZVJlZ2V4IHBhdHRlcm5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgZGF0ZVRpbWVSZWdleC50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgIG5ld0l0ZW1ba2V5XSA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3SXRlbTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKHJlc291cmNlVVJMRm9yR2VuZXJhdGVEYXRhLCBwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gQ29udmVydCBkYXRlIHN0cmluZ3MgdG8gRGF0ZSBvYmplY3RzXHJcbiAgICAgICAgZGF0YS5kYXRhU2V0ID0gY29udmVydERhdGVTdHJpbmdzVG9EYXRlcyhkYXRhLmRhdGFTZXQpO1xyXG5cclxuICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXN1bHQgZm9yIEV4Y2VsIGV4cG9ydFxyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogRXhjZWxFeHBvcnREYXRhID0ge1xyXG4gICAgICAgICAgZGF0YTogcHJvY2VzcyhkYXRhLmRhdGFTZXQsIHt9KS5kYXRhXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaEdyaWQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgY29uc3QgX2dyaWRPcHRpb25TZWdtZW50ID0gZXZlbnQudGFyZ2V0LnRyaW0oKS5zcGxpdCgnLicpO1xyXG4gICAgY29uc3QgX2dyaWRPcHRpb24gPSBfZ3JpZE9wdGlvblNlZ21lbnRbMV07XHJcbiAgICBpZiAoX2dyaWRPcHRpb24pIHtcclxuICAgICAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbX2dyaWRPcHRpb25dIGFzIFpHcmlkO1xyXG4gICAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGZpbmQgZ3JpZCB2YWx1ZTogJyArIF9ncmlkT3B0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ0ludmFsaWQgcmVmcmVzaEdyaWQgZXZlbnQ6ICcsIGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoRGF0YSgpIHtcclxuICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRGF0YSgpIHtcclxuICAgIHRoaXMuemdyaWQuY2xlYXJEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1Rvb2x0aXAoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5Jc1Nob3dUb29sVGlwID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBlbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgbGV0IGlzQ29tbWFuZENvbHVtbiA9IGZhbHNlO1xyXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgaWYgKGRhdGEgPT0gJ2stY29tbWFuZC1jZWxsJykge1xyXG4gICAgICAgIGlzQ29tbWFuZENvbHVtbiA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghaXNDb21tYW5kQ29sdW1uICYmXHJcbiAgICAgIChcclxuICAgICAgICAoKGVsZW1lbnQubm9kZU5hbWUgPT09ICdURCcgfHwgZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1RIJykgJiYgZWxlbWVudC5vZmZzZXRXaWR0aCA8IChlbGVtZW50LnNjcm9sbFdpZHRoKSkgfHxcclxuICAgICAgICAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1NQQU4nICYmIGVsZW1lbnQuY2xhc3NMaXN0ICYmIGVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCA+IDAgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2dyaWQtY2VsbC1kYXRhJykgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoIDwgKGVsZW1lbnQucGFyZW50RWxlbWVudC5zY3JvbGxXaWR0aCkpKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcERpci50b2dnbGUoZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy50b29sdGlwRGlyLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3dTZWxlY3Rpb25LZXkgPSAoY29udGV4dDogUm93QXJncyk6IGFueSA9PiB7XHJcbiAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBrZXkgdXNpbmcgZWl0aGVyIHRoaXMuZGF0YS5VbmlxdWVLZXkgb3IgY29udGV4dC5kYXRhSXRlbS5JZC5cclxuICAgIGNvbnN0IGtleSA9ICh0aGlzLmRhdGEuVW5pcXVlS2V5ID8/IGNvbnRleHQuZGF0YUl0ZW0uSWQpOy8vICsgXCIgXCIgKyBjb250ZXh0LmluZGV4O1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuVW5pcXVlS2V5ICYmIGNvbnRleHQuZGF0YUl0ZW0uSWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignQSB1bmlxdWUgY29sdW1uIGZpZWxkIGlzIHJlcXVpcmVkLiBFbnN1cmUgZWl0aGVyIHRoZSBJZCBjb2x1bW4gaXMgcHJlc2VudCBvciB0aGUgVW5pcXVlS2V5IHByb3BlcnR5IGlzIHNldCBmb3IgemdyaWQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBteVNlbGVjdGlvbiBpZiBpdCdzIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLm15U2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMubXlTZWxlY3Rpb24gPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU3RvcmUgdGhlIGRhdGEgaXRlbSBpbiB0aGUgbXlTZWxlY3Rpb24gbWFwIHdpdGggdGhlIGdlbmVyYXRlZCBrZXkuXHJcbiAgICB0aGlzLm15U2VsZWN0aW9uLnNldChrZXksIGNvbnRleHQuZGF0YUl0ZW0pO1xyXG5cclxuICAgIC8vIFJldHVybiB0aGUgZ2VuZXJhdGVkIGtleS5cclxuICAgIHJldHVybiBrZXk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRWYWx1ZXMoKTogYW55IHtcclxuICAgIC8vIE1hcCBlYWNoIGtleSBpbiByb3dTZWxlY3Rpb24gdG8gaXRzIGNvcnJlc3BvbmRpbmcgZGF0YSBpdGVtIGluIHRoZSBteVNlbGVjdGlvbiBtYXAuXHJcbiAgICBjb25zdCBzZWxlY3RlZFJlY29yZCA9IHRoaXMucm93U2VsZWN0aW9uLm1hcChrZXkgPT4gdGhpcy5teVNlbGVjdGlvbi5nZXQoa2V5KSk7XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBhcnJheSBvZiBzZWxlY3RlZCByZWNvcmRzLlxyXG4gICAgcmV0dXJuIHNlbGVjdGVkUmVjb3JkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gQ2hlY2sgaWYgbXlTZWxlY3Rpb24gaXMgZGVmaW5lZCBiZWZvcmUgdHJ5aW5nIHRvIGNsZWFyIGl0XHJcbiAgICBpZiAodGhpcy5teVNlbGVjdGlvbikge1xyXG4gICAgICAvLyBDbGVhciB0aGUgbWFwIHRoYXQgc3RvcmVzIHNlbGVjdGVkIGRhdGEgaXRlbXMuXHJcbiAgICAgIHRoaXMubXlTZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE9wdGlvbmFsbHksIHlvdSBjYW4gaW5pdGlhbGl6ZSBpdCBpZiBpdCdzIHVuZGVmaW5lZFxyXG4gICAgICB0aGlzLm15U2VsZWN0aW9uID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIHRoZSBhcnJheSB0aGF0IHRyYWNrcyBzZWxlY3RlZCBrZXlzLlxyXG4gICAgdGhpcy5yb3dTZWxlY3Rpb24gPSBbXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzID0ge307XHJcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgICAgdGhpcy56Z3JpZC5nZXREYXRhQmluZGluZygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybigndGhpcy56Z3JpZCBpcyB1bmRlZmluZWQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0R3JpZERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1VzZUxvY2FsRGF0YSgpID8gKHRoaXMuemdyaWQuZGF0YSB8fCB0aGlzLnpncmlkLm9yaWdpbmFsRGF0YSkgOiAodGhpcy56Z3JpZC5ncmlkLmRhdGEgJiYgdGhpcy56Z3JpZC5ncmlkLmRhdGEuZGF0YSA/IHRoaXMuemdyaWQuZ3JpZC5kYXRhLmRhdGEgOiBbXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGF0YSA9IChnRGF0YTogYW55KSA9PiB7XHJcbiAgICBpZiAodGhpcy56Z3JpZCkge1xyXG4gICAgICBpZiAodGhpcy5pc1VzZUxvY2FsRGF0YSgpKSB7XHJcbiAgICAgICAgdGhpcy56Z3JpZC5kYXRhID0gZ0RhdGE7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEuRGlzYWJsZUF1dG9BcHBlbmRHcmlkRGF0ZUZpbHRlckNvbCkge1xyXG4gICAgICAgICAgdGhpcy5zZXREYXRlQ29sRm9yRmlsdGVyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuemdyaWQuZ3JpZC5kYXRhID0ge1xyXG4gICAgICAgICAgZGF0YTogZ0RhdGEsXHJcbiAgICAgICAgICB0b3RhbDogZ0RhdGEudG90YWxDb3VudFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldHVwR3JpZFdpdGhJbmxpbmVFZGl0KCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ3pncmlkIGlzIG51bGwgZm9yIHNldERhdGEuJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0SGVhZGVyVGV4dChjb2x1bW5OYW1lOiBzdHJpbmcsIG5ld0hlYWRlclRpdGxlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyaWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xyXG4gICAgZ3JpZENvbHVtbnMuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGNvbC5OYW1lID09PSBjb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgY29sLnRpdGxlID0gbmV3SGVhZGVyVGl0bGU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogR3JpZEl0ZW0pOiBhbnkge1xyXG4gICAgLy9jb25zb2xlLmxvZyhpdGVtLmRhdGFbJ0lkJ10gfHwgaW5kZXgpO1xyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1VzZUxvY2FsRGF0YSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmRhdGEuRGF0YVNvdXJjZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvL3JldHVybiBaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KHRoaXMuZGF0YS5SZXNvdXJjZVVSTCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gZ3JpZCBzZXR1cFxyXG4gIHByaXZhdGUgc2V0dXBHcmlkQ29tcG9uZW50QXR0cmlidXRlcygpIHtcclxuICAgIC8vIEdyaWQgZGVmYXVsdCBzZXR0aW5nXHJcbiAgICB0aGlzLmdyaWRUaXRsZSA9IHRoaXMuZGF0YS5UaXRsZTtcclxuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgdGhpcy5wYWdlU2l6ZXMgPSBbNSwgMTAsIDIwLCA1MCwgMTAwLCAyMDAsIDUwMF07XHJcbiAgICB0aGlzLnByZXZpb3VzTmV4dCA9IHRoaXMuZGF0YVsnRW5hYmxlUHJldmlvdXNOZXh0QnV0dG9uJ10gfHwgZmFsc2U7XHJcblxyXG4gICAgLy8gW01vYmlsZV0gRGlzYWJsZSBwYWdlIHNpemVzIGlmIFBhZ2VTaXplcyBpcyBleHBsaWNpdGx5IHNldCB0byBmYWxzZSBvciBvbiBhIG1vYmlsZSBzY3JlZW4uXHJcbiAgICBpZiAodGhpcy5kYXRhLlBhZ2VTaXplcyA9PT0gZmFsc2UgfHwgdGhpcy5pc01vYmlsZVNjcmVlbigpKSB7XHJcbiAgICAgIHRoaXMucGFnZVNpemVzID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29uZmlndXJlIHBhZ2luYXRpb24gc2V0dGluZ3MuXHJcbiAgICB0aGlzLnBhZ2VhYmxlID0gdGhpcy5kYXRhLnBhZ2VBYmxlICE9IHVuZGVmaW5lZCA/IHRoaXMuZGF0YS5wYWdlQWJsZSA6IHtcclxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcclxuICAgICAgYnV0dG9uQ291bnQ6IDMsXHJcbiAgICAgIHBhZ2VTaXplczogdGhpcy5wYWdlU2l6ZXMsXHJcbiAgICAgIHByZXZpb3VzTmV4dDogdGhpcy5wcmV2aW91c05leHQsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENvbmZpZ3VyZSBncmlkIHNlbGVjdGlvbiBvcHRpb25zIGlmIHNldCBTZWxlY3RPcHRpb25zIGluIGZpZWxkIGVsZW1lbnQgYXR0cmlidXRlLlxyXG4gICAgaWYgKHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgRXJyb3I6IGdyaWQoJHt0aGlzLmRhdGEuTmFtZX0pLCB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucyBzaG91bGQgYmUgYSBzdHJpbmcgd2l0aCB2YWx1ZSAnc2luZ2xlJyBvciAnbXVsdGlwbGUnLmApO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZVNldHRpbmdzID0ge1xyXG4gICAgICAgICAgbW9kZTogdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMudG9Mb3dlckNhc2UoKSA9PT0gJ3NpbmdsZScgPyAnc2luZ2xlJyA6ICdtdWx0aXBsZSdcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQmluZCBjb21wb25lbnQgdG8gZ3JvdXAgdXNpbmcgdGhlIHByb3ZpZGVkIFZhbHVlIHNldCBpbiBmaWVsZCBlbGVtZW50IGF0dHJpYnV0ZS5cclxuICAgIGlmICh0aGlzLmRhdGEuVmFsdWUuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgdGhpcy5ncm91cFt0aGlzLmRhdGEuVmFsdWUuc2xpY2UoNildID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBTdWJzY3JpcHRpb25Gb3JHcmlkU3ViamVjdCgpIHtcclxuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gYW55IGV4aXN0aW5nIHN1YnNjcmlwdGlvbnMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRnJvbSBoZXJlIHdpbGwgY2FsbCB6Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS5cclxuICAgIC8vIFN1YnNjcmliZSB0byBnZXQgZnJvbSBkaXJlY3RpdmUgYW5kIHNldCB0byBjb21wb25lbnRcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5ncmlkU3ViamVjdC5waXBlKFxyXG4gICAgICB0YXAoZ3JpZERpcmVjdGl2ZSA9PiB7XHJcbiAgICAgICAgLy8gU2V0IHRoZSB6Z3JpZCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgZW1pdHRlZCBncmlkRGlyZWN0aXZlLlxyXG4gICAgICAgIHRoaXMuemdyaWQgPSBncmlkRGlyZWN0aXZlO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbHVtbnMgcHJvcGVydHkgd2l0aCB0aGUgZ3JpZCBjb2x1bW5zIGZyb20gZ3JpZERpcmVjdGl2ZS5cclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLnpncmlkLmdyaWRTZXR0aW5nLmNvbHVtbnM7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIGF1dG9tYXRpYyBhcHBlbmRpbmcgb2YgYSBncmlkIGRhdGUgZmlsdGVyIGNvbHVtbiBpcyBub3QgZGlzYWJsZWQuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEuRGlzYWJsZUF1dG9BcHBlbmRHcmlkRGF0ZUZpbHRlckNvbCkge1xyXG4gICAgICAgICAgdGhpcy5zZXREYXRlQ29sRm9yRmlsdGVyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgdXAgZ3JpZCB3aXRoIGlubGluZSBlZGl0aW5nLlxyXG4gICAgICAgIHRoaXMuc2V0dXBHcmlkV2l0aElubGluZUVkaXQoKTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHVwIGEgcG9wb3ZlciBmZWF0dXJlIGJhc2VkIG9uIGNvbHVtbnMgYW5kIGdyaWQgZGF0YS5cclxuICAgICAgICB0aGlzLnNldHVwUG9wb3ZlckZlYXR1cmUodGhpcy5jb2x1bW5zLCB0aGlzLmdldEdyaWREYXRhKCkpO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAvLyBDaGVjayBpZiBjb2x1bW4gaGVhZGVycyBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc2xhdGVkLlxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29sdW1uSGVhZGVyVHJhbnNsYXRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE1hcmsgY29sdW1uIGhlYWRlcnMgYXMgdHJhbnNsYXRlZCBhbmQgcGVyZm9ybSB0aGUgdHJhbnNsYXRpb24uXHJcbiAgICAgICAgdGhpcy5pc0NvbHVtbkhlYWRlclRyYW5zbGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBzdXBlci50cmFuc2xhdGVDb2x1bW5IZWFkZXIodGhpcy5jb2x1bW5zKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcChfID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrYm94Q29sdW1uUGlubmVkID0gdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnNQaW5uZWQ7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmVHcmlkU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBncmlkU3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IGNhY2hlTmFtZSA9IHRoaXMuc3RhdGVTZXR0aW5nU2VydmljZS5nZXRTdG9yYWdlQ2FjaGVLZXkoU3RhdGVUeXBlLnNhdmVkU2V0dGluZywgdGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHByZXZpb3VzQ2FjaGVkRGF0YSA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0U3RhdGVDYWNoZUJ5TmFtZShjYWNoZU5hbWUpO1xyXG4gICAgY29uc3QgY29sdW1uQ29uZmlndXJhdGlvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zQ29uZmlnKHRoaXMuemdyaWQuZ3JpZC5jb2x1bW5zKTtcclxuICAgIGNvbnN0IHNldHRpbmdDb25maWc6IFpHcmlkU2V0dGluZ3MgPSB7IGNvbHVtbkNvbmZpZ3VyYXRpb25zIH07XHJcblxyXG4gICAgdGhpcy56Z3JpZC5ncmlkU2V0dGluZyA9IHtcclxuICAgICAgLi4udGhpcy56Z3JpZC5ncmlkU2V0dGluZyxcclxuICAgICAgY29sdW1uQ29uZmlndXJhdGlvbnNcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGdyaWRTdGF0ZUxvZ2ljID09PSBTdGF0ZVR5cGUuY2FjaGVkRGF0YVNldHRpbmcpIHtcclxuICAgICAgc2V0dGluZ0NvbmZpZy5ncmlkU3RhdGUgPSB0aGlzLnpncmlkLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnNldFN0YXRlVG9DYWNoZShjYWNoZU5hbWUsIHNldHRpbmdDb25maWcpO1xyXG5cclxuICAgIGNvbnN0IHN0YXRlU2V0dGluZ0luZm86IFN0YXRlU2V0dGluZ0luZm8gPSB7XHJcbiAgICAgIHByb2plY3RDb2RlOiB0aGlzLmVudmlyb25tZW50LnByb2plY3RDb2Rlc1swXSxcclxuICAgICAgZmllbGRFbGVtZW50TmFtZTogdGhpcy5kYXRhLkZpZWxkRWxlbWVudE5hbWUsXHJcbiAgICAgIGNvbXBvbmVudFVuaXF1ZUtleTogdGhpcy5kYXRhLkNhY2hlSW5mby5OYW1lID8/IHRoaXMuZGF0YS5GaWVsZEVsZW1lbnROYW1lLFxyXG4gICAgICB1c2VySWQ6IHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbi51c2VyTmFtZSxcclxuICAgICAgc3RhdGVUeXBlOiBTdGF0ZVR5cGUuc2F2ZWRTZXR0aW5nLFxyXG4gICAgICBzdGF0ZURhdGE6IEpTT04uc3RyaW5naWZ5KHNldHRpbmdDb25maWcpLFxyXG4gICAgICBzdG9yYWdlQ2FjaGVOYW1lOiBjYWNoZU5hbWVcclxuICAgIH1cclxuXHJcbiAgICBpZiAocHJldmlvdXNDYWNoZWREYXRhICYmIHByZXZpb3VzQ2FjaGVkRGF0YS5pZCkge1xyXG4gICAgICBzdGF0ZVNldHRpbmdJbmZvLmlkID0gcHJldmlvdXNDYWNoZWREYXRhLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRvbnQgbmVlZCB0byB3YWl0LCBhcyBpdCB3aWxsIGZpcnN0IHNhdmUgdG8gdGhlIGJyb3dzZXIgc3RvcmFnZS5cclxuICAgIHRoaXMuc3RhdGVTZXR0aW5nU2VydmljZS5zYXZlU3RhdGVTZXR0aW5nKHN0YXRlU2V0dGluZ0luZm8pLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuc2hvd0hpZGVSZXN0b3JlR3JpZFNldHRpbmdCdXR0b24oKTtcclxuICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coJ0dyaWQgU2V0dGluZyBTYXZlZCcsIFwidG9wXCIsIHRydWUsIDIwMDAsICdzdWNjZXNzJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzdG9yZUdyaWRTZXR0aW5ncygpIHtcclxuICAgIC8vIEVuc3VyZSBjb2x1bW5zIGFyZSBzb3J0ZWQgYmFzZWQgb24gdGhlaXIgb3JpZ2luYWwgb3JkZXJcclxuICAgIHRoaXMuY29sdW1ucy5zb3J0KChhLCBiKSA9PiBhLm9yaWdpbmFsT3JkZXJJbmRleCAtIGIub3JpZ2luYWxPcmRlckluZGV4KTtcclxuXHJcbiAgICAvLyBHZW5lcmF0ZSBncmlkIGNvbHVtbnMgYW5kIGxvYWQgZGF0YVxyXG4gICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDYWxsIHRoZSBncmlkU2VydmljZS5nZXRTdGF0ZUNhY2hlIGFuZCBoYW5kbGUgdGhlIHJlc3VsdCB2aWEgc3Vic2NyaXB0aW9uXHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmdldFN0YXRlQ2FjaGUoU3RhdGVUeXBlLnNhdmVkU2V0dGluZywgdGhpcy5kYXRhKS5zdWJzY3JpYmUoKGNhY2hlZERhdGEpID0+IHtcclxuICAgICAgaWYgKGNhY2hlZERhdGEpIHtcclxuICAgICAgICAvLyBDYWNoZSBmb3VuZCwgcHJvY2VlZCB3aXRoIGRlbGV0aW9uXHJcbiAgICAgICAgdGhpcy5ncmlkU2VydmljZS5kZWxldGVTdGF0ZUNhY2hlKFN0YXRlVHlwZS5zYXZlZFNldHRpbmcsIHRoaXMuZGF0YSk7XHJcblxyXG4gICAgICAgIC8vIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIHRoZSByZXN0b3JlIGJ1dHRvblxyXG4gICAgICAgIHRoaXMuc2hvd0hpZGVSZXN0b3JlR3JpZFNldHRpbmdCdXR0b24oKTtcclxuXHJcbiAgICAgICAgLy8gRGVsZXRlIHRoZSBzdGF0ZSBzZXR0aW5nIGJhc2VkIG9uIHRoZSBjYWNoZSBkYXRhIElEXHJcbiAgICAgICAgdGhpcy5zdGF0ZVNldHRpbmdTZXJ2aWNlLmRlbGV0ZVN0YXRlU2V0dGluZyhjYWNoZWREYXRhLmlkKS5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ3JpZENhbGxiYWNrKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICh0aGlzLmRhdGFbJ0FmdGVybG9hZENhbGxiYWNrJ10pIHtcclxuICAgICAgY29uc3QgbWUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzKTtcclxuXHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcInpncmlkLUFmdGVybG9hZENhbGxiYWNrXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGFbJ0FmdGVybG9hZENhbGxiYWNrJ10sXHJcbiAgICAgICAgZGF0YTogbWVcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEdyaWRCdXR0b25zKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lX1dGIHx8IHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEJ0biA9IHtcclxuICAgICAgICBSZWFkT25seTogZmFsc2UsXHJcbiAgICAgICAgVmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBJc1JlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgICBXb3JrZmxvd0NvZGU6IHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lX1dGLFxyXG4gICAgICAgIFZhbHVlOiB0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZSxcclxuICAgICAgICBUeXBlOiB0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZV9XRiA/IFwiendvcmtmbG93YnV0dG9uc1wiIDogXCJ6YnV0dG9uc1wiXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RGF0ZUNvbEZvckZpbHRlcmluZygpIHtcclxuICAgIGNvbnN0IGdyaWREYXRhID0gdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgaWYgKHRoaXMuaXNVc2VMb2NhbERhdGEoKSAmJiBncmlkRGF0YSAmJiBncmlkRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVDb2wgPSBPYmplY3Qua2V5cyhncmlkRGF0YVswXSkuZmlsdGVyKHggPT4geC5pbmNsdWRlcyhcIkRhdGVcIikgJiYgIXguZW5kc1dpdGgoQ29tcG9uZW50Q29uc3RhbnQuR3JpZENvbERhdGVGaWx0ZXJTdWZmaXgpKTtcclxuICAgICAgaWYgKGRhdGVDb2wgJiYgZGF0ZUNvbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZ3JpZERhdGEuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgIGRhdGVDb2wuZm9yRWFjaChjb2xOYW1lID0+IHtcclxuICAgICAgICAgICAgZGF0YVtgJHtjb2xOYW1lfSR7Q29tcG9uZW50Q29uc3RhbnQuR3JpZENvbERhdGVGaWx0ZXJTdWZmaXh9YF0gPSBuZXcgRGF0ZShkYXRhW2NvbE5hbWVdKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dIaWRlUmVzdG9yZUdyaWRTZXR0aW5nQnV0dG9uKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5DYWNoZUluZm8/LkVuYWJsZVNhdmVTdGF0ZSkge1xyXG4gICAgICB0aGlzLnNob3dSZXN0b3JlR3JpZFNldHRpbmdCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXRlVHlwZSA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5kYXRhKTtcclxuICAgICAgaWYgKHN0YXRlVHlwZSA9PT0gU3RhdGVUeXBlLnNhdmVkU2V0dGluZyB8fCBzdGF0ZVR5cGUgPT09IFN0YXRlVHlwZS5zYXZlZEFuZENhY2hlZERhdGFTZXR0aW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ0NhY2hlTmFtZSA9IHRoaXMuc3RhdGVTZXR0aW5nU2VydmljZS5nZXRTdG9yYWdlQ2FjaGVLZXkoc3RhdGVUeXBlLCB0aGlzLmRhdGEpO1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdDYWNoZVZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc2V0dGluZ0NhY2hlTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nQ2FjaGVWYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5zaG93UmVzdG9yZUdyaWRTZXR0aW5nQnV0dG9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBHcmlkIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25cclxuICBwdWJsaWMgZ3JpZEN1c3RvbUFkZENvbW1hbmQoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBkZWNsYXJlIGJ1dHRvbiBvbmNsaWNrIGV2ZW50IG5hbWUgYmFzZSBvbiBncmlkIG5hbWUgKyBwcmVmaXhcclxuICAgIGNvbnN0IGdyaWRBZGRCdXR0b25FdmVudE5hbWUgPSB0aGlzLmRhdGEuTmFtZSArICdfQ3VzdG9tQWRkQnV0dG9uT25DbGljayc7XHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBbZ3JpZEFkZEJ1dHRvbkV2ZW50TmFtZV0pIHtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5ncm91cFtncmlkQWRkQnV0dG9uRXZlbnROYW1lXShncm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ3JpZEN1c3RvbVJlc2V0Q29tbWFuZChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIC8vIGRlY2xhcmUgYnV0dG9uIG9uY2xpY2sgZXZlbnQgbmFtZSBiYXNlIG9uIGdyaWQgbmFtZSArIHByZWZpeFxyXG4gICAgY29uc3QgZ3JpZFJlc2V0QnV0dG9uRXZlbnROYW1lID0gdGhpcy5kYXRhLk5hbWUgKyAnX0N1c3RvbVJlc2V0QnV0dG9uT25DbGljayc7XHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBbZ3JpZFJlc2V0QnV0dG9uRXZlbnROYW1lXSkge1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdyb3VwW2dyaWRSZXNldEJ1dHRvbkV2ZW50TmFtZV0oZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdyaWRDdXN0b21SZW1vdmVDb21tYW5kKGRhdGFJdGVtOiBhbnksIHJvd0luZGV4OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZGVjbGFyZSBidXR0b24gb25jbGljayBldmVudCBuYW1lIGJhc2Ugb24gZ3JpZCBuYW1lICsgcHJlZml4XHJcbiAgICBjb25zdCBncmlkUmVzZXRCdXR0b25FdmVudE5hbWUgPSB0aGlzLmRhdGEuTmFtZSArICdfQ3VzdG9tUmVtb3ZlQnV0dG9uT25DbGljayc7XHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBbZ3JpZFJlc2V0QnV0dG9uRXZlbnROYW1lXSkge1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdyb3VwW2dyaWRSZXNldEJ1dHRvbkV2ZW50TmFtZV0oZGF0YUl0ZW0sIHJvd0luZGV4KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBJbmxpbmUgRWRpdFxyXG4gIHByaXZhdGUgY3JlYXRlRm9ybUNvbnRyb2xzKGdyaWRDb2xzOiBBcnJheTxhbnk+KSB7XHJcbiAgICBsZXQgY291bnRlckluZGV4ID0gMDtcclxuICAgIC8vIFRvIGZvcmNlIGVsZW1lbnQgdG8gcmViaW5kIGRhdGFcclxuICAgIHRoaXMuaXNJbmxpbmVFZGl0SW5wdXRGaWVsZExvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy56Z3JpZC5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgb2YoW10pLnBpcGUoZGVsYXkoMCksIHRhcCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcyA9IHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcyB8fCB7fTtcclxuICAgICAgY29uc3QgZ3JpZERhdGEgPSB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGdyaWREYXRhKSkge1xyXG4gICAgICAgIGdyaWREYXRhLmZvckVhY2goZCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHt9O1xyXG4gICAgICAgICAgZ3JpZENvbHMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gWkNvbXBvbmVudEhlbHBlci5pc1Zpc2libGVGb3JtQ29udHJvbCh0aGlzLCBjLmZpZWxkKTtcclxuICAgICAgICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IFpDb21wb25lbnRIZWxwZXIuaXNSZXF1aXJlZEZvcm1Db250cm9sKHRoaXMsIGMuZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gWkNvbXBvbmVudEhlbHBlci5nZXRWYWxpZGF0b3JzKGMuZmllbGQsIGlzVmlzaWJsZSwgaXNSZXF1aXJlZCwgdGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2MuZmllbGRdID0gbmV3IEZvcm1Db250cm9sKGRbYy5maWVsZF0sIHZhbGlkYXRvcnMpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGl0ZW1zKTtcclxuXHJcbiAgICAgICAgICBpZiAoZFtcIklkXCJdKSB7XHJcbiAgICAgICAgICAgIGl0ZW1zW1wiSWRcIl0gPSBpdGVtc1tcIklkXCJdIHx8IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBkW1wiSWRcIl0sIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkW1wiSWRcIl0gPSBjb3VudGVySW5kZXgrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwc1tkW1wiSWRcIl1dID0gZm9ybUdyb3VwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNJbmxpbmVFZGl0SW5wdXRGaWVsZExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy56Z3JpZC5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy50ZW1wSW5saW5lRWRpdGVkRm9ybUdyb3VwcyA9IHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcztcclxuICAgIH0pKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJbmxpbmVGaWVsZCh2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoeCA9PiB4LlZhbHVlID09PSB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW5saW5lRm9ybShkYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIpIHtcclxuICAgIHZhciBrZXkgPSAoZGF0YVtcIklkXCJdIHx8IGRhdGFbXCJJZFwiXSA9PSAwKSA/IGRhdGFbXCJJZFwiXSA6IHJvd0luZGV4O1xyXG4gICAgaWYgKHRoaXMuaXNJbmxpbmVFZGl0SW5wdXRGaWVsZExvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGVtcElubGluZUVkaXRlZEZvcm1Hcm91cHNba2V5XSB8fCB0aGlzLnRlbXBJbmxpbmVFZGl0ZWRGb3JtR3JvdXBzWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwc1trZXldO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm1Db250cm9sRGF0YSgpOiBhbnlbXSB7XHJcbiAgICBjb25zdCBkYXRhID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzKSkge1xyXG4gICAgICBkYXRhLnB1c2godGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzW2tdPy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBHcmlkV2l0aElubGluZUVkaXQoKSB7XHJcbiAgICBpZiAodGhpcy5oYXNJbmxpbmVFZGl0Q29sdW1uKHRoaXMuY29sdW1ucykpIHtcclxuICAgICAgdGhpcy50ZW1wSW5saW5lRWRpdGVkRm9ybUdyb3VwcyA9IHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcztcclxuICAgICAgdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzID0ge307XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKHRoaXMuY29sdW1ucy5jb25jYXQodGhpcy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnNGaWVsZCB8fCBbXSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSW5saW5lRm9ybUdyb3VwSGFzVmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzICYmIE9iamVjdC5rZXlzKHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcykubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzSW5saW5lRWRpdENvbHVtbihncmlkQ29scyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGdyaWRDb2xzICYmIGdyaWRDb2xzLnNvbWUoYyA9PiBjLmlzRWRpdGFibGVJbkdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENlbGxTdHlsZUZvcklubGluZUVkaXQoY29sdW1uRmllbGQ6IFpGaWVsZCwgZGF0YUl0ZW06IGFueSwgcm93SW5kZXg6IG51bWJlcik6IGFueSB7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRJbmxpbmVGb3JtKGRhdGFJdGVtLCByb3dJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgaWYgKCFmb3JtKSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0eWxlID0gY29sdW1uRmllbGRbYFN0eWxlMTBgXTtcclxuICAgIGNvbnN0IGZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgc3R5bGUpO1xyXG4gICAgaWYgKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxGdW5jID0gZnVuYy5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgcmV0dXJuIGNhbGxGdW5jKGZvcm0udmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIGZ1bmMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiBmdW5jO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0eWxlO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEV2ZW50XHJcbiAgLy8gU291cmNlOiBodHRwczovL3d3dy50ZWxlcmlrLmNvbS9mb3J1bXMva2VuZG8tYW5ndWxhci1ncmlkLWJsYW5rLXNwYWNlLWluLXRoZS1lbmQtd2hlbi15b3UtcmVzaXplKHJlZHVjZSktYW55LWNvbHVtblxyXG4gIHB1YmxpYyBhZGp1c3RXaWR0aFVwb25SZXNpemUoKSB7XHJcbiAgICBjb25zdCB0YWJsZVdpZHRoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5rLWdyaWQtdGFibGVcIilbYG9mZnNldFdpZHRoYF07XHJcbiAgICBjb25zdCBjb250ZW50V2lkdGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmstZ3JpZC1jb250ZW50XCIpW2BvZmZzZXRXaWR0aGBdO1xyXG4gICAgaWYgKHRhYmxlV2lkdGggPCBjb250ZW50V2lkdGgpIHtcclxuICAgICAgY29uc3QgY3VycmVudExhc3RDb2xXaWR0aCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuay1ncmlkLWNvbnRlbnQgLmstZ3JpZC10YWJsZSB0ciB0ZDpsYXN0LW9mLXR5cGVcIilbYG9mZnNldFdpZHRoYF07XHJcblxyXG4gICAgICB0aGlzLmNvbHVtbnNbdGhpcy5jb2x1bW5zLmxlbmd0aCAtIDFdLndpZHRoID0gY3VycmVudExhc3RDb2xXaWR0aCArIChjb250ZW50V2lkdGggLSB0YWJsZVdpZHRoKSAtIDEwOyAvLyBhY2NvdW50IGZvciB0aGUgdmVydGljYWwgc2Nyb2xsYmFyO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIG9uQ2hhbmdlIEV2ZW50c1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzVXNlTG9jYWxEYXRhKCkpIHtcclxuICAgICAgdGhpcy5ncmlkU2V0dGluZyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuemdyaWQuZ3JpZFNldHRpbmcpO1xyXG4gICAgICB0aGlzLnpncmlkLmZpbHRlckNoYW5nZShldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFnZUNoYW5nZShldmVudDogUGFnZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNVc2VMb2NhbERhdGEoKSkge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy56Z3JpZC5ncmlkU2V0dGluZyk7XHJcbiAgICAgIHRoaXMuemdyaWQucGFnZUNoYW5nZShldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc29ydENoYW5nZShzb3J0OiBTb3J0RGVzY3JpcHRvcltdKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNVc2VMb2NhbERhdGEoKSkge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy56Z3JpZC5ncmlkU2V0dGluZyk7XHJcbiAgICAgIHRoaXMuemdyaWQuc29ydENoYW5nZShzb3J0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbkNlbGxDaGVja0JveE9uQ2hhbmdlKGV2ZW50OiBhbnksIHJvd0luZGV4OiBhbnksIGNvbHVtbjogYW55KSB7XHJcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC5kZXRhaWwuY2hlY2tlZDtcclxuICAgIGNvbnN0IGdEYXRhID0gdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgZ0RhdGFbcm93SW5kZXhdW2NvbHVtbi5WYWx1ZV0gPSBpc0NoZWNrZWQ7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGNvbW1hbmQgaGFuZGxlclxyXG4gIHB1YmxpYyBhZGRIYW5kbGVyKHsgc2VuZGVyIH0pIHtcclxuICAgIHRoaXMuaXNOZXcgPSB0cnVlO1xyXG5cclxuICAgIC8vIGNsb3NlIGFueSBleGlzdGluZyBlZGl0b3JcclxuICAgIHRoaXMuY2xvc2VFZGl0b3Ioc2VuZGVyKTtcclxuXHJcbiAgICAvLyBsb29wIGFsbCBjb2x1bW4gdG8gZ2V0IHZhbGlkYXRpb24gYW5kIGNyZWF0ZSBmb3JtIGNvbnRyb2xcclxuICAgIGNvbnN0IGNvbEZvcm1Db250cm9sID0ge307XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgICAgIGlmIChjb2wuSXNSZXF1aXJlZCkge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICBpZiAoY29sLlR5cGUgPT09ICd6dGV4dGVkaXRvcicpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChaQ29tcG9uZW50SGVscGVyLnJlcXVpcmVkVmFsaWRhdG9yX1dpdGhvdXRXaGl0ZVNwYWNlc19UZXh0RWRpdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goWkNvbXBvbmVudEhlbHBlci5yZXF1aXJlZFZhbGlkYXRvcl9XaXRob3V0V2hpdGVTcGFjZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sLlZhbGlkYXRvclBhdHRlcm4pIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbEZvcm1Db250cm9sW2NvbC5WYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2wobnVsbCwgdmFsaWRhdG9ycyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzZXQgZm9ybSBjb250cm9sIG9iamVjdCB0byBmb3JtIGdyb3VwXHJcbiAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoY29sRm9ybUNvbnRyb2wpO1xyXG5cclxuICAgIC8vIGFkZCB0byBncmlkIHJvd1xyXG4gICAgc2VuZGVyLmFkZFJvdyh0aGlzLmZvcm1Hcm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZUhhbmRsZXIoeyBzZW5kZXIsIHJvd0luZGV4LCBmb3JtR3JvdXAsIGlzTmV3IH0pOiB2b2lkIHtcclxuICAgIC8vIEdldCB0aGUgZXhpc3RpbmcgZGF0YSBmcm9tIHRoZSBncmlkXHJcbiAgICBjb25zdCBncmlkRXhpc3RpbmdEYXRhID0gdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSBmb3JtIGlzIHZhbGlkXHJcbiAgICBpZiAoZm9ybUdyb3VwLnZhbGlkKSB7XHJcbiAgICAgIC8vIENoZWNrIGZvciBhIHVuaXF1ZSBrZXkgZmllbGRcclxuICAgICAgY29uc3QgdW5pcXVlS2V5ID0gdGhpcy5kYXRhWydVbmlxdWVLZXknXTtcclxuICAgICAgaWYgKHVuaXF1ZUtleSkge1xyXG4gICAgICAgIC8vIEdldCB0aGUgdW5pcXVlIGtleSB2YWx1ZSBmcm9tIHRoZSBmb3JtXHJcbiAgICAgICAgY29uc3QgZm9ybVVuaXF1ZUtleVZhbHVlID0gZm9ybUdyb3VwLnZhbHVlW3VuaXF1ZUtleV07XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlIHZhbHVlXHJcbiAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBncmlkRXhpc3RpbmdEYXRhLnNvbWUoZGF0YSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAvLyBJZiBlZGl0aW5nIGFuIGV4aXN0aW5nIHJvdywgc2tpcCB0aGUgY3VycmVudCByb3cgYmVpbmcgZWRpdGVkXHJcbiAgICAgICAgICAgICFpc05ldyAmJlxyXG4gICAgICAgICAgICByb3dJbmRleCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1bmlxdWUga2V5IHZhbHVlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBncmlkXHJcbiAgICAgICAgICAgIGRhdGFbdW5pcXVlS2V5XSA9PT0gZm9ybVVuaXF1ZUtleVZhbHVlICYmXHJcbiAgICAgICAgICAgIC8vIFNraXAgY2hlY2tpbmcgYWdhaW5zdCB0aGUgY3VycmVudCByb3cgYmVpbmcgZWRpdGVkXHJcbiAgICAgICAgICAgIGRhdGFbdW5pcXVlS2V5XSAhPT0gZ3JpZEV4aXN0aW5nRGF0YVtyb3dJbmRleF1bdW5pcXVlS2V5XVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgdmFsdWUsIHNob3cgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIHdpdGhvdXQgc2F2aW5nXHJcbiAgICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KCdFcnJvciBvY2N1cjogRHVwbGljYXRlZCB1bmlxdWUgZmllbGQgZW50cnkuJywgJ3RvcCcsIHRydWUsIDMwMDAsICdkYW5nZXInKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIHRoZSB1bmlxdWUga2V5IHZhbHVlIGlzIHZhbGlkIGFuZCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcywgc2F2ZSB0aGUgZGF0YVxyXG4gICAgICBpZiAoaXNOZXcpIHtcclxuICAgICAgICAvLyBBZGQgYSBuZXcgcm93IHRvIHRoZSBncmlkIGRhdGFcclxuICAgICAgICBncmlkRXhpc3RpbmdEYXRhLnB1c2goZm9ybUdyb3VwLnZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBVcGRhdGUgYW4gZXhpc3Rpbmcgcm93IGluIHRoZSBncmlkIGRhdGFcclxuICAgICAgICBncmlkRXhpc3RpbmdEYXRhW3Jvd0luZGV4XSA9IGZvcm1Hcm91cC52YWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVXBkYXRlIHRoZSBncmlkIGRhdGEgYW5kIGNsb3NlIHRoZSByb3cgZWRpdG9yXHJcbiAgICAgIHRoaXMuc2V0RGF0YShncmlkRXhpc3RpbmdEYXRhKTtcclxuICAgICAgc2VuZGVyLmNsb3NlUm93KHJvd0luZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYW5jZWxIYW5kbGVyKHsgc2VuZGVyLCByb3dJbmRleCB9KSB7XHJcbiAgICAvLyBjYW5jZWwgYW55IGV4aXN0aW5nIGVkaXRvclxyXG4gICAgc2VuZGVyLmNsb3NlUm93KHJvd0luZGV4KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0SGFuZGxlcih7IHNlbmRlciwgcm93SW5kZXgsIGRhdGFJdGVtIH0pIHtcclxuICAgIC8vIFNldCBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcm93IGJlaW5nIGVkaXRlZCBpcyBub3QgYSBuZXcgcm93XHJcbiAgICB0aGlzLmlzTmV3ID0gZmFsc2U7XHJcblxyXG4gICAgLy8gQ2xvc2UgYW55IGV4aXN0aW5nIGVkaXRvclxyXG4gICAgdGhpcy5jbG9zZUVkaXRvcihzZW5kZXIpO1xyXG5cclxuICAgIC8vIGxvb3AgYWxsIGNvbHVtbiB0byBnZXQgdmFsaWRhdGlvbiBhbmQgY3JlYXRlIGZvcm0gY29udHJvbCwgYXBwZW5kIGN1cnJlbnQgcm93IHZhbHVlXHJcbiAgICBjb25zdCBjb2xGb3JtQ29udHJvbCA9IHt9O1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICBpZiAoY29sLklzUmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgaWYgKGNvbC5UeXBlID09PSAnenRleHRlZGl0b3InKSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goWkNvbXBvbmVudEhlbHBlci5yZXF1aXJlZFZhbGlkYXRvcl9XaXRob3V0V2hpdGVTcGFjZXNfVGV4dEVkaXRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFpDb21wb25lbnRIZWxwZXIucmVxdWlyZWRWYWxpZGF0b3JfV2l0aG91dFdoaXRlU3BhY2VzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihjb2wuVmFsaWRhdG9yUGF0dGVybikpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2xGb3JtQ29udHJvbFtjb2wuVmFsdWVdID0gbmV3IEZvcm1Db250cm9sKGRhdGFJdGVtW2NvbC5WYWx1ZV0sIHZhbGlkYXRvcnMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc2V0IGZvcm0gY29udHJvbCBvYmplY3QgdG8gZm9ybSBncm91cFxyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGNvbEZvcm1Db250cm9sKTtcclxuXHJcbiAgICAvLyBTZXQgdGhlIGZvcm0gZ3JvdXAgb24gdGhlIHJvdyBiZWluZyBlZGl0ZWRcclxuICAgIHRoaXMuZWRpdGVkUm93SW5kZXggPSByb3dJbmRleDtcclxuICAgIHNlbmRlci5lZGl0Um93KHJvd0luZGV4LCB0aGlzLmZvcm1Hcm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlSGFuZGxlcih7IHNlbmRlciwgZGF0YUl0ZW0gfSkge1xyXG4gICAgY29uc3QgZ0RhdGEgPSB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KGRhdGFJdGVtLCBnRGF0YSwgdGhpcy5kYXRhWydVbmlxdWVLZXknXSk7XHJcbiAgICBnRGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBpbiB0aGUgZ3JpZFxyXG4gICAgdGhpcy5zZXREYXRhKGdEYXRhKTtcclxuXHJcbiAgICBzZW5kZXIuY2FuY2VsQ2VsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZUVkaXRvcihncmlkLCByb3dJbmRleCA9IHRoaXMuZWRpdGVkUm93SW5kZXgpIHtcclxuICAgIGdyaWQuY2xvc2VSb3cocm93SW5kZXgpO1xyXG4gICAgdGhpcy5lZGl0ZWRSb3dJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZm9ybUdyb3VwID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJdGVtSW5kZXgoaXRlbTogYW55LCBkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZGF0YS5sZW5ndGg7IGlkeCsrKSB7XHJcbiAgICAgIGlmIChkYXRhW2lkeF1ba2V5XSA9PT0gaXRlbVtrZXldKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkeDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBHcmlkIEZpbHRlclxyXG4gIHByaXZhdGUgc2V0dXBGaWx0ZXJGZWF0dXJlKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5HcmlkRmlsdGVyQmFyRmllbGQpIHtcclxuICAgICAgdGhpcy5maWx0ZXJHcm91cCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGF0YS5HcmlkQWR2RmlsdGVyQmFyRmllbGQpIHtcclxuICAgICAgdGhpcy5hZHZmaWx0ZXJHcm91cCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlYXJjaCgpIHtcclxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZpbHRlckdyb3VwLmZvcm07XHJcbiAgICBjb25zdCBjb250cm9scyA9IGZvcm0uY29udHJvbHM7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTaG93QWR2RmlsdGVyKSB7XHJcbiAgICAgIGNvbnN0IGFkdmZvcm0gPSB0aGlzLmFkdmZpbHRlckdyb3VwLmZvcm07XHJcbiAgICAgIGNvbnN0IGFkdmNvbnRyb2xzID0gYWR2Zm9ybS5jb250cm9scztcclxuICAgICAgZm9yIChjb25zdCBjIG9mIE9iamVjdC5rZXlzKGFkdmNvbnRyb2xzKSkge1xyXG4gICAgICAgIGNvbnRyb2xzW2NdID0gYWR2Y29udHJvbHNbY107XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLkZpbHRlclNlYXJjaCkge1xyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJ6Z3JpZC1maWx0ZXJzZWFyY2hcIixcclxuICAgICAgICB0YXJnZXQ6IHRoaXMuZGF0YS5GaWx0ZXJTZWFyY2gsXHJcbiAgICAgICAgZGF0YTogeyBmb3JtY29udHJvbHM6IGNvbnRyb2xzIH0sXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXTtcclxuICAgICAgT2JqZWN0LmtleXMoY29udHJvbHMpLmZvckVhY2goY29udHJvbE5hbWUgPT4ge1xyXG4gICAgICAgIGlmIChjb250cm9sc1tjb250cm9sTmFtZV0udmFsdWUpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gWkNvbXBvbmVudEhlbHBlci5nZXRGaWVsZEZyb21GaWVsZHNCeVZhbHVlKHRoaXMuZmlsdGVyR3JvdXAuZmllbGRzLCBjb250cm9sTmFtZSkgfHwgWkNvbXBvbmVudEhlbHBlci5nZXRGaWVsZEZyb21GaWVsZHNCeVZhbHVlKHRoaXMuYWR2ZmlsdGVyR3JvdXAuZmllbGRzLCBjb250cm9sTmFtZSk7XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaCh7XHJcbiAgICAgICAgICAgIGtleTogZmllbGQuVmFsdWVFeHByIHx8IGZpZWxkLlZhbHVlLFxyXG4gICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3JCeUZpZWxkVHlwZShmaWVsZCksXHJcbiAgICAgICAgICAgIHZhbHVlOiBjb250cm9sc1tjb250cm9sTmFtZV0udmFsdWVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsRWRpdCgpIHtcclxuICAgIHRoaXMuY2xlYXJGaWx0ZXJEYXRhKHRoaXMuZmlsdGVyR3JvdXApO1xyXG4gICAgaWYgKHRoaXMuZGF0YS5HcmlkQWR2RmlsdGVyQmFyRmllbGQpIHtcclxuICAgICAgdGhpcy5jbGVhckZpbHRlckRhdGEodGhpcy5hZHZmaWx0ZXJHcm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyRmlsdGVyRGF0YShncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBmb3JtID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCBjb250cm9scyA9IGZvcm0uY29udHJvbHM7XHJcbiAgICBPYmplY3Qua2V5cyhjb250cm9scykuZm9yRWFjaChjb250cm9sTmFtZSA9PiB7XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZShjb250cm9sTmFtZSwgbnVsbCwgZ3JvdXAsIHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWR2YW5jZWRTZWFyY2goKSB7XHJcbiAgICB0aGlzLmlzU2hvd0FkdkZpbHRlciA9ICF0aGlzLmlzU2hvd0FkdkZpbHRlcjtcclxuICAgIGlmICghdGhpcy5pc1Nob3dBZHZGaWx0ZXIpIHtcclxuICAgICAgdGhpcy5jbGVhckZpbHRlckRhdGEodGhpcy5hZHZmaWx0ZXJHcm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEZpbHRlck9wZXJhdG9yQnlGaWVsZFR5cGUoZmllbGQ6IFpGaWVsZCkge1xyXG4gICAgc3dpdGNoIChmaWVsZC5UeXBlKSB7XHJcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcclxuICAgICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgY2FzZSBcImVtYWlsXCI6XHJcbiAgICAgIGNhc2UgXCJwYXNzd29yZFwiOlxyXG4gICAgICBjYXNlIFwidGVsXCI6XHJcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XHJcbiAgICAgIGNhc2UgXCJ1cmxcIjpcclxuICAgICAgY2FzZSBcImN1cnJlbmN5XCI6XHJcbiAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxyXG4gICAgICAgIGlmICghZmllbGRbJ0ZpbHRlckNvbnRhaW5zVXNpbmdFcXVhbCddKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJjb250YWluc1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCI9PVwiO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIj1cIjtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBncmlkIGNvbW1vbiBzZXR0aW5nIGZ1bmN0aW9uXHJcbiAgcHVibGljIHNldCBzZXRHcmlkVGl0bGUobmV3VGl0bGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5ncmlkVGl0bGUgPSBuZXdUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc2V0R3JpZFN0YXRlKHN0YXRlOiBTdGF0ZSkge1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBzdGF0ZTtcclxuICAgIHRoaXMuemdyaWQuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID0gc3RhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0R3JpZFRvRmlyc3RQYWdlKCkge1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc2tpcCA9IDA7XHJcbiAgICB0aGlzLnpncmlkLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5za2lwID0gMDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuIiwiPCEtLVxyXG48ZGl2IHN0eWxlPVwibWFyZ2luOiAxMHB4XCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgay1mb3JtXCI+XHJcbiAgICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICAgIDxsZWdlbmQ+QmluZGluZyB0eXBlczwvbGVnZW5kPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay1mb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5CaW5kIHRoZSBkYXRhIHRvOjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImJpbmRpbmdUeXBlXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVcIiBpZD1cImFycmF5XCIgdmFsdWU9XCJhcnJheVwiIGNsYXNzPVwiay1yYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUJpbmRpbmdUeXBlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstcmFkaW8tbGFiZWxcIiBmb3I9XCJhcnJheVwiPkFycmF5IG9iamVjdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJiaW5kaW5nVHlwZVwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlXCIgaWQ9XCJncmlkRGF0YVJlc3VsdFwiIHZhbHVlPVwiZ3JpZERhdGFSZXN1bHRcIiBjbGFzcz1cImstcmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VCaW5kaW5nVHlwZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJrLXJhZGlvLWxhYmVsXCIgZm9yPVwiZ3JpZERhdGFSZXN1bHRcIj5HcmlkRGF0YVJlc3VsdCBvYmplY3Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiYmluZGluZ1R5cGVcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwibW9kZVwiIGlkPVwiYXN5bmNcIiB2YWx1ZT1cImFzeW5jXCIgY2xhc3M9XCJrLXJhZGlvXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQmluZGluZ1R5cGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiay1yYWRpby1sYWJlbFwiIGZvcj1cImFzeW5jXCI+QXN5bmNocm9ub3VzIHNvdXJjZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiAtLT5cclxuPGRpdiBjbGFzcz1cImdyaWQtY29udGFpbmVyIGUxdGFnLXN0eWxlXCIgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlXCI+XHJcblxyXG4gIDwhLS0gPGRpdiAqbmdJZj1cImRhdGEuVGl0bGVcIiBjbGFzcz1cImdyaWRUaXRsZVwiPnt7ZGF0YS5UaXRsZX19PC9kaXY+IC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgbGV0LWFuY2hvcj5cclxuICAgIDxzcGFuPnt7IGFuY2hvci5uYXRpdmVFbGVtZW50LmlubmVyVGV4dCB9fTwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxrZW5kby1wb3BvdmVyICNncmlkUG9wT3ZlciBbcG9zaXRpb25dPVwiZGF0YS5Qb3BPdmVyUG9zaXRpb24gfHwgJ2JvdHRvbSdcIiBbdGVtcGxhdGVEYXRhXT1cImdldENvbnRleHREYXRhLmJpbmQodGhpcylcIj5cclxuICAgIDwhLS0gPG5nLXRlbXBsYXRlIGtlbmRvUG9wb3ZlclRpdGxlVGVtcGxhdGUgbGV0LWRhdGE9XCJkYXRhXCIgPlxyXG4gICAgICA8ZGl2IFtzdHlsZV09XCJkYXRhLlRpdGxlU3R5bGVcIiAqbmdJZj1cImRhdGEgJiYgZGF0YS5UaXRsZVwiIFtpbm5lckhUTUxdPVwiZGF0YS5UaXRsZVwiPjwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT4gLS0+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9Qb3BvdmVyQm9keVRlbXBsYXRlIGxldC1kYXRhPVwiZGF0YVwiPlxyXG4gICAgICA8ZGl2IFtzdHlsZV09XCJkYXRhLkJvZHlTdHlsZVwiIGNsYXNzPVwicG9wb3ZlcmJvZHlcIiAqbmdJZj1cImRhdGEgJiYgZGF0YS5Cb2R5XCIgW2lubmVySFRNTF09XCJkYXRhLkJvZHkgfCBodG1sU2FuaXRpemVcIiBbbmdDbGFzc109XCJkYXRhLkJvZHlDbGFzc1wiIChtb3VzZWxlYXZlKT1cImNsb3NlUG9wT3Zlci5jYWxsKHRoaXMsICRldmVudClcIj48L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby1wb3BvdmVyPlxyXG5cclxuICA8ZGl2IGtlbmRvVG9vbHRpcCBzaG93T249XCJub25lXCIgW3Rvb2x0aXBUZW1wbGF0ZV09XCJ0ZW1wbGF0ZVwiIGZpbHRlcj1cIi5rLWdyaWQgdGRcIiAobW91c2VvdmVyKT1cInNob3dUb29sdGlwKCRldmVudClcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIiBjbGFzcz1cImUxdGFnLXN0eWxlMVwiPlxyXG4gICAgPGRpdiBrZW5kb1BvcG92ZXJDb250YWluZXIgW3BvcG92ZXJdPVwiZ3JpZFBvcE92ZXJcIiBmaWx0ZXI9XCJkaXYuZ3JpZENlbGwud2l0aFBvcG92ZXJJbkdyaWRcIiBzaG93T249XCJub25lXCIga2VuZG9Qb3BvdmVyQ29udGFpbmVyICNwb3BvdmVyY29udGFpbmVyPVwia2VuZG9Qb3BvdmVyQ29udGFpbmVyXCI+XHJcbiAgICAgIDxrZW5kby1ncmlkIFt6Z3JpZGJpbmRpbmddPVwie2RhdGE6IGRhdGEsIGdyb3VwOiBncm91cCwgcGFyYW1zOiBwYXJhbXMsIGdyaWRTdWJqZWN0OiBncmlkU3ViamVjdCwgZ3JpZFNldHRpbmc6IGdyaWRTZXR0aW5nfVwiIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIiBjbGFzcz1cImRlc2t0b3AtZ3JpZCBlMXRhZy1zdHlsZTJcIlxyXG4gICAgICAgICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJkYXRhLnNjcm9sbEFibGUgPT09IGZhbHNlID8gJ25vbmUnIDogJ3Njcm9sbGFibGUnXCJcclxuICAgICAgICAgICAgICAgICAgW3BhZ2VhYmxlXT1cInBhZ2VhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmhpZGVuLXBhZ2VyXT1cIiFwYWdlYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJncmlkU2V0dGluZy5ncmlkU3RhdGUudGFrZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtza2lwXT1cImdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5za2lwXCJcclxuICAgICAgICAgICAgICAgICAgW3NvcnRdPVwiZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNvcnRcIlxyXG4gICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwie2FsbG93VW5zb3J0OiB0cnVlLG1vZGU6ICdtdWx0aXBsZSd9XCJcclxuICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJncmlkU2V0dGluZy5ncmlkU3RhdGUuZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiZGF0YS5lbmFibGVGaWx0ZXJpbmcgIT09IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgW3Jlc2l6YWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW3Jlb3JkZXJhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbY29sdW1uTWVudV09XCJkYXRhLkRpc2FibGVHcmlkQ29sdW1uTWVudSA/IGZhbHNlIDogeyBmaWx0ZXI6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiISghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjZWxsQ2xpY2spPVwiY2VsbENsaWNrSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGNlbGxDbG9zZSk9XCJlZGl0Q2VsbENsb3NlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGRhdGFTdGF0ZUNoYW5nZSk9XCJkYXRhU3RhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cInNvcnRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwiZmlsdGVyQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICBba2VuZG9HcmlkU2VsZWN0QnldPVwicm93U2VsZWN0aW9uS2V5XCJcclxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZEtleXMpXT1cInJvd1NlbGVjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiXHJcbiAgICAgICAgICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlcIlxyXG4gICAgICAgICAgICAgICAgICAoY2FuY2VsKT1cImNhbmNlbEhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChzYXZlKT1cInNhdmVIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cInJlbW92ZUhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChlZGl0KT1cImVkaXRIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoYWRkKT1cImFkZEhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChjb2x1bW5SZXNpemUpPVwiYWRqdXN0V2lkdGhVcG9uUmVzaXplKClcIlxyXG4gICAgICAgICAgICAgICAgICAoZXhjZWxFeHBvcnQpPVwib25FeGNlbEV4cG9ydCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgW3Jvd0NsYXNzXT1cInJvd0NhbGxiYWNrLmJpbmQodGhpcylcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkVG9vbGJhclRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5BbGxvd1JlZnJlc2hCdXR0b24gfHwgZGF0YS5BbGxvd0V4cG9ydCB8fCBkYXRhLkNhY2hlSW5mbz8uRW5hYmxlU2F2ZVN0YXRlIHx8IGRhdGEuVGl0bGUgfHwgZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lX1dGIHx8IGRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZSB8fCBkYXRhLkVuYWJsZUdyaWRDb21tYW5kIHx8IGRhdGEuRW5hYmxlQ3VzdG9tQWRkQ29tbWFuZCB8fCBkYXRhLkVuYWJsZUN1c3RvbVJlc2V0Q29tbWFuZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2xiYXItbGVmdC1pdGVtXCIgKm5nSWY9XCJncmlkVGl0bGUgfHwgZGF0YS5BbGxvd1JlZnJlc2hCdXR0b24gfHwgZGF0YS5BbGxvd0V4cG9ydFwiPlxyXG4gICAgICAgICAgICA8IS0tIDxmYS1pY29uICpuZ0lmPVwiZGF0YS5JY29uXCIgY2xhc3M9XCJncmlkVGl0bGVJY29uXCIgW2ljb25dPVwiZGF0YS5JY29uXCI+PC9mYS1pY29uPiAtLT5cclxuICAgICAgICAgICAgPGtlbmRvLWxhYmVsIGNsYXNzPVwiZ3JpZFRpdGxlXCIgKm5nSWY9XCJncmlkVGl0bGVcIj57eyBncmlkVGl0bGUgfX08L2tlbmRvLWxhYmVsPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHRpdGxlPVwiUmVmcmVzaFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImxlZnQtYnV0dG9ucyByZWZyZXNoLWJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJyZWZyZXNoRGF0YSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGEuQWxsb3dSZWZyZXNoQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1ncmlkLWJ1dHRvbiBrLWktcmVmcmVzaC1zbVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWxlZnQtaXRlbS1zZWNvbmQtY29udGFpbmVyXCIgKm5nSWY9XCJkYXRhLkFsbG93RXhwb3J0XCIgW2NsYXNzLndpdGgtZ3JpZC10aXRsZV09XCJncmlkVGl0bGUgfHwgZGF0YS5BbGxvd1JlZnJlc2hCdXR0b25cIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImxlZnQtYnV0dG9ucyBleHBvcnQtYnV0dG9uXCIga2VuZG9HcmlkRXhjZWxDb21tYW5kICpuZ0lmPVwiZGF0YS5BbGxvd0V4cG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWktZmlsZS1leGNlbFwiPjwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiZG93bmxvYWRcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC10by1leGNlbC1idXR0b24tdGV4dFwiPnt7IGdldFRvb2xCYXJJdGVtTGFiZWxOYW1lKCdEb3dubG9hZCBhcyBFeGNlbCcpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2xiYXItcmlnaHQtaXRlbVwiICpuZ0lmPVwiZ3JpZEJ0biB8fCBkYXRhLkNhY2hlSW5mbz8uRW5hYmxlU2F2ZVN0YXRlIHx8IGdyaWREZWZhdWx0U3RhdGVFeGlzdCB8fCBkYXRhLkVuYWJsZUdyaWRDb21tYW5kIHx8IGRhdGEuRW5hYmxlQ3VzdG9tQWRkQ29tbWFuZCB8fCBkYXRhLkVuYWJsZUN1c3RvbVJlc2V0Q29tbWFuZFwiPlxyXG4gICAgICAgICAgICA8YXBwLXp3b3JrZmxvd2J1dHRvbnMgKm5nSWY9XCJncmlkQnRuICYmIGdyaWRCdG4uVHlwZSA9PT0gJ3p3b3JrZmxvd2J1dHRvbnMnXCIgW2RhdGFdPVwiZ3JpZEJ0blwiIFtncm91cF09XCJncm91cFwiIFtmb3JtXT1cImZvcm1cIj48L2FwcC16d29ya2Zsb3didXR0b25zPlxyXG4gICAgICAgICAgICA8YXBwLXpidXR0b25zICpuZ0lmPVwiZ3JpZEJ0biAmJiBncmlkQnRuLlR5cGUgPT09ICd6YnV0dG9ucydcIiBbZGF0YV09XCJncmlkQnRuXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXpidXR0b25zPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0J1dHRvbiAoY2xpY2spPVwic2F2ZUdyaWRTZXR0aW5ncygpXCIgKm5nSWY9XCJkYXRhLkNhY2hlSW5mbz8uRW5hYmxlU2F2ZVN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pY29uLXdpdGgtdGV4dCBrLWktc3RhclwiPjwvc3Bhbj57eyBnZXRUb29sQmFySXRlbUxhYmVsTmFtZSgnU2F2ZSBTZXR0aW5ncycpIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0J1dHRvbiAoY2xpY2spPVwicmVzdG9yZUdyaWRTZXR0aW5ncygpXCIgKm5nSWY9XCJzaG93UmVzdG9yZUdyaWRTZXR0aW5nQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pY29uLXdpdGgtdGV4dCBrLWktc3Rhci1vdXRsaW5lXCI+PC9zcGFuPnt7IGdldFRvb2xCYXJJdGVtTGFiZWxOYW1lKCdSZXN0b3JlIFNldHRpbmdzJykgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvR3JpZEFkZENvbW1hbmQgKm5nSWY9XCJkYXRhLkVuYWJsZUdyaWRDb21tYW5kXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pY29uLXdpdGgtdGV4dCBrLWktYWRkXCI+PC9zcGFuPnt7IGdldFRvb2xCYXJJdGVtTGFiZWxOYW1lKGRhdGEuQWRkQ29tbWFuZEJ1dHRvbk5hbWUgPyBkYXRhLkFkZENvbW1hbmRCdXR0b25OYW1lOiAnQWRkJykgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJncmlkQ3VzdG9tQWRkQ29tbWFuZChncm91cClcIiAqbmdJZj1cImRhdGEuRW5hYmxlQ3VzdG9tQWRkQ29tbWFuZFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaWNvbi13aXRoLXRleHQgay1pLWFkZFwiPjwvc3Bhbj57eyBnZXRUb29sQmFySXRlbUxhYmVsTmFtZShkYXRhLkFkZENvbW1hbmRCdXR0b25OYW1lID8gZGF0YS5BZGRDb21tYW5kQnV0dG9uTmFtZTogJ0FkZCcpIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0J1dHRvbiAoY2xpY2spPVwiZ3JpZEN1c3RvbVJlc2V0Q29tbWFuZChncm91cClcIiAqbmdJZj1cImRhdGEuRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pY29uLXdpdGgtdGV4dCBrLWktdHJhc2hcIj48L3NwYW4+e3sgZ2V0VG9vbEJhckl0ZW1MYWJlbE5hbWUoZGF0YS5SZXNldENvbW1hbmRCdXR0b25OYW1lID8gZGF0YS5SZXNldENvbW1hbmRCdXR0b25OYW1lOiAnUmVzZXQnKSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1jb250YWluZXJcIiAqbmdJZj1cImRhdGEuR3JpZEZpbHRlckJhckZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub3JtYWwtZmlsdGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDxhcHAtemZvcm0gY2xhc3M9XCJmaWx0ZXItZmllbGRzXCIgW2dyb3VwXT1cImZpbHRlckdyb3VwXCIgW2ZpZWxkTmFtZV09XCJkYXRhLkdyaWRGaWx0ZXJCYXJGaWVsZFwiPjwvYXBwLXpmb3JtPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItYnV0dG9uc1wiIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJzb2xpZFwiIHNpemU9XCJkZWZhdWx0XCIgc3Ryb25nPVwidHJ1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwic2VhcmNoXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1sYWJlbCBpb24tdGV4dC1jYXBpdGFsaXplXCI+e3sgZ2V0VG9vbEJhckl0ZW1MYWJlbE5hbWUoJ1NlYXJjaCcpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cIm91dGxpbmVcIiBzaXplPVwiZGVmYXVsdFwiIHN0cm9uZz1cInRydWVcIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2FuY2VsRWRpdCgpXCIgKm5nSWY9XCJkYXRhLklzU2hvd0dyaWRDYW5jZWxGaWx0ZXJCdXR0b25cIj5cclxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInRpbWVzXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cInNvbGlkXCIgc2l6ZT1cImRlZmF1bHRcIiBzdHJvbmc9XCJ0cnVlXCIgW25nQ2xhc3NdPVwiaXNTaG93QWR2RmlsdGVyID8gJ3RvZ2dsZU9uJyA6ICd0b2dnbGVPZmYnXCIgKGNsaWNrKT1cImFkdmFuY2VkU2VhcmNoKClcIiAqbmdJZj1cImRhdGEuR3JpZEFkdkZpbHRlckJhckZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJzbGlkZXJzLWhcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YXBwLXpmb3JtICpuZ0lmPVwiZGF0YS5HcmlkQWR2RmlsdGVyQmFyRmllbGRcIiBjbGFzcz1cInRvLXByZWxvYWQtdGhlLWZpZWxkc1wiIFtncm91cF09XCJhZHZmaWx0ZXJHcm91cFwiIFtmaWVsZE5hbWVdPVwiZGF0YS5HcmlkQWR2RmlsdGVyQmFyRmllbGRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2FwcC16Zm9ybT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkdi1maWx0ZXItY29udGFpbmVyXCIgKm5nSWY9XCJpc1Nob3dBZHZGaWx0ZXJcIiBbQGhpZGVBbmRTaG93QW5pbWF0aW9uXT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWR2LWZpbHRlci1zZXBlcmF0b3JcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICB7eyBnZXRUb29sQmFySXRlbUxhYmVsTmFtZSgnQWR2YW5jZWQgU2VhcmNoJykgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8YXBwLXpmb3JtIGNsYXNzPVwiYWR2ZmlsdGVyLWZpZWxkc1wiIFtncm91cF09XCJhZHZmaWx0ZXJHcm91cFwiIFtmaWVsZE5hbWVdPVwiZGF0YS5HcmlkQWR2RmlsdGVyQmFyRmllbGRcIj48L2FwcC16Zm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxrZW5kby1ncmlkLWNoZWNrYm94LWNvbHVtbiAqbmdJZj1cIiEhZGF0YS5TZWxlY3RPcHRpb25zXCIgW3dpZHRoXT1cIjYwXCIgc2hvd1NlbGVjdEFsbD1cInRydWVcIiBbY29sdW1uTWVudV09XCJ0cnVlXCIgW2xvY2tlZF09XCJjaGVja2JveENvbHVtblBpbm5lZFwiPlxyXG4gICAgICAgIDwva2VuZG8tZ3JpZC1jaGVja2JveC1jb2x1bW4+XHJcbiAgICAgICAgPGtlbmRvLWdyaWQtY29sdW1uIFtzdHlsZV09XCJnZXRHcmlkQ29sdW1uU3R5bGUoKVwiIGNsYXNzPVwiZTF0YWctc3R5bGUzXCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zO1wiIFtmaWVsZF09XCJjb2wuZmllbGRcIiBbdGl0bGVdPVwiY29sLnRpdGxlXCIgW3dpZHRoXT1cImNvbC53aWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5SZXNpemFibGVXaWR0aF09XCJjb2wubWluUmVzaXphYmxlV2lkdGhcIiBbZmlsdGVyXT1cImNvbC5maWx0ZXJcIiBbZmlsdGVyYWJsZV09XCJmaWx0ZXJhYmxlKGNvbC5lbmFibGVGaWx0ZXJpbmcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cInNvcnRhYmxlKGNvbC5lbmFibGVTb3J0aW5nKVwiIFtoZWFkZXJTdHlsZV09XCJnZXRHcmlkSGVhZGVyU3R5bGUoKVwiIGhlYWRlckNsYXNzPVwiZTF0YWctc3R5bGU0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvb3RlclN0eWxlXT1cImdldEdyaWRGb290ZXJTdHlsZSgpXCIgZm9vdGVyQ2xhc3M9XCJlMXRhZy1zdHlsZTlcIiBbaGlkZGVuXT1cImNvbC5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cImNvbC5mb3JtYXRcIiBbY2xhc3NdPVwiY29sLkNsYXNzXCIgW2xvY2tlZF09XCJsb2NrZWQoY29sKVwiIGVkaXRvcj1cIm51bWVyaWNcIiBbY29sdW1uTWVudV09XCIhY29sLmRpc2FibGVDb2x1bW5NZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VkaXRvcl09XCJjb2wuZWRpdG9yVHlwZVwiPlxyXG4gICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJjb2wuZmllbGRUeXBlID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnY3VycmVuY3knXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6bnVtZXJpYydcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtbnVtZXJpYy1maWx0ZXItY2VsbCBbc2hvd09wZXJhdG9yc109XCJkYXRhLklzU2hvd0dyaWRGaWx0ZXJPcGVyYXRvclwiIFtjb2x1bW5dPVwiY29sdW1uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImVxXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZXEtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImNvbC5maWVsZFR5cGUgPT0gJ3pkYXRlJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnenRpbWUnXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6ZGF0ZXRpbWUnXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmZpbHRlckJ5RGF0ZVJhbmdlID09PSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiIG9wZXJhdG9yPVwibHRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkYXRlLXJhbmdlLWZpbHRlci1jZWxsIFtzaG93T3BlcmF0b3JzXT1cImRhdGEuSXNTaG93R3JpZEZpbHRlck9wZXJhdG9yXCIgY2xhc3M9XCJkYXRlLXJhbmdlLWZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiIFtkYXRhXT1cImRhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8L2RhdGUtcmFuZ2UtZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1jZWxsIFtzaG93T3BlcmF0b3JzXT1cImRhdGEuSXNTaG93R3JpZEZpbHRlck9wZXJhdG9yXCIgW2NvbHVtbl09XCJjb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJsdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtZGF0ZS1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJjb2wuZmllbGRUeXBlID09PSAnY2hlY2tib3gnXCI+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1ncmlkLWJvb2xlYW4tZmlsdGVyLWNlbGwgW2NvbHVtbl09XCJjb2x1bW5cIiBbZmlsdGVyXT1cImZpbHRlclwiIG9wZXJhdG9yPVwiZXFcIj5cclxuICAgICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1ib29sZWFuLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1ncmlkLXN0cmluZy1maWx0ZXItY2VsbCBbc2hvd09wZXJhdG9yc109XCJkYXRhLklzU2hvd0dyaWRGaWx0ZXJPcGVyYXRvclwiIFtjb2x1bW5dPVwiY29sdW1uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZpbHRlclwiIG9wZXJhdG9yPVwiY29udGFpbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1jb250YWlucy1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1jb250YWlucy1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1uZXEtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLXN0YXJ0c3dpdGgtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItc3RhcnRzd2l0aC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lbmRzd2l0aC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lbmRzd2l0aC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8IS0tIEdyaWQgRWRpdCBUZW1wbGF0ZSAtLT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRFZGl0VGVtcGxhdGUgKm5nSWY9XCJkYXRhLkVuYWJsZUdyaWRDb21tYW5kIFwiIGxldC1kYXRhSXRlbT1cImRhdGFJdGVtXCIgbGV0LWNvbHVtbj1cImNvbFwiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIiBsZXQtaXNOZXc9XCJpc05ld1wiPlxyXG4gICAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1udW1lcmljdGV4dGJveCAjY2VsbEFuY2hvciBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpXCI+PC9rZW5kby1udW1lcmljdGV4dGJveD5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1wb3B1cCBbYW5jaG9yXT1cImNlbGxBbmNob3IubnVtZXJpY0lucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICEoaXNOZXcgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwQ2xhc3M9XCJrLXdpZGdldCBrLXRvb2x0aXAgay10b29sdGlwLXZhbGlkYXRpb24gay1pbnZhbGlkLW1zZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDJweDsgb3BhY2l0eTogMC41O1wiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWktd2FybmluZ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZCAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuZXJyb3JzPy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbC5OYW1lIH19IHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZCAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuZXJyb3JzPy5wYXR0ZXJuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgY29sLlZhbGlkYXRvck1lc3NhZ2UgPyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA6IFwiUGxlYXNlIGNoZWNrIHRoZSBpbnB1dCB2YWx1ZS5cIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwva2VuZG8tcG9wdXA+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLXRleHRib3ggI2NlbGxBbmNob3IgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKVwiPjwva2VuZG8tdGV4dGJveD5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1wb3B1cCBbYW5jaG9yXT1cImNlbGxBbmNob3IuaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIShpc05ldyAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBDbGFzcz1cImstd2lkZ2V0IGstdG9vbHRpcCBrLXRvb2x0aXAtdmFsaWRhdGlvbiBrLWludmFsaWQtbXNnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogMnB4OyBvcGFjaXR5OiAwLjU7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiPnt7IGNvbC5OYW1lIH19IGlzIHJlcXVpcmVkLjwvaW9uLWxhYmVsPi0tPlxyXG4gICAgICAgICAgICAgICAgICAtbFxyXG5cclxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZCAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuZXJyb3JzPy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbC5OYW1lIH19IHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZCAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuZXJyb3JzPy5wYXR0ZXJuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgY29sLlZhbGlkYXRvck1lc3NhZ2UgPyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA6IFwiUGxlYXNlIGNoZWNrIHRoZSBpbnB1dCB2YWx1ZS5cIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwva2VuZG8tcG9wdXA+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWRhdGFJdGVtIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDFweCAwO1wiICpuZ0lmPVwiIWNvbC5jbGlja2FibGVJY29ucyAmJiBjb2wuaXNFZGl0YWJsZUluR3JpZCAhPT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgW25nU3dpdGNoXT1cImNvbC5maWVsZFR5cGVcIiBbbmdDbGFzc109XCJnZXRDbGFzcyhkYXRhSXRlbSwgY29sKVwiIFtzdHlsZV09XCJnZXRDZWxsU3R5bGUoY29sLCBkYXRhSXRlbSlcIiBbYXR0ci5kYXRhLWlkXT1cImRhdGFJdGVtLklkXCIgW2F0dHIuY29sdW1uLW5hbWVdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzaG93UG9wT3Zlcihjb2wsICRldmVudClcIiAobW91c2VsZWF2ZSk9XCJjbG9zZVBvcE92ZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGUnXCIgY2xhc3M9XCJncmlkLWNlbGwtZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6IGNvbC5Gb3JtYXRPcHRpb25zID8/ICdkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3p0aW1lJ1wiIGNsYXNzPVwiZ3JpZC1jZWxsLWRhdGFcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiBjb2wuRm9ybWF0T3B0aW9ucyA/PyAnSEg6bW0nIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenNob3J0ZGF0ZSdcIiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogY29sLkZvcm1hdE9wdGlvbnMgPz8gJ01NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pkYXRldGltZSdcIiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogY29sLkZvcm1hdE9wdGlvbnMgPz8gJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenVpZGF0ZXRpbWUnXCIgY2xhc3M9XCJncmlkLWNlbGwtZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6IGNvbC5Gb3JtYXRPcHRpb25zID8/ICdkZC9NTS95eXl5IGhoOm1tOnNzIGFhJyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgbnVtYmVyIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCIgY2xhc3M9XCJncmlkLWNlbGwtZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCwgJzEuMi0yJykgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6bnVtZXJpYydcIiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgbnVtYmVyOiBnZXRGb3JtYXQoY29sKSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3VybCdcIiBzdHlsZT1cImNvbG9yOiBibHVlOyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCIgY2xhc3M9XCJncmlkLWNlbGwtZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbjogNXB4IDA7XCIgKm5nSWY9XCJjb2wuZ3JpZENlbGxSZXBsYWNlVmFsdWUgJiYgZ2V0SWNvbk5hbWUoY29sLmdyaWRDZWxsUmVwbGFjZVZhbHVlLCBkYXRhSXRlbVtjb2wuZmllbGRdKSAhPT0gJydcIj5cclxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZ2V0SWNvbk5hbWUoY29sLmdyaWRDZWxsUmVwbGFjZVZhbHVlLCBkYXRhSXRlbVtjb2wuZmllbGRdKVwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2wuZ3JpZENlbGxSZXBsYWNlVmFsdWVcIiBbbmdTd2l0Y2hdPVwiY2VsbFN0eWxlQ29uZGl0aW9uKGNvbCwgZGF0YUl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT10cnVlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZWxsU3R5bGVDb25kaXRpb25EZWZhdWx0XCIgW3N0eWxlXT1cInNldENlbGxTdHlsZUNvbmRpdGlvbihjb2wsIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+e3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyaWQtY2VsbC1kYXRhXCI+e3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCIhIWNvbC5uYXZpZ2F0ZVRvXCIgKGNsaWNrKT1cIm9uTmF2aWdhdGVUbygkZXZlbnQsIGNvbCwgZGF0YUl0ZW0sIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIiBzaXplPVwic21hbGxcIj5cclxuICAgICAgICAgICAge3sgY29sLkNsaWNrYWJsZUljb25zIH19XHJcbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PSBcImVuZFwiIG5hbWU9XCJhcnJvdy1mb3J3YXJkXCI+PC9pb24taWNvbj5cclxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiA1cHggMDtcIiAqbmdJZj1cImNvbC5pc0VkaXRhYmxlSW5HcmlkID09PSB0cnVlICYmIGlzSW5saW5lRm9ybUdyb3VwSGFzVmFsdWUoKSAmJiAhaXNJbmxpbmVFZGl0SW5wdXRGaWVsZExvYWRpbmcgJiYgIWNvbC5ncmlkQ2VsbFJlcGxhY2VWYWx1ZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNVwiXHJcbiAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3MoZGF0YUl0ZW0sIGNvbClcIiBjbGFzcz1cImUxdGFnLXN0eWxlNVwiIFtzdHlsZV09XCJnZXRDZWxsU3R5bGVGb3JJbmxpbmVFZGl0KGNvbCwgZGF0YUl0ZW0sIHJvd0luZGV4KVwiPlxyXG4gICAgICAgICAgICAgIDxhcHAtemlucHV0LWNvbnRhaW5lciBbZGF0YV09XCJnZXRJbmxpbmVGaWVsZChjb2wuZmllbGQpXCIgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZ2V0SW5saW5lRm9ybShkYXRhSXRlbSwgcm93SW5kZXgpXCIgW2NvbnRhaW5lckZpZWxkXT1cImNvbnRhaW5lckZpZWxkXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU2XCIgY2xhc3M9XCJlMXRhZy1zdHlsZTZcIj5cclxuICAgICAgICAgICAgICA8L2FwcC16aW5wdXQtY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbC5jbGlja2FibGVJY29uc1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImljb24uQ2xhc3MgPyBpY29uLkNsYXNzIDogJydcIiAqbmdJZj1cIiEhaWNvbiAmJiAoISFkYXRhSXRlbS5XRlNfU3RhdHVzQ29kZSAmJiAhIWljb24pXHJcbiAgICAgICAgICAgICAgPyBkYXRhSXRlbS5XRlNfU3RhdHVzQ29kZSAhPT0gaWNvbi5XRlNfU3RhdHVzQ29kZVxyXG4gICAgICAgICAgICAgIDogdHJ1ZTtcclxuICAgICAgICAgICAgZWxzZSBkaXNhYmxlZEJ1dHRvblwiIChjbGljayk9XCJvbkJ0bkNsaWNrKCRldmVudCwgaWNvbiwgZGF0YUl0ZW0sIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICB7e2ljb24uTmFtZSB8fCBkYXRhSXRlbVtjb2wuZmllbGRdfX0gPGZhLWljb24gW2ljb25dPVwiaWNvbi5JY29uXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggNnB4O1wiPlxyXG4gICAgICAgICAgICAgICAgPC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc2FibGVkQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPCEtLSA8c3Ryb25nPnt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfX08L3N0cm9uZz4gLS0+XHJcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ7e2RhdGFJdGVtLkRpc2NvbnRpbnVlZCA/ICdkaXNjb250aW51ZWQnIDogJ2FjdGl2ZSd9fVwiPlxyXG4gICAgICAgICAgICAgIHt7ZGF0YUl0ZW0uRGlzY29udGludWVkID8gXCJkaXNjb250aW51ZWRcIiA6IFwiYWN0aXZlXCJ9fVxyXG4gICAgICAgICAgICA8L3NwYW4+IC0tPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGb290ZXJUZW1wbGF0ZSBsZXQtY29sdW1uIGxldC1jb2x1bW5JbmRleD1cImNvbHVtbkluZGV4XCIgKm5nSWY9XCJkYXRhLkVuYWJsZUFnZ3JlZ2F0ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiA1cHggMDtcIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlN1wiIGNsYXNzPVwiZTF0YWctc3R5bGU3XCI+XHJcbiAgICAgICAgICAgICAge3tjb2wuYWdncmVnYXRlVHlwZX19XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6IGNvbC5Gb3JtYXRPcHRpb25zID8/ICdkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3p0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogY29sLkZvcm1hdE9wdGlvbnMgPz8gJ0hIOm1tJyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pzaG9ydGRhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiBjb2wuRm9ybWF0T3B0aW9ucyA/PyAnTU1NIHl5eXknIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogY29sLkZvcm1hdE9wdGlvbnMgPz8gJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenVpZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiBjb2wuRm9ybWF0T3B0aW9ucyA/PyAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBudW1iZXIgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCwgJzEuMi4yJykgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6bnVtZXJpYydcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCkgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid1cmwnXCIgc3R5bGU9XCJjb2xvcjogYmx1ZTsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlxyXG4gICAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2tlbmRvLWdyaWQtY29sdW1uPlxyXG4gICAgICAgIDxrZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uICpuZ0lmPVwiZGF0YS5FbmFibGVHcmlkQ29tbWFuZFwiIHdpZHRoPVwiMTgwXCIgW2NvbHVtbk1lbnVdPVwiZmFsc2VcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZThcIiBjbGFzcz1cImUxdGFnLXN0eWxlOFwiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZSBsZXQtaXNOZXc9XCJpc05ld1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZFNhdmVDb21tYW5kPlxyXG4gICAgICAgICAgICAgIHt7IGlzTmV3ID8gJ1NhdmUnIDogJ1VwZGF0ZScgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkQ2FuY2VsQ29tbWFuZCBbcHJpbWFyeV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAge3sgaXNOZXcgPyAnRGlzY2FyZCBjaGFuZ2VzJyA6ICdDYW5jZWwnIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZEVkaXRDb21tYW5kPlxyXG4gICAgICAgICAgICAgIHt7IFwiRWRpdFwiIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZFJlbW92ZUNvbW1hbmQ+XHJcbiAgICAgICAgICAgICAge3sgXCJSZW1vdmVcIiB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9rZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uPlxyXG4gICAgICAgIDxrZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uICpuZ0lmPVwiZGF0YS5FbmFibGVDdXN0b21SZW1vdmVDb21tYW5kXCIgd2lkdGg9XCIxODBcIiBbY29sdW1uTWVudV09XCJmYWxzZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlOFwiIGNsYXNzPVwiZTF0YWctc3R5bGU4XCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlIGxldC1pc05ldz1cImlzTmV3XCIgbGV0LWRhdGFJdGVtIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJncmlkQ3VzdG9tUmVtb3ZlQ29tbWFuZChkYXRhSXRlbSwgcm93SW5kZXgpXCIgKm5nSWY9XCJkYXRhLkVuYWJsZUN1c3RvbVJlbW92ZUNvbW1hbmRcIj5cclxuICAgICAgICAgICAgICB7eyBcIlJlbW92ZVwiIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2tlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4+XHJcbiAgICAgICAgPGtlbmRvLWdyaWQtZXhjZWwgZmlsZU5hbWU9XCJFeHBvcnQueGxzeFwiIFtmZXRjaERhdGFdPVwiYWxsUmVzdWx0c1wiPjwva2VuZG8tZ3JpZC1leGNlbD5cclxuICAgICAgPC9rZW5kby1ncmlkPlxyXG4gICAgICA8YXBwLWNvbnRleHQtbWVudSBbZGF0YV09XCJkYXRhXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiICNkYXRhaXRlbWNvbnRleHRtZW51PjwvYXBwLWNvbnRleHQtbWVudT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gZm9yIERFQyBhdXRvIHNjcm9sbGluZyAtLT5cclxuICA8ZGl2IGlkPVwiZW5kLW9mLWdyaWRcIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG4iXX0=
|