@plait/draw 0.52.0 → 0.54.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.
- package/constants/geometry.d.ts +3 -1
- package/esm2022/constants/geometry.mjs +4 -2
- package/esm2022/generators/line-auto-complete.generator.mjs +1 -1
- package/esm2022/interfaces/index.mjs +2 -2
- package/esm2022/interfaces/line.mjs +20 -8
- package/esm2022/line.component.mjs +5 -17
- package/esm2022/plugins/with-draw-fragment.mjs +1 -1
- package/esm2022/plugins/with-draw-hotkey.mjs +9 -7
- package/esm2022/plugins/with-draw-resize.mjs +114 -13
- package/esm2022/plugins/with-draw.mjs +5 -12
- package/esm2022/plugins/with-geometry-resize.mjs +8 -5
- package/esm2022/plugins/with-line-auto-complete-reaction.mjs +7 -4
- package/esm2022/plugins/with-line-auto-complete.mjs +17 -16
- package/esm2022/plugins/with-line-bound-reaction.mjs +20 -19
- package/esm2022/plugins/with-line-create.mjs +4 -4
- package/esm2022/plugins/with-line-resize.mjs +10 -11
- package/esm2022/transforms/line.mjs +4 -4
- package/esm2022/utils/geometry.mjs +31 -22
- package/esm2022/utils/hit.mjs +29 -27
- package/esm2022/utils/line/elbow.mjs +22 -9
- package/esm2022/utils/line/line-basic.mjs +21 -25
- package/esm2022/utils/line/line-common.mjs +27 -15
- package/esm2022/utils/line/line-resize.mjs +7 -11
- package/esm2022/utils/position/geometry.mjs +52 -20
- package/esm2022/utils/resize-snap.mjs +361 -0
- package/esm2022/utils/shape.mjs +2 -2
- package/fesm2022/plait-draw.mjs +556 -437
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/line-auto-complete.generator.d.ts +3 -3
- package/interfaces/index.d.ts +2 -2
- package/package.json +1 -1
- package/plugins/with-draw-fragment.d.ts +2 -2
- package/plugins/with-draw-resize.d.ts +12 -0
- package/utils/geometry.d.ts +7 -4
- package/utils/hit.d.ts +3 -1
- package/utils/line/elbow.d.ts +6 -13
- package/utils/line/line-basic.d.ts +4 -4
- package/utils/line/line-common.d.ts +3 -13
- package/utils/position/geometry.d.ts +12 -5
- package/utils/resize-snap.d.ts +49 -0
- package/utils/shape.d.ts +2 -2
- package/esm2022/generators/group.generator.mjs +0 -20
- package/esm2022/group.component.mjs +0 -47
- package/esm2022/utils/resize-align-reaction.mjs +0 -316
- package/esm2022/utils/resize-align.mjs +0 -37
- package/generators/group.generator.d.ts +0 -6
- package/group.component.d.ts +0 -17
- package/utils/resize-align-reaction.d.ts +0 -42
- package/utils/resize-align.d.ts +0 -8
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, Point, RectangleClient, SELECTION_BORDER_COLOR, createG, findElements } from '@plait/core';
|
|
2
|
-
import { getResizeZoom, movePointByZoomAndOriginPoint } from '../plugins/with-draw-resize';
|
|
3
|
-
const ALIGN_TOLERANCE = 2;
|
|
4
|
-
const EQUAL_SPACING = 10;
|
|
5
|
-
const ALIGN_SPACING = 24;
|
|
6
|
-
export class ResizeAlignReaction {
|
|
7
|
-
constructor(board, activeElements) {
|
|
8
|
-
this.board = board;
|
|
9
|
-
this.activeElements = activeElements;
|
|
10
|
-
this.alignRectangles = this.getAlignRectangle();
|
|
11
|
-
}
|
|
12
|
-
getAlignRectangle() {
|
|
13
|
-
const elements = findElements(this.board, {
|
|
14
|
-
match: element => this.board.isAlign(element) && !this.activeElements.some(item => item.id === element.id),
|
|
15
|
-
recursion: () => false,
|
|
16
|
-
isReverse: false
|
|
17
|
-
});
|
|
18
|
-
return elements.map(item => this.board.getRectangle(item));
|
|
19
|
-
}
|
|
20
|
-
getAlignLineRef(resizeAlignDelta, resizeAlignOptions) {
|
|
21
|
-
const { deltaX, deltaY } = resizeAlignDelta;
|
|
22
|
-
const { resizeState, originPoint, handlePoint, isFromCorner, isAspectRatio, resizeOriginPoints } = resizeAlignOptions;
|
|
23
|
-
const newResizeState = {
|
|
24
|
-
...resizeState,
|
|
25
|
-
endPoint: [resizeState.endPoint[0] + deltaX, resizeState.endPoint[1] + deltaY]
|
|
26
|
-
};
|
|
27
|
-
const { xZoom, yZoom } = getResizeZoom(newResizeState, originPoint, handlePoint, isFromCorner, isAspectRatio);
|
|
28
|
-
const activePoints = resizeOriginPoints.map(p => {
|
|
29
|
-
return movePointByZoomAndOriginPoint(p, originPoint, xZoom, yZoom);
|
|
30
|
-
});
|
|
31
|
-
return {
|
|
32
|
-
deltaX,
|
|
33
|
-
deltaY,
|
|
34
|
-
xZoom,
|
|
35
|
-
yZoom,
|
|
36
|
-
activePoints
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
getEqualLineDelta(resizeAlignOptions) {
|
|
40
|
-
let equalLineDelta = {
|
|
41
|
-
deltaX: 0,
|
|
42
|
-
deltaY: 0
|
|
43
|
-
};
|
|
44
|
-
const { isAspectRatio, activeRectangle } = resizeAlignOptions;
|
|
45
|
-
const widthAlignRectangle = this.alignRectangles.find(item => Math.abs(item.width - activeRectangle.width) < ALIGN_TOLERANCE);
|
|
46
|
-
if (widthAlignRectangle) {
|
|
47
|
-
const deltaWidth = widthAlignRectangle.width - activeRectangle.width;
|
|
48
|
-
equalLineDelta.deltaX = deltaWidth * resizeAlignOptions.directionFactors[0];
|
|
49
|
-
if (isAspectRatio) {
|
|
50
|
-
const deltaHeight = deltaWidth / (activeRectangle.width / activeRectangle.height);
|
|
51
|
-
equalLineDelta.deltaY = deltaHeight * resizeAlignOptions.directionFactors[1];
|
|
52
|
-
return equalLineDelta;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
const heightAlignRectangle = this.alignRectangles.find(item => Math.abs(item.height - activeRectangle.height) < ALIGN_TOLERANCE);
|
|
56
|
-
if (heightAlignRectangle) {
|
|
57
|
-
const deltaHeight = heightAlignRectangle.height - activeRectangle.height;
|
|
58
|
-
equalLineDelta.deltaY = deltaHeight * resizeAlignOptions.directionFactors[1];
|
|
59
|
-
if (isAspectRatio) {
|
|
60
|
-
const deltaWidth = deltaHeight * (activeRectangle.width / activeRectangle.height);
|
|
61
|
-
equalLineDelta.deltaX = deltaWidth * resizeAlignOptions.directionFactors[0];
|
|
62
|
-
return equalLineDelta;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return equalLineDelta;
|
|
66
|
-
}
|
|
67
|
-
drawEqualLines(activePoints, resizeAlignOptions) {
|
|
68
|
-
let widthEqualPoints = [];
|
|
69
|
-
let heightEqualPoints = [];
|
|
70
|
-
const drawHorizontalLine = resizeAlignOptions.directionFactors[0] !== 0 || resizeAlignOptions.isAspectRatio;
|
|
71
|
-
const drawVerticalLine = resizeAlignOptions.directionFactors[1] !== 0 || resizeAlignOptions.isAspectRatio;
|
|
72
|
-
const activeRectangle = RectangleClient.getRectangleByPoints(activePoints);
|
|
73
|
-
for (let alignRectangle of this.alignRectangles) {
|
|
74
|
-
if (activeRectangle.width === alignRectangle.width && drawHorizontalLine) {
|
|
75
|
-
widthEqualPoints.push(getEqualLinePoints(alignRectangle, true));
|
|
76
|
-
}
|
|
77
|
-
if (activeRectangle.height === alignRectangle.height && drawVerticalLine) {
|
|
78
|
-
heightEqualPoints.push(getEqualLinePoints(alignRectangle, false));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (widthEqualPoints.length && drawHorizontalLine) {
|
|
82
|
-
widthEqualPoints.push(getEqualLinePoints(activeRectangle, true));
|
|
83
|
-
}
|
|
84
|
-
if (heightEqualPoints.length && drawVerticalLine) {
|
|
85
|
-
heightEqualPoints.push(getEqualLinePoints(activeRectangle, false));
|
|
86
|
-
}
|
|
87
|
-
const equalLinePoints = [...widthEqualPoints, ...heightEqualPoints];
|
|
88
|
-
return drawEqualLines(this.board, equalLinePoints);
|
|
89
|
-
}
|
|
90
|
-
getAlignLineDelta(resizeAlignOptions) {
|
|
91
|
-
let alignLineDelta = {
|
|
92
|
-
deltaX: 0,
|
|
93
|
-
deltaY: 0
|
|
94
|
-
};
|
|
95
|
-
const { isAspectRatio, activeRectangle, directionFactors } = resizeAlignOptions;
|
|
96
|
-
const drawHorizontal = directionFactors[0] !== 0 || isAspectRatio;
|
|
97
|
-
const drawVertical = directionFactors[1] !== 0 || isAspectRatio;
|
|
98
|
-
if (drawHorizontal) {
|
|
99
|
-
const xAlignAxis = getTripleAlignAxis(activeRectangle, true);
|
|
100
|
-
const alignX = directionFactors[0] === -1 ? xAlignAxis[0] : xAlignAxis[2];
|
|
101
|
-
const deltaX = getMinAlignDelta(this.alignRectangles, alignX, true);
|
|
102
|
-
if (Math.abs(deltaX) < ALIGN_TOLERANCE) {
|
|
103
|
-
alignLineDelta.deltaX = deltaX;
|
|
104
|
-
if (alignLineDelta.deltaX !== 0 && isAspectRatio) {
|
|
105
|
-
alignLineDelta.deltaY = alignLineDelta.deltaX / (activeRectangle.width / activeRectangle.height);
|
|
106
|
-
return alignLineDelta;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
if (drawVertical) {
|
|
111
|
-
const yAlignAxis = getTripleAlignAxis(activeRectangle, false);
|
|
112
|
-
const alignY = directionFactors[1] === -1 ? yAlignAxis[0] : yAlignAxis[2];
|
|
113
|
-
const deltaY = getMinAlignDelta(this.alignRectangles, alignY, false);
|
|
114
|
-
if (Math.abs(deltaY) < ALIGN_TOLERANCE) {
|
|
115
|
-
alignLineDelta.deltaY = deltaY;
|
|
116
|
-
if (alignLineDelta.deltaY !== 0 && isAspectRatio) {
|
|
117
|
-
alignLineDelta.deltaX = alignLineDelta.deltaY * (activeRectangle.width / activeRectangle.height);
|
|
118
|
-
return alignLineDelta;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return alignLineDelta;
|
|
123
|
-
}
|
|
124
|
-
drawAlignLines(activePoints, resizeAlignOptions) {
|
|
125
|
-
let alignLinePoints = [];
|
|
126
|
-
const activeRectangle = RectangleClient.getRectangleByPoints(activePoints);
|
|
127
|
-
const alignAxisX = getTripleAlignAxis(activeRectangle, true);
|
|
128
|
-
const alignAxisY = getTripleAlignAxis(activeRectangle, false);
|
|
129
|
-
const alignLineRefs = [
|
|
130
|
-
{
|
|
131
|
-
axis: alignAxisX[0],
|
|
132
|
-
isHorizontal: true,
|
|
133
|
-
alignRectangles: []
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
axis: alignAxisX[2],
|
|
137
|
-
isHorizontal: true,
|
|
138
|
-
alignRectangles: []
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
axis: alignAxisY[0],
|
|
142
|
-
isHorizontal: false,
|
|
143
|
-
alignRectangles: []
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
axis: alignAxisY[2],
|
|
147
|
-
isHorizontal: false,
|
|
148
|
-
alignRectangles: []
|
|
149
|
-
}
|
|
150
|
-
];
|
|
151
|
-
const setAlignLine = (axis, alignRectangle, isHorizontal) => {
|
|
152
|
-
const boundingRectangle = RectangleClient.inflate(RectangleClient.getBoundingRectangle([activeRectangle, alignRectangle]), ALIGN_SPACING);
|
|
153
|
-
if (isHorizontal) {
|
|
154
|
-
const pointStart = [axis, boundingRectangle.y];
|
|
155
|
-
const pointEnd = [axis, boundingRectangle.y + boundingRectangle.height];
|
|
156
|
-
alignLinePoints.push([pointStart, pointEnd]);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
const pointStart = [boundingRectangle.x, axis];
|
|
160
|
-
const pointEnd = [boundingRectangle.x + boundingRectangle.width, axis];
|
|
161
|
-
alignLinePoints.push([pointStart, pointEnd]);
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
const { isAspectRatio, directionFactors } = resizeAlignOptions;
|
|
165
|
-
const drawHorizontal = directionFactors[0] !== 0 || isAspectRatio;
|
|
166
|
-
const drawVertical = directionFactors[1] !== 0 || isAspectRatio;
|
|
167
|
-
for (let index = 0; index < this.alignRectangles.length; index++) {
|
|
168
|
-
const element = this.alignRectangles[index];
|
|
169
|
-
if (isAlign(alignLineRefs[0].axis, element, alignLineRefs[0].isHorizontal)) {
|
|
170
|
-
alignLineRefs[0].alignRectangles.push(element);
|
|
171
|
-
}
|
|
172
|
-
if (isAlign(alignLineRefs[1].axis, element, alignLineRefs[1].isHorizontal)) {
|
|
173
|
-
alignLineRefs[1].alignRectangles.push(element);
|
|
174
|
-
}
|
|
175
|
-
if (isAlign(alignLineRefs[2].axis, element, alignLineRefs[2].isHorizontal)) {
|
|
176
|
-
alignLineRefs[2].alignRectangles.push(element);
|
|
177
|
-
}
|
|
178
|
-
if (isAlign(alignLineRefs[3].axis, element, alignLineRefs[3].isHorizontal)) {
|
|
179
|
-
alignLineRefs[3].alignRectangles.push(element);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (drawHorizontal && alignLineRefs[0].alignRectangles.length) {
|
|
183
|
-
const leftRectangle = alignLineRefs[0].alignRectangles.length === 1
|
|
184
|
-
? alignLineRefs[0].alignRectangles[0]
|
|
185
|
-
: getNearestAlignRectangle(alignLineRefs[0].alignRectangles, activeRectangle);
|
|
186
|
-
setAlignLine(alignLineRefs[0].axis, leftRectangle, alignLineRefs[0].isHorizontal);
|
|
187
|
-
}
|
|
188
|
-
if (drawHorizontal && alignLineRefs[1].alignRectangles.length) {
|
|
189
|
-
const rightRectangle = alignLineRefs[1].alignRectangles.length === 1
|
|
190
|
-
? alignLineRefs[1].alignRectangles[0]
|
|
191
|
-
: getNearestAlignRectangle(alignLineRefs[1].alignRectangles, activeRectangle);
|
|
192
|
-
setAlignLine(alignLineRefs[1].axis, rightRectangle, alignLineRefs[1].isHorizontal);
|
|
193
|
-
}
|
|
194
|
-
if (drawVertical && alignLineRefs[2].alignRectangles.length) {
|
|
195
|
-
const topRectangle = alignLineRefs[2].alignRectangles.length === 1
|
|
196
|
-
? alignLineRefs[2].alignRectangles[0]
|
|
197
|
-
: getNearestAlignRectangle(alignLineRefs[2].alignRectangles, activeRectangle);
|
|
198
|
-
setAlignLine(alignLineRefs[2].axis, topRectangle, alignLineRefs[2].isHorizontal);
|
|
199
|
-
}
|
|
200
|
-
if (drawVertical && alignLineRefs[3].alignRectangles.length) {
|
|
201
|
-
const bottomRectangle = alignLineRefs[3].alignRectangles.length === 1
|
|
202
|
-
? alignLineRefs[3].alignRectangles[0]
|
|
203
|
-
: getNearestAlignRectangle(alignLineRefs[3].alignRectangles, activeRectangle);
|
|
204
|
-
setAlignLine(alignLineRefs[3].axis, bottomRectangle, alignLineRefs[3].isHorizontal);
|
|
205
|
-
}
|
|
206
|
-
return drawAlignLines(this.board, alignLinePoints);
|
|
207
|
-
}
|
|
208
|
-
handleResizeAlign(resizeAlignOptions) {
|
|
209
|
-
const alignG = createG();
|
|
210
|
-
let alignLineDelta = this.getEqualLineDelta(resizeAlignOptions);
|
|
211
|
-
if (alignLineDelta.deltaX === 0 && alignLineDelta.deltaY === 0) {
|
|
212
|
-
alignLineDelta = this.getAlignLineDelta(resizeAlignOptions);
|
|
213
|
-
}
|
|
214
|
-
const equalLineRef = this.getAlignLineRef(alignLineDelta, resizeAlignOptions);
|
|
215
|
-
const equalLinesG = this.drawEqualLines(equalLineRef.activePoints, resizeAlignOptions);
|
|
216
|
-
const alignLinesG = this.drawAlignLines(equalLineRef.activePoints, resizeAlignOptions);
|
|
217
|
-
alignG.append(equalLinesG, alignLinesG);
|
|
218
|
-
return { ...equalLineRef, alignG };
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
function getBarPoint(point, isHorizontal) {
|
|
222
|
-
return isHorizontal
|
|
223
|
-
? [
|
|
224
|
-
[point[0], point[1] - 4],
|
|
225
|
-
[point[0], point[1] + 4]
|
|
226
|
-
]
|
|
227
|
-
: [
|
|
228
|
-
[point[0] - 4, point[1]],
|
|
229
|
-
[point[0] + 4, point[1]]
|
|
230
|
-
];
|
|
231
|
-
}
|
|
232
|
-
function getEqualLinePoints(rectangle, isHorizontal) {
|
|
233
|
-
return isHorizontal
|
|
234
|
-
? [
|
|
235
|
-
[rectangle.x, rectangle.y - EQUAL_SPACING],
|
|
236
|
-
[rectangle.x + rectangle.width, rectangle.y - EQUAL_SPACING]
|
|
237
|
-
]
|
|
238
|
-
: [
|
|
239
|
-
[rectangle.x - EQUAL_SPACING, rectangle.y],
|
|
240
|
-
[rectangle.x - EQUAL_SPACING, rectangle.y + rectangle.height]
|
|
241
|
-
];
|
|
242
|
-
}
|
|
243
|
-
function drawEqualLines(board, lines) {
|
|
244
|
-
const g = createG();
|
|
245
|
-
lines.forEach(line => {
|
|
246
|
-
if (!line.length)
|
|
247
|
-
return;
|
|
248
|
-
const yAlign = PlaitBoard.getRoughSVG(board).line(line[0][0], line[0][1], line[1][0], line[1][1], {
|
|
249
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
250
|
-
strokeWidth: 1
|
|
251
|
-
});
|
|
252
|
-
g.appendChild(yAlign);
|
|
253
|
-
line.forEach(point => {
|
|
254
|
-
const barPoint = getBarPoint(point, !!Point.isHorizontal(line[0], line[1]));
|
|
255
|
-
const bar = PlaitBoard.getRoughSVG(board).line(barPoint[0][0], barPoint[0][1], barPoint[1][0], barPoint[1][1], {
|
|
256
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
257
|
-
strokeWidth: 1
|
|
258
|
-
});
|
|
259
|
-
g.appendChild(bar);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
return g;
|
|
263
|
-
}
|
|
264
|
-
function drawAlignLines(board, lines) {
|
|
265
|
-
const g = createG();
|
|
266
|
-
lines.forEach(points => {
|
|
267
|
-
if (!points.length)
|
|
268
|
-
return;
|
|
269
|
-
const xAlign = PlaitBoard.getRoughSVG(board).line(points[0][0], points[0][1], points[1][0], points[1][1], {
|
|
270
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
271
|
-
strokeWidth: 1,
|
|
272
|
-
strokeLineDash: [4, 4]
|
|
273
|
-
});
|
|
274
|
-
g.appendChild(xAlign);
|
|
275
|
-
});
|
|
276
|
-
return g;
|
|
277
|
-
}
|
|
278
|
-
export const getTripleAlignAxis = (rectangle, isHorizontal) => {
|
|
279
|
-
const axis = isHorizontal ? 'x' : 'y';
|
|
280
|
-
const side = isHorizontal ? 'width' : 'height';
|
|
281
|
-
return [rectangle[axis], rectangle[axis] + rectangle[side] / 2, rectangle[axis] + rectangle[side]];
|
|
282
|
-
};
|
|
283
|
-
export const isAlign = (axis, rectangle, isHorizontal) => {
|
|
284
|
-
const alignAxis = getTripleAlignAxis(rectangle, isHorizontal);
|
|
285
|
-
return alignAxis.includes(axis);
|
|
286
|
-
};
|
|
287
|
-
export const getClosestDelta = (axis, rectangle, isHorizontal) => {
|
|
288
|
-
const alignAxis = getTripleAlignAxis(rectangle, isHorizontal);
|
|
289
|
-
const deltas = alignAxis.map(item => item - axis);
|
|
290
|
-
const absDeltas = deltas.map(item => Math.abs(item));
|
|
291
|
-
const index = absDeltas.indexOf(Math.min(...absDeltas));
|
|
292
|
-
return deltas[index];
|
|
293
|
-
};
|
|
294
|
-
function getMinAlignDelta(alignRectangles, axis, isHorizontal) {
|
|
295
|
-
let delta = ALIGN_TOLERANCE;
|
|
296
|
-
alignRectangles.forEach(item => {
|
|
297
|
-
const distance = getClosestDelta(axis, item, isHorizontal);
|
|
298
|
-
if (Math.abs(distance) < Math.abs(delta)) {
|
|
299
|
-
delta = distance;
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
return delta;
|
|
303
|
-
}
|
|
304
|
-
function getNearestAlignRectangle(alignRectangles, activeRectangle) {
|
|
305
|
-
let minDistance = Infinity;
|
|
306
|
-
let nearestRectangle = alignRectangles[0];
|
|
307
|
-
alignRectangles.forEach(item => {
|
|
308
|
-
const distance = Math.sqrt(Math.pow(activeRectangle.x - item.x, 2) + Math.pow(activeRectangle.y - item.y, 2));
|
|
309
|
-
if (distance < minDistance) {
|
|
310
|
-
minDistance = distance;
|
|
311
|
-
nearestRectangle = item;
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
return nearestRectangle;
|
|
315
|
-
}
|
|
316
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLWFsaWduLXJlYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvdXRpbHMvcmVzaXplLWFsaWduLXJlYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFSCxVQUFVLEVBRVYsS0FBSyxFQUNMLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsT0FBTyxFQUNQLFlBQVksRUFDZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsYUFBYSxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFvQzNGLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUUxQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFekIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBRXpCLE1BQU0sT0FBTyxtQkFBbUI7SUFHNUIsWUFBb0IsS0FBaUIsRUFBVSxjQUE4QjtRQUF6RCxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ3pFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELGlCQUFpQjtRQUNiLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3RDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUcsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDdEIsU0FBUyxFQUFFLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENB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QUFFLENBQUM7WUFDekIsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUN2QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxnQkFBZ0IsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVzaXplU3RhdGUgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7XG4gICAgRGlyZWN0aW9uRmFjdG9ycyxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQb2ludCxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgU0VMRUNUSU9OX0JPUkRFUl9DT0xPUixcbiAgICBjcmVhdGVHLFxuICAgIGZpbmRFbGVtZW50c1xufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXRSZXNpemVab29tLCBtb3ZlUG9pbnRCeVpvb21BbmRPcmlnaW5Qb2ludCB9IGZyb20gJy4uL3BsdWdpbnMvd2l0aC1kcmF3LXJlc2l6ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXplQWxpZ25EZWx0YSB7XG4gICAgZGVsdGFYOiBudW1iZXI7XG4gICAgZGVsdGFZOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxpZ25MaW5lUmVmIGV4dGVuZHMgUmVzaXplQWxpZ25EZWx0YSB7XG4gICAgeFpvb206IG51bWJlcjtcbiAgICB5Wm9vbTogbnVtYmVyO1xuICAgIGFjdGl2ZVBvaW50czogUG9pbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNpemVBbGlnblJlZiBleHRlbmRzIEFsaWduTGluZVJlZiB7XG4gICAgYWxpZ25HOiBTVkdHRWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNpemVBbGlnbk9wdGlvbnMge1xuICAgIHJlc2l6ZVN0YXRlOiBSZXNpemVTdGF0ZTtcbiAgICByZXNpemVPcmlnaW5Qb2ludHM6IFBvaW50W107XG4gICAgYWN0aXZlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG4gICAgZGlyZWN0aW9uRmFjdG9yczogRGlyZWN0aW9uRmFjdG9ycztcbiAgICBvcmlnaW5Qb2ludDogUG9pbnQ7XG4gICAgaGFuZGxlUG9pbnQ6IFBvaW50O1xuICAgIGlzRnJvbUNvcm5lcjogYm9vbGVhbjtcbiAgICBpc0FzcGVjdFJhdGlvOiBib29sZWFuO1xufVxuXG50eXBlIFRyaXBsZUFsaWduQXhpcyA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxudHlwZSBEcmF3QWxpZ25MaW5lUmVmID0ge1xuICAgIGF4aXM6IG51bWJlcjtcbiAgICBpc0hvcml6b250YWw6IGJvb2xlYW47XG4gICAgYWxpZ25SZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXTtcbn07XG5cbmNvbnN0IEFMSUdOX1RPTEVSQU5DRSA9IDI7XG5cbmNvbnN0IEVRVUFMX1NQQUNJTkcgPSAxMDtcblxuY29uc3QgQUxJR05fU1BBQ0lORyA9IDI0O1xuXG5leHBvcnQgY2xhc3MgUmVzaXplQWxpZ25SZWFjdGlvbiB7XG4gICAgYWxpZ25SZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYm9hcmQ6IFBsYWl0Qm9hcmQsIHByaXZhdGUgYWN0aXZlRWxlbWVudHM6IFBsYWl0RWxlbWVudFtdKSB7XG4gICAgICAgIHRoaXMuYWxpZ25SZWN0YW5nbGVzID0gdGhpcy5nZXRBbGlnblJlY3RhbmdsZSgpO1xuICAgIH1cblxuICAgIGdldEFsaWduUmVjdGFuZ2xlKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGZpbmRFbGVtZW50cyh0aGlzLmJvYXJkLCB7XG4gICAgICAgICAgICBtYXRjaDogZWxlbWVudCA9PiB0aGlzLmJvYXJkLmlzQWxpZ24oZWxlbWVudCkgJiYgIXRoaXMuYWN0aXZlRWxlbWVudHMuc29tZShpdGVtID0+IGl0ZW0uaWQgPT09IGVsZW1lbnQuaWQpLFxuICAgICAgICAgICAgcmVjdXJzaW9uOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgICAgIGlzUmV2ZXJzZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5tYXAoaXRlbSA9PiB0aGlzLmJvYXJkLmdldFJlY3RhbmdsZShpdGVtKSEpO1xuICAgIH1cblxuICAgIGdldEFsaWduTGluZVJlZihyZXNpemVBbGlnbkRlbHRhOiBSZXNpemVBbGlnbkRlbHRhLCByZXNpemVBbGlnbk9wdGlvbnM6IFJlc2l6ZUFsaWduT3B0aW9ucyk6IEFsaWduTGluZVJlZiB7XG4gICAgICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVkgfSA9IHJlc2l6ZUFsaWduRGVsdGE7XG4gICAgICAgIGNvbnN0IHsgcmVzaXplU3RhdGUsIG9yaWdpblBvaW50LCBoYW5kbGVQb2ludCwgaXNGcm9tQ29ybmVyLCBpc0FzcGVjdFJhdGlvLCByZXNpemVPcmlnaW5Qb2ludHMgfSA9IHJlc2l6ZUFsaWduT3B0aW9ucztcbiAgICAgICAgY29uc3QgbmV3UmVzaXplU3RhdGU6IFJlc2l6ZVN0YXRlID0ge1xuICAgICAgICAgICAgLi4ucmVzaXplU3RhdGUsXG4gICAgICAgICAgICBlbmRQb2ludDogW3Jlc2l6ZVN0YXRlLmVuZFBvaW50WzBdICsgZGVsdGFYLCByZXNpemVTdGF0ZS5lbmRQb2ludFsxXSArIGRlbHRhWV1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyB4Wm9vbSwgeVpvb20gfSA9IGdldFJlc2l6ZVpvb20obmV3UmVzaXplU3RhdGUsIG9yaWdpblBvaW50LCBoYW5kbGVQb2ludCwgaXNGcm9tQ29ybmVyLCBpc0FzcGVjdFJhdGlvKTtcbiAgICAgICAgY29uc3QgYWN0aXZlUG9pbnRzID0gcmVzaXplT3JpZ2luUG9pbnRzLm1hcChwID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtb3ZlUG9pbnRCeVpvb21BbmRPcmlnaW5Qb2ludChwLCBvcmlnaW5Qb2ludCwgeFpvb20sIHlab29tKTtcbiAgICAgICAgfSkgYXMgW1BvaW50LCBQb2ludF07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlbHRhWCxcbiAgICAgICAgICAgIGRlbHRhWSxcbiAgICAgICAgICAgIHhab29tLFxuICAgICAgICAgICAgeVpvb20sXG4gICAgICAgICAgICBhY3RpdmVQb2ludHNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRFcXVhbExpbmVEZWx0YShyZXNpemVBbGlnbk9wdGlvbnM6IFJlc2l6ZUFsaWduT3B0aW9ucykge1xuICAgICAgICBsZXQgZXF1YWxMaW5lRGVsdGE6IFJlc2l6ZUFsaWduRGVsdGEgPSB7XG4gICAgICAgICAgICBkZWx0YVg6IDAsXG4gICAgICAgICAgICBkZWx0YVk6IDBcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBpc0FzcGVjdFJhdGlvLCBhY3RpdmVSZWN0YW5nbGUgfSA9IHJlc2l6ZUFsaWduT3B0aW9ucztcbiAgICAgICAgY29uc3Qgd2lkdGhBbGlnblJlY3RhbmdsZSA9IHRoaXMuYWxpZ25SZWN0YW5nbGVzLmZpbmQoaXRlbSA9PiBNYXRoLmFicyhpdGVtLndpZHRoIC0gYWN0aXZlUmVjdGFuZ2xlLndpZHRoKSA8IEFMSUdOX1RPTEVSQU5DRSk7XG4gICAgICAgIGlmICh3aWR0aEFsaWduUmVjdGFuZ2xlKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YVdpZHRoID0gd2lkdGhBbGlnblJlY3RhbmdsZS53aWR0aCAtIGFjdGl2ZVJlY3RhbmdsZS53aWR0aDtcbiAgICAgICAgICAgIGVxdWFsTGluZURlbHRhLmRlbHRhWCA9IGRlbHRhV2lkdGggKiByZXNpemVBbGlnbk9wdGlvbnMuZGlyZWN0aW9uRmFjdG9yc1swXTtcbiAgICAgICAgICAgIGlmIChpc0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsdGFIZWlnaHQgPSBkZWx0YVdpZHRoIC8gKGFjdGl2ZVJlY3RhbmdsZS53aWR0aCAvIGFjdGl2ZVJlY3RhbmdsZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIGVxdWFsTGluZURlbHRhLmRlbHRhWSA9IGRlbHRhSGVpZ2h0ICogcmVzaXplQWxpZ25PcHRpb25zLmRpcmVjdGlvbkZhY3RvcnNbMV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsTGluZURlbHRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodEFsaWduUmVjdGFuZ2xlID0gdGhpcy5hbGlnblJlY3RhbmdsZXMuZmluZChpdGVtID0+IE1hdGguYWJzKGl0ZW0uaGVpZ2h0IC0gYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCkgPCBBTElHTl9UT0xFUkFOQ0UpO1xuICAgICAgICBpZiAoaGVpZ2h0QWxpZ25SZWN0YW5nbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhSGVpZ2h0ID0gaGVpZ2h0QWxpZ25SZWN0YW5nbGUuaGVpZ2h0IC0gYWN0aXZlUmVjdGFuZ2xlLmhlaWdodDtcbiAgICAgICAgICAgIGVxdWFsTGluZURlbHRhLmRlbHRhWSA9IGRlbHRhSGVpZ2h0ICogcmVzaXplQWxpZ25PcHRpb25zLmRpcmVjdGlvbkZhY3RvcnNbMV07XG4gICAgICAgICAgICBpZiAoaXNBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhV2lkdGggPSBkZWx0YUhlaWdodCAqIChhY3RpdmVSZWN0YW5nbGUud2lkdGggLyBhY3RpdmVSZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBlcXVhbExpbmVEZWx0YS5kZWx0YVggPSBkZWx0YVdpZHRoICogcmVzaXplQWxpZ25PcHRpb25zLmRpcmVjdGlvbkZhY3RvcnNbMF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsTGluZURlbHRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcXVhbExpbmVEZWx0YTtcbiAgICB9XG5cbiAgICBkcmF3RXF1YWxMaW5lcyhhY3RpdmVQb2ludHM6IFBvaW50W10sIHJlc2l6ZUFsaWduT3B0aW9uczogUmVzaXplQWxpZ25PcHRpb25zKSB7XG4gICAgICAgIGxldCB3aWR0aEVxdWFsUG9pbnRzID0gW107XG4gICAgICAgIGxldCBoZWlnaHRFcXVhbFBvaW50cyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGRyYXdIb3Jpem9udGFsTGluZSA9IHJlc2l6ZUFsaWduT3B0aW9ucy5kaXJlY3Rpb25GYWN0b3JzWzBdICE9PSAwIHx8IHJlc2l6ZUFsaWduT3B0aW9ucy5pc0FzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBkcmF3VmVydGljYWxMaW5lID0gcmVzaXplQWxpZ25PcHRpb25zLmRpcmVjdGlvbkZhY3RvcnNbMV0gIT09IDAgfHwgcmVzaXplQWxpZ25PcHRpb25zLmlzQXNwZWN0UmF0aW87XG5cbiAgICAgICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGFjdGl2ZVBvaW50cyk7XG4gICAgICAgIGZvciAobGV0IGFsaWduUmVjdGFuZ2xlIG9mIHRoaXMuYWxpZ25SZWN0YW5nbGVzKSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlUmVjdGFuZ2xlLndpZHRoID09PSBhbGlnblJlY3RhbmdsZS53aWR0aCAmJiBkcmF3SG9yaXpvbnRhbExpbmUpIHtcbiAgICAgICAgICAgICAgICB3aWR0aEVxdWFsUG9pbnRzLnB1c2goZ2V0RXF1YWxMaW5lUG9pbnRzKGFsaWduUmVjdGFuZ2xlLCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCA9PT0gYWxpZ25SZWN0YW5nbGUuaGVpZ2h0ICYmIGRyYXdWZXJ0aWNhbExpbmUpIHtcbiAgICAgICAgICAgICAgICBoZWlnaHRFcXVhbFBvaW50cy5wdXNoKGdldEVxdWFsTGluZVBvaW50cyhhbGlnblJlY3RhbmdsZSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2lkdGhFcXVhbFBvaW50cy5sZW5ndGggJiYgZHJhd0hvcml6b250YWxMaW5lKSB7XG4gICAgICAgICAgICB3aWR0aEVxdWFsUG9pbnRzLnB1c2goZ2V0RXF1YWxMaW5lUG9pbnRzKGFjdGl2ZVJlY3RhbmdsZSwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHRFcXVhbFBvaW50cy5sZW5ndGggJiYgZHJhd1ZlcnRpY2FsTGluZSkge1xuICAgICAgICAgICAgaGVpZ2h0RXF1YWxQb2ludHMucHVzaChnZXRFcXVhbExpbmVQb2ludHMoYWN0aXZlUmVjdGFuZ2xlLCBmYWxzZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXF1YWxMaW5lUG9pbnRzID0gWy4uLndpZHRoRXF1YWxQb2ludHMsIC4uLmhlaWdodEVxdWFsUG9pbnRzXTtcbiAgICAgICAgcmV0dXJuIGRyYXdFcXVhbExpbmVzKHRoaXMuYm9hcmQsIGVxdWFsTGluZVBvaW50cyk7XG4gICAgfVxuXG4gICAgZ2V0QWxpZ25MaW5lRGVsdGEocmVzaXplQWxpZ25PcHRpb25zOiBSZXNpemVBbGlnbk9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGFsaWduTGluZURlbHRhOiBSZXNpemVBbGlnbkRlbHRhID0ge1xuICAgICAgICAgICAgZGVsdGFYOiAwLFxuICAgICAgICAgICAgZGVsdGFZOiAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgaXNBc3BlY3RSYXRpbywgYWN0aXZlUmVjdGFuZ2xlLCBkaXJlY3Rpb25GYWN0b3JzIH0gPSByZXNpemVBbGlnbk9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRyYXdIb3Jpem9udGFsID0gZGlyZWN0aW9uRmFjdG9yc1swXSAhPT0gMCB8fCBpc0FzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBkcmF3VmVydGljYWwgPSBkaXJlY3Rpb25GYWN0b3JzWzFdICE9PSAwIHx8IGlzQXNwZWN0UmF0aW87XG5cbiAgICAgICAgaWYgKGRyYXdIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBjb25zdCB4QWxpZ25BeGlzID0gZ2V0VHJpcGxlQWxpZ25BeGlzKGFjdGl2ZVJlY3RhbmdsZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBhbGlnblggPSBkaXJlY3Rpb25GYWN0b3JzWzBdID09PSAtMSA/IHhBbGlnbkF4aXNbMF0gOiB4QWxpZ25BeGlzWzJdO1xuICAgICAgICAgICAgY29uc3QgZGVsdGFYID0gZ2V0TWluQWxpZ25EZWx0YSh0aGlzLmFsaWduUmVjdGFuZ2xlcywgYWxpZ25YLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkZWx0YVgpIDwgQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lRGVsdGEuZGVsdGFYID0gZGVsdGFYO1xuICAgICAgICAgICAgICAgIGlmIChhbGlnbkxpbmVEZWx0YS5kZWx0YVggIT09IDAgJiYgaXNBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbkxpbmVEZWx0YS5kZWx0YVkgPSBhbGlnbkxpbmVEZWx0YS5kZWx0YVggLyAoYWN0aXZlUmVjdGFuZ2xlLndpZHRoIC8gYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbkxpbmVEZWx0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHJhd1ZlcnRpY2FsKSB7XG4gICAgICAgICAgICBjb25zdCB5QWxpZ25BeGlzID0gZ2V0VHJpcGxlQWxpZ25BeGlzKGFjdGl2ZVJlY3RhbmdsZSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgYWxpZ25ZID0gZGlyZWN0aW9uRmFjdG9yc1sxXSA9PT0gLTEgPyB5QWxpZ25BeGlzWzBdIDogeUFsaWduQXhpc1syXTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IGdldE1pbkFsaWduRGVsdGEodGhpcy5hbGlnblJlY3RhbmdsZXMsIGFsaWduWSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRlbHRhWSkgPCBBTElHTl9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICBhbGlnbkxpbmVEZWx0YS5kZWx0YVkgPSBkZWx0YVk7XG4gICAgICAgICAgICAgICAgaWYgKGFsaWduTGluZURlbHRhLmRlbHRhWSAhPT0gMCAmJiBpc0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWduTGluZURlbHRhLmRlbHRhWCA9IGFsaWduTGluZURlbHRhLmRlbHRhWSAqIChhY3RpdmVSZWN0YW5nbGUud2lkdGggLyBhY3RpdmVSZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWduTGluZURlbHRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbGlnbkxpbmVEZWx0YTtcbiAgICB9XG5cbiAgICBkcmF3QWxpZ25MaW5lcyhhY3RpdmVQb2ludHM6IFBvaW50W10sIHJlc2l6ZUFsaWduT3B0aW9uczogUmVzaXplQWxpZ25PcHRpb25zKSB7XG4gICAgICAgIGxldCBhbGlnbkxpbmVQb2ludHM6IFtQb2ludCwgUG9pbnRdW10gPSBbXTtcbiAgICAgICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGFjdGl2ZVBvaW50cyk7XG4gICAgICAgIGNvbnN0IGFsaWduQXhpc1ggPSBnZXRUcmlwbGVBbGlnbkF4aXMoYWN0aXZlUmVjdGFuZ2xlLCB0cnVlKTtcbiAgICAgICAgY29uc3QgYWxpZ25BeGlzWSA9IGdldFRyaXBsZUFsaWduQXhpcyhhY3RpdmVSZWN0YW5nbGUsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgYWxpZ25MaW5lUmVmczogRHJhd0FsaWduTGluZVJlZltdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF4aXM6IGFsaWduQXhpc1hbMF0sXG4gICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFsaWduUmVjdGFuZ2xlczogW11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXhpczogYWxpZ25BeGlzWFsyXSxcbiAgICAgICAgICAgICAgICBpc0hvcml6b250YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGVzOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBheGlzOiBhbGlnbkF4aXNZWzBdLFxuICAgICAgICAgICAgICAgIGlzSG9yaXpvbnRhbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGVzOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBheGlzOiBhbGlnbkF4aXNZWzJdLFxuICAgICAgICAgICAgICAgIGlzSG9yaXpvbnRhbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWxpZ25SZWN0YW5nbGVzOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBzZXRBbGlnbkxpbmUgPSAoYXhpczogbnVtYmVyLCBhbGlnblJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kaW5nUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmluZmxhdGUoXG4gICAgICAgICAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmdldEJvdW5kaW5nUmVjdGFuZ2xlKFthY3RpdmVSZWN0YW5nbGUsIGFsaWduUmVjdGFuZ2xlXSksXG4gICAgICAgICAgICAgICAgQUxJR05fU1BBQ0lOR1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludFN0YXJ0ID0gW2F4aXMsIGJvdW5kaW5nUmVjdGFuZ2xlLnldIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50RW5kID0gW2F4aXMsIGJvdW5kaW5nUmVjdGFuZ2xlLnkgKyBib3VuZGluZ1JlY3RhbmdsZS5oZWlnaHRdIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIGFsaWduTGluZVBvaW50cy5wdXNoKFtwb2ludFN0YXJ0LCBwb2ludEVuZF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludFN0YXJ0ID0gW2JvdW5kaW5nUmVjdGFuZ2xlLngsIGF4aXNdIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50RW5kID0gW2JvdW5kaW5nUmVjdGFuZ2xlLnggKyBib3VuZGluZ1JlY3RhbmdsZS53aWR0aCwgYXhpc10gYXMgUG9pbnQ7XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lUG9pbnRzLnB1c2goW3BvaW50U3RhcnQsIHBvaW50RW5kXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgeyBpc0FzcGVjdFJhdGlvLCBkaXJlY3Rpb25GYWN0b3JzIH0gPSByZXNpemVBbGlnbk9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRyYXdIb3Jpem9udGFsID0gZGlyZWN0aW9uRmFjdG9yc1swXSAhPT0gMCB8fCBpc0FzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBkcmF3VmVydGljYWwgPSBkaXJlY3Rpb25GYWN0b3JzWzFdICE9PSAwIHx8IGlzQXNwZWN0UmF0aW87XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYWxpZ25SZWN0YW5nbGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuYWxpZ25SZWN0YW5nbGVzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChpc0FsaWduKGFsaWduTGluZVJlZnNbMF0uYXhpcywgZWxlbWVudCwgYWxpZ25MaW5lUmVmc1swXS5pc0hvcml6b250YWwpKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lUmVmc1swXS5hbGlnblJlY3RhbmdsZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FsaWduKGFsaWduTGluZVJlZnNbMV0uYXhpcywgZWxlbWVudCwgYWxpZ25MaW5lUmVmc1sxXS5pc0hvcml6b250YWwpKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lUmVmc1sxXS5hbGlnblJlY3RhbmdsZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FsaWduKGFsaWduTGluZVJlZnNbMl0uYXhpcywgZWxlbWVudCwgYWxpZ25MaW5lUmVmc1syXS5pc0hvcml6b250YWwpKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lUmVmc1syXS5hbGlnblJlY3RhbmdsZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FsaWduKGFsaWduTGluZVJlZnNbM10uYXhpcywgZWxlbWVudCwgYWxpZ25MaW5lUmVmc1szXS5pc0hvcml6b250YWwpKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lUmVmc1szXS5hbGlnblJlY3RhbmdsZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkcmF3SG9yaXpvbnRhbCAmJiBhbGlnbkxpbmVSZWZzWzBdLmFsaWduUmVjdGFuZ2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRSZWN0YW5nbGUgPVxuICAgICAgICAgICAgICAgIGFsaWduTGluZVJlZnNbMF0uYWxpZ25SZWN0YW5nbGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICA/IGFsaWduTGluZVJlZnNbMF0uYWxpZ25SZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgICAgIDogZ2V0TmVhcmVzdEFsaWduUmVjdGFuZ2xlKGFsaWduTGluZVJlZnNbMF0uYWxpZ25SZWN0YW5nbGVzLCBhY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICAgICAgc2V0QWxpZ25MaW5lKGFsaWduTGluZVJlZnNbMF0uYXhpcywgbGVmdFJlY3RhbmdsZSwgYWxpZ25MaW5lUmVmc1swXS5pc0hvcml6b250YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRyYXdIb3Jpem9udGFsICYmIGFsaWduTGluZVJlZnNbMV0uYWxpZ25SZWN0YW5nbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmlnaHRSZWN0YW5nbGUgPVxuICAgICAgICAgICAgICAgIGFsaWduTGluZVJlZnNbMV0uYWxpZ25SZWN0YW5nbGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICA/IGFsaWduTGluZVJlZnNbMV0uYWxpZ25SZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgICAgIDogZ2V0TmVhcmVzdEFsaWduUmVjdGFuZ2xlKGFsaWduTGluZVJlZnNbMV0uYWxpZ25SZWN0YW5nbGVzLCBhY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICAgICAgc2V0QWxpZ25MaW5lKGFsaWduTGluZVJlZnNbMV0uYXhpcywgcmlnaHRSZWN0YW5nbGUsIGFsaWduTGluZVJlZnNbMV0uaXNIb3Jpem9udGFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkcmF3VmVydGljYWwgJiYgYWxpZ25MaW5lUmVmc1syXS5hbGlnblJlY3RhbmdsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0b3BSZWN0YW5nbGUgPVxuICAgICAgICAgICAgICAgIGFsaWduTGluZVJlZnNbMl0uYWxpZ25SZWN0YW5nbGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICA/IGFsaWduTGluZVJlZnNbMl0uYWxpZ25SZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgICAgIDogZ2V0TmVhcmVzdEFsaWduUmVjdGFuZ2xlKGFsaWduTGluZVJlZnNbMl0uYWxpZ25SZWN0YW5nbGVzLCBhY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICAgICAgc2V0QWxpZ25MaW5lKGFsaWduTGluZVJlZnNbMl0uYXhpcywgdG9wUmVjdGFuZ2xlLCBhbGlnbkxpbmVSZWZzWzJdLmlzSG9yaXpvbnRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHJhd1ZlcnRpY2FsICYmIGFsaWduTGluZVJlZnNbM10uYWxpZ25SZWN0YW5nbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYm90dG9tUmVjdGFuZ2xlID1cbiAgICAgICAgICAgICAgICBhbGlnbkxpbmVSZWZzWzNdLmFsaWduUmVjdGFuZ2xlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgPyBhbGlnbkxpbmVSZWZzWzNdLmFsaWduUmVjdGFuZ2xlc1swXVxuICAgICAgICAgICAgICAgICAgICA6IGdldE5lYXJlc3RBbGlnblJlY3RhbmdsZShhbGlnbkxpbmVSZWZzWzNdLmFsaWduUmVjdGFuZ2xlcywgYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgICAgIHNldEFsaWduTGluZShhbGlnbkxpbmVSZWZzWzNdLmF4aXMsIGJvdHRvbVJlY3RhbmdsZSwgYWxpZ25MaW5lUmVmc1szXS5pc0hvcml6b250YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRyYXdBbGlnbkxpbmVzKHRoaXMuYm9hcmQsIGFsaWduTGluZVBvaW50cyk7XG4gICAgfVxuXG4gICAgaGFuZGxlUmVzaXplQWxpZ24ocmVzaXplQWxpZ25PcHRpb25zOiBSZXNpemVBbGlnbk9wdGlvbnMpOiBSZXNpemVBbGlnblJlZiB7XG4gICAgICAgIGNvbnN0IGFsaWduRyA9IGNyZWF0ZUcoKTtcbiAgICAgICAgbGV0IGFsaWduTGluZURlbHRhID0gdGhpcy5nZXRFcXVhbExpbmVEZWx0YShyZXNpemVBbGlnbk9wdGlvbnMpO1xuICAgICAgICBpZiAoYWxpZ25MaW5lRGVsdGEuZGVsdGFYID09PSAwICYmIGFsaWduTGluZURlbHRhLmRlbHRhWSA9PT0gMCkge1xuICAgICAgICAgICAgYWxpZ25MaW5lRGVsdGEgPSB0aGlzLmdldEFsaWduTGluZURlbHRhKHJlc2l6ZUFsaWduT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXF1YWxMaW5lUmVmID0gdGhpcy5nZXRBbGlnbkxpbmVSZWYoYWxpZ25MaW5lRGVsdGEsIHJlc2l6ZUFsaWduT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVxdWFsTGluZXNHID0gdGhpcy5kcmF3RXF1YWxMaW5lcyhlcXVhbExpbmVSZWYuYWN0aXZlUG9pbnRzLCByZXNpemVBbGlnbk9wdGlvbnMpO1xuICAgICAgICBjb25zdCBhbGlnbkxpbmVzRyA9IHRoaXMuZHJhd0FsaWduTGluZXMoZXF1YWxMaW5lUmVmLmFjdGl2ZVBvaW50cywgcmVzaXplQWxpZ25PcHRpb25zKTtcbiAgICAgICAgYWxpZ25HLmFwcGVuZChlcXVhbExpbmVzRywgYWxpZ25MaW5lc0cpO1xuICAgICAgICByZXR1cm4geyAuLi5lcXVhbExpbmVSZWYsIGFsaWduRyB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmFyUG9pbnQocG9pbnQ6IFBvaW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gaXNIb3Jpem9udGFsXG4gICAgICAgID8gW1xuICAgICAgICAgICAgICBbcG9pbnRbMF0sIHBvaW50WzFdIC0gNF0sXG4gICAgICAgICAgICAgIFtwb2ludFswXSwgcG9pbnRbMV0gKyA0XVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICAgIFtwb2ludFswXSAtIDQsIHBvaW50WzFdXSxcbiAgICAgICAgICAgICAgW3BvaW50WzBdICsgNCwgcG9pbnRbMV1dXG4gICAgICAgICAgXTtcbn1cblxuZnVuY3Rpb24gZ2V0RXF1YWxMaW5lUG9pbnRzKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pOiBQb2ludFtdIHtcbiAgICByZXR1cm4gaXNIb3Jpem9udGFsXG4gICAgICAgID8gW1xuICAgICAgICAgICAgICBbcmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55IC0gRVFVQUxfU1BBQ0lOR10sXG4gICAgICAgICAgICAgIFtyZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCwgcmVjdGFuZ2xlLnkgLSBFUVVBTF9TUEFDSU5HXVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICAgIFtyZWN0YW5nbGUueCAtIEVRVUFMX1NQQUNJTkcsIHJlY3RhbmdsZS55XSxcbiAgICAgICAgICAgICAgW3JlY3RhbmdsZS54IC0gRVFVQUxfU1BBQ0lORywgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0XVxuICAgICAgICAgIF07XG59XG5cbmZ1bmN0aW9uIGRyYXdFcXVhbExpbmVzKGJvYXJkOiBQbGFpdEJvYXJkLCBsaW5lczogUG9pbnRbXVtdKSB7XG4gICAgY29uc3QgZyA9IGNyZWF0ZUcoKTtcbiAgICBsaW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgICBpZiAoIWxpbmUubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHlBbGlnbiA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLmxpbmUobGluZVswXVswXSwgbGluZVswXVsxXSwgbGluZVsxXVswXSwgbGluZVsxXVsxXSwge1xuICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDFcbiAgICAgICAgfSk7XG4gICAgICAgIGcuYXBwZW5kQ2hpbGQoeUFsaWduKTtcbiAgICAgICAgbGluZS5mb3JFYWNoKHBvaW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhclBvaW50ID0gZ2V0QmFyUG9pbnQocG9pbnQsICEhUG9pbnQuaXNIb3Jpem9udGFsKGxpbmVbMF0sIGxpbmVbMV0pKTtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLmxpbmUoYmFyUG9pbnRbMF1bMF0sIGJhclBvaW50WzBdWzFdLCBiYXJQb2ludFsxXVswXSwgYmFyUG9pbnRbMV1bMV0sIHtcbiAgICAgICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZy5hcHBlbmRDaGlsZChiYXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZztcbn1cblxuZnVuY3Rpb24gZHJhd0FsaWduTGluZXMoYm9hcmQ6IFBsYWl0Qm9hcmQsIGxpbmVzOiBbUG9pbnQsIFBvaW50XVtdKSB7XG4gICAgY29uc3QgZyA9IGNyZWF0ZUcoKTtcbiAgICBsaW5lcy5mb3JFYWNoKHBvaW50cyA9PiB7XG4gICAgICAgIGlmICghcG9pbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB4QWxpZ24gPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5saW5lKHBvaW50c1swXVswXSwgcG9pbnRzWzBdWzFdLCBwb2ludHNbMV1bMF0sIHBvaW50c1sxXVsxXSwge1xuICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXG4gICAgICAgICAgICBzdHJva2VMaW5lRGFzaDogWzQsIDRdXG4gICAgICAgIH0pO1xuICAgICAgICBnLmFwcGVuZENoaWxkKHhBbGlnbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGc7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUcmlwbGVBbGlnbkF4aXMgPSAocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIGlzSG9yaXpvbnRhbDogYm9vbGVhbik6IFRyaXBsZUFsaWduQXhpcyA9PiB7XG4gICAgY29uc3QgYXhpcyA9IGlzSG9yaXpvbnRhbCA/ICd4JyA6ICd5JztcbiAgICBjb25zdCBzaWRlID0gaXNIb3Jpem9udGFsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHJldHVybiBbcmVjdGFuZ2xlW2F4aXNdLCByZWN0YW5nbGVbYXhpc10gKyByZWN0YW5nbGVbc2lkZV0gLyAyLCByZWN0YW5nbGVbYXhpc10gKyByZWN0YW5nbGVbc2lkZV1dO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQWxpZ24gPSAoYXhpczogbnVtYmVyLCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgaXNIb3Jpem9udGFsOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgYWxpZ25BeGlzID0gZ2V0VHJpcGxlQWxpZ25BeGlzKHJlY3RhbmdsZSwgaXNIb3Jpem9udGFsKTtcbiAgICByZXR1cm4gYWxpZ25BeGlzLmluY2x1ZGVzKGF4aXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENsb3Nlc3REZWx0YSA9IChheGlzOiBudW1iZXIsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCBhbGlnbkF4aXMgPSBnZXRUcmlwbGVBbGlnbkF4aXMocmVjdGFuZ2xlLCBpc0hvcml6b250YWwpO1xuICAgIGNvbnN0IGRlbHRhcyA9IGFsaWduQXhpcy5tYXAoaXRlbSA9PiBpdGVtIC0gYXhpcyk7XG4gICAgY29uc3QgYWJzRGVsdGFzID0gZGVsdGFzLm1hcChpdGVtID0+IE1hdGguYWJzKGl0ZW0pKTtcbiAgICBjb25zdCBpbmRleCA9IGFic0RlbHRhcy5pbmRleE9mKE1hdGgubWluKC4uLmFic0RlbHRhcykpO1xuICAgIHJldHVybiBkZWx0YXNbaW5kZXhdO1xufTtcblxuZnVuY3Rpb24gZ2V0TWluQWxpZ25EZWx0YShhbGlnblJlY3RhbmdsZXM6IFJlY3RhbmdsZUNsaWVudFtdLCBheGlzOiBudW1iZXIsIGlzSG9yaXpvbnRhbDogYm9vbGVhbikge1xuICAgIGxldCBkZWx0YSA9IEFMSUdOX1RPTEVSQU5DRTtcblxuICAgIGFsaWduUmVjdGFuZ2xlcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGdldENsb3Nlc3REZWx0YShheGlzLCBpdGVtLCBpc0hvcml6b250YWwpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2UpIDwgTWF0aC5hYnMoZGVsdGEpKSB7XG4gICAgICAgICAgICBkZWx0YSA9IGRpc3RhbmNlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbHRhO1xufVxuXG5mdW5jdGlvbiBnZXROZWFyZXN0QWxpZ25SZWN0YW5nbGUoYWxpZ25SZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSwgYWN0aXZlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICBsZXQgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICBsZXQgbmVhcmVzdFJlY3RhbmdsZSA9IGFsaWduUmVjdGFuZ2xlc1swXTtcblxuICAgIGFsaWduUmVjdGFuZ2xlcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChNYXRoLnBvdyhhY3RpdmVSZWN0YW5nbGUueCAtIGl0ZW0ueCwgMikgKyBNYXRoLnBvdyhhY3RpdmVSZWN0YW5nbGUueSAtIGl0ZW0ueSwgMikpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIG5lYXJlc3RSZWN0YW5nbGUgPSBpdGVtO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5lYXJlc3RSZWN0YW5nbGU7XG59XG4iXX0=
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { RectangleClient, getRectangleByElements } from '@plait/core';
|
|
2
|
-
import { getResizeZoom, movePointByZoomAndOriginPoint } from '../plugins/with-draw-resize';
|
|
3
|
-
import { getDirectionFactorByDirectionComponent, getUnitVectorByPointAndPoint } from '@plait/common';
|
|
4
|
-
import { ResizeAlignReaction } from './resize-align-reaction';
|
|
5
|
-
export function getResizeAlignRef(board, resizeRef, resizeState, resizeOriginPointAndHandlePoint, isAspectRatio, isFromCorner) {
|
|
6
|
-
const { originPoint, handlePoint } = resizeOriginPointAndHandlePoint;
|
|
7
|
-
const { xZoom, yZoom } = getResizeZoom(resizeState, originPoint, handlePoint, isFromCorner, isAspectRatio);
|
|
8
|
-
let activeElements;
|
|
9
|
-
let resizeOriginPoints = [];
|
|
10
|
-
if (Array.isArray(resizeRef.element)) {
|
|
11
|
-
activeElements = resizeRef.element;
|
|
12
|
-
const rectangle = getRectangleByElements(board, resizeRef.element, false);
|
|
13
|
-
resizeOriginPoints = RectangleClient.getPoints(rectangle);
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
activeElements = [resizeRef.element];
|
|
17
|
-
resizeOriginPoints = resizeRef.element.points;
|
|
18
|
-
}
|
|
19
|
-
const points = resizeOriginPoints.map(p => {
|
|
20
|
-
return movePointByZoomAndOriginPoint(p, originPoint, xZoom, yZoom);
|
|
21
|
-
});
|
|
22
|
-
const activeRectangle = RectangleClient.getRectangleByPoints(points);
|
|
23
|
-
const resizeAlignReaction = new ResizeAlignReaction(board, activeElements);
|
|
24
|
-
const resizeHandlePoint = movePointByZoomAndOriginPoint(handlePoint, originPoint, xZoom, yZoom);
|
|
25
|
-
const [x, y] = getUnitVectorByPointAndPoint(originPoint, resizeHandlePoint);
|
|
26
|
-
return resizeAlignReaction.handleResizeAlign({
|
|
27
|
-
resizeState,
|
|
28
|
-
resizeOriginPoints,
|
|
29
|
-
activeRectangle,
|
|
30
|
-
originPoint,
|
|
31
|
-
handlePoint,
|
|
32
|
-
directionFactors: [getDirectionFactorByDirectionComponent(x), getDirectionFactorByDirectionComponent(y)],
|
|
33
|
-
isAspectRatio,
|
|
34
|
-
isFromCorner
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLWFsaWduLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvdXRpbHMvcmVzaXplLWFsaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsZUFBZSxFQUFFLHNCQUFzQixFQUFpQyxNQUFNLGFBQWEsQ0FBQztBQUN4SCxPQUFPLEVBQUUsYUFBYSxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0YsT0FBTyxFQUEwQixzQ0FBc0MsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3SCxPQUFPLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFFOUUsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixLQUFpQixFQUNqQixTQUEyRCxFQUMzRCxXQUF3QixFQUN4QiwrQkFHQyxFQUNELGFBQXNCLEVBQ3RCLFlBQXFCO0lBRXJCLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsK0JBQStCLENBQUM7SUFDckUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRTNHLElBQUksY0FBOEIsQ0FBQztJQUNuQyxJQUFJLGtCQUFrQixHQUFZLEVBQUUsQ0FBQztJQUNyQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbkMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsa0JBQWtCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO1NBQU0sQ0FBQztRQUNKLGNBQWMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxrQkFBa0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3RDLE9BQU8sNkJBQTZCLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFtQixDQUFDO0lBQ3JCLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVyRSxNQUFNLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0saUJBQWlCLEdBQUcsNkJBQTZCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUU1RSxPQUFPLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDO1FBQ3pDLFdBQVc7UUFDWCxrQkFBa0I7UUFDbEIsZUFBZTtRQUNmLFdBQVc7UUFDWCxXQUFXO1FBQ1gsZ0JBQWdCLEVBQUUsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUMsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RyxhQUFhO1FBQ2IsWUFBWTtLQUNmLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50LCBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzLCBQbGFpdEVsZW1lbnQsIERpcmVjdGlvbkZhY3RvciB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IGdldFJlc2l6ZVpvb20sIG1vdmVQb2ludEJ5Wm9vbUFuZE9yaWdpblBvaW50IH0gZnJvbSAnLi4vcGx1Z2lucy93aXRoLWRyYXctcmVzaXplJztcbmltcG9ydCB7IFJlc2l6ZVJlZiwgUmVzaXplU3RhdGUsIGdldERpcmVjdGlvbkZhY3RvckJ5RGlyZWN0aW9uQ29tcG9uZW50LCBnZXRVbml0VmVjdG9yQnlQb2ludEFuZFBvaW50IH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBQbGFpdERyYXdFbGVtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSZXNpemVBbGlnblJlYWN0aW9uLCBSZXNpemVBbGlnblJlZiB9IGZyb20gJy4vcmVzaXplLWFsaWduLXJlYWN0aW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc2l6ZUFsaWduUmVmKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIHJlc2l6ZVJlZjogUmVzaXplUmVmPFBsYWl0RHJhd0VsZW1lbnQgfCBQbGFpdERyYXdFbGVtZW50W10+LFxuICAgIHJlc2l6ZVN0YXRlOiBSZXNpemVTdGF0ZSxcbiAgICByZXNpemVPcmlnaW5Qb2ludEFuZEhhbmRsZVBvaW50OiB7XG4gICAgICAgIG9yaWdpblBvaW50OiBQb2ludDtcbiAgICAgICAgaGFuZGxlUG9pbnQ6IFBvaW50O1xuICAgIH0sXG4gICAgaXNBc3BlY3RSYXRpbzogYm9vbGVhbixcbiAgICBpc0Zyb21Db3JuZXI6IGJvb2xlYW5cbik6IFJlc2l6ZUFsaWduUmVmIHtcbiAgICBjb25zdCB7IG9yaWdpblBvaW50LCBoYW5kbGVQb2ludCB9ID0gcmVzaXplT3JpZ2luUG9pbnRBbmRIYW5kbGVQb2ludDtcbiAgICBjb25zdCB7IHhab29tLCB5Wm9vbSB9ID0gZ2V0UmVzaXplWm9vbShyZXNpemVTdGF0ZSwgb3JpZ2luUG9pbnQsIGhhbmRsZVBvaW50LCBpc0Zyb21Db3JuZXIsIGlzQXNwZWN0UmF0aW8pO1xuXG4gICAgbGV0IGFjdGl2ZUVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXTtcbiAgICBsZXQgcmVzaXplT3JpZ2luUG9pbnRzOiBQb2ludFtdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzaXplUmVmLmVsZW1lbnQpKSB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRzID0gcmVzaXplUmVmLmVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMoYm9hcmQsIHJlc2l6ZVJlZi5lbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIHJlc2l6ZU9yaWdpblBvaW50cyA9IFJlY3RhbmdsZUNsaWVudC5nZXRQb2ludHMocmVjdGFuZ2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVFbGVtZW50cyA9IFtyZXNpemVSZWYuZWxlbWVudF07XG4gICAgICAgIHJlc2l6ZU9yaWdpblBvaW50cyA9IHJlc2l6ZVJlZi5lbGVtZW50LnBvaW50cztcbiAgICB9XG5cbiAgICBjb25zdCBwb2ludHMgPSByZXNpemVPcmlnaW5Qb2ludHMubWFwKHAgPT4ge1xuICAgICAgICByZXR1cm4gbW92ZVBvaW50Qnlab29tQW5kT3JpZ2luUG9pbnQocCwgb3JpZ2luUG9pbnQsIHhab29tLCB5Wm9vbSk7XG4gICAgfSkgYXMgW1BvaW50LCBQb2ludF07XG4gICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKHBvaW50cyk7XG5cbiAgICBjb25zdCByZXNpemVBbGlnblJlYWN0aW9uID0gbmV3IFJlc2l6ZUFsaWduUmVhY3Rpb24oYm9hcmQsIGFjdGl2ZUVsZW1lbnRzKTtcbiAgICBjb25zdCByZXNpemVIYW5kbGVQb2ludCA9IG1vdmVQb2ludEJ5Wm9vbUFuZE9yaWdpblBvaW50KGhhbmRsZVBvaW50LCBvcmlnaW5Qb2ludCwgeFpvb20sIHlab29tKTtcbiAgICBjb25zdCBbeCwgeV0gPSBnZXRVbml0VmVjdG9yQnlQb2ludEFuZFBvaW50KG9yaWdpblBvaW50LCByZXNpemVIYW5kbGVQb2ludCk7XG5cbiAgICByZXR1cm4gcmVzaXplQWxpZ25SZWFjdGlvbi5oYW5kbGVSZXNpemVBbGlnbih7XG4gICAgICAgIHJlc2l6ZVN0YXRlLFxuICAgICAgICByZXNpemVPcmlnaW5Qb2ludHMsXG4gICAgICAgIGFjdGl2ZVJlY3RhbmdsZSxcbiAgICAgICAgb3JpZ2luUG9pbnQsXG4gICAgICAgIGhhbmRsZVBvaW50LFxuICAgICAgICBkaXJlY3Rpb25GYWN0b3JzOiBbZ2V0RGlyZWN0aW9uRmFjdG9yQnlEaXJlY3Rpb25Db21wb25lbnQoeCksIGdldERpcmVjdGlvbkZhY3RvckJ5RGlyZWN0aW9uQ29tcG9uZW50KHkpXSxcbiAgICAgICAgaXNBc3BlY3RSYXRpbyxcbiAgICAgICAgaXNGcm9tQ29ybmVyXG4gICAgfSk7XG59XG4iXX0=
|
package/group.component.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { OnInit, OnDestroy, ViewContainerRef, ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import { ActiveGenerator, CommonPluginElement } from '@plait/common';
|
|
3
|
-
import { OnContextChanged, PlaitBoard, PlaitGroup, PlaitPluginElementContext } from '@plait/core';
|
|
4
|
-
import { GroupGenerator } from './generators/group.generator';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export declare class GroupComponent extends CommonPluginElement<PlaitGroup, PlaitBoard> implements OnInit, OnDestroy, OnContextChanged<PlaitGroup, PlaitBoard> {
|
|
7
|
-
private viewContainerRef;
|
|
8
|
-
protected cdr: ChangeDetectorRef;
|
|
9
|
-
constructor(viewContainerRef: ViewContainerRef, cdr: ChangeDetectorRef);
|
|
10
|
-
activeGenerator: ActiveGenerator<PlaitGroup>;
|
|
11
|
-
groupGenerator: GroupGenerator;
|
|
12
|
-
initializeGenerator(): void;
|
|
13
|
-
ngOnInit(): void;
|
|
14
|
-
onContextChanged(value: PlaitPluginElementContext<PlaitGroup, PlaitBoard>, previous: PlaitPluginElementContext<PlaitGroup, PlaitBoard>): void;
|
|
15
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<GroupComponent, never>;
|
|
16
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<GroupComponent, "plait-group", never, {}, {}, never, never, true, never>;
|
|
17
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { ResizeState } from '@plait/common';
|
|
2
|
-
import { DirectionFactors, PlaitBoard, PlaitElement, Point, RectangleClient } from '@plait/core';
|
|
3
|
-
export interface ResizeAlignDelta {
|
|
4
|
-
deltaX: number;
|
|
5
|
-
deltaY: number;
|
|
6
|
-
}
|
|
7
|
-
export interface AlignLineRef extends ResizeAlignDelta {
|
|
8
|
-
xZoom: number;
|
|
9
|
-
yZoom: number;
|
|
10
|
-
activePoints: Point[];
|
|
11
|
-
}
|
|
12
|
-
export interface ResizeAlignRef extends AlignLineRef {
|
|
13
|
-
alignG: SVGGElement;
|
|
14
|
-
}
|
|
15
|
-
export interface ResizeAlignOptions {
|
|
16
|
-
resizeState: ResizeState;
|
|
17
|
-
resizeOriginPoints: Point[];
|
|
18
|
-
activeRectangle: RectangleClient;
|
|
19
|
-
directionFactors: DirectionFactors;
|
|
20
|
-
originPoint: Point;
|
|
21
|
-
handlePoint: Point;
|
|
22
|
-
isFromCorner: boolean;
|
|
23
|
-
isAspectRatio: boolean;
|
|
24
|
-
}
|
|
25
|
-
type TripleAlignAxis = [number, number, number];
|
|
26
|
-
export declare class ResizeAlignReaction {
|
|
27
|
-
private board;
|
|
28
|
-
private activeElements;
|
|
29
|
-
alignRectangles: RectangleClient[];
|
|
30
|
-
constructor(board: PlaitBoard, activeElements: PlaitElement[]);
|
|
31
|
-
getAlignRectangle(): RectangleClient[];
|
|
32
|
-
getAlignLineRef(resizeAlignDelta: ResizeAlignDelta, resizeAlignOptions: ResizeAlignOptions): AlignLineRef;
|
|
33
|
-
getEqualLineDelta(resizeAlignOptions: ResizeAlignOptions): ResizeAlignDelta;
|
|
34
|
-
drawEqualLines(activePoints: Point[], resizeAlignOptions: ResizeAlignOptions): SVGGElement;
|
|
35
|
-
getAlignLineDelta(resizeAlignOptions: ResizeAlignOptions): ResizeAlignDelta;
|
|
36
|
-
drawAlignLines(activePoints: Point[], resizeAlignOptions: ResizeAlignOptions): SVGGElement;
|
|
37
|
-
handleResizeAlign(resizeAlignOptions: ResizeAlignOptions): ResizeAlignRef;
|
|
38
|
-
}
|
|
39
|
-
export declare const getTripleAlignAxis: (rectangle: RectangleClient, isHorizontal: boolean) => TripleAlignAxis;
|
|
40
|
-
export declare const isAlign: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => boolean;
|
|
41
|
-
export declare const getClosestDelta: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => number;
|
|
42
|
-
export {};
|
package/utils/resize-align.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, Point } from '@plait/core';
|
|
2
|
-
import { ResizeRef, ResizeState } from '@plait/common';
|
|
3
|
-
import { PlaitDrawElement } from '../interfaces';
|
|
4
|
-
import { ResizeAlignRef } from './resize-align-reaction';
|
|
5
|
-
export declare function getResizeAlignRef(board: PlaitBoard, resizeRef: ResizeRef<PlaitDrawElement | PlaitDrawElement[]>, resizeState: ResizeState, resizeOriginPointAndHandlePoint: {
|
|
6
|
-
originPoint: Point;
|
|
7
|
-
handlePoint: Point;
|
|
8
|
-
}, isAspectRatio: boolean, isFromCorner: boolean): ResizeAlignRef;
|