mmhglobal-dynamicform 2.5.2 → 2.6.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.
Files changed (116) hide show
  1. package/README.md +6 -0
  2. package/esm2020/lib/components/buttonfieldbase.component.mjs +7 -5
  3. package/esm2020/lib/components/containerfieldbase.component.mjs +7 -5
  4. package/esm2020/lib/components/datalistingfieldbase.component.mjs +13 -9
  5. package/esm2020/lib/components/fieldbase.component.mjs +11 -9
  6. package/esm2020/lib/components/inputfieldbase.component.mjs +10 -5
  7. package/esm2020/lib/embed-components/input-field-addons/input-field-addons.component.mjs +8 -4
  8. package/esm2020/lib/input-error-message/input-error-message.component.mjs +8 -3
  9. package/esm2020/lib/kcard/kcard.component.mjs +20 -16
  10. package/esm2020/lib/services/zcomponent.service.mjs +20 -22
  11. package/esm2020/lib/sfquerybuilder/sfquerybuilder.component.mjs +64 -17
  12. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +12 -8
  13. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +3 -6
  14. package/esm2020/lib/uibulletin/uibulletin.component.mjs +1 -1
  15. package/esm2020/lib/uicontainer/uicontainer.component.mjs +1 -1
  16. package/esm2020/lib/uicontent/uicontent.component.mjs +1 -5
  17. package/esm2020/lib/uiheader/uiheader.component.mjs +8 -12
  18. package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +3 -2
  19. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +5 -4
  20. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +5 -4
  21. package/esm2020/lib/zbullet/zbullet.component.mjs +6 -4
  22. package/esm2020/lib/zbuttons/zbuttons.component.mjs +14 -10
  23. package/esm2020/lib/zcard/zcard.component.mjs +9 -6
  24. package/esm2020/lib/zchart/zchart.component.mjs +10 -6
  25. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +14 -4
  26. package/esm2020/lib/zchip/zchip.component.mjs +16 -8
  27. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +3 -4
  28. package/esm2020/lib/zdaterange/zdaterange.component.mjs +3 -1
  29. package/esm2020/lib/zdatetime/dateParser.pipe.mjs +4 -4
  30. package/esm2020/lib/zdatetime/zdatetime.component.mjs +7 -4
  31. package/esm2020/lib/zdiv/zdiv.component.mjs +19 -11
  32. package/esm2020/lib/zform/zform.component.mjs +4 -4
  33. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +4 -4
  34. package/esm2020/lib/zgauge/zgauge.component.mjs +9 -5
  35. package/esm2020/lib/zgrid/container/zgrid-container.component.mjs +14 -6
  36. package/esm2020/lib/zgrid/zgrid.component.mjs +11 -6
  37. package/esm2020/lib/zimg/zimg.component.mjs +10 -6
  38. package/esm2020/lib/zinput-container/zinput-container.component.mjs +14 -8
  39. package/esm2020/lib/zinput-container/zinput-container.pipe.mjs +4 -4
  40. package/esm2020/lib/zlabel/zlabel.component.mjs +11 -5
  41. package/esm2020/lib/zmfb/zmfb.component.mjs +10 -6
  42. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +1 -1
  43. package/esm2020/lib/zmodal/zmodal.component.mjs +1 -1
  44. package/esm2020/lib/znumeric/znumeric.component.mjs +8 -3
  45. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +20 -16
  46. package/esm2020/lib/zprogressbar/zprogressbar.component.mjs +10 -8
  47. package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +1 -1
  48. package/esm2020/lib/zreport/zreport.component.mjs +6 -4
  49. package/esm2020/lib/zscheduler/zscheduler.component.mjs +8 -4
  50. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +17 -18
  51. package/esm2020/lib/ztab/ztab.component.mjs +15 -7
  52. package/esm2020/lib/ztext/ztext.component.mjs +9 -5
  53. package/esm2020/lib/ztextarea/ztextarea.component.mjs +10 -7
  54. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +11 -7
  55. package/esm2020/lib/ztree/ztree.component.mjs +8 -12
  56. package/esm2020/lib/ztreelist/ztreelist.component.mjs +10 -6
  57. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +1 -1
  58. package/esm2020/lib/zudf/zudf.component.mjs +10 -12
  59. package/esm2020/lib/zupload/zupload.component.mjs +5 -4
  60. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +9 -5
  61. package/fesm2015/mmhglobal-dynamicform.mjs +400 -247
  62. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
  63. package/fesm2020/mmhglobal-dynamicform.mjs +401 -247
  64. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
  65. package/lib/components/buttonfieldbase.component.d.ts +6 -2
  66. package/lib/components/containerfieldbase.component.d.ts +7 -3
  67. package/lib/components/datalistingfieldbase.component.d.ts +6 -2
  68. package/lib/components/fieldbase.component.d.ts +6 -3
  69. package/lib/components/inputfieldbase.component.d.ts +4 -1
  70. package/lib/embed-components/input-field-addons/input-field-addons.component.d.ts +6 -2
  71. package/lib/input-error-message/input-error-message.component.d.ts +6 -3
  72. package/lib/kcard/kcard.component.d.ts +6 -3
  73. package/lib/services/zcomponent.service.d.ts +9 -8
  74. package/lib/sfquerybuilder/sfquerybuilder.component.d.ts +22 -6
  75. package/lib/uiactionbutton/uiactionbutton.component.d.ts +4 -2
  76. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +1 -1
  77. package/lib/uicontent/uicontent.component.d.ts +1 -1
  78. package/lib/uiheader/uiheader.component.d.ts +7 -4
  79. package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
  80. package/lib/zbullet/zbullet.component.d.ts +2 -1
  81. package/lib/zbuttons/zbuttons.component.d.ts +5 -5
  82. package/lib/zcard/zcard.component.d.ts +3 -2
  83. package/lib/zchart/zchart.component.d.ts +4 -2
  84. package/lib/zcheckbox/zcheckbox.component.d.ts +9 -3
  85. package/lib/zchip/zchip.component.d.ts +6 -2
  86. package/lib/zcodeeditor/zcodeeditor.component.d.ts +2 -2
  87. package/lib/zdaterange/zdaterange.component.d.ts +1 -0
  88. package/lib/zdatetime/dateParser.pipe.d.ts +2 -2
  89. package/lib/zdatetime/zdatetime.component.d.ts +4 -3
  90. package/lib/zdiv/zdiv.component.d.ts +8 -2
  91. package/lib/zform/zform.component.d.ts +1 -1
  92. package/lib/zformcontrol/zformcontrol.component.d.ts +2 -2
  93. package/lib/zgauge/zgauge.component.d.ts +4 -2
  94. package/lib/zgrid/container/zgrid-container.component.d.ts +5 -2
  95. package/lib/zgrid/zgrid.component.d.ts +6 -4
  96. package/lib/zimg/zimg.component.d.ts +5 -3
  97. package/lib/zinput-container/zinput-container.component.d.ts +6 -3
  98. package/lib/zinput-container/zinput-container.pipe.d.ts +2 -2
  99. package/lib/zlabel/zlabel.component.d.ts +6 -2
  100. package/lib/zmfb/zmfb.component.d.ts +4 -2
  101. package/lib/znumeric/znumeric.component.d.ts +6 -3
  102. package/lib/zpostselectinput/zpostselectinput.component.d.ts +7 -5
  103. package/lib/zprogressbar/zprogressbar.component.d.ts +5 -3
  104. package/lib/zreport/zreport.component.d.ts +5 -2
  105. package/lib/zscheduler/zscheduler.component.d.ts +3 -1
  106. package/lib/zselectmultiple/zselectmultiple.component.d.ts +8 -7
  107. package/lib/ztab/ztab.component.d.ts +6 -2
  108. package/lib/ztext/ztext.component.d.ts +5 -3
  109. package/lib/ztextarea/ztextarea.component.d.ts +4 -3
  110. package/lib/ztexteditor/ztexteditor.component.d.ts +5 -3
  111. package/lib/ztree/ztree.component.d.ts +4 -3
  112. package/lib/ztreelist/ztreelist.component.d.ts +5 -3
  113. package/lib/zudf/zudf.component.d.ts +3 -5
  114. package/lib/zupload/zupload.component.d.ts +4 -3
  115. package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +5 -3
  116. package/package.json +1 -1
@@ -6,8 +6,8 @@ import { FormControl, FormGroup } from "@angular/forms";
6
6
  import { of, forkJoin, Subject } from 'rxjs';
7
7
  import { tap, switchMap } from 'rxjs/operators';
8
8
  /********** Component & Service **********/
9
- import { ZComponentHelper } from "mmhglobal-zcore";
10
9
  import { DataListingFieldBase } from "../components/datalistingfieldbase.component";
10
+ import { ZComponentHelper } from "mmhglobal-zcore";
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "../services/zcomponent.service";
13
13
  import * as i2 from "mmhglobal-zcore";
@@ -44,8 +44,9 @@ export class ZTreeListOptions {
44
44
  }
45
45
  }
46
46
  export class ZtreelistComponent extends DataListingFieldBase {
47
- constructor(compService, fieldService, webapiService, activatedRoute, router, authService) {
48
- super(compService);
47
+ constructor(componentService, fieldService, webapiService, activatedRoute, router, authService) {
48
+ super(componentService);
49
+ this.componentService = componentService;
49
50
  this.fieldService = fieldService;
50
51
  this.webapiService = webapiService;
51
52
  this.activatedRoute = activatedRoute;
@@ -84,6 +85,9 @@ export class ZtreelistComponent extends DataListingFieldBase {
84
85
  }
85
86
  });
86
87
  }
88
+ ngAfterViewInit() {
89
+ this.componentService.decrementComponentCounterForField(this.data);
90
+ }
87
91
  ngOnDestroy() {
88
92
  // if (this.subscription) {
89
93
  // this.subscription.unsubscribe();
@@ -520,9 +524,9 @@ export class ZtreelistComponent extends DataListingFieldBase {
520
524
  }
521
525
  }
522
526
  ZtreelistComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ZtreelistComponent, deps: [{ token: i1.ZComponentService }, { token: i2.FieldService }, { token: i2.WebApiService }, { token: i3.ActivatedRoute }, { token: i3.Router }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Component });
523
- ZtreelistComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ZtreelistComponent, selector: "app-ztreelist", usesInheritance: true, ngImport: i0, template: "<div\r\n *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n class=\"grid-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <div [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n <kendo-treelist [kendoTreeListFlatBinding]=\"dataSource\" [style]=\"componentProperties.style.style2\" class=\"desktop-grid e1tag-style2\" [idField]=\"options.idField\"\r\n [parentIdField]=\"options.parentIdField\" (cellClick)=\"cellClickHandler($event)\" [sortable]=\"options.sortable\"\r\n [resizable]=\"options.resizable\" [filterable]=\"options.filterable\" [reorderable]=\"false\" [columnMenu]=\"options.columnMenu\"\r\n [scrollable]=\"options.scrollable\" [aggregate]=\"options.aggregate\" [pageable]=\"options.pageAble\"\r\n [pageSize]=\"data.PageSize\" [isExpanded]=\"isExpanded\"\r\n (filterChange)=\"onFilterChange($event)\" (expand)=\"onExpand($event)\" (collapse)=\"onCollapse($event)\"\r\n kendoTreeListExpandable treelist>\r\n <ng-template kendoTreeListToolbarTemplate\r\n *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.Title || data.GridButtonFieldName_WF || data.GridButtonFieldName\" >\r\n <div class=\"toobar-left-item\">\r\n <fa-icon *ngIf=\"data.Icon\" class=\"gridTitleIcon\" [icon]=\"data.Icon\"></fa-icon>\r\n <kendo-label class=\"gridTitle\">{{data.Title}}</kendo-label>\r\n <button class=\"ion-activatable ripple-parent k-button refresh-btn\" (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </button>\r\n </div>\r\n <div class=\"toolbar-right-item\">\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 class=\"ion-activatable ripple-parent k-button\" kendoTreeListExcelCommand\r\n *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-download\"></span>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </button>\r\n </div>\r\n </ng-template>\r\n <!--\r\n [filterable]=\"options.filterable\"\r\n [reorderable]=\"options.resizable\"\r\n -->\r\n <ng-container *ngFor=\"let col of options.columns; index as i\">\r\n <kendo-treelist-column *ngIf=\"!col.command\" [class]=\"col.class\" [expandable]=\"i===0\" [field]=\"col.field\"\r\n [title]=\"col.title || col.field\" [width]=\"col.width || 250\" [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\" [hidden]=\"!isColumnsVisible(col.visible)\" [style]=\"getGridColumnStyle()\" class=\"e1tag-style3\"\r\n [headerStyle]=\"getGridHeaderStyle()\" headerClass=\"e1tag-style4\" [footerStyle]=\"getGridFooterStyle()\" footerClass=\"e1tag-style9\">\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 kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-numeric-filter-cell [column]=\"column\" [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-treelist-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\" [filter]=\"filter\" [field]=\"col.field\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-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 kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-treelist-filter-contains-operator></kendo-treelist-filter-contains-operator>\r\n <kendo-treelist-filter-eq-operator></kendo-treelist-filter-eq-operator>\r\n <kendo-treelist-filter-neq-operator></kendo-treelist-filter-neq-operator>\r\n <kendo-treelist-filter-startswith-operator></kendo-treelist-filter-startswith-operator>\r\n <kendo-treelist-filter-endswith-operator></kendo-treelist-filter-endswith-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <ng-template kendoTreeListCellTemplate let-dataItem let-rowIndex=\"rowIndex\" let-cellContext=\"cellContext\">\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\"\r\n *ngIf=\"!col.navigateTo && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getColClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number }} </div>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: '1.2-2' }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: getFormat(col) }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchCase=\"'zlabel'\">\r\n <div class=\"ztree-inline-block e1tag-style10\" [style]=\"componentProperties.style.style10\" [innerHTML]=\"dataItem[col.field] | htmlSanitize\"></div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field]}}\r\n </span>\r\n </div>\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\"\r\n *ngIf=\"!col.navigateTo && col.isEditableInGrid === true && isInlineEditColVisible(dataItem, col)\"\r\n [ngClass]=\"getColClass(dataItem, col)\" [style]=\"componentProperties.style.style5\" class=\"e1tag-style5\">\r\n <app-zinput-container [data]=\"getInlineField(col.field)\" [group]=\"group\"\r\n [form]=\"getInlineForm(dataItem, rowIndex)\" [containerField]=\"containerField\" [style]=\"componentProperties.style.style6\"\r\n class=\"e1tag-style6\">\r\n </app-zinput-container>\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 {{ dataItem[col.field] }}\r\n <!-- <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon> -->\r\n <fa-icon slot=\"end\" [icon]=\"'arrow-right'\"></fa-icon>\r\n </ion-button>\r\n </span>\r\n </ng-template>\r\n <ng-template *ngIf=\"col.footerTemplate\" kendoTreeListFooterTemplate let-aggregates=\"aggregates\">\r\n <div *ngIf=\"!col.navigateTo\" [ngSwitch]=\"col.fieldType\" [style]=\"componentProperties.style.style7\"\r\n [ngClass]=\"{'rightAligned': col.fieldType === 'number' || col.fieldType === 'currency'}\" class=\"e1tag-style7\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number }}\r\n </b>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number: '1.2-2' }}\r\n </b>\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-column>\r\n <kendo-treelist-command-column *ngIf=\"!!col.command\" [title]=\"col.title || col.field\"\r\n [width]=\"col.width || 250\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoTreeListCellTemplate let-cellContext=\"cellContext\">\r\n <div [ngClass]=\"col.class\">\r\n <button *ngFor=\"let col2 of col.command; index as i\" type=\"button\"\r\n [kendoTreeListEditCommand]=\"cellContext\" [title]=\"col2.text\" (click)=\"buttonClick(col2, cellContext)\"\r\n [hidden]=\"isButtonHidden(col2, cellContext)\">\r\n <fa-icon [icon]=\"col2.icon\" [style.color]=\"(!!col2.color ? [col2.color] : 'black')\">\r\n </fa-icon>\r\n <div *ngIf=\"col2.ShowLabel === undefined || col2.ShowLabel\">{{col2.text}}</div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-command-column>\r\n </ng-container>\r\n\r\n <!-- <kendo-treelist-command-column width=\"140\">\r\n <ng-template kendoTreeListCellTemplate let-isNew=\"isNew\" let-cellContext=\"cellContext\">\r\n <button [kendoTreeListAddCommand]=\"cellContext\"\r\n icon=\"filter-add-expression\" title=\"Add Child\">\r\n </button>\r\n <button [kendoTreeListCancelCommand]=\"cellContext\"\r\n icon=\"cancel\" title=\"{{ isNew ? 'Discard changes' : 'Cancel' }}\">\r\n </button>\r\n </ng-template>\r\n </kendo-treelist-command-column> -->\r\n </kendo-treelist>\r\n </div>\r\n</div>\r\n", styles: [".grid-container{margin-top:10px}.grid-container.style1{margin:10px;border:1px solid rgba(0,0,0,.08);border-radius:var(--ion-container-border-radius);padding:8px 20px 20px;background:#ffffff}:host ::ng-deep kendo-treelist.desktop-grid{border-width:0px!important;width:100%!important;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar{margin-bottom:20px;padding:5px 10px 10px;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-button{border-radius:5px;border:1px solid var(--ion-color-dark);box-shadow:2px 2px 2px #08012c;background:var(--ion-color-dark-contrast);color:var(--ion-color-dark);margin-left:10px;font-weight:600;height:36px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-button .k-icon{font-size:20px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-button:hover{background:var(--ion-color-dark-contrast-shade)}:host ::ng-deep kendo-treelist.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 .k-grid-header{font-weight:600;font-size:var(--grid-header-font-size);background:var(--ion-color-primary);color:var(--ion-color-primary-contrast)}:host ::ng-deep kendo-treelist.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,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .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{color:var(--ion-color-primary-contrast);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{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{color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.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{margin-left:4px}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr{background:rgba(var(--ion-color-primary-rgb),.12)}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-alt{background:rgba(var(--ion-color-primary-rgb),.05)}:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected>td{background:#6113ab9e;color:#fff;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{background-color:rgba(var(--ion-color-primary-rgb),.35);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager{background-color:rgba(var(--ion-color-primary-rgb),.8);color:var(--ion-color-primary-contrast);border:1px solid var(--ion-color-primary);border-top:none;border-radius:0 0 5px 5px;padding:2px 10px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link{color:var(--ion-color-primary-contrast);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{color:var(--ion-color-primary-contrast);background-color:var(--ion-color-primary-shade);background-image:linear-gradient(rgba(0,0,0,.3),rgba(0,0,0,.5))}: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{color:var(--ion-color-primary);background:var(--ion-color-primary-contrast);font-weight:600}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right;display:table!important;margin:0 0 0 auto!important}.centerAligned{text-align:center;display:table!important;margin:0 auto!important}.treelistTitle{font-size:calc(var(--grid-header-font-size) + 8px);font-weight:700;margin:auto 5px;color:var(--ion-color-dark);padding-top:2px}.treelistTitleIcon{color:var(--ion-color-dark);font-size:calc(var(--grid-header-font-size) + 2px);display:block;margin:auto 0;padding-top:4px}.refresh-btn{zoom:.8}.refresh-btn>.k-i-refresh-sm{transform:rotate(30deg);font-size:1.4rem}.toobar-left-item{flex-grow:1;display:flex}.k-i-loading{position:absolute;inset:100px 0 0;font-size:45px;background-color:#ffffff4d;color:#0f4800}.ztree-inline-block{display:inline-block}\n"], components: [{ type: i4.TreeListComponent, selector: "kendo-treelist", inputs: ["aria-label", "data", "pageSize", "height", "rowHeight", "skip", "scrollable", "sort", "trackBy", "filter", "virtualColumns", "filterable", "sortable", "pageable", "navigable", "navigatable", "autoSize", "rowClass", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "idField", "selectable", "isSelected", "columns", "fetchChildren", "hasChildren", "isExpanded"], outputs: ["selectionChange", "filterChange", "pageChange", "sortChange", "dataStateChange", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "scrollBottom", "contentScroll", "expand", "collapse", "expandStateChange"], exportAs: ["kendoTreeList"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional"], exportAs: ["kendoLabel"] }, { type: i7.IonRippleEffect, selector: "ion-ripple-effect", inputs: ["type"] }, { type: i8.ZworkflowbuttonsComponent, selector: "app-zworkflowbuttons" }, { type: i9.ZbuttonsComponent, selector: "app-zbuttons" }, { type: i4.ColumnComponent, selector: "kendo-treelist-column", inputs: ["expandable", "field", "format", "sortable", "editor", "filter", "filterable", "editable"] }, { type: i4.NumericFilterCellComponent, selector: "kendo-treelist-numeric-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i10.EqualFilterOperatorComponent, selector: "kendo-filter-eq-operator" }, { type: i10.NotEqualFilterOperatorComponent, selector: "kendo-filter-neq-operator" }, { type: i10.LessFilterOperatorComponent, selector: "kendo-filter-lt-operator" }, { type: i10.LessOrEqualToFilterOperatorComponent, selector: "kendo-filter-lte-operator" }, { type: i10.GreaterFilterOperatorComponent, selector: "kendo-filter-gt-operator" }, { type: i10.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-filter-gte-operator" }, { type: i10.IsNullFilterOperatorComponent, selector: "kendo-filter-isnull-operator" }, { type: i10.IsNotNullFilterOperatorComponent, selector: "kendo-filter-isnotnull-operator" }, { type: i11.DateRangeFilterCellComponent, selector: "date-range-filter-cell", inputs: ["filter", "field", "data"] }, { type: i4.LessFilterOperatorComponent, selector: "kendo-treelist-filter-lt-operator" }, { type: i4.LessOrEqualToFilterOperatorComponent, selector: "kendo-treelist-filter-lte-operator" }, { type: i4.GreaterFilterOperatorComponent, selector: "kendo-treelist-filter-gt-operator" }, { type: i4.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-treelist-filter-gte-operator" }, { type: i4.IsNullFilterOperatorComponent, selector: "kendo-treelist-filter-isnull-operator" }, { type: i4.IsNotNullFilterOperatorComponent, selector: "kendo-treelist-filter-isnotnull-operator" }, { type: i4.DateFilterCellComponent, selector: "kendo-treelist-date-filter-cell", inputs: ["showOperators"] }, { type: i4.StringFilterCellComponent, selector: "kendo-treelist-string-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i4.ContainsFilterOperatorComponent, selector: "kendo-treelist-filter-contains-operator" }, { type: i4.EqualFilterOperatorComponent, selector: "kendo-treelist-filter-eq-operator" }, { type: i4.NotEqualFilterOperatorComponent, selector: "kendo-treelist-filter-neq-operator" }, { type: i4.StartsWithFilterOperatorComponent, selector: "kendo-treelist-filter-startswith-operator" }, { type: i4.EndsWithFilterOperatorComponent, selector: "kendo-treelist-filter-endswith-operator" }, { type: i12.ZInputContainerComponent, selector: "app-zinput-container" }, { type: i7.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i4.CommandColumnComponent, selector: "kendo-treelist-command-column" }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.ExpandableDirective, selector: "[kendoTreeListExpandable]", inputs: ["expandedKeys", "initiallyExpanded", "expandBy"], outputs: ["expandedKeysChange"], exportAs: ["kendoTreeListExpandable"] }, { type: i4.FlatBindingDirective, selector: "[kendoTreeListFlatBinding]", inputs: ["parentIdField", "idField", "kendoTreeListFlatBinding"], exportAs: ["kendoTreeListFlatBinding"] }, { type: i4.ToolbarTemplateDirective, selector: "[kendoTreeListToolbarTemplate]", inputs: ["position"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i13.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.FilterCellTemplateDirective, selector: "[kendoTreeListFilterCellTemplate]" }, { type: i13.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i4.CellTemplateDirective, selector: "[kendoTreeListCellTemplate]" }, { type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i14.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: i4.FooterTemplateDirective, selector: "[kendoTreeListFooterTemplate]" }, { type: i4.FocusableDirective, selector: "[kendoTreeListFocusable], [kendoTreeListAddCommand], [kendoTreeListEditCommand], [kendoTreeListRemoveCommand], [kendoTreeListSaveCommand], [kendoTreeListCancelCommand] ", inputs: ["kendoTreeListFocusable", "kendoTreeListAddCommand", "kendoTreeListEditCommand", "kendoTreeListRemoveCommand", "kendoTreeListSaveCommand", "kendoTreeListCancelCommand"] }, { type: i4.EditCommandDirective, selector: "[kendoTreeListEditCommand]", inputs: ["kendoTreeListEditCommand"] }], pipes: { "date": i13.DatePipe, "number": i13.DecimalPipe, "htmlSanitize": i15.HtmlSanitizePipe, "titlecase": i13.TitleCasePipe } });
527
+ ZtreelistComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ZtreelistComponent, selector: "app-ztreelist", usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n class=\"grid-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <div [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n <kendo-treelist [kendoTreeListFlatBinding]=\"dataSource\" [style]=\"componentProperties.style.style2\" class=\"desktop-grid e1tag-style2\" [idField]=\"options.idField\"\r\n [parentIdField]=\"options.parentIdField\" (cellClick)=\"cellClickHandler($event)\" [sortable]=\"options.sortable\"\r\n [resizable]=\"options.resizable\" [filterable]=\"options.filterable\" [reorderable]=\"false\" [columnMenu]=\"options.columnMenu\"\r\n [scrollable]=\"options.scrollable\" [aggregate]=\"options.aggregate\" [pageable]=\"options.pageAble\"\r\n [pageSize]=\"data.PageSize\" [isExpanded]=\"isExpanded\"\r\n (filterChange)=\"onFilterChange($event)\" (expand)=\"onExpand($event)\" (collapse)=\"onCollapse($event)\"\r\n kendoTreeListExpandable treelist>\r\n <ng-template kendoTreeListToolbarTemplate\r\n *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.Title || data.GridButtonFieldName_WF || data.GridButtonFieldName\">\r\n <div class=\"toobar-left-item\">\r\n <fa-icon *ngIf=\"data.Icon\" class=\"gridTitleIcon\" [icon]=\"data.Icon\"></fa-icon>\r\n <kendo-label class=\"gridTitle\">{{data.Title}}</kendo-label>\r\n <button class=\"ion-activatable ripple-parent k-button refresh-btn\" (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\">\r\n <span class=\"k-icon k-i-refresh-sm\"></span>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </button>\r\n </div>\r\n <div class=\"toolbar-right-item\">\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 class=\"ion-activatable ripple-parent k-button\" kendoTreeListExcelCommand\r\n *ngIf=\"data.AllowExport\">\r\n <span class=\"k-icon k-i-download\"></span>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </button>\r\n </div>\r\n </ng-template>\r\n <!--\r\n [filterable]=\"options.filterable\"\r\n [reorderable]=\"options.resizable\"\r\n -->\r\n <ng-container *ngFor=\"let col of options.columns; index as i\">\r\n <kendo-treelist-column *ngIf=\"!col.command\" [class]=\"col.class\" [expandable]=\"i===0\" [field]=\"col.field\"\r\n [title]=\"col.title || col.field\" [width]=\"col.width || 250\" [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\" [hidden]=\"!isColumnsVisible(col.visible)\" [style]=\"getGridColumnStyle()\" class=\"e1tag-style3\"\r\n [headerStyle]=\"getGridHeaderStyle()\" headerClass=\"e1tag-style4\" [footerStyle]=\"getGridFooterStyle()\" footerClass=\"e1tag-style9\">\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 kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-numeric-filter-cell [column]=\"column\" [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-treelist-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\" [filter]=\"filter\" [field]=\"col.field\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-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 kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-treelist-filter-contains-operator></kendo-treelist-filter-contains-operator>\r\n <kendo-treelist-filter-eq-operator></kendo-treelist-filter-eq-operator>\r\n <kendo-treelist-filter-neq-operator></kendo-treelist-filter-neq-operator>\r\n <kendo-treelist-filter-startswith-operator></kendo-treelist-filter-startswith-operator>\r\n <kendo-treelist-filter-endswith-operator></kendo-treelist-filter-endswith-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <ng-template kendoTreeListCellTemplate let-dataItem let-rowIndex=\"rowIndex\" let-cellContext=\"cellContext\">\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\"\r\n *ngIf=\"!col.navigateTo && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getColClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number }} </div>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: '1.2-2' }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: getFormat(col) }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchCase=\"'zlabel'\">\r\n <div class=\"ztree-inline-block e1tag-style10\" [style]=\"componentProperties.style.style10\" [innerHTML]=\"dataItem[col.field] | htmlSanitize\"></div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field]}}\r\n </span>\r\n </div>\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\"\r\n *ngIf=\"!col.navigateTo && col.isEditableInGrid === true && isInlineEditColVisible(dataItem, col)\"\r\n [ngClass]=\"getColClass(dataItem, col)\" [style]=\"componentProperties.style.style5\" class=\"e1tag-style5\">\r\n <app-zinput-container [data]=\"getInlineField(col.field)\" [group]=\"group\"\r\n [form]=\"getInlineForm(dataItem, rowIndex)\" [containerField]=\"containerField\" [style]=\"componentProperties.style.style6\"\r\n class=\"e1tag-style6\">\r\n </app-zinput-container>\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 {{ dataItem[col.field] }}\r\n <!-- <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon> -->\r\n <fa-icon slot=\"end\" [icon]=\"'arrow-right'\"></fa-icon>\r\n </ion-button>\r\n </span>\r\n </ng-template>\r\n <ng-template *ngIf=\"col.footerTemplate\" kendoTreeListFooterTemplate let-aggregates=\"aggregates\">\r\n <div *ngIf=\"!col.navigateTo\" [ngSwitch]=\"col.fieldType\" [style]=\"componentProperties.style.style7\"\r\n [ngClass]=\"{'rightAligned': col.fieldType === 'number' || col.fieldType === 'currency'}\" class=\"e1tag-style7\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number }}\r\n </b>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number: '1.2-2' }}\r\n </b>\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-column>\r\n <kendo-treelist-command-column *ngIf=\"!!col.command\" [title]=\"col.title || col.field\"\r\n [width]=\"col.width || 250\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoTreeListCellTemplate let-cellContext=\"cellContext\">\r\n <div [ngClass]=\"col.class\">\r\n <button *ngFor=\"let col2 of col.command; index as i\" type=\"button\"\r\n [kendoTreeListEditCommand]=\"cellContext\" [title]=\"col2.text\" (click)=\"buttonClick(col2, cellContext)\"\r\n [hidden]=\"isButtonHidden(col2, cellContext)\">\r\n <fa-icon [icon]=\"col2.icon\" [style.color]=\"(!!col2.color ? [col2.color] : 'black')\">\r\n </fa-icon>\r\n <div *ngIf=\"col2.ShowLabel === undefined || col2.ShowLabel\">{{col2.text}}</div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-command-column>\r\n </ng-container>\r\n\r\n <!-- <kendo-treelist-command-column width=\"140\">\r\n <ng-template kendoTreeListCellTemplate let-isNew=\"isNew\" let-cellContext=\"cellContext\">\r\n <button [kendoTreeListAddCommand]=\"cellContext\"\r\n icon=\"filter-add-expression\" title=\"Add Child\">\r\n </button>\r\n <button [kendoTreeListCancelCommand]=\"cellContext\"\r\n icon=\"cancel\" title=\"{{ isNew ? 'Discard changes' : 'Cancel' }}\">\r\n </button>\r\n </ng-template>\r\n </kendo-treelist-command-column> -->\r\n </kendo-treelist>\r\n </div>\r\n</div>\r\n", styles: [".grid-container{margin-top:10px}.grid-container.style1{margin:10px;border:1px solid rgba(0,0,0,.08);border-radius:var(--ion-container-border-radius);padding:8px 20px 20px;background:#ffffff}:host ::ng-deep kendo-treelist.desktop-grid{border-width:0px!important;width:100%!important;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar{margin-bottom:20px;padding:5px 10px 10px;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-button{border-radius:5px;border:1px solid var(--ion-color-dark);box-shadow:2px 2px 2px #08012c;background:var(--ion-color-dark-contrast);color:var(--ion-color-dark);margin-left:10px;font-weight:600;height:36px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-button .k-icon{font-size:20px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-button:hover{background:var(--ion-color-dark-contrast-shade)}:host ::ng-deep kendo-treelist.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 .k-grid-header{font-weight:600;font-size:var(--grid-header-font-size);background:var(--ion-color-primary);color:var(--ion-color-primary-contrast)}:host ::ng-deep kendo-treelist.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,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .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{color:var(--ion-color-primary-contrast);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{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{color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.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{margin-left:4px}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr{background:rgba(var(--ion-color-primary-rgb),.12)}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-alt{background:rgba(var(--ion-color-primary-rgb),.05)}:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected>td{background:#6113ab9e;color:#fff;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{background-color:rgba(var(--ion-color-primary-rgb),.35);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager{background-color:rgba(var(--ion-color-primary-rgb),.8);color:var(--ion-color-primary-contrast);border:1px solid var(--ion-color-primary);border-top:none;border-radius:0 0 5px 5px;padding:2px 10px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link{color:var(--ion-color-primary-contrast);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{color:var(--ion-color-primary-contrast);background-color:var(--ion-color-primary-shade);background-image:linear-gradient(rgba(0,0,0,.3),rgba(0,0,0,.5))}: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{color:var(--ion-color-primary);background:var(--ion-color-primary-contrast);font-weight:600}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right;display:table!important;margin:0 0 0 auto!important}.centerAligned{text-align:center;display:table!important;margin:0 auto!important}.treelistTitle{font-size:calc(var(--grid-header-font-size) + 8px);font-weight:700;margin:auto 5px;color:var(--ion-color-dark);padding-top:2px}.treelistTitleIcon{color:var(--ion-color-dark);font-size:calc(var(--grid-header-font-size) + 2px);display:block;margin:auto 0;padding-top:4px}.refresh-btn{zoom:.8}.refresh-btn>.k-i-refresh-sm{transform:rotate(30deg);font-size:1.4rem}.toobar-left-item{flex-grow:1;display:flex}.k-i-loading{position:absolute;inset:100px 0 0;font-size:45px;background-color:#ffffff4d;color:#0f4800}.ztree-inline-block{display:inline-block}\n"], components: [{ type: i4.TreeListComponent, selector: "kendo-treelist", inputs: ["aria-label", "data", "pageSize", "height", "rowHeight", "skip", "scrollable", "sort", "trackBy", "filter", "virtualColumns", "filterable", "sortable", "pageable", "navigable", "navigatable", "autoSize", "rowClass", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "idField", "selectable", "isSelected", "columns", "fetchChildren", "hasChildren", "isExpanded"], outputs: ["selectionChange", "filterChange", "pageChange", "sortChange", "dataStateChange", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "scrollBottom", "contentScroll", "expand", "collapse", "expandStateChange"], exportAs: ["kendoTreeList"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional"], exportAs: ["kendoLabel"] }, { type: i7.IonRippleEffect, selector: "ion-ripple-effect", inputs: ["type"] }, { type: i8.ZworkflowbuttonsComponent, selector: "app-zworkflowbuttons" }, { type: i9.ZbuttonsComponent, selector: "app-zbuttons" }, { type: i4.ColumnComponent, selector: "kendo-treelist-column", inputs: ["expandable", "field", "format", "sortable", "editor", "filter", "filterable", "editable"] }, { type: i4.NumericFilterCellComponent, selector: "kendo-treelist-numeric-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i10.EqualFilterOperatorComponent, selector: "kendo-filter-eq-operator" }, { type: i10.NotEqualFilterOperatorComponent, selector: "kendo-filter-neq-operator" }, { type: i10.LessFilterOperatorComponent, selector: "kendo-filter-lt-operator" }, { type: i10.LessOrEqualToFilterOperatorComponent, selector: "kendo-filter-lte-operator" }, { type: i10.GreaterFilterOperatorComponent, selector: "kendo-filter-gt-operator" }, { type: i10.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-filter-gte-operator" }, { type: i10.IsNullFilterOperatorComponent, selector: "kendo-filter-isnull-operator" }, { type: i10.IsNotNullFilterOperatorComponent, selector: "kendo-filter-isnotnull-operator" }, { type: i11.DateRangeFilterCellComponent, selector: "date-range-filter-cell", inputs: ["filter", "field", "data"] }, { type: i4.LessFilterOperatorComponent, selector: "kendo-treelist-filter-lt-operator" }, { type: i4.LessOrEqualToFilterOperatorComponent, selector: "kendo-treelist-filter-lte-operator" }, { type: i4.GreaterFilterOperatorComponent, selector: "kendo-treelist-filter-gt-operator" }, { type: i4.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-treelist-filter-gte-operator" }, { type: i4.IsNullFilterOperatorComponent, selector: "kendo-treelist-filter-isnull-operator" }, { type: i4.IsNotNullFilterOperatorComponent, selector: "kendo-treelist-filter-isnotnull-operator" }, { type: i4.DateFilterCellComponent, selector: "kendo-treelist-date-filter-cell", inputs: ["showOperators"] }, { type: i4.StringFilterCellComponent, selector: "kendo-treelist-string-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i4.ContainsFilterOperatorComponent, selector: "kendo-treelist-filter-contains-operator" }, { type: i4.EqualFilterOperatorComponent, selector: "kendo-treelist-filter-eq-operator" }, { type: i4.NotEqualFilterOperatorComponent, selector: "kendo-treelist-filter-neq-operator" }, { type: i4.StartsWithFilterOperatorComponent, selector: "kendo-treelist-filter-startswith-operator" }, { type: i4.EndsWithFilterOperatorComponent, selector: "kendo-treelist-filter-endswith-operator" }, { type: i12.ZInputContainerComponent, selector: "app-zinput-container" }, { type: i7.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i4.CommandColumnComponent, selector: "kendo-treelist-command-column" }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.ExpandableDirective, selector: "[kendoTreeListExpandable]", inputs: ["expandedKeys", "initiallyExpanded", "expandBy"], outputs: ["expandedKeysChange"], exportAs: ["kendoTreeListExpandable"] }, { type: i4.FlatBindingDirective, selector: "[kendoTreeListFlatBinding]", inputs: ["parentIdField", "idField", "kendoTreeListFlatBinding"], exportAs: ["kendoTreeListFlatBinding"] }, { type: i4.ToolbarTemplateDirective, selector: "[kendoTreeListToolbarTemplate]", inputs: ["position"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i13.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.FilterCellTemplateDirective, selector: "[kendoTreeListFilterCellTemplate]" }, { type: i13.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i4.CellTemplateDirective, selector: "[kendoTreeListCellTemplate]" }, { type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i14.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: i4.FooterTemplateDirective, selector: "[kendoTreeListFooterTemplate]" }, { type: i4.FocusableDirective, selector: "[kendoTreeListFocusable], [kendoTreeListAddCommand], [kendoTreeListEditCommand], [kendoTreeListRemoveCommand], [kendoTreeListSaveCommand], [kendoTreeListCancelCommand] ", inputs: ["kendoTreeListFocusable", "kendoTreeListAddCommand", "kendoTreeListEditCommand", "kendoTreeListRemoveCommand", "kendoTreeListSaveCommand", "kendoTreeListCancelCommand"] }, { type: i4.EditCommandDirective, selector: "[kendoTreeListEditCommand]", inputs: ["kendoTreeListEditCommand"] }], pipes: { "date": i13.DatePipe, "number": i13.DecimalPipe, "htmlSanitize": i15.HtmlSanitizePipe, "titlecase": i13.TitleCasePipe } });
524
528
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ZtreelistComponent, decorators: [{
525
529
  type: Component,
526
- args: [{ selector: "app-ztreelist", template: "<div\r\n *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n class=\"grid-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <div [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n <kendo-treelist [kendoTreeListFlatBinding]=\"dataSource\" [style]=\"componentProperties.style.style2\" class=\"desktop-grid e1tag-style2\" [idField]=\"options.idField\"\r\n [parentIdField]=\"options.parentIdField\" (cellClick)=\"cellClickHandler($event)\" [sortable]=\"options.sortable\"\r\n [resizable]=\"options.resizable\" [filterable]=\"options.filterable\" [reorderable]=\"false\" [columnMenu]=\"options.columnMenu\"\r\n [scrollable]=\"options.scrollable\" [aggregate]=\"options.aggregate\" [pageable]=\"options.pageAble\"\r\n [pageSize]=\"data.PageSize\" [isExpanded]=\"isExpanded\"\r\n (filterChange)=\"onFilterChange($event)\" (expand)=\"onExpand($event)\" (collapse)=\"onCollapse($event)\"\r\n kendoTreeListExpandable treelist>\r\n <ng-template kendoTreeListToolbarTemplate\r\n *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.Title || data.GridButtonFieldName_WF || data.GridButtonFieldName\" >\r\n <div class=\"toobar-left-item\">\r\n <fa-icon *ngIf=\"data.Icon\" class=\"gridTitleIcon\" [icon]=\"data.Icon\"></fa-icon>\r\n <kendo-label class=\"gridTitle\">{{data.Title}}</kendo-label>\r\n <button class=\"ion-activatable ripple-parent k-button refresh-btn\" (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </button>\r\n </div>\r\n <div class=\"toolbar-right-item\">\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 class=\"ion-activatable ripple-parent k-button\" kendoTreeListExcelCommand\r\n *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-download\"></span>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </button>\r\n </div>\r\n </ng-template>\r\n <!--\r\n [filterable]=\"options.filterable\"\r\n [reorderable]=\"options.resizable\"\r\n -->\r\n <ng-container *ngFor=\"let col of options.columns; index as i\">\r\n <kendo-treelist-column *ngIf=\"!col.command\" [class]=\"col.class\" [expandable]=\"i===0\" [field]=\"col.field\"\r\n [title]=\"col.title || col.field\" [width]=\"col.width || 250\" [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\" [hidden]=\"!isColumnsVisible(col.visible)\" [style]=\"getGridColumnStyle()\" class=\"e1tag-style3\"\r\n [headerStyle]=\"getGridHeaderStyle()\" headerClass=\"e1tag-style4\" [footerStyle]=\"getGridFooterStyle()\" footerClass=\"e1tag-style9\">\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 kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-numeric-filter-cell [column]=\"column\" [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-treelist-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\" [filter]=\"filter\" [field]=\"col.field\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-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 kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-treelist-filter-contains-operator></kendo-treelist-filter-contains-operator>\r\n <kendo-treelist-filter-eq-operator></kendo-treelist-filter-eq-operator>\r\n <kendo-treelist-filter-neq-operator></kendo-treelist-filter-neq-operator>\r\n <kendo-treelist-filter-startswith-operator></kendo-treelist-filter-startswith-operator>\r\n <kendo-treelist-filter-endswith-operator></kendo-treelist-filter-endswith-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <ng-template kendoTreeListCellTemplate let-dataItem let-rowIndex=\"rowIndex\" let-cellContext=\"cellContext\">\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\"\r\n *ngIf=\"!col.navigateTo && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getColClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number }} </div>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: '1.2-2' }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: getFormat(col) }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchCase=\"'zlabel'\">\r\n <div class=\"ztree-inline-block e1tag-style10\" [style]=\"componentProperties.style.style10\" [innerHTML]=\"dataItem[col.field] | htmlSanitize\"></div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field]}}\r\n </span>\r\n </div>\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\"\r\n *ngIf=\"!col.navigateTo && col.isEditableInGrid === true && isInlineEditColVisible(dataItem, col)\"\r\n [ngClass]=\"getColClass(dataItem, col)\" [style]=\"componentProperties.style.style5\" class=\"e1tag-style5\">\r\n <app-zinput-container [data]=\"getInlineField(col.field)\" [group]=\"group\"\r\n [form]=\"getInlineForm(dataItem, rowIndex)\" [containerField]=\"containerField\" [style]=\"componentProperties.style.style6\"\r\n class=\"e1tag-style6\">\r\n </app-zinput-container>\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 {{ dataItem[col.field] }}\r\n <!-- <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon> -->\r\n <fa-icon slot=\"end\" [icon]=\"'arrow-right'\"></fa-icon>\r\n </ion-button>\r\n </span>\r\n </ng-template>\r\n <ng-template *ngIf=\"col.footerTemplate\" kendoTreeListFooterTemplate let-aggregates=\"aggregates\">\r\n <div *ngIf=\"!col.navigateTo\" [ngSwitch]=\"col.fieldType\" [style]=\"componentProperties.style.style7\"\r\n [ngClass]=\"{'rightAligned': col.fieldType === 'number' || col.fieldType === 'currency'}\" class=\"e1tag-style7\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number }}\r\n </b>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number: '1.2-2' }}\r\n </b>\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-column>\r\n <kendo-treelist-command-column *ngIf=\"!!col.command\" [title]=\"col.title || col.field\"\r\n [width]=\"col.width || 250\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoTreeListCellTemplate let-cellContext=\"cellContext\">\r\n <div [ngClass]=\"col.class\">\r\n <button *ngFor=\"let col2 of col.command; index as i\" type=\"button\"\r\n [kendoTreeListEditCommand]=\"cellContext\" [title]=\"col2.text\" (click)=\"buttonClick(col2, cellContext)\"\r\n [hidden]=\"isButtonHidden(col2, cellContext)\">\r\n <fa-icon [icon]=\"col2.icon\" [style.color]=\"(!!col2.color ? [col2.color] : 'black')\">\r\n </fa-icon>\r\n <div *ngIf=\"col2.ShowLabel === undefined || col2.ShowLabel\">{{col2.text}}</div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-command-column>\r\n </ng-container>\r\n\r\n <!-- <kendo-treelist-command-column width=\"140\">\r\n <ng-template kendoTreeListCellTemplate let-isNew=\"isNew\" let-cellContext=\"cellContext\">\r\n <button [kendoTreeListAddCommand]=\"cellContext\"\r\n icon=\"filter-add-expression\" title=\"Add Child\">\r\n </button>\r\n <button [kendoTreeListCancelCommand]=\"cellContext\"\r\n icon=\"cancel\" title=\"{{ isNew ? 'Discard changes' : 'Cancel' }}\">\r\n </button>\r\n </ng-template>\r\n </kendo-treelist-command-column> -->\r\n </kendo-treelist>\r\n </div>\r\n</div>\r\n", styles: [".grid-container{margin-top:10px}.grid-container.style1{margin:10px;border:1px solid rgba(0,0,0,.08);border-radius:var(--ion-container-border-radius);padding:8px 20px 20px;background:#ffffff}:host ::ng-deep kendo-treelist.desktop-grid{border-width:0px!important;width:100%!important;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar{margin-bottom:20px;padding:5px 10px 10px;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-button{border-radius:5px;border:1px solid var(--ion-color-dark);box-shadow:2px 2px 2px #08012c;background:var(--ion-color-dark-contrast);color:var(--ion-color-dark);margin-left:10px;font-weight:600;height:36px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-button .k-icon{font-size:20px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-button:hover{background:var(--ion-color-dark-contrast-shade)}:host ::ng-deep kendo-treelist.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 .k-grid-header{font-weight:600;font-size:var(--grid-header-font-size);background:var(--ion-color-primary);color:var(--ion-color-primary-contrast)}:host ::ng-deep kendo-treelist.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,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .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{color:var(--ion-color-primary-contrast);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{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{color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.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{margin-left:4px}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr{background:rgba(var(--ion-color-primary-rgb),.12)}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-alt{background:rgba(var(--ion-color-primary-rgb),.05)}:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected>td{background:#6113ab9e;color:#fff;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{background-color:rgba(var(--ion-color-primary-rgb),.35);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager{background-color:rgba(var(--ion-color-primary-rgb),.8);color:var(--ion-color-primary-contrast);border:1px solid var(--ion-color-primary);border-top:none;border-radius:0 0 5px 5px;padding:2px 10px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link{color:var(--ion-color-primary-contrast);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{color:var(--ion-color-primary-contrast);background-color:var(--ion-color-primary-shade);background-image:linear-gradient(rgba(0,0,0,.3),rgba(0,0,0,.5))}: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{color:var(--ion-color-primary);background:var(--ion-color-primary-contrast);font-weight:600}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right;display:table!important;margin:0 0 0 auto!important}.centerAligned{text-align:center;display:table!important;margin:0 auto!important}.treelistTitle{font-size:calc(var(--grid-header-font-size) + 8px);font-weight:700;margin:auto 5px;color:var(--ion-color-dark);padding-top:2px}.treelistTitleIcon{color:var(--ion-color-dark);font-size:calc(var(--grid-header-font-size) + 2px);display:block;margin:auto 0;padding-top:4px}.refresh-btn{zoom:.8}.refresh-btn>.k-i-refresh-sm{transform:rotate(30deg);font-size:1.4rem}.toobar-left-item{flex-grow:1;display:flex}.k-i-loading{position:absolute;inset:100px 0 0;font-size:45px;background-color:#ffffff4d;color:#0f4800}.ztree-inline-block{display:inline-block}\n"] }]
530
+ args: [{ selector: "app-ztreelist", template: "<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n class=\"grid-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <div [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n <kendo-treelist [kendoTreeListFlatBinding]=\"dataSource\" [style]=\"componentProperties.style.style2\" class=\"desktop-grid e1tag-style2\" [idField]=\"options.idField\"\r\n [parentIdField]=\"options.parentIdField\" (cellClick)=\"cellClickHandler($event)\" [sortable]=\"options.sortable\"\r\n [resizable]=\"options.resizable\" [filterable]=\"options.filterable\" [reorderable]=\"false\" [columnMenu]=\"options.columnMenu\"\r\n [scrollable]=\"options.scrollable\" [aggregate]=\"options.aggregate\" [pageable]=\"options.pageAble\"\r\n [pageSize]=\"data.PageSize\" [isExpanded]=\"isExpanded\"\r\n (filterChange)=\"onFilterChange($event)\" (expand)=\"onExpand($event)\" (collapse)=\"onCollapse($event)\"\r\n kendoTreeListExpandable treelist>\r\n <ng-template kendoTreeListToolbarTemplate\r\n *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.Title || data.GridButtonFieldName_WF || data.GridButtonFieldName\">\r\n <div class=\"toobar-left-item\">\r\n <fa-icon *ngIf=\"data.Icon\" class=\"gridTitleIcon\" [icon]=\"data.Icon\"></fa-icon>\r\n <kendo-label class=\"gridTitle\">{{data.Title}}</kendo-label>\r\n <button class=\"ion-activatable ripple-parent k-button refresh-btn\" (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\">\r\n <span class=\"k-icon k-i-refresh-sm\"></span>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </button>\r\n </div>\r\n <div class=\"toolbar-right-item\">\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 class=\"ion-activatable ripple-parent k-button\" kendoTreeListExcelCommand\r\n *ngIf=\"data.AllowExport\">\r\n <span class=\"k-icon k-i-download\"></span>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </button>\r\n </div>\r\n </ng-template>\r\n <!--\r\n [filterable]=\"options.filterable\"\r\n [reorderable]=\"options.resizable\"\r\n -->\r\n <ng-container *ngFor=\"let col of options.columns; index as i\">\r\n <kendo-treelist-column *ngIf=\"!col.command\" [class]=\"col.class\" [expandable]=\"i===0\" [field]=\"col.field\"\r\n [title]=\"col.title || col.field\" [width]=\"col.width || 250\" [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\" [hidden]=\"!isColumnsVisible(col.visible)\" [style]=\"getGridColumnStyle()\" class=\"e1tag-style3\"\r\n [headerStyle]=\"getGridHeaderStyle()\" headerClass=\"e1tag-style4\" [footerStyle]=\"getGridFooterStyle()\" footerClass=\"e1tag-style9\">\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 kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-numeric-filter-cell [column]=\"column\" [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-treelist-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\" [filter]=\"filter\" [field]=\"col.field\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-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 kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-treelist-filter-contains-operator></kendo-treelist-filter-contains-operator>\r\n <kendo-treelist-filter-eq-operator></kendo-treelist-filter-eq-operator>\r\n <kendo-treelist-filter-neq-operator></kendo-treelist-filter-neq-operator>\r\n <kendo-treelist-filter-startswith-operator></kendo-treelist-filter-startswith-operator>\r\n <kendo-treelist-filter-endswith-operator></kendo-treelist-filter-endswith-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <ng-template kendoTreeListCellTemplate let-dataItem let-rowIndex=\"rowIndex\" let-cellContext=\"cellContext\">\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\"\r\n *ngIf=\"!col.navigateTo && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getColClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number }} </div>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: '1.2-2' }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: getFormat(col) }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchCase=\"'zlabel'\">\r\n <div class=\"ztree-inline-block e1tag-style10\" [style]=\"componentProperties.style.style10\" [innerHTML]=\"dataItem[col.field] | htmlSanitize\"></div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field]}}\r\n </span>\r\n </div>\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\"\r\n *ngIf=\"!col.navigateTo && col.isEditableInGrid === true && isInlineEditColVisible(dataItem, col)\"\r\n [ngClass]=\"getColClass(dataItem, col)\" [style]=\"componentProperties.style.style5\" class=\"e1tag-style5\">\r\n <app-zinput-container [data]=\"getInlineField(col.field)\" [group]=\"group\"\r\n [form]=\"getInlineForm(dataItem, rowIndex)\" [containerField]=\"containerField\" [style]=\"componentProperties.style.style6\"\r\n class=\"e1tag-style6\">\r\n </app-zinput-container>\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 {{ dataItem[col.field] }}\r\n <!-- <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon> -->\r\n <fa-icon slot=\"end\" [icon]=\"'arrow-right'\"></fa-icon>\r\n </ion-button>\r\n </span>\r\n </ng-template>\r\n <ng-template *ngIf=\"col.footerTemplate\" kendoTreeListFooterTemplate let-aggregates=\"aggregates\">\r\n <div *ngIf=\"!col.navigateTo\" [ngSwitch]=\"col.fieldType\" [style]=\"componentProperties.style.style7\"\r\n [ngClass]=\"{'rightAligned': col.fieldType === 'number' || col.fieldType === 'currency'}\" class=\"e1tag-style7\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number }}\r\n </b>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number: '1.2-2' }}\r\n </b>\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-column>\r\n <kendo-treelist-command-column *ngIf=\"!!col.command\" [title]=\"col.title || col.field\"\r\n [width]=\"col.width || 250\" [style]=\"componentProperties.style.style8\" class=\"e1tag-style8\">\r\n <ng-template kendoTreeListCellTemplate let-cellContext=\"cellContext\">\r\n <div [ngClass]=\"col.class\">\r\n <button *ngFor=\"let col2 of col.command; index as i\" type=\"button\"\r\n [kendoTreeListEditCommand]=\"cellContext\" [title]=\"col2.text\" (click)=\"buttonClick(col2, cellContext)\"\r\n [hidden]=\"isButtonHidden(col2, cellContext)\">\r\n <fa-icon [icon]=\"col2.icon\" [style.color]=\"(!!col2.color ? [col2.color] : 'black')\">\r\n </fa-icon>\r\n <div *ngIf=\"col2.ShowLabel === undefined || col2.ShowLabel\">{{col2.text}}</div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-command-column>\r\n </ng-container>\r\n\r\n <!-- <kendo-treelist-command-column width=\"140\">\r\n <ng-template kendoTreeListCellTemplate let-isNew=\"isNew\" let-cellContext=\"cellContext\">\r\n <button [kendoTreeListAddCommand]=\"cellContext\"\r\n icon=\"filter-add-expression\" title=\"Add Child\">\r\n </button>\r\n <button [kendoTreeListCancelCommand]=\"cellContext\"\r\n icon=\"cancel\" title=\"{{ isNew ? 'Discard changes' : 'Cancel' }}\">\r\n </button>\r\n </ng-template>\r\n </kendo-treelist-command-column> -->\r\n </kendo-treelist>\r\n </div>\r\n</div>\r\n", styles: [".grid-container{margin-top:10px}.grid-container.style1{margin:10px;border:1px solid rgba(0,0,0,.08);border-radius:var(--ion-container-border-radius);padding:8px 20px 20px;background:#ffffff}:host ::ng-deep kendo-treelist.desktop-grid{border-width:0px!important;width:100%!important;background:transparent}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar{margin-bottom:20px;padding:5px 10px 10px;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-button{border-radius:5px;border:1px solid var(--ion-color-dark);box-shadow:2px 2px 2px #08012c;background:var(--ion-color-dark-contrast);color:var(--ion-color-dark);margin-left:10px;font-weight:600;height:36px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-button .k-icon{font-size:20px}:host ::ng-deep kendo-treelist.desktop-grid .k-toolbar .k-button:hover{background:var(--ion-color-dark-contrast-shade)}:host ::ng-deep kendo-treelist.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 .k-grid-header{font-weight:600;font-size:var(--grid-header-font-size);background:var(--ion-color-primary);color:var(--ion-color-primary-contrast)}:host ::ng-deep kendo-treelist.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,:host ::ng-deep kendo-treelist.desktop-grid .k-grid-header .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{color:var(--ion-color-primary-contrast);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{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{color:var(--ion-color-primary-shade)}:host ::ng-deep kendo-treelist.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{margin-left:4px}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr{background:rgba(var(--ion-color-primary-rgb),.12)}:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-alt{background:rgba(var(--ion-color-primary-rgb),.05)}:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-selected>td,:host ::ng-deep kendo-treelist.desktop-grid tbody>td.k-state-selected,:host ::ng-deep kendo-treelist.desktop-grid tbody>tr.k-state-selected>td{background:#6113ab9e;color:#fff;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{background-color:rgba(var(--ion-color-primary-rgb),.35);font-weight:600}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager{background-color:rgba(var(--ion-color-primary-rgb),.8);color:var(--ion-color-primary-contrast);border:1px solid var(--ion-color-primary);border-top:none;border-radius:0 0 5px 5px;padding:2px 10px}:host ::ng-deep kendo-treelist.desktop-grid .k-grid-pager .k-pager-numbers .k-link{color:var(--ion-color-primary-contrast);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{color:var(--ion-color-primary-contrast);background-color:var(--ion-color-primary-shade);background-image:linear-gradient(rgba(0,0,0,.3),rgba(0,0,0,.5))}: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{color:var(--ion-color-primary);background:var(--ion-color-primary-contrast);font-weight:600}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right;display:table!important;margin:0 0 0 auto!important}.centerAligned{text-align:center;display:table!important;margin:0 auto!important}.treelistTitle{font-size:calc(var(--grid-header-font-size) + 8px);font-weight:700;margin:auto 5px;color:var(--ion-color-dark);padding-top:2px}.treelistTitleIcon{color:var(--ion-color-dark);font-size:calc(var(--grid-header-font-size) + 2px);display:block;margin:auto 0;padding-top:4px}.refresh-btn{zoom:.8}.refresh-btn>.k-i-refresh-sm{transform:rotate(30deg);font-size:1.4rem}.toobar-left-item{flex-grow:1;display:flex}.k-i-loading{position:absolute;inset:100px 0 0;font-size:45px;background-color:#ffffff4d;color:#0f4800}.ztree-inline-block{display:inline-block}\n"] }]
527
531
  }], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.FieldService }, { type: i2.WebApiService }, { type: i3.ActivatedRoute }, { type: i3.Router }, { type: i2.AuthService }]; } });
528
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRyZWVsaXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3p0cmVlbGlzdC96dHJlZWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRyZWVsaXN0L3p0cmVlbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4RCw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUFjLGdCQUFnQixFQUEyRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhJLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCcEYsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixZQUNTLFFBQWtCLEVBQ2xCLFNBQW1CLEVBQ25CLFVBQW9CLEVBQ3BCLFdBQXFCLEVBQ3JCLFVBQW9CLEVBQ3BCLFVBQXVCLEVBQ3ZCLE9BQWlCLEVBQ2pCLFFBQWtCLEVBQ2xCLFVBQW1CLEVBQ25CLFNBQWUsRUFDZixPQUFnQixFQUNoQixhQUFzQixFQUN0QixPQUFvQixFQUNwQixTQUFlLEVBQ2YsUUFBYztRQWRkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBVTtR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Q3pEL0IsaXJhQWlNQTsyRkR4SWEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBvZiwgZm9ya0pvaW4sIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ2VsbENsaWNrRXZlbnQsIEV4cGFuZEV2ZW50LCBTY3JvbGxNb2RlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdHJlZWxpc3QnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpGaWVsZCwgRmllbGRTZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBBdXRoU2VydmljZSB9IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERhdGFMaXN0aW5nRmllbGRCYXNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZGF0YWxpc3RpbmdmaWVsZGJhc2UuY29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFpUcmVlTGlzdENvbHVtbiB7XHJcbiAgZmllbGQ6IHN0cmluZztcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgdmlzaWJsZTogYm9vbGVhbiB8IGFueTtcclxuICBmaWVsZFR5cGU6IHN0cmluZztcclxuICBuYXZpZ2F0ZVRvOiBzdHJpbmc7XHJcbiAgY29tbWFuZDogYW55O1xyXG4gIGNsYXNzOiBhbnk7XHJcbiAgZm9vdGVyVGVtcGxhdGU6IGJvb2xlYW47XHJcbiAgYWdncmVnYXRlVHlwZTogc3RyaW5nO1xyXG4gIGFnZ3JlZ2F0ZVRpdGxlOiBzdHJpbmc7XHJcbiAgaWNvbk9ubHk/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgWlRyZWVMaXN0T3B0aW9ucyB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgc29ydGFibGU/OiBib29sZWFuLFxyXG4gICAgcHVibGljIHJlc2l6YWJsZT86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgZmlsdGVyYWJsZT86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgcmVvcmRlcmFibGU/OiBib29sZWFuLFxyXG4gICAgcHVibGljIGNvbHVtbk1lbnU/OiBib29sZWFuLFxyXG4gICAgcHVibGljIHNjcm9sbGFibGU/OiBTY3JvbGxNb2RlLFxyXG4gICAgcHVibGljIHJlZnJlc2g/OiBib29sZWFuLFxyXG4gICAgcHVibGljIGF1dG9CaW5kPzogYm9vbGVhbixcclxuICAgIHB1YmxpYyBkYXRhU291cmNlPzogc3RyaW5nLFxyXG4gICAgcHVibGljIGRhdGFCb3VuZD86IGFueSxcclxuICAgIHB1YmxpYyBpZEZpZWxkPzogc3RyaW5nLFxyXG4gICAgcHVibGljIHBhcmVudElkRmllbGQ/OiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgY29sdW1ucz86IEFycmF5PGFueT4sXHJcbiAgICBwdWJsaWMgYWdncmVnYXRlPzogYW55LFxyXG4gICAgcHVibGljIHBhZ2VBYmxlPzogYW55LFxyXG4gICkgeyB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC16dHJlZWxpc3RcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3p0cmVlbGlzdC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96dHJlZWxpc3QuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBadHJlZWxpc3RDb21wb25lbnQgZXh0ZW5kcyBEYXRhTGlzdGluZ0ZpZWxkQmFzZSBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvLyBAVmlld0NoaWxkKFpUcmVlTGlzdEJpbmRpbmdEaXJlY3RpdmUsIHsgc3RhdGljOiBmYWxzZSB9KSB6dHJlZWxpc3Q6IFpUcmVlTGlzdEJpbmRpbmdEaXJlY3RpdmU7XHJcbiAgenRyZWVsaXN0OiBhbnkgPSBudWxsO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGRhdGFTb3VyY2U6IGFueTtcclxuICBpZEZpZWxkID0gXCJJZFwiO1xyXG4gIHBhcmVudElkRmllbGQgPSBcIlBhcmVudElkXCI7XHJcbiAgb3B0aW9uczogWlRyZWVMaXN0T3B0aW9ucyA9IG5ldyBaVHJlZUxpc3RPcHRpb25zKCk7XHJcbiAgcHVibGljIGdyaWRCdG47XHJcbiAgZmllbGRncmlkQ29sVmlzaWJsZTogYW55W107XHJcbiAgcGFnZVNpemUgPSAyMDtcclxuICBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzOiB7fTtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW47XHJcbiAgdHJlZWxpc3RTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHJpdmF0ZSBleHBhbmRlZElkczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb21wU2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3ZWJhcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UpIHtcclxuICAgIHN1cGVyKGNvbXBTZXJ2aWNlKTtcclxuICB9XHJcbiAgLy8gbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gIC8vICAgLy8gdGhpcy56dHJlZWxpc3Quc2V0T3B0aW9ucyh7ZGF0YTogdGhpcy5kYXRhLCBncm91cDogdGhpcy5ncm91cH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICBzdXBlci5pbml0Q29tcG9uZW50KCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5zZXR1cEdyaWRCdXR0b25zKCk7XHJcblxyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5kYXRhLlBhZ2VTaXplIHx8IDIwO1xyXG4gICAgICBpZiAoISF0aGlzLmRhdGEuT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuc2V0TG9jYWxPcHRpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZXRGaWVsZEVsZW1lbnRPcHRpb25zKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgIC8vICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRhID0gKGdEYXRhOiBhbnkpID0+IHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGdEYXRhO1xyXG4gICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHNGb3JJbmxpbmVFZGl0KGdEYXRhKTtcclxuICAgIHRoaXMuc2V0RGVmYXVsdEV4cGFuZGFibGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0J1dHRvbkhpZGRlbihjb2w6IGFueSwgY2VsbENvbnRhaW46IGFueSkge1xyXG4gICAgaWYgKGNvbC52aXNpYmxlKSB7XHJcbiAgICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgY29sLnZpc2libGUsIGNlbGxDb250YWluLnZpZXdJdGVtLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29sLmhpZGRlblBhcmFtIHx8IGNvbC5oaWRkZW5WYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjZWxsQ29udGFpbi52aWV3SXRlbS5kYXRhW2NvbC5oaWRkZW5QYXJhbV0gPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNlbGxDb250YWluLnZpZXdJdGVtLmRhdGFbY29sLmhpZGRlblBhcmFtXSA9PT0gY29sLmhpZGRlblZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYnV0dG9uQ2xpY2soYnV0dG9uOiBhbnksIGNlbGxDb250ZXh0OiBhbnkpIHtcclxuICAgIGlmIChidXR0b24uZWRpdCkge1xyXG4gICAgICBidXR0b24uZWRpdChjZWxsQ29udGV4dCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJidXR0b25DbGlja1wiLFxyXG4gICAgICAgIHRhcmdldDogYnV0dG9uLkNsaWNrRXZlbnQsXHJcbiAgICAgICAgZGF0YTogY2VsbENvbnRleHRcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTmF2aWdhdGVUbyhldmVudDogYW55LCBjb2xTZXR0aW5nOiBhbnksIHJvd0RhdGE6IGFueSwgY2VsbERhdGE6IHN0cmluZykge1xyXG4gICAgLy8gZGVidWdnZXI7XHJcbiAgICAvLyBjb25zdCBuID0gY29sU2V0dGluZy5uYXZpZ2F0ZVRvLnJlcGxhY2UoJy86aWQnLCBjZWxsRGF0YSk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgdHlwZTogJ3pncmlkLW9uTmF2aWdhdGVUbycsXHJcbiAgICAgIHRhcmdldDogY29sU2V0dGluZy5uYXZpZ2F0ZVRvLFxyXG4gICAgICBkYXRhOiBjZWxsRGF0YVxyXG4gICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQ29sdW1uc1Zpc2libGUoZmllbGRFeHByKSB7XHJcbiAgICBpZiAoZmllbGRFeHByICE9PSBmYWxzZSAmJiAhZmllbGRFeHByKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBmaWVsZEV4cHIpO1xyXG4gICAgcmV0dXJuIHY7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldExvY2FsT3B0aW9ucygpIHtcclxuICAgIGNvbnN0IG9wdGlvbnM6IFpUcmVlTGlzdE9wdGlvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgIHRoaXMuZGF0YS5PcHRpb25zLFxyXG4gICAgICB0aGlzLmdyb3VwXHJcbiAgICApO1xyXG4gICAgaWYgKCFvcHRpb25zKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIk5vIGluaXRpYWxpc2UgZm9yIEZpZWxkLk9wdGlvbnM6IFwiLCB0aGlzLmRhdGEuT3B0aW9ucyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLm9wdGlvbnMuaWRGaWVsZCA9IHRoaXMub3B0aW9ucy5pZEZpZWxkIHx8IHRoaXMuaWRGaWVsZDtcclxuICAgIHRoaXMub3B0aW9ucy5wYXJlbnRJZEZpZWxkID0gdGhpcy5vcHRpb25zLnBhcmVudElkRmllbGQgfHwgdGhpcy5wYXJlbnRJZEZpZWxkO1xyXG5cclxuICAgIHN1cGVyLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcih0aGlzLm9wdGlvbnMuY29sdW1ucykuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsgfSk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZGF0YVNvdXJjZSAmJlxyXG4gICAgICB0eXBlb2YgdGhpcy5vcHRpb25zLmRhdGFTb3VyY2UgPT09IFwic3RyaW5nXCJcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGFTb3VyY2Uuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLm9wdGlvbnMuZGF0YVNvdXJjZSwgdGhpcy5ncm91cCk7XHJcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RXhwYW5kYWJsZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5kYXRhLk5hbWUgKyBcIiAtIGhhcyBpbnZhbGlkIGRhdGFTb3VyY2VcIik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5kYXRhLk5hbWUgKyBcIiAtIGRhdGFTb3VyY2UgcHJvcGVydHkgaXMgbm90IGRlY2xhcmVkLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RmllbGRFbGVtZW50T3B0aW9ucygpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zb3J0YWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnMucmVzaXphYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5maWx0ZXJhYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5yZXNpemFibGUgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbHVtbk1lbnUgPSB0aGlzLmRhdGEuRGlzYWJsZUdyaWRDb2x1bW5NZW51ID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLnNjcm9sbGFibGUgPSB0aGlzLmRhdGFbJ1Njcm9sbE1vZGUnXSA/IHRoaXMuZGF0YVsnU2Nyb2xsTW9kZSddIDogJ3ZpcnR1YWwnO1xyXG4gICAgdGhpcy5vcHRpb25zLmlkRmllbGQgPSB0aGlzLmRhdGFbXCJpZEZpZWxkXCJdIHx8IHRoaXMuaWRGaWVsZDtcclxuICAgIHRoaXMub3B0aW9ucy5wYXJlbnRJZEZpZWxkID0gdGhpcy5kYXRhW1wicGFyZW50SWRGaWVsZFwiXSB8fCB0aGlzLnBhcmVudElkRmllbGQ7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sdW1ucyA9IFtdO1xyXG4gICAgdGhpcy5vcHRpb25zLmFnZ3JlZ2F0ZSA9IFtdO1xyXG4gICAgdGhpcy5vcHRpb25zLnBhZ2VBYmxlID0gdGhpcy5kYXRhLnBhZ2VBYmxlICE9IHVuZGVmaW5lZCA/IHRoaXMuZGF0YS5wYWdlQWJsZSA6IGZhbHNlO1xyXG5cclxuICAgIGxldCB6ZmllbGRzID0gW107XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKHRoaXMuZGF0YVtcIkNvbHVtbkZpZWxkQ29kZVwiXSwgXCJGb3JtRmllbGRcIiwgbnVsbCwgbnVsbCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKGZpZWxkcyA9PiB7XHJcbiAgICAgICAgemZpZWxkcyA9IGZpZWxkcztcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zRnJvbVpCdXR0b25zKGZpZWxkcyk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKGJ1dHRvbnMpID0+IHtcclxuICAgICAgICB0aGlzLnNldFRyZWVMaXN0Q29sdW1ucyh6ZmllbGRzLCBidXR0b25zKTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFt0aGlzLmdldERhdGFCaW5kaW5nKCksIHN1cGVyLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcih0aGlzLm9wdGlvbnMuY29sdW1ucyldKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcChkYXRhID0+IHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sc0ZvcklubGluZUVkaXQoZGF0YVswXSk7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVswXSB8fCBbXTtcclxuICAgICAgICB0aGlzLnNldERlZmF1bHRFeHBhbmRhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBjb25zdCB6YnV0dG9uRmllbGRzID0gW10gYXMgQXJyYXk8WkZpZWxkPjtcclxuICAvLyBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgLy8gICAgIGlmIChmaWVsZC5UeXBlID09PSBcInpidXR0b25zXCIpIHtcclxuICAvLyAgICAgICAgIGxldCBmaWVsZENvbFZpc2libGUgPSBmaWVsZC5ncmlkQ29sVmlzaWJsZTtcclxuICAvLyAgICAgICAgIGlmIChmaWVsZC5ncmlkQ29sVmlzaWJsZSAmJiBmaWVsZC5ncmlkQ29sVmlzaWJsZS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgLy8gICAgICAgICAgICAgLy8gZmllbGQuZ3JpZENvbFZpc2libGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZmllbGQuZ3JpZENvbFZpc2libGUudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgLy8gICAgICAgICAgICAgZmllbGRDb2xWaXNpYmxlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpZWxkLmdyaWRDb2xWaXNpYmxlLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgLy8gaWYgKGZpZWxkLmdyaWRDb2xWaXNpYmxlID09PSB0cnVlKSB7XHJcbiAgLy8gICAgICAgICBpZiAoZmllbGRDb2xWaXNpYmxlID09PSB0cnVlKSB7XHJcbiAgLy8gICAgICAgICAgICAgemJ1dHRvbkZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vIH0pO1xyXG5cclxuICAvLyBpZiAoemJ1dHRvbkZpZWxkcy5sZW5ndGggPT09IDApIHtcclxuICAvLyAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAvLyB9XHJcbiAgLy8gemJ1dHRvbkZpZWxkcy5mb3JFYWNoKHpidXR0b25GaWVsZCA9PiB7XHJcbiAgLy8gICAgIHpidXR0b25SZXN1bHQucHVzaChcclxuICAvLyAgICAgICAgIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoemJ1dHRvbkZpZWxkLlZhbHVlLCBcIkZvcm1GaWVsZFwiLCBudWxsLCBudWxsKS5waXBlKFxyXG4gIC8vICAgICAgICAgICAgIHN3aXRjaE1hcChidXR0b25zID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgemJ1dHRvbkZpZWxkLCBidXR0b25zIH0pO1xyXG4gIC8vICAgICAgICAgICAgIH0pKVxyXG4gIC8vICAgICApO1xyXG4gIC8vIH0pO1xyXG5cclxuICBwcml2YXRlIGdldEJ1dHRvbnNGcm9tWkJ1dHRvbnMoZmllbGRzOiBBcnJheTxaRmllbGQ+KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGJ1dHRvbkNtZCA9IFtdO1xyXG4gICAgY29uc3QgemJ1dHRvblJlc3VsdCA9IFtdO1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBpZiAoZmllbGQuVHlwZSA9PT0gXCJ6YnV0dG9uc1wiICYmIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShmaWVsZC5ncmlkQ29sVmlzaWJsZSBhcyBzdHJpbmcsIHRoaXMuZ3JvdXApKSB7XHJcbiAgICAgICAgemJ1dHRvblJlc3VsdC5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShmaWVsZC5WYWx1ZSwgXCJGb3JtRmllbGRcIiwgbnVsbCwgbnVsbCkucGlwZShcclxuICAgICAgICAgICAgc3dpdGNoTWFwKGJ1dHRvbnMgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBvZih7IGZpZWxkLCBidXR0b25zIH0pO1xyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoemJ1dHRvblJlc3VsdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ya0pvaW4oemJ1dHRvblJlc3VsdCkucGlwZShcclxuICAgICAgdGFwKHJlc3AgPT4ge1xyXG4gICAgICAgIHJlc3AuZm9yRWFjaCh6YnV0dG9uc0FycmF5ID0+XHJcbiAgICAgICAgICB6YnV0dG9uc0FycmF5W1wiYnV0dG9uc1wiXS5mb3JFYWNoKChidXR0b246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBidXR0b25DbWQucHVzaCh7XHJcbiAgICAgICAgICAgICAgemJ1dHRvbnNOYW1lOiB6YnV0dG9uc0FycmF5W1wiZmllbGRcIl0uVmFsdWUsXHJcbiAgICAgICAgICAgICAgbmFtZTogYnV0dG9uLlZhbHVlLFxyXG4gICAgICAgICAgICAgIGNsYXNzOiBidXR0b24uQ2xhc3MsXHJcbiAgICAgICAgICAgICAgdGV4dDogYnV0dG9uLkxhYmVsLFxyXG4gICAgICAgICAgICAgIGljb246IGJ1dHRvbi5JY29uLFxyXG4gICAgICAgICAgICAgIHZpc2libGU6IGJ1dHRvbi5WaXNpYmxlLFxyXG4gICAgICAgICAgICAgIGhpZGRlblBhcmFtOiBidXR0b25bXCJoaWRkZW5QYXJhbVwiXSxcclxuICAgICAgICAgICAgICBoaWRkZW5WYWx1ZTogYnV0dG9uW1wiaGlkZGVuVmFsdWVcIl0sXHJcbiAgICAgICAgICAgICAgZWRpdDogYnV0dG9uLmVkaXQsXHJcbiAgICAgICAgICAgICAgQ2xpY2tFdmVudDogYnV0dG9uLkNsaWNrRXZlbnQsXHJcbiAgICAgICAgICAgICAgU2hvd0xhYmVsOiBidXR0b24uU2hvd0xhYmVsLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiBidXR0b24uQ29sb3JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBvZihidXR0b25DbWQpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VHJlZUxpc3RDb2x1bW5zKGZpZWxkczogQXJyYXk8WkZpZWxkPiwgYnV0dG9uczogYW55KSB7XHJcbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMuc2V0VHJlZUxpc3RDb2x1bW5zKGZpZWxkLlZhbHVlLCBidXR0b25zKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpZWxkLmdyaWRDb2xWaXNpYmxlIGFzIHN0cmluZywgdGhpcy5ncm91cCkgPT09IHRydWUpIHtcclxuICAgICAgICBpZiAoZmllbGQuVHlwZSA9PT0gXCJ6YnV0dG9uc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmluc2VydENvbW1hbmQoZmllbGQsIGJ1dHRvbnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZmllbGQuQWdncmVnYXRlVHlwZSAmJiBmaWVsZC5BZ2dyZWdhdGVUeXBlICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGxldCBhZ2dyZWdhdGV0aXRsZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5BZ2dyZWdhdGVUeXBlID09PSBcInN1bVwiKSB7XHJcbiAgICAgICAgICAgICAgYWdncmVnYXRldGl0bGUgPSBcIlRvdGFsOiBcIjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBhZ2dyZWdhdGV0aXRsZSA9IGZpZWxkLkFnZ3JlZ2F0ZVR5cGUgKyBcIjogXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRGb290ZXJUZW1wbGF0ZUZpZWxkKGZpZWxkLCBhZ2dyZWdhdGV0aXRsZSk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hZ2dyZWdhdGUucHVzaCh7XHJcbiAgICAgICAgICAgICAgZmllbGQ6IGZpZWxkLlZhbHVlLFxyXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogZmllbGQuQWdncmVnYXRlVHlwZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0RmllbGQoZmllbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydEZpZWxkKGZpZWxkOiBaRmllbGQpIHtcclxuICAgIGxldCBjb2xUaXRsZSA9IGZpZWxkLk5hbWU7XHJcbiAgICBpZiAoY29sVGl0bGUudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICBjb2xUaXRsZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShjb2xUaXRsZS50b1N0cmluZygpLCB0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5jb2x1bW5zLnB1c2goXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oZmllbGQsIHtcclxuICAgICAgICBmaWVsZDogZmllbGQuVmFsdWUsXHJcbiAgICAgICAgdGl0bGU6IGNvbFRpdGxlLFxyXG4gICAgICAgIHdpZHRoOiBmaWVsZC53aWR0aCxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGZpZWxkVHlwZTogZmllbGQuVHlwZSxcclxuICAgICAgICBuYXZpZ2F0ZVRvOiBmaWVsZC5OYXZpZ2F0ZVRvLFxyXG4gICAgICAgIGNvbW1hbmQ6IG51bGwsXHJcbiAgICAgICAgY2xhc3M6IGZpZWxkLkRpdkNsYXNzLFxyXG4gICAgICAgIGZvb3RlclRlbXBsYXRlOiBmYWxzZSxcclxuICAgICAgICBhZ2dyZWdhdGVUeXBlOiBcIlwiLFxyXG4gICAgICAgIGFnZ3JlZ2F0ZVRpdGxlOiBcIlwiLFxyXG4gICAgICAgIGlzRWRpdGFibGVJbkdyaWQ6IGZpZWxkLklzRWRpdGFibGVJbkdyaWRcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydENvbW1hbmQoZmllbGQ6IFpGaWVsZCwgYnV0dG9uczogYW55KSB7XHJcbiAgICBsZXQgY29sVGl0bGUgPSBmaWVsZC5OYW1lO1xyXG4gICAgaWYgKGNvbFRpdGxlLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgY29sVGl0bGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoY29sVGl0bGUudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sdW1ucy5wdXNoKHtcclxuICAgICAgZmllbGQ6IGZpZWxkLk5hbWUsXHJcbiAgICAgIHRpdGxlOiBjb2xUaXRsZSxcclxuICAgICAgd2lkdGg6IGZpZWxkLndpZHRoLFxyXG4gICAgICB2aXNpYmxlOiBmaWVsZC5WaXNpYmxlLFxyXG4gICAgICBmaWVsZFR5cGU6IGZpZWxkLlR5cGUsXHJcbiAgICAgIG5hdmlnYXRlVG86IGZpZWxkLk5hdmlnYXRlVG8sXHJcbiAgICAgIGNvbW1hbmQ6IGJ1dHRvbnMuZmlsdGVyKHggPT4geC56YnV0dG9uc05hbWUgPT09IGZpZWxkLlZhbHVlKSxcclxuICAgICAgY2xhc3M6IGZpZWxkLkRpdkNsYXNzLFxyXG4gICAgICBmb290ZXJUZW1wbGF0ZTogZmFsc2UsXHJcbiAgICAgIGFnZ3JlZ2F0ZVR5cGU6IFwiXCIsXHJcbiAgICAgIGFnZ3JlZ2F0ZVRpdGxlOiBcIlwiLFxyXG4gICAgICBpc0VkaXRhYmxlSW5HcmlkOiBmaWVsZC5Jc0VkaXRhYmxlSW5HcmlkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5zZXJ0Rm9vdGVyVGVtcGxhdGVGaWVsZChmaWVsZDogWkZpZWxkLCBhZ2dyZWdhdGV0aXRsZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgY29sVGl0bGUgPSBmaWVsZC5OYW1lO1xyXG4gICAgaWYgKGNvbFRpdGxlLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgY29sVGl0bGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoY29sVGl0bGUudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sdW1ucy5wdXNoKHtcclxuICAgICAgZmllbGQ6IGZpZWxkLlZhbHVlLFxyXG4gICAgICB0aXRsZTogY29sVGl0bGUsXHJcbiAgICAgIHdpZHRoOiBmaWVsZC53aWR0aCxcclxuICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgZmllbGRUeXBlOiBmaWVsZC5UeXBlLFxyXG4gICAgICBuYXZpZ2F0ZVRvOiBmaWVsZC5OYXZpZ2F0ZVRvLFxyXG4gICAgICBjb21tYW5kOiBudWxsLFxyXG4gICAgICBjbGFzczogZmllbGQuRGl2Q2xhc3MsXHJcbiAgICAgIGZvb3RlclRlbXBsYXRlOiB0cnVlLFxyXG4gICAgICBhZ2dyZWdhdGVUeXBlOiBmaWVsZC5BZ2dyZWdhdGVUeXBlLFxyXG4gICAgICBhZ2dyZWdhdGVUaXRsZTogYWdncmVnYXRldGl0bGUsXHJcbiAgICAgIGlzRWRpdGFibGVJbkdyaWQ6IGZpZWxkLklzRWRpdGFibGVJbkdyaWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhQmluZGluZygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EYXRhU291cmNlKSB7XHJcbiAgICAgIHJldHVybiBvZihaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLkRhdGFTb3VyY2UsIHRoaXMuZ3JvdXApKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNvdXJjZVVybCA9IHRoaXMuZ2V0UmVzb3VjZVVSTCgpO1xyXG4gICAgaWYgKHJlc291cmNlVXJsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLndlYmFwaVNlcnZpY2UuZ2V0QXBpKHJlc291cmNlVXJsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvZihbXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlc291Y2VVUkwoKSB7XHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmRhdGEuUmVzb3VyY2VVUkwsXHJcbiAgICAgIHRoaXMuZ3JvdXBcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjZWxsQ2xpY2tIYW5kbGVyKGV2ZW50OiBDZWxsQ2xpY2tFdmVudCkge1xyXG4gICAgaWYgKCEhdGhpcy5kYXRhLkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZyhcImNlbGxDbGljayBldmVudDogXCIsIGV2ZW50KTtcclxuICAgIGlmICh0aGlzLmRhdGEuT25JdGVtQ2xpY2spIHtcclxuICAgICAgY29uc3QgZnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuT25JdGVtQ2xpY2spO1xyXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgICAgY2FsbEZ1bmMoZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRNb2RlbChldmVudC5kYXRhSXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVkaXRNb2RlbChkYXRhSXRlbTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkVkaXRDbGlja1VSTCkge1xyXG4gICAgICAvLyBUT0RPOlxyXG4gICAgICAvLyBkZWJ1Z2dlcjtcclxuICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZGF0YS5FZGl0Q2xpY2tVUkwsIGRhdGFJdGVtLklkXSk7XHJcbiAgICAgIGNvbnN0IGNvbEZpZWxkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuQ29sdW1uRmllbGRzLCB0aGlzLmdyb3VwKTtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiemdyaWQtY2VsbENsaWNrXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuRWRpdENsaWNrVVJMLFxyXG4gICAgICAgIGRhdGE6IGRhdGFJdGVtLFxyXG4gICAgICAgIGNvbHVtbkZpZWxkcyQ6IGNvbEZpZWxkc1xyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5ncm91cC5lZGl0TW9kZWxVUkwsIGRhdGFJdGVtLklkLCAnZWRpdCddLCB7XHJcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZVxyXG4gICAgICB9KTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ1BhdGg6ICcsIHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybCk7XHJcbiAgICAgIC8vIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZVsnX3JvdXRlclN0YXRlJ10uc25hcHNob3QudXJsO1xyXG4gICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbY3VycmVudFBhdGggKyBcIi9cIiArIHRoaXMuZ3JvdXAuZWRpdE1vZGVsVVJMLCBkYXRhSXRlbS5JZF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm1hdChjb2w6IGFueSkge1xyXG4gICAgbGV0IGZvcm1hdCA9IFwiXCI7XHJcbiAgICBjb25zdCBmb3JtYXRBcnIgPSBjb2wuRm9ybWF0T3B0aW9ucy5zcGxpdChcIi5cIilcclxuICAgIGxldCBkcCA9IDA7XHJcblxyXG4gICAgaWYgKGZvcm1hdEFyci5sZW5ndGggPiAxKSB7XHJcbiAgICAgIGRwID0gZm9ybWF0QXJyWzFdLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZHAgIT09IDApIHtcclxuICAgICAgZm9ybWF0ID0gXCIxLlwiICsgZHAgKyBcIi1cIiArIGRwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JtYXQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0SGVhZGVyVGV4dChjb2x1bW5OYW1lOiBzdHJpbmcsIG5ld0hlYWRlclRpdGxlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyaWRDb2x1bW5zID0gdGhpcy5vcHRpb25zLmNvbHVtbnM7XHJcbiAgICBncmlkQ29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoY29sLk5hbWUgPT09IGNvbHVtbk5hbWUgfHwgY29sLmZpZWxkID09PSBjb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgY29sLnRpdGxlID0gbmV3SGVhZGVyVGl0bGU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENvbENsYXNzKGRhdGFJdGVtOiBhbnksIGNvbDogYW55KSB7XHJcbiAgICBsZXQgbmdDbGFzcyA9IFwiZ3JpZENlbGwgXCI7XHJcbiAgICBpZiAoY29sLmZpZWxkVHlwZSA9PT0gJ251bWJlcicgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ2N1cnJlbmN5JyB8fCBjb2wuZmllbGRUeXBlID09PSAnem51bWVyaWMnKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gXCJyaWdodEFsaWduZWQgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFJdGVtW2NvbC5maWVsZCArICdfQ2xhc3MnXSkge1xyXG4gICAgICBuZ0NsYXNzICs9IGRhdGFJdGVtW2NvbC5maWVsZCArICdfQ2xhc3MnXSArIFwiIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2wuQ2xhc3MpIHtcclxuICAgICAgbmdDbGFzcyArPSBjb2wuQ2xhc3MgKyBcIiBcIjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmdDbGFzcztcclxuICB9XHJcblxyXG4gIG9uRmlsdGVyQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnp0cmVlbGlzdCkge1xyXG4gICAgICAvLyB0byBiZSBpbXBsZW1lbnQuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyYWJsZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRhYmxlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVmYXVsdEV4cGFuZGFibGUoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLlRyZWVMaXN0SW5pdGlhbGx5RXhwYW5kZWREYXRhSWRzKSB7XHJcbiAgICAgIGNvbnN0IGlkTGlzdCA9IHR5cGVvZiB0aGlzLmRhdGEuVHJlZUxpc3RJbml0aWFsbHlFeHBhbmRlZERhdGFJZHMgPT0gJ3N0cmluZycgPyBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLlRyZWVMaXN0SW5pdGlhbGx5RXhwYW5kZWREYXRhSWRzIGFzIHN0cmluZywgdGhpcy5ncm91cCkgOiB0aGlzLmRhdGEuVHJlZUxpc3RJbml0aWFsbHlFeHBhbmRlZERhdGFJZHM7XHJcbiAgICAgIGlmIChpZExpc3QgJiYgQXJyYXkuaXNBcnJheShpZExpc3QpKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZElkcyA9IGlkTGlzdC5tYXAoaSA9PiBpLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmRhdGEuRGVmYXVsdENvbGxhcHNlID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkSWRzID0gdGhpcy5kYXRhU291cmNlLm1hcChkID0+IGRbdGhpcy5pZEZpZWxkXS50b1N0cmluZygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0V4cGFuZGVkID0gKGRhdGFJdGVtOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkSWRzLmluZGV4T2YoZGF0YUl0ZW1bdGhpcy5pZEZpZWxkXS50b1N0cmluZygpKSA+IC0xO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBvbkNvbGxhcHNlKGFyZ3M6IEV4cGFuZEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cGFuZGVkSWRzID0gdGhpcy5leHBhbmRlZElkcy5maWx0ZXIoKGlkKSA9PiBpZCAhPSBhcmdzLmRhdGFJdGVtW3RoaXMuaWRGaWVsZF0udG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FeHBhbmQoYXJnczogRXhwYW5kRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwYW5kZWRJZHMucHVzaChhcmdzLmRhdGFJdGVtW3RoaXMuaWRGaWVsZF0udG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkTmV3KCkge1xyXG4gICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICB0eXBlOiBcImJ1dHRvbkNsaWNrXCIsXHJcbiAgICAgIHRhcmdldDogXCJncm91cC5uZXdNb2RlbCgpXCIsXHJcbiAgICAgIGRhdGE6IG51bGxcclxuICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoRGF0YSgpIHtcclxuICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgdHlwZTogXCJidXR0b25DbGlja1wiLFxyXG4gICAgICB0YXJnZXQ6IFwiZ3JvdXAucmVmcmVzaFRyZWVMaXN0KClcIixcclxuICAgICAgZGF0YTogbnVsbFxyXG4gICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEdyaWRCdXR0b25zKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lX1dGIHx8IHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEJ0biA9IHtcclxuICAgICAgICBSZWFkT25seTogZmFsc2UsXHJcbiAgICAgICAgVmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBJc1JlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgICBXb3JrZmxvd0NvZGU6IHRoaXMuZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lX1dGLFxyXG4gICAgICAgIFZhbHVlOiB0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZSxcclxuICAgICAgICBUeXBlOiB0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZV9XRiA/IFwiendvcmtmbG93YnV0dG9uc1wiIDogXCJ6YnV0dG9uc1wiXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBJbmxpbmUgRWRpdFxyXG4gIHByaXZhdGUgY3JlYXRlRm9ybUNvbnRyb2xzRm9ySW5saW5lRWRpdChkYXRhOiBhbnkpIHtcclxuICAgIGxldCBjb3VudGVySW5kZXggPSAwO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb2x1bW5zLmZpbmQoYyA9PiBjLmlzRWRpdGFibGVJbkdyaWQpID09PSB1bmRlZmluZWQgfHwgIWRhdGEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcyA9IHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcyB8fCB7fTtcclxuXHJcbiAgICBkYXRhLmZvckVhY2goZCA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1zID0ge307XHJcbiAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgaXRlbXNbYy5maWVsZF0gPSBuZXcgRm9ybUNvbnRyb2woZFtjLmZpZWxkXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGl0ZW1zKTtcclxuXHJcbiAgICAgIGlmIChkW1wiSWRcIl0pIHtcclxuICAgICAgICBpdGVtc1tcIklkXCJdID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGRbXCJJZFwiXSwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGRbXCJJZFwiXSA9IGNvdW50ZXJJbmRleCsrO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwc1tkW1wiSWRcIl1dID0gZm9ybUdyb3VwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW5saW5lRmllbGQodmFsdWU6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2x1bW5zLmZpbmQoeCA9PiB4LlZhbHVlID09PSB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW5saW5lRm9ybShkYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHNbZGF0YVtcIklkXCJdIHx8IHJvd0luZGV4XTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtQ29udHJvbERhdGEoKSB7XHJcbiAgICBjb25zdCBkYXRhID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzKSkge1xyXG4gICAgICBkYXRhLnB1c2godGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzW2tdPy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0lubGluZUVkaXRDb2xWaXNpYmxlKGRhdGFJdGVtOiBhbnksIGNvbHVtbjogYW55KSB7XHJcbiAgICBjb25zdCBpc1Zpc2libGUgPSBkYXRhSXRlbVtgJHtjb2x1bW4uVmFsdWV9X1Zpc2libGVgXTtcclxuICAgIHJldHVybiAhKGlzVmlzaWJsZSA9PT0gZmFsc2UpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2XHJcbiAgKm5nSWY9XCIhaXNMb2FkaW5nICYmICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiXHJcbiAgY2xhc3M9XCJncmlkLWNvbnRhaW5lciBlMXRhZy1zdHlsZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlXCI+XHJcbiAgPGRpdiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIiBjbGFzcz1cImUxdGFnLXN0eWxlMVwiPlxyXG4gICAgPGtlbmRvLXRyZWVsaXN0IFtrZW5kb1RyZWVMaXN0RmxhdEJpbmRpbmddPVwiZGF0YVNvdXJjZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiIGNsYXNzPVwiZGVza3RvcC1ncmlkIGUxdGFnLXN0eWxlMlwiIFtpZEZpZWxkXT1cIm9wdGlvbnMuaWRGaWVsZFwiXHJcbiAgICAgIFtwYXJlbnRJZEZpZWxkXT1cIm9wdGlvbnMucGFyZW50SWRGaWVsZFwiIChjZWxsQ2xpY2spPVwiY2VsbENsaWNrSGFuZGxlcigkZXZlbnQpXCIgW3NvcnRhYmxlXT1cIm9wdGlvbnMuc29ydGFibGVcIlxyXG4gICAgICBbcmVzaXphYmxlXT1cIm9wdGlvbnMucmVzaXphYmxlXCIgW2ZpbHRlcmFibGVdPVwib3B0aW9ucy5maWx0ZXJhYmxlXCIgW3Jlb3JkZXJhYmxlXT1cImZhbHNlXCIgW2NvbHVtbk1lbnVdPVwib3B0aW9ucy5jb2x1bW5NZW51XCJcclxuICAgICAgW3Njcm9sbGFibGVdPVwib3B0aW9ucy5zY3JvbGxhYmxlXCIgW2FnZ3JlZ2F0ZV09XCJvcHRpb25zLmFnZ3JlZ2F0ZVwiIFtwYWdlYWJsZV09XCJvcHRpb25zLnBhZ2VBYmxlXCJcclxuICAgICAgW3BhZ2VTaXplXT1cImRhdGEuUGFnZVNpemVcIiBbaXNFeHBhbmRlZF09XCJpc0V4cGFuZGVkXCJcclxuICAgICAgKGZpbHRlckNoYW5nZSk9XCJvbkZpbHRlckNoYW5nZSgkZXZlbnQpXCIgKGV4cGFuZCk9XCJvbkV4cGFuZCgkZXZlbnQpXCIgKGNvbGxhcHNlKT1cIm9uQ29sbGFwc2UoJGV2ZW50KVwiXHJcbiAgICAgIGtlbmRvVHJlZUxpc3RFeHBhbmRhYmxlIHRyZWVsaXN0PlxyXG4gICAgICA8bmctdGVtcGxhdGUga2VuZG9UcmVlTGlzdFRvb2xiYXJUZW1wbGF0ZVxyXG4gICAgICAqbmdJZj1cImRhdGEuQWxsb3dSZWZyZXNoQnV0dG9uIHx8IGRhdGEuQWxsb3dFeHBvcnQgfHwgZGF0YS5UaXRsZSB8fCBkYXRhLkdyaWRCdXR0b25GaWVsZE5hbWVfV0YgfHwgZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lXCIgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29iYXItbGVmdC1pdGVtXCI+XHJcbiAgICAgICAgICA8ZmEtaWNvbiAqbmdJZj1cImRhdGEuSWNvblwiIGNsYXNzPVwiZ3JpZFRpdGxlSWNvblwiIFtpY29uXT1cImRhdGEuSWNvblwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgIDxrZW5kby1sYWJlbCBjbGFzcz1cImdyaWRUaXRsZVwiPnt7ZGF0YS5UaXRsZX19PC9rZW5kby1sYWJlbD5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpb24tYWN0aXZhdGFibGUgcmlwcGxlLXBhcmVudCBrLWJ1dHRvbiByZWZyZXNoLWJ0blwiIChjbGljayk9XCJyZWZyZXNoRGF0YSgpXCIgKm5nSWY9XCJkYXRhLkFsbG93UmVmcmVzaEJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1yZWZyZXNoLXNtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8aW9uLXJpcHBsZS1lZmZlY3Q+PC9pb24tcmlwcGxlLWVmZmVjdD5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJpZ2h0LWl0ZW1cIj5cclxuICAgICAgICAgIDxhcHAtendvcmtmbG93YnV0dG9ucyAqbmdJZj1cImdyaWRCdG4gJiYgZ3JpZEJ0bi5UeXBlID09PSAnendvcmtmbG93YnV0dG9ucydcIiBbZGF0YV09XCJncmlkQnRuXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXp3b3JrZmxvd2J1dHRvbnM+XHJcbiAgICAgICAgICA8YXBwLXpidXR0b25zICpuZ0lmPVwiZ3JpZEJ0biAmJiBncmlkQnRuLlR5cGUgPT09ICd6YnV0dG9ucydcIiBbZGF0YV09XCJncmlkQnRuXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXpidXR0b25zPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50IGstYnV0dG9uXCIga2VuZG9UcmVlTGlzdEV4Y2VsQ29tbWFuZFxyXG4gICAgICAgICAgICAqbmdJZj1cImRhdGEuQWxsb3dFeHBvcnRcIj48c3BhbiBjbGFzcz1cImstaWNvbiBrLWktZG93bmxvYWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxpb24tcmlwcGxlLWVmZmVjdD48L2lvbi1yaXBwbGUtZWZmZWN0PlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwhLS1cclxuICAgICAgW2ZpbHRlcmFibGVdPVwib3B0aW9ucy5maWx0ZXJhYmxlXCJcclxuICAgIFtyZW9yZGVyYWJsZV09XCJvcHRpb25zLnJlc2l6YWJsZVwiXHJcbiAgICAgIC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2Ygb3B0aW9ucy5jb2x1bW5zOyBpbmRleCBhcyBpXCI+XHJcbiAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWNvbHVtbiAqbmdJZj1cIiFjb2wuY29tbWFuZFwiIFtjbGFzc109XCJjb2wuY2xhc3NcIiBbZXhwYW5kYWJsZV09XCJpPT09MFwiIFtmaWVsZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cImNvbC50aXRsZSB8fCBjb2wuZmllbGRcIiBbd2lkdGhdPVwiY29sLndpZHRoIHx8IDI1MFwiIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGUoY29sLmVuYWJsZUZpbHRlcmluZylcIlxyXG4gICAgICAgICAgW3NvcnRhYmxlXT1cInNvcnRhYmxlKGNvbC5lbmFibGVTb3J0aW5nKVwiIFtoaWRkZW5dPVwiIWlzQ29sdW1uc1Zpc2libGUoY29sLnZpc2libGUpXCIgW3N0eWxlXT1cImdldEdyaWRDb2x1bW5TdHlsZSgpXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTNcIlxyXG4gICAgICAgICAgW2hlYWRlclN0eWxlXT1cImdldEdyaWRIZWFkZXJTdHlsZSgpXCIgaGVhZGVyQ2xhc3M9XCJlMXRhZy1zdHlsZTRcIiBbZm9vdGVyU3R5bGVdPVwiZ2V0R3JpZEZvb3RlclN0eWxlKClcIiBmb290ZXJDbGFzcz1cImUxdGFnLXN0eWxlOVwiPlxyXG4gICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJjb2wuZmllbGRUeXBlID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnY3VycmVuY3knXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6bnVtZXJpYydcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9UcmVlTGlzdEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1udW1lcmljLWZpbHRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImVxXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZXEtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPC9rZW5kby10cmVlbGlzdC1udW1lcmljLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJjb2wuZmllbGRUeXBlID09ICd6ZGF0ZSdcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3pkYXRldGltZSdcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3p1aWRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IHRydWVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1RyZWVMaXN0RmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiIG9wZXJhdG9yPVwibHRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkYXRlLXJhbmdlLWZpbHRlci1jZWxsIGNsYXNzPVwiZGF0ZS1yYW5nZS1maWx0ZXJcIiBbZmlsdGVyXT1cImZpbHRlclwiIFtmaWVsZF09XCJjb2wuZmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWx0LW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLWx0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItbHRlLW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLWx0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItZ3RlLW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLWd0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8L2RhdGUtcmFuZ2UtZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9UcmVlTGlzdEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWRhdGUtZmlsdGVyLWNlbGwgW2NvbHVtbl09XCJjb2x1bW5cIiBbZmlsdGVyXT1cImZpbHRlclwiIG9wZXJhdG9yPVwibHRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1sdC1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1sdC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1ndC1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1ndC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWd0ZS1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1ndGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPC9rZW5kby10cmVlbGlzdC1kYXRlLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9UcmVlTGlzdEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1zdHJpbmctZmlsdGVyLWNlbGwgW2NvbHVtbl09XCJjb2x1bW5cIiBbZmlsdGVyXT1cImZpbHRlclwiIG9wZXJhdG9yPVwiY29udGFpbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1jb250YWlucy1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1jb250YWlucy1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1lcS1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1uZXEtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItbmVxLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLXN0YXJ0c3dpdGgtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItc3RhcnRzd2l0aC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1lbmRzd2l0aC1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1lbmRzd2l0aC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8L2tlbmRvLXRyZWVsaXN0LXN0cmluZy1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvVHJlZUxpc3RDZWxsVGVtcGxhdGUgbGV0LWRhdGFJdGVtIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LWNlbGxDb250ZXh0PVwiY2VsbENvbnRleHRcIj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbjogN3B4IDA7ZGlzcGxheTogaW5saW5lO1wiIFtzdHlsZS5jb2xvcl09XCIoISFkYXRhSXRlbS5Db2xvciA/IFtkYXRhSXRlbS5Db2xvcl0gOiAnYmxhY2snKVwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhY29sLm5hdmlnYXRlVG8gJiYgY29sLmlzRWRpdGFibGVJbkdyaWQgIT09IHRydWVcIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0Q29sQ2xhc3MoZGF0YUl0ZW0sIGNvbClcIj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6ICdkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pzaG9ydGRhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtcIj57eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgbnVtYmVyIH19IDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246cmlnaHQ7XCI+e3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlcjogJzEuMi0yJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pudW1lcmljJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246cmlnaHQ7XCI+e3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid1cmwnXCIgc3R5bGU9XCJjb2xvcjogYmx1ZTsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3psYWJlbCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ6dHJlZS1pbmxpbmUtYmxvY2sgZTF0YWctc3R5bGUxMFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMTBcIiBbaW5uZXJIVE1MXT1cImRhdGFJdGVtW2NvbC5maWVsZF0gfCBodG1sU2FuaXRpemVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDdweCAwO2Rpc3BsYXk6IGlubGluZTtcIiBbc3R5bGUuY29sb3JdPVwiKCEhZGF0YUl0ZW0uQ29sb3IgPyBbZGF0YUl0ZW0uQ29sb3JdIDogJ2JsYWNrJylcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5uYXZpZ2F0ZVRvICYmIGNvbC5pc0VkaXRhYmxlSW5HcmlkID09PSB0cnVlICYmIGlzSW5saW5lRWRpdENvbFZpc2libGUoZGF0YUl0ZW0sIGNvbClcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENvbENsYXNzKGRhdGFJdGVtLCBjb2wpXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1XCIgY2xhc3M9XCJlMXRhZy1zdHlsZTVcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtemlucHV0LWNvbnRhaW5lciBbZGF0YV09XCJnZXRJbmxpbmVGaWVsZChjb2wuZmllbGQpXCIgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtXT1cImdldElubGluZUZvcm0oZGF0YUl0ZW0sIHJvd0luZGV4KVwiIFtjb250YWluZXJGaWVsZF09XCJjb250YWluZXJGaWVsZFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNlwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlNlwiPlxyXG4gICAgICAgICAgICAgICAgPC9hcHAtemlucHV0LWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiISFjb2wubmF2aWdhdGVUb1wiIChjbGljayk9XCJvbk5hdmlnYXRlVG8oJGV2ZW50LCBjb2wsIGRhdGFJdGVtLCBkYXRhSXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIiBzaXplPVwic21hbGxcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgIDwhLS0gPGlvbi1pY29uIHNsb3Q9IFwiZW5kXCIgbmFtZT1cImFycm93LWZvcndhcmRcIj48L2lvbi1pY29uPiAtLT5cclxuICAgICAgICAgICAgICAgIDxmYS1pY29uIHNsb3Q9XCJlbmRcIiBbaWNvbl09XCInYXJyb3ctcmlnaHQnXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvbC5mb290ZXJUZW1wbGF0ZVwiIGtlbmRvVHJlZUxpc3RGb290ZXJUZW1wbGF0ZSBsZXQtYWdncmVnYXRlcz1cImFnZ3JlZ2F0ZXNcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2wubmF2aWdhdGVUb1wiIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU3XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3JpZ2h0QWxpZ25lZCc6IGNvbC5maWVsZFR5cGUgPT09ICdudW1iZXInIHx8IGNvbC5maWVsZFR5cGUgPT09ICdjdXJyZW5jeSd9XCIgY2xhc3M9XCJlMXRhZy1zdHlsZTdcIj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICAgIDxiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVGl0bGUgfCB0aXRsZWNhc2UgfX0ge3sgYWdncmVnYXRlc1tjb2wuZmllbGRdW2NvbC5hZ2dyZWdhdGVUeXBlXSB8IG51bWJlciB9fVxyXG4gICAgICAgICAgICAgICAgPC9iPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgICAgPGI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVUaXRsZSB8IHRpdGxlY2FzZSB9fSB7eyBhZ2dyZWdhdGVzW2NvbC5maWVsZF1bY29sLmFnZ3JlZ2F0ZVR5cGVdIHwgbnVtYmVyOiAnMS4yLTInIH19XHJcbiAgICAgICAgICAgICAgICA8L2I+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9rZW5kby10cmVlbGlzdC1jb2x1bW4+XHJcbiAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWNvbW1hbmQtY29sdW1uICpuZ0lmPVwiISFjb2wuY29tbWFuZFwiIFt0aXRsZV09XCJjb2wudGl0bGUgfHwgY29sLmZpZWxkXCJcclxuICAgICAgICAgIFt3aWR0aF09XCJjb2wud2lkdGggfHwgMjUwXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU4XCIgY2xhc3M9XCJlMXRhZy1zdHlsZThcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1RyZWVMaXN0Q2VsbFRlbXBsYXRlIGxldC1jZWxsQ29udGV4dD1cImNlbGxDb250ZXh0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiY29sLmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgY29sMiBvZiBjb2wuY29tbWFuZDsgaW5kZXggYXMgaVwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgW2tlbmRvVHJlZUxpc3RFZGl0Q29tbWFuZF09XCJjZWxsQ29udGV4dFwiIFt0aXRsZV09XCJjb2wyLnRleHRcIiAoY2xpY2spPVwiYnV0dG9uQ2xpY2soY29sMiwgY2VsbENvbnRleHQpXCJcclxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiaXNCdXR0b25IaWRkZW4oY29sMiwgY2VsbENvbnRleHQpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJjb2wyLmljb25cIiBbc3R5bGUuY29sb3JdPVwiKCEhY29sMi5jb2xvciA/IFtjb2wyLmNvbG9yXSA6ICdibGFjaycpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sMi5TaG93TGFiZWwgPT09IHVuZGVmaW5lZCB8fCBjb2wyLlNob3dMYWJlbFwiPnt7Y29sMi50ZXh0fX08L2Rpdj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwva2VuZG8tdHJlZWxpc3QtY29tbWFuZC1jb2x1bW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSA8a2VuZG8tdHJlZWxpc3QtY29tbWFuZC1jb2x1bW4gd2lkdGg9XCIxNDBcIj5cclxuICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1RyZWVMaXN0Q2VsbFRlbXBsYXRlIGxldC1pc05ldz1cImlzTmV3XCIgbGV0LWNlbGxDb250ZXh0PVwiY2VsbENvbnRleHRcIj5cclxuICAgICAgICAgICA8YnV0dG9uIFtrZW5kb1RyZWVMaXN0QWRkQ29tbWFuZF09XCJjZWxsQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICBpY29uPVwiZmlsdGVyLWFkZC1leHByZXNzaW9uXCIgdGl0bGU9XCJBZGQgQ2hpbGRcIj5cclxuICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICA8YnV0dG9uIFtrZW5kb1RyZWVMaXN0Q2FuY2VsQ29tbWFuZF09XCJjZWxsQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICBpY29uPVwiY2FuY2VsXCIgdGl0bGU9XCJ7eyBpc05ldyA/ICdEaXNjYXJkIGNoYW5nZXMnIDogJ0NhbmNlbCcgfX1cIj5cclxuICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgIDwva2VuZG8tdHJlZWxpc3QtY29tbWFuZC1jb2x1bW4+IC0tPlxyXG4gICAgPC9rZW5kby10cmVlbGlzdD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
532
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRyZWVsaXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3p0cmVlbGlzdC96dHJlZWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRyZWVsaXN0L3p0cmVlbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4RCw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFcEYsT0FBTyxFQUVPLGdCQUFnQixFQUM3QixNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCekIsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixZQUNTLFFBQWtCLEVBQ2xCLFNBQW1CLEVBQ25CLFVBQW9CLEVBQ3BCLFdBQXFCLEVBQ3JCLFVBQW9CLEVBQ3BCLFVBQXVCLEVBQ3ZCLE9BQWlCLEVBQ2pCLFFBQWtCLEVBQ2xCLFVBQW1CLEVBQ25CLFNBQWUsRUFDZixPQUFnQixFQUNoQixhQUFzQixFQUN0QixPQUFvQixFQUNwQixTQUFlLEVBQ2YsUUFBYztRQWRkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBVTtR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RyxNQUFNLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQztRQUN0RCxPQUFPLENBQUMsQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7K0dBL2lCVSxrQkFBa0I7bUdBQWxCLGtCQUFrQiw0RUM5RC9CLGkvYUFrTUE7MkZEcElhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgb2YsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENlbGxDbGlja0V2ZW50LCBFeHBhbmRFdmVudCwgU2Nyb2xsTW9kZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLXRyZWVsaXN0JztcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGF0YUxpc3RpbmdGaWVsZEJhc2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9kYXRhbGlzdGluZ2ZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgRmllbGRTZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBBdXRoU2VydmljZSxcclxuICBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpGaWVsZFxyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgWlRyZWVMaXN0Q29sdW1uIHtcclxuICBmaWVsZDogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxuICB2aXNpYmxlOiBib29sZWFuIHwgYW55O1xyXG4gIGZpZWxkVHlwZTogc3RyaW5nO1xyXG4gIG5hdmlnYXRlVG86IHN0cmluZztcclxuICBjb21tYW5kOiBhbnk7XHJcbiAgY2xhc3M6IGFueTtcclxuICBmb290ZXJUZW1wbGF0ZTogYm9vbGVhbjtcclxuICBhZ2dyZWdhdGVUeXBlOiBzdHJpbmc7XHJcbiAgYWdncmVnYXRlVGl0bGU6IHN0cmluZztcclxuICBpY29uT25seT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBaVHJlZUxpc3RPcHRpb25zIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBzb3J0YWJsZT86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgcmVzaXphYmxlPzogYm9vbGVhbixcclxuICAgIHB1YmxpYyBmaWx0ZXJhYmxlPzogYm9vbGVhbixcclxuICAgIHB1YmxpYyByZW9yZGVyYWJsZT86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgY29sdW1uTWVudT86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgc2Nyb2xsYWJsZT86IFNjcm9sbE1vZGUsXHJcbiAgICBwdWJsaWMgcmVmcmVzaD86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgYXV0b0JpbmQ/OiBib29sZWFuLFxyXG4gICAgcHVibGljIGRhdGFTb3VyY2U/OiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgZGF0YUJvdW5kPzogYW55LFxyXG4gICAgcHVibGljIGlkRmllbGQ/OiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgcGFyZW50SWRGaWVsZD86IHN0cmluZyxcclxuICAgIHB1YmxpYyBjb2x1bW5zPzogQXJyYXk8YW55PixcclxuICAgIHB1YmxpYyBhZ2dyZWdhdGU/OiBhbnksXHJcbiAgICBwdWJsaWMgcGFnZUFibGU/OiBhbnksXHJcbiAgKSB7IH1cclxufVxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC16dHJlZWxpc3RcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3p0cmVlbGlzdC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96dHJlZWxpc3QuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgWnRyZWVsaXN0Q29tcG9uZW50IGV4dGVuZHMgRGF0YUxpc3RpbmdGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLy8gQFZpZXdDaGlsZChaVHJlZUxpc3RCaW5kaW5nRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UgfSkgenRyZWVsaXN0OiBaVHJlZUxpc3RCaW5kaW5nRGlyZWN0aXZlO1xyXG5cclxuICB6dHJlZWxpc3Q6IGFueSA9IG51bGw7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgZGF0YVNvdXJjZTogYW55O1xyXG4gIGlkRmllbGQgPSBcIklkXCI7XHJcbiAgcGFyZW50SWRGaWVsZCA9IFwiUGFyZW50SWRcIjtcclxuICBvcHRpb25zOiBaVHJlZUxpc3RPcHRpb25zID0gbmV3IFpUcmVlTGlzdE9wdGlvbnMoKTtcclxuICBwdWJsaWMgZ3JpZEJ0bjtcclxuICBmaWVsZGdyaWRDb2xWaXNpYmxlOiBhbnlbXTtcclxuICBwYWdlU2l6ZSA9IDIwO1xyXG4gIGlubGluZUVkaXRlZEZvcm1Hcm91cHM6IHt9O1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcclxuICB0cmVlbGlzdFN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICBwcml2YXRlIGV4cGFuZGVkSWRzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjb21wb25lbnRTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgZmllbGRTZXJ2aWNlOiBGaWVsZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYmFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoY29tcG9uZW50U2VydmljZSk7XHJcbiAgfVxyXG4gIC8vIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAvLyAgIC8vIHRoaXMuenRyZWVsaXN0LnNldE9wdGlvbnMoe2RhdGE6IHRoaXMuZGF0YSwgZ3JvdXA6IHRoaXMuZ3JvdXB9KTtcclxuICAvLyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgc3VwZXIuaW5pdENvbXBvbmVudCgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0dXBHcmlkQnV0dG9ucygpO1xyXG5cclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZGF0YS5QYWdlU2l6ZSB8fCAyMDtcclxuICAgICAgaWYgKCEhdGhpcy5kYXRhLk9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLnNldExvY2FsT3B0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2V0RmllbGRFbGVtZW50T3B0aW9ucygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWNyZW1lbnRDb21wb25lbnRDb3VudGVyRm9yRmllbGQodGhpcy5kYXRhKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgLy8gaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAvLyAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGF0YSA9IChnRGF0YTogYW55KSA9PiB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBnRGF0YTtcclxuICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzRm9ySW5saW5lRWRpdChnRGF0YSk7XHJcbiAgICB0aGlzLnNldERlZmF1bHRFeHBhbmRhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNCdXR0b25IaWRkZW4oY29sOiBhbnksIGNlbGxDb250YWluOiBhbnkpIHtcclxuICAgIGlmIChjb2wudmlzaWJsZSkge1xyXG4gICAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGNvbC52aXNpYmxlLCBjZWxsQ29udGFpbi52aWV3SXRlbS5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbC5oaWRkZW5QYXJhbSB8fCBjb2wuaGlkZGVuVmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2VsbENvbnRhaW4udmlld0l0ZW0uZGF0YVtjb2wuaGlkZGVuUGFyYW1dID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjZWxsQ29udGFpbi52aWV3SXRlbS5kYXRhW2NvbC5oaWRkZW5QYXJhbV0gPT09IGNvbC5oaWRkZW5WYWx1ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7IHJldHVybiBmYWxzZTsgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJ1dHRvbkNsaWNrKGJ1dHRvbjogYW55LCBjZWxsQ29udGV4dDogYW55KSB7XHJcbiAgICBpZiAoYnV0dG9uLmVkaXQpIHtcclxuICAgICAgYnV0dG9uLmVkaXQoY2VsbENvbnRleHQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiYnV0dG9uQ2xpY2tcIixcclxuICAgICAgICB0YXJnZXQ6IGJ1dHRvbi5DbGlja0V2ZW50LFxyXG4gICAgICAgIGRhdGE6IGNlbGxDb250ZXh0XHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk5hdmlnYXRlVG8oZXZlbnQ6IGFueSwgY29sU2V0dGluZzogYW55LCByb3dEYXRhOiBhbnksIGNlbGxEYXRhOiBzdHJpbmcpIHtcclxuICAgIC8vIGRlYnVnZ2VyO1xyXG4gICAgLy8gY29uc3QgbiA9IGNvbFNldHRpbmcubmF2aWdhdGVUby5yZXBsYWNlKCcvOmlkJywgY2VsbERhdGEpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgIHR5cGU6ICd6Z3JpZC1vbk5hdmlnYXRlVG8nLFxyXG4gICAgICB0YXJnZXQ6IGNvbFNldHRpbmcubmF2aWdhdGVUbyxcclxuICAgICAgZGF0YTogY2VsbERhdGFcclxuICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0NvbHVtbnNWaXNpYmxlKGZpZWxkRXhwcikge1xyXG4gICAgaWYgKGZpZWxkRXhwciAhPT0gZmFsc2UgJiYgIWZpZWxkRXhwcikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHYgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgZmllbGRFeHByKTtcclxuICAgIHJldHVybiB2O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRMb2NhbE9wdGlvbnMoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBaVHJlZUxpc3RPcHRpb25zID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmRhdGEuT3B0aW9ucyxcclxuICAgICAgdGhpcy5ncm91cFxyXG4gICAgKTtcclxuICAgIGlmICghb3B0aW9ucykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJObyBpbml0aWFsaXNlIGZvciBGaWVsZC5PcHRpb25zOiBcIiwgdGhpcy5kYXRhLk9wdGlvbnMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5vcHRpb25zLmlkRmllbGQgPSB0aGlzLm9wdGlvbnMuaWRGaWVsZCB8fCB0aGlzLmlkRmllbGQ7XHJcbiAgICB0aGlzLm9wdGlvbnMucGFyZW50SWRGaWVsZCA9IHRoaXMub3B0aW9ucy5wYXJlbnRJZEZpZWxkIHx8IHRoaXMucGFyZW50SWRGaWVsZDtcclxuXHJcbiAgICBzdXBlci50cmFuc2xhdGVDb2x1bW5IZWFkZXIodGhpcy5vcHRpb25zLmNvbHVtbnMpLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7IH0pO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLmRhdGFTb3VyY2UgJiZcclxuICAgICAgdHlwZW9mIHRoaXMub3B0aW9ucy5kYXRhU291cmNlID09PSBcInN0cmluZ1wiXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhU291cmNlLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpIHtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5vcHRpb25zLmRhdGFTb3VyY2UsIHRoaXMuZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdEV4cGFuZGFibGUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKHRoaXMuZGF0YS5OYW1lICsgXCIgLSBoYXMgaW52YWxpZCBkYXRhU291cmNlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKHRoaXMuZGF0YS5OYW1lICsgXCIgLSBkYXRhU291cmNlIHByb3BlcnR5IGlzIG5vdCBkZWNsYXJlZC5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpZWxkRWxlbWVudE9wdGlvbnMoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc29ydGFibGUgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLnJlc2l6YWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnMuZmlsdGVyYWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnMucmVzaXphYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5jb2x1bW5NZW51ID0gdGhpcy5kYXRhLkRpc2FibGVHcmlkQ29sdW1uTWVudSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5zY3JvbGxhYmxlID0gdGhpcy5kYXRhWydTY3JvbGxNb2RlJ10gPyB0aGlzLmRhdGFbJ1Njcm9sbE1vZGUnXSA6ICd2aXJ0dWFsJztcclxuICAgIHRoaXMub3B0aW9ucy5pZEZpZWxkID0gdGhpcy5kYXRhW1wiaWRGaWVsZFwiXSB8fCB0aGlzLmlkRmllbGQ7XHJcbiAgICB0aGlzLm9wdGlvbnMucGFyZW50SWRGaWVsZCA9IHRoaXMuZGF0YVtcInBhcmVudElkRmllbGRcIl0gfHwgdGhpcy5wYXJlbnRJZEZpZWxkO1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbHVtbnMgPSBbXTtcclxuICAgIHRoaXMub3B0aW9ucy5hZ2dyZWdhdGUgPSBbXTtcclxuICAgIHRoaXMub3B0aW9ucy5wYWdlQWJsZSA9IHRoaXMuZGF0YS5wYWdlQWJsZSAhPSB1bmRlZmluZWQgPyB0aGlzLmRhdGEucGFnZUFibGUgOiBmYWxzZTtcclxuXHJcbiAgICBsZXQgemZpZWxkcyA9IFtdO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZSh0aGlzLmRhdGFbXCJDb2x1bW5GaWVsZENvZGVcIl0sIFwiRm9ybUZpZWxkXCIsIG51bGwsIG51bGwpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcChmaWVsZHMgPT4ge1xyXG4gICAgICAgIHpmaWVsZHMgPSBmaWVsZHM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9uc0Zyb21aQnV0dG9ucyhmaWVsZHMpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChidXR0b25zKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRUcmVlTGlzdENvbHVtbnMoemZpZWxkcywgYnV0dG9ucyk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihbdGhpcy5nZXREYXRhQmluZGluZygpLCBzdXBlci50cmFuc2xhdGVDb2x1bW5IZWFkZXIodGhpcy5vcHRpb25zLmNvbHVtbnMpXSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHNGb3JJbmxpbmVFZGl0KGRhdGFbMF0pO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFbMF0gfHwgW107XHJcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RXhwYW5kYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gY29uc3QgemJ1dHRvbkZpZWxkcyA9IFtdIGFzIEFycmF5PFpGaWVsZD47XHJcbiAgLy8gZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gIC8vICAgICBpZiAoZmllbGQuVHlwZSA9PT0gXCJ6YnV0dG9uc1wiKSB7XHJcbiAgLy8gICAgICAgICBsZXQgZmllbGRDb2xWaXNpYmxlID0gZmllbGQuZ3JpZENvbFZpc2libGU7XHJcbiAgLy8gICAgICAgICBpZiAoZmllbGQuZ3JpZENvbFZpc2libGUgJiYgZmllbGQuZ3JpZENvbFZpc2libGUudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gIC8vICAgICAgICAgICAgIC8vIGZpZWxkLmdyaWRDb2xWaXNpYmxlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpZWxkLmdyaWRDb2xWaXNpYmxlLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gIC8vICAgICAgICAgICAgIGZpZWxkQ29sVmlzaWJsZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShmaWVsZC5ncmlkQ29sVmlzaWJsZS50b1N0cmluZygpLCB0aGlzLmdyb3VwKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIC8vIGlmIChmaWVsZC5ncmlkQ29sVmlzaWJsZSA9PT0gdHJ1ZSkge1xyXG4gIC8vICAgICAgICAgaWYgKGZpZWxkQ29sVmlzaWJsZSA9PT0gdHJ1ZSkge1xyXG4gIC8vICAgICAgICAgICAgIHpidXR0b25GaWVsZHMucHVzaChmaWVsZCk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyB9KTtcclxuXHJcbiAgLy8gaWYgKHpidXR0b25GaWVsZHMubGVuZ3RoID09PSAwKSB7XHJcbiAgLy8gICAgIHJldHVybiBvZihbXSk7XHJcbiAgLy8gfVxyXG4gIC8vIHpidXR0b25GaWVsZHMuZm9yRWFjaCh6YnV0dG9uRmllbGQgPT4ge1xyXG4gIC8vICAgICB6YnV0dG9uUmVzdWx0LnB1c2goXHJcbiAgLy8gICAgICAgICB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKHpidXR0b25GaWVsZC5WYWx1ZSwgXCJGb3JtRmllbGRcIiwgbnVsbCwgbnVsbCkucGlwZShcclxuICAvLyAgICAgICAgICAgICBzd2l0Y2hNYXAoYnV0dG9ucyA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIHJldHVybiBvZih7IHpidXR0b25GaWVsZCwgYnV0dG9ucyB9KTtcclxuICAvLyAgICAgICAgICAgICB9KSlcclxuICAvLyAgICAgKTtcclxuICAvLyB9KTtcclxuXHJcbiAgcHJpdmF0ZSBnZXRCdXR0b25zRnJvbVpCdXR0b25zKGZpZWxkczogQXJyYXk8WkZpZWxkPik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBidXR0b25DbWQgPSBbXTtcclxuICAgIGNvbnN0IHpidXR0b25SZXN1bHQgPSBbXTtcclxuICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgaWYgKGZpZWxkLlR5cGUgPT09IFwiemJ1dHRvbnNcIiAmJiBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZmllbGQuZ3JpZENvbFZpc2libGUgYXMgc3RyaW5nLCB0aGlzLmdyb3VwKSkge1xyXG4gICAgICAgIHpidXR0b25SZXN1bHQucHVzaChcclxuICAgICAgICAgIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoZmllbGQuVmFsdWUsIFwiRm9ybUZpZWxkXCIsIG51bGwsIG51bGwpLnBpcGUoXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChidXR0b25zID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gb2YoeyBmaWVsZCwgYnV0dG9ucyB9KTtcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHpidXR0b25SZXN1bHQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKHpidXR0b25SZXN1bHQpLnBpcGUoXHJcbiAgICAgIHRhcChyZXNwID0+IHtcclxuICAgICAgICByZXNwLmZvckVhY2goemJ1dHRvbnNBcnJheSA9PlxyXG4gICAgICAgICAgemJ1dHRvbnNBcnJheVtcImJ1dHRvbnNcIl0uZm9yRWFjaCgoYnV0dG9uOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgYnV0dG9uQ21kLnB1c2goe1xyXG4gICAgICAgICAgICAgIHpidXR0b25zTmFtZTogemJ1dHRvbnNBcnJheVtcImZpZWxkXCJdLlZhbHVlLFxyXG4gICAgICAgICAgICAgIG5hbWU6IGJ1dHRvbi5WYWx1ZSxcclxuICAgICAgICAgICAgICBjbGFzczogYnV0dG9uLkNsYXNzLFxyXG4gICAgICAgICAgICAgIHRleHQ6IGJ1dHRvbi5MYWJlbCxcclxuICAgICAgICAgICAgICBpY29uOiBidXR0b24uSWNvbixcclxuICAgICAgICAgICAgICB2aXNpYmxlOiBidXR0b24uVmlzaWJsZSxcclxuICAgICAgICAgICAgICBoaWRkZW5QYXJhbTogYnV0dG9uW1wiaGlkZGVuUGFyYW1cIl0sXHJcbiAgICAgICAgICAgICAgaGlkZGVuVmFsdWU6IGJ1dHRvbltcImhpZGRlblZhbHVlXCJdLFxyXG4gICAgICAgICAgICAgIGVkaXQ6IGJ1dHRvbi5lZGl0LFxyXG4gICAgICAgICAgICAgIENsaWNrRXZlbnQ6IGJ1dHRvbi5DbGlja0V2ZW50LFxyXG4gICAgICAgICAgICAgIFNob3dMYWJlbDogYnV0dG9uLlNob3dMYWJlbCxcclxuICAgICAgICAgICAgICBjb2xvcjogYnV0dG9uLkNvbG9yXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gb2YoYnV0dG9uQ21kKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFRyZWVMaXN0Q29sdW1ucyhmaWVsZHM6IEFycmF5PFpGaWVsZD4sIGJ1dHRvbnM6IGFueSkge1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5WYWx1ZSkpIHtcclxuICAgICAgICB0aGlzLnNldFRyZWVMaXN0Q29sdW1ucyhmaWVsZC5WYWx1ZSwgYnV0dG9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShmaWVsZC5ncmlkQ29sVmlzaWJsZSBhcyBzdHJpbmcsIHRoaXMuZ3JvdXApID09PSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT09IFwiemJ1dHRvbnNcIikge1xyXG4gICAgICAgICAgdGhpcy5pbnNlcnRDb21tYW5kKGZpZWxkLCBidXR0b25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGZpZWxkLkFnZ3JlZ2F0ZVR5cGUgJiYgZmllbGQuQWdncmVnYXRlVHlwZSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBsZXQgYWdncmVnYXRldGl0bGUgPSBcIlwiO1xyXG4gICAgICAgICAgICBpZiAoZmllbGQuQWdncmVnYXRlVHlwZSA9PT0gXCJzdW1cIikge1xyXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZXRpdGxlID0gXCJUb3RhbDogXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgYWdncmVnYXRldGl0bGUgPSBmaWVsZC5BZ2dyZWdhdGVUeXBlICsgXCI6IFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0Rm9vdGVyVGVtcGxhdGVGaWVsZChmaWVsZCwgYWdncmVnYXRldGl0bGUpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWdncmVnYXRlLnB1c2goe1xyXG4gICAgICAgICAgICAgIGZpZWxkOiBmaWVsZC5WYWx1ZSxcclxuICAgICAgICAgICAgICBhZ2dyZWdhdGU6IGZpZWxkLkFnZ3JlZ2F0ZVR5cGVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydEZpZWxkKGZpZWxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnNlcnRGaWVsZChmaWVsZDogWkZpZWxkKSB7XHJcbiAgICBsZXQgY29sVGl0bGUgPSBmaWVsZC5OYW1lO1xyXG4gICAgaWYgKGNvbFRpdGxlLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgY29sVGl0bGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoY29sVGl0bGUudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sdW1ucy5wdXNoKFxyXG4gICAgICBPYmplY3QuYXNzaWduKGZpZWxkLCB7XHJcbiAgICAgICAgZmllbGQ6IGZpZWxkLlZhbHVlLFxyXG4gICAgICAgIHRpdGxlOiBjb2xUaXRsZSxcclxuICAgICAgICB3aWR0aDogZmllbGQud2lkdGgsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBmaWVsZFR5cGU6IGZpZWxkLlR5cGUsXHJcbiAgICAgICAgbmF2aWdhdGVUbzogZmllbGQuTmF2aWdhdGVUbyxcclxuICAgICAgICBjb21tYW5kOiBudWxsLFxyXG4gICAgICAgIGNsYXNzOiBmaWVsZC5EaXZDbGFzcyxcclxuICAgICAgICBmb290ZXJUZW1wbGF0ZTogZmFsc2UsXHJcbiAgICAgICAgYWdncmVnYXRlVHlwZTogXCJcIixcclxuICAgICAgICBhZ2dyZWdhdGVUaXRsZTogXCJcIixcclxuICAgICAgICBpc0VkaXRhYmxlSW5HcmlkOiBmaWVsZC5Jc0VkaXRhYmxlSW5HcmlkXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnNlcnRDb21tYW5kKGZpZWxkOiBaRmllbGQsIGJ1dHRvbnM6IGFueSkge1xyXG4gICAgbGV0IGNvbFRpdGxlID0gZmllbGQuTmFtZTtcclxuICAgIGlmIChjb2xUaXRsZS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIGNvbFRpdGxlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGNvbFRpdGxlLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmNvbHVtbnMucHVzaCh7XHJcbiAgICAgIGZpZWxkOiBmaWVsZC5OYW1lLFxyXG4gICAgICB0aXRsZTogY29sVGl0bGUsXHJcbiAgICAgIHdpZHRoOiBmaWVsZC53aWR0aCxcclxuICAgICAgdmlzaWJsZTogZmllbGQuVmlzaWJsZSxcclxuICAgICAgZmllbGRUeXBlOiBmaWVsZC5UeXBlLFxyXG4gICAgICBuYXZpZ2F0ZVRvOiBmaWVsZC5OYXZpZ2F0ZVRvLFxyXG4gICAgICBjb21tYW5kOiBidXR0b25zLmZpbHRlcih4ID0+IHguemJ1dHRvbnNOYW1lID09PSBmaWVsZC5WYWx1ZSksXHJcbiAgICAgIGNsYXNzOiBmaWVsZC5EaXZDbGFzcyxcclxuICAgICAgZm9vdGVyVGVtcGxhdGU6IGZhbHNlLFxyXG4gICAgICBhZ2dyZWdhdGVUeXBlOiBcIlwiLFxyXG4gICAgICBhZ2dyZWdhdGVUaXRsZTogXCJcIixcclxuICAgICAgaXNFZGl0YWJsZUluR3JpZDogZmllbGQuSXNFZGl0YWJsZUluR3JpZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydEZvb3RlclRlbXBsYXRlRmllbGQoZmllbGQ6IFpGaWVsZCwgYWdncmVnYXRldGl0bGU6IHN0cmluZykge1xyXG4gICAgbGV0IGNvbFRpdGxlID0gZmllbGQuTmFtZTtcclxuICAgIGlmIChjb2xUaXRsZS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIGNvbFRpdGxlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGNvbFRpdGxlLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmNvbHVtbnMucHVzaCh7XHJcbiAgICAgIGZpZWxkOiBmaWVsZC5WYWx1ZSxcclxuICAgICAgdGl0bGU6IGNvbFRpdGxlLFxyXG4gICAgICB3aWR0aDogZmllbGQud2lkdGgsXHJcbiAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgIGZpZWxkVHlwZTogZmllbGQuVHlwZSxcclxuICAgICAgbmF2aWdhdGVUbzogZmllbGQuTmF2aWdhdGVUbyxcclxuICAgICAgY29tbWFuZDogbnVsbCxcclxuICAgICAgY2xhc3M6IGZpZWxkLkRpdkNsYXNzLFxyXG4gICAgICBmb290ZXJUZW1wbGF0ZTogdHJ1ZSxcclxuICAgICAgYWdncmVnYXRlVHlwZTogZmllbGQuQWdncmVnYXRlVHlwZSxcclxuICAgICAgYWdncmVnYXRlVGl0bGU6IGFnZ3JlZ2F0ZXRpdGxlLFxyXG4gICAgICBpc0VkaXRhYmxlSW5HcmlkOiBmaWVsZC5Jc0VkaXRhYmxlSW5HcmlkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGF0YUJpbmRpbmcoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmRhdGEuRGF0YVNvdXJjZSkge1xyXG4gICAgICByZXR1cm4gb2YoWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZGF0YS5EYXRhU291cmNlLCB0aGlzLmdyb3VwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzb3VyY2VVcmwgPSB0aGlzLmdldFJlc291Y2VVUkwoKTtcclxuICAgIGlmIChyZXNvdXJjZVVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy53ZWJhcGlTZXJ2aWNlLmdldEFwaShyZXNvdXJjZVVybCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2YoW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSZXNvdWNlVVJMKCkge1xyXG4gICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgdGhpcy5kYXRhLlJlc291cmNlVVJMLFxyXG4gICAgICB0aGlzLmdyb3VwXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2VsbENsaWNrSGFuZGxlcihldmVudDogQ2VsbENsaWNrRXZlbnQpIHtcclxuICAgIGlmICghIXRoaXMuZGF0YS5EaXNhYmxlQ2VsbENsaWNrSGFuZGxlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJjZWxsQ2xpY2sgZXZlbnQ6IFwiLCBldmVudCk7XHJcbiAgICBpZiAodGhpcy5kYXRhLk9uSXRlbUNsaWNrKSB7XHJcbiAgICAgIGNvbnN0IGZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLk9uSXRlbUNsaWNrKTtcclxuICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgY29uc3QgY2FsbEZ1bmMgPSBmdW5jLmJpbmQodGhpcy5ncm91cC5jdHJsU2NvcGUpO1xyXG4gICAgICAgIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lZGl0TW9kZWwoZXZlbnQuZGF0YUl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlZGl0TW9kZWwoZGF0YUl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5FZGl0Q2xpY2tVUkwpIHtcclxuICAgICAgLy8gVE9ETzpcclxuICAgICAgLy8gZGVidWdnZXI7XHJcbiAgICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmRhdGEuRWRpdENsaWNrVVJMLCBkYXRhSXRlbS5JZF0pO1xyXG4gICAgICBjb25zdCBjb2xGaWVsZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLkNvbHVtbkZpZWxkcywgdGhpcy5ncm91cCk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcInpncmlkLWNlbGxDbGlja1wiLFxyXG4gICAgICAgIHRhcmdldDogdGhpcy5kYXRhLkVkaXRDbGlja1VSTCxcclxuICAgICAgICBkYXRhOiBkYXRhSXRlbSxcclxuICAgICAgICBjb2x1bW5GaWVsZHMkOiBjb2xGaWVsZHNcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZ3JvdXAuZWRpdE1vZGVsVVJMLCBkYXRhSXRlbS5JZCwgJ2VkaXQnXSwge1xyXG4gICAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGVcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoOiAnLCB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwpO1xyXG4gICAgICAvLyBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybDtcclxuICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2N1cnJlbnRQYXRoICsgXCIvXCIgKyB0aGlzLmdyb3VwLmVkaXRNb2RlbFVSTCwgZGF0YUl0ZW0uSWRdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtYXQoY29sOiBhbnkpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIlwiO1xyXG4gICAgY29uc3QgZm9ybWF0QXJyID0gY29sLkZvcm1hdE9wdGlvbnMuc3BsaXQoXCIuXCIpXHJcbiAgICBsZXQgZHAgPSAwO1xyXG5cclxuICAgIGlmIChmb3JtYXRBcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICBkcCA9IGZvcm1hdEFyclsxXS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRwICE9PSAwKSB7XHJcbiAgICAgIGZvcm1hdCA9IFwiMS5cIiArIGRwICsgXCItXCIgKyBkcDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEhlYWRlclRleHQoY29sdW1uTmFtZTogc3RyaW5nLCBuZXdIZWFkZXJUaXRsZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBncmlkQ29sdW1ucyA9IHRoaXMub3B0aW9ucy5jb2x1bW5zO1xyXG4gICAgZ3JpZENvbHVtbnMuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGNvbC5OYW1lID09PSBjb2x1bW5OYW1lIHx8IGNvbC5maWVsZCA9PT0gY29sdW1uTmFtZSkge1xyXG4gICAgICAgIGNvbC50aXRsZSA9IG5ld0hlYWRlclRpdGxlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb2xDbGFzcyhkYXRhSXRlbTogYW55LCBjb2w6IGFueSkge1xyXG4gICAgbGV0IG5nQ2xhc3MgPSBcImdyaWRDZWxsIFwiO1xyXG4gICAgaWYgKGNvbC5maWVsZFR5cGUgPT09ICdudW1iZXInIHx8IGNvbC5maWVsZFR5cGUgPT09ICdjdXJyZW5jeScgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3pudW1lcmljJykge1xyXG4gICAgICBuZ0NsYXNzICs9IFwicmlnaHRBbGlnbmVkIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhSXRlbVtjb2wuZmllbGQgKyAnX0NsYXNzJ10pIHtcclxuICAgICAgbmdDbGFzcyArPSBkYXRhSXRlbVtjb2wuZmllbGQgKyAnX0NsYXNzJ10gKyBcIiBcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sLkNsYXNzKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gY29sLkNsYXNzICsgXCIgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5nQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBvbkZpbHRlckNoYW5nZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy56dHJlZWxpc3QpIHtcclxuICAgICAgLy8gdG8gYmUgaW1wbGVtZW50LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRlcmFibGUodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzb3J0YWJsZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERlZmF1bHRFeHBhbmRhYmxlKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5UcmVlTGlzdEluaXRpYWxseUV4cGFuZGVkRGF0YUlkcykge1xyXG4gICAgICBjb25zdCBpZExpc3QgPSB0eXBlb2YgdGhpcy5kYXRhLlRyZWVMaXN0SW5pdGlhbGx5RXhwYW5kZWREYXRhSWRzID09ICdzdHJpbmcnID8gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZGF0YS5UcmVlTGlzdEluaXRpYWxseUV4cGFuZGVkRGF0YUlkcyBhcyBzdHJpbmcsIHRoaXMuZ3JvdXApIDogdGhpcy5kYXRhLlRyZWVMaXN0SW5pdGlhbGx5RXhwYW5kZWREYXRhSWRzO1xyXG4gICAgICBpZiAoaWRMaXN0ICYmIEFycmF5LmlzQXJyYXkoaWRMaXN0KSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRJZHMgPSBpZExpc3QubWFwKGkgPT4gaS50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5kYXRhLkRlZmF1bHRDb2xsYXBzZSA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5leHBhbmRlZElkcyA9IHRoaXMuZGF0YVNvdXJjZS5tYXAoZCA9PiBkW3RoaXMuaWRGaWVsZF0udG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNFeHBhbmRlZCA9IChkYXRhSXRlbTogYW55KTogYm9vbGVhbiA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZElkcy5pbmRleE9mKGRhdGFJdGVtW3RoaXMuaWRGaWVsZF0udG9TdHJpbmcoKSkgPiAtMTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgb25Db2xsYXBzZShhcmdzOiBFeHBhbmRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBhbmRlZElkcyA9IHRoaXMuZXhwYW5kZWRJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT0gYXJncy5kYXRhSXRlbVt0aGlzLmlkRmllbGRdLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRXhwYW5kKGFyZ3M6IEV4cGFuZEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cGFuZGVkSWRzLnB1c2goYXJncy5kYXRhSXRlbVt0aGlzLmlkRmllbGRdLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZE5ldygpIHtcclxuICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgdHlwZTogXCJidXR0b25DbGlja1wiLFxyXG4gICAgICB0YXJnZXQ6IFwiZ3JvdXAubmV3TW9kZWwoKVwiLFxyXG4gICAgICBkYXRhOiBudWxsXHJcbiAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaERhdGEoKSB7XHJcbiAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgIHR5cGU6IFwiYnV0dG9uQ2xpY2tcIixcclxuICAgICAgdGFyZ2V0OiBcImdyb3VwLnJlZnJlc2hUcmVlTGlzdCgpXCIsXHJcbiAgICAgIGRhdGE6IG51bGxcclxuICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBHcmlkQnV0dG9ucygpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZV9XRiB8fCB0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZSkge1xyXG4gICAgICB0aGlzLmdyaWRCdG4gPSB7XHJcbiAgICAgICAgUmVhZE9ubHk6IGZhbHNlLFxyXG4gICAgICAgIFZpc2libGU6IHRydWUsXHJcbiAgICAgICAgSXNSZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgICAgV29ya2Zsb3dDb2RlOiB0aGlzLmRhdGEuR3JpZEJ1dHRvbkZpZWxkTmFtZV9XRixcclxuICAgICAgICBWYWx1ZTogdGhpcy5kYXRhLkdyaWRCdXR0b25GaWVsZE5hbWUsXHJcbiAgICAgICAgVHlwZTogdGhpcy5kYXRhLkdyaWRCdXR0b25GaWVsZE5hbWVfV0YgPyBcInp3b3JrZmxvd2J1dHRvbnNcIiA6IFwiemJ1dHRvbnNcIlxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gSW5saW5lIEVkaXRcclxuICBwcml2YXRlIGNyZWF0ZUZvcm1Db250cm9sc0ZvcklubGluZUVkaXQoZGF0YTogYW55KSB7XHJcbiAgICBsZXQgY291bnRlckluZGV4ID0gMDtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29sdW1ucy5maW5kKGMgPT4gYy5pc0VkaXRhYmxlSW5HcmlkKSA9PT0gdW5kZWZpbmVkIHx8ICFkYXRhKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMgPSB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMgfHwge307XHJcblxyXG4gICAgZGF0YS5mb3JFYWNoKGQgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtcyA9IHt9O1xyXG4gICAgICB0aGlzLm9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgIGl0ZW1zW2MuZmllbGRdID0gbmV3IEZvcm1Db250cm9sKGRbYy5maWVsZF0pO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChpdGVtcyk7XHJcblxyXG4gICAgICBpZiAoZFtcIklkXCJdKSB7XHJcbiAgICAgICAgaXRlbXNbXCJJZFwiXSA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBkW1wiSWRcIl0sIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBkW1wiSWRcIl0gPSBjb3VudGVySW5kZXgrKztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHNbZFtcIklkXCJdXSA9IGZvcm1Hcm91cDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldElubGluZUZpZWxkKHZhbHVlOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29sdW1ucy5maW5kKHggPT4geC5WYWx1ZSA9PT0gdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldElubGluZUZvcm0oZGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzW2RhdGFbXCJJZFwiXSB8fCByb3dJbmRleF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybUNvbnRyb2xEYXRhKCkge1xyXG4gICAgY29uc3QgZGF0YSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcykpIHtcclxuICAgICAgZGF0YS5wdXNoKHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwc1trXT8udmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNJbmxpbmVFZGl0Q29sVmlzaWJsZShkYXRhSXRlbTogYW55LCBjb2x1bW46IGFueSkge1xyXG4gICAgY29uc3QgaXNWaXNpYmxlID0gZGF0YUl0ZW1bYCR7Y29sdW1uLlZhbHVlfV9WaXNpYmxlYF07XHJcbiAgICByZXR1cm4gIShpc1Zpc2libGUgPT09IGZhbHNlKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCJcclxuICAgICBjbGFzcz1cImdyaWQtY29udGFpbmVyIGUxdGFnLXN0eWxlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGVcIj5cclxuICA8ZGl2IFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiIGNsYXNzPVwiZTF0YWctc3R5bGUxXCI+XHJcbiAgICA8a2VuZG8tdHJlZWxpc3QgW2tlbmRvVHJlZUxpc3RGbGF0QmluZGluZ109XCJkYXRhU291cmNlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCIgY2xhc3M9XCJkZXNrdG9wLWdyaWQgZTF0YWctc3R5bGUyXCIgW2lkRmllbGRdPVwib3B0aW9ucy5pZEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFyZW50SWRGaWVsZF09XCJvcHRpb25zLnBhcmVudElkRmllbGRcIiAoY2VsbENsaWNrKT1cImNlbGxDbGlja0hhbmRsZXIoJGV2ZW50KVwiIFtzb3J0YWJsZV09XCJvcHRpb25zLnNvcnRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cIm9wdGlvbnMucmVzaXphYmxlXCIgW2ZpbHRlcmFibGVdPVwib3B0aW9ucy5maWx0ZXJhYmxlXCIgW3Jlb3JkZXJhYmxlXT1cImZhbHNlXCIgW2NvbHVtbk1lbnVdPVwib3B0aW9ucy5jb2x1bW5NZW51XCJcclxuICAgICAgICAgICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJvcHRpb25zLnNjcm9sbGFibGVcIiBbYWdncmVnYXRlXT1cIm9wdGlvbnMuYWdncmVnYXRlXCIgW3BhZ2VhYmxlXT1cIm9wdGlvbnMucGFnZUFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJkYXRhLlBhZ2VTaXplXCIgW2lzRXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJvbkZpbHRlckNoYW5nZSgkZXZlbnQpXCIgKGV4cGFuZCk9XCJvbkV4cGFuZCgkZXZlbnQpXCIgKGNvbGxhcHNlKT1cIm9uQ29sbGFwc2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAga2VuZG9UcmVlTGlzdEV4cGFuZGFibGUgdHJlZWxpc3Q+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1RyZWVMaXN0VG9vbGJhclRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGEuQWxsb3dSZWZyZXNoQnV0dG9uIHx8IGRhdGEuQWxsb3dFeHBvcnQgfHwgZGF0YS5UaXRsZSB8fCBkYXRhLkdyaWRCdXR0b25GaWVsZE5hbWVfV0YgfHwgZGF0YS5HcmlkQnV0dG9uRmllbGROYW1lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvb2Jhci1sZWZ0LWl0ZW1cIj5cclxuICAgICAgICAgIDxmYS1pY29uICpuZ0lmPVwiZGF0YS5JY29uXCIgY2xhc3M9XCJncmlkVGl0bGVJY29uXCIgW2ljb25dPVwiZGF0YS5JY29uXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgPGtlbmRvLWxhYmVsIGNsYXNzPVwiZ3JpZFRpdGxlXCI+e3tkYXRhLlRpdGxlfX08L2tlbmRvLWxhYmVsPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50IGstYnV0dG9uIHJlZnJlc2gtYnRuXCIgKGNsaWNrKT1cInJlZnJlc2hEYXRhKClcIiAqbmdJZj1cImRhdGEuQWxsb3dSZWZyZXNoQnV0dG9uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1yZWZyZXNoLXNtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8aW9uLXJpcHBsZS1lZmZlY3Q+PC9pb24tcmlwcGxlLWVmZmVjdD5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJpZ2h0LWl0ZW1cIj5cclxuICAgICAgICAgIDxhcHAtendvcmtmbG93YnV0dG9ucyAqbmdJZj1cImdyaWRCdG4gJiYgZ3JpZEJ0bi5UeXBlID09PSAnendvcmtmbG93YnV0dG9ucydcIiBbZGF0YV09XCJncmlkQnRuXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXp3b3JrZmxvd2J1dHRvbnM+XHJcbiAgICAgICAgICA8YXBwLXpidXR0b25zICpuZ0lmPVwiZ3JpZEJ0biAmJiBncmlkQnRuLlR5cGUgPT09ICd6YnV0dG9ucydcIiBbZGF0YV09XCJncmlkQnRuXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXpidXR0b25zPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50IGstYnV0dG9uXCIga2VuZG9UcmVlTGlzdEV4Y2VsQ29tbWFuZFxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGEuQWxsb3dFeHBvcnRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLWRvd25sb2FkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8aW9uLXJpcHBsZS1lZmZlY3Q+PC9pb24tcmlwcGxlLWVmZmVjdD5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8IS0tXHJcbiAgICAgICAgW2ZpbHRlcmFibGVdPVwib3B0aW9ucy5maWx0ZXJhYmxlXCJcclxuICAgICAgW3Jlb3JkZXJhYmxlXT1cIm9wdGlvbnMucmVzaXphYmxlXCJcclxuICAgICAgICAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIG9wdGlvbnMuY29sdW1uczsgaW5kZXggYXMgaVwiPlxyXG4gICAgICAgIDxrZW5kby10cmVlbGlzdC1jb2x1bW4gKm5nSWY9XCIhY29sLmNvbW1hbmRcIiBbY2xhc3NdPVwiY29sLmNsYXNzXCIgW2V4cGFuZGFibGVdPVwiaT09PTBcIiBbZmllbGRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJjb2wudGl0bGUgfHwgY29sLmZpZWxkXCIgW3dpZHRoXT1cImNvbC53aWR0aCB8fCAyNTBcIiBbZmlsdGVyYWJsZV09XCJmaWx0ZXJhYmxlKGNvbC5lbmFibGVGaWx0ZXJpbmcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJzb3J0YWJsZShjb2wuZW5hYmxlU29ydGluZylcIiBbaGlkZGVuXT1cIiFpc0NvbHVtbnNWaXNpYmxlKGNvbC52aXNpYmxlKVwiIFtzdHlsZV09XCJnZXRHcmlkQ29sdW1uU3R5bGUoKVwiIGNsYXNzPVwiZTF0YWctc3R5bGUzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJTdHlsZV09XCJnZXRHcmlkSGVhZGVyU3R5bGUoKVwiIGhlYWRlckNsYXNzPVwiZTF0YWctc3R5bGU0XCIgW2Zvb3RlclN0eWxlXT1cImdldEdyaWRGb290ZXJTdHlsZSgpXCIgZm9vdGVyQ2xhc3M9XCJlMXRhZy1zdHlsZTlcIj5cclxuICAgICAgICAgIDxkaXYgW25nU3dpdGNoXT1cInRydWVcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiY29sLmZpZWxkVHlwZSA9PT0gJ251bWJlcidcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ2N1cnJlbmN5J1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnem51bWVyaWMnXCI+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvVHJlZUxpc3RGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtbnVtZXJpYy1maWx0ZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJlcVwiPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWVxLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1uZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1ndC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDwva2VuZG8tdHJlZWxpc3QtbnVtZXJpYy1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiY29sLmZpZWxkVHlwZSA9PSAnemRhdGUnXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6ZGF0ZXRpbWUnXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmZpbHRlckJ5RGF0ZVJhbmdlID09PSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9UcmVlTGlzdEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIiBvcGVyYXRvcj1cImx0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGF0ZS1yYW5nZS1maWx0ZXItY2VsbCBjbGFzcz1cImRhdGUtcmFuZ2UtZmlsdGVyXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBbZmllbGRdPVwiY29sLmZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1sdC1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1sdC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1ndC1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1ndC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWd0ZS1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1ndGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPC9kYXRlLXJhbmdlLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmZpbHRlckJ5RGF0ZVJhbmdlID09PSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvVHJlZUxpc3RGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1kYXRlLWZpbHRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImx0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1sdGUtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItbHRlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3QtZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLXRyZWVsaXN0LWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDwva2VuZG8tdHJlZWxpc3QtZGF0ZS1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvVHJlZUxpc3RGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tdHJlZWxpc3Qtc3RyaW5nLWZpbHRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImNvbnRhaW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItY29udGFpbnMtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItY29udGFpbnMtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItZXEtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItbmVxLW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLW5lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1zdGFydHN3aXRoLW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLXN0YXJ0c3dpdGgtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItZW5kc3dpdGgtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItZW5kc3dpdGgtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby10cmVlbGlzdC1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tdHJlZWxpc3QtZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLXRyZWVsaXN0LWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby10cmVlbGlzdC1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPC9rZW5kby10cmVlbGlzdC1zdHJpbmctZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1RyZWVMaXN0Q2VsbFRlbXBsYXRlIGxldC1kYXRhSXRlbSBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIGxldC1jZWxsQ29udGV4dD1cImNlbGxDb250ZXh0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDdweCAwO2Rpc3BsYXk6IGlubGluZTtcIiBbc3R5bGUuY29sb3JdPVwiKCEhZGF0YUl0ZW0uQ29sb3IgPyBbZGF0YUl0ZW0uQ29sb3JdIDogJ2JsYWNrJylcIlxyXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5uYXZpZ2F0ZVRvICYmIGNvbC5pc0VkaXRhYmxlSW5HcmlkICE9PSB0cnVlXCIgW25nU3dpdGNoXT1cImNvbC5maWVsZFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENvbENsYXNzKGRhdGFJdGVtLCBjb2wpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiAnZGQvTU0veXl5eScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6c2hvcnRkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6ICdNTU0geXl5eScgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenVpZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246cmlnaHQ7XCI+e3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlciB9fSA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O1wiPnt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBudW1iZXI6ICcxLjItMicgfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6bnVtZXJpYydcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O1wiPnt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBudW1iZXI6IGdldEZvcm1hdChjb2wpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIndXJsJ1wiIHN0eWxlPVwiY29sb3I6IGJsdWU7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6bGFiZWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwienRyZWUtaW5saW5lLWJsb2NrIGUxdGFnLXN0eWxlMTBcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEwXCIgW2lubmVySFRNTF09XCJkYXRhSXRlbVtjb2wuZmllbGRdIHwgaHRtbFNhbml0aXplXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiA3cHggMDtkaXNwbGF5OiBpbmxpbmU7XCIgW3N0eWxlLmNvbG9yXT1cIighIWRhdGFJdGVtLkNvbG9yID8gW2RhdGFJdGVtLkNvbG9yXSA6ICdibGFjaycpXCJcclxuICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb2wubmF2aWdhdGVUbyAmJiBjb2wuaXNFZGl0YWJsZUluR3JpZCA9PT0gdHJ1ZSAmJiBpc0lubGluZUVkaXRDb2xWaXNpYmxlKGRhdGFJdGVtLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRDb2xDbGFzcyhkYXRhSXRlbSwgY29sKVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNVwiIGNsYXNzPVwiZTF0YWctc3R5bGU1XCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16aW5wdXQtY29udGFpbmVyIFtkYXRhXT1cImdldElubGluZUZpZWxkKGNvbC5maWVsZClcIiBbZ3JvdXBdPVwiZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJnZXRJbmxpbmVGb3JtKGRhdGFJdGVtLCByb3dJbmRleClcIiBbY29udGFpbmVyRmllbGRdPVwiY29udGFpbmVyRmllbGRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlNlwiPlxyXG4gICAgICAgICAgICAgIDwvYXBwLXppbnB1dC1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEhY29sLm5hdmlnYXRlVG9cIiAoY2xpY2spPVwib25OYXZpZ2F0ZVRvKCRldmVudCwgY29sLCBkYXRhSXRlbSwgZGF0YUl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCIgc2l6ZT1cInNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxpb24taWNvbiBzbG90PSBcImVuZFwiIG5hbWU9XCJhcnJvdy1mb3J3YXJkXCI+PC9pb24taWNvbj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBzbG90PVwiZW5kXCIgW2ljb25dPVwiJ2Fycm93LXJpZ2h0J1wiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjb2wuZm9vdGVyVGVtcGxhdGVcIiBrZW5kb1RyZWVMaXN0Rm9vdGVyVGVtcGxhdGUgbGV0LWFnZ3JlZ2F0ZXM9XCJhZ2dyZWdhdGVzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sLm5hdmlnYXRlVG9cIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlN1wiXHJcbiAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyaWdodEFsaWduZWQnOiBjb2wuZmllbGRUeXBlID09PSAnbnVtYmVyJyB8fCBjb2wuZmllbGRUeXBlID09PSAnY3VycmVuY3knfVwiIGNsYXNzPVwiZTF0YWctc3R5bGU3XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICA8Yj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVRpdGxlIHwgdGl0bGVjYXNlIH19IHt7IGFnZ3JlZ2F0ZXNbY29sLmZpZWxkXVtjb2wuYWdncmVnYXRlVHlwZV0gfCBudW1iZXIgfX1cclxuICAgICAgICAgICAgICAgIDwvYj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgIDxiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVGl0bGUgfCB0aXRsZWNhc2UgfX0ge3sgYWdncmVnYXRlc1tjb2wuZmllbGRdW2NvbC5hZ2dyZWdhdGVUeXBlXSB8IG51bWJlcjogJzEuMi0yJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9iPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwva2VuZG8tdHJlZWxpc3QtY29sdW1uPlxyXG4gICAgICAgIDxrZW5kby10cmVlbGlzdC1jb21tYW5kLWNvbHVtbiAqbmdJZj1cIiEhY29sLmNvbW1hbmRcIiBbdGl0bGVdPVwiY29sLnRpdGxlIHx8IGNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCJjb2wud2lkdGggfHwgMjUwXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU4XCIgY2xhc3M9XCJlMXRhZy1zdHlsZThcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1RyZWVMaXN0Q2VsbFRlbXBsYXRlIGxldC1jZWxsQ29udGV4dD1cImNlbGxDb250ZXh0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiY29sLmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgY29sMiBvZiBjb2wuY29tbWFuZDsgaW5kZXggYXMgaVwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2tlbmRvVHJlZUxpc3RFZGl0Q29tbWFuZF09XCJjZWxsQ29udGV4dFwiIFt0aXRsZV09XCJjb2wyLnRleHRcIiAoY2xpY2spPVwiYnV0dG9uQ2xpY2soY29sMiwgY2VsbENvbnRleHQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiaXNCdXR0b25IaWRkZW4oY29sMiwgY2VsbENvbnRleHQpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJjb2wyLmljb25cIiBbc3R5bGUuY29sb3JdPVwiKCEhY29sMi5jb2xvciA/IFtjb2wyLmNvbG9yXSA6ICdibGFjaycpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sMi5TaG93TGFiZWwgPT09IHVuZGVmaW5lZCB8fCBjb2wyLlNob3dMYWJlbFwiPnt7Y29sMi50ZXh0fX08L2Rpdj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwva2VuZG8tdHJlZWxpc3QtY29tbWFuZC1jb2x1bW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSA8a2VuZG8tdHJlZWxpc3QtY29tbWFuZC1jb2x1bW4gd2lkdGg9XCIxNDBcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb1RyZWVMaXN0Q2VsbFRlbXBsYXRlIGxldC1pc05ldz1cImlzTmV3XCIgbGV0LWNlbGxDb250ZXh0PVwiY2VsbENvbnRleHRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIFtrZW5kb1RyZWVMaXN0QWRkQ29tbWFuZF09XCJjZWxsQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmlsdGVyLWFkZC1leHByZXNzaW9uXCIgdGl0bGU9XCJBZGQgQ2hpbGRcIj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIFtrZW5kb1RyZWVMaXN0Q2FuY2VsQ29tbWFuZF09XCJjZWxsQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiY2FuY2VsXCIgdGl0bGU9XCJ7eyBpc05ldyA/ICdEaXNjYXJkIGNoYW5nZXMnIDogJ0NhbmNlbCcgfX1cIj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwva2VuZG8tdHJlZWxpc3QtY29tbWFuZC1jb2x1bW4+IC0tPlxyXG4gICAgPC9rZW5kby10cmVlbGlzdD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==