mmhglobal-dynamicform 2.15.2 → 2.16.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.
@@ -6,25 +6,35 @@ import { Component, ViewChild } from "@angular/core";
6
6
  import { ContainerFieldBase } from "../components/containerfieldbase.component";
7
7
  import { ZComponentHelper } from "mmhglobal-zcore";
8
8
  import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
9
- import { auditTime, forkJoin, of, tap } from "rxjs";
9
+ import { auditTime, delay, forkJoin, of, tap } from "rxjs";
10
+ import { collapseAnimation, rotateAnimation } from "../animations/component-animations";
10
11
  import * as i0 from "@angular/core";
11
12
  import * as i1 from "../services/zcomponent.service";
12
- import * as i2 from "@angular/cdk/scrolling";
13
- import * as i3 from "../zformcontrol/zformcontrol.component";
14
- import * as i4 from "@angular/common";
15
- import * as i5 from "@angular/flex-layout/extended";
16
- import * as i6 from "../pipe/htmlSanitize.pipe";
13
+ import * as i2 from "mmhglobal-zcore";
14
+ import * as i3 from "@angular/cdk/scrolling";
15
+ import * as i4 from "@fortawesome/angular-fontawesome";
16
+ import * as i5 from "../zformcontrol/zformcontrol.component";
17
+ import * as i6 from "@angular/common";
18
+ import * as i7 from "@angular/flex-layout/extended";
19
+ import * as i8 from "../pipe/htmlSanitize.pipe";
17
20
  // Approach 1: Total Count is known, get next page upon scroll. (Will only have multiple pages / pageable)
18
21
  // Approach 2: Total Count is not known, append more data at runtime. (Will only have 1 page / not pageable)
19
22
  export class VirtualScrollComponent extends ContainerFieldBase {
20
- constructor(componentService) {
23
+ constructor(componentService, fontAweSomeService) {
21
24
  super(componentService);
25
+ this.fontAweSomeService = fontAweSomeService;
26
+ this.collapsedGroupBy = []; // Used to define animation status
27
+ this.groupByValueToExpand = ''; // Used to define animation status
28
+ this.collapsedGroupBy_FirstNodeIndexList = new Array(); // When collapse, need to retain the first node in the list so that the group by title will not be hidden
29
+ this.fullDataItems = [];
30
+ this.dataItems = [];
22
31
  this.pageSize = 50;
23
32
  this.pageFetched = [];
24
33
  this.footerFields = [];
25
34
  }
26
35
  ngOnInit() {
27
- this.setData();
36
+ this.setupComponent();
37
+ this.setupDataItems();
28
38
  this.setupFooter();
29
39
  super.initComponent().subscribe();
30
40
  }
@@ -39,7 +49,8 @@ export class VirtualScrollComponent extends ContainerFieldBase {
39
49
  this.viewPort.scrollToIndex(0);
40
50
  }
41
51
  }
42
- setData() {
52
+ setupComponent() {
53
+ this.collapsedGroupBy = [];
43
54
  if (this.data.Options) {
44
55
  if (typeof this.data.Options === 'string' && this.data.Options.startsWith('group.')) {
45
56
  this.options = ZComponentHelper.getGroupValue(this.data.Options, this.group);
@@ -49,36 +60,49 @@ export class VirtualScrollComponent extends ContainerFieldBase {
49
60
  }
50
61
  this.pageSize = this.options.pageSize || 50;
51
62
  this.options.loadingLabel = this.options.loadingLabel || '<div>Loading</div>';
52
- this.setupDataItems();
53
63
  }
54
64
  }
55
65
  appendData(dataItems) {
56
- this.dataItems = this.dataItems.concat(dataItems);
57
- this.options.totalCount = this.dataItems.length;
58
- this.pageSize = this.dataItems.length;
66
+ // this.dataItems = this.dataItems.concat(dataItems);
67
+ // this.pageSize = this.dataItems.length;
68
+ this.fullDataItems = this.fullDataItems.concat(dataItems);
69
+ this.pageSize = this.fullDataItems.length;
70
+ this.computeDataItems();
59
71
  }
60
72
  setupDataItems() {
61
73
  this.pageFetched = [];
62
- if (this.options.dataItems) { // init: 50, pagesize: 20
63
- if (Array.isArray(this.options.dataItems) && this.options.dataItems.length > 0) {
64
- const cnt = this.options.totalCount - this.options.dataItems.length;
65
- if (cnt < 0) {
66
- console.error('DataItems cannot be more than total count.');
67
- return;
68
- }
69
- this.dataItems = this.options.dataItems.concat(Array(cnt).fill(false));
70
- const pageNoToMarkAsFetch = Math.ceil(this.options.dataItems.length / this.pageSize) - 1;
71
- for (let i = 0; i <= pageNoToMarkAsFetch; i++) {
72
- this.pageFetched.push(i);
73
- }
74
+ if (this.data.DataSetResult) {
75
+ let dataSetResult = this.data.DataSetResult;
76
+ if (typeof dataSetResult == 'string' && dataSetResult.startsWith('group.')) {
77
+ dataSetResult = ZComponentHelper.getGroupValue(dataSetResult, this.group);
74
78
  }
75
- else {
76
- this.dataItems = Array(this.options.totalCount).fill(false);
79
+ this.setData(dataSetResult);
80
+ }
81
+ else {
82
+ this.dataItems = [];
83
+ }
84
+ }
85
+ setData(dataSetResult) {
86
+ if (dataSetResult.dataSet && Array.isArray(dataSetResult.dataSet) && dataSetResult.dataSet.length > 0) {
87
+ const cnt = dataSetResult.totalCount - dataSetResult.dataSet.length;
88
+ if (cnt < 0) {
89
+ console.error('DataItems cannot be more than total count.');
90
+ return;
77
91
  }
92
+ this.dataItems = dataSetResult.dataSet.concat(Array(cnt).fill(false));
93
+ const pageNoToMarkAsFetch = Math.ceil(dataSetResult.dataSet.length / this.pageSize) - 1;
94
+ for (let i = 0; i <= pageNoToMarkAsFetch; i++) {
95
+ this.pageFetched.push(i);
96
+ }
97
+ }
98
+ else if (dataSetResult.totalCount) {
99
+ this.dataItems = Array(dataSetResult.totalCount).fill(false);
78
100
  }
79
101
  else {
80
- this.dataItems = Array(this.options.totalCount).fill(false);
102
+ this.dataItems = [];
81
103
  }
104
+ this.fullDataItems = this.dataItems;
105
+ this.computeDataItems();
82
106
  }
83
107
  populateListData() {
84
108
  const renderRange = this.viewPort.getRenderedRange();
@@ -107,8 +131,8 @@ export class VirtualScrollComponent extends ContainerFieldBase {
107
131
  }
108
132
  }
109
133
  fetchData(pageNo) {
110
- if (this.data['OnScroll'] && typeof this.data['OnScroll'] == 'string' && this.data['OnScroll'].startsWith('group.')) {
111
- const onScrollEvent = ZComponentHelper.getGroupEvalValue.call(this, this.data['OnScroll']);
134
+ if (this.data.OnScroll && typeof this.data.OnScroll == 'string' && this.data.OnScroll.startsWith('group.')) {
135
+ const onScrollEvent = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnScroll);
112
136
  if (typeof onScrollEvent === 'function') {
113
137
  const callFunc = onScrollEvent.bind(this.group.ctrlScope);
114
138
  return callFunc(this.group, { pageNo: pageNo, pageSize: this.pageSize });
@@ -129,14 +153,73 @@ export class VirtualScrollComponent extends ContainerFieldBase {
129
153
  this.footerFields = this.data.Value.filter(x => x.Section === 'footer');
130
154
  }
131
155
  }
156
+ //#region Group By
157
+ getGroupByLabelTemplate(dataItem, options) {
158
+ if (options.groupByLabelTemplate && typeof options.groupByLabelTemplate == 'string') {
159
+ if (options.groupByLabelTemplate.startsWith('group.')) {
160
+ const getTemplateFunc = ZComponentHelper.getGroupEvalValue.call(this, options.groupByLabelTemplate);
161
+ if (getTemplateFunc) {
162
+ return getTemplateFunc({
163
+ dataItem,
164
+ options,
165
+ });
166
+ }
167
+ }
168
+ else {
169
+ return dataItem[options.groupByLabelTemplate];
170
+ }
171
+ }
172
+ }
173
+ groupByOnClick(groupByValue) {
174
+ if (!this.options.isGroupByCollapsible) {
175
+ return;
176
+ }
177
+ // use collapse / expand to control animation sequence
178
+ const isToCollapse = !this.collapsedGroupBy.includes(groupByValue);
179
+ const firstNodeIndex = this.fullDataItems.map(x => x[this.options.groupBy]).indexOf(groupByValue);
180
+ if (isToCollapse) {
181
+ // to collapse (For animation: Change status, then append data)
182
+ this.collapsedGroupBy.push(groupByValue);
183
+ this.collapsedGroupBy_FirstNodeIndexList.push(firstNodeIndex);
184
+ of({}).pipe(delay(400), tap(() => this.computeDataItems())).subscribe();
185
+ }
186
+ else {
187
+ // to expand (For animation: Append data, then change status)
188
+ this.collapsedGroupBy_FirstNodeIndexList = this.collapsedGroupBy_FirstNodeIndexList.filter(x => x != firstNodeIndex);
189
+ const tempCollapsedGroupBy = this.collapsedGroupBy.filter(x => x !== groupByValue);
190
+ this.dataItems = this.fullDataItems.filter((x, index) => !tempCollapsedGroupBy.includes(x[this.options.groupBy]) || this.collapsedGroupBy_FirstNodeIndexList.includes(index));
191
+ this.groupByValueToExpand = groupByValue;
192
+ of({}).pipe(delay(0), tap(() => {
193
+ this.collapsedGroupBy = tempCollapsedGroupBy;
194
+ this.groupByValueToExpand = groupByValue;
195
+ })).subscribe();
196
+ }
197
+ }
198
+ computeDataItems() {
199
+ this.dataItems = this.fullDataItems.filter((x, index) => !this.collapsedGroupBy.includes(x[this.options.groupBy]) || this.collapsedGroupBy_FirstNodeIndexList.includes(index));
200
+ }
201
+ expandAll() {
202
+ this.collapsedGroupBy = [];
203
+ this.computeDataItems();
204
+ }
205
+ expandByGroupByValues(groupByValue) {
206
+ this.collapsedGroupBy = this.collapsedGroupBy.filter(x => !groupByValue.includes(x));
207
+ this.computeDataItems();
208
+ }
132
209
  }
133
- VirtualScrollComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VirtualScrollComponent, deps: [{ token: i1.ZComponentService }], target: i0.ɵɵFactoryTarget.Component });
134
- VirtualScrollComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: VirtualScrollComponent, selector: "app-virtual-scroll", viewQueries: [{ propertyName: "viewPort", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n class=\"container e1tag-container-style\" [style]=\"componentProperties.containerStyle.style\"\r\n [ngClass]=\"(data.ComponentStyleType || '') + ' ' + (data.Class || '')\">\r\n <cdk-virtual-scroll-viewport [itemSize]=\"options.itemSize\" [style]=\"componentProperties.containerStyle.style1\"\r\n class=\"virtual-scroll-viewport e1tag-container-style1\" [minBufferPx]=\"options.minBufferPx\"\r\n [maxBufferPx]=\"options.maxBufferPx\">\r\n <!-- <ng-container *cdkVirtualFor=\"let field of clonedFields\"> -->\r\n <ng-container *cdkVirtualFor=\"let dataItem of dataItems; let i = index\">\r\n <div [style.height.px]=\"options.itemSize\" [style.min-height.px]=\"options.itemSize\"\r\n [style.max-height.px]=\"options.itemSize\" [style]=\"componentProperties.containerStyle.style2\"\r\n class=\"e1tag-container-style2\" (click)=\"onClick($event, dataItem)\"\r\n [id]=\"data.Name + '_' + dataItem?.Value?.Id || ''\">\r\n <div *ngIf=\"!dataItem\" [innerHTML]=\"options.loadingLabel | htmlSanitize\"></div>\r\n <div *ngIf=\"dataItem.Label\" [innerHTML]=\"dataItem.Label | htmlSanitize\"></div>\r\n </div>\r\n </ng-container>\r\n <app-zformcontrol *ngFor=\"let field of footerFields\" [field]=\"field\" [containerField]=\"data\" [group]=\"group\"\r\n [form]=\"form\" [style]=\"componentProperties.containerStyle.style3\" class=\"e1tag-container-style3\">\r\n </app-zformcontrol>\r\n </cdk-virtual-scroll-viewport>\r\n</div>\r\n", styles: [".virtual-scroll-viewport{height:500px}\n"], components: [{ type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { type: i3.ZformcontrolComponent, selector: "app-zformcontrol", inputs: ["field", "group", "form", "containerField"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.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: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "htmlSanitize": i6.HtmlSanitizePipe } });
210
+ VirtualScrollComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VirtualScrollComponent, deps: [{ token: i1.ZComponentService }, { token: i2.FontAweSomeService }], target: i0.ɵɵFactoryTarget.Component });
211
+ VirtualScrollComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: VirtualScrollComponent, selector: "app-virtual-scroll", viewQueries: [{ propertyName: "viewPort", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n class=\"container e1tag-container-style\" [style]=\"componentProperties.containerStyle.style\"\r\n [ngClass]=\"(data.ComponentStyleType || '') + ' ' + (data.Class || '')\">\r\n <cdk-virtual-scroll-viewport [itemSize]=\"options.itemSize\" [style]=\"componentProperties.containerStyle.style1\"\r\n class=\"virtual-scroll-viewport e1tag-container-style1\" [minBufferPx]=\"options.minBufferPx\"\r\n [maxBufferPx]=\"options.maxBufferPx\">\r\n <!-- <ng-container *cdkVirtualFor=\"let field of clonedFields\"> -->\r\n <ng-container *cdkVirtualFor=\"let dataItem of dataItems; let i = index\">\r\n <div class=\"virtual-scroll-groupby e1tag-container-style4\" [style]=\"componentProperties.containerStyle.style4\"\r\n *ngIf=\"options.groupBy && (!dataItems[i-1] || dataItem[options.groupBy] !== dataItems[i-1][options.groupBy])\"\r\n (click)=\"groupByOnClick(dataItem[options.groupBy])\" [class.groupby-collapsible]=\"options.isGroupByCollapsible\">\r\n <fa-icon class=\"virtual-scroll-groupby-arrow-icon e1tag-container-style5\"\r\n [style]=\"componentProperties.containerStyle.style5\" *ngIf=\"!!options.isGroupByCollapsible\"\r\n [icon]=\"getFontAwesome('caret-down', fontAweSomeService)\"\r\n [@rotateAnimation]=\"{value: collapsedGroupBy.includes(dataItem[options.groupBy]) ? 'rotate' : 'default', params: {degree: -90}}\">\r\n </fa-icon>\r\n <span class=\"virtual-scroll-groupby-label e1tag-container-style6\"\r\n [style]=\"componentProperties.containerStyle.style6\">\r\n {{options.groupByLabelTemplate ? getGroupByLabelTemplate(dataItem, options) : dataItem[options.groupBy]}}\r\n </span>\r\n </div>\r\n <div [style.height.px]=\"options.itemSize\" [style.min-height.px]=\"options.itemSize\"\r\n [style.max-height.px]=\"options.itemSize\" [style]=\"componentProperties.containerStyle.style2\"\r\n class=\"e1tag-container-style2 virtual-scroll-dataitem\" (click)=\"onClick($event, dataItem)\"\r\n [id]=\"data.Name + '_' + dataItem?.Value?.Id || ''\"\r\n [@collapseAnimation]=\"{value: !!options.groupBy && collapsedGroupBy.includes(dataItem[options.groupBy]) ? 'collapse' : 'default'}\"\r\n [class.groupby-value-expand]=\"groupByValueToExpand == (dataItem[options.groupBy])\">\r\n <div *ngIf=\"!dataItem\" [innerHTML]=\"options.loadingLabel | htmlSanitize\"></div>\r\n <div *ngIf=\"dataItem.Label\" [innerHTML]=\"dataItem.Label | htmlSanitize\"></div>\r\n </div>\r\n </ng-container>\r\n <app-zformcontrol *ngFor=\"let field of footerFields\" [field]=\"field\" [containerField]=\"data\" [group]=\"group\"\r\n [form]=\"form\" [style]=\"componentProperties.containerStyle.style3\" class=\"e1tag-container-style3\">\r\n </app-zformcontrol>\r\n </cdk-virtual-scroll-viewport>\r\n</div>\r\n", styles: [".virtual-scroll-viewport{height:500px}.virtual-scroll-viewport .virtual-scroll-groupby{background:rgba(var(--ion-color-secondary-rgb),.1);font-weight:500;padding:12px 0 4px 12px;margin:1px}.virtual-scroll-viewport .virtual-scroll-groupby.groupby-collapsible{cursor:pointer;display:grid;grid-template-columns:20px auto}.virtual-scroll-viewport .virtual-scroll-groupby.groupby-collapsible:hover{background:rgba(var(--ion-color-secondary-rgb),.05)}.virtual-scroll-viewport .virtual-scroll-groupby>.virtual-scroll-groupby-arrow-icon{width:-moz-fit-content;width:fit-content}.virtual-scroll-viewport .virtual-scroll-dataitem.groupby-value-expand{transform:translateY(-10%);opacity:.2}\n"], components: [{ type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i5.ZformcontrolComponent, selector: "app-zformcontrol", inputs: ["field", "group", "form", "containerField"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.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: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "htmlSanitize": i8.HtmlSanitizePipe }, animations: [
212
+ collapseAnimation,
213
+ rotateAnimation
214
+ ] });
135
215
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VirtualScrollComponent, decorators: [{
136
216
  type: Component,
137
- args: [{ selector: "app-virtual-scroll", template: "<div\r\n *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n class=\"container e1tag-container-style\" [style]=\"componentProperties.containerStyle.style\"\r\n [ngClass]=\"(data.ComponentStyleType || '') + ' ' + (data.Class || '')\">\r\n <cdk-virtual-scroll-viewport [itemSize]=\"options.itemSize\" [style]=\"componentProperties.containerStyle.style1\"\r\n class=\"virtual-scroll-viewport e1tag-container-style1\" [minBufferPx]=\"options.minBufferPx\"\r\n [maxBufferPx]=\"options.maxBufferPx\">\r\n <!-- <ng-container *cdkVirtualFor=\"let field of clonedFields\"> -->\r\n <ng-container *cdkVirtualFor=\"let dataItem of dataItems; let i = index\">\r\n <div [style.height.px]=\"options.itemSize\" [style.min-height.px]=\"options.itemSize\"\r\n [style.max-height.px]=\"options.itemSize\" [style]=\"componentProperties.containerStyle.style2\"\r\n class=\"e1tag-container-style2\" (click)=\"onClick($event, dataItem)\"\r\n [id]=\"data.Name + '_' + dataItem?.Value?.Id || ''\">\r\n <div *ngIf=\"!dataItem\" [innerHTML]=\"options.loadingLabel | htmlSanitize\"></div>\r\n <div *ngIf=\"dataItem.Label\" [innerHTML]=\"dataItem.Label | htmlSanitize\"></div>\r\n </div>\r\n </ng-container>\r\n <app-zformcontrol *ngFor=\"let field of footerFields\" [field]=\"field\" [containerField]=\"data\" [group]=\"group\"\r\n [form]=\"form\" [style]=\"componentProperties.containerStyle.style3\" class=\"e1tag-container-style3\">\r\n </app-zformcontrol>\r\n </cdk-virtual-scroll-viewport>\r\n</div>\r\n", styles: [".virtual-scroll-viewport{height:500px}\n"] }]
138
- }], ctorParameters: function () { return [{ type: i1.ZComponentService }]; }, propDecorators: { viewPort: [{
217
+ args: [{ selector: "app-virtual-scroll", animations: [
218
+ collapseAnimation,
219
+ rotateAnimation
220
+ ], template: "<div\r\n *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n class=\"container e1tag-container-style\" [style]=\"componentProperties.containerStyle.style\"\r\n [ngClass]=\"(data.ComponentStyleType || '') + ' ' + (data.Class || '')\">\r\n <cdk-virtual-scroll-viewport [itemSize]=\"options.itemSize\" [style]=\"componentProperties.containerStyle.style1\"\r\n class=\"virtual-scroll-viewport e1tag-container-style1\" [minBufferPx]=\"options.minBufferPx\"\r\n [maxBufferPx]=\"options.maxBufferPx\">\r\n <!-- <ng-container *cdkVirtualFor=\"let field of clonedFields\"> -->\r\n <ng-container *cdkVirtualFor=\"let dataItem of dataItems; let i = index\">\r\n <div class=\"virtual-scroll-groupby e1tag-container-style4\" [style]=\"componentProperties.containerStyle.style4\"\r\n *ngIf=\"options.groupBy && (!dataItems[i-1] || dataItem[options.groupBy] !== dataItems[i-1][options.groupBy])\"\r\n (click)=\"groupByOnClick(dataItem[options.groupBy])\" [class.groupby-collapsible]=\"options.isGroupByCollapsible\">\r\n <fa-icon class=\"virtual-scroll-groupby-arrow-icon e1tag-container-style5\"\r\n [style]=\"componentProperties.containerStyle.style5\" *ngIf=\"!!options.isGroupByCollapsible\"\r\n [icon]=\"getFontAwesome('caret-down', fontAweSomeService)\"\r\n [@rotateAnimation]=\"{value: collapsedGroupBy.includes(dataItem[options.groupBy]) ? 'rotate' : 'default', params: {degree: -90}}\">\r\n </fa-icon>\r\n <span class=\"virtual-scroll-groupby-label e1tag-container-style6\"\r\n [style]=\"componentProperties.containerStyle.style6\">\r\n {{options.groupByLabelTemplate ? getGroupByLabelTemplate(dataItem, options) : dataItem[options.groupBy]}}\r\n </span>\r\n </div>\r\n <div [style.height.px]=\"options.itemSize\" [style.min-height.px]=\"options.itemSize\"\r\n [style.max-height.px]=\"options.itemSize\" [style]=\"componentProperties.containerStyle.style2\"\r\n class=\"e1tag-container-style2 virtual-scroll-dataitem\" (click)=\"onClick($event, dataItem)\"\r\n [id]=\"data.Name + '_' + dataItem?.Value?.Id || ''\"\r\n [@collapseAnimation]=\"{value: !!options.groupBy && collapsedGroupBy.includes(dataItem[options.groupBy]) ? 'collapse' : 'default'}\"\r\n [class.groupby-value-expand]=\"groupByValueToExpand == (dataItem[options.groupBy])\">\r\n <div *ngIf=\"!dataItem\" [innerHTML]=\"options.loadingLabel | htmlSanitize\"></div>\r\n <div *ngIf=\"dataItem.Label\" [innerHTML]=\"dataItem.Label | htmlSanitize\"></div>\r\n </div>\r\n </ng-container>\r\n <app-zformcontrol *ngFor=\"let field of footerFields\" [field]=\"field\" [containerField]=\"data\" [group]=\"group\"\r\n [form]=\"form\" [style]=\"componentProperties.containerStyle.style3\" class=\"e1tag-container-style3\">\r\n </app-zformcontrol>\r\n </cdk-virtual-scroll-viewport>\r\n</div>\r\n", styles: [".virtual-scroll-viewport{height:500px}.virtual-scroll-viewport .virtual-scroll-groupby{background:rgba(var(--ion-color-secondary-rgb),.1);font-weight:500;padding:12px 0 4px 12px;margin:1px}.virtual-scroll-viewport .virtual-scroll-groupby.groupby-collapsible{cursor:pointer;display:grid;grid-template-columns:20px auto}.virtual-scroll-viewport .virtual-scroll-groupby.groupby-collapsible:hover{background:rgba(var(--ion-color-secondary-rgb),.05)}.virtual-scroll-viewport .virtual-scroll-groupby>.virtual-scroll-groupby-arrow-icon{width:-moz-fit-content;width:fit-content}.virtual-scroll-viewport .virtual-scroll-dataitem.groupby-value-expand{transform:translateY(-10%);opacity:.2}\n"] }]
221
+ }], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.FontAweSomeService }]; }, propDecorators: { viewPort: [{
139
222
  type: ViewChild,
140
223
  args: [CdkVirtualScrollViewport]
141
224
  }] } });
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1zY3JvbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvdmlydHVhbC1zY3JvbGwvdmlydHVhbC1zY3JvbGwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvdmlydHVhbC1zY3JvbGwvdmlydHVhbC1zY3JvbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELDZCQUE2QjtBQUU3Qiw4QkFBOEI7QUFFOUIsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRWhGLE9BQU8sRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBYyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7O0FBU2hFLDBHQUEwRztBQUMxRyw0R0FBNEc7QUFFNUcsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGtCQUFrQjtJQVE1RCxZQUNFLGdCQUFtQztRQUVuQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQVJuQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFFakIsaUJBQVksR0FBRyxFQUFFLENBQUM7SUFNekIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FDcEMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLElBQUksR0FBRyxDQUFDLEVBQ3RELEdBQUcsQ0FBQyxDQUFDLFNBQWlCLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFTSxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNyQixJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDbkYsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlFO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDbEM7WUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxvQkFBb0IsQ0FBQztZQUM5RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRU0sVUFBVSxDQUFDLFNBQXFCO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUN4QyxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUseUJBQXlCO1lBQ3JELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzlFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDcEUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO29CQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztvQkFDNUQsT0FBTztpQkFDUjtnQkFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDMUI7YUFDRjtpQkFDSTtnQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM3RDtTQUNGO2FBQ0k7WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3RDtJQUNILENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JELElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFO1lBQ2hFLE9BQU87U0FDUjtRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBFLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFtQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzQyxHQUFHLENBQUMsSUFBSSxDQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUNKLENBQUM7U0FDSDtRQUVELElBQUksV0FBVyxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3JFLEdBQUcsQ0FBQyxJQUFJLENBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDLENBQ0osQ0FBQztTQUNIO1FBRUQsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNsQixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFTyxTQUFTLENBQUMsTUFBTTtRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuSCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMzRixJQUFJLE9BQU8sYUFBYSxLQUFLLFVBQVUsRUFBRTtnQkFDdkMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDMUU7U0FDRjtRQUVELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxhQUFxQixFQUFFLElBQWdCO1FBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQztTQUN6RTtJQUNILENBQUM7O21IQTVJVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixvR0FDdEIsd0JBQXdCLHVFQ3pCckMsa21EQXNCQTsyRkRFYSxzQkFBc0I7a0JBVGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3dHQVNPLFFBQVE7c0JBQTVDLFNBQVM7dUJBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29udGFpbmVyRmllbGRCYXNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvY29udGFpbmVyZmllbGRiYXNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy96Y29tcG9uZW50LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciB9IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgYXVkaXRUaW1lLCBmb3JrSm9pbiwgb2YsIHRhcCB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXZpcnR1YWwtc2Nyb2xsXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi92aXJ0dWFsLXNjcm9sbC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi92aXJ0dWFsLXNjcm9sbC5jb21wb25lbnQuc2Nzc1wiXSxcclxufSlcclxuXHJcbi8vIEFwcHJvYWNoIDE6IFRvdGFsIENvdW50IGlzIGtub3duLCBnZXQgbmV4dCBwYWdlIHVwb24gc2Nyb2xsLiAoV2lsbCBvbmx5IGhhdmUgbXVsdGlwbGUgcGFnZXMgLyBwYWdlYWJsZSlcclxuLy8gQXBwcm9hY2ggMjogVG90YWwgQ291bnQgaXMgbm90IGtub3duLCBhcHBlbmQgbW9yZSBkYXRhIGF0IHJ1bnRpbWUuIChXaWxsIG9ubHkgaGF2ZSAxIHBhZ2UgLyBub3QgcGFnZWFibGUpXHJcblxyXG5leHBvcnQgY2xhc3MgVmlydHVhbFNjcm9sbENvbXBvbmVudCBleHRlbmRzIENvbnRhaW5lckZpZWxkQmFzZSBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHZpZXdQb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcbiAgcHVibGljIGRhdGFJdGVtczogQXJyYXk8YW55PjtcclxuICBwdWJsaWMgcGFnZVNpemUgPSA1MDtcclxuICBwdWJsaWMgcGFnZUZldGNoZWQgPSBbXTtcclxuICBwdWJsaWMgb3B0aW9ucztcclxuICBwdWJsaWMgZm9vdGVyRmllbGRzID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldERhdGEoKTtcclxuICAgIHRoaXMuc2V0dXBGb290ZXIoKTtcclxuICAgIHN1cGVyLmluaXRDb21wb25lbnQoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWNyZW1lbnRDb21wb25lbnRDb3VudGVyRm9yRmllbGQodGhpcy5kYXRhKTtcclxuICAgIHRoaXMudmlld1BvcnQuc2Nyb2xsZWRJbmRleENoYW5nZS5waXBlKFxyXG4gICAgICBhdWRpdFRpbWUodGhpcy5kYXRhLlNjcm9sbEluZGV4Q2hhbmdlVGltZURlbGF5IHx8IDMwMCksXHJcbiAgICAgIHRhcCgoY3VyckluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlTGlzdERhdGEoKTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9Ub3AoKSB7XHJcbiAgICBpZiAodGhpcy52aWV3UG9ydCkge1xyXG4gICAgICB0aGlzLnZpZXdQb3J0LnNjcm9sbFRvSW5kZXgoMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGF0YSgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuT3B0aW9ucykge1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5PcHRpb25zID09PSAnc3RyaW5nJyAmJiB0aGlzLmRhdGEuT3B0aW9ucy5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuT3B0aW9ucywgdGhpcy5ncm91cCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5kYXRhLk9wdGlvbnM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLm9wdGlvbnMucGFnZVNpemUgfHwgNTA7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5sb2FkaW5nTGFiZWwgPSB0aGlzLm9wdGlvbnMubG9hZGluZ0xhYmVsIHx8ICc8ZGl2PkxvYWRpbmc8L2Rpdj4nO1xyXG4gICAgICB0aGlzLnNldHVwRGF0YUl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwZW5kRGF0YShkYXRhSXRlbXM6IEFycmF5PGFueT4pIHtcclxuICAgIHRoaXMuZGF0YUl0ZW1zID0gdGhpcy5kYXRhSXRlbXMuY29uY2F0KGRhdGFJdGVtcyk7XHJcbiAgICB0aGlzLm9wdGlvbnMudG90YWxDb3VudCA9IHRoaXMuZGF0YUl0ZW1zLmxlbmd0aDtcclxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLmRhdGFJdGVtcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRGF0YUl0ZW1zKCkge1xyXG4gICAgdGhpcy5wYWdlRmV0Y2hlZCA9IFtdO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhSXRlbXMpIHsgLy8gaW5pdDogNTAsIHBhZ2VzaXplOiAyMFxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZGF0YUl0ZW1zKSAmJiB0aGlzLm9wdGlvbnMuZGF0YUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBjbnQgPSB0aGlzLm9wdGlvbnMudG90YWxDb3VudCAtIHRoaXMub3B0aW9ucy5kYXRhSXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjbnQgPCAwKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdEYXRhSXRlbXMgY2Fubm90IGJlIG1vcmUgdGhhbiB0b3RhbCBjb3VudC4nKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhSXRlbXMgPSB0aGlzLm9wdGlvbnMuZGF0YUl0ZW1zLmNvbmNhdChBcnJheShjbnQpLmZpbGwoZmFsc2UpKTtcclxuICAgICAgICBjb25zdCBwYWdlTm9Ub01hcmtBc0ZldGNoID0gTWF0aC5jZWlsKHRoaXMub3B0aW9ucy5kYXRhSXRlbXMubGVuZ3RoIC8gdGhpcy5wYWdlU2l6ZSkgLSAxO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHBhZ2VOb1RvTWFya0FzRmV0Y2g7IGkrKykge1xyXG4gICAgICAgICAgdGhpcy5wYWdlRmV0Y2hlZC5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmRhdGFJdGVtcyA9IEFycmF5KHRoaXMub3B0aW9ucy50b3RhbENvdW50KS5maWxsKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YUl0ZW1zID0gQXJyYXkodGhpcy5vcHRpb25zLnRvdGFsQ291bnQpLmZpbGwoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwb3B1bGF0ZUxpc3REYXRhKCkge1xyXG4gICAgY29uc3QgcmVuZGVyUmFuZ2UgPSB0aGlzLnZpZXdQb3J0LmdldFJlbmRlcmVkUmFuZ2UoKTtcclxuICAgIGlmIChyZW5kZXJSYW5nZS5zdGFydCA9PSByZW5kZXJSYW5nZS5lbmQgJiYgcmVuZGVyUmFuZ2UuZW5kID09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc3RhcnRQYWdlTm8gPSBNYXRoLmZsb29yKHJlbmRlclJhbmdlLnN0YXJ0IC8gdGhpcy5wYWdlU2l6ZSk7XHJcbiAgICBjb25zdCBlbmRQYWdlTm8gPSBNYXRoLmZsb29yKChyZW5kZXJSYW5nZS5lbmQgLSAxKSAvIHRoaXMucGFnZVNpemUpO1xyXG5cclxuICAgIGNvbnN0IG9icyA9IG5ldyBBcnJheTxPYnNlcnZhYmxlPGFueT4+KCk7XHJcbiAgICBpZiAoIXRoaXMucGFnZUZldGNoZWQuaW5jbHVkZXMoc3RhcnRQYWdlTm8pKSB7XHJcbiAgICAgIG9icy5wdXNoKFxyXG4gICAgICAgIHRoaXMuZmV0Y2hEYXRhKHN0YXJ0UGFnZU5vKS5waXBlKHRhcChkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlRGF0YUJ5SW5kZXgoc3RhcnRQYWdlTm8gKiB0aGlzLnBhZ2VTaXplLCBkYXRhKTtcclxuICAgICAgICAgIHRoaXMucGFnZUZldGNoZWQucHVzaChzdGFydFBhZ2VObyk7XHJcbiAgICAgICAgfSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXJ0UGFnZU5vICE9IGVuZFBhZ2VObyAmJiAhdGhpcy5wYWdlRmV0Y2hlZC5pbmNsdWRlcyhlbmRQYWdlTm8pKSB7XHJcbiAgICAgIG9icy5wdXNoKFxyXG4gICAgICAgIHRoaXMuZmV0Y2hEYXRhKGVuZFBhZ2VObykucGlwZSh0YXAoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFCeUluZGV4KGVuZFBhZ2VObyAqIHRoaXMucGFnZVNpemUsIGRhdGEpO1xyXG4gICAgICAgICAgdGhpcy5wYWdlRmV0Y2hlZC5wdXNoKGVuZFBhZ2VObyk7XHJcbiAgICAgICAgfSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9icy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvcmtKb2luKG9icykucGlwZSh0YXAocmVzID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdQb3J0RGF0YSgpO1xyXG4gICAgICB9KSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoRGF0YShwYWdlTm8pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuZGF0YVsnT25TY3JvbGwnXSAmJiB0eXBlb2YgdGhpcy5kYXRhWydPblNjcm9sbCddID09ICdzdHJpbmcnICYmIHRoaXMuZGF0YVsnT25TY3JvbGwnXS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICBjb25zdCBvblNjcm9sbEV2ZW50ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YVsnT25TY3JvbGwnXSk7XHJcbiAgICAgIGlmICh0eXBlb2Ygb25TY3JvbGxFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGNvbnN0IGNhbGxGdW5jID0gb25TY3JvbGxFdmVudC5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgICByZXR1cm4gY2FsbEZ1bmModGhpcy5ncm91cCwgeyBwYWdlTm86IHBhZ2VObywgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVEYXRhQnlJbmRleChzdGFydGluZ0luZGV4OiBudW1iZXIsIGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLmRhdGFJdGVtc1tzdGFydGluZ0luZGV4ICsgaV0gPSBkYXRhW2ldO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVWaWV3UG9ydERhdGEoKSB7XHJcbiAgICB0aGlzLmRhdGFJdGVtcyA9IFsuLi50aGlzLmRhdGFJdGVtc107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0dXBGb290ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLlZhbHVlICYmIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLlZhbHVlKSkge1xyXG4gICAgICB0aGlzLmZvb3RlckZpZWxkcyA9IHRoaXMuZGF0YS5WYWx1ZS5maWx0ZXIoeCA9PiB4LlNlY3Rpb24gPT09ICdmb290ZXInKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gICpuZ0lmPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCJcclxuICBjbGFzcz1cImNvbnRhaW5lciBlMXRhZy1jb250YWluZXItc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5jb250YWluZXJTdHlsZS5zdHlsZVwiXHJcbiAgW25nQ2xhc3NdPVwiKGRhdGEuQ29tcG9uZW50U3R5bGVUeXBlIHx8ICcnKSArICcgJyArIChkYXRhLkNsYXNzIHx8ICcnKVwiPlxyXG4gIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgW2l0ZW1TaXplXT1cIm9wdGlvbnMuaXRlbVNpemVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5jb250YWluZXJTdHlsZS5zdHlsZTFcIlxyXG4gICAgY2xhc3M9XCJ2aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCBlMXRhZy1jb250YWluZXItc3R5bGUxXCIgW21pbkJ1ZmZlclB4XT1cIm9wdGlvbnMubWluQnVmZmVyUHhcIlxyXG4gICAgW21heEJ1ZmZlclB4XT1cIm9wdGlvbnMubWF4QnVmZmVyUHhcIj5cclxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqY2RrVmlydHVhbEZvcj1cImxldCBmaWVsZCBvZiBjbG9uZWRGaWVsZHNcIj4gLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpjZGtWaXJ0dWFsRm9yPVwibGV0IGRhdGFJdGVtIG9mIGRhdGFJdGVtczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICA8ZGl2IFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9ucy5pdGVtU2l6ZVwiIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cIm9wdGlvbnMuaXRlbVNpemVcIlxyXG4gICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cIm9wdGlvbnMuaXRlbVNpemVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5jb250YWluZXJTdHlsZS5zdHlsZTJcIlxyXG4gICAgICAgIGNsYXNzPVwiZTF0YWctY29udGFpbmVyLXN0eWxlMlwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudCwgZGF0YUl0ZW0pXCJcclxuICAgICAgICBbaWRdPVwiZGF0YS5OYW1lICsgJ18nICsgZGF0YUl0ZW0/LlZhbHVlPy5JZCB8fCAnJ1wiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZGF0YUl0ZW1cIiBbaW5uZXJIVE1MXT1cIm9wdGlvbnMubG9hZGluZ0xhYmVsIHwgaHRtbFNhbml0aXplXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFJdGVtLkxhYmVsXCIgW2lubmVySFRNTF09XCJkYXRhSXRlbS5MYWJlbCB8IGh0bWxTYW5pdGl6ZVwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPGFwcC16Zm9ybWNvbnRyb2wgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvb3RlckZpZWxkc1wiIFtmaWVsZF09XCJmaWVsZFwiIFtjb250YWluZXJGaWVsZF09XCJkYXRhXCIgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgW2Zvcm1dPVwiZm9ybVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLmNvbnRhaW5lclN0eWxlLnN0eWxlM1wiIGNsYXNzPVwiZTF0YWctY29udGFpbmVyLXN0eWxlM1wiPlxyXG4gICAgPC9hcHAtemZvcm1jb250cm9sPlxyXG4gIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG48L2Rpdj5cclxuIl19
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1zY3JvbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvdmlydHVhbC1zY3JvbGwvdmlydHVhbC1zY3JvbGwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvdmlydHVhbC1zY3JvbGwvdmlydHVhbC1zY3JvbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELDZCQUE2QjtBQUU3Qiw4QkFBOEI7QUFFOUIsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRWhGLE9BQU8sRUFBc0UsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2SCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQWMsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7QUFZeEYsMEdBQTBHO0FBQzFHLDRHQUE0RztBQUU1RyxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsa0JBQWtCO0lBWTVELFlBQ0UsZ0JBQW1DLEVBQzVCLGtCQUFzQztRQUU3QyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUZqQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBWnhDLHFCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQztRQUN6RCx5QkFBb0IsR0FBRyxF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QUM7UUFDM0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFlBQTJCO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQzs7bUhBbk9VLHNCQUFzQjt1R0FBdEIsc0JBQXNCLG9HQUN0Qix3QkFBd0IsdUVDN0JyQyxnOEZBcUNBLHUwRURsQmM7UUFDVixpQkFBaUI7UUFDakIsZUFBZTtLQUNoQjsyRkFNVSxzQkFBc0I7a0JBYmxDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBR2xCO3dCQUNWLGlCQUFpQjt3QkFDakIsZUFBZTtxQkFDaEI7eUlBT29DLFFBQVE7c0JBQTVDLFNBQVM7dUJBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29udGFpbmVyRmllbGRCYXNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvY29udGFpbmVyZmllbGRiYXNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy96Y29tcG9uZW50LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRGF0YVNldFJlc3VsdCwgRm9udEF3ZVNvbWVTZXJ2aWNlLCBWaXJ0dWFsU2Nyb2xsT3B0aW9uLCBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyIH0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBhdWRpdFRpbWUsIGRlbGF5LCBmb3JrSm9pbiwgb2YsIHRhcCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGNvbGxhcHNlQW5pbWF0aW9uLCByb3RhdGVBbmltYXRpb24gfSBmcm9tIFwiLi4vYW5pbWF0aW9ucy9jb21wb25lbnQtYW5pbWF0aW9uc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXZpcnR1YWwtc2Nyb2xsXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi92aXJ0dWFsLXNjcm9sbC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi92aXJ0dWFsLXNjcm9sbC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICBjb2xsYXBzZUFuaW1hdGlvbixcclxuICAgIHJvdGF0ZUFuaW1hdGlvblxyXG4gIF1cclxufSlcclxuXHJcbi8vIEFwcHJvYWNoIDE6IFRvdGFsIENvdW50IGlzIGtub3duLCBnZXQgbmV4dCBwYWdlIHVwb24gc2Nyb2xsLiAoV2lsbCBvbmx5IGhhdmUgbXVsdGlwbGUgcGFnZXMgLyBwYWdlYWJsZSlcclxuLy8gQXBwcm9hY2ggMjogVG90YWwgQ291bnQgaXMgbm90IGtub3duLCBhcHBlbmQgbW9yZSBkYXRhIGF0IHJ1bnRpbWUuIChXaWxsIG9ubHkgaGF2ZSAxIHBhZ2UgLyBub3QgcGFnZWFibGUpXHJcblxyXG5leHBvcnQgY2xhc3MgVmlydHVhbFNjcm9sbENvbXBvbmVudCBleHRlbmRzIENvbnRhaW5lckZpZWxkQmFzZSBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHZpZXdQb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcbiAgcHVibGljIGNvbGxhcHNlZEdyb3VwQnkgPSBbXTsgLy8gVXNlZCB0byBkZWZpbmUgYW5pbWF0aW9uIHN0YXR1c1xyXG4gIHB1YmxpYyBncm91cEJ5VmFsdWVUb0V4cGFuZCA9ICcnOyAgLy8gVXNlZCB0byBkZWZpbmUgYW5pbWF0aW9uIHN0YXR1c1xyXG4gIHB1YmxpYyBjb2xsYXBzZWRHcm91cEJ5X0ZpcnN0Tm9kZUluZGV4TGlzdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7IC8vIFdoZW4gY29sbGFwc2UsIG5lZWQgdG8gcmV0YWluIHRoZSBmaXJzdCBub2RlIGluIHRoZSBsaXN0IHNvIHRoYXQgdGhlIGdyb3VwIGJ5IHRpdGxlIHdpbGwgbm90IGJlIGhpZGRlblxyXG4gIHByaXZhdGUgZnVsbERhdGFJdGVtcyA9IFtdO1xyXG4gIHB1YmxpYyBkYXRhSXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBwdWJsaWMgcGFnZVNpemUgPSA1MDtcclxuICBwdWJsaWMgcGFnZUZldGNoZWQgPSBbXTtcclxuICBwdWJsaWMgb3B0aW9uczogVmlydHVhbFNjcm9sbE9wdGlvbjtcclxuICBwdWJsaWMgZm9vdGVyRmllbGRzID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZm9udEF3ZVNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldHVwQ29tcG9uZW50KCk7XHJcbiAgICB0aGlzLnNldHVwRGF0YUl0ZW1zKCk7XHJcbiAgICB0aGlzLnNldHVwRm9vdGVyKCk7XHJcbiAgICBzdXBlci5pbml0Q29tcG9uZW50KCkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZGVjcmVtZW50Q29tcG9uZW50Q291bnRlckZvckZpZWxkKHRoaXMuZGF0YSk7XHJcbiAgICB0aGlzLnZpZXdQb3J0LnNjcm9sbGVkSW5kZXhDaGFuZ2UucGlwZShcclxuICAgICAgYXVkaXRUaW1lKHRoaXMuZGF0YS5TY3JvbGxJbmRleENoYW5nZVRpbWVEZWxheSB8fCAzMDApLFxyXG4gICAgICB0YXAoKGN1cnJJbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wb3B1bGF0ZUxpc3REYXRhKCk7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvVG9wKCkge1xyXG4gICAgaWYgKHRoaXMudmlld1BvcnQpIHtcclxuICAgICAgdGhpcy52aWV3UG9ydC5zY3JvbGxUb0luZGV4KDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cENvbXBvbmVudCgpIHtcclxuICAgIHRoaXMuY29sbGFwc2VkR3JvdXBCeSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZGF0YS5PcHRpb25zKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLk9wdGlvbnMgPT09ICdzdHJpbmcnICYmIHRoaXMuZGF0YS5PcHRpb25zLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZGF0YS5PcHRpb25zLCB0aGlzLmdyb3VwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRhdGEuT3B0aW9ucztcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMub3B0aW9ucy5wYWdlU2l6ZSB8fCA1MDtcclxuICAgICAgdGhpcy5vcHRpb25zLmxvYWRpbmdMYWJlbCA9IHRoaXMub3B0aW9ucy5sb2FkaW5nTGFiZWwgfHwgJzxkaXY+TG9hZGluZzwvZGl2Pic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwZW5kRGF0YShkYXRhSXRlbXM6IEFycmF5PGFueT4pIHtcclxuICAgIC8vIHRoaXMuZGF0YUl0ZW1zID0gdGhpcy5kYXRhSXRlbXMuY29uY2F0KGRhdGFJdGVtcyk7XHJcbiAgICAvLyB0aGlzLnBhZ2VTaXplID0gdGhpcy5kYXRhSXRlbXMubGVuZ3RoO1xyXG4gICAgdGhpcy5mdWxsRGF0YUl0ZW1zID0gdGhpcy5mdWxsRGF0YUl0ZW1zLmNvbmNhdChkYXRhSXRlbXMpO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZnVsbERhdGFJdGVtcy5sZW5ndGg7XHJcbiAgICB0aGlzLmNvbXB1dGVEYXRhSXRlbXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBEYXRhSXRlbXMoKSB7XHJcbiAgICB0aGlzLnBhZ2VGZXRjaGVkID0gW107XHJcbiAgICBpZiAodGhpcy5kYXRhLkRhdGFTZXRSZXN1bHQpIHtcclxuICAgICAgbGV0IGRhdGFTZXRSZXN1bHQgPSB0aGlzLmRhdGEuRGF0YVNldFJlc3VsdDtcclxuICAgICAgaWYgKHR5cGVvZiBkYXRhU2V0UmVzdWx0ID09ICdzdHJpbmcnICYmIGRhdGFTZXRSZXN1bHQuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgICBkYXRhU2V0UmVzdWx0ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGRhdGFTZXRSZXN1bHQsIHRoaXMuZ3JvdXApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0RGF0YShkYXRhU2V0UmVzdWx0IGFzIERhdGFTZXRSZXN1bHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YUl0ZW1zID0gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGF0YShkYXRhU2V0UmVzdWx0OiBEYXRhU2V0UmVzdWx0KSB7XHJcbiAgICBpZiAoZGF0YVNldFJlc3VsdC5kYXRhU2V0ICYmIEFycmF5LmlzQXJyYXkoZGF0YVNldFJlc3VsdC5kYXRhU2V0KSAmJiBkYXRhU2V0UmVzdWx0LmRhdGFTZXQubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBjbnQgPSBkYXRhU2V0UmVzdWx0LnRvdGFsQ291bnQgLSBkYXRhU2V0UmVzdWx0LmRhdGFTZXQubGVuZ3RoO1xyXG4gICAgICBpZiAoY250IDwgMCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RhdGFJdGVtcyBjYW5ub3QgYmUgbW9yZSB0aGFuIHRvdGFsIGNvdW50LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kYXRhSXRlbXMgPSBkYXRhU2V0UmVzdWx0LmRhdGFTZXQuY29uY2F0KEFycmF5KGNudCkuZmlsbChmYWxzZSkpO1xyXG4gICAgICBjb25zdCBwYWdlTm9Ub01hcmtBc0ZldGNoID0gTWF0aC5jZWlsKGRhdGFTZXRSZXN1bHQuZGF0YVNldC5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSAtIDE7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHBhZ2VOb1RvTWFya0FzRmV0Y2g7IGkrKykge1xyXG4gICAgICAgIHRoaXMucGFnZUZldGNoZWQucHVzaChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZGF0YVNldFJlc3VsdC50b3RhbENvdW50KSB7XHJcbiAgICAgIHRoaXMuZGF0YUl0ZW1zID0gQXJyYXkoZGF0YVNldFJlc3VsdC50b3RhbENvdW50KS5maWxsKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGFJdGVtcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mdWxsRGF0YUl0ZW1zID0gdGhpcy5kYXRhSXRlbXM7XHJcbiAgICB0aGlzLmNvbXB1dGVEYXRhSXRlbXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcG9wdWxhdGVMaXN0RGF0YSgpIHtcclxuICAgIGNvbnN0IHJlbmRlclJhbmdlID0gdGhpcy52aWV3UG9ydC5nZXRSZW5kZXJlZFJhbmdlKCk7XHJcbiAgICBpZiAocmVuZGVyUmFuZ2Uuc3RhcnQgPT0gcmVuZGVyUmFuZ2UuZW5kICYmIHJlbmRlclJhbmdlLmVuZCA9PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0YXJ0UGFnZU5vID0gTWF0aC5mbG9vcihyZW5kZXJSYW5nZS5zdGFydCAvIHRoaXMucGFnZVNpemUpO1xyXG4gICAgY29uc3QgZW5kUGFnZU5vID0gTWF0aC5mbG9vcigocmVuZGVyUmFuZ2UuZW5kIC0gMSkgLyB0aGlzLnBhZ2VTaXplKTtcclxuXHJcbiAgICBjb25zdCBvYnMgPSBuZXcgQXJyYXk8T2JzZXJ2YWJsZTxhbnk+PigpO1xyXG4gICAgaWYgKCF0aGlzLnBhZ2VGZXRjaGVkLmluY2x1ZGVzKHN0YXJ0UGFnZU5vKSkge1xyXG4gICAgICBvYnMucHVzaChcclxuICAgICAgICB0aGlzLmZldGNoRGF0YShzdGFydFBhZ2VObykucGlwZSh0YXAoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFCeUluZGV4KHN0YXJ0UGFnZU5vICogdGhpcy5wYWdlU2l6ZSwgZGF0YSk7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VGZXRjaGVkLnB1c2goc3RhcnRQYWdlTm8pO1xyXG4gICAgICAgIH0pKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGFydFBhZ2VObyAhPSBlbmRQYWdlTm8gJiYgIXRoaXMucGFnZUZldGNoZWQuaW5jbHVkZXMoZW5kUGFnZU5vKSkge1xyXG4gICAgICBvYnMucHVzaChcclxuICAgICAgICB0aGlzLmZldGNoRGF0YShlbmRQYWdlTm8pLnBpcGUodGFwKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVEYXRhQnlJbmRleChlbmRQYWdlTm8gKiB0aGlzLnBhZ2VTaXplLCBkYXRhKTtcclxuICAgICAgICAgIHRoaXMucGFnZUZldGNoZWQucHVzaChlbmRQYWdlTm8pO1xyXG4gICAgICAgIH0pKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvYnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3JrSm9pbihvYnMpLnBpcGUodGFwKHJlcyA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3UG9ydERhdGEoKTtcclxuICAgICAgfSkpLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaERhdGEocGFnZU5vKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmRhdGEuT25TY3JvbGwgJiYgdHlwZW9mIHRoaXMuZGF0YS5PblNjcm9sbCA9PSAnc3RyaW5nJyAmJiB0aGlzLmRhdGEuT25TY3JvbGwuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgY29uc3Qgb25TY3JvbGxFdmVudCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuT25TY3JvbGwpO1xyXG4gICAgICBpZiAodHlwZW9mIG9uU2Nyb2xsRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBjb25zdCBjYWxsRnVuYyA9IG9uU2Nyb2xsRXZlbnQuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgICAgcmV0dXJuIGNhbGxGdW5jKHRoaXMuZ3JvdXAsIHsgcGFnZU5vOiBwYWdlTm8sIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGF0YUJ5SW5kZXgoc3RhcnRpbmdJbmRleDogbnVtYmVyLCBkYXRhOiBBcnJheTxhbnk+KSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5kYXRhSXRlbXNbc3RhcnRpbmdJbmRleCArIGldID0gZGF0YVtpXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVmlld1BvcnREYXRhKCkge1xyXG4gICAgdGhpcy5kYXRhSXRlbXMgPSBbLi4udGhpcy5kYXRhSXRlbXNdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldHVwRm9vdGVyKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5WYWx1ZSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5WYWx1ZSkpIHtcclxuICAgICAgdGhpcy5mb290ZXJGaWVsZHMgPSB0aGlzLmRhdGEuVmFsdWUuZmlsdGVyKHggPT4geC5TZWN0aW9uID09PSAnZm9vdGVyJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR3JvdXAgQnlcclxuICBwdWJsaWMgZ2V0R3JvdXBCeUxhYmVsVGVtcGxhdGUoZGF0YUl0ZW0sIG9wdGlvbnMpOiBzdHJpbmcge1xyXG4gICAgaWYgKG9wdGlvbnMuZ3JvdXBCeUxhYmVsVGVtcGxhdGUgJiYgdHlwZW9mIG9wdGlvbnMuZ3JvdXBCeUxhYmVsVGVtcGxhdGUgPT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKG9wdGlvbnMuZ3JvdXBCeUxhYmVsVGVtcGxhdGUuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgICBjb25zdCBnZXRUZW1wbGF0ZUZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgb3B0aW9ucy5ncm91cEJ5TGFiZWxUZW1wbGF0ZSk7XHJcblxyXG4gICAgICAgIGlmIChnZXRUZW1wbGF0ZUZ1bmMpIHtcclxuICAgICAgICAgIHJldHVybiBnZXRUZW1wbGF0ZUZ1bmMoe1xyXG4gICAgICAgICAgICBkYXRhSXRlbSxcclxuICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZGF0YUl0ZW1bb3B0aW9ucy5ncm91cEJ5TGFiZWxUZW1wbGF0ZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBncm91cEJ5T25DbGljayhncm91cEJ5VmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuaXNHcm91cEJ5Q29sbGFwc2libGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHVzZSBjb2xsYXBzZSAvIGV4cGFuZCB0byBjb250cm9sIGFuaW1hdGlvbiBzZXF1ZW5jZVxyXG4gICAgY29uc3QgaXNUb0NvbGxhcHNlID0gIXRoaXMuY29sbGFwc2VkR3JvdXBCeS5pbmNsdWRlcyhncm91cEJ5VmFsdWUpO1xyXG5cclxuICAgIGNvbnN0IGZpcnN0Tm9kZUluZGV4ID0gdGhpcy5mdWxsRGF0YUl0ZW1zLm1hcCh4ID0+IHhbdGhpcy5vcHRpb25zLmdyb3VwQnldKS5pbmRleE9mKGdyb3VwQnlWYWx1ZSk7XHJcbiAgICBpZiAoaXNUb0NvbGxhcHNlKSB7XHJcbiAgICAgIC8vIHRvIGNvbGxhcHNlIChGb3IgYW5pbWF0aW9uOiBDaGFuZ2Ugc3RhdHVzLCB0aGVuIGFwcGVuZCBkYXRhKVxyXG4gICAgICB0aGlzLmNvbGxhcHNlZEdyb3VwQnkucHVzaChncm91cEJ5VmFsdWUpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlZEdyb3VwQnlfRmlyc3ROb2RlSW5kZXhMaXN0LnB1c2goZmlyc3ROb2RlSW5kZXgpO1xyXG4gICAgICBvZih7fSkucGlwZShkZWxheSg0MDApLFxyXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmNvbXB1dGVEYXRhSXRlbXMoKSlcclxuICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyB0byBleHBhbmQgKEZvciBhbmltYXRpb246IEFwcGVuZCBkYXRhLCB0aGVuIGNoYW5nZSBzdGF0dXMpXHJcbiAgICAgIHRoaXMuY29sbGFwc2VkR3JvdXBCeV9GaXJzdE5vZGVJbmRleExpc3QgPSB0aGlzLmNvbGxhcHNlZEdyb3VwQnlfRmlyc3ROb2RlSW5kZXhMaXN0LmZpbHRlcih4ID0+IHggIT0gZmlyc3ROb2RlSW5kZXgpO1xyXG4gICAgICBjb25zdCB0ZW1wQ29sbGFwc2VkR3JvdXBCeSA9IHRoaXMuY29sbGFwc2VkR3JvdXBCeS5maWx0ZXIoeCA9PiB4ICE9PSBncm91cEJ5VmFsdWUpO1xyXG4gICAgICB0aGlzLmRhdGFJdGVtcyA9IHRoaXMuZnVsbERhdGFJdGVtcy5maWx0ZXIoKHgsIGluZGV4KSA9PiAhdGVtcENvbGxhcHNlZEdyb3VwQnkuaW5jbHVkZXMoeFt0aGlzLm9wdGlvbnMuZ3JvdXBCeV0pIHx8IHRoaXMuY29sbGFwc2VkR3JvdXBCeV9GaXJzdE5vZGVJbmRleExpc3QuaW5jbHVkZXMoaW5kZXgpKTtcclxuICAgICAgdGhpcy5ncm91cEJ5VmFsdWVUb0V4cGFuZCA9IGdyb3VwQnlWYWx1ZTtcclxuICAgICAgb2Yoe30pLnBpcGUoZGVsYXkoMCksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sbGFwc2VkR3JvdXBCeSA9IHRlbXBDb2xsYXBzZWRHcm91cEJ5O1xyXG4gICAgICAgICAgdGhpcy5ncm91cEJ5VmFsdWVUb0V4cGFuZCA9IGdyb3VwQnlWYWx1ZTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlRGF0YUl0ZW1zKCkge1xyXG4gICAgdGhpcy5kYXRhSXRlbXMgPSB0aGlzLmZ1bGxEYXRhSXRlbXMuZmlsdGVyKCh4LCBpbmRleCkgPT4gIXRoaXMuY29sbGFwc2VkR3JvdXBCeS5pbmNsdWRlcyh4W3RoaXMub3B0aW9ucy5ncm91cEJ5XSkgfHwgdGhpcy5jb2xsYXBzZWRHcm91cEJ5X0ZpcnN0Tm9kZUluZGV4TGlzdC5pbmNsdWRlcyhpbmRleCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGV4cGFuZEFsbCgpIHtcclxuICAgIHRoaXMuY29sbGFwc2VkR3JvdXBCeSA9IFtdO1xyXG4gICAgdGhpcy5jb21wdXRlRGF0YUl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kQnlHcm91cEJ5VmFsdWVzKGdyb3VwQnlWYWx1ZTogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgdGhpcy5jb2xsYXBzZWRHcm91cEJ5ID0gdGhpcy5jb2xsYXBzZWRHcm91cEJ5LmZpbHRlcih4ID0+ICFncm91cEJ5VmFsdWUuaW5jbHVkZXMoeCkpO1xyXG4gICAgdGhpcy5jb21wdXRlRGF0YUl0ZW1zKCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiIsIjxkaXZcclxuICAqbmdJZj1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiXHJcbiAgY2xhc3M9XCJjb250YWluZXIgZTF0YWctY29udGFpbmVyLXN0eWxlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuY29udGFpbmVyU3R5bGUuc3R5bGVcIlxyXG4gIFtuZ0NsYXNzXT1cIihkYXRhLkNvbXBvbmVudFN0eWxlVHlwZSB8fCAnJykgKyAnICcgKyAoZGF0YS5DbGFzcyB8fCAnJylcIj5cclxuICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IFtpdGVtU2l6ZV09XCJvcHRpb25zLml0ZW1TaXplXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuY29udGFpbmVyU3R5bGUuc3R5bGUxXCJcclxuICAgIGNsYXNzPVwidmlydHVhbC1zY3JvbGwtdmlld3BvcnQgZTF0YWctY29udGFpbmVyLXN0eWxlMVwiIFttaW5CdWZmZXJQeF09XCJvcHRpb25zLm1pbkJ1ZmZlclB4XCJcclxuICAgIFttYXhCdWZmZXJQeF09XCJvcHRpb25zLm1heEJ1ZmZlclB4XCI+XHJcbiAgICA8IS0tIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgZmllbGQgb2YgY2xvbmVkRmllbGRzXCI+IC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqY2RrVmlydHVhbEZvcj1cImxldCBkYXRhSXRlbSBvZiBkYXRhSXRlbXM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInZpcnR1YWwtc2Nyb2xsLWdyb3VwYnkgZTF0YWctY29udGFpbmVyLXN0eWxlNFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLmNvbnRhaW5lclN0eWxlLnN0eWxlNFwiXHJcbiAgICAgICAgKm5nSWY9XCJvcHRpb25zLmdyb3VwQnkgJiYgKCFkYXRhSXRlbXNbaS0xXSB8fCBkYXRhSXRlbVtvcHRpb25zLmdyb3VwQnldICE9PSBkYXRhSXRlbXNbaS0xXVtvcHRpb25zLmdyb3VwQnldKVwiXHJcbiAgICAgICAgKGNsaWNrKT1cImdyb3VwQnlPbkNsaWNrKGRhdGFJdGVtW29wdGlvbnMuZ3JvdXBCeV0pXCIgW2NsYXNzLmdyb3VwYnktY29sbGFwc2libGVdPVwib3B0aW9ucy5pc0dyb3VwQnlDb2xsYXBzaWJsZVwiPlxyXG4gICAgICAgIDxmYS1pY29uIGNsYXNzPVwidmlydHVhbC1zY3JvbGwtZ3JvdXBieS1hcnJvdy1pY29uIGUxdGFnLWNvbnRhaW5lci1zdHlsZTVcIlxyXG4gICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuY29udGFpbmVyU3R5bGUuc3R5bGU1XCIgKm5nSWY9XCIhIW9wdGlvbnMuaXNHcm91cEJ5Q29sbGFwc2libGVcIlxyXG4gICAgICAgICAgW2ljb25dPVwiZ2V0Rm9udEF3ZXNvbWUoJ2NhcmV0LWRvd24nLCBmb250QXdlU29tZVNlcnZpY2UpXCJcclxuICAgICAgICAgIFtAcm90YXRlQW5pbWF0aW9uXT1cInt2YWx1ZTogY29sbGFwc2VkR3JvdXBCeS5pbmNsdWRlcyhkYXRhSXRlbVtvcHRpb25zLmdyb3VwQnldKSA/ICdyb3RhdGUnIDogJ2RlZmF1bHQnLCBwYXJhbXM6IHtkZWdyZWU6IC05MH19XCI+XHJcbiAgICAgICAgPC9mYS1pY29uPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmlydHVhbC1zY3JvbGwtZ3JvdXBieS1sYWJlbCBlMXRhZy1jb250YWluZXItc3R5bGU2XCJcclxuICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLmNvbnRhaW5lclN0eWxlLnN0eWxlNlwiPlxyXG4gICAgICAgICAge3tvcHRpb25zLmdyb3VwQnlMYWJlbFRlbXBsYXRlID8gZ2V0R3JvdXBCeUxhYmVsVGVtcGxhdGUoZGF0YUl0ZW0sIG9wdGlvbnMpIDogZGF0YUl0ZW1bb3B0aW9ucy5ncm91cEJ5XX19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBbc3R5bGUuaGVpZ2h0LnB4XT1cIm9wdGlvbnMuaXRlbVNpemVcIiBbc3R5bGUubWluLWhlaWdodC5weF09XCJvcHRpb25zLml0ZW1TaXplXCJcclxuICAgICAgICBbc3R5bGUubWF4LWhlaWdodC5weF09XCJvcHRpb25zLml0ZW1TaXplXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuY29udGFpbmVyU3R5bGUuc3R5bGUyXCJcclxuICAgICAgICBjbGFzcz1cImUxdGFnLWNvbnRhaW5lci1zdHlsZTIgdmlydHVhbC1zY3JvbGwtZGF0YWl0ZW1cIiAoY2xpY2spPVwib25DbGljaygkZXZlbnQsIGRhdGFJdGVtKVwiXHJcbiAgICAgICAgW2lkXT1cImRhdGEuTmFtZSArICdfJyArIGRhdGFJdGVtPy5WYWx1ZT8uSWQgfHwgJydcIlxyXG4gICAgICAgIFtAY29sbGFwc2VBbmltYXRpb25dPVwie3ZhbHVlOiAhIW9wdGlvbnMuZ3JvdXBCeSAmJiBjb2xsYXBzZWRHcm91cEJ5LmluY2x1ZGVzKGRhdGFJdGVtW29wdGlvbnMuZ3JvdXBCeV0pID8gJ2NvbGxhcHNlJyA6ICdkZWZhdWx0J31cIlxyXG4gICAgICAgIFtjbGFzcy5ncm91cGJ5LXZhbHVlLWV4cGFuZF09XCJncm91cEJ5VmFsdWVUb0V4cGFuZCA9PSAoZGF0YUl0ZW1bb3B0aW9ucy5ncm91cEJ5XSlcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWRhdGFJdGVtXCIgW2lubmVySFRNTF09XCJvcHRpb25zLmxvYWRpbmdMYWJlbCB8IGh0bWxTYW5pdGl6ZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhSXRlbS5MYWJlbFwiIFtpbm5lckhUTUxdPVwiZGF0YUl0ZW0uTGFiZWwgfCBodG1sU2FuaXRpemVcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxhcHAtemZvcm1jb250cm9sICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb290ZXJGaWVsZHNcIiBbZmllbGRdPVwiZmllbGRcIiBbY29udGFpbmVyRmllbGRdPVwiZGF0YVwiIFtncm91cF09XCJncm91cFwiXHJcbiAgICAgIFtmb3JtXT1cImZvcm1cIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5jb250YWluZXJTdHlsZS5zdHlsZTNcIiBjbGFzcz1cImUxdGFnLWNvbnRhaW5lci1zdHlsZTNcIj5cclxuICAgIDwvYXBwLXpmb3JtY29udHJvbD5cclxuICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cclxuPC9kaXY+XHJcbiJdfQ==