@schneideress/dashboardframework 0.0.76 → 0.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +24 -24
  2. package/bundles/schneideress-dashboardframework.umd.js +7013 -7030
  3. package/bundles/schneideress-dashboardframework.umd.js.map +1 -1
  4. package/bundles/schneideress-dashboardframework.umd.min.js +2 -2
  5. package/bundles/schneideress-dashboardframework.umd.min.js.map +1 -1
  6. package/esm2015/gridster/index.js +18 -19
  7. package/esm2015/gridster/lib/gridster.component.js +700 -701
  8. package/esm2015/gridster/lib/gridster.interface.js +84 -85
  9. package/esm2015/gridster/lib/gridster.module.js +27 -28
  10. package/esm2015/gridster/lib/gridsterCompact.service.js +223 -224
  11. package/esm2015/gridster/lib/gridsterConfig.constant.js +179 -180
  12. package/esm2015/gridster/lib/gridsterConfig.interface.js +219 -220
  13. package/esm2015/gridster/lib/gridsterConfigS.interface.js +161 -162
  14. package/esm2015/gridster/lib/gridsterDraggable.service.js +510 -511
  15. package/esm2015/gridster/lib/gridsterEmptyCell.service.js +317 -318
  16. package/esm2015/gridster/lib/gridsterItem.component.js +213 -214
  17. package/esm2015/gridster/lib/gridsterItem.interface.js +46 -47
  18. package/esm2015/gridster/lib/gridsterItemComponent.interface.js +48 -49
  19. package/esm2015/gridster/lib/gridsterPreview.component.js +66 -67
  20. package/esm2015/gridster/lib/gridsterPush.service.js +467 -468
  21. package/esm2015/gridster/lib/gridsterPushResize.service.js +358 -359
  22. package/esm2015/gridster/lib/gridsterRenderer.service.js +277 -278
  23. package/esm2015/gridster/lib/gridsterResizable.service.js +552 -553
  24. package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +19 -20
  25. package/esm2015/gridster/lib/gridsterScroll.service.js +195 -196
  26. package/esm2015/gridster/lib/gridsterSwap.service.js +134 -135
  27. package/esm2015/gridster/lib/gridsterUtils.service.js +137 -138
  28. package/esm2015/lib/custom.notifier.options.js +46 -47
  29. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +496 -497
  30. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +471 -462
  31. package/esm2015/lib/ra.base.dashboard.filter.js +75 -76
  32. package/esm2015/lib/ra.base.dashboard.template.js +71 -72
  33. package/esm2015/lib/ra.dashbard.event.bus.js +85 -86
  34. package/esm2015/lib/ra.dashboard.module.js +51 -50
  35. package/esm2015/lib/ra.dashboard.service.js +144 -145
  36. package/esm2015/lib/ra.event.enum.js +51 -52
  37. package/esm2015/lib/ra.gridster.config.js +67 -68
  38. package/esm2015/public-api.js +16 -17
  39. package/esm2015/schneideress-dashboardframework.js +14 -15
  40. package/esm5/gridster/index.js +18 -19
  41. package/esm5/gridster/lib/gridster.component.js +803 -804
  42. package/esm5/gridster/lib/gridster.interface.js +94 -95
  43. package/esm5/gridster/lib/gridster.module.js +31 -32
  44. package/esm5/gridster/lib/gridsterCompact.service.js +253 -254
  45. package/esm5/gridster/lib/gridsterConfig.constant.js +179 -180
  46. package/esm5/gridster/lib/gridsterConfig.interface.js +219 -220
  47. package/esm5/gridster/lib/gridsterConfigS.interface.js +161 -162
  48. package/esm5/gridster/lib/gridsterDraggable.service.js +549 -550
  49. package/esm5/gridster/lib/gridsterEmptyCell.service.js +358 -359
  50. package/esm5/gridster/lib/gridsterItem.component.js +238 -239
  51. package/esm5/gridster/lib/gridsterItem.interface.js +46 -47
  52. package/esm5/gridster/lib/gridsterItemComponent.interface.js +58 -59
  53. package/esm5/gridster/lib/gridsterPreview.component.js +70 -71
  54. package/esm5/gridster/lib/gridsterPush.service.js +547 -548
  55. package/esm5/gridster/lib/gridsterPushResize.service.js +423 -424
  56. package/esm5/gridster/lib/gridsterRenderer.service.js +323 -324
  57. package/esm5/gridster/lib/gridsterResizable.service.js +629 -630
  58. package/esm5/gridster/lib/gridsterResizeEventType.interface.js +19 -20
  59. package/esm5/gridster/lib/gridsterScroll.service.js +195 -196
  60. package/esm5/gridster/lib/gridsterSwap.service.js +152 -153
  61. package/esm5/gridster/lib/gridsterUtils.service.js +177 -178
  62. package/esm5/lib/custom.notifier.options.js +46 -47
  63. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +588 -589
  64. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +584 -575
  65. package/esm5/lib/ra.base.dashboard.filter.js +81 -82
  66. package/esm5/lib/ra.base.dashboard.template.js +74 -75
  67. package/esm5/lib/ra.dashbard.event.bus.js +125 -126
  68. package/esm5/lib/ra.dashboard.module.js +55 -54
  69. package/esm5/lib/ra.dashboard.service.js +221 -222
  70. package/esm5/lib/ra.event.enum.js +51 -52
  71. package/esm5/lib/ra.gridster.config.js +67 -68
  72. package/esm5/public-api.js +16 -17
  73. package/esm5/schneideress-dashboardframework.js +14 -15
  74. package/fesm2015/schneideress-dashboardframework.js +6118 -6136
  75. package/fesm2015/schneideress-dashboardframework.js.map +1 -1
  76. package/fesm5/schneideress-dashboardframework.js +7015 -7033
  77. package/fesm5/schneideress-dashboardframework.js.map +1 -1
  78. package/gridster/index.d.ts +11 -11
  79. package/gridster/lib/gridster.component.d.ts +67 -67
  80. package/gridster/lib/gridster.interface.d.ts +46 -46
  81. package/gridster/lib/gridster.module.d.ts +2 -2
  82. package/gridster/lib/gridsterCompact.service.d.ts +15 -15
  83. package/gridster/lib/gridsterConfig.constant.d.ts +2 -2
  84. package/gridster/lib/gridsterConfig.interface.d.ts +133 -133
  85. package/gridster/lib/gridsterConfigS.interface.d.ts +93 -93
  86. package/gridster/lib/gridsterDraggable.service.d.ts +59 -59
  87. package/gridster/lib/gridsterEmptyCell.service.d.ts +29 -29
  88. package/gridster/lib/gridsterItem.component.d.ts +32 -32
  89. package/gridster/lib/gridsterItem.interface.d.ts +21 -21
  90. package/gridster/lib/gridsterItemComponent.interface.d.ts +25 -25
  91. package/gridster/lib/gridsterPreview.component.d.ts +10 -10
  92. package/gridster/lib/gridsterPush.service.d.ts +33 -33
  93. package/gridster/lib/gridsterPushResize.service.d.ts +26 -26
  94. package/gridster/lib/gridsterRenderer.service.d.ts +38 -38
  95. package/gridster/lib/gridsterResizable.service.d.ts +67 -67
  96. package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -6
  97. package/gridster/lib/gridsterScroll.service.d.ts +4 -4
  98. package/gridster/lib/gridsterSwap.service.d.ts +13 -13
  99. package/gridster/lib/gridsterUtils.service.d.ts +16 -16
  100. package/lib/custom.notifier.options.d.ts +2 -2
  101. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +64 -64
  102. package/lib/ra-widget-container/ra.widget.container.component.d.ts +64 -63
  103. package/lib/ra.base.dashboard.filter.d.ts +10 -10
  104. package/lib/ra.base.dashboard.template.d.ts +15 -15
  105. package/lib/ra.dashbard.event.bus.d.ts +20 -20
  106. package/lib/ra.dashboard.module.d.ts +2 -2
  107. package/lib/ra.dashboard.service.d.ts +22 -22
  108. package/lib/ra.event.enum.d.ts +42 -42
  109. package/lib/ra.gridster.config.d.ts +2 -2
  110. package/package.json +1 -1
  111. package/public-api.d.ts +8 -8
  112. package/schneideress-dashboardframework.d.ts +9 -9
  113. package/schneideress-dashboardframework.metadata.json +1 -1
@@ -1,701 +1,700 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: gridster/lib/gridster.component.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import { ChangeDetectorRef, Component, ElementRef, Input, NgZone, Renderer2, ViewEncapsulation } from '@angular/core';
7
- import { GridsterConfigService } from './gridsterConfig.constant';
8
- import { GridsterUtils } from './gridsterUtils.service';
9
- import { GridsterEmptyCell } from './gridsterEmptyCell.service';
10
- import { GridsterCompact } from './gridsterCompact.service';
11
- import { GridsterRenderer } from './gridsterRenderer.service';
12
- export class GridsterComponent {
13
- /**
14
- * @param {?} el
15
- * @param {?} renderer
16
- * @param {?} cdRef
17
- * @param {?} zone
18
- */
19
- constructor(el, renderer, cdRef, zone) {
20
- this.renderer = renderer;
21
- this.cdRef = cdRef;
22
- this.zone = zone;
23
- this.gridColumns = [];
24
- this.gridRows = [];
25
- this.el = el.nativeElement;
26
- this.$options = JSON.parse(JSON.stringify(GridsterConfigService));
27
- this.calculateLayoutDebounce = GridsterUtils.debounce(this.calculateLayout.bind(this), 0);
28
- this.mobile = false;
29
- this.curWidth = 0;
30
- this.curHeight = 0;
31
- this.grid = [];
32
- this.curColWidth = 0;
33
- this.curRowHeight = 0;
34
- this.dragInProgress = false;
35
- this.emptyCell = new GridsterEmptyCell(this);
36
- this.compact = new GridsterCompact(this);
37
- this.gridRenderer = new GridsterRenderer(this);
38
- }
39
- /**
40
- * @param {?} item
41
- * @param {?} item2
42
- * @return {?}
43
- */
44
- static checkCollisionTwoItems(item, item2) {
45
- return item.x < item2.x + item2.cols
46
- && item.x + item.cols > item2.x
47
- && item.y < item2.y + item2.rows
48
- && item.y + item.rows > item2.y;
49
- }
50
- /**
51
- * @return {?}
52
- */
53
- ngOnInit() {
54
- if (this.options.initCallback) {
55
- this.options.initCallback(this);
56
- }
57
- }
58
- /**
59
- * @param {?} changes
60
- * @return {?}
61
- */
62
- ngOnChanges(changes) {
63
- if (changes.options) {
64
- this.setOptions();
65
- this.options.api = {
66
- optionsChanged: this.optionsChanged.bind(this),
67
- resize: this.onResize.bind(this),
68
- getNextPossiblePosition: this.getNextPossiblePosition.bind(this),
69
- getFirstPossiblePosition: this.getFirstPossiblePosition.bind(this),
70
- getLastPossiblePosition: this.getLastPossiblePosition.bind(this),
71
- getCurrentRowHeight: this.getCurrentRowHeight.bind(this)
72
- };
73
- this.columns = this.$options.minCols;
74
- this.rows = this.$options.minRows;
75
- this.setGridSize();
76
- this.calculateLayout();
77
- }
78
- }
79
- /**
80
- * @return {?}
81
- */
82
- getCurrentRowHeight() {
83
- return this.curRowHeight;
84
- }
85
- /**
86
- * @return {?}
87
- */
88
- resize() {
89
- /** @type {?} */
90
- let height;
91
- /** @type {?} */
92
- let width;
93
- if (this.$options.gridType === 'fit' && !this.mobile) {
94
- width = this.el.offsetWidth;
95
- height = this.el.offsetHeight;
96
- }
97
- else {
98
- width = this.el.clientWidth;
99
- height = this.el.clientHeight;
100
- }
101
- if ((width !== this.curWidth || height !== this.curHeight) && this.checkIfToResize()) {
102
- this.onResize();
103
- }
104
- }
105
- /**
106
- * @return {?}
107
- */
108
- setOptions() {
109
- this.$options = GridsterUtils.merge(this.$options, this.options, this.$options);
110
- if (!this.$options.disableWindowResize && !this.windowResize) {
111
- this.windowResize = this.renderer.listen('window', 'resize', this.onResize.bind(this));
112
- }
113
- else if (this.$options.disableWindowResize && this.windowResize) {
114
- this.windowResize();
115
- this.windowResize = null;
116
- }
117
- this.emptyCell.updateOptions();
118
- }
119
- /**
120
- * @return {?}
121
- */
122
- optionsChanged() {
123
- this.setOptions();
124
- /** @type {?} */
125
- let widgetsIndex = this.grid.length - 1;
126
- /** @type {?} */
127
- let widget;
128
- for (; widgetsIndex >= 0; widgetsIndex--) {
129
- widget = this.grid[widgetsIndex];
130
- widget.updateOptions();
131
- }
132
- this.calculateLayout();
133
- }
134
- /**
135
- * @return {?}
136
- */
137
- ngOnDestroy() {
138
- if (this.windowResize) {
139
- this.windowResize();
140
- }
141
- if (this.options.destroyCallback) {
142
- this.options.destroyCallback(this);
143
- }
144
- //if (this.options.api) {
145
- /* this.options.api getting undefined for new dashboard load- temp fix
146
- * on new dashboard area load, old dashboard area gets destroyed, but that leads to
147
- * ondestroy of current this.options.api instance - needs to investigate further
148
- */
149
- if (false) {
150
- this.options.api.resize = undefined;
151
- this.options.api.optionsChanged = undefined;
152
- this.options.api.getNextPossiblePosition = undefined;
153
- this.options.api = undefined;
154
- }
155
- this.emptyCell.destroy();
156
- delete this.emptyCell;
157
- this.compact.destroy();
158
- delete this.compact;
159
- }
160
- /**
161
- * @return {?}
162
- */
163
- onResize() {
164
- this.setGridSize();
165
- this.calculateLayout();
166
- }
167
- /**
168
- * @return {?}
169
- */
170
- checkIfToResize() {
171
- /** @type {?} */
172
- const clientWidth = this.el.clientWidth;
173
- /** @type {?} */
174
- const offsetWidth = this.el.offsetWidth;
175
- /** @type {?} */
176
- const scrollWidth = this.el.scrollWidth;
177
- /** @type {?} */
178
- const clientHeight = this.el.clientHeight;
179
- /** @type {?} */
180
- const offsetHeight = this.el.offsetHeight;
181
- /** @type {?} */
182
- const scrollHeight = this.el.scrollHeight;
183
- /** @type {?} */
184
- const verticalScrollPresent = clientWidth < offsetWidth && scrollHeight > offsetHeight
185
- && scrollHeight - offsetHeight < offsetWidth - clientWidth;
186
- /** @type {?} */
187
- const horizontalScrollPresent = clientHeight < offsetHeight
188
- && scrollWidth > offsetWidth && scrollWidth - offsetWidth < offsetHeight - clientHeight;
189
- if (verticalScrollPresent) {
190
- return false;
191
- }
192
- return !horizontalScrollPresent;
193
- }
194
- /**
195
- * @return {?}
196
- */
197
- setGridSize() {
198
- /** @type {?} */
199
- const el = this.el;
200
- /** @type {?} */
201
- let width = el.clientWidth;
202
- /** @type {?} */
203
- let height = el.clientHeight;
204
- if (this.$options.setGridSize || this.$options.gridType === 'fit' && !this.mobile) {
205
- width = el.offsetWidth;
206
- height = el.offsetHeight;
207
- }
208
- else {
209
- width = el.clientWidth;
210
- height = el.clientHeight;
211
- }
212
- this.curWidth = width;
213
- this.curHeight = height;
214
- }
215
- /**
216
- * @return {?}
217
- */
218
- setGridDimensions() {
219
- this.setGridSize();
220
- if (!this.mobile && this.$options.mobileBreakpoint > this.curWidth) {
221
- this.mobile = !this.mobile;
222
- this.renderer.addClass(this.el, 'mobile');
223
- }
224
- else if (this.mobile && this.$options.mobileBreakpoint < this.curWidth) {
225
- this.mobile = !this.mobile;
226
- this.renderer.removeClass(this.el, 'mobile');
227
- }
228
- /** @type {?} */
229
- let rows = this.$options.minRows;
230
- /** @type {?} */
231
- let columns = this.$options.minCols;
232
- /** @type {?} */
233
- let widgetsIndex = this.grid.length - 1;
234
- /** @type {?} */
235
- let widget;
236
- for (; widgetsIndex >= 0; widgetsIndex--) {
237
- widget = this.grid[widgetsIndex];
238
- if (!widget.notPlaced) {
239
- rows = Math.max(rows, widget.$item.y + widget.$item.rows);
240
- columns = Math.max(columns, widget.$item.x + widget.$item.cols);
241
- }
242
- }
243
- if (this.columns !== columns || this.rows !== rows) {
244
- this.columns = columns;
245
- this.rows = rows;
246
- if (this.options.gridSizeChangedCallback) {
247
- this.options.gridSizeChangedCallback(this);
248
- }
249
- }
250
- }
251
- /**
252
- * @return {?}
253
- */
254
- calculateLayout() {
255
- if (this.compact) {
256
- this.compact.checkCompact();
257
- }
258
- this.setGridDimensions();
259
- if (this.$options.outerMargin) {
260
- /** @type {?} */
261
- let marginWidth = -this.$options.margin;
262
- if (this.$options.outerMarginLeft !== null) {
263
- marginWidth += this.$options.outerMarginLeft;
264
- this.renderer.setStyle(this.el, 'padding-left', this.$options.outerMarginLeft + 'px');
265
- }
266
- else {
267
- marginWidth += this.$options.margin;
268
- this.renderer.setStyle(this.el, 'padding-left', this.$options.margin + 'px');
269
- }
270
- if (this.$options.outerMarginRight !== null) {
271
- marginWidth += this.$options.outerMarginRight;
272
- this.renderer.setStyle(this.el, 'padding-right', this.$options.outerMarginRight + 'px');
273
- }
274
- else {
275
- marginWidth += this.$options.margin;
276
- this.renderer.setStyle(this.el, 'padding-right', this.$options.margin + 'px');
277
- }
278
- this.curColWidth = (this.curWidth - marginWidth) / this.columns;
279
- /** @type {?} */
280
- let marginHeight = -this.$options.margin;
281
- if (this.$options.outerMarginTop !== null) {
282
- marginHeight += this.$options.outerMarginTop;
283
- this.renderer.setStyle(this.el, 'padding-top', this.$options.outerMarginTop + 'px');
284
- }
285
- else {
286
- marginHeight += this.$options.margin;
287
- this.renderer.setStyle(this.el, 'padding-top', this.$options.margin + 'px');
288
- }
289
- if (this.$options.outerMarginBottom !== null) {
290
- marginHeight += this.$options.outerMarginBottom;
291
- this.renderer.setStyle(this.el, 'padding-bottom', this.$options.outerMarginBottom + 'px');
292
- }
293
- else {
294
- marginHeight += this.$options.margin;
295
- this.renderer.setStyle(this.el, 'padding-bottom', this.$options.margin + 'px');
296
- }
297
- this.curRowHeight = (this.curHeight - marginHeight) / this.rows;
298
- }
299
- else {
300
- this.curColWidth = (this.curWidth + this.$options.margin) / this.columns;
301
- this.curRowHeight = (this.curHeight + this.$options.margin) / this.rows;
302
- this.renderer.setStyle(this.el, 'padding-left', 0 + 'px');
303
- this.renderer.setStyle(this.el, 'padding-right', 0 + 'px');
304
- this.renderer.setStyle(this.el, 'padding-top', 0 + 'px');
305
- this.renderer.setStyle(this.el, 'padding-bottom', 0 + 'px');
306
- }
307
- this.gridRenderer.updateGridster();
308
- this.updateGrid();
309
- if (this.$options.setGridSize) {
310
- this.renderer.setStyle(this.el, 'width', (this.columns * this.curColWidth + this.$options.margin) + 'px');
311
- this.renderer.setStyle(this.el, 'height', (this.rows * this.curRowHeight + this.$options.margin) + 'px');
312
- }
313
- else {
314
- this.renderer.setStyle(this.el, 'width', '');
315
- this.renderer.setStyle(this.el, 'height', '');
316
- }
317
- /** @type {?} */
318
- let widgetsIndex = this.grid.length - 1;
319
- /** @type {?} */
320
- let widget;
321
- for (; widgetsIndex >= 0; widgetsIndex--) {
322
- widget = this.grid[widgetsIndex];
323
- widget.setSize();
324
- widget.drag.toggle();
325
- widget.resize.toggle();
326
- }
327
- setTimeout(this.resize.bind(this), 100);
328
- }
329
- /**
330
- * @return {?}
331
- */
332
- updateGrid() {
333
- if (this.$options.displayGrid === 'always' && !this.mobile) {
334
- this.renderer.addClass(this.el, 'display-grid');
335
- }
336
- else if (this.$options.displayGrid === 'onDrag&Resize' && this.dragInProgress) {
337
- this.renderer.addClass(this.el, 'display-grid');
338
- }
339
- else if (this.$options.displayGrid === 'none' || !this.dragInProgress || this.mobile) {
340
- this.renderer.removeClass(this.el, 'display-grid');
341
- }
342
- this.setGridDimensions();
343
- this.gridColumns.length = Math.max(this.columns, Math.floor(this.curWidth / this.curColWidth)) || 0;
344
- this.gridRows.length = Math.max(this.rows, Math.floor(this.curHeight / this.curRowHeight)) || 0;
345
- this.cdRef.markForCheck();
346
- }
347
- /**
348
- * @param {?} itemComponent
349
- * @return {?}
350
- */
351
- addItem(itemComponent) {
352
- if (itemComponent.$item.cols === undefined) {
353
- itemComponent.$item.cols = this.$options.defaultItemCols;
354
- itemComponent.item.cols = itemComponent.$item.cols;
355
- itemComponent.itemChanged();
356
- }
357
- if (itemComponent.$item.rows === undefined) {
358
- itemComponent.$item.rows = this.$options.defaultItemRows;
359
- itemComponent.item.rows = itemComponent.$item.rows;
360
- itemComponent.itemChanged();
361
- }
362
- if (itemComponent.$item.x === -1 || itemComponent.$item.y === -1) {
363
- this.autoPositionItem(itemComponent);
364
- }
365
- else if (this.checkCollision(itemComponent.$item)) {
366
- if (!this.$options.disableWarnings) {
367
- itemComponent.notPlaced = true;
368
- console.warn('Can\'t be placed in the bounds of the dashboard, trying to auto position!/n' +
369
- JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
370
- }
371
- if (!this.$options.disableAutoPositionOnConflict) {
372
- this.autoPositionItem(itemComponent);
373
- }
374
- else {
375
- itemComponent.notPlaced = true;
376
- }
377
- }
378
- this.grid.push(itemComponent);
379
- this.calculateLayoutDebounce();
380
- }
381
- /**
382
- * @param {?} itemComponent
383
- * @return {?}
384
- */
385
- removeItem(itemComponent) {
386
- this.grid.splice(this.grid.indexOf(itemComponent), 1);
387
- this.calculateLayoutDebounce();
388
- if (this.options.itemRemovedCallback) {
389
- this.options.itemRemovedCallback(itemComponent.item, itemComponent);
390
- }
391
- }
392
- /**
393
- * @param {?} item
394
- * @return {?}
395
- */
396
- checkCollision(item) {
397
- /** @type {?} */
398
- let collision = false;
399
- if (this.options.itemValidateCallback) {
400
- collision = !this.options.itemValidateCallback(item);
401
- }
402
- if (!collision && this.checkGridCollision(item)) {
403
- collision = true;
404
- }
405
- if (!collision) {
406
- /** @type {?} */
407
- const c = this.findItemWithItem(item);
408
- if (c) {
409
- collision = c;
410
- }
411
- }
412
- return collision;
413
- }
414
- /**
415
- * @param {?} item
416
- * @return {?}
417
- */
418
- checkGridCollision(item) {
419
- /** @type {?} */
420
- const noNegativePosition = item.y > -1 && item.x > -1;
421
- /** @type {?} */
422
- const maxGridCols = item.cols + item.x <= this.$options.maxCols;
423
- /** @type {?} */
424
- const maxGridRows = item.rows + item.y <= this.$options.maxRows;
425
- /** @type {?} */
426
- const maxItemCols = item.maxItemCols === undefined ? this.$options.maxItemCols : item.maxItemCols;
427
- /** @type {?} */
428
- const minItemCols = item.minItemCols === undefined ? this.$options.minItemCols : item.minItemCols;
429
- /** @type {?} */
430
- const maxItemRows = item.maxItemRows === undefined ? this.$options.maxItemRows : item.maxItemRows;
431
- /** @type {?} */
432
- const minItemRows = item.minItemRows === undefined ? this.$options.minItemRows : item.minItemRows;
433
- /** @type {?} */
434
- const inColsLimits = item.cols <= maxItemCols && item.cols >= minItemCols;
435
- /** @type {?} */
436
- const inRowsLimits = item.rows <= maxItemRows && item.rows >= minItemRows;
437
- /** @type {?} */
438
- const minAreaLimit = item.minItemArea === undefined ? this.$options.minItemArea : item.minItemArea;
439
- /** @type {?} */
440
- const maxAreaLimit = item.maxItemArea === undefined ? this.$options.maxItemArea : item.maxItemArea;
441
- /** @type {?} */
442
- const area = item.cols * item.rows;
443
- /** @type {?} */
444
- const inMinArea = minAreaLimit <= area;
445
- /** @type {?} */
446
- const inMaxArea = maxAreaLimit >= area;
447
- return !(noNegativePosition && maxGridCols && maxGridRows && inColsLimits && inRowsLimits && inMinArea && inMaxArea);
448
- }
449
- /**
450
- * @param {?} item
451
- * @return {?}
452
- */
453
- findItemWithItem(item) {
454
- /** @type {?} */
455
- let widgetsIndex = this.grid.length - 1;
456
- /** @type {?} */
457
- let widget;
458
- for (; widgetsIndex > -1; widgetsIndex--) {
459
- widget = this.grid[widgetsIndex];
460
- if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
461
- return widget;
462
- }
463
- }
464
- return false;
465
- }
466
- /**
467
- * @param {?} item
468
- * @return {?}
469
- */
470
- findItemsWithItem(item) {
471
- /** @type {?} */
472
- const a = [];
473
- /** @type {?} */
474
- let widgetsIndex = this.grid.length - 1;
475
- /** @type {?} */
476
- let widget;
477
- for (; widgetsIndex > -1; widgetsIndex--) {
478
- widget = this.grid[widgetsIndex];
479
- if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
480
- a.push(widget);
481
- }
482
- }
483
- return a;
484
- }
485
- /**
486
- * @param {?} itemComponent
487
- * @return {?}
488
- */
489
- autoPositionItem(itemComponent) {
490
- if (this.getNextPossiblePosition(itemComponent.$item)) {
491
- itemComponent.notPlaced = false;
492
- itemComponent.item.x = itemComponent.$item.x;
493
- itemComponent.item.y = itemComponent.$item.y;
494
- itemComponent.itemChanged();
495
- }
496
- else {
497
- itemComponent.notPlaced = true;
498
- if (!this.$options.disableWarnings) {
499
- console.warn('Can\'t be placed in the bounds of the dashboard!/n' +
500
- JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
501
- }
502
- }
503
- }
504
- /**
505
- * @param {?} newItem
506
- * @param {?=} startingFrom
507
- * @return {?}
508
- */
509
- getNextPossiblePosition(newItem, startingFrom = {}) {
510
- if (newItem.cols === -1) {
511
- newItem.cols = this.$options.defaultItemCols;
512
- }
513
- if (newItem.rows === -1) {
514
- newItem.rows = this.$options.defaultItemRows;
515
- }
516
- this.setGridDimensions();
517
- /** @type {?} */
518
- let rowsIndex = startingFrom.y || 0;
519
- /** @type {?} */
520
- let colsIndex;
521
- for (; rowsIndex < this.rows; rowsIndex++) {
522
- newItem.y = rowsIndex;
523
- colsIndex = startingFrom.x || 0;
524
- for (; colsIndex < this.columns; colsIndex++) {
525
- newItem.x = colsIndex;
526
- if (!this.checkCollision(newItem)) {
527
- return true;
528
- }
529
- }
530
- }
531
- /** @type {?} */
532
- const canAddToRows = this.$options.maxRows >= this.rows + newItem.rows;
533
- /** @type {?} */
534
- const canAddToColumns = this.$options.maxCols >= this.columns + newItem.cols;
535
- /** @type {?} */
536
- const addToRows = this.rows <= this.columns && canAddToRows;
537
- if (!addToRows && canAddToColumns) {
538
- newItem.x = this.columns;
539
- newItem.y = 0;
540
- return true;
541
- }
542
- else if (canAddToRows) {
543
- newItem.y = this.rows;
544
- newItem.x = 0;
545
- return true;
546
- }
547
- return false;
548
- }
549
- /**
550
- * @param {?} item
551
- * @return {?}
552
- */
553
- getFirstPossiblePosition(item) {
554
- /** @type {?} */
555
- const tmpItem = Object.assign({}, item);
556
- this.getNextPossiblePosition(tmpItem);
557
- return tmpItem;
558
- }
559
- /**
560
- * @param {?} item
561
- * @return {?}
562
- */
563
- getLastPossiblePosition(item) {
564
- /** @type {?} */
565
- let farthestItem = { y: 0, x: 0 };
566
- farthestItem = this.grid.reduce((/**
567
- * @param {?} prev
568
- * @param {?} curr
569
- * @return {?}
570
- */
571
- (prev, curr) => {
572
- /** @type {?} */
573
- const currCoords = { y: curr.$item.y + curr.$item.rows - 1, x: curr.$item.x + curr.$item.cols - 1 };
574
- if (GridsterUtils.compareItems(prev, currCoords) === 1) {
575
- return currCoords;
576
- }
577
- else {
578
- return prev;
579
- }
580
- }), farthestItem);
581
- /** @type {?} */
582
- const tmpItem = Object.assign({}, item);
583
- this.getNextPossiblePosition(tmpItem, farthestItem);
584
- return tmpItem;
585
- }
586
- /**
587
- * @param {?} x
588
- * @param {?} roundingMethod
589
- * @param {?=} noLimit
590
- * @return {?}
591
- */
592
- pixelsToPositionX(x, roundingMethod, noLimit) {
593
- /** @type {?} */
594
- const position = roundingMethod(x / this.curColWidth);
595
- if (noLimit) {
596
- return position;
597
- }
598
- else {
599
- return Math.max(position, 0);
600
- }
601
- }
602
- /**
603
- * @param {?} y
604
- * @param {?} roundingMethod
605
- * @param {?=} noLimit
606
- * @return {?}
607
- */
608
- pixelsToPositionY(y, roundingMethod, noLimit) {
609
- /** @type {?} */
610
- const position = roundingMethod(y / this.curRowHeight);
611
- if (noLimit) {
612
- return position;
613
- }
614
- else {
615
- return Math.max(position, 0);
616
- }
617
- }
618
- /**
619
- * @param {?} x
620
- * @return {?}
621
- */
622
- positionXToPixels(x) {
623
- return x * this.curColWidth;
624
- }
625
- /**
626
- * @param {?} y
627
- * @return {?}
628
- */
629
- positionYToPixels(y) {
630
- return y * this.curRowHeight;
631
- }
632
- }
633
- GridsterComponent.decorators = [
634
- { type: Component, args: [{
635
- selector: 'gridster',
636
- template: "<div class=\"gridster-column\" *ngFor=\"let column of gridColumns; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"></div>\r\n<div class=\"gridster-row\" *ngFor=\"let row of gridRows; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"></div>\r\n<ng-content></ng-content>\r\n<gridster-preview class=\"gridster-preview\"></gridster-preview>\r\n",
637
- encapsulation: ViewEncapsulation.None,
638
- styles: ["gridster{clear:both;position:relative;box-sizing:border-box;background:#fff;width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;overflow:auto}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 .gridster-column,gridster .gridster-row{position:absolute;display:none;-webkit-transition:.3s;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 #ccc;border-right:1px solid #ccc}gridster .gridster-row{border-top:1px solid #ccc;border-bottom:1px solid #ccc}"]
639
- }] }
640
- ];
641
- /** @nocollapse */
642
- GridsterComponent.ctorParameters = () => [
643
- { type: ElementRef },
644
- { type: Renderer2 },
645
- { type: ChangeDetectorRef },
646
- { type: NgZone }
647
- ];
648
- GridsterComponent.propDecorators = {
649
- options: [{ type: Input }]
650
- };
651
- if (false) {
652
- /** @type {?} */
653
- GridsterComponent.prototype.options;
654
- /** @type {?} */
655
- GridsterComponent.prototype.calculateLayoutDebounce;
656
- /** @type {?} */
657
- GridsterComponent.prototype.movingItem;
658
- /** @type {?} */
659
- GridsterComponent.prototype.previewStyle;
660
- /** @type {?} */
661
- GridsterComponent.prototype.el;
662
- /** @type {?} */
663
- GridsterComponent.prototype.$options;
664
- /** @type {?} */
665
- GridsterComponent.prototype.mobile;
666
- /** @type {?} */
667
- GridsterComponent.prototype.curWidth;
668
- /** @type {?} */
669
- GridsterComponent.prototype.curHeight;
670
- /** @type {?} */
671
- GridsterComponent.prototype.grid;
672
- /** @type {?} */
673
- GridsterComponent.prototype.columns;
674
- /** @type {?} */
675
- GridsterComponent.prototype.rows;
676
- /** @type {?} */
677
- GridsterComponent.prototype.curColWidth;
678
- /** @type {?} */
679
- GridsterComponent.prototype.curRowHeight;
680
- /** @type {?} */
681
- GridsterComponent.prototype.gridColumns;
682
- /** @type {?} */
683
- GridsterComponent.prototype.gridRows;
684
- /** @type {?} */
685
- GridsterComponent.prototype.windowResize;
686
- /** @type {?} */
687
- GridsterComponent.prototype.dragInProgress;
688
- /** @type {?} */
689
- GridsterComponent.prototype.emptyCell;
690
- /** @type {?} */
691
- GridsterComponent.prototype.compact;
692
- /** @type {?} */
693
- GridsterComponent.prototype.gridRenderer;
694
- /** @type {?} */
695
- GridsterComponent.prototype.renderer;
696
- /** @type {?} */
697
- GridsterComponent.prototype.cdRef;
698
- /** @type {?} */
699
- GridsterComponent.prototype.zone;
700
- }
701
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNjaG5laWRlcmVzcy9kYXNoYm9hcmRmcmFtZXdvcmsvIiwic291cmNlcyI6WyJncmlkc3Rlci9saWIvZ3JpZHN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBSU4sU0FBUyxFQUVULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSTVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBUzlELE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7SUF1QjVCLFlBQVksRUFBYyxFQUFTLFFBQW1CLEVBQVMsS0FBd0IsRUFBUyxJQUFZO1FBQXpFLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUFTLFNBQUksR0FBSixJQUFJLENBQVE7UUFSNUcsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQVFaLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFD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QUFRLENBQUM7U0FDakI7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDOUI7SUFDSCxDQUFDOzs7OztJQUVELGlCQUFpQixDQUFDLENBQVM7UUFDekIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM5QixDQUFDOzs7OztJQUVELGlCQUFpQixDQUFDLENBQVM7UUFDekIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMvQixDQUFDOzs7WUFqZUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxVQUFVO2dCQUNwQiwrWUFBOEI7Z0JBRTlCLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUN0Qzs7OztZQTNCQyxVQUFVO1lBTVYsU0FBUztZQVJULGlCQUFpQjtZQUlqQixNQUFNOzs7c0JBMkJMLEtBQUs7Ozs7SUFBTixvQ0FBaUM7O0lBQ2pDLG9EQUFvQzs7SUFDcEMsdUNBQWdDOztJQUNoQyx5Q0FBeUI7O0lBQ3pCLCtCQUFROztJQUNSLHFDQUEwQjs7SUFDMUIsbUNBQWdCOztJQUNoQixxQ0FBaUI7O0lBQ2pCLHNDQUFrQjs7SUFDbEIsaUNBQTRDOztJQUM1QyxvQ0FBZ0I7O0lBQ2hCLGlDQUFhOztJQUNiLHdDQUFvQjs7SUFDcEIseUNBQXFCOztJQUNyQix3Q0FBaUI7O0lBQ2pCLHFDQUFjOztJQUNkLHlDQUFrQzs7SUFDbEMsMkNBQXdCOztJQUN4QixzQ0FBNkI7O0lBQzdCLG9DQUF5Qjs7SUFDekIseUNBQStCOztJQUVILHFDQUEwQjs7SUFBRSxrQ0FBK0I7O0lBQUUsaUNBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IEdyaWRzdGVyQ29uZmlnU2VydmljZSB9IGZyb20gJy4vZ3JpZHN0ZXJDb25maWcuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBHcmlkc3RlckNvbmZpZyB9IGZyb20gJy4vZ3JpZHN0ZXJDb25maWcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJVdGlscyB9IGZyb20gJy4vZ3JpZHN0ZXJVdGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJFbXB0eUNlbGwgfSBmcm9tICcuL2dyaWRzdGVyRW1wdHlDZWxsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlckNvbXBhY3QgfSBmcm9tICcuL2dyaWRzdGVyQ29tcGFjdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWdTIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZ1MuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB9IGZyb20gJy4vZ3JpZHN0ZXJJdGVtQ29tcG9uZW50LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVyUmVuZGVyZXIgfSBmcm9tICcuL2dyaWRzdGVyUmVuZGVyZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVySXRlbSB9IGZyb20gJy4vZ3JpZHN0ZXJJdGVtLmludGVyZmFjZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2dyaWRzdGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZHN0ZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZHN0ZXIuY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JpZHN0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSB7XHJcbiAgQElucHV0KCkgb3B0aW9uczogR3JpZHN0ZXJDb25maWc7XHJcbiAgY2FsY3VsYXRlTGF5b3V0RGVib3VuY2U6ICgpID0+IHZvaWQ7XHJcbiAgbW92aW5nSXRlbTogR3JpZHN0ZXJJdGVtIHwgbnVsbDtcclxuICBwcmV2aWV3U3R5bGU6ICgpID0+IHZvaWQ7XHJcbiAgZWw6IGFueTtcclxuICAkb3B0aW9uczogR3JpZHN0ZXJDb25maWdTO1xyXG4gIG1vYmlsZTogYm9vbGVhbjtcclxuICBjdXJXaWR0aDogbnVtYmVyO1xyXG4gIGN1ckhlaWdodDogbnVtYmVyO1xyXG4gIGdyaWQ6IEFycmF5PEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZT47XHJcbiAgY29sdW1uczogbnVtYmVyO1xyXG4gIHJvd3M6IG51bWJlcjtcclxuICBjdXJDb2xXaWR0aDogbnVtYmVyO1xyXG4gIGN1clJvd0hlaWdodDogbnVtYmVyO1xyXG4gIGdyaWRDb2x1bW5zID0gW107XHJcbiAgZ3JpZFJvd3MgPSBbXTtcclxuICB3aW5kb3dSZXNpemU6ICgoKSA9PiB2b2lkKSB8IG51bGw7XHJcbiAgZHJhZ0luUHJvZ3Jlc3M6IGJvb2xlYW47XHJcbiAgZW1wdHlDZWxsOiBHcmlkc3RlckVtcHR5Q2VsbDtcclxuICBjb21wYWN0OiBHcmlkc3RlckNvbXBhY3Q7XHJcbiAgZ3JpZFJlbmRlcmVyOiBHcmlkc3RlclJlbmRlcmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbDogRWxlbWVudFJlZiwgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHB1YmxpYyBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyB6b25lOiBOZ1pvbmUpIHtcclxuICAgIHRoaXMuZWwgPSBlbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy4kb3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoR3JpZHN0ZXJDb25maWdTZXJ2aWNlKSk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dERlYm91bmNlID0gR3JpZHN0ZXJVdGlscy5kZWJvdW5jZSh0aGlzLmNhbGN1bGF0ZUxheW91dC5iaW5kKHRoaXMpLCAwKTtcclxuICAgIHRoaXMubW9iaWxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmN1cldpZHRoID0gMDtcclxuICAgIHRoaXMuY3VySGVpZ2h0ID0gMDtcclxuICAgIHRoaXMuZ3JpZCA9IFtdO1xyXG4gICAgdGhpcy5jdXJDb2xXaWR0aCA9IDA7XHJcbiAgICB0aGlzLmN1clJvd0hlaWdodCA9IDA7XHJcbiAgICB0aGlzLmRyYWdJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICB0aGlzLmVtcHR5Q2VsbCA9IG5ldyBHcmlkc3RlckVtcHR5Q2VsbCh0aGlzKTtcclxuICAgIHRoaXMuY29tcGFjdCA9IG5ldyBHcmlkc3RlckNvbXBhY3QodGhpcyk7XHJcbiAgICB0aGlzLmdyaWRSZW5kZXJlciA9IG5ldyBHcmlkc3RlclJlbmRlcmVyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNoZWNrQ29sbGlzaW9uVHdvSXRlbXMoaXRlbTogR3JpZHN0ZXJJdGVtLCBpdGVtMjogR3JpZHN0ZXJJdGVtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gaXRlbS54IDwgaXRlbTIueCArIGl0ZW0yLmNvbHNcclxuICAgICAgJiYgaXRlbS54ICsgaXRlbS5jb2xzID4gaXRlbTIueFxyXG4gICAgICAmJiBpdGVtLnkgPCBpdGVtMi55ICsgaXRlbTIucm93c1xyXG4gICAgICAmJiBpdGVtLnkgKyBpdGVtLnJvd3MgPiBpdGVtMi55O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmluaXRDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaW5pdENhbGxiYWNrKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucykge1xyXG4gICAgICB0aGlzLnNldE9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwaSA9IHtcclxuICAgICAgICBvcHRpb25zQ2hhbmdlZDogdGhpcy5vcHRpb25zQ2hhbmdlZC5iaW5kKHRoaXMpLFxyXG4gICAgICAgIHJlc2l6ZTogdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGdldE5leHRQb3NzaWJsZVBvc2l0aW9uOiB0aGlzLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgICAgZ2V0Rmlyc3RQb3NzaWJsZVBvc2l0aW9uOiB0aGlzLmdldEZpcnN0UG9zc2libGVQb3NpdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGdldExhc3RQb3NzaWJsZVBvc2l0aW9uOiB0aGlzLmdldExhc3RQb3NzaWJsZVBvc2l0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgICAgZ2V0Q3VycmVudFJvd0hlaWdodDogdGhpcy5nZXRDdXJyZW50Um93SGVpZ2h0LmJpbmQodGhpcylcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuJG9wdGlvbnMubWluQ29scztcclxuICAgICAgdGhpcy5yb3dzID0gdGhpcy4kb3B0aW9ucy5taW5Sb3dzO1xyXG4gICAgICB0aGlzLnNldEdyaWRTaXplKCk7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50Um93SGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJSb3dIZWlnaHQ7XHJcbiAgfVxyXG5cclxuICByZXNpemUoKTogdm9pZCB7XHJcbiAgICBsZXQgaGVpZ2h0O1xyXG4gICAgbGV0IHdpZHRoO1xyXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuZ3JpZFR5cGUgPT09ICdmaXQnICYmICF0aGlzLm1vYmlsZSkge1xyXG4gICAgICB3aWR0aCA9IHRoaXMuZWwub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGhlaWdodCA9IHRoaXMuZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2lkdGggPSB0aGlzLmVsLmNsaWVudFdpZHRoO1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLmVsLmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuICAgIGlmICgod2lkdGggIT09IHRoaXMuY3VyV2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLmN1ckhlaWdodCkgJiYgdGhpcy5jaGVja0lmVG9SZXNpemUoKSkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRPcHRpb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy4kb3B0aW9ucyA9IEdyaWRzdGVyVXRpbHMubWVyZ2UodGhpcy4kb3B0aW9ucywgdGhpcy5vcHRpb25zLCB0aGlzLiRvcHRpb25zKTtcclxuICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlV2luZG93UmVzaXplICYmICF0aGlzLndpbmRvd1Jlc2l6ZSkge1xyXG4gICAgICB0aGlzLndpbmRvd1Jlc2l6ZSA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAncmVzaXplJywgdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy4kb3B0aW9ucy5kaXNhYmxlV2luZG93UmVzaXplICYmIHRoaXMud2luZG93UmVzaXplKSB7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplKCk7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuZW1wdHlDZWxsLnVwZGF0ZU9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIG9wdGlvbnNDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRPcHRpb25zKCk7XHJcbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICB3aWRnZXQudXBkYXRlT3B0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2luZG93UmVzaXplKSB7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmRlc3Ryb3lDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuZGVzdHJveUNhbGxiYWNrKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgLy9pZiAodGhpcy5vcHRpb25zLmFwaSkge1xyXG4gICAgLyogdGhpcy5vcHRpb25zLmFwaSBnZXR0aW5nIHVuZGVmaW5lZCBmb3IgbmV3IGRhc2hib2FyZCBsb2FkLSB0ZW1wIGZpeFxyXG4gICAgKiAgb24gbmV3IGRhc2hib2FyZCBhcmVhIGxvYWQsIG9sZCBkYXNoYm9hcmQgYXJlYSBnZXRzIGRlc3Ryb3llZCwgYnV0IHRoYXQgbGVhZHMgdG8gXHJcbiAgICAqICBvbmRlc3Ryb3kgb2YgY3VycmVudCB0aGlzLm9wdGlvbnMuYXBpIGluc3RhbmNlIC0gbmVlZHMgdG8gaW52ZXN0aWdhdGUgZnVydGhlclxyXG4gICAgKi9cclxuICAgIGlmIChmYWxzZSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLnJlc2l6ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwaS5vcHRpb25zQ2hhbmdlZCA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwaS5nZXROZXh0UG9zc2libGVQb3NpdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwaSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHRoaXMuZW1wdHlDZWxsLmRlc3Ryb3koKTtcclxuICAgIGRlbGV0ZSB0aGlzLmVtcHR5Q2VsbDtcclxuICAgIHRoaXMuY29tcGFjdC5kZXN0cm95KCk7XHJcbiAgICBkZWxldGUgdGhpcy5jb21wYWN0O1xyXG4gIH1cclxuXHJcbiAgb25SZXNpemUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldEdyaWRTaXplKCk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dCgpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZlRvUmVzaXplKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY2xpZW50V2lkdGggPSB0aGlzLmVsLmNsaWVudFdpZHRoO1xyXG4gICAgY29uc3Qgb2Zmc2V0V2lkdGggPSB0aGlzLmVsLm9mZnNldFdpZHRoO1xyXG4gICAgY29uc3Qgc2Nyb2xsV2lkdGggPSB0aGlzLmVsLnNjcm9sbFdpZHRoO1xyXG4gICAgY29uc3QgY2xpZW50SGVpZ2h0ID0gdGhpcy5lbC5jbGllbnRIZWlnaHQ7XHJcbiAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSB0aGlzLmVsLm9mZnNldEhlaWdodDtcclxuICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9IHRoaXMuZWwuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgY29uc3QgdmVydGljYWxTY3JvbGxQcmVzZW50ID0gY2xpZW50V2lkdGggPCBvZmZzZXRXaWR0aCAmJiBzY3JvbGxIZWlnaHQgPiBvZmZzZXRIZWlnaHRcclxuICAgICAgJiYgc2Nyb2xsSGVpZ2h0IC0gb2Zmc2V0SGVpZ2h0IDwgb2Zmc2V0V2lkdGggLSBjbGllbnRXaWR0aDtcclxuICAgIGNvbnN0IGhvcml6b250YWxTY3JvbGxQcmVzZW50ID0gY2xpZW50SGVpZ2h0IDwgb2Zmc2V0SGVpZ2h0XHJcbiAgICAgICYmIHNjcm9sbFdpZHRoID4gb2Zmc2V0V2lkdGggJiYgc2Nyb2xsV2lkdGggLSBvZmZzZXRXaWR0aCA8IG9mZnNldEhlaWdodCAtIGNsaWVudEhlaWdodDtcclxuICAgIGlmICh2ZXJ0aWNhbFNjcm9sbFByZXNlbnQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICFob3Jpem9udGFsU2Nyb2xsUHJlc2VudDtcclxuICB9XHJcblxyXG4gIHNldEdyaWRTaXplKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmVsO1xyXG4gICAgbGV0IHdpZHRoID0gZWwuY2xpZW50V2lkdGg7XHJcbiAgICBsZXQgaGVpZ2h0ID0gZWwuY2xpZW50SGVpZ2h0O1xyXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuc2V0R3JpZFNpemUgfHwgdGhpcy4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gJ2ZpdCcgJiYgIXRoaXMubW9iaWxlKSB7XHJcbiAgICAgIHdpZHRoID0gZWwub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGhlaWdodCA9IGVsLm9mZnNldEhlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdpZHRoID0gZWwuY2xpZW50V2lkdGg7XHJcbiAgICAgIGhlaWdodCA9IGVsLmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuICAgIHRoaXMuY3VyV2lkdGggPSB3aWR0aDtcclxuICAgIHRoaXMuY3VySGVpZ2h0ID0gaGVpZ2h0O1xyXG4gIH1cclxuXHJcbiAgc2V0R3JpZERpbWVuc2lvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldEdyaWRTaXplKCk7XHJcbiAgICBpZiAoIXRoaXMubW9iaWxlICYmIHRoaXMuJG9wdGlvbnMubW9iaWxlQnJlYWtwb2ludCA+IHRoaXMuY3VyV2lkdGgpIHtcclxuICAgICAgdGhpcy5tb2JpbGUgPSAhdGhpcy5tb2JpbGU7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbCwgJ21vYmlsZScpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1vYmlsZSAmJiB0aGlzLiRvcHRpb25zLm1vYmlsZUJyZWFrcG9pbnQgPCB0aGlzLmN1cldpZHRoKSB7XHJcbiAgICAgIHRoaXMubW9iaWxlID0gIXRoaXMubW9iaWxlO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwsICdtb2JpbGUnKTtcclxuICAgIH1cclxuICAgIGxldCByb3dzID0gdGhpcy4kb3B0aW9ucy5taW5Sb3dzLCBjb2x1bW5zID0gdGhpcy4kb3B0aW9ucy5taW5Db2xzO1xyXG5cclxuICAgIGxldCB3aWRnZXRzSW5kZXggPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0O1xyXG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+PSAwOyB3aWRnZXRzSW5kZXgtLSkge1xyXG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcclxuICAgICAgaWYgKCF3aWRnZXQubm90UGxhY2VkKSB7XHJcbiAgICAgICAgcm93cyA9IE1hdGgubWF4KHJvd3MsIHdpZGdldC4kaXRlbS55ICsgd2lkZ2V0LiRpdGVtLnJvd3MpO1xyXG4gICAgICAgIGNvbHVtbnMgPSBNYXRoLm1heChjb2x1bW5zLCB3aWRnZXQuJGl0ZW0ueCArIHdpZGdldC4kaXRlbS5jb2xzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbnMgIT09IGNvbHVtbnMgfHwgdGhpcy5yb3dzICE9PSByb3dzKSB7XHJcbiAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XHJcbiAgICAgIHRoaXMucm93cyA9IHJvd3M7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFNpemVDaGFuZ2VkQ2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZ3JpZFNpemVDaGFuZ2VkQ2FsbGJhY2sodGhpcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZUxheW91dCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbXBhY3QpIHtcclxuICAgICAgdGhpcy5jb21wYWN0LmNoZWNrQ29tcGFjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0R3JpZERpbWVuc2lvbnMoKTtcclxuICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luKSB7XHJcbiAgICAgIGxldCBtYXJnaW5XaWR0aCA9IC10aGlzLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQ7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1sZWZ0JywgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQgKyAncHgnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWxlZnQnLCB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQgIT09IG51bGwpIHtcclxuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQ7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1yaWdodCcsIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodCArICdweCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctcmlnaHQnLCB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCcpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY3VyQ29sV2lkdGggPSAodGhpcy5jdXJXaWR0aCAtIG1hcmdpbldpZHRoKSAvIHRoaXMuY29sdW1ucztcclxuICAgICAgbGV0IG1hcmdpbkhlaWdodCA9IC10aGlzLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Ub3AgIT09IG51bGwpIHtcclxuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcDtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXRvcCcsIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Ub3AgKyAncHgnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy10b3AnLCB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICE9PSBudWxsKSB7XHJcbiAgICAgICAgbWFyZ2luSGVpZ2h0ICs9IHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b207XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1ib3R0b20nLCB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICsgJ3B4Jyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWFyZ2luSGVpZ2h0ICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctYm90dG9tJywgdGhpcy4kb3B0aW9ucy5tYXJnaW4gKyAncHgnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmN1clJvd0hlaWdodCA9ICh0aGlzLmN1ckhlaWdodCAtIG1hcmdpbkhlaWdodCkgLyB0aGlzLnJvd3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1ckNvbFdpZHRoID0gKHRoaXMuY3VyV2lkdGggKyB0aGlzLiRvcHRpb25zLm1hcmdpbikgLyB0aGlzLmNvbHVtbnM7XHJcbiAgICAgIHRoaXMuY3VyUm93SGVpZ2h0ID0gKHRoaXMuY3VySGVpZ2h0ICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4pIC8gdGhpcy5yb3dzO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWxlZnQnLCAwICsgJ3B4Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctcmlnaHQnLCAwICsgJ3B4Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctdG9wJywgMCArICdweCcpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWJvdHRvbScsIDAgKyAncHgnKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZFJlbmRlcmVyLnVwZGF0ZUdyaWRzdGVyKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVHcmlkKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuc2V0R3JpZFNpemUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnd2lkdGgnLCAodGhpcy5jb2x1bW5zICogdGhpcy5jdXJDb2xXaWR0aCArIHRoaXMuJG9wdGlvbnMubWFyZ2luKSArICdweCcpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdoZWlnaHQnLCAodGhpcy5yb3dzICogdGhpcy5jdXJSb3dIZWlnaHQgKyB0aGlzLiRvcHRpb25zLm1hcmdpbikgKyAncHgnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3dpZHRoJywgJycpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdoZWlnaHQnLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDEsIHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+PSAwOyB3aWRnZXRzSW5kZXgtLSkge1xyXG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcclxuICAgICAgd2lkZ2V0LnNldFNpemUoKTtcclxuICAgICAgd2lkZ2V0LmRyYWcudG9nZ2xlKCk7XHJcbiAgICAgIHdpZGdldC5yZXNpemUudG9nZ2xlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCh0aGlzLnJlc2l6ZS5iaW5kKHRoaXMpLCAxMDApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlR3JpZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLiRvcHRpb25zLmRpc3BsYXlHcmlkID09PSAnYWx3YXlzJyAmJiAhdGhpcy5tb2JpbGUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnZGlzcGxheS1ncmlkJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuJG9wdGlvbnMuZGlzcGxheUdyaWQgPT09ICdvbkRyYWcmUmVzaXplJyAmJiB0aGlzLmRyYWdJblByb2dyZXNzKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbCwgJ2Rpc3BsYXktZ3JpZCcpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLiRvcHRpb25zLmRpc3BsYXlHcmlkID09PSAnbm9uZScgfHwgIXRoaXMuZHJhZ0luUHJvZ3Jlc3MgfHwgdGhpcy5tb2JpbGUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLCAnZGlzcGxheS1ncmlkJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEdyaWREaW1lbnNpb25zKCk7XHJcbiAgICB0aGlzLmdyaWRDb2x1bW5zLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMuY29sdW1ucywgTWF0aC5mbG9vcih0aGlzLmN1cldpZHRoIC8gdGhpcy5jdXJDb2xXaWR0aCkpIHx8IDA7XHJcbiAgICB0aGlzLmdyaWRSb3dzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMucm93cywgTWF0aC5mbG9vcih0aGlzLmN1ckhlaWdodCAvIHRoaXMuY3VyUm93SGVpZ2h0KSkgfHwgMDtcclxuICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBhZGRJdGVtKGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Db2xzO1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0uY29scyA9IGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scztcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Sb3dzO1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0ucm93cyA9IGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cztcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0ueCA9PT0gLTEgfHwgaXRlbUNvbXBvbmVudC4kaXRlbS55ID09PSAtMSkge1xyXG4gICAgICB0aGlzLmF1dG9Qb3NpdGlvbkl0ZW0oaXRlbUNvbXBvbmVudCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2tDb2xsaXNpb24oaXRlbUNvbXBvbmVudC4kaXRlbSkpIHtcclxuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVXYXJuaW5ncykge1xyXG4gICAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0NhblxcJ3QgYmUgcGxhY2VkIGluIHRoZSBib3VuZHMgb2YgdGhlIGRhc2hib2FyZCwgdHJ5aW5nIHRvIGF1dG8gcG9zaXRpb24hL24nICtcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGl0ZW1Db21wb25lbnQuaXRlbSwgWydjb2xzJywgJ3Jvd3MnLCAneCcsICd5J10pKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuJG9wdGlvbnMuZGlzYWJsZUF1dG9Qb3NpdGlvbk9uQ29uZmxpY3QpIHtcclxuICAgICAgICB0aGlzLmF1dG9Qb3NpdGlvbkl0ZW0oaXRlbUNvbXBvbmVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyaWQucHVzaChpdGVtQ29tcG9uZW50KTtcclxuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0RGVib3VuY2UoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQuc3BsaWNlKHRoaXMuZ3JpZC5pbmRleE9mKGl0ZW1Db21wb25lbnQpLCAxKTtcclxuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0RGVib3VuY2UoKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXRlbVJlbW92ZWRDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaXRlbVJlbW92ZWRDYWxsYmFjayhpdGVtQ29tcG9uZW50Lml0ZW0sIGl0ZW1Db21wb25lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tDb2xsaXNpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XHJcbiAgICBsZXQgY29sbGlzaW9uOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfCBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLml0ZW1WYWxpZGF0ZUNhbGxiYWNrKSB7XHJcbiAgICAgIGNvbGxpc2lvbiA9ICF0aGlzLm9wdGlvbnMuaXRlbVZhbGlkYXRlQ2FsbGJhY2soaXRlbSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbGxpc2lvbiAmJiB0aGlzLmNoZWNrR3JpZENvbGxpc2lvbihpdGVtKSkge1xyXG4gICAgICBjb2xsaXNpb24gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb2xsaXNpb24pIHtcclxuICAgICAgY29uc3QgYyA9IHRoaXMuZmluZEl0ZW1XaXRoSXRlbShpdGVtKTtcclxuICAgICAgaWYgKGMpIHtcclxuICAgICAgICBjb2xsaXNpb24gPSBjO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29sbGlzaW9uO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tHcmlkQ29sbGlzaW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgbm9OZWdhdGl2ZVBvc2l0aW9uID0gaXRlbS55ID4gLTEgJiYgaXRlbS54ID4gLTE7XHJcbiAgICBjb25zdCBtYXhHcmlkQ29scyA9IGl0ZW0uY29scyArIGl0ZW0ueCA8PSB0aGlzLiRvcHRpb25zLm1heENvbHM7XHJcbiAgICBjb25zdCBtYXhHcmlkUm93cyA9IGl0ZW0ucm93cyArIGl0ZW0ueSA8PSB0aGlzLiRvcHRpb25zLm1heFJvd3M7XHJcbiAgICBjb25zdCBtYXhJdGVtQ29scyA9IGl0ZW0ubWF4SXRlbUNvbHMgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWF4SXRlbUNvbHMgOiBpdGVtLm1heEl0ZW1Db2xzO1xyXG4gICAgY29uc3QgbWluSXRlbUNvbHMgPSBpdGVtLm1pbkl0ZW1Db2xzID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1pbkl0ZW1Db2xzIDogaXRlbS5taW5JdGVtQ29scztcclxuICAgIGNvbnN0IG1heEl0ZW1Sb3dzID0gaXRlbS5tYXhJdGVtUm93cyA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5tYXhJdGVtUm93cyA6IGl0ZW0ubWF4SXRlbVJvd3M7XHJcbiAgICBjb25zdCBtaW5JdGVtUm93cyA9IGl0ZW0ubWluSXRlbVJvd3MgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWluSXRlbVJvd3MgOiBpdGVtLm1pbkl0ZW1Sb3dzO1xyXG4gICAgY29uc3QgaW5Db2xzTGltaXRzID0gaXRlbS5jb2xzIDw9IG1heEl0ZW1Db2xzICYmIGl0ZW0uY29scyA+PSBtaW5JdGVtQ29scztcclxuICAgIGNvbnN0IGluUm93c0xpbWl0cyA9IGl0ZW0ucm93cyA8PSBtYXhJdGVtUm93cyAmJiBpdGVtLnJvd3MgPj0gbWluSXRlbVJvd3M7XHJcbiAgICBjb25zdCBtaW5BcmVhTGltaXQgPSBpdGVtLm1pbkl0ZW1BcmVhID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1pbkl0ZW1BcmVhIDogaXRlbS5taW5JdGVtQXJlYTtcclxuICAgIGNvbnN0IG1heEFyZWFMaW1pdCA9IGl0ZW0ubWF4SXRlbUFyZWEgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWF4SXRlbUFyZWEgOiBpdGVtLm1heEl0ZW1BcmVhO1xyXG4gICAgY29uc3QgYXJlYSA9IGl0ZW0uY29scyAqIGl0ZW0ucm93cztcclxuICAgIGNvbnN0IGluTWluQXJlYSA9IG1pbkFyZWFMaW1pdCA8PSBhcmVhO1xyXG4gICAgY29uc3QgaW5NYXhBcmVhID0gbWF4QXJlYUxpbWl0ID49IGFyZWE7XHJcbiAgICByZXR1cm4gIShub05lZ2F0aXZlUG9zaXRpb24gJiYgbWF4R3JpZENvbHMgJiYgbWF4R3JpZFJvd3MgJiYgaW5Db2xzTGltaXRzICYmIGluUm93c0xpbWl0cyAmJiBpbk1pbkFyZWEgJiYgaW5NYXhBcmVhKTtcclxuICB9XHJcblxyXG4gIGZpbmRJdGVtV2l0aEl0ZW0oaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XHJcbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID4gLTE7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICBpZiAod2lkZ2V0LiRpdGVtICE9PSBpdGVtICYmIEdyaWRzdGVyQ29tcG9uZW50LmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMod2lkZ2V0LiRpdGVtLCBpdGVtKSkge1xyXG4gICAgICAgIHJldHVybiB3aWRnZXQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGZpbmRJdGVtc1dpdGhJdGVtKGl0ZW06IEdyaWRzdGVySXRlbSk6IEFycmF5PEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZT4ge1xyXG4gICAgY29uc3QgYTogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiA9IFtdO1xyXG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDEsIHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+IC0xOyB3aWRnZXRzSW5kZXgtLSkge1xyXG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcclxuICAgICAgaWYgKHdpZGdldC4kaXRlbSAhPT0gaXRlbSAmJiBHcmlkc3RlckNvbXBvbmVudC5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKHdpZGdldC4kaXRlbSwgaXRlbSkpIHtcclxuICAgICAgICBhLnB1c2god2lkZ2V0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGE7XHJcbiAgfVxyXG5cclxuICBhdXRvUG9zaXRpb25JdGVtKGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24oaXRlbUNvbXBvbmVudC4kaXRlbSkpIHtcclxuICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSBmYWxzZTtcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLnggPSBpdGVtQ29tcG9uZW50LiRpdGVtLng7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS55ID0gaXRlbUNvbXBvbmVudC4kaXRlbS55O1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW1DaGFuZ2VkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lm5vdFBsYWNlZCA9IHRydWU7XHJcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlV2FybmluZ3MpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0NhblxcJ3QgYmUgcGxhY2VkIGluIHRoZSBib3VuZHMgb2YgdGhlIGRhc2hib2FyZCEvbicgK1xyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbXBvbmVudC5pdGVtLCBbJ2NvbHMnLCAncm93cycsICd4JywgJ3knXSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROZXh0UG9zc2libGVQb3NpdGlvbihuZXdJdGVtOiBHcmlkc3Rlckl0ZW0sIHN0YXJ0aW5nRnJvbTogeyB5PzogbnVtYmVyLCB4PzogbnVtYmVyIH0gPSB7fSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG5ld0l0ZW0uY29scyA9PT0gLTEpIHtcclxuICAgICAgbmV3SXRlbS5jb2xzID0gdGhpcy4kb3B0aW9ucy5kZWZhdWx0SXRlbUNvbHM7XHJcbiAgICB9XHJcbiAgICBpZiAobmV3SXRlbS5yb3dzID09PSAtMSkge1xyXG4gICAgICBuZXdJdGVtLnJvd3MgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtUm93cztcclxuICAgIH1cclxuICAgIHRoaXMuc2V0R3JpZERpbWVuc2lvbnMoKTtcclxuICAgIGxldCByb3dzSW5kZXggPSBzdGFydGluZ0Zyb20ueSB8fCAwLCBjb2xzSW5kZXg7XHJcbiAgICBmb3IgKDsgcm93c0luZGV4IDwgdGhpcy5yb3dzOyByb3dzSW5kZXgrKykge1xyXG4gICAgICBuZXdJdGVtLnkgPSByb3dzSW5kZXg7XHJcbiAgICAgIGNvbHNJbmRleCA9IHN0YXJ0aW5nRnJvbS54IHx8IDA7XHJcbiAgICAgIGZvciAoOyBjb2xzSW5kZXggPCB0aGlzLmNvbHVtbnM7IGNvbHNJbmRleCsrKSB7XHJcbiAgICAgICAgbmV3SXRlbS54ID0gY29sc0luZGV4O1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0NvbGxpc2lvbihuZXdJdGVtKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBjYW5BZGRUb1Jvd3MgPSB0aGlzLiRvcHRpb25zLm1heFJvd3MgPj0gdGhpcy5yb3dzICsgbmV3SXRlbS5yb3dzO1xyXG4gICAgY29uc3QgY2FuQWRkVG9Db2x1bW5zID0gdGhpcy4kb3B0aW9ucy5tYXhDb2xzID49IHRoaXMuY29sdW1ucyArIG5ld0l0ZW0uY29scztcclxuICAgIGNvbnN0IGFkZFRvUm93cyA9IHRoaXMucm93cyA8PSB0aGlzLmNvbHVtbnMgJiYgY2FuQWRkVG9Sb3dzO1xyXG4gICAgaWYgKCFhZGRUb1Jvd3MgJiYgY2FuQWRkVG9Db2x1bW5zKSB7XHJcbiAgICAgIG5ld0l0ZW0ueCA9IHRoaXMuY29sdW1ucztcclxuICAgICAgbmV3SXRlbS55ID0gMDtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKGNhbkFkZFRvUm93cykge1xyXG4gICAgICBuZXdJdGVtLnkgPSB0aGlzLnJvd3M7XHJcbiAgICAgIG5ld0l0ZW0ueCA9IDA7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rmlyc3RQb3NzaWJsZVBvc2l0aW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbSB7XHJcbiAgICBjb25zdCB0bXBJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XHJcbiAgICB0aGlzLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uKHRtcEl0ZW0pO1xyXG4gICAgcmV0dXJuIHRtcEl0ZW07XHJcbiAgfVxyXG5cclxuICBnZXRMYXN0UG9zc2libGVQb3NpdGlvbihpdGVtOiBHcmlkc3Rlckl0ZW0pOiBHcmlkc3Rlckl0ZW0ge1xyXG4gICAgbGV0IGZhcnRoZXN0SXRlbTogeyB5OiBudW1iZXIsIHg6IG51bWJlciB9ID0geyB5OiAwLCB4OiAwIH07XHJcbiAgICBmYXJ0aGVzdEl0ZW0gPSB0aGlzLmdyaWQucmVkdWNlKChwcmV2OiBhbnksIGN1cnI6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyQ29vcmRzID0geyB5OiBjdXJyLiRpdGVtLnkgKyBjdXJyLiRpdGVtLnJvd3MgLSAxLCB4OiBjdXJyLiRpdGVtLnggKyBjdXJyLiRpdGVtLmNvbHMgLSAxIH07XHJcbiAgICAgIGlmIChHcmlkc3RlclV0aWxzLmNvbXBhcmVJdGVtcyhwcmV2LCBjdXJyQ29vcmRzKSA9PT0gMSkge1xyXG4gICAgICAgIHJldHVybiBjdXJyQ29vcmRzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBwcmV2O1xyXG4gICAgICB9XHJcbiAgICB9LCBmYXJ0aGVzdEl0ZW0pO1xyXG5cclxuICAgIGNvbnN0IHRtcEl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcclxuICAgIHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24odG1wSXRlbSwgZmFydGhlc3RJdGVtKTtcclxuICAgIHJldHVybiB0bXBJdGVtO1xyXG4gIH1cclxuXHJcbiAgcGl4ZWxzVG9Qb3NpdGlvblgoeDogbnVtYmVyLCByb3VuZGluZ01ldGhvZDogRnVuY3Rpb24sIG5vTGltaXQ/OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gcm91bmRpbmdNZXRob2QoeCAvIHRoaXMuY3VyQ29sV2lkdGgpO1xyXG4gICAgaWYgKG5vTGltaXQpIHtcclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIE1hdGgubWF4KHBvc2l0aW9uLCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBpeGVsc1RvUG9zaXRpb25ZKHk6IG51bWJlciwgcm91bmRpbmdNZXRob2Q6IEZ1bmN0aW9uLCBub0xpbWl0PzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IHJvdW5kaW5nTWV0aG9kKHkgLyB0aGlzLmN1clJvd0hlaWdodCk7XHJcbiAgICBpZiAobm9MaW1pdCkge1xyXG4gICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gTWF0aC5tYXgocG9zaXRpb24sIDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcG9zaXRpb25YVG9QaXhlbHMoeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB4ICogdGhpcy5jdXJDb2xXaWR0aDtcclxuICB9XHJcblxyXG4gIHBvc2l0aW9uWVRvUGl4ZWxzKHk6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4geSAqIHRoaXMuY3VyUm93SGVpZ2h0O1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import { ChangeDetectorRef, Component, ElementRef, Input, NgZone, Renderer2, ViewEncapsulation } from '@angular/core';
6
+ import { GridsterConfigService } from './gridsterConfig.constant';
7
+ import { GridsterUtils } from './gridsterUtils.service';
8
+ import { GridsterEmptyCell } from './gridsterEmptyCell.service';
9
+ import { GridsterCompact } from './gridsterCompact.service';
10
+ import { GridsterRenderer } from './gridsterRenderer.service';
11
+ export class GridsterComponent {
12
+ /**
13
+ * @param {?} el
14
+ * @param {?} renderer
15
+ * @param {?} cdRef
16
+ * @param {?} zone
17
+ */
18
+ constructor(el, renderer, cdRef, zone) {
19
+ this.renderer = renderer;
20
+ this.cdRef = cdRef;
21
+ this.zone = zone;
22
+ this.gridColumns = [];
23
+ this.gridRows = [];
24
+ this.el = el.nativeElement;
25
+ this.$options = JSON.parse(JSON.stringify(GridsterConfigService));
26
+ this.calculateLayoutDebounce = GridsterUtils.debounce(this.calculateLayout.bind(this), 0);
27
+ this.mobile = false;
28
+ this.curWidth = 0;
29
+ this.curHeight = 0;
30
+ this.grid = [];
31
+ this.curColWidth = 0;
32
+ this.curRowHeight = 0;
33
+ this.dragInProgress = false;
34
+ this.emptyCell = new GridsterEmptyCell(this);
35
+ this.compact = new GridsterCompact(this);
36
+ this.gridRenderer = new GridsterRenderer(this);
37
+ }
38
+ /**
39
+ * @param {?} item
40
+ * @param {?} item2
41
+ * @return {?}
42
+ */
43
+ static checkCollisionTwoItems(item, item2) {
44
+ return item.x < item2.x + item2.cols
45
+ && item.x + item.cols > item2.x
46
+ && item.y < item2.y + item2.rows
47
+ && item.y + item.rows > item2.y;
48
+ }
49
+ /**
50
+ * @return {?}
51
+ */
52
+ ngOnInit() {
53
+ if (this.options.initCallback) {
54
+ this.options.initCallback(this);
55
+ }
56
+ }
57
+ /**
58
+ * @param {?} changes
59
+ * @return {?}
60
+ */
61
+ ngOnChanges(changes) {
62
+ if (changes.options) {
63
+ this.setOptions();
64
+ this.options.api = {
65
+ optionsChanged: this.optionsChanged.bind(this),
66
+ resize: this.onResize.bind(this),
67
+ getNextPossiblePosition: this.getNextPossiblePosition.bind(this),
68
+ getFirstPossiblePosition: this.getFirstPossiblePosition.bind(this),
69
+ getLastPossiblePosition: this.getLastPossiblePosition.bind(this),
70
+ getCurrentRowHeight: this.getCurrentRowHeight.bind(this)
71
+ };
72
+ this.columns = this.$options.minCols;
73
+ this.rows = this.$options.minRows;
74
+ this.setGridSize();
75
+ this.calculateLayout();
76
+ }
77
+ }
78
+ /**
79
+ * @return {?}
80
+ */
81
+ getCurrentRowHeight() {
82
+ return this.curRowHeight;
83
+ }
84
+ /**
85
+ * @return {?}
86
+ */
87
+ resize() {
88
+ /** @type {?} */
89
+ let height;
90
+ /** @type {?} */
91
+ let width;
92
+ if (this.$options.gridType === 'fit' && !this.mobile) {
93
+ width = this.el.offsetWidth;
94
+ height = this.el.offsetHeight;
95
+ }
96
+ else {
97
+ width = this.el.clientWidth;
98
+ height = this.el.clientHeight;
99
+ }
100
+ if ((width !== this.curWidth || height !== this.curHeight) && this.checkIfToResize()) {
101
+ this.onResize();
102
+ }
103
+ }
104
+ /**
105
+ * @return {?}
106
+ */
107
+ setOptions() {
108
+ this.$options = GridsterUtils.merge(this.$options, this.options, this.$options);
109
+ if (!this.$options.disableWindowResize && !this.windowResize) {
110
+ this.windowResize = this.renderer.listen('window', 'resize', this.onResize.bind(this));
111
+ }
112
+ else if (this.$options.disableWindowResize && this.windowResize) {
113
+ this.windowResize();
114
+ this.windowResize = null;
115
+ }
116
+ this.emptyCell.updateOptions();
117
+ }
118
+ /**
119
+ * @return {?}
120
+ */
121
+ optionsChanged() {
122
+ this.setOptions();
123
+ /** @type {?} */
124
+ let widgetsIndex = this.grid.length - 1;
125
+ /** @type {?} */
126
+ let widget;
127
+ for (; widgetsIndex >= 0; widgetsIndex--) {
128
+ widget = this.grid[widgetsIndex];
129
+ widget.updateOptions();
130
+ }
131
+ this.calculateLayout();
132
+ }
133
+ /**
134
+ * @return {?}
135
+ */
136
+ ngOnDestroy() {
137
+ if (this.windowResize) {
138
+ this.windowResize();
139
+ }
140
+ if (this.options.destroyCallback) {
141
+ this.options.destroyCallback(this);
142
+ }
143
+ //if (this.options.api) {
144
+ /* this.options.api getting undefined for new dashboard load- temp fix
145
+ * on new dashboard area load, old dashboard area gets destroyed, but that leads to
146
+ * ondestroy of current this.options.api instance - needs to investigate further
147
+ */
148
+ if (false) {
149
+ this.options.api.resize = undefined;
150
+ this.options.api.optionsChanged = undefined;
151
+ this.options.api.getNextPossiblePosition = undefined;
152
+ this.options.api = undefined;
153
+ }
154
+ this.emptyCell.destroy();
155
+ delete this.emptyCell;
156
+ this.compact.destroy();
157
+ delete this.compact;
158
+ }
159
+ /**
160
+ * @return {?}
161
+ */
162
+ onResize() {
163
+ this.setGridSize();
164
+ this.calculateLayout();
165
+ }
166
+ /**
167
+ * @return {?}
168
+ */
169
+ checkIfToResize() {
170
+ /** @type {?} */
171
+ const clientWidth = this.el.clientWidth;
172
+ /** @type {?} */
173
+ const offsetWidth = this.el.offsetWidth;
174
+ /** @type {?} */
175
+ const scrollWidth = this.el.scrollWidth;
176
+ /** @type {?} */
177
+ const clientHeight = this.el.clientHeight;
178
+ /** @type {?} */
179
+ const offsetHeight = this.el.offsetHeight;
180
+ /** @type {?} */
181
+ const scrollHeight = this.el.scrollHeight;
182
+ /** @type {?} */
183
+ const verticalScrollPresent = clientWidth < offsetWidth && scrollHeight > offsetHeight
184
+ && scrollHeight - offsetHeight < offsetWidth - clientWidth;
185
+ /** @type {?} */
186
+ const horizontalScrollPresent = clientHeight < offsetHeight
187
+ && scrollWidth > offsetWidth && scrollWidth - offsetWidth < offsetHeight - clientHeight;
188
+ if (verticalScrollPresent) {
189
+ return false;
190
+ }
191
+ return !horizontalScrollPresent;
192
+ }
193
+ /**
194
+ * @return {?}
195
+ */
196
+ setGridSize() {
197
+ /** @type {?} */
198
+ const el = this.el;
199
+ /** @type {?} */
200
+ let width = el.clientWidth;
201
+ /** @type {?} */
202
+ let height = el.clientHeight;
203
+ if (this.$options.setGridSize || this.$options.gridType === 'fit' && !this.mobile) {
204
+ width = el.offsetWidth;
205
+ height = el.offsetHeight;
206
+ }
207
+ else {
208
+ width = el.clientWidth;
209
+ height = el.clientHeight;
210
+ }
211
+ this.curWidth = width;
212
+ this.curHeight = height;
213
+ }
214
+ /**
215
+ * @return {?}
216
+ */
217
+ setGridDimensions() {
218
+ this.setGridSize();
219
+ if (!this.mobile && this.$options.mobileBreakpoint > this.curWidth) {
220
+ this.mobile = !this.mobile;
221
+ this.renderer.addClass(this.el, 'mobile');
222
+ }
223
+ else if (this.mobile && this.$options.mobileBreakpoint < this.curWidth) {
224
+ this.mobile = !this.mobile;
225
+ this.renderer.removeClass(this.el, 'mobile');
226
+ }
227
+ /** @type {?} */
228
+ let rows = this.$options.minRows;
229
+ /** @type {?} */
230
+ let columns = this.$options.minCols;
231
+ /** @type {?} */
232
+ let widgetsIndex = this.grid.length - 1;
233
+ /** @type {?} */
234
+ let widget;
235
+ for (; widgetsIndex >= 0; widgetsIndex--) {
236
+ widget = this.grid[widgetsIndex];
237
+ if (!widget.notPlaced) {
238
+ rows = Math.max(rows, widget.$item.y + widget.$item.rows);
239
+ columns = Math.max(columns, widget.$item.x + widget.$item.cols);
240
+ }
241
+ }
242
+ if (this.columns !== columns || this.rows !== rows) {
243
+ this.columns = columns;
244
+ this.rows = rows;
245
+ if (this.options.gridSizeChangedCallback) {
246
+ this.options.gridSizeChangedCallback(this);
247
+ }
248
+ }
249
+ }
250
+ /**
251
+ * @return {?}
252
+ */
253
+ calculateLayout() {
254
+ if (this.compact) {
255
+ this.compact.checkCompact();
256
+ }
257
+ this.setGridDimensions();
258
+ if (this.$options.outerMargin) {
259
+ /** @type {?} */
260
+ let marginWidth = -this.$options.margin;
261
+ if (this.$options.outerMarginLeft !== null) {
262
+ marginWidth += this.$options.outerMarginLeft;
263
+ this.renderer.setStyle(this.el, 'padding-left', this.$options.outerMarginLeft + 'px');
264
+ }
265
+ else {
266
+ marginWidth += this.$options.margin;
267
+ this.renderer.setStyle(this.el, 'padding-left', this.$options.margin + 'px');
268
+ }
269
+ if (this.$options.outerMarginRight !== null) {
270
+ marginWidth += this.$options.outerMarginRight;
271
+ this.renderer.setStyle(this.el, 'padding-right', this.$options.outerMarginRight + 'px');
272
+ }
273
+ else {
274
+ marginWidth += this.$options.margin;
275
+ this.renderer.setStyle(this.el, 'padding-right', this.$options.margin + 'px');
276
+ }
277
+ this.curColWidth = (this.curWidth - marginWidth) / this.columns;
278
+ /** @type {?} */
279
+ let marginHeight = -this.$options.margin;
280
+ if (this.$options.outerMarginTop !== null) {
281
+ marginHeight += this.$options.outerMarginTop;
282
+ this.renderer.setStyle(this.el, 'padding-top', this.$options.outerMarginTop + 'px');
283
+ }
284
+ else {
285
+ marginHeight += this.$options.margin;
286
+ this.renderer.setStyle(this.el, 'padding-top', this.$options.margin + 'px');
287
+ }
288
+ if (this.$options.outerMarginBottom !== null) {
289
+ marginHeight += this.$options.outerMarginBottom;
290
+ this.renderer.setStyle(this.el, 'padding-bottom', this.$options.outerMarginBottom + 'px');
291
+ }
292
+ else {
293
+ marginHeight += this.$options.margin;
294
+ this.renderer.setStyle(this.el, 'padding-bottom', this.$options.margin + 'px');
295
+ }
296
+ this.curRowHeight = (this.curHeight - marginHeight) / this.rows;
297
+ }
298
+ else {
299
+ this.curColWidth = (this.curWidth + this.$options.margin) / this.columns;
300
+ this.curRowHeight = (this.curHeight + this.$options.margin) / this.rows;
301
+ this.renderer.setStyle(this.el, 'padding-left', 0 + 'px');
302
+ this.renderer.setStyle(this.el, 'padding-right', 0 + 'px');
303
+ this.renderer.setStyle(this.el, 'padding-top', 0 + 'px');
304
+ this.renderer.setStyle(this.el, 'padding-bottom', 0 + 'px');
305
+ }
306
+ this.gridRenderer.updateGridster();
307
+ this.updateGrid();
308
+ if (this.$options.setGridSize) {
309
+ this.renderer.setStyle(this.el, 'width', (this.columns * this.curColWidth + this.$options.margin) + 'px');
310
+ this.renderer.setStyle(this.el, 'height', (this.rows * this.curRowHeight + this.$options.margin) + 'px');
311
+ }
312
+ else {
313
+ this.renderer.setStyle(this.el, 'width', '');
314
+ this.renderer.setStyle(this.el, 'height', '');
315
+ }
316
+ /** @type {?} */
317
+ let widgetsIndex = this.grid.length - 1;
318
+ /** @type {?} */
319
+ let widget;
320
+ for (; widgetsIndex >= 0; widgetsIndex--) {
321
+ widget = this.grid[widgetsIndex];
322
+ widget.setSize();
323
+ widget.drag.toggle();
324
+ widget.resize.toggle();
325
+ }
326
+ setTimeout(this.resize.bind(this), 100);
327
+ }
328
+ /**
329
+ * @return {?}
330
+ */
331
+ updateGrid() {
332
+ if (this.$options.displayGrid === 'always' && !this.mobile) {
333
+ this.renderer.addClass(this.el, 'display-grid');
334
+ }
335
+ else if (this.$options.displayGrid === 'onDrag&Resize' && this.dragInProgress) {
336
+ this.renderer.addClass(this.el, 'display-grid');
337
+ }
338
+ else if (this.$options.displayGrid === 'none' || !this.dragInProgress || this.mobile) {
339
+ this.renderer.removeClass(this.el, 'display-grid');
340
+ }
341
+ this.setGridDimensions();
342
+ this.gridColumns.length = Math.max(this.columns, Math.floor(this.curWidth / this.curColWidth)) || 0;
343
+ this.gridRows.length = Math.max(this.rows, Math.floor(this.curHeight / this.curRowHeight)) || 0;
344
+ this.cdRef.markForCheck();
345
+ }
346
+ /**
347
+ * @param {?} itemComponent
348
+ * @return {?}
349
+ */
350
+ addItem(itemComponent) {
351
+ if (itemComponent.$item.cols === undefined) {
352
+ itemComponent.$item.cols = this.$options.defaultItemCols;
353
+ itemComponent.item.cols = itemComponent.$item.cols;
354
+ itemComponent.itemChanged();
355
+ }
356
+ if (itemComponent.$item.rows === undefined) {
357
+ itemComponent.$item.rows = this.$options.defaultItemRows;
358
+ itemComponent.item.rows = itemComponent.$item.rows;
359
+ itemComponent.itemChanged();
360
+ }
361
+ if (itemComponent.$item.x === -1 || itemComponent.$item.y === -1) {
362
+ this.autoPositionItem(itemComponent);
363
+ }
364
+ else if (this.checkCollision(itemComponent.$item)) {
365
+ if (!this.$options.disableWarnings) {
366
+ itemComponent.notPlaced = true;
367
+ console.warn('Can\'t be placed in the bounds of the dashboard, trying to auto position!/n' +
368
+ JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
369
+ }
370
+ if (!this.$options.disableAutoPositionOnConflict) {
371
+ this.autoPositionItem(itemComponent);
372
+ }
373
+ else {
374
+ itemComponent.notPlaced = true;
375
+ }
376
+ }
377
+ this.grid.push(itemComponent);
378
+ this.calculateLayoutDebounce();
379
+ }
380
+ /**
381
+ * @param {?} itemComponent
382
+ * @return {?}
383
+ */
384
+ removeItem(itemComponent) {
385
+ this.grid.splice(this.grid.indexOf(itemComponent), 1);
386
+ this.calculateLayoutDebounce();
387
+ if (this.options.itemRemovedCallback) {
388
+ this.options.itemRemovedCallback(itemComponent.item, itemComponent);
389
+ }
390
+ }
391
+ /**
392
+ * @param {?} item
393
+ * @return {?}
394
+ */
395
+ checkCollision(item) {
396
+ /** @type {?} */
397
+ let collision = false;
398
+ if (this.options.itemValidateCallback) {
399
+ collision = !this.options.itemValidateCallback(item);
400
+ }
401
+ if (!collision && this.checkGridCollision(item)) {
402
+ collision = true;
403
+ }
404
+ if (!collision) {
405
+ /** @type {?} */
406
+ const c = this.findItemWithItem(item);
407
+ if (c) {
408
+ collision = c;
409
+ }
410
+ }
411
+ return collision;
412
+ }
413
+ /**
414
+ * @param {?} item
415
+ * @return {?}
416
+ */
417
+ checkGridCollision(item) {
418
+ /** @type {?} */
419
+ const noNegativePosition = item.y > -1 && item.x > -1;
420
+ /** @type {?} */
421
+ const maxGridCols = item.cols + item.x <= this.$options.maxCols;
422
+ /** @type {?} */
423
+ const maxGridRows = item.rows + item.y <= this.$options.maxRows;
424
+ /** @type {?} */
425
+ const maxItemCols = item.maxItemCols === undefined ? this.$options.maxItemCols : item.maxItemCols;
426
+ /** @type {?} */
427
+ const minItemCols = item.minItemCols === undefined ? this.$options.minItemCols : item.minItemCols;
428
+ /** @type {?} */
429
+ const maxItemRows = item.maxItemRows === undefined ? this.$options.maxItemRows : item.maxItemRows;
430
+ /** @type {?} */
431
+ const minItemRows = item.minItemRows === undefined ? this.$options.minItemRows : item.minItemRows;
432
+ /** @type {?} */
433
+ const inColsLimits = item.cols <= maxItemCols && item.cols >= minItemCols;
434
+ /** @type {?} */
435
+ const inRowsLimits = item.rows <= maxItemRows && item.rows >= minItemRows;
436
+ /** @type {?} */
437
+ const minAreaLimit = item.minItemArea === undefined ? this.$options.minItemArea : item.minItemArea;
438
+ /** @type {?} */
439
+ const maxAreaLimit = item.maxItemArea === undefined ? this.$options.maxItemArea : item.maxItemArea;
440
+ /** @type {?} */
441
+ const area = item.cols * item.rows;
442
+ /** @type {?} */
443
+ const inMinArea = minAreaLimit <= area;
444
+ /** @type {?} */
445
+ const inMaxArea = maxAreaLimit >= area;
446
+ return !(noNegativePosition && maxGridCols && maxGridRows && inColsLimits && inRowsLimits && inMinArea && inMaxArea);
447
+ }
448
+ /**
449
+ * @param {?} item
450
+ * @return {?}
451
+ */
452
+ findItemWithItem(item) {
453
+ /** @type {?} */
454
+ let widgetsIndex = this.grid.length - 1;
455
+ /** @type {?} */
456
+ let widget;
457
+ for (; widgetsIndex > -1; widgetsIndex--) {
458
+ widget = this.grid[widgetsIndex];
459
+ if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
460
+ return widget;
461
+ }
462
+ }
463
+ return false;
464
+ }
465
+ /**
466
+ * @param {?} item
467
+ * @return {?}
468
+ */
469
+ findItemsWithItem(item) {
470
+ /** @type {?} */
471
+ const a = [];
472
+ /** @type {?} */
473
+ let widgetsIndex = this.grid.length - 1;
474
+ /** @type {?} */
475
+ let widget;
476
+ for (; widgetsIndex > -1; widgetsIndex--) {
477
+ widget = this.grid[widgetsIndex];
478
+ if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
479
+ a.push(widget);
480
+ }
481
+ }
482
+ return a;
483
+ }
484
+ /**
485
+ * @param {?} itemComponent
486
+ * @return {?}
487
+ */
488
+ autoPositionItem(itemComponent) {
489
+ if (this.getNextPossiblePosition(itemComponent.$item)) {
490
+ itemComponent.notPlaced = false;
491
+ itemComponent.item.x = itemComponent.$item.x;
492
+ itemComponent.item.y = itemComponent.$item.y;
493
+ itemComponent.itemChanged();
494
+ }
495
+ else {
496
+ itemComponent.notPlaced = true;
497
+ if (!this.$options.disableWarnings) {
498
+ console.warn('Can\'t be placed in the bounds of the dashboard!/n' +
499
+ JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
500
+ }
501
+ }
502
+ }
503
+ /**
504
+ * @param {?} newItem
505
+ * @param {?=} startingFrom
506
+ * @return {?}
507
+ */
508
+ getNextPossiblePosition(newItem, startingFrom = {}) {
509
+ if (newItem.cols === -1) {
510
+ newItem.cols = this.$options.defaultItemCols;
511
+ }
512
+ if (newItem.rows === -1) {
513
+ newItem.rows = this.$options.defaultItemRows;
514
+ }
515
+ this.setGridDimensions();
516
+ /** @type {?} */
517
+ let rowsIndex = startingFrom.y || 0;
518
+ /** @type {?} */
519
+ let colsIndex;
520
+ for (; rowsIndex < this.rows; rowsIndex++) {
521
+ newItem.y = rowsIndex;
522
+ colsIndex = startingFrom.x || 0;
523
+ for (; colsIndex < this.columns; colsIndex++) {
524
+ newItem.x = colsIndex;
525
+ if (!this.checkCollision(newItem)) {
526
+ return true;
527
+ }
528
+ }
529
+ }
530
+ /** @type {?} */
531
+ const canAddToRows = this.$options.maxRows >= this.rows + newItem.rows;
532
+ /** @type {?} */
533
+ const canAddToColumns = this.$options.maxCols >= this.columns + newItem.cols;
534
+ /** @type {?} */
535
+ const addToRows = this.rows <= this.columns && canAddToRows;
536
+ if (!addToRows && canAddToColumns) {
537
+ newItem.x = this.columns;
538
+ newItem.y = 0;
539
+ return true;
540
+ }
541
+ else if (canAddToRows) {
542
+ newItem.y = this.rows;
543
+ newItem.x = 0;
544
+ return true;
545
+ }
546
+ return false;
547
+ }
548
+ /**
549
+ * @param {?} item
550
+ * @return {?}
551
+ */
552
+ getFirstPossiblePosition(item) {
553
+ /** @type {?} */
554
+ const tmpItem = Object.assign({}, item);
555
+ this.getNextPossiblePosition(tmpItem);
556
+ return tmpItem;
557
+ }
558
+ /**
559
+ * @param {?} item
560
+ * @return {?}
561
+ */
562
+ getLastPossiblePosition(item) {
563
+ /** @type {?} */
564
+ let farthestItem = { y: 0, x: 0 };
565
+ farthestItem = this.grid.reduce((/**
566
+ * @param {?} prev
567
+ * @param {?} curr
568
+ * @return {?}
569
+ */
570
+ (prev, curr) => {
571
+ /** @type {?} */
572
+ const currCoords = { y: curr.$item.y + curr.$item.rows - 1, x: curr.$item.x + curr.$item.cols - 1 };
573
+ if (GridsterUtils.compareItems(prev, currCoords) === 1) {
574
+ return currCoords;
575
+ }
576
+ else {
577
+ return prev;
578
+ }
579
+ }), farthestItem);
580
+ /** @type {?} */
581
+ const tmpItem = Object.assign({}, item);
582
+ this.getNextPossiblePosition(tmpItem, farthestItem);
583
+ return tmpItem;
584
+ }
585
+ /**
586
+ * @param {?} x
587
+ * @param {?} roundingMethod
588
+ * @param {?=} noLimit
589
+ * @return {?}
590
+ */
591
+ pixelsToPositionX(x, roundingMethod, noLimit) {
592
+ /** @type {?} */
593
+ const position = roundingMethod(x / this.curColWidth);
594
+ if (noLimit) {
595
+ return position;
596
+ }
597
+ else {
598
+ return Math.max(position, 0);
599
+ }
600
+ }
601
+ /**
602
+ * @param {?} y
603
+ * @param {?} roundingMethod
604
+ * @param {?=} noLimit
605
+ * @return {?}
606
+ */
607
+ pixelsToPositionY(y, roundingMethod, noLimit) {
608
+ /** @type {?} */
609
+ const position = roundingMethod(y / this.curRowHeight);
610
+ if (noLimit) {
611
+ return position;
612
+ }
613
+ else {
614
+ return Math.max(position, 0);
615
+ }
616
+ }
617
+ /**
618
+ * @param {?} x
619
+ * @return {?}
620
+ */
621
+ positionXToPixels(x) {
622
+ return x * this.curColWidth;
623
+ }
624
+ /**
625
+ * @param {?} y
626
+ * @return {?}
627
+ */
628
+ positionYToPixels(y) {
629
+ return y * this.curRowHeight;
630
+ }
631
+ }
632
+ GridsterComponent.decorators = [
633
+ { type: Component, args: [{
634
+ selector: 'gridster',
635
+ template: "<div class=\"gridster-column\" *ngFor=\"let column of gridColumns; let i = index;\"\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"></div>\n<div class=\"gridster-row\" *ngFor=\"let row of gridRows; let i = index;\"\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"></div>\n<ng-content></ng-content>\n<gridster-preview class=\"gridster-preview\"></gridster-preview>\n",
636
+ encapsulation: ViewEncapsulation.None,
637
+ styles: ["gridster{clear:both;position:relative;box-sizing:border-box;background:#fff;width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;overflow:auto}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;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column}gridster.mobile gridster-item{position:relative;width:100%!important;min-height:300px!important}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;-webkit-transition:.3s;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 #ccc;border-right:1px solid #ccc}gridster .gridster-row{border-top:1px solid #ccc;border-bottom:1px solid #ccc}"]
638
+ }] }
639
+ ];
640
+ /** @nocollapse */
641
+ GridsterComponent.ctorParameters = () => [
642
+ { type: ElementRef },
643
+ { type: Renderer2 },
644
+ { type: ChangeDetectorRef },
645
+ { type: NgZone }
646
+ ];
647
+ GridsterComponent.propDecorators = {
648
+ options: [{ type: Input }]
649
+ };
650
+ if (false) {
651
+ /** @type {?} */
652
+ GridsterComponent.prototype.options;
653
+ /** @type {?} */
654
+ GridsterComponent.prototype.calculateLayoutDebounce;
655
+ /** @type {?} */
656
+ GridsterComponent.prototype.movingItem;
657
+ /** @type {?} */
658
+ GridsterComponent.prototype.previewStyle;
659
+ /** @type {?} */
660
+ GridsterComponent.prototype.el;
661
+ /** @type {?} */
662
+ GridsterComponent.prototype.$options;
663
+ /** @type {?} */
664
+ GridsterComponent.prototype.mobile;
665
+ /** @type {?} */
666
+ GridsterComponent.prototype.curWidth;
667
+ /** @type {?} */
668
+ GridsterComponent.prototype.curHeight;
669
+ /** @type {?} */
670
+ GridsterComponent.prototype.grid;
671
+ /** @type {?} */
672
+ GridsterComponent.prototype.columns;
673
+ /** @type {?} */
674
+ GridsterComponent.prototype.rows;
675
+ /** @type {?} */
676
+ GridsterComponent.prototype.curColWidth;
677
+ /** @type {?} */
678
+ GridsterComponent.prototype.curRowHeight;
679
+ /** @type {?} */
680
+ GridsterComponent.prototype.gridColumns;
681
+ /** @type {?} */
682
+ GridsterComponent.prototype.gridRows;
683
+ /** @type {?} */
684
+ GridsterComponent.prototype.windowResize;
685
+ /** @type {?} */
686
+ GridsterComponent.prototype.dragInProgress;
687
+ /** @type {?} */
688
+ GridsterComponent.prototype.emptyCell;
689
+ /** @type {?} */
690
+ GridsterComponent.prototype.compact;
691
+ /** @type {?} */
692
+ GridsterComponent.prototype.gridRenderer;
693
+ /** @type {?} */
694
+ GridsterComponent.prototype.renderer;
695
+ /** @type {?} */
696
+ GridsterComponent.prototype.cdRef;
697
+ /** @type {?} */
698
+ GridsterComponent.prototype.zone;
699
+ }
700
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNjaG5laWRlcmVzcy9kYXNoYm9hcmRmcmFtZXdvcmsvIiwic291cmNlcyI6WyJncmlkc3Rlci9saWIvZ3JpZHN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFJTixTQUFTLEVBRVQsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFTOUQsTUFBTSxPQUFPLGlCQUFpQjs7Ozs7OztJQXVCNUIsWUFBWSxFQUFjLEVBQVMsUUFBbUIsRUFBUyxLQUF3QixFQUFTLElBQVk7UUFBekUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFTLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQVI1RyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBUVosSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMs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QVEsQ0FBQztTQUNqQjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7Ozs7O0lBRUQsaUJBQWlCLENBQUMsQ0FBUztRQUN6QixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBRUQsaUJBQWlCLENBQUMsQ0FBUztRQUN6QixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQy9CLENBQUM7OztZQWplRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLG1ZQUE4QjtnQkFFOUIsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O2FBQ3RDOzs7O1lBM0JDLFVBQVU7WUFNVixTQUFTO1lBUlQsaUJBQWlCO1lBSWpCLE1BQU07OztzQkEyQkwsS0FBSzs7OztJQUFOLG9DQUFpQzs7SUFDakMsb0RBQW9DOztJQUNwQyx1Q0FBZ0M7O0lBQ2hDLHlDQUF5Qjs7SUFDekIsK0JBQVE7O0lBQ1IscUNBQTBCOztJQUMxQixtQ0FBZ0I7O0lBQ2hCLHFDQUFpQjs7SUFDakIsc0NBQWtCOztJQUNsQixpQ0FBNEM7O0lBQzVDLG9DQUFnQjs7SUFDaEIsaUNBQWE7O0lBQ2Isd0NBQW9COztJQUNwQix5Q0FBcUI7O0lBQ3JCLHdDQUFpQjs7SUFDakIscUNBQWM7O0lBQ2QseUNBQWtDOztJQUNsQywyQ0FBd0I7O0lBQ3hCLHNDQUE2Qjs7SUFDN0Isb0NBQXlCOztJQUN6Qix5Q0FBK0I7O0lBRUgscUNBQTBCOztJQUFFLGtDQUErQjs7SUFBRSxpQ0FBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBHcmlkc3RlckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnLmNvbnN0YW50JztcbmltcG9ydCB7IEdyaWRzdGVyQ29uZmlnIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJVdGlscyB9IGZyb20gJy4vZ3JpZHN0ZXJVdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRzdGVyRW1wdHlDZWxsIH0gZnJvbSAnLi9ncmlkc3RlckVtcHR5Q2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRzdGVyQ29tcGFjdCB9IGZyb20gJy4vZ3JpZHN0ZXJDb21wYWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWdTIH0gZnJvbSAnLi9ncmlkc3RlckNvbmZpZ1MuaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlckl0ZW1Db21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRzdGVyUmVuZGVyZXIgfSBmcm9tICcuL2dyaWRzdGVyUmVuZGVyZXIuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkc3Rlckl0ZW0gfSBmcm9tICcuL2dyaWRzdGVySXRlbS5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdncmlkc3RlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkc3Rlci5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZHN0ZXIuY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgR3JpZHN0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IEdyaWRzdGVyQ29uZmlnO1xuICBjYWxjdWxhdGVMYXlvdXREZWJvdW5jZTogKCkgPT4gdm9pZDtcbiAgbW92aW5nSXRlbTogR3JpZHN0ZXJJdGVtIHwgbnVsbDtcbiAgcHJldmlld1N0eWxlOiAoKSA9PiB2b2lkO1xuICBlbDogYW55O1xuICAkb3B0aW9uczogR3JpZHN0ZXJDb25maWdTO1xuICBtb2JpbGU6IGJvb2xlYW47XG4gIGN1cldpZHRoOiBudW1iZXI7XG4gIGN1ckhlaWdodDogbnVtYmVyO1xuICBncmlkOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+O1xuICBjb2x1bW5zOiBudW1iZXI7XG4gIHJvd3M6IG51bWJlcjtcbiAgY3VyQ29sV2lkdGg6IG51bWJlcjtcbiAgY3VyUm93SGVpZ2h0OiBudW1iZXI7XG4gIGdyaWRDb2x1bW5zID0gW107XG4gIGdyaWRSb3dzID0gW107XG4gIHdpbmRvd1Jlc2l6ZTogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgZHJhZ0luUHJvZ3Jlc3M6IGJvb2xlYW47XG4gIGVtcHR5Q2VsbDogR3JpZHN0ZXJFbXB0eUNlbGw7XG4gIGNvbXBhY3Q6IEdyaWRzdGVyQ29tcGFjdDtcbiAgZ3JpZFJlbmRlcmVyOiBHcmlkc3RlclJlbmRlcmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmLCBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHVibGljIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIHpvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMuZWwgPSBlbC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuJG9wdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEdyaWRzdGVyQ29uZmlnU2VydmljZSkpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0RGVib3VuY2UgPSBHcmlkc3RlclV0aWxzLmRlYm91bmNlKHRoaXMuY2FsY3VsYXRlTGF5b3V0LmJpbmQodGhpcyksIDApO1xuICAgIHRoaXMubW9iaWxlID0gZmFsc2U7XG4gICAgdGhpcy5jdXJXaWR0aCA9IDA7XG4gICAgdGhpcy5jdXJIZWlnaHQgPSAwO1xuICAgIHRoaXMuZ3JpZCA9IFtdO1xuICAgIHRoaXMuY3VyQ29sV2lkdGggPSAwO1xuICAgIHRoaXMuY3VyUm93SGVpZ2h0ID0gMDtcbiAgICB0aGlzLmRyYWdJblByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5lbXB0eUNlbGwgPSBuZXcgR3JpZHN0ZXJFbXB0eUNlbGwodGhpcyk7XG4gICAgdGhpcy5jb21wYWN0ID0gbmV3IEdyaWRzdGVyQ29tcGFjdCh0aGlzKTtcbiAgICB0aGlzLmdyaWRSZW5kZXJlciA9IG5ldyBHcmlkc3RlclJlbmRlcmVyKHRoaXMpO1xuICB9XG5cbiAgc3RhdGljIGNoZWNrQ29sbGlzaW9uVHdvSXRlbXMoaXRlbTogR3JpZHN0ZXJJdGVtLCBpdGVtMjogR3JpZHN0ZXJJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGl0ZW0ueCA8IGl0ZW0yLnggKyBpdGVtMi5jb2xzXG4gICAgICAmJiBpdGVtLnggKyBpdGVtLmNvbHMgPiBpdGVtMi54XG4gICAgICAmJiBpdGVtLnkgPCBpdGVtMi55ICsgaXRlbTIucm93c1xuICAgICAgJiYgaXRlbS55ICsgaXRlbS5yb3dzID4gaXRlbTIueTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaW5pdENhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaW5pdENhbGxiYWNrKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zKSB7XG4gICAgICB0aGlzLnNldE9wdGlvbnMoKTtcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkgPSB7XG4gICAgICAgIG9wdGlvbnNDaGFuZ2VkOiB0aGlzLm9wdGlvbnNDaGFuZ2VkLmJpbmQodGhpcyksXG4gICAgICAgIHJlc2l6ZTogdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpLFxuICAgICAgICBnZXROZXh0UG9zc2libGVQb3NpdGlvbjogdGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBnZXRGaXJzdFBvc3NpYmxlUG9zaXRpb246IHRoaXMuZ2V0Rmlyc3RQb3NzaWJsZVBvc2l0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIGdldExhc3RQb3NzaWJsZVBvc2l0aW9uOiB0aGlzLmdldExhc3RQb3NzaWJsZVBvc2l0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIGdldEN1cnJlbnRSb3dIZWlnaHQ6IHRoaXMuZ2V0Q3VycmVudFJvd0hlaWdodC5iaW5kKHRoaXMpXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLiRvcHRpb25zLm1pbkNvbHM7XG4gICAgICB0aGlzLnJvd3MgPSB0aGlzLiRvcHRpb25zLm1pblJvd3M7XG4gICAgICB0aGlzLnNldEdyaWRTaXplKCk7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUxheW91dCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldEN1cnJlbnRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jdXJSb3dIZWlnaHQ7XG4gIH1cblxuICByZXNpemUoKTogdm9pZCB7XG4gICAgbGV0IGhlaWdodDtcbiAgICBsZXQgd2lkdGg7XG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuZ3JpZFR5cGUgPT09ICdmaXQnICYmICF0aGlzLm1vYmlsZSkge1xuICAgICAgd2lkdGggPSB0aGlzLmVsLm9mZnNldFdpZHRoO1xuICAgICAgaGVpZ2h0ID0gdGhpcy5lbC5vZmZzZXRIZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpZHRoID0gdGhpcy5lbC5jbGllbnRXaWR0aDtcbiAgICAgIGhlaWdodCA9IHRoaXMuZWwuY2xpZW50SGVpZ2h0O1xuICAgIH1cbiAgICBpZiAoKHdpZHRoICE9PSB0aGlzLmN1cldpZHRoIHx8IGhlaWdodCAhPT0gdGhpcy5jdXJIZWlnaHQpICYmIHRoaXMuY2hlY2tJZlRvUmVzaXplKCkpIHtcbiAgICAgIHRoaXMub25SZXNpemUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuJG9wdGlvbnMgPSBHcmlkc3RlclV0aWxzLm1lcmdlKHRoaXMuJG9wdGlvbnMsIHRoaXMub3B0aW9ucywgdGhpcy4kb3B0aW9ucyk7XG4gICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVXaW5kb3dSZXNpemUgJiYgIXRoaXMud2luZG93UmVzaXplKSB7XG4gICAgICB0aGlzLndpbmRvd1Jlc2l6ZSA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAncmVzaXplJywgdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJG9wdGlvbnMuZGlzYWJsZVdpbmRvd1Jlc2l6ZSAmJiB0aGlzLndpbmRvd1Jlc2l6ZSkge1xuICAgICAgdGhpcy53aW5kb3dSZXNpemUoKTtcbiAgICAgIHRoaXMud2luZG93UmVzaXplID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5lbXB0eUNlbGwudXBkYXRlT3B0aW9ucygpO1xuICB9XG5cbiAgb3B0aW9uc0NoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRPcHRpb25zKCk7XG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDEsIHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPj0gMDsgd2lkZ2V0c0luZGV4LS0pIHtcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xuICAgICAgd2lkZ2V0LnVwZGF0ZU9wdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZSkge1xuICAgICAgdGhpcy53aW5kb3dSZXNpemUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZXN0cm95Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0cm95Q2FsbGJhY2sodGhpcyk7XG4gICAgfVxuICAgIC8vaWYgKHRoaXMub3B0aW9ucy5hcGkpIHtcbiAgICAvKiB0aGlzLm9wdGlvbnMuYXBpIGdldHRpbmcgdW5kZWZpbmVkIGZvciBuZXcgZGFzaGJvYXJkIGxvYWQtIHRlbXAgZml4XG4gICAgKiAgb24gbmV3IGRhc2hib2FyZCBhcmVhIGxvYWQsIG9sZCBkYXNoYm9hcmQgYXJlYSBnZXRzIGRlc3Ryb3llZCwgYnV0IHRoYXQgbGVhZHMgdG8gXG4gICAgKiAgb25kZXN0cm95IG9mIGN1cnJlbnQgdGhpcy5vcHRpb25zLmFwaSBpbnN0YW5jZSAtIG5lZWRzIHRvIGludmVzdGlnYXRlIGZ1cnRoZXJcbiAgICAqL1xuICAgIGlmIChmYWxzZSkge1xuICAgICAgdGhpcy5vcHRpb25zLmFwaS5yZXNpemUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9wdGlvbnMuYXBpLm9wdGlvbnNDaGFuZ2VkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vcHRpb25zLmFwaS5nZXROZXh0UG9zc2libGVQb3NpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuZW1wdHlDZWxsLmRlc3Ryb3koKTtcbiAgICBkZWxldGUgdGhpcy5lbXB0eUNlbGw7XG4gICAgdGhpcy5jb21wYWN0LmRlc3Ryb3koKTtcbiAgICBkZWxldGUgdGhpcy5jb21wYWN0O1xuICB9XG5cbiAgb25SZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRHcmlkU2l6ZSgpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGF5b3V0KCk7XG4gIH1cblxuICBjaGVja0lmVG9SZXNpemUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xpZW50V2lkdGggPSB0aGlzLmVsLmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IG9mZnNldFdpZHRoID0gdGhpcy5lbC5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBzY3JvbGxXaWR0aCA9IHRoaXMuZWwuc2Nyb2xsV2lkdGg7XG4gICAgY29uc3QgY2xpZW50SGVpZ2h0ID0gdGhpcy5lbC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3Qgb2Zmc2V0SGVpZ2h0ID0gdGhpcy5lbC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5lbC5zY3JvbGxIZWlnaHQ7XG4gICAgY29uc3QgdmVydGljYWxTY3JvbGxQcmVzZW50ID0gY2xpZW50V2lkdGggPCBvZmZzZXRXaWR0aCAmJiBzY3JvbGxIZWlnaHQgPiBvZmZzZXRIZWlnaHRcbiAgICAgICYmIHNjcm9sbEhlaWdodCAtIG9mZnNldEhlaWdodCA8IG9mZnNldFdpZHRoIC0gY2xpZW50V2lkdGg7XG4gICAgY29uc3QgaG9yaXpvbnRhbFNjcm9sbFByZXNlbnQgPSBjbGllbnRIZWlnaHQgPCBvZmZzZXRIZWlnaHRcbiAgICAgICYmIHNjcm9sbFdpZHRoID4gb2Zmc2V0V2lkdGggJiYgc2Nyb2xsV2lkdGggLSBvZmZzZXRXaWR0aCA8IG9mZnNldEhlaWdodCAtIGNsaWVudEhlaWdodDtcbiAgICBpZiAodmVydGljYWxTY3JvbGxQcmVzZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhaG9yaXpvbnRhbFNjcm9sbFByZXNlbnQ7XG4gIH1cblxuICBzZXRHcmlkU2l6ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuZWw7XG4gICAgbGV0IHdpZHRoID0gZWwuY2xpZW50V2lkdGg7XG4gICAgbGV0IGhlaWdodCA9IGVsLmNsaWVudEhlaWdodDtcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5zZXRHcmlkU2l6ZSB8fCB0aGlzLiRvcHRpb25zLmdyaWRUeXBlID09PSAnZml0JyAmJiAhdGhpcy5tb2JpbGUpIHtcbiAgICAgIHdpZHRoID0gZWwub2Zmc2V0V2lkdGg7XG4gICAgICBoZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpZHRoID0gZWwuY2xpZW50V2lkdGg7XG4gICAgICBoZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMuY3VyV2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmN1ckhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIHNldEdyaWREaW1lbnNpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0R3JpZFNpemUoKTtcbiAgICBpZiAoIXRoaXMubW9iaWxlICYmIHRoaXMuJG9wdGlvbnMubW9iaWxlQnJlYWtwb2ludCA+IHRoaXMuY3VyV2lkdGgpIHtcbiAgICAgIHRoaXMubW9iaWxlID0gIXRoaXMubW9iaWxlO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnbW9iaWxlJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vYmlsZSAmJiB0aGlzLiRvcHRpb25zLm1vYmlsZUJyZWFrcG9pbnQgPCB0aGlzLmN1cldpZHRoKSB7XG4gICAgICB0aGlzLm1vYmlsZSA9ICF0aGlzLm1vYmlsZTtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbCwgJ21vYmlsZScpO1xuICAgIH1cbiAgICBsZXQgcm93cyA9IHRoaXMuJG9wdGlvbnMubWluUm93cywgY29sdW1ucyA9IHRoaXMuJG9wdGlvbnMubWluQ29scztcblxuICAgIGxldCB3aWRnZXRzSW5kZXggPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0O1xuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPj0gMDsgd2lkZ2V0c0luZGV4LS0pIHtcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xuICAgICAgaWYgKCF3aWRnZXQubm90UGxhY2VkKSB7XG4gICAgICAgIHJvd3MgPSBNYXRoLm1heChyb3dzLCB3aWRnZXQuJGl0ZW0ueSArIHdpZGdldC4kaXRlbS5yb3dzKTtcbiAgICAgICAgY29sdW1ucyA9IE1hdGgubWF4KGNvbHVtbnMsIHdpZGdldC4kaXRlbS54ICsgd2lkZ2V0LiRpdGVtLmNvbHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbHVtbnMgIT09IGNvbHVtbnMgfHwgdGhpcy5yb3dzICE9PSByb3dzKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgICAgdGhpcy5yb3dzID0gcm93cztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFNpemVDaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmdyaWRTaXplQ2hhbmdlZENhbGxiYWNrKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZUxheW91dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb21wYWN0KSB7XG4gICAgICB0aGlzLmNvbXBhY3QuY2hlY2tDb21wYWN0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRHcmlkRGltZW5zaW9ucygpO1xuICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luKSB7XG4gICAgICBsZXQgbWFyZ2luV2lkdGggPSAtdGhpcy4kb3B0aW9ucy5tYXJnaW47XG4gICAgICBpZiAodGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQgIT09IG51bGwpIHtcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctbGVmdCcsIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0ICsgJ3B4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1sZWZ0JywgdGhpcy4kb3B0aW9ucy5tYXJnaW4gKyAncHgnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQgIT09IG51bGwpIHtcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblJpZ2h0O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXJpZ2h0JywgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblJpZ2h0ICsgJ3B4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1yaWdodCcsIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLmN1ckNvbFdpZHRoID0gKHRoaXMuY3VyV2lkdGggLSBtYXJnaW5XaWR0aCkgLyB0aGlzLmNvbHVtbnM7XG4gICAgICBsZXQgbWFyZ2luSGVpZ2h0ID0gLXRoaXMuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Ub3AgIT09IG51bGwpIHtcbiAgICAgICAgbWFyZ2luSGVpZ2h0ICs9IHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Ub3A7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctdG9wJywgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcCArICdweCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFyZ2luSGVpZ2h0ICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXRvcCcsIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4Jyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkJvdHRvbSAhPT0gbnVsbCkge1xuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkJvdHRvbTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1ib3R0b20nLCB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICsgJ3B4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctYm90dG9tJywgdGhpcy4kb3B0aW9ucy5tYXJnaW4gKyAncHgnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VyUm93SGVpZ2h0ID0gKHRoaXMuY3VySGVpZ2h0IC0gbWFyZ2luSGVpZ2h0KSAvIHRoaXMucm93cztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJDb2xXaWR0aCA9ICh0aGlzLmN1cldpZHRoICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4pIC8gdGhpcy5jb2x1bW5zO1xuICAgICAgdGhpcy5jdXJSb3dIZWlnaHQgPSAodGhpcy5jdXJIZWlnaHQgKyB0aGlzLiRvcHRpb25zLm1hcmdpbikgLyB0aGlzLnJvd3M7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWxlZnQnLCAwICsgJ3B4Jyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXJpZ2h0JywgMCArICdweCcpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy10b3AnLCAwICsgJ3B4Jyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWJvdHRvbScsIDAgKyAncHgnKTtcbiAgICB9XG4gICAgdGhpcy5ncmlkUmVuZGVyZXIudXBkYXRlR3JpZHN0ZXIoKTtcblxuICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuc2V0R3JpZFNpemUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3dpZHRoJywgKHRoaXMuY29sdW1ucyAqIHRoaXMuY3VyQ29sV2lkdGggKyB0aGlzLiRvcHRpb25zLm1hcmdpbikgKyAncHgnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ2hlaWdodCcsICh0aGlzLnJvd3MgKiB0aGlzLmN1clJvd0hlaWdodCArIHRoaXMuJG9wdGlvbnMubWFyZ2luKSArICdweCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICd3aWR0aCcsICcnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ2hlaWdodCcsICcnKTtcbiAgICB9XG5cbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+PSAwOyB3aWRnZXRzSW5kZXgtLSkge1xuICAgICAgd2lkZ2V0ID0gdGhpcy5ncmlkW3dpZGdldHNJbmRleF07XG4gICAgICB3aWRnZXQuc2V0U2l6ZSgpO1xuICAgICAgd2lkZ2V0LmRyYWcudG9nZ2xlKCk7XG4gICAgICB3aWRnZXQucmVzaXplLnRvZ2dsZSgpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQodGhpcy5yZXNpemUuYmluZCh0aGlzKSwgMTAwKTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuZGlzcGxheUdyaWQgPT09ICdhbHdheXMnICYmICF0aGlzLm1vYmlsZSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnZGlzcGxheS1ncmlkJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiRvcHRpb25zLmRpc3BsYXlHcmlkID09PSAnb25EcmFnJlJlc2l6ZScgJiYgdGhpcy5kcmFnSW5Qcm9ncmVzcykge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnZGlzcGxheS1ncmlkJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiRvcHRpb25zLmRpc3BsYXlHcmlkID09PSAnbm9uZScgfHwgIXRoaXMuZHJhZ0luUHJvZ3Jlc3MgfHwgdGhpcy5tb2JpbGUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbCwgJ2Rpc3BsYXktZ3JpZCcpO1xuICAgIH1cbiAgICB0aGlzLnNldEdyaWREaW1lbnNpb25zKCk7XG4gICAgdGhpcy5ncmlkQ29sdW1ucy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmNvbHVtbnMsIE1hdGguZmxvb3IodGhpcy5jdXJXaWR0aCAvIHRoaXMuY3VyQ29sV2lkdGgpKSB8fCAwO1xuICAgIHRoaXMuZ3JpZFJvd3MubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5yb3dzLCBNYXRoLmZsb29yKHRoaXMuY3VySGVpZ2h0IC8gdGhpcy5jdXJSb3dIZWlnaHQpKSB8fCAwO1xuICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBhZGRJdGVtKGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xuICAgIGlmIChpdGVtQ29tcG9uZW50LiRpdGVtLmNvbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaXRlbUNvbXBvbmVudC4kaXRlbS5jb2xzID0gdGhpcy4kb3B0aW9ucy5kZWZhdWx0SXRlbUNvbHM7XG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0uY29scyA9IGl0ZW1Db21wb25lbnQuJGl0ZW0uY29scztcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbUNoYW5nZWQoKTtcbiAgICB9XG4gICAgaWYgKGl0ZW1Db21wb25lbnQuJGl0ZW0ucm93cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpdGVtQ29tcG9uZW50LiRpdGVtLnJvd3MgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtUm93cztcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS5yb3dzID0gaXRlbUNvbXBvbmVudC4kaXRlbS5yb3dzO1xuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoaXRlbUNvbXBvbmVudC4kaXRlbS54ID09PSAtMSB8fCBpdGVtQ29tcG9uZW50LiRpdGVtLnkgPT09IC0xKSB7XG4gICAgICB0aGlzLmF1dG9Qb3NpdGlvbkl0ZW0oaXRlbUNvbXBvbmVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrQ29sbGlzaW9uKGl0ZW1Db21wb25lbnQuJGl0ZW0pKSB7XG4gICAgICBpZiAoIXRoaXMuJG9wdGlvbnMuZGlzYWJsZVdhcm5pbmdzKSB7XG4gICAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5cXCd0IGJlIHBsYWNlZCBpbiB0aGUgYm91bmRzIG9mIHRoZSBkYXNoYm9hcmQsIHRyeWluZyB0byBhdXRvIHBvc2l0aW9uIS9uJyArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbXBvbmVudC5pdGVtLCBbJ2NvbHMnLCAncm93cycsICd4JywgJ3knXSkpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVBdXRvUG9zaXRpb25PbkNvbmZsaWN0KSB7XG4gICAgICAgIHRoaXMuYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5ncmlkLnB1c2goaXRlbUNvbXBvbmVudCk7XG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXREZWJvdW5jZSgpO1xuICB9XG5cbiAgcmVtb3ZlSXRlbShpdGVtQ29tcG9uZW50OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiB2b2lkIHtcbiAgICB0aGlzLmdyaWQuc3BsaWNlKHRoaXMuZ3JpZC5pbmRleE9mKGl0ZW1Db21wb25lbnQpLCAxKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dERlYm91bmNlKCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pdGVtUmVtb3ZlZENhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaXRlbVJlbW92ZWRDYWxsYmFjayhpdGVtQ29tcG9uZW50Lml0ZW0sIGl0ZW1Db21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrQ29sbGlzaW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4ge1xuICAgIGxldCBjb2xsaXNpb246IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5vcHRpb25zLml0ZW1WYWxpZGF0ZUNhbGxiYWNrKSB7XG4gICAgICBjb2xsaXNpb24gPSAhdGhpcy5vcHRpb25zLml0ZW1WYWxpZGF0ZUNhbGxiYWNrKGl0ZW0pO1xuICAgIH1cbiAgICBpZiAoIWNvbGxpc2lvbiAmJiB0aGlzLmNoZWNrR3JpZENvbGxpc2lvbihpdGVtKSkge1xuICAgICAgY29sbGlzaW9uID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFjb2xsaXNpb24pIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmZpbmRJdGVtV2l0aEl0ZW0oaXRlbSk7XG4gICAgICBpZiAoYykge1xuICAgICAgICBjb2xsaXNpb24gPSBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGlzaW9uO1xuICB9XG5cbiAgY2hlY2tHcmlkQ29sbGlzaW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vTmVnYXRpdmVQb3NpdGlvbiA9IGl0ZW0ueSA+IC0xICYmIGl0ZW0ueCA+IC0xO1xuICAgIGNvbnN0IG1heEdyaWRDb2xzID0gaXRlbS5jb2xzICsgaXRlbS54IDw9IHRoaXMuJG9wdGlvbnMubWF4Q29scztcbiAgICBjb25zdCBtYXhHcmlkUm93cyA9IGl0ZW0ucm93cyArIGl0ZW0ueSA8PSB0aGlzLiRvcHRpb25zLm1heFJvd3M7XG4gICAgY29uc3QgbWF4SXRlbUNvbHMgPSBpdGVtLm1heEl0ZW1Db2xzID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1Db2xzIDogaXRlbS5tYXhJdGVtQ29scztcbiAgICBjb25zdCBtaW5JdGVtQ29scyA9IGl0ZW0ubWluSXRlbUNvbHMgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWluSXRlbUNvbHMgOiBpdGVtLm1pbkl0ZW1Db2xzO1xuICAgIGNvbnN0IG1heEl0ZW1Sb3dzID0gaXRlbS5tYXhJdGVtUm93cyA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5tYXhJdGVtUm93cyA6IGl0ZW0ubWF4SXRlbVJvd3M7XG4gICAgY29uc3QgbWluSXRlbVJvd3MgPSBpdGVtLm1pbkl0ZW1Sb3dzID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1pbkl0ZW1Sb3dzIDogaXRlbS5taW5JdGVtUm93cztcbiAgICBjb25zdCBpbkNvbHNMaW1pdHMgPSBpdGVtLmNvbHMgPD0gbWF4SXRlbUNvbHMgJiYgaXRlbS5jb2xzID49IG1pbkl0ZW1Db2xzO1xuICAgIGNvbnN0IGluUm93c0xpbWl0cyA9IGl0ZW0ucm93cyA8PSBtYXhJdGVtUm93cyAmJiBpdGVtLnJvd3MgPj0gbWluSXRlbVJvd3M7XG4gICAgY29uc3QgbWluQXJlYUxpbWl0ID0gaXRlbS5taW5JdGVtQXJlYSA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5taW5JdGVtQXJlYSA6IGl0ZW0ubWluSXRlbUFyZWE7XG4gICAgY29uc3QgbWF4QXJlYUxpbWl0ID0gaXRlbS5tYXhJdGVtQXJlYSA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5tYXhJdGVtQXJlYSA6IGl0ZW0ubWF4SXRlbUFyZWE7XG4gICAgY29uc3QgYXJlYSA9IGl0ZW0uY29scyAqIGl0ZW0ucm93cztcbiAgICBjb25zdCBpbk1pbkFyZWEgPSBtaW5BcmVhTGltaXQgPD0gYXJlYTtcbiAgICBjb25zdCBpbk1heEFyZWEgPSBtYXhBcmVhTGltaXQgPj0gYXJlYTtcbiAgICByZXR1cm4gIShub05lZ2F0aXZlUG9zaXRpb24gJiYgbWF4R3JpZENvbHMgJiYgbWF4R3JpZFJvd3MgJiYgaW5Db2xzTGltaXRzICYmIGluUm93c0xpbWl0cyAmJiBpbk1pbkFyZWEgJiYgaW5NYXhBcmVhKTtcbiAgfVxuXG4gIGZpbmRJdGVtV2l0aEl0ZW0oaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiB7XG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDEsIHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPiAtMTsgd2lkZ2V0c0luZGV4LS0pIHtcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xuICAgICAgaWYgKHdpZGdldC4kaXRlbSAhPT0gaXRlbSAmJiBHcmlkc3RlckNvbXBvbmVudC5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKHdpZGdldC4kaXRlbSwgaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIHdpZGdldDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZmluZEl0ZW1zV2l0aEl0ZW0oaXRlbTogR3JpZHN0ZXJJdGVtKTogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiB7XG4gICAgY29uc3QgYTogQXJyYXk8R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlPiA9IFtdO1xuICAgIGxldCB3aWRnZXRzSW5kZXg6IG51bWJlciA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxLCB3aWRnZXQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID4gLTE7IHdpZGdldHNJbmRleC0tKSB7XG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcbiAgICAgIGlmICh3aWRnZXQuJGl0ZW0gIT09IGl0ZW0gJiYgR3JpZHN0ZXJDb21wb25lbnQuY2hlY2tDb2xsaXNpb25Ud29JdGVtcyh3aWRnZXQuJGl0ZW0sIGl0ZW0pKSB7XG4gICAgICAgIGEucHVzaCh3aWRnZXQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIGF1dG9Qb3NpdGlvbkl0ZW0oaXRlbUNvbXBvbmVudDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24oaXRlbUNvbXBvbmVudC4kaXRlbSkpIHtcbiAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gZmFsc2U7XG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0ueCA9IGl0ZW1Db21wb25lbnQuJGl0ZW0ueDtcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS55ID0gaXRlbUNvbXBvbmVudC4kaXRlbS55O1xuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtQ29tcG9uZW50Lm5vdFBsYWNlZCA9IHRydWU7XG4gICAgICBpZiAoIXRoaXMuJG9wdGlvbnMuZGlzYWJsZVdhcm5pbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ2FuXFwndCBiZSBwbGFjZWQgaW4gdGhlIGJvdW5kcyBvZiB0aGUgZGFzaGJvYXJkIS9uJyArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbXBvbmVudC5pdGVtLCBbJ2NvbHMnLCAncm93cycsICd4JywgJ3knXSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldE5leHRQb3NzaWJsZVBvc2l0aW9uKG5ld0l0ZW06IEdyaWRzdGVySXRlbSwgc3RhcnRpbmdGcm9tOiB7IHk/OiBudW1iZXIsIHg/OiBudW1iZXIgfSA9IHt9KTogYm9vbGVhbiB7XG4gICAgaWYgKG5ld0l0ZW0uY29scyA9PT0gLTEpIHtcbiAgICAgIG5ld0l0ZW0uY29scyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Db2xzO1xuICAgIH1cbiAgICBpZiAobmV3SXRlbS5yb3dzID09PSAtMSkge1xuICAgICAgbmV3SXRlbS5yb3dzID0gdGhpcy4kb3B0aW9ucy5kZWZhdWx0SXRlbVJvd3M7XG4gICAgfVxuICAgIHRoaXMuc2V0R3JpZERpbWVuc2lvbnMoKTtcbiAgICBsZXQgcm93c0luZGV4ID0gc3RhcnRpbmdGcm9tLnkgfHwgMCwgY29sc0luZGV4O1xuICAgIGZvciAoOyByb3dzSW5kZXggPCB0aGlzLnJvd3M7IHJvd3NJbmRleCsrKSB7XG4gICAgICBuZXdJdGVtLnkgPSByb3dzSW5kZXg7XG4gICAgICBjb2xzSW5kZXggPSBzdGFydGluZ0Zyb20ueCB8fCAwO1xuICAgICAgZm9yICg7IGNvbHNJbmRleCA8IHRoaXMuY29sdW1uczsgY29sc0luZGV4KyspIHtcbiAgICAgICAgbmV3SXRlbS54ID0gY29sc0luZGV4O1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tDb2xsaXNpb24obmV3SXRlbSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjYW5BZGRUb1Jvd3MgPSB0aGlzLiRvcHRpb25zLm1heFJvd3MgPj0gdGhpcy5yb3dzICsgbmV3SXRlbS5yb3dzO1xuICAgIGNvbnN0IGNhbkFkZFRvQ29sdW1ucyA9IHRoaXMuJG9wdGlvbnMubWF4Q29scyA+PSB0aGlzLmNvbHVtbnMgKyBuZXdJdGVtLmNvbHM7XG4gICAgY29uc3QgYWRkVG9Sb3dzID0gdGhpcy5yb3dzIDw9IHRoaXMuY29sdW1ucyAmJiBjYW5BZGRUb1Jvd3M7XG4gICAgaWYgKCFhZGRUb1Jvd3MgJiYgY2FuQWRkVG9Db2x1bW5zKSB7XG4gICAgICBuZXdJdGVtLnggPSB0aGlzLmNvbHVtbnM7XG4gICAgICBuZXdJdGVtLnkgPSAwO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChjYW5BZGRUb1Jvd3MpIHtcbiAgICAgIG5ld0l0ZW0ueSA9IHRoaXMucm93cztcbiAgICAgIG5ld0l0ZW0ueCA9IDA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0Rmlyc3RQb3NzaWJsZVBvc2l0aW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbSB7XG4gICAgY29uc3QgdG1wSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xuICAgIHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24odG1wSXRlbSk7XG4gICAgcmV0dXJuIHRtcEl0ZW07XG4gIH1cblxuICBnZXRMYXN0UG9zc2libGVQb3NpdGlvbihpdGVtOiBHcmlkc3Rlckl0ZW0pOiBHcmlkc3Rlckl0ZW0ge1xuICAgIGxldCBmYXJ0aGVzdEl0ZW06IHsgeTogbnVtYmVyLCB4OiBudW1iZXIgfSA9IHsgeTogMCwgeDogMCB9O1xuICAgIGZhcnRoZXN0SXRlbSA9IHRoaXMuZ3JpZC5yZWR1Y2UoKHByZXY6IGFueSwgY3VycjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKSA9PiB7XG4gICAgICBjb25zdCBjdXJyQ29vcmRzID0geyB5OiBjdXJyLiRpdGVtLnkgKyBjdXJyLiRpdGVtLnJvd3MgLSAxLCB4OiBjdXJyLiRpdGVtLnggKyBjdXJyLiRpdGVtLmNvbHMgLSAxIH07XG4gICAgICBpZiAoR3JpZHN0ZXJVdGlscy5jb21wYXJlSXRlbXMocHJldiwgY3VyckNvb3JkcykgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJDb29yZHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH1cbiAgICB9LCBmYXJ0aGVzdEl0ZW0pO1xuXG4gICAgY29uc3QgdG1wSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xuICAgIHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24odG1wSXRlbSwgZmFydGhlc3RJdGVtKTtcbiAgICByZXR1cm4gdG1wSXRlbTtcbiAgfVxuXG4gIHBpeGVsc1RvUG9zaXRpb25YKHg6IG51bWJlciwgcm91bmRpbmdNZXRob2Q6IEZ1bmN0aW9uLCBub0xpbWl0PzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgY29uc3QgcG9zaXRpb24gPSByb3VuZGluZ01ldGhvZCh4IC8gdGhpcy5jdXJDb2xXaWR0aCk7XG4gICAgaWYgKG5vTGltaXQpIHtcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHBvc2l0aW9uLCAwKTtcbiAgICB9XG4gIH1cblxuICBwaXhlbHNUb1Bvc2l0aW9uWSh5OiBudW1iZXIsIHJvdW5kaW5nTWV0aG9kOiBGdW5jdGlvbiwgbm9MaW1pdD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gcm91bmRpbmdNZXRob2QoeSAvIHRoaXMuY3VyUm93SGVpZ2h0KTtcbiAgICBpZiAobm9MaW1pdCkge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgocG9zaXRpb24sIDApO1xuICAgIH1cbiAgfVxuXG4gIHBvc2l0aW9uWFRvUGl4ZWxzKHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmN1ckNvbFdpZHRoO1xuICB9XG5cbiAgcG9zaXRpb25ZVG9QaXhlbHMoeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4geSAqIHRoaXMuY3VyUm93SGVpZ2h0O1xuICB9XG59XG4iXX0=