@schneideress/dashboardframework 0.0.279 → 17.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/esm2022/gridster/index.mjs +12 -0
- package/esm2022/gridster/lib/gridster.component.mjs +627 -0
- package/esm2022/gridster/lib/gridster.interface.mjs +3 -0
- package/esm2022/gridster/lib/gridster.module.mjs +17 -0
- package/esm2022/gridster/lib/gridsterCompact.service.mjs +126 -0
- package/esm2022/gridster/lib/gridsterConfig.constant.mjs +118 -0
- package/esm2022/gridster/lib/gridsterConfig.interface.mjs +37 -0
- package/esm2022/gridster/lib/gridsterConfigS.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterDraggable.service.mjs +405 -0
- package/esm2022/gridster/lib/gridsterEmptyCell.service.mjs +255 -0
- package/esm2022/gridster/lib/gridsterItem.component.mjs +228 -0
- package/esm2022/gridster/lib/gridsterItem.interface.mjs +3 -0
- package/esm2022/gridster/lib/gridsterPreview.component.mjs +36 -0
- package/esm2022/gridster/lib/gridsterPush.service.mjs +316 -0
- package/esm2022/gridster/lib/gridsterPushResize.service.mjs +225 -0
- package/esm2022/gridster/lib/gridsterRenderer.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterRenderer.service.mjs +274 -0
- package/esm2022/gridster/lib/gridsterResizable.service.mjs +470 -0
- package/esm2022/gridster/lib/gridsterResizeEventType.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterScroll.service.mjs +134 -0
- package/esm2022/gridster/lib/gridsterSwap.service.mjs +87 -0
- package/esm2022/gridster/lib/gridsterUtils.service.mjs +92 -0
- package/esm2022/lib/custom.notifier.options.mjs +41 -0
- package/esm2022/lib/ra-dashboard-area/ra.dashboard.area.mjs +460 -0
- package/esm2022/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +43 -0
- package/esm2022/lib/ra-widget-container/ra.widget.container.component.mjs +767 -0
- package/esm2022/lib/ra.base.dashboard.filter.mjs +41 -0
- package/esm2022/lib/ra.base.dashboard.template.mjs +33 -0
- package/esm2022/lib/ra.dashbard.event.bus.mjs +46 -0
- package/esm2022/lib/ra.dashboard.module.mjs +55 -0
- package/esm2022/lib/ra.dashboard.responsive.service.mjs +139 -0
- package/esm2022/lib/ra.dashboard.service.mjs +77 -0
- package/esm2022/lib/ra.event.enum.mjs +60 -0
- package/esm2022/lib/ra.gridster.config.mjs +56 -0
- package/esm2022/public-api.mjs +13 -0
- package/esm2022/schneideress-dashboardframework.mjs +5 -0
- package/fesm2022/schneideress-dashboardframework.mjs +5198 -0
- package/fesm2022/schneideress-dashboardframework.mjs.map +1 -0
- package/gridster/index.d.ts +9 -11
- package/gridster/lib/gridster.component.d.ts +79 -67
- package/gridster/lib/gridster.interface.d.ts +49 -46
- package/gridster/lib/gridster.module.d.ts +8 -2
- package/gridster/lib/gridsterCompact.service.d.ts +11 -15
- package/gridster/lib/gridsterConfig.constant.d.ts +2 -2
- package/gridster/lib/gridsterConfig.interface.d.ts +155 -133
- package/gridster/lib/gridsterConfigS.interface.d.ts +107 -93
- package/gridster/lib/gridsterDraggable.service.d.ts +68 -59
- package/gridster/lib/gridsterEmptyCell.service.d.ts +31 -29
- package/gridster/lib/gridsterItem.component.d.ts +61 -32
- package/gridster/lib/gridsterItem.interface.d.ts +64 -21
- package/gridster/lib/gridsterPreview.component.d.ts +17 -10
- package/gridster/lib/gridsterPush.service.d.ts +34 -33
- package/gridster/lib/gridsterPushResize.service.d.ts +26 -26
- package/gridster/lib/gridsterRenderer.interface.d.ts +14 -0
- package/gridster/lib/gridsterRenderer.service.d.ts +37 -38
- package/gridster/lib/gridsterResizable.service.d.ts +86 -67
- package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -6
- package/gridster/lib/gridsterScroll.service.d.ts +7 -4
- package/gridster/lib/gridsterSwap.service.d.ts +13 -13
- package/gridster/lib/gridsterUtils.service.d.ts +16 -16
- package/index.d.ts +5 -0
- package/lib/custom.notifier.options.d.ts +2 -2
- package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +88 -86
- package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +20 -17
- package/lib/ra-widget-container/ra.widget.container.component.d.ts +142 -140
- package/lib/ra.base.dashboard.filter.d.ts +17 -16
- package/lib/ra.base.dashboard.template.d.ts +18 -16
- package/lib/ra.dashbard.event.bus.d.ts +23 -20
- package/lib/ra.dashboard.module.d.ts +16 -2
- package/lib/ra.dashboard.responsive.service.d.ts +24 -21
- package/lib/ra.dashboard.service.d.ts +25 -23
- package/lib/ra.event.enum.d.ts +57 -57
- package/lib/ra.gridster.config.d.ts +2 -2
- package/package.json +19 -19
- package/public-api.d.ts +9 -9
- package/bundles/schneideress-dashboardframework.umd.js +0 -5103
- package/bundles/schneideress-dashboardframework.umd.js.map +0 -1
- package/bundles/schneideress-dashboardframework.umd.min.js +0 -16
- package/bundles/schneideress-dashboardframework.umd.min.js.map +0 -1
- package/esm2015/gridster/index.js +0 -14
- package/esm2015/gridster/lib/gridster.component.js +0 -471
- package/esm2015/gridster/lib/gridster.interface.js +0 -3
- package/esm2015/gridster/lib/gridster.module.js +0 -25
- package/esm2015/gridster/lib/gridsterCompact.service.js +0 -162
- package/esm2015/gridster/lib/gridsterConfig.constant.js +0 -104
- package/esm2015/gridster/lib/gridsterConfig.interface.js +0 -27
- package/esm2015/gridster/lib/gridsterConfigS.interface.js +0 -1
- package/esm2015/gridster/lib/gridsterDraggable.service.js +0 -351
- package/esm2015/gridster/lib/gridsterEmptyCell.service.js +0 -216
- package/esm2015/gridster/lib/gridsterItem.component.js +0 -141
- package/esm2015/gridster/lib/gridsterItem.interface.js +0 -1
- package/esm2015/gridster/lib/gridsterItemComponent.interface.js +0 -3
- package/esm2015/gridster/lib/gridsterPreview.component.js +0 -45
- package/esm2015/gridster/lib/gridsterPush.service.js +0 -296
- package/esm2015/gridster/lib/gridsterPushResize.service.js +0 -225
- package/esm2015/gridster/lib/gridsterRenderer.service.js +0 -208
- package/esm2015/gridster/lib/gridsterResizable.service.js +0 -368
- package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +0 -1
- package/esm2015/gridster/lib/gridsterScroll.service.js +0 -119
- package/esm2015/gridster/lib/gridsterSwap.service.js +0 -85
- package/esm2015/gridster/lib/gridsterUtils.service.js +0 -89
- package/esm2015/lib/custom.notifier.options.js +0 -41
- package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +0 -492
- package/esm2015/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.js +0 -48
- package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +0 -829
- package/esm2015/lib/ra.base.dashboard.filter.js +0 -54
- package/esm2015/lib/ra.base.dashboard.template.js +0 -33
- package/esm2015/lib/ra.dashbard.event.bus.js +0 -46
- package/esm2015/lib/ra.dashboard.module.js +0 -44
- package/esm2015/lib/ra.dashboard.responsive.service.js +0 -140
- package/esm2015/lib/ra.dashboard.service.js +0 -82
- package/esm2015/lib/ra.event.enum.js +0 -60
- package/esm2015/lib/ra.gridster.config.js +0 -56
- package/esm2015/public-api.js +0 -13
- package/esm2015/schneideress-dashboardframework.js +0 -11
- package/esm5/gridster/index.js +0 -14
- package/esm5/gridster/lib/gridster.component.js +0 -474
- package/esm5/gridster/lib/gridster.interface.js +0 -7
- package/esm5/gridster/lib/gridster.module.js +0 -28
- package/esm5/gridster/lib/gridsterCompact.service.js +0 -163
- package/esm5/gridster/lib/gridsterConfig.constant.js +0 -104
- package/esm5/gridster/lib/gridsterConfig.interface.js +0 -27
- package/esm5/gridster/lib/gridsterConfigS.interface.js +0 -1
- package/esm5/gridster/lib/gridsterDraggable.service.js +0 -356
- package/esm5/gridster/lib/gridsterEmptyCell.service.js +0 -220
- package/esm5/gridster/lib/gridsterItem.component.js +0 -142
- package/esm5/gridster/lib/gridsterItem.interface.js +0 -1
- package/esm5/gridster/lib/gridsterItemComponent.interface.js +0 -7
- package/esm5/gridster/lib/gridsterPreview.component.js +0 -46
- package/esm5/gridster/lib/gridsterPush.service.js +0 -297
- package/esm5/gridster/lib/gridsterPushResize.service.js +0 -226
- package/esm5/gridster/lib/gridsterRenderer.service.js +0 -209
- package/esm5/gridster/lib/gridsterResizable.service.js +0 -373
- package/esm5/gridster/lib/gridsterResizeEventType.interface.js +0 -1
- package/esm5/gridster/lib/gridsterScroll.service.js +0 -119
- package/esm5/gridster/lib/gridsterSwap.service.js +0 -86
- package/esm5/gridster/lib/gridsterUtils.service.js +0 -93
- package/esm5/lib/custom.notifier.options.js +0 -41
- package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +0 -503
- package/esm5/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.js +0 -50
- package/esm5/lib/ra-widget-container/ra.widget.container.component.js +0 -891
- package/esm5/lib/ra.base.dashboard.filter.js +0 -57
- package/esm5/lib/ra.base.dashboard.template.js +0 -36
- package/esm5/lib/ra.dashbard.event.bus.js +0 -47
- package/esm5/lib/ra.dashboard.module.js +0 -47
- package/esm5/lib/ra.dashboard.responsive.service.js +0 -151
- package/esm5/lib/ra.dashboard.service.js +0 -85
- package/esm5/lib/ra.event.enum.js +0 -60
- package/esm5/lib/ra.gridster.config.js +0 -56
- package/esm5/public-api.js +0 -13
- package/esm5/schneideress-dashboardframework.js +0 -11
- package/fesm2015/schneideress-dashboardframework.js +0 -4749
- package/fesm2015/schneideress-dashboardframework.js.map +0 -1
- package/fesm5/schneideress-dashboardframework.js +0 -4883
- package/fesm5/schneideress-dashboardframework.js.map +0 -1
- package/gridster/lib/gridsterItemComponent.interface.d.ts +0 -25
- package/schneideress-dashboardframework.d.ts +0 -10
- package/schneideress-dashboardframework.metadata.json +0 -1
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
import { NgForOf, NgStyle } from '@angular/common';
|
|
2
|
+
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, Renderer2, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import { debounceTime, Subject, switchMap, takeUntil, timer } from 'rxjs';
|
|
4
|
+
import { GridsterCompact } from './gridsterCompact.service';
|
|
5
|
+
import { GridsterConfigService } from './gridsterConfig.constant';
|
|
6
|
+
import { GridType } from './gridsterConfig.interface';
|
|
7
|
+
import { GridsterEmptyCell } from './gridsterEmptyCell.service';
|
|
8
|
+
import { GridsterPreviewComponent } from './gridsterPreview.component';
|
|
9
|
+
import { GridsterRenderer } from './gridsterRenderer.service';
|
|
10
|
+
import { GridsterUtils } from './gridsterUtils.service';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
export class GridsterComponent {
|
|
13
|
+
constructor(el, renderer, cdRef, zone) {
|
|
14
|
+
this.renderer = renderer;
|
|
15
|
+
this.cdRef = cdRef;
|
|
16
|
+
this.zone = zone;
|
|
17
|
+
this.columns = 0;
|
|
18
|
+
this.rows = 0;
|
|
19
|
+
this.gridColumns = [];
|
|
20
|
+
this.gridRows = [];
|
|
21
|
+
this.previewStyle$ = new EventEmitter();
|
|
22
|
+
this.calculateLayout$ = new Subject();
|
|
23
|
+
this.resize$ = new Subject();
|
|
24
|
+
this.destroy$ = new Subject();
|
|
25
|
+
this.optionsChanged = () => {
|
|
26
|
+
this.setOptions();
|
|
27
|
+
let widgetsIndex = this.grid.length - 1;
|
|
28
|
+
let widget;
|
|
29
|
+
for (; widgetsIndex >= 0; widgetsIndex--) {
|
|
30
|
+
widget = this.grid[widgetsIndex];
|
|
31
|
+
widget.updateOptions();
|
|
32
|
+
}
|
|
33
|
+
this.calculateLayout();
|
|
34
|
+
};
|
|
35
|
+
this.onResize = () => {
|
|
36
|
+
if (this.el.clientWidth) {
|
|
37
|
+
if (this.options.setGridSize) {
|
|
38
|
+
// reset width/height so the size is recalculated afterwards
|
|
39
|
+
this.renderer.setStyle(this.el, 'width', '');
|
|
40
|
+
this.renderer.setStyle(this.el, 'height', '');
|
|
41
|
+
}
|
|
42
|
+
this.setGridSize();
|
|
43
|
+
this.calculateLayout();
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
this.getNextPossiblePosition = (newItem, startingFrom = {}) => {
|
|
47
|
+
if (newItem.cols === -1) {
|
|
48
|
+
newItem.cols = this.$options.defaultItemCols;
|
|
49
|
+
}
|
|
50
|
+
if (newItem.rows === -1) {
|
|
51
|
+
newItem.rows = this.$options.defaultItemRows;
|
|
52
|
+
}
|
|
53
|
+
this.setGridDimensions();
|
|
54
|
+
let rowsIndex = startingFrom.y || 0;
|
|
55
|
+
let colsIndex;
|
|
56
|
+
for (; rowsIndex < this.rows; rowsIndex++) {
|
|
57
|
+
newItem.y = rowsIndex;
|
|
58
|
+
colsIndex = startingFrom.x || 0;
|
|
59
|
+
for (; colsIndex < this.columns; colsIndex++) {
|
|
60
|
+
newItem.x = colsIndex;
|
|
61
|
+
if (!this.checkCollision(newItem)) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const canAddToRows = this.$options.maxRows >= this.rows + newItem.rows;
|
|
67
|
+
const canAddToColumns = this.$options.maxCols >= this.columns + newItem.cols;
|
|
68
|
+
const addToRows = this.rows <= this.columns && canAddToRows;
|
|
69
|
+
if (!addToRows && canAddToColumns) {
|
|
70
|
+
newItem.x = this.columns;
|
|
71
|
+
newItem.y = 0;
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
else if (canAddToRows) {
|
|
75
|
+
newItem.y = this.rows;
|
|
76
|
+
newItem.x = 0;
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
};
|
|
81
|
+
this.getFirstPossiblePosition = (item) => {
|
|
82
|
+
const tmpItem = Object.assign({}, item);
|
|
83
|
+
this.getNextPossiblePosition(tmpItem);
|
|
84
|
+
return tmpItem;
|
|
85
|
+
};
|
|
86
|
+
this.getLastPossiblePosition = (item) => {
|
|
87
|
+
let farthestItem = { y: 0, x: 0 };
|
|
88
|
+
farthestItem = this.grid.reduce((prev, curr) => {
|
|
89
|
+
const currCoords = {
|
|
90
|
+
y: curr.$item.y + curr.$item.rows - 1,
|
|
91
|
+
x: curr.$item.x + curr.$item.cols - 1
|
|
92
|
+
};
|
|
93
|
+
if (GridsterUtils.compareItems(prev, currCoords) === 1) {
|
|
94
|
+
return currCoords;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
return prev;
|
|
98
|
+
}
|
|
99
|
+
}, farthestItem);
|
|
100
|
+
const tmpItem = Object.assign({}, item);
|
|
101
|
+
this.getNextPossiblePosition(tmpItem, farthestItem);
|
|
102
|
+
return tmpItem;
|
|
103
|
+
};
|
|
104
|
+
this.el = el.nativeElement;
|
|
105
|
+
this.$options = JSON.parse(JSON.stringify(GridsterConfigService));
|
|
106
|
+
this.mobile = false;
|
|
107
|
+
this.curWidth = 0;
|
|
108
|
+
this.curHeight = 0;
|
|
109
|
+
this.grid = [];
|
|
110
|
+
this.curColWidth = 0;
|
|
111
|
+
this.curRowHeight = 0;
|
|
112
|
+
this.dragInProgress = false;
|
|
113
|
+
this.emptyCell = new GridsterEmptyCell(this);
|
|
114
|
+
this.compact = new GridsterCompact(this);
|
|
115
|
+
this.gridRenderer = new GridsterRenderer(this);
|
|
116
|
+
}
|
|
117
|
+
// ------ Function for swapWhileDragging option
|
|
118
|
+
// identical to checkCollision() except that here we add boundaries.
|
|
119
|
+
static checkCollisionTwoItemsForSwaping(item, item2) {
|
|
120
|
+
// if the cols or rows of the items are 1 , doesnt make any sense to set a boundary. Only if the item is bigger we set a boundary
|
|
121
|
+
const horizontalBoundaryItem1 = item.cols === 1 ? 0 : 1;
|
|
122
|
+
const horizontalBoundaryItem2 = item2.cols === 1 ? 0 : 1;
|
|
123
|
+
const verticalBoundaryItem1 = item.rows === 1 ? 0 : 1;
|
|
124
|
+
const verticalBoundaryItem2 = item2.rows === 1 ? 0 : 1;
|
|
125
|
+
return (item.x + horizontalBoundaryItem1 < item2.x + item2.cols &&
|
|
126
|
+
item.x + item.cols > item2.x + horizontalBoundaryItem2 &&
|
|
127
|
+
item.y + verticalBoundaryItem1 < item2.y + item2.rows &&
|
|
128
|
+
item.y + item.rows > item2.y + verticalBoundaryItem2);
|
|
129
|
+
}
|
|
130
|
+
checkCollisionTwoItems(item, item2) {
|
|
131
|
+
const collision = item.x < item2.x + item2.cols &&
|
|
132
|
+
item.x + item.cols > item2.x &&
|
|
133
|
+
item.y < item2.y + item2.rows &&
|
|
134
|
+
item.y + item.rows > item2.y;
|
|
135
|
+
if (!collision) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
if (!this.$options.allowMultiLayer) {
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
const defaultLayerIndex = this.$options.defaultLayerIndex;
|
|
142
|
+
const layerIndex = item.layerIndex === undefined ? defaultLayerIndex : item.layerIndex;
|
|
143
|
+
const layerIndex2 = item2.layerIndex === undefined ? defaultLayerIndex : item2.layerIndex;
|
|
144
|
+
return layerIndex === layerIndex2;
|
|
145
|
+
}
|
|
146
|
+
ngOnInit() {
|
|
147
|
+
if (this.options.initCallback) {
|
|
148
|
+
this.options.initCallback(this);
|
|
149
|
+
}
|
|
150
|
+
this.calculateLayout$
|
|
151
|
+
.pipe(debounceTime(0), takeUntil(this.destroy$))
|
|
152
|
+
.subscribe(() => this.calculateLayout());
|
|
153
|
+
this.resize$
|
|
154
|
+
.pipe(
|
|
155
|
+
// Cancel previously scheduled DOM timer if `calculateLayout()` has been called
|
|
156
|
+
// within this time range.
|
|
157
|
+
switchMap(() => timer(100)), takeUntil(this.destroy$))
|
|
158
|
+
.subscribe(() => this.resize());
|
|
159
|
+
}
|
|
160
|
+
ngOnChanges(changes) {
|
|
161
|
+
if (changes.options) {
|
|
162
|
+
this.setOptions();
|
|
163
|
+
this.options.api = {
|
|
164
|
+
optionsChanged: this.optionsChanged,
|
|
165
|
+
resize: this.onResize,
|
|
166
|
+
getNextPossiblePosition: this.getNextPossiblePosition,
|
|
167
|
+
getFirstPossiblePosition: this.getFirstPossiblePosition,
|
|
168
|
+
getLastPossiblePosition: this.getLastPossiblePosition,
|
|
169
|
+
getItemComponent: (item) => this.getItemComponent(item),
|
|
170
|
+
getCurrentRowHeight: this.getCurrentRowHeight
|
|
171
|
+
};
|
|
172
|
+
this.columns = this.$options.minCols;
|
|
173
|
+
this.rows = this.$options.minRows + this.$options.addEmptyRowsCount;
|
|
174
|
+
this.setGridSize();
|
|
175
|
+
this.calculateLayout();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
getCurrentRowHeight() {
|
|
179
|
+
return this.curRowHeight;
|
|
180
|
+
}
|
|
181
|
+
resize() {
|
|
182
|
+
let height;
|
|
183
|
+
let width;
|
|
184
|
+
if (this.$options.gridType === 'fit' && !this.mobile) {
|
|
185
|
+
width = this.el.offsetWidth;
|
|
186
|
+
height = this.el.offsetHeight;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
width = this.el.clientWidth;
|
|
190
|
+
height = this.el.clientHeight;
|
|
191
|
+
}
|
|
192
|
+
if ((width !== this.curWidth || height !== this.curHeight) &&
|
|
193
|
+
this.checkIfToResize()) {
|
|
194
|
+
this.onResize();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
setOptions() {
|
|
198
|
+
this.$options = GridsterUtils.merge(this.$options, this.options, this.$options);
|
|
199
|
+
if (!this.$options.disableWindowResize && !this.windowResize) {
|
|
200
|
+
this.windowResize = this.renderer.listen('window', 'resize', this.onResize);
|
|
201
|
+
}
|
|
202
|
+
else if (this.$options.disableWindowResize && this.windowResize) {
|
|
203
|
+
this.windowResize();
|
|
204
|
+
this.windowResize = null;
|
|
205
|
+
}
|
|
206
|
+
this.emptyCell.updateOptions();
|
|
207
|
+
}
|
|
208
|
+
ngOnDestroy() {
|
|
209
|
+
this.destroy$.next();
|
|
210
|
+
this.previewStyle$.complete();
|
|
211
|
+
if (this.windowResize) {
|
|
212
|
+
this.windowResize();
|
|
213
|
+
}
|
|
214
|
+
if (this.options && this.options.destroyCallback) {
|
|
215
|
+
this.options.destroyCallback(this);
|
|
216
|
+
}
|
|
217
|
+
if (this.options && this.options.api) {
|
|
218
|
+
this.options.api.resize = undefined;
|
|
219
|
+
this.options.api.optionsChanged = undefined;
|
|
220
|
+
this.options.api.getNextPossiblePosition = undefined;
|
|
221
|
+
this.options.api = undefined;
|
|
222
|
+
}
|
|
223
|
+
this.emptyCell.destroy();
|
|
224
|
+
this.emptyCell = null;
|
|
225
|
+
this.compact.destroy();
|
|
226
|
+
this.compact = null;
|
|
227
|
+
}
|
|
228
|
+
checkIfToResize() {
|
|
229
|
+
const clientWidth = this.el.clientWidth;
|
|
230
|
+
const offsetWidth = this.el.offsetWidth;
|
|
231
|
+
const scrollWidth = this.el.scrollWidth;
|
|
232
|
+
const clientHeight = this.el.clientHeight;
|
|
233
|
+
const offsetHeight = this.el.offsetHeight;
|
|
234
|
+
const scrollHeight = this.el.scrollHeight;
|
|
235
|
+
const verticalScrollPresent = clientWidth < offsetWidth &&
|
|
236
|
+
scrollHeight > offsetHeight &&
|
|
237
|
+
scrollHeight - offsetHeight < offsetWidth - clientWidth;
|
|
238
|
+
const horizontalScrollPresent = clientHeight < offsetHeight &&
|
|
239
|
+
scrollWidth > offsetWidth &&
|
|
240
|
+
scrollWidth - offsetWidth < offsetHeight - clientHeight;
|
|
241
|
+
if (verticalScrollPresent) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
return !horizontalScrollPresent;
|
|
245
|
+
}
|
|
246
|
+
checkIfMobile() {
|
|
247
|
+
if (this.$options.useBodyForBreakpoint) {
|
|
248
|
+
return this.$options.mobileBreakpoint > document.body.clientWidth;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
return this.$options.mobileBreakpoint > this.curWidth;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
setGridSize() {
|
|
255
|
+
const el = this.el;
|
|
256
|
+
let width;
|
|
257
|
+
let height;
|
|
258
|
+
if (this.$options.setGridSize ||
|
|
259
|
+
(this.$options.gridType === GridType.Fit && !this.mobile)) {
|
|
260
|
+
width = el.offsetWidth;
|
|
261
|
+
height = el.offsetHeight;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
width = el.clientWidth;
|
|
265
|
+
height = el.clientHeight;
|
|
266
|
+
}
|
|
267
|
+
this.curWidth = width;
|
|
268
|
+
this.curHeight = height;
|
|
269
|
+
}
|
|
270
|
+
setGridDimensions() {
|
|
271
|
+
this.setGridSize();
|
|
272
|
+
if (!this.mobile && this.checkIfMobile()) {
|
|
273
|
+
this.mobile = !this.mobile;
|
|
274
|
+
this.renderer.addClass(this.el, 'mobile');
|
|
275
|
+
}
|
|
276
|
+
else if (this.mobile && !this.checkIfMobile()) {
|
|
277
|
+
this.mobile = !this.mobile;
|
|
278
|
+
this.renderer.removeClass(this.el, 'mobile');
|
|
279
|
+
}
|
|
280
|
+
let rows = this.$options.minRows;
|
|
281
|
+
let columns = this.$options.minCols;
|
|
282
|
+
let widgetsIndex = this.grid.length - 1;
|
|
283
|
+
let widget;
|
|
284
|
+
for (; widgetsIndex >= 0; widgetsIndex--) {
|
|
285
|
+
widget = this.grid[widgetsIndex];
|
|
286
|
+
if (!widget.notPlaced) {
|
|
287
|
+
rows = Math.max(rows, widget.$item.y + widget.$item.rows);
|
|
288
|
+
columns = Math.max(columns, widget.$item.x + widget.$item.cols);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
rows += this.$options.addEmptyRowsCount;
|
|
292
|
+
if (this.columns !== columns || this.rows !== rows) {
|
|
293
|
+
this.columns = columns;
|
|
294
|
+
this.rows = rows;
|
|
295
|
+
if (this.options.gridSizeChangedCallback) {
|
|
296
|
+
this.options.gridSizeChangedCallback(this);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
calculateLayout() {
|
|
301
|
+
if (this.compact) {
|
|
302
|
+
this.compact.checkCompact();
|
|
303
|
+
}
|
|
304
|
+
this.setGridDimensions();
|
|
305
|
+
if (this.$options.outerMargin) {
|
|
306
|
+
let marginWidth = -this.$options.margin;
|
|
307
|
+
if (this.$options.outerMarginLeft !== null) {
|
|
308
|
+
marginWidth += this.$options.outerMarginLeft;
|
|
309
|
+
this.renderer.setStyle(this.el, 'padding-left', this.$options.outerMarginLeft + 'px');
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
marginWidth += this.$options.margin;
|
|
313
|
+
this.renderer.setStyle(this.el, 'padding-left', this.$options.margin + 'px');
|
|
314
|
+
}
|
|
315
|
+
if (this.$options.outerMarginRight !== null) {
|
|
316
|
+
marginWidth += this.$options.outerMarginRight;
|
|
317
|
+
this.renderer.setStyle(this.el, 'padding-right', this.$options.outerMarginRight + 'px');
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
marginWidth += this.$options.margin;
|
|
321
|
+
this.renderer.setStyle(this.el, 'padding-right', this.$options.margin + 'px');
|
|
322
|
+
}
|
|
323
|
+
this.curColWidth = (this.curWidth - marginWidth) / this.columns;
|
|
324
|
+
let marginHeight = -this.$options.margin;
|
|
325
|
+
if (this.$options.outerMarginTop !== null) {
|
|
326
|
+
marginHeight += this.$options.outerMarginTop;
|
|
327
|
+
this.renderer.setStyle(this.el, 'padding-top', this.$options.outerMarginTop + 'px');
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
marginHeight += this.$options.margin;
|
|
331
|
+
this.renderer.setStyle(this.el, 'padding-top', this.$options.margin + 'px');
|
|
332
|
+
}
|
|
333
|
+
if (this.$options.outerMarginBottom !== null) {
|
|
334
|
+
marginHeight += this.$options.outerMarginBottom;
|
|
335
|
+
this.renderer.setStyle(this.el, 'padding-bottom', this.$options.outerMarginBottom + 'px');
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
marginHeight += this.$options.margin;
|
|
339
|
+
this.renderer.setStyle(this.el, 'padding-bottom', this.$options.margin + 'px');
|
|
340
|
+
}
|
|
341
|
+
this.curRowHeight =
|
|
342
|
+
((this.curHeight - marginHeight) / this.rows) *
|
|
343
|
+
this.$options.rowHeightRatio;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
this.curColWidth = (this.curWidth + this.$options.margin) / this.columns;
|
|
347
|
+
this.curRowHeight =
|
|
348
|
+
((this.curHeight + this.$options.margin) / this.rows) *
|
|
349
|
+
this.$options.rowHeightRatio;
|
|
350
|
+
this.renderer.setStyle(this.el, 'padding-left', 0 + 'px');
|
|
351
|
+
this.renderer.setStyle(this.el, 'padding-right', 0 + 'px');
|
|
352
|
+
this.renderer.setStyle(this.el, 'padding-top', 0 + 'px');
|
|
353
|
+
this.renderer.setStyle(this.el, 'padding-bottom', 0 + 'px');
|
|
354
|
+
}
|
|
355
|
+
this.gridRenderer.updateGridster();
|
|
356
|
+
if (this.$options.setGridSize) {
|
|
357
|
+
this.renderer.addClass(this.el, 'gridSize');
|
|
358
|
+
if (!this.mobile) {
|
|
359
|
+
this.renderer.setStyle(this.el, 'width', this.columns * this.curColWidth + this.$options.margin + 'px');
|
|
360
|
+
this.renderer.setStyle(this.el, 'height', this.rows * this.curRowHeight + this.$options.margin + 'px');
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
this.renderer.removeClass(this.el, 'gridSize');
|
|
365
|
+
this.renderer.setStyle(this.el, 'width', '');
|
|
366
|
+
this.renderer.setStyle(this.el, 'height', '');
|
|
367
|
+
}
|
|
368
|
+
this.updateGrid();
|
|
369
|
+
let widgetsIndex = this.grid.length - 1;
|
|
370
|
+
let widget;
|
|
371
|
+
for (; widgetsIndex >= 0; widgetsIndex--) {
|
|
372
|
+
widget = this.grid[widgetsIndex];
|
|
373
|
+
widget.setSize();
|
|
374
|
+
widget.drag.toggle();
|
|
375
|
+
widget.resize.toggle();
|
|
376
|
+
}
|
|
377
|
+
this.resize$.next();
|
|
378
|
+
}
|
|
379
|
+
updateGrid() {
|
|
380
|
+
if (this.$options.displayGrid === 'always' && !this.mobile) {
|
|
381
|
+
this.renderer.addClass(this.el, 'display-grid');
|
|
382
|
+
}
|
|
383
|
+
else if (this.$options.displayGrid === 'onDrag&Resize' &&
|
|
384
|
+
this.dragInProgress) {
|
|
385
|
+
this.renderer.addClass(this.el, 'display-grid');
|
|
386
|
+
}
|
|
387
|
+
else if (this.$options.displayGrid === 'none' ||
|
|
388
|
+
!this.dragInProgress ||
|
|
389
|
+
this.mobile) {
|
|
390
|
+
this.renderer.removeClass(this.el, 'display-grid');
|
|
391
|
+
}
|
|
392
|
+
this.setGridDimensions();
|
|
393
|
+
this.gridColumns.length = GridsterComponent.getNewArrayLength(this.columns, this.curWidth, this.curColWidth);
|
|
394
|
+
this.gridRows.length = GridsterComponent.getNewArrayLength(this.rows, this.curHeight, this.curRowHeight);
|
|
395
|
+
this.cdRef.markForCheck();
|
|
396
|
+
}
|
|
397
|
+
addItem(itemComponent) {
|
|
398
|
+
if (itemComponent.$item.cols === undefined) {
|
|
399
|
+
itemComponent.$item.cols = this.$options.defaultItemCols;
|
|
400
|
+
itemComponent.item.cols = itemComponent.$item.cols;
|
|
401
|
+
itemComponent.itemChanged();
|
|
402
|
+
}
|
|
403
|
+
if (itemComponent.$item.rows === undefined) {
|
|
404
|
+
itemComponent.$item.rows = this.$options.defaultItemRows;
|
|
405
|
+
itemComponent.item.rows = itemComponent.$item.rows;
|
|
406
|
+
itemComponent.itemChanged();
|
|
407
|
+
}
|
|
408
|
+
if (itemComponent.$item.x === -1 || itemComponent.$item.y === -1) {
|
|
409
|
+
this.autoPositionItem(itemComponent);
|
|
410
|
+
}
|
|
411
|
+
else if (this.checkCollision(itemComponent.$item)) {
|
|
412
|
+
if (!this.$options.disableWarnings) {
|
|
413
|
+
itemComponent.notPlaced = true;
|
|
414
|
+
console.warn("Can't be placed in the bounds of the dashboard, trying to auto position!/n" +
|
|
415
|
+
JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
|
|
416
|
+
}
|
|
417
|
+
if (!this.$options.disableAutoPositionOnConflict) {
|
|
418
|
+
this.autoPositionItem(itemComponent);
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
itemComponent.notPlaced = true;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
this.grid.push(itemComponent);
|
|
425
|
+
this.calculateLayout$.next();
|
|
426
|
+
}
|
|
427
|
+
removeItem(itemComponent) {
|
|
428
|
+
this.grid.splice(this.grid.indexOf(itemComponent), 1);
|
|
429
|
+
this.calculateLayout$.next();
|
|
430
|
+
if (this.options.itemRemovedCallback) {
|
|
431
|
+
this.options.itemRemovedCallback(itemComponent.item, itemComponent);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
checkCollision(item) {
|
|
435
|
+
let collision = false;
|
|
436
|
+
if (this.options.itemValidateCallback) {
|
|
437
|
+
collision = !this.options.itemValidateCallback(item);
|
|
438
|
+
}
|
|
439
|
+
if (!collision && this.checkGridCollision(item)) {
|
|
440
|
+
collision = true;
|
|
441
|
+
}
|
|
442
|
+
if (!collision) {
|
|
443
|
+
const c = this.findItemWithItem(item);
|
|
444
|
+
if (c) {
|
|
445
|
+
collision = c;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return collision;
|
|
449
|
+
}
|
|
450
|
+
checkGridCollision(item) {
|
|
451
|
+
const noNegativePosition = item.y > -1 && item.x > -1;
|
|
452
|
+
const maxGridCols = item.cols + item.x <= this.$options.maxCols;
|
|
453
|
+
const maxGridRows = item.rows + item.y <= this.$options.maxRows;
|
|
454
|
+
const maxItemCols = item.maxItemCols === undefined
|
|
455
|
+
? this.$options.maxItemCols
|
|
456
|
+
: item.maxItemCols;
|
|
457
|
+
const minItemCols = item.minItemCols === undefined
|
|
458
|
+
? this.$options.minItemCols
|
|
459
|
+
: item.minItemCols;
|
|
460
|
+
const maxItemRows = item.maxItemRows === undefined
|
|
461
|
+
? this.$options.maxItemRows
|
|
462
|
+
: item.maxItemRows;
|
|
463
|
+
const minItemRows = item.minItemRows === undefined
|
|
464
|
+
? this.$options.minItemRows
|
|
465
|
+
: item.minItemRows;
|
|
466
|
+
const inColsLimits = item.cols <= maxItemCols && item.cols >= minItemCols;
|
|
467
|
+
const inRowsLimits = item.rows <= maxItemRows && item.rows >= minItemRows;
|
|
468
|
+
const minAreaLimit = item.minItemArea === undefined
|
|
469
|
+
? this.$options.minItemArea
|
|
470
|
+
: item.minItemArea;
|
|
471
|
+
const maxAreaLimit = item.maxItemArea === undefined
|
|
472
|
+
? this.$options.maxItemArea
|
|
473
|
+
: item.maxItemArea;
|
|
474
|
+
const area = item.cols * item.rows;
|
|
475
|
+
const inMinArea = minAreaLimit <= area;
|
|
476
|
+
const inMaxArea = maxAreaLimit >= area;
|
|
477
|
+
return !(noNegativePosition &&
|
|
478
|
+
maxGridCols &&
|
|
479
|
+
maxGridRows &&
|
|
480
|
+
inColsLimits &&
|
|
481
|
+
inRowsLimits &&
|
|
482
|
+
inMinArea &&
|
|
483
|
+
inMaxArea);
|
|
484
|
+
}
|
|
485
|
+
findItemWithItem(item) {
|
|
486
|
+
let widgetsIndex = 0;
|
|
487
|
+
let widget;
|
|
488
|
+
for (; widgetsIndex < this.grid.length; widgetsIndex++) {
|
|
489
|
+
widget = this.grid[widgetsIndex];
|
|
490
|
+
if (widget.$item !== item &&
|
|
491
|
+
this.checkCollisionTwoItems(widget.$item, item)) {
|
|
492
|
+
return widget;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
return false;
|
|
496
|
+
}
|
|
497
|
+
findItemsWithItem(item) {
|
|
498
|
+
const a = [];
|
|
499
|
+
let widgetsIndex = 0;
|
|
500
|
+
let widget;
|
|
501
|
+
for (; widgetsIndex < this.grid.length; widgetsIndex++) {
|
|
502
|
+
widget = this.grid[widgetsIndex];
|
|
503
|
+
if (widget.$item !== item &&
|
|
504
|
+
this.checkCollisionTwoItems(widget.$item, item)) {
|
|
505
|
+
a.push(widget);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return a;
|
|
509
|
+
}
|
|
510
|
+
autoPositionItem(itemComponent) {
|
|
511
|
+
if (this.getNextPossiblePosition(itemComponent.$item)) {
|
|
512
|
+
itemComponent.notPlaced = false;
|
|
513
|
+
itemComponent.item.x = itemComponent.$item.x;
|
|
514
|
+
itemComponent.item.y = itemComponent.$item.y;
|
|
515
|
+
itemComponent.itemChanged();
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
itemComponent.notPlaced = true;
|
|
519
|
+
if (!this.$options.disableWarnings) {
|
|
520
|
+
console.warn("Can't be placed in the bounds of the dashboard!/n" +
|
|
521
|
+
JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
pixelsToPositionX(x, roundingMethod, noLimit) {
|
|
526
|
+
const position = roundingMethod(x / this.curColWidth);
|
|
527
|
+
if (noLimit) {
|
|
528
|
+
return position;
|
|
529
|
+
}
|
|
530
|
+
else {
|
|
531
|
+
return Math.max(position, 0);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
pixelsToPositionY(y, roundingMethod, noLimit) {
|
|
535
|
+
const position = roundingMethod(y / this.curRowHeight);
|
|
536
|
+
if (noLimit) {
|
|
537
|
+
return position;
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
return Math.max(position, 0);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
positionXToPixels(x) {
|
|
544
|
+
return x * this.curColWidth;
|
|
545
|
+
}
|
|
546
|
+
positionYToPixels(y) {
|
|
547
|
+
return y * this.curRowHeight;
|
|
548
|
+
}
|
|
549
|
+
getItemComponent(item) {
|
|
550
|
+
return this.grid.find(c => c.item === item);
|
|
551
|
+
}
|
|
552
|
+
// ------ Functions for swapWhileDragging option
|
|
553
|
+
// identical to checkCollision() except that this function calls findItemWithItemForSwaping() instead of findItemWithItem()
|
|
554
|
+
checkCollisionForSwaping(item) {
|
|
555
|
+
let collision = false;
|
|
556
|
+
if (this.options.itemValidateCallback) {
|
|
557
|
+
collision = !this.options.itemValidateCallback(item);
|
|
558
|
+
}
|
|
559
|
+
if (!collision && this.checkGridCollision(item)) {
|
|
560
|
+
collision = true;
|
|
561
|
+
}
|
|
562
|
+
if (!collision) {
|
|
563
|
+
const c = this.findItemWithItemForSwapping(item);
|
|
564
|
+
if (c) {
|
|
565
|
+
collision = c;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
return collision;
|
|
569
|
+
}
|
|
570
|
+
// identical to findItemWithItem() except that this function calls checkCollisionTwoItemsForSwaping() instead of checkCollisionTwoItems()
|
|
571
|
+
findItemWithItemForSwapping(item) {
|
|
572
|
+
let widgetsIndex = this.grid.length - 1;
|
|
573
|
+
let widget;
|
|
574
|
+
for (; widgetsIndex > -1; widgetsIndex--) {
|
|
575
|
+
widget = this.grid[widgetsIndex];
|
|
576
|
+
if (widget.$item !== item &&
|
|
577
|
+
GridsterComponent.checkCollisionTwoItemsForSwaping(widget.$item, item)) {
|
|
578
|
+
return widget;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
return false;
|
|
582
|
+
}
|
|
583
|
+
previewStyle(drag = false) {
|
|
584
|
+
if (this.movingItem) {
|
|
585
|
+
if (this.compact && drag) {
|
|
586
|
+
this.compact.checkCompactItem(this.movingItem);
|
|
587
|
+
}
|
|
588
|
+
this.previewStyle$.next(this.movingItem);
|
|
589
|
+
}
|
|
590
|
+
else {
|
|
591
|
+
this.previewStyle$.next(null);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
// ------ End of functions for swapWhileDragging option
|
|
595
|
+
// eslint-disable-next-line @typescript-eslint/member-ordering
|
|
596
|
+
static getNewArrayLength(length, overallSize, size) {
|
|
597
|
+
const newLength = Math.max(length, Math.floor(overallSize / size));
|
|
598
|
+
if (newLength < 0) {
|
|
599
|
+
return 0;
|
|
600
|
+
}
|
|
601
|
+
if (Number.isFinite(newLength)) {
|
|
602
|
+
return Math.floor(newLength);
|
|
603
|
+
}
|
|
604
|
+
return 0;
|
|
605
|
+
}
|
|
606
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: GridsterComponent, deps: [{ token: ElementRef }, { token: Renderer2 }, { token: ChangeDetectorRef }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
607
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: GridsterComponent, isStandalone: true, selector: "gridster", inputs: { options: "options" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"gridster-column\"\n *ngFor=\"let column of gridColumns; let i = index;\"\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"\n></div>\n<div\n class=\"gridster-row\"\n *ngFor=\"let row of gridRows; let i = index;\"\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"\n></div>\n<ng-content></ng-content>\n<gridster-preview\n [gridRenderer]=\"gridRenderer\"\n [previewStyle$]=\"previewStyle$\"\n class=\"gridster-preview\"\n></gridster-preview>\n", styles: ["gridster{position:relative;box-sizing:border-box;background:gray;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:block}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto}gridster.mobile gridster-item{position:relative}gridster.gridSize{height:initial;width:initial}gridster.gridSize.fit{height:100%;width:100%}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid white;border-right:1px solid white}gridster .gridster-row{border-top:1px solid white;border-bottom:1px solid white}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: GridsterPreviewComponent, selector: "gridster-preview", inputs: ["previewStyle$", "gridRenderer"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
608
|
+
}
|
|
609
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: GridsterComponent, decorators: [{
|
|
610
|
+
type: Component,
|
|
611
|
+
args: [{ selector: 'gridster', encapsulation: ViewEncapsulation.None, standalone: true, imports: [NgForOf, NgStyle, GridsterPreviewComponent], template: "<div\n class=\"gridster-column\"\n *ngFor=\"let column of gridColumns; let i = index;\"\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"\n></div>\n<div\n class=\"gridster-row\"\n *ngFor=\"let row of gridRows; let i = index;\"\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"\n></div>\n<ng-content></ng-content>\n<gridster-preview\n [gridRenderer]=\"gridRenderer\"\n [previewStyle$]=\"previewStyle$\"\n class=\"gridster-preview\"\n></gridster-preview>\n", styles: ["gridster{position:relative;box-sizing:border-box;background:gray;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:block}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto}gridster.mobile gridster-item{position:relative}gridster.gridSize{height:initial;width:initial}gridster.gridSize.fit{height:100%;width:100%}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid white;border-right:1px solid white}gridster .gridster-row{border-top:1px solid white;border-bottom:1px solid white}\n"] }]
|
|
612
|
+
}], ctorParameters: () => [{ type: i0.ElementRef, decorators: [{
|
|
613
|
+
type: Inject,
|
|
614
|
+
args: [ElementRef]
|
|
615
|
+
}] }, { type: i0.Renderer2, decorators: [{
|
|
616
|
+
type: Inject,
|
|
617
|
+
args: [Renderer2]
|
|
618
|
+
}] }, { type: i0.ChangeDetectorRef, decorators: [{
|
|
619
|
+
type: Inject,
|
|
620
|
+
args: [ChangeDetectorRef]
|
|
621
|
+
}] }, { type: i0.NgZone, decorators: [{
|
|
622
|
+
type: Inject,
|
|
623
|
+
args: [NgZone]
|
|
624
|
+
}] }], propDecorators: { options: [{
|
|
625
|
+
type: Input
|
|
626
|
+
}] } });
|
|
627
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmEtZGFzaGJvYXJkLWZyYW1ld29yay9zcmMvZ3JpZHN0ZXIvbGliL2dyaWRzdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JhLWRhc2hib2FyZC1mcmFtZXdvcmsvc3JjL2dyaWRzdGVyL2xpYi9ncmlkc3Rlci5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFJTixTQUFTLEVBRVQsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQWtCLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBS2hFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFXeEQsTUFBTSxPQUFPLGlCQUFpQjtJQTZCNUIsWUFDc0IsRUFBYyxFQUNSLFFBQW1CLEVBQ1gsS0FBd0IsRUFD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QUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNoRSxNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVM7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVztZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN2QixNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVM7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVztZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN2QixNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVM7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVztZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN2QixNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVM7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVztZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN2QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQztRQUMxRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQztRQUMxRSxNQUFNLFlBQVksR0FDaEIsSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVc7WUFD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TTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLE1BQU07eUNBL0JQLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nRm9yT2YsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkc3RlckNvbXBhY3QgfSBmcm9tICcuL2dyaWRzdGVyQ29tcGFjdC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZy5jb25zdGFudCc7XG5pbXBvcnQgeyBHcmlkc3RlckNvbmZpZywgR3JpZFR5cGUgfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkc3RlckNvbmZpZ1MgfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnUy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJFbXB0eUNlbGwgfSBmcm9tICcuL2dyaWRzdGVyRW1wdHlDZWxsLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgR3JpZHN0ZXJJdGVtLFxuICBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2Vcbn0gZnJvbSAnLi9ncmlkc3Rlckl0ZW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRzdGVyUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4vZ3JpZHN0ZXJQcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcmlkc3RlclJlbmRlcmVyIH0gZnJvbSAnLi9ncmlkc3RlclJlbmRlcmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJVdGlscyB9IGZyb20gJy4vZ3JpZHN0ZXJVdGlscy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnZ3JpZHN0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZHN0ZXIuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dyaWRzdGVyLmNzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdGb3JPZiwgTmdTdHlsZSwgR3JpZHN0ZXJQcmV2aWV3Q29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBHcmlkc3RlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlIHtcbiAgQElucHV0KCkgb3B0aW9ucyE6IEdyaWRzdGVyQ29uZmlnO1xuICBtb3ZpbmdJdGVtITogR3JpZHN0ZXJJdGVtIHwgbnVsbDtcbiAgZWw6IEhUTUxFbGVtZW50O1xuICAkb3B0aW9uczogR3JpZHN0ZXJDb25maWdTO1xuICBtb2JpbGU6IGJvb2xlYW47XG4gIGN1cldpZHRoOiBudW1iZXI7XG4gIGN1ckhlaWdodDogbnVtYmVyO1xuICBncmlkOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2VbXTtcbiAgY29sdW1ucyA9IDA7XG4gIHJvd3MgPSAwO1xuICBjdXJDb2xXaWR0aDogbnVtYmVyO1xuICBjdXJSb3dIZWlnaHQ6IG51bWJlcjtcbiAgZ3JpZENvbHVtbnMgPSBbXTtcbiAgZ3JpZFJvd3MgPSBbXTtcbiAgd2luZG93UmVzaXplITogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgZHJhZ0luUHJvZ3Jlc3M6IGJvb2xlYW47XG4gIGVtcHR5Q2VsbDogR3JpZHN0ZXJFbXB0eUNlbGw7XG4gIGNvbXBhY3Q6IEdyaWRzdGVyQ29tcGFjdDtcbiAgZ3JpZFJlbmRlcmVyOiBHcmlkc3RlclJlbmRlcmVyO1xuICBwcmV2aWV3U3R5bGUkOiBFdmVudEVtaXR0ZXI8R3JpZHN0ZXJJdGVtIHwgbnVsbD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8R3JpZHN0ZXJJdGVtIHwgbnVsbD4oKTtcblxuICBjYWxjdWxhdGVMYXlvdXQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlc2l6ZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEVsZW1lbnRSZWYpIGVsOiBFbGVtZW50UmVmLFxuICAgIEBJbmplY3QoUmVuZGVyZXIyKSBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBASW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSBwdWJsaWMgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoTmdab25lKSBwdWJsaWMgem9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMuZWwgPSBlbC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuJG9wdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEdyaWRzdGVyQ29uZmlnU2VydmljZSkpO1xuICAgIHRoaXMubW9iaWxlID0gZmFsc2U7XG4gICAgdGhpcy5jdXJXaWR0aCA9IDA7XG4gICAgdGhpcy5jdXJIZWlnaHQgPSAwO1xuICAgIHRoaXMuZ3JpZCA9IFtdO1xuICAgIHRoaXMuY3VyQ29sV2lkdGggPSAwO1xuICAgIHRoaXMuY3VyUm93SGVpZ2h0ID0gMDtcbiAgICB0aGlzLmRyYWdJblByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5lbXB0eUNlbGwgPSBuZXcgR3JpZHN0ZXJFbXB0eUNlbGwodGhpcyk7XG4gICAgdGhpcy5jb21wYWN0ID0gbmV3IEdyaWRzdGVyQ29tcGFjdCh0aGlzKTtcbiAgICB0aGlzLmdyaWRSZW5kZXJlciA9IG5ldyBHcmlkc3RlclJlbmRlcmVyKHRoaXMpO1xuICB9XG5cbiAgLy8gLS0tLS0tIEZ1bmN0aW9uIGZvciBzd2FwV2hpbGVEcmFnZ2luZyBvcHRpb25cblxuICAvLyBpZGVudGljYWwgdG8gY2hlY2tDb2xsaXNpb24oKSBleGNlcHQgdGhhdCBoZXJlIHdlIGFkZCBib3VuZGFyaWVzLlxuICBzdGF0aWMgY2hlY2tDb2xsaXNpb25Ud29JdGVtc0ZvclN3YXBpbmcoXG4gICAgaXRlbTogR3JpZHN0ZXJJdGVtLFxuICAgIGl0ZW0yOiBHcmlkc3Rlckl0ZW1cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gaWYgdGhlIGNvbHMgb3Igcm93cyBvZiB0aGUgaXRlbXMgYXJlIDEgLCBkb2VzbnQgbWFrZSBhbnkgc2Vuc2UgdG8gc2V0IGEgYm91bmRhcnkuIE9ubHkgaWYgdGhlIGl0ZW0gaXMgYmlnZ2VyIHdlIHNldCBhIGJvdW5kYXJ5XG4gICAgY29uc3QgaG9yaXpvbnRhbEJvdW5kYXJ5SXRlbTEgPSBpdGVtLmNvbHMgPT09IDEgPyAwIDogMTtcbiAgICBjb25zdCBob3Jpem9udGFsQm91bmRhcnlJdGVtMiA9IGl0ZW0yLmNvbHMgPT09IDEgPyAwIDogMTtcbiAgICBjb25zdCB2ZXJ0aWNhbEJvdW5kYXJ5SXRlbTEgPSBpdGVtLnJvd3MgPT09IDEgPyAwIDogMTtcbiAgICBjb25zdCB2ZXJ0aWNhbEJvdW5kYXJ5SXRlbTIgPSBpdGVtMi5yb3dzID09PSAxID8gMCA6IDE7XG4gICAgcmV0dXJuIChcbiAgICAgIGl0ZW0ueCArIGhvcml6b250YWxCb3VuZGFyeUl0ZW0xIDwgaXRlbTIueCArIGl0ZW0yLmNvbHMgJiZcbiAgICAgIGl0ZW0ueCArIGl0ZW0uY29scyA+IGl0ZW0yLnggKyBob3Jpem9udGFsQm91bmRhcnlJdGVtMiAmJlxuICAgICAgaXRlbS55ICsgdmVydGljYWxCb3VuZGFyeUl0ZW0xIDwgaXRlbTIueSArIGl0ZW0yLnJvd3MgJiZcbiAgICAgIGl0ZW0ueSArIGl0ZW0ucm93cyA+IGl0ZW0yLnkgKyB2ZXJ0aWNhbEJvdW5kYXJ5SXRlbTJcbiAgICApO1xuICB9XG5cbiAgY2hlY2tDb2xsaXNpb25Ud29JdGVtcyhpdGVtOiBHcmlkc3Rlckl0ZW0sIGl0ZW0yOiBHcmlkc3Rlckl0ZW0pOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2xsaXNpb24gPVxuICAgICAgaXRlbS54IDwgaXRlbTIueCArIGl0ZW0yLmNvbHMgJiZcbiAgICAgIGl0ZW0ueCArIGl0ZW0uY29scyA+IGl0ZW0yLnggJiZcbiAgICAgIGl0ZW0ueSA8IGl0ZW0yLnkgKyBpdGVtMi5yb3dzICYmXG4gICAgICBpdGVtLnkgKyBpdGVtLnJvd3MgPiBpdGVtMi55O1xuICAgIGlmICghY29sbGlzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy4kb3B0aW9ucy5hbGxvd011bHRpTGF5ZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0TGF5ZXJJbmRleCA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdExheWVySW5kZXg7XG4gICAgY29uc3QgbGF5ZXJJbmRleCA9XG4gICAgICBpdGVtLmxheWVySW5kZXggPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRMYXllckluZGV4IDogaXRlbS5sYXllckluZGV4O1xuICAgIGNvbnN0IGxheWVySW5kZXgyID1cbiAgICAgIGl0ZW0yLmxheWVySW5kZXggPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRMYXllckluZGV4IDogaXRlbTIubGF5ZXJJbmRleDtcbiAgICByZXR1cm4gbGF5ZXJJbmRleCA9PT0gbGF5ZXJJbmRleDI7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmluaXRDYWxsYmFjaykge1xuICAgICAgdGhpcy5vcHRpb25zLmluaXRDYWxsYmFjayh0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dCRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNhbGN1bGF0ZUxheW91dCgpKTtcblxuICAgIHRoaXMucmVzaXplJFxuICAgICAgLnBpcGUoXG4gICAgICAgIC8vIENhbmNlbCBwcmV2aW91c2x5IHNjaGVkdWxlZCBET00gdGltZXIgaWYgYGNhbGN1bGF0ZUxheW91dCgpYCBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgLy8gd2l0aGluIHRoaXMgdGltZSByYW5nZS5cbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRpbWVyKDEwMCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNpemUoKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucykge1xuICAgICAgdGhpcy5zZXRPcHRpb25zKCk7XG4gICAgICB0aGlzLm9wdGlvbnMuYXBpID0ge1xuICAgICAgICBvcHRpb25zQ2hhbmdlZDogdGhpcy5vcHRpb25zQ2hhbmdlZCxcbiAgICAgICAgcmVzaXplOiB0aGlzLm9uUmVzaXplLFxuICAgICAgICBnZXROZXh0UG9zc2libGVQb3NpdGlvbjogdGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbixcbiAgICAgICAgZ2V0Rmlyc3RQb3NzaWJsZVBvc2l0aW9uOiB0aGlzLmdldEZpcnN0UG9zc2libGVQb3NpdGlvbixcbiAgICAgICAgZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb24sXG4gICAgICAgIGdldEl0ZW1Db21wb25lbnQ6IChpdGVtOiBHcmlkc3Rlckl0ZW0pID0+IHRoaXMuZ2V0SXRlbUNvbXBvbmVudChpdGVtKSxcbiAgICAgICAgZ2V0Q3VycmVudFJvd0hlaWdodDogdGhpcy5nZXRDdXJyZW50Um93SGVpZ2h0XG4gICAgICB9O1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy4kb3B0aW9ucy5taW5Db2xzO1xuICAgICAgdGhpcy5yb3dzID0gdGhpcy4kb3B0aW9ucy5taW5Sb3dzICsgdGhpcy4kb3B0aW9ucy5hZGRFbXB0eVJvd3NDb3VudDtcbiAgICAgIHRoaXMuc2V0R3JpZFNpemUoKTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVudFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1clJvd0hlaWdodDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzaXplKCk6IHZvaWQge1xuICAgIGxldCBoZWlnaHQ7XG4gICAgbGV0IHdpZHRoO1xuICAgIGlmICh0aGlzLiRvcHRpb25zLmdyaWRUeXBlID09PSAnZml0JyAmJiAhdGhpcy5tb2JpbGUpIHtcbiAgICAgIHdpZHRoID0gdGhpcy5lbC5vZmZzZXRXaWR0aDtcbiAgICAgIGhlaWdodCA9IHRoaXMuZWwub2Zmc2V0SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWR0aCA9IHRoaXMuZWwuY2xpZW50V2lkdGg7XG4gICAgICBoZWlnaHQgPSB0aGlzLmVsLmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKHdpZHRoICE9PSB0aGlzLmN1cldpZHRoIHx8IGhlaWdodCAhPT0gdGhpcy5jdXJIZWlnaHQpICYmXG4gICAgICB0aGlzLmNoZWNrSWZUb1Jlc2l6ZSgpXG4gICAgKSB7XG4gICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0T3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLiRvcHRpb25zID0gR3JpZHN0ZXJVdGlscy5tZXJnZShcbiAgICAgIHRoaXMuJG9wdGlvbnMsXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLiRvcHRpb25zXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuJG9wdGlvbnMuZGlzYWJsZVdpbmRvd1Jlc2l6ZSAmJiAhdGhpcy53aW5kb3dSZXNpemUpIHtcbiAgICAgIHRoaXMud2luZG93UmVzaXplID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oXG4gICAgICAgICd3aW5kb3cnLFxuICAgICAgICAncmVzaXplJyxcbiAgICAgICAgdGhpcy5vblJlc2l6ZVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJG9wdGlvbnMuZGlzYWJsZVdpbmRvd1Jlc2l6ZSAmJiB0aGlzLndpbmRvd1Jlc2l6ZSkge1xuICAgICAgdGhpcy53aW5kb3dSZXNpemUoKTtcbiAgICAgIHRoaXMud2luZG93UmVzaXplID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5lbXB0eUNlbGwudXBkYXRlT3B0aW9ucygpO1xuICB9XG5cbiAgb3B0aW9uc0NoYW5nZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5zZXRPcHRpb25zKCk7XG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDE7XG4gICAgbGV0IHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPj0gMDsgd2lkZ2V0c0luZGV4LS0pIHtcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xuICAgICAgd2lkZ2V0LnVwZGF0ZU9wdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcbiAgfTtcblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLnByZXZpZXdTdHlsZSQuY29tcGxldGUoKTtcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemUpIHtcbiAgICAgIHRoaXMud2luZG93UmVzaXplKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmRlc3Ryb3lDYWxsYmFjaykge1xuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lDYWxsYmFjayh0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuYXBpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLnJlc2l6ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkub3B0aW9uc0NoYW5nZWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vcHRpb25zLmFwaSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5lbXB0eUNlbGwuZGVzdHJveSgpO1xuICAgIHRoaXMuZW1wdHlDZWxsID0gbnVsbCE7XG4gICAgdGhpcy5jb21wYWN0LmRlc3Ryb3koKTtcbiAgICB0aGlzLmNvbXBhY3QgPSBudWxsITtcbiAgfVxuXG4gIG9uUmVzaXplID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLmVsLmNsaWVudFdpZHRoKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNldEdyaWRTaXplKSB7XG4gICAgICAgIC8vIHJlc2V0IHdpZHRoL2hlaWdodCBzbyB0aGUgc2l6ZSBpcyByZWNhbGN1bGF0ZWQgYWZ0ZXJ3YXJkc1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICd3aWR0aCcsICcnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnaGVpZ2h0JywgJycpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRHcmlkU2l6ZSgpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcbiAgICB9XG4gIH07XG5cbiAgY2hlY2tJZlRvUmVzaXplKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNsaWVudFdpZHRoID0gdGhpcy5lbC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBvZmZzZXRXaWR0aCA9IHRoaXMuZWwub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgc2Nyb2xsV2lkdGggPSB0aGlzLmVsLnNjcm9sbFdpZHRoO1xuICAgIGNvbnN0IGNsaWVudEhlaWdodCA9IHRoaXMuZWwuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IG9mZnNldEhlaWdodCA9IHRoaXMuZWwub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9IHRoaXMuZWwuc2Nyb2xsSGVpZ2h0O1xuICAgIGNvbnN0IHZlcnRpY2FsU2Nyb2xsUHJlc2VudCA9XG4gICAgICBjbGllbnRXaWR0aCA8IG9mZnNldFdpZHRoICYmXG4gICAgICBzY3JvbGxIZWlnaHQgPiBvZmZzZXRIZWlnaHQgJiZcbiAgICAgIHNjcm9sbEhlaWdodCAtIG9mZnNldEhlaWdodCA8IG9mZnNldFdpZHRoIC0gY2xpZW50V2lkdGg7XG4gICAgY29uc3QgaG9yaXpvbnRhbFNjcm9sbFByZXNlbnQgPVxuICAgICAgY2xpZW50SGVpZ2h0IDwgb2Zmc2V0SGVpZ2h0ICYmXG4gICAgICBzY3JvbGxXaWR0aCA+IG9mZnNldFdpZHRoICYmXG4gICAgICBzY3JvbGxXaWR0aCAtIG9mZnNldFdpZHRoIDwgb2Zmc2V0SGVpZ2h0IC0gY2xpZW50SGVpZ2h0O1xuICAgIGlmICh2ZXJ0aWNhbFNjcm9sbFByZXNlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFob3Jpem9udGFsU2Nyb2xsUHJlc2VudDtcbiAgfVxuXG4gIGNoZWNrSWZNb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuJG9wdGlvbnMudXNlQm9keUZvckJyZWFrcG9pbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLiRvcHRpb25zLm1vYmlsZUJyZWFrcG9pbnQgPiBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy4kb3B0aW9ucy5tb2JpbGVCcmVha3BvaW50ID4gdGhpcy5jdXJXaWR0aDtcbiAgICB9XG4gIH1cblxuICBzZXRHcmlkU2l6ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuZWw7XG4gICAgbGV0IHdpZHRoO1xuICAgIGxldCBoZWlnaHQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy4kb3B0aW9ucy5zZXRHcmlkU2l6ZSB8fFxuICAgICAgKHRoaXMuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLkZpdCAmJiAhdGhpcy5tb2JpbGUpXG4gICAgKSB7XG4gICAgICB3aWR0aCA9IGVsLm9mZnNldFdpZHRoO1xuICAgICAgaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWR0aCA9IGVsLmNsaWVudFdpZHRoO1xuICAgICAgaGVpZ2h0ID0gZWwuY2xpZW50SGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLmN1cldpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jdXJIZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBzZXRHcmlkRGltZW5zaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnNldEdyaWRTaXplKCk7XG4gICAgaWYgKCF0aGlzLm1vYmlsZSAmJiB0aGlzLmNoZWNrSWZNb2JpbGUoKSkge1xuICAgICAgdGhpcy5tb2JpbGUgPSAhdGhpcy5tb2JpbGU7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdtb2JpbGUnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9iaWxlICYmICF0aGlzLmNoZWNrSWZNb2JpbGUoKSkge1xuICAgICAgdGhpcy5tb2JpbGUgPSAhdGhpcy5tb2JpbGU7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwsICdtb2JpbGUnKTtcbiAgICB9XG4gICAgbGV0IHJvd3MgPSB0aGlzLiRvcHRpb25zLm1pblJvd3M7XG4gICAgbGV0IGNvbHVtbnMgPSB0aGlzLiRvcHRpb25zLm1pbkNvbHM7XG5cbiAgICBsZXQgd2lkZ2V0c0luZGV4ID0gdGhpcy5ncmlkLmxlbmd0aCAtIDE7XG4gICAgbGV0IHdpZGdldDtcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcbiAgICAgIGlmICghd2lkZ2V0Lm5vdFBsYWNlZCkge1xuICAgICAgICByb3dzID0gTWF0aC5tYXgocm93cywgd2lkZ2V0LiRpdGVtLnkgKyB3aWRnZXQuJGl0ZW0ucm93cyk7XG4gICAgICAgIGNvbHVtbnMgPSBNYXRoLm1heChjb2x1bW5zLCB3aWRnZXQuJGl0ZW0ueCArIHdpZGdldC4kaXRlbS5jb2xzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcm93cyArPSB0aGlzLiRvcHRpb25zLmFkZEVtcHR5Um93c0NvdW50O1xuICAgIGlmICh0aGlzLmNvbHVtbnMgIT09IGNvbHVtbnMgfHwgdGhpcy5yb3dzICE9PSByb3dzKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgICAgdGhpcy5yb3dzID0gcm93cztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFNpemVDaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmdyaWRTaXplQ2hhbmdlZENhbGxiYWNrKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTGF5b3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBhY3QpIHtcbiAgICAgIHRoaXMuY29tcGFjdC5jaGVja0NvbXBhY3QoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEdyaWREaW1lbnNpb25zKCk7XG4gICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcbiAgICAgIGxldCBtYXJnaW5XaWR0aCA9IC10aGlzLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdCAhPT0gbnVsbCkge1xuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICB0aGlzLmVsLFxuICAgICAgICAgICdwYWRkaW5nLWxlZnQnLFxuICAgICAgICAgIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0ICsgJ3B4J1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgdGhpcy5lbCxcbiAgICAgICAgICAncGFkZGluZy1sZWZ0JyxcbiAgICAgICAgICB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQgIT09IG51bGwpIHtcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblJpZ2h0O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuZWwsXG4gICAgICAgICAgJ3BhZGRpbmctcmlnaHQnLFxuICAgICAgICAgIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodCArICdweCdcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuZWwsXG4gICAgICAgICAgJ3BhZGRpbmctcmlnaHQnLFxuICAgICAgICAgIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4J1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJDb2xXaWR0aCA9ICh0aGlzLmN1cldpZHRoIC0gbWFyZ2luV2lkdGgpIC8gdGhpcy5jb2x1bW5zO1xuICAgICAgbGV0IG1hcmdpbkhlaWdodCA9IC10aGlzLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wICE9PSBudWxsKSB7XG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuZWwsXG4gICAgICAgICAgJ3BhZGRpbmctdG9wJyxcbiAgICAgICAgICB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wICsgJ3B4J1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFyZ2luSGVpZ2h0ICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuZWwsXG4gICAgICAgICAgJ3BhZGRpbmctdG9wJyxcbiAgICAgICAgICB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICE9PSBudWxsKSB7XG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuZWwsXG4gICAgICAgICAgJ3BhZGRpbmctYm90dG9tJyxcbiAgICAgICAgICB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICsgJ3B4J1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFyZ2luSGVpZ2h0ICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuZWwsXG4gICAgICAgICAgJ3BhZGRpbmctYm90dG9tJyxcbiAgICAgICAgICB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VyUm93SGVpZ2h0ID1cbiAgICAgICAgKCh0aGlzLmN1ckhlaWdodCAtIG1hcmdpbkhlaWdodCkgLyB0aGlzLnJvd3MpICpcbiAgICAgICAgdGhpcy4kb3B0aW9ucy5yb3dIZWlnaHRSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJDb2xXaWR0aCA9ICh0aGlzLmN1cldpZHRoICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4pIC8gdGhpcy5jb2x1bW5zO1xuICAgICAgdGhpcy5jdXJSb3dIZWlnaHQgPVxuICAgICAgICAoKHRoaXMuY3VySGVpZ2h0ICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4pIC8gdGhpcy5yb3dzKSAqXG4gICAgICAgIHRoaXMuJG9wdGlvbnMucm93SGVpZ2h0UmF0aW87XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWxlZnQnLCAwICsgJ3B4Jyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXJpZ2h0JywgMCArICdweCcpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy10b3AnLCAwICsgJ3B4Jyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWJvdHRvbScsIDAgKyAncHgnKTtcbiAgICB9XG4gICAgdGhpcy5ncmlkUmVuZGVyZXIudXBkYXRlR3JpZHN0ZXIoKTtcblxuICAgIGlmICh0aGlzLiRvcHRpb25zLnNldEdyaWRTaXplKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdncmlkU2l6ZScpO1xuICAgICAgaWYgKCF0aGlzLm1vYmlsZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuZWwsXG4gICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgKiB0aGlzLmN1ckNvbFdpZHRoICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4gKyAncHgnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgdGhpcy5lbCxcbiAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICB0aGlzLnJvd3MgKiB0aGlzLmN1clJvd0hlaWdodCArIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwsICdncmlkU2l6ZScpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnd2lkdGgnLCAnJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdoZWlnaHQnLCAnJyk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuXG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDE7XG4gICAgbGV0IHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPj0gMDsgd2lkZ2V0c0luZGV4LS0pIHtcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xuICAgICAgd2lkZ2V0LnNldFNpemUoKTtcbiAgICAgIHdpZGdldC5kcmFnLnRvZ2dsZSgpO1xuICAgICAgd2lkZ2V0LnJlc2l6ZS50b2dnbGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2l6ZSQubmV4dCgpO1xuICB9XG5cbiAgdXBkYXRlR3JpZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5kaXNwbGF5R3JpZCA9PT0gJ2Fsd2F5cycgJiYgIXRoaXMubW9iaWxlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdkaXNwbGF5LWdyaWQnKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy4kb3B0aW9ucy5kaXNwbGF5R3JpZCA9PT0gJ29uRHJhZyZSZXNpemUnICYmXG4gICAgICB0aGlzLmRyYWdJblByb2dyZXNzXG4gICAgKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdkaXNwbGF5LWdyaWQnKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy4kb3B0aW9ucy5kaXNwbGF5R3JpZCA9PT0gJ25vbmUnIHx8XG4gICAgICAhdGhpcy5kcmFnSW5Qcm9ncmVzcyB8fFxuICAgICAgdGhpcy5tb2JpbGVcbiAgICApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbCwgJ2Rpc3BsYXktZ3JpZCcpO1xuICAgIH1cbiAgICB0aGlzLnNldEdyaWREaW1lbnNpb25zKCk7XG4gICAgdGhpcy5ncmlkQ29sdW1ucy5sZW5ndGggPSBHcmlkc3RlckNvbXBvbmVudC5nZXROZXdBcnJheUxlbmd0aChcbiAgICAgIHRoaXMuY29sdW1ucyxcbiAgICAgIHRoaXMuY3VyV2lkdGgsXG4gICAgICB0aGlzLmN1ckNvbFdpZHRoXG4gICAgKTtcbiAgICB0aGlzLmdyaWRSb3dzLmxlbmd0aCA9IEdyaWRzdGVyQ29tcG9uZW50LmdldE5ld0FycmF5TGVuZ3RoKFxuICAgICAgdGhpcy5yb3dzLFxuICAgICAgdGhpcy5jdXJIZWlnaHQsXG4gICAgICB0aGlzLmN1clJvd0hlaWdodFxuICAgICk7XG4gICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFkZEl0ZW0oaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpdGVtQ29tcG9uZW50LiRpdGVtLmNvbHMgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtQ29scztcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS5jb2xzID0gaXRlbUNvbXBvbmVudC4kaXRlbS5jb2xzO1xuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoaXRlbUNvbXBvbmVudC4kaXRlbS5yb3dzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Sb3dzO1xuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLnJvd3MgPSBpdGVtQ29tcG9uZW50LiRpdGVtLnJvd3M7XG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW1DaGFuZ2VkKCk7XG4gICAgfVxuICAgIGlmIChpdGVtQ29tcG9uZW50LiRpdGVtLnggPT09IC0xIHx8IGl0ZW1Db21wb25lbnQuJGl0ZW0ueSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2tDb2xsaXNpb24oaXRlbUNvbXBvbmVudC4kaXRlbSkpIHtcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlV2FybmluZ3MpIHtcbiAgICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJDYW4ndCBiZSBwbGFjZWQgaW4gdGhlIGJvdW5kcyBvZiB0aGUgZGFzaGJvYXJkLCB0cnlpbmcgdG8gYXV0byBwb3NpdGlvbiEvblwiICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpdGVtQ29tcG9uZW50Lml0ZW0sIFsnY29scycsICdyb3dzJywgJ3gnLCAneSddKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVBdXRvUG9zaXRpb25PbkNvbmZsaWN0KSB7XG4gICAgICAgIHRoaXMuYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5ncmlkLnB1c2goaXRlbUNvbXBvbmVudCk7XG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQkLm5leHQoKTtcbiAgfVxuXG4gIHJlbW92ZUl0ZW0oaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XG4gICAgdGhpcy5ncmlkLnNwbGljZSh0aGlzLmdyaWQuaW5kZXhPZihpdGVtQ29tcG9uZW50KSwgMSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQkLm5leHQoKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLml0ZW1SZW1vdmVkQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMub3B0aW9ucy5pdGVtUmVtb3ZlZENhbGxiYWNrKGl0ZW1Db21wb25lbnQuaXRlbSwgaXRlbUNvbXBvbmVudCk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDb2xsaXNpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XG4gICAgbGV0IGNvbGxpc2lvbjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2spIHtcbiAgICAgIGNvbGxpc2lvbiA9ICF0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2soaXRlbSk7XG4gICAgfVxuICAgIGlmICghY29sbGlzaW9uICYmIHRoaXMuY2hlY2tHcmlkQ29sbGlzaW9uKGl0ZW0pKSB7XG4gICAgICBjb2xsaXNpb24gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNvbGxpc2lvbikge1xuICAgICAgY29uc3QgYyA9IHRoaXMuZmluZEl0ZW1XaXRoSXRlbShpdGVtKTtcbiAgICAgIGlmIChjKSB7XG4gICAgICAgIGNvbGxpc2lvbiA9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2xsaXNpb247XG4gIH1cblxuICBjaGVja0dyaWRDb2xsaXNpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9OZWdhdGl2ZVBvc2l0aW9uID0gaXRlbS55ID4gLTEgJiYgaXRlbS54ID4gLTE7XG4gICAgY29uc3QgbWF4R3JpZENvbHMgPSBpdGVtLmNvbHMgKyBpdGVtLnggPD0gdGhpcy4kb3B0aW9ucy5tYXhDb2xzO1xuICAgIGNvbnN0IG1heEdyaWRSb3dzID0gaXRlbS5yb3dzICsgaXRlbS55IDw9IHRoaXMuJG9wdGlvbnMubWF4Um93cztcbiAgICBjb25zdCBtYXhJdGVtQ29scyA9XG4gICAgICBpdGVtLm1heEl0ZW1Db2xzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1Db2xzXG4gICAgICAgIDogaXRlbS5tYXhJdGVtQ29scztcbiAgICBjb25zdCBtaW5JdGVtQ29scyA9XG4gICAgICBpdGVtLm1pbkl0ZW1Db2xzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLiRvcHRpb25zLm1pbkl0ZW1Db2xzXG4gICAgICAgIDogaXRlbS5taW5JdGVtQ29scztcbiAgICBjb25zdCBtYXhJdGVtUm93cyA9XG4gICAgICBpdGVtLm1heEl0ZW1Sb3dzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1Sb3dzXG4gICAgICAgIDogaXRlbS5tYXhJdGVtUm93cztcbiAgICBjb25zdCBtaW5JdGVtUm93cyA9XG4gICAgICBpdGVtLm1pbkl0ZW1Sb3dzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLiRvcHRpb25zLm1pbkl0ZW1Sb3dzXG4gICAgICAgIDogaXRlbS5taW5JdGVtUm93cztcbiAgICBjb25zdCBpbkNvbHNMaW1pdHMgPSBpdGVtLmNvbHMgPD0gbWF4SXRlbUNvbHMgJiYgaXRlbS5jb2xzID49IG1pbkl0ZW1Db2xzO1xuICAgIGNvbnN0IGluUm93c0xpbWl0cyA9IGl0ZW0ucm93cyA8PSBtYXhJdGVtUm93cyAmJiBpdGVtLnJvd3MgPj0gbWluSXRlbVJvd3M7XG4gICAgY29uc3QgbWluQXJlYUxpbWl0ID1cbiAgICAgIGl0ZW0ubWluSXRlbUFyZWEgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuJG9wdGlvbnMubWluSXRlbUFyZWFcbiAgICAgICAgOiBpdGVtLm1pbkl0ZW1BcmVhO1xuICAgIGNvbnN0IG1heEFyZWFMaW1pdCA9XG4gICAgICBpdGVtLm1heEl0ZW1BcmVhID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1BcmVhXG4gICAgICAgIDogaXRlbS5tYXhJdGVtQXJlYTtcbiAgICBjb25zdCBhcmVhID0gaXRlbS5jb2xzICogaXRlbS5yb3dzO1xuICAgIGNvbnN0IGluTWluQXJlYSA9IG1pbkFyZWFMaW1pdCA8PSBhcmVhO1xuICAgIGNvbnN0IGluTWF4QXJlYSA9IG1heEFyZWFMaW1pdCA+PSBhcmVhO1xuICAgIHJldHVybiAhKFxuICAgICAgbm9OZWdhdGl2ZVBvc2l0aW9uICYmXG4gICAgICBtYXhHcmlkQ29scyAmJlxuICAgICAgbWF4R3JpZFJvd3MgJiZcbiAgICAgIGluQ29sc0xpbWl0cyAmJlxuICAgICAgaW5Sb3dzTGltaXRzICYmXG4gICAgICBpbk1pbkFyZWEgJiZcbiAgICAgIGluTWF4QXJlYVxuICAgICk7XG4gIH1cblxuICBmaW5kSXRlbVdpdGhJdGVtKFxuICAgIGl0ZW06IEdyaWRzdGVySXRlbVxuICApOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfCBib29sZWFuIHtcbiAgICBsZXQgd2lkZ2V0c0luZGV4ID0gMDtcbiAgICBsZXQgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA8IHRoaXMuZ3JpZC5sZW5ndGg7IHdpZGdldHNJbmRleCsrKSB7XG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcbiAgICAgIGlmIChcbiAgICAgICAgd2lkZ2V0LiRpdGVtICE9PSBpdGVtICYmXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb25Ud29JdGVtcyh3aWRnZXQuJGl0ZW0sIGl0ZW0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHdpZGdldDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZmluZEl0ZW1zV2l0aEl0ZW0oaXRlbTogR3JpZHN0ZXJJdGVtKTogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiB7XG4gICAgY29uc3QgYTogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiA9IFtdO1xuICAgIGxldCB3aWRnZXRzSW5kZXggPSAwO1xuICAgIGxldCB3aWRnZXQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4IDwgdGhpcy5ncmlkLmxlbmd0aDsgd2lkZ2V0c0luZGV4KyspIHtcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xuICAgICAgaWYgKFxuICAgICAgICB3aWRnZXQuJGl0ZW0gIT09IGl0ZW0gJiZcbiAgICAgICAgdGhpcy5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKHdpZGdldC4kaXRlbSwgaXRlbSlcbiAgICAgICkge1xuICAgICAgICBhLnB1c2god2lkZ2V0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cblxuICBhdXRvUG9zaXRpb25JdGVtKGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uKGl0ZW1Db21wb25lbnQuJGl0ZW0pKSB7XG4gICAgICBpdGVtQ29tcG9uZW50Lm5vdFBsYWNlZCA9IGZhbHNlO1xuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLnggPSBpdGVtQ29tcG9uZW50LiRpdGVtLng7XG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0ueSA9IGl0ZW1Db21wb25lbnQuJGl0ZW0ueTtcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbUNoYW5nZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSB0cnVlO1xuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVXYXJuaW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJDYW4ndCBiZSBwbGFjZWQgaW4gdGhlIGJvdW5kcyBvZiB0aGUgZGFzaGJvYXJkIS9uXCIgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGl0ZW1Db21wb25lbnQuaXRlbSwgWydjb2xzJywgJ3Jvd3MnLCAneCcsICd5J10pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24gPSAoXG4gICAgbmV3SXRlbTogR3JpZHN0ZXJJdGVtLFxuICAgIHN0YXJ0aW5nRnJvbTogeyB5PzogbnVtYmVyOyB4PzogbnVtYmVyIH0gPSB7fVxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAobmV3SXRlbS5jb2xzID09PSAtMSkge1xuICAgICAgbmV3SXRlbS5jb2xzID0gdGhpcy4kb3B0aW9ucy5kZWZhdWx0SXRlbUNvbHM7XG4gICAgfVxuICAgIGlmIChuZXdJdGVtLnJvd3MgPT09IC0xKSB7XG4gICAgICBuZXdJdGVtLnJvd3MgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtUm93cztcbiAgICB9XG4gICAgdGhpcy5zZXRHcmlkRGltZW5zaW9ucygpO1xuICAgIGxldCByb3dzSW5kZXggPSBzdGFydGluZ0Zyb20ueSB8fCAwO1xuICAgIGxldCBjb2xzSW5kZXg7XG4gICAgZm9yICg7IHJvd3NJbmRleCA8IHRoaXMucm93czsgcm93c0luZGV4KyspIHtcbiAgICAgIG5ld0l0ZW0ueSA9IHJvd3NJbmRleDtcbiAgICAgIGNvbHNJbmRleCA9IHN0YXJ0aW5nRnJvbS54IHx8IDA7XG4gICAgICBmb3IgKDsgY29sc0luZGV4IDwgdGhpcy5jb2x1bW5zOyBjb2xzSW5kZXgrKykge1xuICAgICAgICBuZXdJdGVtLnggPSBjb2xzSW5kZXg7XG4gICAgICAgIGlmICghdGhpcy5jaGVja0NvbGxpc2lvbihuZXdJdGVtKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNhbkFkZFRvUm93cyA9IHRoaXMuJG9wdGlvbnMubWF4Um93cyA+PSB0aGlzLnJvd3MgKyBuZXdJdGVtLnJvd3M7XG4gICAgY29uc3QgY2FuQWRkVG9Db2x1bW5zID1cbiAgICAgIHRoaXMuJG9wdGlvbnMubWF4Q29scyA+PSB0aGlzLmNvbHVtbnMgKyBuZXdJdGVtLmNvbHM7XG4gICAgY29uc3QgYWRkVG9Sb3dzID0gdGhpcy5yb3dzIDw9IHRoaXMuY29sdW1ucyAmJiBjYW5BZGRUb1Jvd3M7XG4gICAgaWYgKCFhZGRUb1Jvd3MgJiYgY2FuQWRkVG9Db2x1bW5zKSB7XG4gICAgICBuZXdJdGVtLnggPSB0aGlzLmNvbHVtbnM7XG4gICAgICBuZXdJdGVtLnkgPSAwO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChjYW5BZGRUb1Jvd3MpIHtcbiAgICAgIG5ld0l0ZW0ueSA9IHRoaXMucm93cztcbiAgICAgIG5ld0l0ZW0ueCA9IDA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGdldEZpcnN0UG9zc2libGVQb3NpdGlvbiA9IChpdGVtOiBHcmlkc3Rlckl0ZW0pOiBHcmlkc3Rlckl0ZW0gPT4ge1xuICAgIGNvbnN0IHRtcEl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcbiAgICB0aGlzLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uKHRtcEl0ZW0pO1xuICAgIHJldHVybiB0bXBJdGVtO1xuICB9O1xuXG4gIGdldExhc3RQb3NzaWJsZVBvc2l0aW9uID0gKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbSA9PiB7XG4gICAgbGV0IGZhcnRoZXN0SXRlbTogeyB5OiBudW1iZXI7IHg6IG51bWJlciB9ID0geyB5OiAwLCB4OiAwIH07XG4gICAgZmFydGhlc3RJdGVtID0gdGhpcy5ncmlkLnJlZHVjZShcbiAgICAgIChcbiAgICAgICAgcHJldjogeyB5OiBudW1iZXI7IHg6IG51bWJlciB9LFxuICAgICAgICBjdXJyOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2VcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyQ29vcmRzID0ge1xuICAgICAgICAgIHk6IGN1cnIuJGl0ZW0ueSArIGN1cnIuJGl0ZW0ucm93cyAtIDEsXG4gICAgICAgICAgeDogY3Vyci4kaXRlbS54ICsgY3Vyci4kaXRlbS5jb2xzIC0gMVxuICAgICAgICB9O1xuICAgICAgICBpZiAoR3JpZHN0ZXJVdGlscy5jb21wYXJlSXRlbXMocHJldiwgY3VyckNvb3JkcykgPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gY3VyckNvb3JkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZhcnRoZXN0SXRlbVxuICAgICk7XG5cbiAgICBjb25zdCB0bXBJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgdGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbih0bXBJdGVtLCBmYXJ0aGVzdEl0ZW0pO1xuICAgIHJldHVybiB0bXBJdGVtO1xuICB9O1xuXG4gIHBpeGVsc1RvUG9zaXRpb25YKFxuICAgIHg6IG51bWJlcixcbiAgICByb3VuZGluZ01ldGhvZDogKHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIG5vTGltaXQ/OiBib29sZWFuXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgcG9zaXRpb24gPSByb3VuZGluZ01ldGhvZCh4IC8gdGhpcy5jdXJDb2xXaWR0aCk7XG4gICAgaWYgKG5vTGltaXQpIHtcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHBvc2l0aW9uLCAwKTtcbiAgICB9XG4gIH1cblxuICBwaXhlbHNUb1Bvc2l0aW9uWShcbiAgICB5OiBudW1iZXIsXG4gICAgcm91bmRpbmdNZXRob2Q6ICh4OiBudW1iZXIpID0+IG51bWJlcixcbiAgICBub0xpbWl0PzogYm9vbGVhblxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gcm91bmRpbmdNZXRob2QoeSAvIHRoaXMuY3VyUm93SGVpZ2h0KTtcbiAgICBpZiAobm9MaW1pdCkge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgocG9zaXRpb24sIDApO1xuICAgIH1cbiAgfVxuXG4gIHBvc2l0aW9uWFRvUGl4ZWxzKHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmN1ckNvbFdpZHRoO1xuICB9XG5cbiAgcG9zaXRpb25ZVG9QaXhlbHMoeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4geSAqIHRoaXMuY3VyUm93SGVpZ2h0O1xuICB9XG5cbiAgZ2V0SXRlbUNvbXBvbmVudChcbiAgICBpdGVtOiBHcmlkc3Rlckl0ZW1cbiAgKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkLmZpbmQoYyA9PiBjLml0ZW0gPT09IGl0ZW0pO1xuICB9XG5cbiAgLy8gLS0tLS0tIEZ1bmN0aW9ucyBmb3Igc3dhcFdoaWxlRHJhZ2dpbmcgb3B0aW9uXG5cbiAgLy8gaWRlbnRpY2FsIHRvIGNoZWNrQ29sbGlzaW9uKCkgZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBjYWxscyBmaW5kSXRlbVdpdGhJdGVtRm9yU3dhcGluZygpIGluc3RlYWQgb2YgZmluZEl0ZW1XaXRoSXRlbSgpXG4gIGNoZWNrQ29sbGlzaW9uRm9yU3dhcGluZyhcbiAgICBpdGVtOiBHcmlkc3Rlckl0ZW1cbiAgKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XG4gICAgbGV0IGNvbGxpc2lvbjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2spIHtcbiAgICAgIGNvbGxpc2lvbiA9ICF0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2soaXRlbSk7XG4gICAgfVxuICAgIGlmICghY29sbGlzaW9uICYmIHRoaXMuY2hlY2tHcmlkQ29sbGlzaW9uKGl0ZW0pKSB7XG4gICAgICBjb2xsaXNpb24gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNvbGxpc2lvbikge1xuICAgICAgY29uc3QgYyA9IHRoaXMuZmluZEl0ZW1XaXRoSXRlbUZvclN3YXBwaW5nKGl0ZW0pO1xuICAgICAgaWYgKGMpIHtcbiAgICAgICAgY29sbGlzaW9uID0gYztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbGxpc2lvbjtcbiAgfVxuXG4gIC8vIGlkZW50aWNhbCB0byBmaW5kSXRlbVdpdGhJdGVtKCkgZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBjYWxscyBjaGVja0NvbGxpc2lvblR3b0l0ZW1zRm9yU3dhcGluZygpIGluc3RlYWQgb2YgY2hlY2tDb2xsaXNpb25Ud29JdGVtcygpXG4gIGZpbmRJdGVtV2l0aEl0ZW1Gb3JTd2FwcGluZyhcbiAgICBpdGVtOiBHcmlkc3Rlckl0ZW1cbiAgKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDE7XG4gICAgbGV0IHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPiAtMTsgd2lkZ2V0c0luZGV4LS0pIHtcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xuICAgICAgaWYgKFxuICAgICAgICB3aWRnZXQuJGl0ZW0gIT09IGl0ZW0gJiZcbiAgICAgICAgR3JpZHN0ZXJDb21wb25lbnQuY2hlY2tDb2xsaXNpb25Ud29JdGVtc0ZvclN3YXBpbmcod2lkZ2V0LiRpdGVtLCBpdGVtKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB3aWRnZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByZXZpZXdTdHlsZShkcmFnID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3ZpbmdJdGVtKSB7XG4gICAgICBpZiAodGhpcy5jb21wYWN0ICYmIGRyYWcpIHtcbiAgICAgICAgdGhpcy5jb21wYWN0LmNoZWNrQ29tcGFjdEl0ZW0odGhpcy5tb3ZpbmdJdGVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJldmlld1N0eWxlJC5uZXh0KHRoaXMubW92aW5nSXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJldmlld1N0eWxlJC5uZXh0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tLSBFbmQgb2YgZnVuY3Rpb25zIGZvciBzd2FwV2hpbGVEcmFnZ2luZyBvcHRpb25cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICBwcml2YXRlIHN0YXRpYyBnZXROZXdBcnJheUxlbmd0aChcbiAgICBsZW5ndGg6IG51bWJlcixcbiAgICBvdmVyYWxsU2l6ZTogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IG5ld0xlbmd0aCA9IE1hdGgubWF4KGxlbmd0aCwgTWF0aC5mbG9vcihvdmVyYWxsU2l6ZSAvIHNpemUpKTtcblxuICAgIGlmIChuZXdMZW5ndGggPCAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG5ld0xlbmd0aCkpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKG5ld0xlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJncmlkc3Rlci1jb2x1bW5cIlxuICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGdyaWRDb2x1bW5zOyBsZXQgaSA9IGluZGV4O1wiXG4gIFtuZ1N0eWxlXT1cImdyaWRSZW5kZXJlci5nZXRHcmlkQ29sdW1uU3R5bGUoaSlcIlxuPjwvZGl2PlxuPGRpdlxuICBjbGFzcz1cImdyaWRzdGVyLXJvd1wiXG4gICpuZ0Zvcj1cImxldCByb3cgb2YgZ3JpZFJvd3M7IGxldCBpID0gaW5kZXg7XCJcbiAgW25nU3R5bGVdPVwiZ3JpZFJlbmRlcmVyLmdldEdyaWRSb3dTdHlsZShpKVwiXG4+PC9kaXY+XG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48Z3JpZHN0ZXItcHJldmlld1xuICBbZ3JpZFJlbmRlcmVyXT1cImdyaWRSZW5kZXJlclwiXG4gIFtwcmV2aWV3U3R5bGUkXT1cInByZXZpZXdTdHlsZSRcIlxuICBjbGFzcz1cImdyaWRzdGVyLXByZXZpZXdcIlxuPjwvZ3JpZHN0ZXItcHJldmlldz5cbiJdfQ==
|