@plait/core 0.54.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/board/board.component.d.ts +6 -3
  2. package/constants/index.d.ts +2 -0
  3. package/core/element/context.d.ts +6 -2
  4. package/core/element/plugin-element.d.ts +13 -4
  5. package/core/list-render.d.ts +16 -0
  6. package/esm2022/board/board.component.mjs +24 -21
  7. package/esm2022/constants/index.mjs +3 -1
  8. package/esm2022/core/element/context.mjs +1 -1
  9. package/esm2022/core/element/plugin-element.mjs +79 -12
  10. package/esm2022/core/list-render.mjs +209 -0
  11. package/esm2022/interfaces/board.mjs +3 -3
  12. package/esm2022/interfaces/element.mjs +28 -2
  13. package/esm2022/interfaces/node.mjs +18 -1
  14. package/esm2022/interfaces/path.mjs +56 -57
  15. package/esm2022/plugins/create-board.mjs +10 -10
  16. package/esm2022/plugins/with-hotkey.mjs +32 -3
  17. package/esm2022/plugins/with-moving.mjs +12 -12
  18. package/esm2022/plugins/with-related-fragment.mjs +5 -5
  19. package/esm2022/public-api.mjs +1 -3
  20. package/esm2022/transforms/group.mjs +23 -6
  21. package/esm2022/transforms/index.mjs +6 -3
  22. package/esm2022/transforms/z-index.mjs +20 -0
  23. package/esm2022/utils/angle.mjs +17 -3
  24. package/esm2022/utils/clipboard/clipboard.mjs +5 -5
  25. package/esm2022/utils/clipboard/common.mjs +5 -5
  26. package/esm2022/utils/clipboard/types.mjs +1 -1
  27. package/esm2022/utils/common.mjs +27 -1
  28. package/esm2022/utils/fragment.mjs +20 -1
  29. package/esm2022/utils/group.mjs +27 -1
  30. package/esm2022/utils/helper.mjs +37 -1
  31. package/esm2022/utils/index.mjs +4 -1
  32. package/esm2022/utils/math.mjs +37 -1
  33. package/esm2022/utils/position.mjs +3 -3
  34. package/esm2022/utils/snap/snap-moving.mjs +199 -0
  35. package/esm2022/utils/snap/snap.mjs +208 -0
  36. package/esm2022/utils/to-image.mjs +2 -2
  37. package/esm2022/utils/weak-maps.mjs +3 -1
  38. package/esm2022/utils/z-index.mjs +166 -0
  39. package/fesm2022/plait-core.mjs +1655 -1080
  40. package/fesm2022/plait-core.mjs.map +1 -1
  41. package/interfaces/board.d.ts +5 -5
  42. package/interfaces/element.d.ts +5 -0
  43. package/interfaces/node.d.ts +1 -0
  44. package/package.json +1 -1
  45. package/public-api.d.ts +0 -2
  46. package/styles/styles.scss +9 -0
  47. package/transforms/group.d.ts +4 -0
  48. package/transforms/index.d.ts +3 -2
  49. package/transforms/z-index.d.ts +13 -0
  50. package/utils/angle.d.ts +2 -0
  51. package/utils/clipboard/common.d.ts +1 -1
  52. package/utils/clipboard/types.d.ts +1 -1
  53. package/utils/common.d.ts +8 -0
  54. package/utils/fragment.d.ts +3 -1
  55. package/utils/group.d.ts +3 -1
  56. package/utils/helper.d.ts +4 -1
  57. package/utils/index.d.ts +3 -0
  58. package/utils/math.d.ts +1 -0
  59. package/utils/position.d.ts +1 -1
  60. package/utils/snap/snap-moving.d.ts +5 -0
  61. package/utils/snap/snap.d.ts +31 -0
  62. package/utils/weak-maps.d.ts +2 -0
  63. package/utils/z-index.d.ts +5 -0
  64. package/core/children/children.component.d.ts +0 -17
  65. package/core/children/effect.d.ts +0 -2
  66. package/core/element/element.component.d.ts +0 -30
  67. package/esm2022/core/children/children.component.mjs +0 -60
  68. package/esm2022/core/children/effect.mjs +0 -2
  69. package/esm2022/core/element/element.component.mjs +0 -105
  70. package/esm2022/utils/moving-snap.mjs +0 -372
  71. package/utils/moving-snap.d.ts +0 -41
@@ -1,372 +0,0 @@
1
- import { PlaitBoard } from '../interfaces/board';
2
- import { createG } from './dom/common';
3
- import { RectangleClient, SELECTION_BORDER_COLOR } from '../interfaces';
4
- import { depthFirstRecursion } from './tree';
5
- import { getRectangleByAngle } from './angle';
6
- const SNAP_TOLERANCE = 2;
7
- export class MovingSnapReaction {
8
- constructor(board, activeElements, activeRectangle) {
9
- this.board = board;
10
- this.activeElements = activeElements;
11
- this.activeRectangle = activeRectangle;
12
- this.alignRectangles = this.getAlignRectangle();
13
- }
14
- getAlignRectangle() {
15
- const result = [];
16
- depthFirstRecursion(this.board, node => {
17
- if (PlaitBoard.isBoard(node) || this.activeElements.some(element => node.id === element.id) || !this.board.isAlign(node)) {
18
- return;
19
- }
20
- const rectangle = this.board.getRectangle(node);
21
- rectangle && result.push(getRectangleByAngle(rectangle, node.angle) || rectangle);
22
- }, node => {
23
- if (node && (PlaitBoard.isBoard(node) || this.board.isRecursion(node))) {
24
- return true;
25
- }
26
- else {
27
- return false;
28
- }
29
- }, true);
30
- return result;
31
- }
32
- handleSnapping() {
33
- const alignRectangles = this.getAlignRectangle();
34
- const g = createG();
35
- let alignLines = [];
36
- const offset = 12;
37
- let deltaX = 0;
38
- let deltaY = 0;
39
- let isCorrectX = false;
40
- let isCorrectY = false;
41
- for (let alignRectangle of alignRectangles) {
42
- const closestDistances = this.calculateClosestDistances(this.activeRectangle, alignRectangle);
43
- let canDrawHorizontal = false;
44
- if (!isCorrectX && closestDistances.absXDistance < SNAP_TOLERANCE) {
45
- deltaX = closestDistances.xDistance;
46
- this.activeRectangle.x -= deltaX;
47
- isCorrectX = true;
48
- canDrawHorizontal = true;
49
- }
50
- if (closestDistances.absXDistance === 0) {
51
- canDrawHorizontal = true;
52
- }
53
- if (canDrawHorizontal) {
54
- const verticalY = [
55
- alignRectangle.y,
56
- alignRectangle.y + alignRectangle.height,
57
- this.activeRectangle.y,
58
- this.activeRectangle.y + this.activeRectangle.height
59
- ];
60
- const lineTopY = Math.min(...verticalY) - offset;
61
- const lineBottomY = Math.max(...verticalY) + offset;
62
- const leftLine = [this.activeRectangle.x, lineTopY, this.activeRectangle.x, lineBottomY];
63
- const middleLine = [
64
- this.activeRectangle.x + this.activeRectangle.width / 2,
65
- lineTopY,
66
- this.activeRectangle.x + this.activeRectangle.width / 2,
67
- lineBottomY
68
- ];
69
- const rightLine = [
70
- this.activeRectangle.x + this.activeRectangle.width,
71
- lineTopY,
72
- this.activeRectangle.x + this.activeRectangle.width,
73
- lineBottomY
74
- ];
75
- const shouldDrawLeftLine = closestDistances.indexX === 0 ||
76
- closestDistances.indexX === 1 ||
77
- (closestDistances.indexX === 2 && this.activeRectangle.width === alignRectangle.width);
78
- if (shouldDrawLeftLine && !alignLines[0]) {
79
- alignLines[0] = leftLine;
80
- }
81
- const shouldDrawRightLine = closestDistances.indexX === 2 ||
82
- closestDistances.indexX === 3 ||
83
- (closestDistances.indexX === 0 && this.activeRectangle.width === alignRectangle.width);
84
- if (shouldDrawRightLine && !alignLines[2]) {
85
- alignLines[2] = rightLine;
86
- }
87
- const shouldDrawMiddleLine = closestDistances.indexX === 4 || (!shouldDrawLeftLine && !shouldDrawRightLine);
88
- if (shouldDrawMiddleLine && !alignLines[1]) {
89
- alignLines[1] = middleLine;
90
- }
91
- isCorrectX = true;
92
- }
93
- let canDrawVertical = false;
94
- if (!isCorrectY && closestDistances.absYDistance < SNAP_TOLERANCE) {
95
- deltaY = closestDistances.yDistance;
96
- this.activeRectangle.y -= deltaY;
97
- isCorrectY = true;
98
- canDrawVertical = true;
99
- }
100
- if (closestDistances.absYDistance === 0) {
101
- canDrawVertical = true;
102
- }
103
- if (canDrawVertical) {
104
- const horizontalX = [
105
- alignRectangle.x,
106
- alignRectangle.x + alignRectangle.width,
107
- this.activeRectangle.x,
108
- this.activeRectangle.x + this.activeRectangle.width
109
- ];
110
- const lineLeftX = Math.min(...horizontalX) - offset;
111
- const lineRightX = Math.max(...horizontalX) + offset;
112
- const topLine = [lineLeftX, this.activeRectangle.y, lineRightX, this.activeRectangle.y];
113
- const horizontalMiddleLine = [
114
- lineLeftX,
115
- this.activeRectangle.y + this.activeRectangle.height / 2,
116
- lineRightX,
117
- this.activeRectangle.y + this.activeRectangle.height / 2
118
- ];
119
- const bottomLine = [
120
- lineLeftX,
121
- this.activeRectangle.y + this.activeRectangle.height,
122
- lineRightX,
123
- this.activeRectangle.y + this.activeRectangle.height
124
- ];
125
- const shouldDrawTopLine = closestDistances.indexY === 0 ||
126
- closestDistances.indexY === 1 ||
127
- (closestDistances.indexY === 2 && this.activeRectangle.height === alignRectangle.height);
128
- if (shouldDrawTopLine && !alignLines[3]) {
129
- alignLines[3] = topLine;
130
- }
131
- const shouldDrawBottomLine = closestDistances.indexY === 2 ||
132
- closestDistances.indexY === 3 ||
133
- (closestDistances.indexY === 0 && this.activeRectangle.width === alignRectangle.width);
134
- if (shouldDrawBottomLine && !alignLines[5]) {
135
- alignLines[5] = bottomLine;
136
- }
137
- const shouldDrawMiddleLine = closestDistances.indexY === 4 || (!shouldDrawTopLine && !shouldDrawBottomLine);
138
- if (shouldDrawMiddleLine && !alignLines[4]) {
139
- alignLines[4] = horizontalMiddleLine;
140
- }
141
- }
142
- }
143
- const alignDeltaX = deltaX;
144
- const alignDeltaY = deltaY;
145
- this.activeRectangle.x += deltaX;
146
- this.activeRectangle.y += deltaY;
147
- const distributeHorizontalResult = this.alignDistribute(alignRectangles, true);
148
- const distributeVerticalResult = this.alignDistribute(alignRectangles, false);
149
- const distributeLines = [...distributeHorizontalResult.distributeLines, ...distributeVerticalResult.distributeLines];
150
- if (distributeHorizontalResult.delta) {
151
- deltaX = distributeHorizontalResult.delta;
152
- if (alignDeltaX !== deltaX) {
153
- alignLines[0] = [];
154
- alignLines[1] = [];
155
- alignLines[2] = [];
156
- }
157
- }
158
- if (distributeVerticalResult.delta) {
159
- deltaY = distributeVerticalResult.delta;
160
- if (alignDeltaY !== deltaY) {
161
- alignLines[3] = [];
162
- alignLines[4] = [];
163
- alignLines[5] = [];
164
- }
165
- }
166
- if (alignLines.length) {
167
- this.drawAlignLines(alignLines, g);
168
- }
169
- if (distributeLines.length) {
170
- this.drawDistributeLines(distributeLines, g);
171
- }
172
- return { deltaX, deltaY, g };
173
- }
174
- calculateClosestDistances(activeRectangle, alignRectangle) {
175
- const activeRectangleCenter = [activeRectangle.x + activeRectangle.width / 2, activeRectangle.y + activeRectangle.height / 2];
176
- const alignRectangleCenter = [alignRectangle.x + alignRectangle.width / 2, alignRectangle.y + alignRectangle.height / 2];
177
- const centerXDistance = activeRectangleCenter[0] - alignRectangleCenter[0];
178
- const centerYDistance = activeRectangleCenter[1] - alignRectangleCenter[1];
179
- const leftToLeft = activeRectangle.x - alignRectangle.x;
180
- const leftToRight = activeRectangle.x - (alignRectangle.x + alignRectangle.width);
181
- const rightToRight = activeRectangle.x + activeRectangle.width - (alignRectangle.x + alignRectangle.width);
182
- const rightToLeft = activeRectangle.x + activeRectangle.width - alignRectangle.x;
183
- const topToTop = activeRectangle.y - alignRectangle.y;
184
- const topToBottom = activeRectangle.y - (alignRectangle.y + alignRectangle.height);
185
- const bottomToTop = activeRectangle.y + activeRectangle.height - alignRectangle.y;
186
- const bottomToBottom = activeRectangle.y + activeRectangle.height - (alignRectangle.y + alignRectangle.height);
187
- const xDistances = [leftToLeft, leftToRight, rightToRight, rightToLeft, centerXDistance];
188
- const yDistances = [topToTop, topToBottom, bottomToBottom, bottomToTop, centerYDistance];
189
- const xDistancesAbs = xDistances.map(distance => Math.abs(distance));
190
- const yDistancesAbs = yDistances.map(distance => Math.abs(distance));
191
- const indexX = xDistancesAbs.indexOf(Math.min(...xDistancesAbs));
192
- const indexY = yDistancesAbs.indexOf(Math.min(...yDistancesAbs));
193
- return {
194
- absXDistance: xDistancesAbs[indexX],
195
- xDistance: xDistances[indexX],
196
- absYDistance: yDistancesAbs[indexY],
197
- yDistance: yDistances[indexY],
198
- indexX,
199
- indexY
200
- };
201
- }
202
- alignDistribute(alignRectangles, isHorizontal) {
203
- let distributeLines = [];
204
- let delta = 0;
205
- let rectangles = [];
206
- const axis = isHorizontal ? 'x' : 'y';
207
- const side = isHorizontal ? 'width' : 'height';
208
- const activeRectangleCenter = this.activeRectangle[axis] + this.activeRectangle[side] / 2;
209
- alignRectangles.forEach(rec => {
210
- const isCross = isHorizontal ? isHorizontalCross(rec, this.activeRectangle) : isVerticalCross(rec, this.activeRectangle);
211
- if (isCross && !RectangleClient.isHit(rec, this.activeRectangle)) {
212
- rectangles.push(rec);
213
- }
214
- });
215
- rectangles = [...rectangles, this.activeRectangle].sort((a, b) => a[axis] - b[axis]);
216
- const refArray = [];
217
- let distributeDistance = 0;
218
- let beforeIndex = undefined;
219
- let afterIndex = undefined;
220
- for (let i = 0; i < rectangles.length; i++) {
221
- for (let j = i + 1; j < rectangles.length; j++) {
222
- const before = rectangles[i];
223
- const after = rectangles[j];
224
- const distance = after[axis] - (before[axis] + before[side]);
225
- let dif = Infinity;
226
- if (refArray[i]?.after) {
227
- refArray[i].after.push({ distance, index: j });
228
- }
229
- else {
230
- refArray[i] = { ...refArray[i], after: [{ distance, index: j }] };
231
- }
232
- if (refArray[j]?.before) {
233
- refArray[j].before.push({ distance, index: i });
234
- }
235
- else {
236
- refArray[j] = { ...refArray[j], before: [{ distance, index: i }] };
237
- }
238
- //middle
239
- let _center = (before[axis] + before[side] + after[axis]) / 2;
240
- dif = Math.abs(activeRectangleCenter - _center);
241
- if (dif < SNAP_TOLERANCE) {
242
- distributeDistance = (after[axis] - (before[axis] + before[side]) - this.activeRectangle[side]) / 2;
243
- delta = activeRectangleCenter - _center;
244
- beforeIndex = i;
245
- afterIndex = j;
246
- }
247
- //after
248
- const distanceRight = after[axis] - (before[axis] + before[side]);
249
- _center = after[axis] + after[side] + distanceRight + this.activeRectangle[side] / 2;
250
- dif = Math.abs(activeRectangleCenter - _center);
251
- if (!distributeDistance && dif < SNAP_TOLERANCE) {
252
- distributeDistance = distanceRight;
253
- beforeIndex = j;
254
- delta = activeRectangleCenter - _center;
255
- }
256
- //before
257
- const distanceBefore = after[axis] - (before[axis] + before[side]);
258
- _center = before[axis] - distanceBefore - this.activeRectangle[side] / 2;
259
- dif = Math.abs(activeRectangleCenter - _center);
260
- if (!distributeDistance && dif < SNAP_TOLERANCE) {
261
- distributeDistance = distanceBefore;
262
- afterIndex = i;
263
- delta = activeRectangleCenter - _center;
264
- }
265
- }
266
- }
267
- const activeIndex = rectangles.indexOf(this.activeRectangle);
268
- let beforeIndexes = [];
269
- let afterIndexes = [];
270
- if (beforeIndex !== undefined) {
271
- beforeIndexes.push(beforeIndex);
272
- findRectangle(distributeDistance, refArray[beforeIndex], 'before', beforeIndexes);
273
- }
274
- if (afterIndex !== undefined) {
275
- afterIndexes.push(afterIndex);
276
- findRectangle(distributeDistance, refArray[afterIndex], 'after', afterIndexes);
277
- }
278
- if (beforeIndexes.length || afterIndexes.length) {
279
- const indexArr = [...beforeIndexes.reverse(), activeIndex, ...afterIndexes];
280
- this.activeRectangle[axis] -= delta;
281
- for (let i = 1; i < indexArr.length; i++) {
282
- distributeLines.push(getLinePoints(rectangles[indexArr[i - 1]], rectangles[indexArr[i]]));
283
- }
284
- }
285
- function findRectangle(distance, ref, direction, rectangleIndexes) {
286
- const arr = ref[direction];
287
- const index = refArray.indexOf(ref);
288
- if ((index === 0 && direction === 'before') || (index === refArray.length - 1 && direction === 'after'))
289
- return;
290
- for (let i = 0; i < arr.length; i++) {
291
- if (Math.abs(arr[i].distance - distance) < 0.1) {
292
- rectangleIndexes.push(arr[i].index);
293
- findRectangle(distance, refArray[arr[i].index], direction, rectangleIndexes);
294
- return;
295
- }
296
- }
297
- }
298
- function getLinePoints(beforeRectangle, afterRectangle) {
299
- const oppositeAxis = axis === 'x' ? 'y' : 'x';
300
- const oppositeSide = side === 'width' ? 'height' : 'width';
301
- const align = [
302
- beforeRectangle[oppositeAxis],
303
- beforeRectangle[oppositeAxis] + beforeRectangle[oppositeSide],
304
- afterRectangle[oppositeAxis],
305
- afterRectangle[oppositeAxis] + afterRectangle[oppositeSide]
306
- ];
307
- const sortArr = align.sort((a, b) => a - b);
308
- const average = (sortArr[1] + sortArr[2]) / 2;
309
- const offset = 3;
310
- return isHorizontal
311
- ? [
312
- [beforeRectangle.x + beforeRectangle.width + offset, average],
313
- [afterRectangle.x - offset, average]
314
- ]
315
- : [
316
- [average, beforeRectangle.y + beforeRectangle.height + offset],
317
- [average, afterRectangle.y - offset]
318
- ];
319
- }
320
- return { delta, distributeLines };
321
- }
322
- drawAlignLines(lines, g) {
323
- lines.forEach(points => {
324
- if (!points.length)
325
- return;
326
- const xAlign = PlaitBoard.getRoughSVG(this.board).line(points[0], points[1], points[2], points[3], {
327
- stroke: SELECTION_BORDER_COLOR,
328
- strokeWidth: 1,
329
- strokeLineDash: [4, 4]
330
- });
331
- g.appendChild(xAlign);
332
- });
333
- }
334
- drawDistributeLines(lines, g) {
335
- lines.forEach(line => {
336
- if (!line.length)
337
- return;
338
- let isHorizontal = line[0][1] === line[1][1];
339
- const yAlign = PlaitBoard.getRoughSVG(this.board).line(line[0][0], line[0][1], line[1][0], line[1][1], {
340
- stroke: SELECTION_BORDER_COLOR,
341
- strokeWidth: 1
342
- });
343
- g.appendChild(yAlign);
344
- line.forEach(point => {
345
- const barPoint = getBarPoint(point, isHorizontal);
346
- const bar = PlaitBoard.getRoughSVG(this.board).line(barPoint[0][0], barPoint[0][1], barPoint[1][0], barPoint[1][1], {
347
- stroke: SELECTION_BORDER_COLOR,
348
- strokeWidth: 1
349
- });
350
- g.appendChild(bar);
351
- });
352
- });
353
- }
354
- }
355
- function isHorizontalCross(rectangle, other) {
356
- return !(rectangle.y + rectangle.height < other.y || rectangle.y > other.y + other.height);
357
- }
358
- function isVerticalCross(rectangle, other) {
359
- return !(rectangle.x + rectangle.width < other.x || rectangle.x > other.x + other.width);
360
- }
361
- function getBarPoint(point, isHorizontal) {
362
- return isHorizontal
363
- ? [
364
- [point[0], point[1] - 4],
365
- [point[0], point[1] + 4]
366
- ]
367
- : [
368
- [point[0] - 4, point[1]],
369
- [point[0] + 4, point[1]]
370
- ];
371
- }
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92aW5nLXNuYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy9tb3Zpbmctc25hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd2QyxPQUFPLEVBQVMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFhOUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCLE1BQU0sT0FBTyxrQkFBa0I7SUFHM0IsWUFBb0IsS0FBaUIsRUFBVSxjQUE4QixFQUFVLGVBQWdDO1FBQW5HLFVBQUssR0FBTCxLQUFLLENBQVk7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDbkgsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsTUFBTSxNQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUNyQyxtQkFBbUIsQ0FDZixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxFQUFFO1lBQ0gsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2SCxP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SyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvYm9hcmQnO1xuaW1wb3J0IHsgY3JlYXRlRyB9IGZyb20gJy4vZG9tL2NvbW1vbic7XG5pbXBvcnQgeyBQbGFpdEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2VsZW1lbnQnO1xuaW1wb3J0IHsgQW5jZXN0b3IgfSBmcm9tICcuLi9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHsgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgU0VMRUNUSU9OX0JPUkRFUl9DT0xPUiB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZGVwdGhGaXJzdFJlY3Vyc2lvbiB9IGZyb20gJy4vdHJlZSc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeUFuZ2xlIH0gZnJvbSAnLi9hbmdsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25hcFJlZiB7XG4gICAgZGVsdGFYOiBudW1iZXI7XG4gICAgZGVsdGFZOiBudW1iZXI7XG4gICAgZzogU1ZHR0VsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzdHJpYnV0ZVJlZiB7XG4gICAgYmVmb3JlOiB7IGRpc3RhbmNlOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xuICAgIGFmdGVyOiB7IGRpc3RhbmNlOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xufVxuXG5jb25zdCBTTkFQX1RPTEVSQU5DRSA9IDI7XG5cbmV4cG9ydCBjbGFzcyBNb3ZpbmdTbmFwUmVhY3Rpb24ge1xuICAgIGFsaWduUmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJvYXJkOiBQbGFpdEJvYXJkLCBwcml2YXRlIGFjdGl2ZUVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSwgcHJpdmF0ZSBhY3RpdmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICB0aGlzLmFsaWduUmVjdGFuZ2xlcyA9IHRoaXMuZ2V0QWxpZ25SZWN0YW5nbGUoKTtcbiAgICB9XG5cbiAgICBnZXRBbGlnblJlY3RhbmdsZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWN0YW5nbGVDbGllbnRbXSA9IFtdO1xuICAgICAgICBkZXB0aEZpcnN0UmVjdXJzaW9uPEFuY2VzdG9yPihcbiAgICAgICAgICAgIHRoaXMuYm9hcmQsXG4gICAgICAgICAgICBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoUGxhaXRCb2FyZC5pc0JvYXJkKG5vZGUpIHx8IHRoaXMuYWN0aXZlRWxlbWVudHMuc29tZShlbGVtZW50ID0+IG5vZGUuaWQgPT09IGVsZW1lbnQuaWQpIHx8ICF0aGlzLmJvYXJkLmlzQWxpZ24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWN0YW5nbGUgPSB0aGlzLmJvYXJkLmdldFJlY3RhbmdsZShub2RlKTtcbiAgICAgICAgICAgICAgICByZWN0YW5nbGUgJiYgcmVzdWx0LnB1c2goZ2V0UmVjdGFuZ2xlQnlBbmdsZShyZWN0YW5nbGUsIG5vZGUuYW5nbGUpIHx8IHJlY3RhbmdsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgKFBsYWl0Qm9hcmQuaXNCb2FyZChub2RlKSB8fCB0aGlzLmJvYXJkLmlzUmVjdXJzaW9uKG5vZGUpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBoYW5kbGVTbmFwcGluZygpOiBTbmFwUmVmIHtcbiAgICAgICAgY29uc3QgYWxpZ25SZWN0YW5nbGVzID0gdGhpcy5nZXRBbGlnblJlY3RhbmdsZSgpO1xuICAgICAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgICAgICBsZXQgYWxpZ25MaW5lcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDEyO1xuICAgICAgICBsZXQgZGVsdGFYID0gMDtcbiAgICAgICAgbGV0IGRlbHRhWSA9IDA7XG4gICAgICAgIGxldCBpc0NvcnJlY3RYID0gZmFsc2U7XG4gICAgICAgIGxldCBpc0NvcnJlY3RZID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgYWxpZ25SZWN0YW5nbGUgb2YgYWxpZ25SZWN0YW5nbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjbG9zZXN0RGlzdGFuY2VzID0gdGhpcy5jYWxjdWxhdGVDbG9zZXN0RGlzdGFuY2VzKHRoaXMuYWN0aXZlUmVjdGFuZ2xlLCBhbGlnblJlY3RhbmdsZSk7XG4gICAgICAgICAgICBsZXQgY2FuRHJhd0hvcml6b250YWwgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghaXNDb3JyZWN0WCAmJiBjbG9zZXN0RGlzdGFuY2VzLmFic1hEaXN0YW5jZSA8IFNOQVBfVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gY2xvc2VzdERpc3RhbmNlcy54RGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueCAtPSBkZWx0YVg7XG4gICAgICAgICAgICAgICAgaXNDb3JyZWN0WCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FuRHJhd0hvcml6b250YWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2xvc2VzdERpc3RhbmNlcy5hYnNYRGlzdGFuY2UgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjYW5EcmF3SG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYW5EcmF3SG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsWSA9IFtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGUueSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGUueSArIGFsaWduUmVjdGFuZ2xlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLmhlaWdodFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZVRvcFkgPSBNYXRoLm1pbiguLi52ZXJ0aWNhbFkpIC0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVCb3R0b21ZID0gTWF0aC5tYXgoLi4udmVydGljYWxZKSArIG9mZnNldDtcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0TGluZSA9IFt0aGlzLmFjdGl2ZVJlY3RhbmdsZS54LCBsaW5lVG9wWSwgdGhpcy5hY3RpdmVSZWN0YW5nbGUueCwgbGluZUJvdHRvbVldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZGRsZUxpbmUgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLnggKyB0aGlzLmFjdGl2ZVJlY3RhbmdsZS53aWR0aCAvIDIsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVUb3BZLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGggLyAyLFxuICAgICAgICAgICAgICAgICAgICBsaW5lQm90dG9tWVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHRMaW5lID0gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVUb3BZLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVCb3R0b21ZXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdMZWZ0TGluZSA9XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhYID09PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhYID09PSAxIHx8XG4gICAgICAgICAgICAgICAgICAgIChjbG9zZXN0RGlzdGFuY2VzLmluZGV4WCA9PT0gMiAmJiB0aGlzLmFjdGl2ZVJlY3RhbmdsZS53aWR0aCA9PT0gYWxpZ25SZWN0YW5nbGUud2lkdGgpO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREcmF3TGVmdExpbmUgJiYgIWFsaWduTGluZXNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25MaW5lc1swXSA9IGxlZnRMaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdSaWdodExpbmUgPVxuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2VzLmluZGV4WCA9PT0gMiB8fFxuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2VzLmluZGV4WCA9PT0gMyB8fFxuICAgICAgICAgICAgICAgICAgICAoY2xvc2VzdERpc3RhbmNlcy5pbmRleFggPT09IDAgJiYgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGggPT09IGFsaWduUmVjdGFuZ2xlLndpZHRoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRHJhd1JpZ2h0TGluZSAmJiAhYWxpZ25MaW5lc1syXSkge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzJdID0gcmlnaHRMaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdNaWRkbGVMaW5lID0gY2xvc2VzdERpc3RhbmNlcy5pbmRleFggPT09IDQgfHwgKCFzaG91bGREcmF3TGVmdExpbmUgJiYgIXNob3VsZERyYXdSaWdodExpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREcmF3TWlkZGxlTGluZSAmJiAhYWxpZ25MaW5lc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzFdID0gbWlkZGxlTGluZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpc0NvcnJlY3RYID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNhbkRyYXdWZXJ0aWNhbCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFpc0NvcnJlY3RZICYmIGNsb3Nlc3REaXN0YW5jZXMuYWJzWURpc3RhbmNlIDwgU05BUF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICBkZWx0YVkgPSBjbG9zZXN0RGlzdGFuY2VzLnlEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55IC09IGRlbHRhWTtcbiAgICAgICAgICAgICAgICBpc0NvcnJlY3RZID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjYW5EcmF3VmVydGljYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3REaXN0YW5jZXMuYWJzWURpc3RhbmNlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2FuRHJhd1ZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYW5EcmF3VmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsWCA9IFtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGUueCxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGUueCArIGFsaWduUmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS54ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUud2lkdGhcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVMZWZ0WCA9IE1hdGgubWluKC4uLmhvcml6b250YWxYKSAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lUmlnaHRYID0gTWF0aC5tYXgoLi4uaG9yaXpvbnRhbFgpICsgb2Zmc2V0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcExpbmUgPSBbbGluZUxlZnRYLCB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55LCBsaW5lUmlnaHRYLCB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55XTtcbiAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsTWlkZGxlTGluZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgbGluZUxlZnRYLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55ICsgdGhpcy5hY3RpdmVSZWN0YW5nbGUuaGVpZ2h0IC8gMixcbiAgICAgICAgICAgICAgICAgICAgbGluZVJpZ2h0WCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCAvIDJcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbUxpbmUgPSBbXG4gICAgICAgICAgICAgICAgICAgIGxpbmVMZWZ0WCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgbGluZVJpZ2h0WCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSZWN0YW5nbGUueSArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLmhlaWdodFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGREcmF3VG9wTGluZSA9XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhZID09PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhZID09PSAxIHx8XG4gICAgICAgICAgICAgICAgICAgIChjbG9zZXN0RGlzdGFuY2VzLmluZGV4WSA9PT0gMiAmJiB0aGlzLmFjdGl2ZVJlY3RhbmdsZS5oZWlnaHQgPT09IGFsaWduUmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZERyYXdUb3BMaW5lICYmICFhbGlnbkxpbmVzWzNdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWduTGluZXNbM10gPSB0b3BMaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdCb3R0b21MaW5lID1cbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlcy5pbmRleFkgPT09IDIgfHxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlcy5pbmRleFkgPT09IDMgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNsb3Nlc3REaXN0YW5jZXMuaW5kZXhZID09PSAwICYmIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLndpZHRoID09PSBhbGlnblJlY3RhbmdsZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZERyYXdCb3R0b21MaW5lICYmICFhbGlnbkxpbmVzWzVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWduTGluZXNbNV0gPSBib3R0b21MaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZERyYXdNaWRkbGVMaW5lID0gY2xvc2VzdERpc3RhbmNlcy5pbmRleFkgPT09IDQgfHwgKCFzaG91bGREcmF3VG9wTGluZSAmJiAhc2hvdWxkRHJhd0JvdHRvbUxpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREcmF3TWlkZGxlTGluZSAmJiAhYWxpZ25MaW5lc1s0XSkge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzRdID0gaG9yaXpvbnRhbE1pZGRsZUxpbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxpZ25EZWx0YVggPSBkZWx0YVg7XG4gICAgICAgIGNvbnN0IGFsaWduRGVsdGFZID0gZGVsdGFZO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlUmVjdGFuZ2xlLnggKz0gZGVsdGFYO1xuICAgICAgICB0aGlzLmFjdGl2ZVJlY3RhbmdsZS55ICs9IGRlbHRhWTtcbiAgICAgICAgY29uc3QgZGlzdHJpYnV0ZUhvcml6b250YWxSZXN1bHQgPSB0aGlzLmFsaWduRGlzdHJpYnV0ZShhbGlnblJlY3RhbmdsZXMsIHRydWUpO1xuICAgICAgICBjb25zdCBkaXN0cmlidXRlVmVydGljYWxSZXN1bHQgPSB0aGlzLmFsaWduRGlzdHJpYnV0ZShhbGlnblJlY3RhbmdsZXMsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgZGlzdHJpYnV0ZUxpbmVzOiBQb2ludFtdW10gPSBbLi4uZGlzdHJpYnV0ZUhvcml6b250YWxSZXN1bHQuZGlzdHJpYnV0ZUxpbmVzLCAuLi5kaXN0cmlidXRlVmVydGljYWxSZXN1bHQuZGlzdHJpYnV0ZUxpbmVzXTtcbiAgICAgICAgaWYgKGRpc3RyaWJ1dGVIb3Jpem9udGFsUmVzdWx0LmRlbHRhKSB7XG4gICAgICAgICAgICBkZWx0YVggPSBkaXN0cmlidXRlSG9yaXpvbnRhbFJlc3VsdC5kZWx0YTtcbiAgICAgICAgICAgIGlmIChhbGlnbkRlbHRhWCAhPT0gZGVsdGFYKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lc1swXSA9IFtdO1xuICAgICAgICAgICAgICAgIGFsaWduTGluZXNbMV0gPSBbXTtcbiAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzJdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzdHJpYnV0ZVZlcnRpY2FsUmVzdWx0LmRlbHRhKSB7XG4gICAgICAgICAgICBkZWx0YVkgPSBkaXN0cmlidXRlVmVydGljYWxSZXN1bHQuZGVsdGE7XG4gICAgICAgICAgICBpZiAoYWxpZ25EZWx0YVkgIT09IGRlbHRhWSkge1xuICAgICAgICAgICAgICAgIGFsaWduTGluZXNbM10gPSBbXTtcbiAgICAgICAgICAgICAgICBhbGlnbkxpbmVzWzRdID0gW107XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lc1s1XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsaWduTGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRyYXdBbGlnbkxpbmVzKGFsaWduTGluZXMsIGcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc3RyaWJ1dGVMaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd0Rpc3RyaWJ1dGVMaW5lcyhkaXN0cmlidXRlTGluZXMsIGcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZGVsdGFYLCBkZWx0YVksIGcgfTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDbG9zZXN0RGlzdGFuY2VzKGFjdGl2ZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBhbGlnblJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZUNlbnRlciA9IFthY3RpdmVSZWN0YW5nbGUueCArIGFjdGl2ZVJlY3RhbmdsZS53aWR0aCAvIDIsIGFjdGl2ZVJlY3RhbmdsZS55ICsgYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCAvIDJdO1xuICAgICAgICBjb25zdCBhbGlnblJlY3RhbmdsZUNlbnRlciA9IFthbGlnblJlY3RhbmdsZS54ICsgYWxpZ25SZWN0YW5nbGUud2lkdGggLyAyLCBhbGlnblJlY3RhbmdsZS55ICsgYWxpZ25SZWN0YW5nbGUuaGVpZ2h0IC8gMl07XG5cbiAgICAgICAgY29uc3QgY2VudGVyWERpc3RhbmNlID0gYWN0aXZlUmVjdGFuZ2xlQ2VudGVyWzBdIC0gYWxpZ25SZWN0YW5nbGVDZW50ZXJbMF07XG4gICAgICAgIGNvbnN0IGNlbnRlcllEaXN0YW5jZSA9IGFjdGl2ZVJlY3RhbmdsZUNlbnRlclsxXSAtIGFsaWduUmVjdGFuZ2xlQ2VudGVyWzFdO1xuXG4gICAgICAgIGNvbnN0IGxlZnRUb0xlZnQgPSBhY3RpdmVSZWN0YW5nbGUueCAtIGFsaWduUmVjdGFuZ2xlLng7XG4gICAgICAgIGNvbnN0IGxlZnRUb1JpZ2h0ID0gYWN0aXZlUmVjdGFuZ2xlLnggLSAoYWxpZ25SZWN0YW5nbGUueCArIGFsaWduUmVjdGFuZ2xlLndpZHRoKTtcbiAgICAgICAgY29uc3QgcmlnaHRUb1JpZ2h0ID0gYWN0aXZlUmVjdGFuZ2xlLnggKyBhY3RpdmVSZWN0YW5nbGUud2lkdGggLSAoYWxpZ25SZWN0YW5nbGUueCArIGFsaWduUmVjdGFuZ2xlLndpZHRoKTtcbiAgICAgICAgY29uc3QgcmlnaHRUb0xlZnQgPSBhY3RpdmVSZWN0YW5nbGUueCArIGFjdGl2ZVJlY3RhbmdsZS53aWR0aCAtIGFsaWduUmVjdGFuZ2xlLng7XG5cbiAgICAgICAgY29uc3QgdG9wVG9Ub3AgPSBhY3RpdmVSZWN0YW5nbGUueSAtIGFsaWduUmVjdGFuZ2xlLnk7XG4gICAgICAgIGNvbnN0IHRvcFRvQm90dG9tID0gYWN0aXZlUmVjdGFuZ2xlLnkgLSAoYWxpZ25SZWN0YW5nbGUueSArIGFsaWduUmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IGJvdHRvbVRvVG9wID0gYWN0aXZlUmVjdGFuZ2xlLnkgKyBhY3RpdmVSZWN0YW5nbGUuaGVpZ2h0IC0gYWxpZ25SZWN0YW5nbGUueTtcbiAgICAgICAgY29uc3QgYm90dG9tVG9Cb3R0b20gPSBhY3RpdmVSZWN0YW5nbGUueSArIGFjdGl2ZVJlY3RhbmdsZS5oZWlnaHQgLSAoYWxpZ25SZWN0YW5nbGUueSArIGFsaWduUmVjdGFuZ2xlLmhlaWdodCk7XG5cbiAgICAgICAgY29uc3QgeERpc3RhbmNlcyA9IFtsZWZ0VG9MZWZ0LCBsZWZ0VG9SaWdodCwgcmlnaHRUb1JpZ2h0LCByaWdodFRvTGVmdCwgY2VudGVyWERpc3RhbmNlXTtcbiAgICAgICAgY29uc3QgeURpc3RhbmNlcyA9IFt0b3BUb1RvcCwgdG9wVG9Cb3R0b20sIGJvdHRvbVRvQm90dG9tLCBib3R0b21Ub1RvcCwgY2VudGVyWURpc3RhbmNlXTtcblxuICAgICAgICBjb25zdCB4RGlzdGFuY2VzQWJzID0geERpc3RhbmNlcy5tYXAoZGlzdGFuY2UgPT4gTWF0aC5hYnMoZGlzdGFuY2UpKTtcbiAgICAgICAgY29uc3QgeURpc3RhbmNlc0FicyA9IHlEaXN0YW5jZXMubWFwKGRpc3RhbmNlID0+IE1hdGguYWJzKGRpc3RhbmNlKSk7XG5cbiAgICAgICAgY29uc3QgaW5kZXhYID0geERpc3RhbmNlc0Ficy5pbmRleE9mKE1hdGgubWluKC4uLnhEaXN0YW5jZXNBYnMpKTtcbiAgICAgICAgY29uc3QgaW5kZXhZID0geURpc3RhbmNlc0Ficy5pbmRleE9mKE1hdGgubWluKC4uLnlEaXN0YW5jZXNBYnMpKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWJzWERpc3RhbmNlOiB4RGlzdGFuY2VzQWJzW2luZGV4WF0sXG4gICAgICAgICAgICB4RGlzdGFuY2U6IHhEaXN0YW5jZXNbaW5kZXhYXSxcbiAgICAgICAgICAgIGFic1lEaXN0YW5jZTogeURpc3RhbmNlc0Fic1tpbmRleFldLFxuICAgICAgICAgICAgeURpc3RhbmNlOiB5RGlzdGFuY2VzW2luZGV4WV0sXG4gICAgICAgICAgICBpbmRleFgsXG4gICAgICAgICAgICBpbmRleFlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhbGlnbkRpc3RyaWJ1dGUoYWxpZ25SZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSwgaXNIb3Jpem9udGFsOiBib29sZWFuKSB7XG4gICAgICAgIGxldCBkaXN0cmlidXRlTGluZXM6IGFueVtdID0gW107XG4gICAgICAgIGxldCBkZWx0YSA9IDA7XG4gICAgICAgIGxldCByZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSA9IFtdO1xuICAgICAgICBjb25zdCBheGlzID0gaXNIb3Jpem9udGFsID8gJ3gnIDogJ3knO1xuICAgICAgICBjb25zdCBzaWRlID0gaXNIb3Jpem9udGFsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZUNlbnRlciA9IHRoaXMuYWN0aXZlUmVjdGFuZ2xlW2F4aXNdICsgdGhpcy5hY3RpdmVSZWN0YW5nbGVbc2lkZV0gLyAyO1xuICAgICAgICBhbGlnblJlY3RhbmdsZXMuZm9yRWFjaChyZWMgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNDcm9zcyA9IGlzSG9yaXpvbnRhbCA/IGlzSG9yaXpvbnRhbENyb3NzKHJlYywgdGhpcy5hY3RpdmVSZWN0YW5nbGUpIDogaXNWZXJ0aWNhbENyb3NzKHJlYywgdGhpcy5hY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICAgICAgaWYgKGlzQ3Jvc3MgJiYgIVJlY3RhbmdsZUNsaWVudC5pc0hpdChyZWMsIHRoaXMuYWN0aXZlUmVjdGFuZ2xlKSkge1xuICAgICAgICAgICAgICAgIHJlY3RhbmdsZXMucHVzaChyZWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVjdGFuZ2xlcyA9IFsuLi5yZWN0YW5nbGVzLCB0aGlzLmFjdGl2ZVJlY3RhbmdsZV0uc29ydCgoYSwgYikgPT4gYVtheGlzXSAtIGJbYXhpc10pO1xuXG4gICAgICAgIGNvbnN0IHJlZkFycmF5OiBEaXN0cmlidXRlUmVmW10gPSBbXTtcbiAgICAgICAgbGV0IGRpc3RyaWJ1dGVEaXN0YW5jZSA9IDA7XG4gICAgICAgIGxldCBiZWZvcmVJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGFmdGVySW5kZXggPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0YW5nbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCByZWN0YW5nbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gcmVjdGFuZ2xlc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlciA9IHJlY3RhbmdsZXNbal07XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhZnRlcltheGlzXSAtIChiZWZvcmVbYXhpc10gKyBiZWZvcmVbc2lkZV0pO1xuICAgICAgICAgICAgICAgIGxldCBkaWYgPSBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICBpZiAocmVmQXJyYXlbaV0/LmFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZkFycmF5W2ldLmFmdGVyLnB1c2goeyBkaXN0YW5jZSwgaW5kZXg6IGogfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQXJyYXlbaV0gPSB7IC4uLnJlZkFycmF5W2ldLCBhZnRlcjogW3sgZGlzdGFuY2UsIGluZGV4OiBqIH1dIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkFycmF5W2pdPy5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQXJyYXlbal0uYmVmb3JlLnB1c2goeyBkaXN0YW5jZSwgaW5kZXg6IGkgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQXJyYXlbal0gPSB7IC4uLnJlZkFycmF5W2pdLCBiZWZvcmU6IFt7IGRpc3RhbmNlLCBpbmRleDogaSB9XSB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vbWlkZGxlXG4gICAgICAgICAgICAgICAgbGV0IF9jZW50ZXIgPSAoYmVmb3JlW2F4aXNdICsgYmVmb3JlW3NpZGVdICsgYWZ0ZXJbYXhpc10pIC8gMjtcbiAgICAgICAgICAgICAgICBkaWYgPSBNYXRoLmFicyhhY3RpdmVSZWN0YW5nbGVDZW50ZXIgLSBfY2VudGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlmIDwgU05BUF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZURpc3RhbmNlID0gKGFmdGVyW2F4aXNdIC0gKGJlZm9yZVtheGlzXSArIGJlZm9yZVtzaWRlXSkgLSB0aGlzLmFjdGl2ZVJlY3RhbmdsZVtzaWRlXSkgLyAyO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGFjdGl2ZVJlY3RhbmdsZUNlbnRlciAtIF9jZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCA9IGo7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9hZnRlclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlUmlnaHQgPSBhZnRlcltheGlzXSAtIChiZWZvcmVbYXhpc10gKyBiZWZvcmVbc2lkZV0pO1xuICAgICAgICAgICAgICAgIF9jZW50ZXIgPSBhZnRlcltheGlzXSArIGFmdGVyW3NpZGVdICsgZGlzdGFuY2VSaWdodCArIHRoaXMuYWN0aXZlUmVjdGFuZ2xlW3NpZGVdIC8gMjtcbiAgICAgICAgICAgICAgICBkaWYgPSBNYXRoLmFicyhhY3RpdmVSZWN0YW5nbGVDZW50ZXIgLSBfY2VudGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRpc3RyaWJ1dGVEaXN0YW5jZSAmJiBkaWYgPCBTTkFQX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRlRGlzdGFuY2UgPSBkaXN0YW5jZVJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmVJbmRleCA9IGo7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gYWN0aXZlUmVjdGFuZ2xlQ2VudGVyIC0gX2NlbnRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2JlZm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlQmVmb3JlID0gYWZ0ZXJbYXhpc10gLSAoYmVmb3JlW2F4aXNdICsgYmVmb3JlW3NpZGVdKTtcbiAgICAgICAgICAgICAgICBfY2VudGVyID0gYmVmb3JlW2F4aXNdIC0gZGlzdGFuY2VCZWZvcmUgLSB0aGlzLmFjdGl2ZVJlY3RhbmdsZVtzaWRlXSAvIDI7XG4gICAgICAgICAgICAgICAgZGlmID0gTWF0aC5hYnMoYWN0aXZlUmVjdGFuZ2xlQ2VudGVyIC0gX2NlbnRlcik7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRpc3RyaWJ1dGVEaXN0YW5jZSAmJiBkaWYgPCBTTkFQX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRlRGlzdGFuY2UgPSBkaXN0YW5jZUJlZm9yZTtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gYWN0aXZlUmVjdGFuZ2xlQ2VudGVyIC0gX2NlbnRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVJbmRleCA9IHJlY3RhbmdsZXMuaW5kZXhPZih0aGlzLmFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgIGxldCBiZWZvcmVJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBsZXQgYWZ0ZXJJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBpZiAoYmVmb3JlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYmVmb3JlSW5kZXhlcy5wdXNoKGJlZm9yZUluZGV4KTtcbiAgICAgICAgICAgIGZpbmRSZWN0YW5nbGUoZGlzdHJpYnV0ZURpc3RhbmNlLCByZWZBcnJheVtiZWZvcmVJbmRleF0sICdiZWZvcmUnLCBiZWZvcmVJbmRleGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZnRlckluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFmdGVySW5kZXhlcy5wdXNoKGFmdGVySW5kZXgpO1xuICAgICAgICAgICAgZmluZFJlY3RhbmdsZShkaXN0cmlidXRlRGlzdGFuY2UsIHJlZkFycmF5W2FmdGVySW5kZXhdLCAnYWZ0ZXInLCBhZnRlckluZGV4ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlZm9yZUluZGV4ZXMubGVuZ3RoIHx8IGFmdGVySW5kZXhlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4QXJyID0gWy4uLmJlZm9yZUluZGV4ZXMucmV2ZXJzZSgpLCBhY3RpdmVJbmRleCwgLi4uYWZ0ZXJJbmRleGVzXTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlUmVjdGFuZ2xlW2F4aXNdIC09IGRlbHRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbmRleEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVMaW5lcy5wdXNoKGdldExpbmVQb2ludHMocmVjdGFuZ2xlc1tpbmRleEFycltpIC0gMV1dLCByZWN0YW5nbGVzW2luZGV4QXJyW2ldXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZmluZFJlY3RhbmdsZShkaXN0YW5jZTogbnVtYmVyLCByZWY6IERpc3RyaWJ1dGVSZWYsIGRpcmVjdGlvbjogc3RyaW5nLCByZWN0YW5nbGVJbmRleGVzOiBudW1iZXJbXSkge1xuICAgICAgICAgICAgY29uc3QgYXJyID0gcmVmW2RpcmVjdGlvbiBhcyBrZXlvZiBEaXN0cmlidXRlUmVmXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVmQXJyYXkuaW5kZXhPZihyZWYpO1xuICAgICAgICAgICAgaWYgKChpbmRleCA9PT0gMCAmJiBkaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB8fCAoaW5kZXggPT09IHJlZkFycmF5Lmxlbmd0aCAtIDEgJiYgZGlyZWN0aW9uID09PSAnYWZ0ZXInKSkgcmV0dXJuO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoYXJyW2ldLmRpc3RhbmNlIC0gZGlzdGFuY2UpIDwgMC4xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZUluZGV4ZXMucHVzaChhcnJbaV0uaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBmaW5kUmVjdGFuZ2xlKGRpc3RhbmNlLCByZWZBcnJheVthcnJbaV0uaW5kZXhdLCBkaXJlY3Rpb24sIHJlY3RhbmdsZUluZGV4ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZVBvaW50cyhiZWZvcmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgYWZ0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICAgICAgY29uc3Qgb3Bwb3NpdGVBeGlzID0gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuICAgICAgICAgICAgY29uc3Qgb3Bwb3NpdGVTaWRlID0gc2lkZSA9PT0gJ3dpZHRoJyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICAgICAgICAgIGNvbnN0IGFsaWduID0gW1xuICAgICAgICAgICAgICAgIGJlZm9yZVJlY3RhbmdsZVtvcHBvc2l0ZUF4aXNdLFxuICAgICAgICAgICAgICAgIGJlZm9yZVJlY3RhbmdsZVtvcHBvc2l0ZUF4aXNdICsgYmVmb3JlUmVjdGFuZ2xlW29wcG9zaXRlU2lkZV0sXG4gICAgICAgICAgICAgICAgYWZ0ZXJSZWN0YW5nbGVbb3Bwb3NpdGVBeGlzXSxcbiAgICAgICAgICAgICAgICBhZnRlclJlY3RhbmdsZVtvcHBvc2l0ZUF4aXNdICsgYWZ0ZXJSZWN0YW5nbGVbb3Bwb3NpdGVTaWRlXVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRBcnIgPSBhbGlnbi5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgICBjb25zdCBhdmVyYWdlID0gKHNvcnRBcnJbMV0gKyBzb3J0QXJyWzJdKSAvIDI7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIGlzSG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgIFtiZWZvcmVSZWN0YW5nbGUueCArIGJlZm9yZVJlY3RhbmdsZS53aWR0aCArIG9mZnNldCwgYXZlcmFnZV0sXG4gICAgICAgICAgICAgICAgICAgICAgW2FmdGVyUmVjdGFuZ2xlLnggLSBvZmZzZXQsIGF2ZXJhZ2VdXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICAgICAgW2F2ZXJhZ2UsIGJlZm9yZVJlY3RhbmdsZS55ICsgYmVmb3JlUmVjdGFuZ2xlLmhlaWdodCArIG9mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgW2F2ZXJhZ2UsIGFmdGVyUmVjdGFuZ2xlLnkgLSBvZmZzZXRdXG4gICAgICAgICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRlbHRhLCBkaXN0cmlidXRlTGluZXMgfTtcbiAgICB9XG5cbiAgICBkcmF3QWxpZ25MaW5lcyhsaW5lczogbnVtYmVyW11bXSwgZzogU1ZHR0VsZW1lbnQpIHtcbiAgICAgICAgbGluZXMuZm9yRWFjaChwb2ludHMgPT4ge1xuICAgICAgICAgICAgaWYgKCFwb2ludHMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB4QWxpZ24gPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKHRoaXMuYm9hcmQpLmxpbmUocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVEYXNoOiBbNCwgNF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZy5hcHBlbmRDaGlsZCh4QWxpZ24pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkcmF3RGlzdHJpYnV0ZUxpbmVzKGxpbmVzOiBQb2ludFtdW10sIGc6IFNWR0dFbGVtZW50KSB7XG4gICAgICAgIGxpbmVzLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWxpbmUubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICBsZXQgaXNIb3Jpem9udGFsID0gbGluZVswXVsxXSA9PT0gbGluZVsxXVsxXTtcbiAgICAgICAgICAgIGNvbnN0IHlBbGlnbiA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShsaW5lWzBdWzBdLCBsaW5lWzBdWzFdLCBsaW5lWzFdWzBdLCBsaW5lWzFdWzFdLCB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGcuYXBwZW5kQ2hpbGQoeUFsaWduKTtcblxuICAgICAgICAgICAgbGluZS5mb3JFYWNoKHBvaW50ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXJQb2ludCA9IGdldEJhclBvaW50KHBvaW50LCBpc0hvcml6b250YWwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhciA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShiYXJQb2ludFswXVswXSwgYmFyUG9pbnRbMF1bMV0sIGJhclBvaW50WzFdWzBdLCBiYXJQb2ludFsxXVsxXSwge1xuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZy5hcHBlbmRDaGlsZChiYXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNIb3Jpem9udGFsQ3Jvc3MocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG90aGVyOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICByZXR1cm4gIShyZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgPCBvdGhlci55IHx8IHJlY3RhbmdsZS55ID4gb3RoZXIueSArIG90aGVyLmhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIGlzVmVydGljYWxDcm9zcyhyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgb3RoZXI6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgIHJldHVybiAhKHJlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIDwgb3RoZXIueCB8fCByZWN0YW5nbGUueCA+IG90aGVyLnggKyBvdGhlci53aWR0aCk7XG59XG5mdW5jdGlvbiBnZXRCYXJQb2ludChwb2ludDogUG9pbnQsIGlzSG9yaXpvbnRhbDogYm9vbGVhbikge1xuICAgIHJldHVybiBpc0hvcml6b250YWxcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFtwb2ludFswXSwgcG9pbnRbMV0gLSA0XSxcbiAgICAgICAgICAgICAgW3BvaW50WzBdLCBwb2ludFsxXSArIDRdXG4gICAgICAgICAgXVxuICAgICAgICA6IFtcbiAgICAgICAgICAgICAgW3BvaW50WzBdIC0gNCwgcG9pbnRbMV1dLFxuICAgICAgICAgICAgICBbcG9pbnRbMF0gKyA0LCBwb2ludFsxXV1cbiAgICAgICAgICBdO1xufVxuIl19
@@ -1,41 +0,0 @@
1
- import { PlaitBoard } from '../interfaces/board';
2
- import { PlaitElement } from '../interfaces/element';
3
- import { Point, RectangleClient } from '../interfaces';
4
- export interface SnapRef {
5
- deltaX: number;
6
- deltaY: number;
7
- g: SVGGElement;
8
- }
9
- export interface DistributeRef {
10
- before: {
11
- distance: number;
12
- index: number;
13
- }[];
14
- after: {
15
- distance: number;
16
- index: number;
17
- }[];
18
- }
19
- export declare class MovingSnapReaction {
20
- private board;
21
- private activeElements;
22
- private activeRectangle;
23
- alignRectangles: RectangleClient[];
24
- constructor(board: PlaitBoard, activeElements: PlaitElement[], activeRectangle: RectangleClient);
25
- getAlignRectangle(): RectangleClient[];
26
- handleSnapping(): SnapRef;
27
- calculateClosestDistances(activeRectangle: RectangleClient, alignRectangle: RectangleClient): {
28
- absXDistance: number;
29
- xDistance: number;
30
- absYDistance: number;
31
- yDistance: number;
32
- indexX: number;
33
- indexY: number;
34
- };
35
- alignDistribute(alignRectangles: RectangleClient[], isHorizontal: boolean): {
36
- delta: number;
37
- distributeLines: any[];
38
- };
39
- drawAlignLines(lines: number[][], g: SVGGElement): void;
40
- drawDistributeLines(lines: Point[][], g: SVGGElement): void;
41
- }