@plait/draw 0.1.0-next.11 → 0.1.0-next.13
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/image.d.ts +1 -0
- package/constants/index.d.ts +1 -0
- package/constants/pointer.d.ts +4 -10
- package/engines/comment.d.ts +4 -0
- package/engines/cross.d.ts +4 -0
- package/{utils/engine → engines}/diamond.d.ts +1 -1
- package/{utils/engine → engines}/ellipse.d.ts +1 -1
- package/engines/hexagon.d.ts +4 -0
- package/{utils/engine → engines}/index.d.ts +1 -1
- package/engines/left-arrow.d.ts +4 -0
- package/engines/octagon.d.ts +4 -0
- package/engines/parallelogram.d.ts +4 -0
- package/engines/pentagon-arrow.d.ts +4 -0
- package/engines/pentagon.d.ts +4 -0
- package/engines/process-arrow.d.ts +4 -0
- package/{utils/engine → engines}/rectangle.d.ts +1 -1
- package/engines/right-arrow.d.ts +4 -0
- package/engines/round-comment.d.ts +4 -0
- package/{utils/engine → engines}/round-rectangle.d.ts +1 -1
- package/engines/star.d.ts +4 -0
- package/engines/trapezoid.d.ts +4 -0
- package/engines/triangle.d.ts +4 -0
- package/engines/two-way-arrow.d.ts +4 -0
- package/esm2022/constants/geometry.mjs +3 -3
- package/esm2022/constants/image.mjs +2 -0
- package/esm2022/constants/index.mjs +2 -1
- package/esm2022/constants/pointer.mjs +8 -19
- package/esm2022/engines/comment.mjs +57 -0
- package/esm2022/engines/cross.mjs +46 -0
- package/esm2022/engines/diamond.mjs +30 -0
- package/esm2022/engines/ellipse.mjs +92 -0
- package/esm2022/engines/hexagon.mjs +40 -0
- package/esm2022/engines/index.mjs +46 -0
- package/esm2022/engines/left-arrow.mjs +45 -0
- package/esm2022/engines/octagon.mjs +42 -0
- package/esm2022/engines/parallelogram.mjs +39 -0
- package/esm2022/engines/pentagon-arrow.mjs +39 -0
- package/esm2022/engines/pentagon.mjs +39 -0
- package/esm2022/engines/process-arrow.mjs +41 -0
- package/esm2022/engines/rectangle.mjs +26 -0
- package/esm2022/engines/right-arrow.mjs +45 -0
- package/esm2022/engines/round-comment.mjs +81 -0
- package/esm2022/engines/round-rectangle.mjs +59 -0
- package/esm2022/engines/star.mjs +45 -0
- package/esm2022/engines/trapezoid.mjs +40 -0
- package/esm2022/engines/triangle.mjs +40 -0
- package/esm2022/engines/two-way-arrow.mjs +48 -0
- package/esm2022/generators/geometry-shape.generator.mjs +7 -2
- package/esm2022/generators/line-active.generator.mjs +49 -16
- package/esm2022/generators/line.generator.mjs +2 -11
- package/esm2022/geometry.component.mjs +13 -7
- package/esm2022/image.component.mjs +70 -0
- package/esm2022/interfaces/geometry.mjs +15 -1
- package/esm2022/interfaces/image.mjs +2 -0
- package/esm2022/interfaces/index.mjs +8 -2
- package/esm2022/interfaces/line.mjs +27 -4
- package/esm2022/line.component.mjs +4 -3
- package/esm2022/plugins/with-draw-fragment.mjs +20 -2
- package/esm2022/plugins/with-draw.mjs +25 -4
- package/esm2022/plugins/with-geometry-create.mjs +15 -12
- package/esm2022/plugins/with-geometry-resize.mjs +17 -11
- package/esm2022/plugins/with-line-bound-reaction.mjs +10 -5
- package/esm2022/plugins/with-line-create.mjs +7 -5
- package/esm2022/plugins/with-line-resize.mjs +12 -4
- package/esm2022/transforms/geometry-text.mjs +1 -1
- package/esm2022/transforms/image.mjs +23 -0
- package/esm2022/transforms/index.mjs +4 -2
- package/esm2022/utils/clipboard.mjs +3 -3
- package/esm2022/utils/geometry.mjs +20 -6
- package/esm2022/utils/index.mjs +1 -1
- package/esm2022/utils/line-arrow.mjs +43 -18
- package/esm2022/utils/line.mjs +197 -47
- package/esm2022/utils/position/geometry.mjs +5 -4
- package/esm2022/utils/position/line.mjs +32 -22
- package/esm2022/utils/selected.mjs +5 -1
- package/esm2022/utils/shape.mjs +8 -0
- package/fesm2022/plait-draw.mjs +1367 -253
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/line-active.generator.d.ts +2 -0
- package/generators/line.generator.d.ts +1 -1
- package/geometry.component.d.ts +1 -1
- package/image.component.d.ts +20 -0
- package/interfaces/geometry.d.ts +20 -2
- package/interfaces/image.d.ts +7 -0
- package/interfaces/index.d.ts +5 -1
- package/interfaces/line.d.ts +19 -5
- package/line.component.d.ts +1 -1
- package/package.json +3 -2
- package/plugins/with-geometry-create.d.ts +1 -1
- package/styles/styles.scss +1 -1
- package/transforms/image.d.ts +3 -0
- package/transforms/index.d.ts +1 -0
- package/utils/geometry.d.ts +1 -0
- package/utils/line.d.ts +14 -6
- package/utils/position/geometry.d.ts +2 -1
- package/utils/position/line.d.ts +7 -3
- package/utils/selected.d.ts +2 -0
- package/utils/shape.d.ts +2 -0
- package/esm2022/utils/engine/diamond.mjs +0 -22
- package/esm2022/utils/engine/ellipse.mjs +0 -55
- package/esm2022/utils/engine/index.mjs +0 -18
- package/esm2022/utils/engine/parallelogram.mjs +0 -32
- package/esm2022/utils/engine/rectangle.mjs +0 -18
- package/esm2022/utils/engine/round-rectangle.mjs +0 -49
- package/utils/engine/parallelogram.d.ts +0 -4
package/esm2022/utils/line.mjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { idCreator, distanceBetweenPointAndSegments, createG, getElementById, RectangleClient, findElements, drawLinearPath, createMask, createRect, ACTIVE_STROKE_WIDTH } from '@plait/core';
|
|
2
|
-
import { getPoints,
|
|
3
|
-
import { LineMarkerType, LineShape, PlaitDrawElement, PlaitLine } from '../interfaces';
|
|
1
|
+
import { idCreator, distanceBetweenPointAndSegments, PlaitBoard, createG, getElementById, RectangleClient, findElements, drawLinearPath, createMask, createRect, ACTIVE_STROKE_WIDTH, distanceBetweenPointAndPoint } from '@plait/core';
|
|
2
|
+
import { getPoints, getRectangleByPoints, getPointOnPolyline, getDirectionFactor, rotateVectorAnti90, getDirectionByVector, getOppositeDirection, getDirectionByPointOfRectangle, getPointByVector } from '@plait/common';
|
|
3
|
+
import { LineHandleKey, LineMarkerType, LineShape, PlaitDrawElement, PlaitLine } from '../interfaces';
|
|
4
4
|
import { getPointsByCenterPoint, getNearestPoint } from './geometry';
|
|
5
5
|
import { getLineDashByElement, getStrokeColorByElement, getStrokeWidthByElement } from './style/stroke';
|
|
6
|
-
import { getEngine } from '
|
|
6
|
+
import { getEngine } from '../engines';
|
|
7
7
|
import { drawLineArrow } from './line-arrow';
|
|
8
|
+
import { pointsOnBezierCurves } from 'points-on-curve';
|
|
9
|
+
import { getShape } from './shape';
|
|
8
10
|
export const createLineElement = (shape, points, source, target, options) => {
|
|
9
11
|
return {
|
|
10
12
|
id: idCreator(),
|
|
@@ -19,28 +21,127 @@ export const createLineElement = (shape, points, source, target, options) => {
|
|
|
19
21
|
};
|
|
20
22
|
};
|
|
21
23
|
export const getLinePoints = (board, element) => {
|
|
22
|
-
|
|
24
|
+
switch (element.shape) {
|
|
25
|
+
case LineShape.elbow: {
|
|
26
|
+
return getElbowPoints(board, element);
|
|
27
|
+
}
|
|
28
|
+
case LineShape.curve: {
|
|
29
|
+
return getCurvePoints(board, element);
|
|
30
|
+
}
|
|
31
|
+
default: {
|
|
32
|
+
return PlaitLine.getPoints(board, element);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
23
35
|
};
|
|
24
|
-
export const
|
|
25
|
-
|
|
36
|
+
export const getLineHandleRefPair = (board, element) => {
|
|
37
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
38
|
+
const sourceBoundElement = element.source.boundId ? getElementById(board, element.source.boundId) : undefined;
|
|
39
|
+
const targetBoundElement = element.target.boundId ? getElementById(board, element.target.boundId) : undefined;
|
|
40
|
+
let sourcePoint = sourceBoundElement ? getConnectionPoint(sourceBoundElement, element.source.connection) : element.points[0];
|
|
41
|
+
let targetPoint = targetBoundElement
|
|
42
|
+
? getConnectionPoint(targetBoundElement, element.target.connection)
|
|
43
|
+
: element.points[element.points.length - 1];
|
|
44
|
+
let sourceDirection = getDirectionByVector([targetPoint[0] - sourcePoint[0], targetPoint[1] - sourcePoint[1]]);
|
|
45
|
+
let targetDirection = getOppositeDirection(sourceDirection);
|
|
46
|
+
const sourceFactor = getDirectionFactor(sourceDirection);
|
|
47
|
+
const targetFactor = getDirectionFactor(targetDirection);
|
|
48
|
+
const sourceHandleRef = {
|
|
49
|
+
key: LineHandleKey.source,
|
|
50
|
+
point: sourcePoint,
|
|
51
|
+
direction: sourceDirection,
|
|
52
|
+
vector: [sourceFactor.x, sourceFactor.y]
|
|
53
|
+
};
|
|
54
|
+
const targetHandleRef = {
|
|
55
|
+
key: LineHandleKey.target,
|
|
56
|
+
point: targetPoint,
|
|
57
|
+
direction: targetDirection,
|
|
58
|
+
vector: [targetFactor.x, targetFactor.y]
|
|
59
|
+
};
|
|
60
|
+
if (sourceBoundElement) {
|
|
61
|
+
const connectionOffset = PlaitLine.isSourceMarkOrTargetMark(element, LineMarkerType.none, LineHandleKey.source) ? 0 : strokeWidth;
|
|
62
|
+
const sourceVector = getVectorByConnection(sourceBoundElement, element.source.connection);
|
|
63
|
+
const direction = getDirectionByVector(sourceVector);
|
|
64
|
+
sourceDirection = direction ? direction : sourceDirection;
|
|
65
|
+
sourcePoint = getConnectionPoint(sourceBoundElement, element.source.connection, sourceDirection, connectionOffset);
|
|
66
|
+
sourceHandleRef.boundElement = sourceBoundElement;
|
|
67
|
+
sourceHandleRef.direction = sourceDirection;
|
|
68
|
+
sourceHandleRef.point = sourcePoint;
|
|
69
|
+
sourceHandleRef.vector = sourceVector;
|
|
70
|
+
}
|
|
71
|
+
if (targetBoundElement) {
|
|
72
|
+
const connectionOffset = PlaitLine.isSourceMarkOrTargetMark(element, LineMarkerType.none, LineHandleKey.target) ? 0 : strokeWidth;
|
|
73
|
+
const targetVector = getVectorByConnection(targetBoundElement, element.target.connection);
|
|
74
|
+
const direction = getDirectionByVector(targetVector);
|
|
75
|
+
targetDirection = direction ? direction : targetDirection;
|
|
76
|
+
targetPoint = getConnectionPoint(targetBoundElement, element.target.connection, targetDirection, connectionOffset);
|
|
77
|
+
targetHandleRef.boundElement = targetBoundElement;
|
|
78
|
+
targetHandleRef.direction = targetDirection;
|
|
79
|
+
targetHandleRef.point = targetPoint;
|
|
80
|
+
targetHandleRef.vector = targetVector;
|
|
81
|
+
}
|
|
82
|
+
return { source: sourceHandleRef, target: targetHandleRef };
|
|
26
83
|
};
|
|
27
84
|
export const getElbowPoints = (board, element) => {
|
|
28
85
|
if (element.points.length === 2) {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
let
|
|
32
|
-
|
|
33
|
-
if (element.source.connection) {
|
|
34
|
-
sourceDirection = getDirectionByPoint(element.source.connection, sourceDirection);
|
|
35
|
-
}
|
|
36
|
-
if (element.target.connection) {
|
|
37
|
-
targetDirection = getDirectionByPoint(element.target.connection, targetDirection);
|
|
38
|
-
}
|
|
39
|
-
const points = getPoints(source, sourceDirection, target, targetDirection, 30);
|
|
86
|
+
const handleRefPair = getLineHandleRefPair(board, element);
|
|
87
|
+
const offset = element.source.boundId || element.target.boundId ? 30 : 0;
|
|
88
|
+
let points = getPoints(handleRefPair.source.point, handleRefPair.source.direction, handleRefPair.target.point, handleRefPair.target.direction, offset);
|
|
89
|
+
points = removeDuplicatePoints(points);
|
|
40
90
|
return points;
|
|
41
91
|
}
|
|
42
92
|
return element.points;
|
|
43
93
|
};
|
|
94
|
+
export const getCurvePoints = (board, element) => {
|
|
95
|
+
if (element.points.length === 2) {
|
|
96
|
+
const handleRefPair = getLineHandleRefPair(board, element);
|
|
97
|
+
const { source, target } = handleRefPair;
|
|
98
|
+
const sourceBoundElement = handleRefPair.source.boundElement;
|
|
99
|
+
const targetBoundElement = handleRefPair.target.boundElement;
|
|
100
|
+
let curvePoints = [source.point];
|
|
101
|
+
const sumDistance = distanceBetweenPointAndPoint(...source.point, ...target.point);
|
|
102
|
+
const offset = 12 + sumDistance / 3;
|
|
103
|
+
if (sourceBoundElement) {
|
|
104
|
+
curvePoints.push(getPointByVector(source.point, source.vector, offset));
|
|
105
|
+
}
|
|
106
|
+
if (targetBoundElement) {
|
|
107
|
+
curvePoints.push(getPointByVector(target.point, target.vector, offset));
|
|
108
|
+
}
|
|
109
|
+
const isSingleBound = (sourceBoundElement && !targetBoundElement) || (!sourceBoundElement && targetBoundElement);
|
|
110
|
+
if (isSingleBound) {
|
|
111
|
+
curvePoints.push(target.point);
|
|
112
|
+
const points = Q2C(curvePoints);
|
|
113
|
+
return pointsOnBezierCurves(points);
|
|
114
|
+
}
|
|
115
|
+
if (!sourceBoundElement && !targetBoundElement) {
|
|
116
|
+
curvePoints.push(getPointByVector(source.point, source.vector, offset));
|
|
117
|
+
curvePoints.push(getPointByVector(target.point, target.vector, offset));
|
|
118
|
+
}
|
|
119
|
+
curvePoints.push(target.point);
|
|
120
|
+
return pointsOnBezierCurves(curvePoints);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
//TODO 直接获取贝塞尔曲线上高密度点
|
|
124
|
+
const points = PlaitLine.getPoints(board, element);
|
|
125
|
+
const draw = PlaitBoard.getRoughSVG(board).generator.curve(points);
|
|
126
|
+
let bezierPoints = transformOpsToPoints(draw.sets[0].ops);
|
|
127
|
+
bezierPoints = removeDuplicatePoints(bezierPoints);
|
|
128
|
+
return pointsOnBezierCurves(bezierPoints);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
export const transformOpsToPoints = (ops) => {
|
|
132
|
+
const result = [];
|
|
133
|
+
for (let item of ops) {
|
|
134
|
+
if (item.op === 'move') {
|
|
135
|
+
result.push([item.data[0], item.data[1]]);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
result.push([item.data[0], item.data[1]]);
|
|
139
|
+
result.push([item.data[2], item.data[3]]);
|
|
140
|
+
result.push([item.data[4], item.data[5]]);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
};
|
|
44
145
|
export const isHitPolyLine = (pathPoints, point, strokeWidth, expand = 0) => {
|
|
45
146
|
const distance = distanceBetweenPointAndSegments(pathPoints, point);
|
|
46
147
|
return distance <= strokeWidth + expand;
|
|
@@ -70,8 +171,15 @@ export const drawLine = (board, element) => {
|
|
|
70
171
|
const strokeLineDash = getLineDashByElement(element);
|
|
71
172
|
const options = { stroke: strokeColor, strokeWidth, strokeLineDash };
|
|
72
173
|
const lineG = createG();
|
|
73
|
-
|
|
74
|
-
|
|
174
|
+
let points = getLinePoints(board, element);
|
|
175
|
+
let line;
|
|
176
|
+
if (element.shape === LineShape.curve) {
|
|
177
|
+
//TODO element.points 应为曲线拐点
|
|
178
|
+
line = PlaitBoard.getRoughSVG(board).curve(points, options);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
line = drawLinearPath(points, options);
|
|
182
|
+
}
|
|
75
183
|
const id = idCreator();
|
|
76
184
|
line.setAttribute('mask', `url(#${id})`);
|
|
77
185
|
lineG.appendChild(line);
|
|
@@ -105,33 +213,16 @@ function drawMask(board, element, id) {
|
|
|
105
213
|
maskTargetFillRect.setAttribute('opacity', '0');
|
|
106
214
|
return { mask, maskTargetFillRect };
|
|
107
215
|
}
|
|
108
|
-
export const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
return
|
|
216
|
+
export const getConnectionPoint = (geometry, connection, direction, delta) => {
|
|
217
|
+
const rectangle = getRectangleByPoints(geometry.points);
|
|
218
|
+
if (direction && delta) {
|
|
219
|
+
const directionFactor = getDirectionFactor(direction);
|
|
220
|
+
const point = RectangleClient.getConnectionPoint(rectangle, connection);
|
|
221
|
+
return [point[0] + directionFactor.x * delta, point[1] + directionFactor.y * delta];
|
|
114
222
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
export const getTargetPoint = (board, element) => {
|
|
118
|
-
if (element.target.boundId) {
|
|
119
|
-
const strokeWidth = getStrokeWidthByElement(element);
|
|
120
|
-
const connectionOffset = PlaitLine.isTargetMark(element, LineMarkerType.none) ? 0 : strokeWidth;
|
|
121
|
-
const boundElement = getElementById(board, element.target.boundId);
|
|
122
|
-
return boundElement
|
|
123
|
-
? getConnectionPoint(boundElement, element.target.connection, connectionOffset)
|
|
124
|
-
: element.points[element.points.length - 1];
|
|
223
|
+
else {
|
|
224
|
+
return RectangleClient.getConnectionPoint(rectangle, connection);
|
|
125
225
|
}
|
|
126
|
-
return element.points[element.points.length - 1];
|
|
127
|
-
};
|
|
128
|
-
export const getConnectionPoint = (geometry, connection, offset) => {
|
|
129
|
-
const rectangle = getRectangleByPoints(geometry.points);
|
|
130
|
-
const directionFactor = getDirectionFactor(getDirectionByPoint(connection, Direction.bottom));
|
|
131
|
-
return [
|
|
132
|
-
rectangle.x + rectangle.width * connection[0] + directionFactor.x * offset,
|
|
133
|
-
rectangle.y + rectangle.height * connection[1] + directionFactor.y * offset
|
|
134
|
-
];
|
|
135
226
|
};
|
|
136
227
|
export const transformPointToConnection = (board, point, hitElement) => {
|
|
137
228
|
let rectangle = getRectangleByPoints(hitElement.points);
|
|
@@ -142,7 +233,8 @@ export const transformPointToConnection = (board, point, hitElement) => {
|
|
|
142
233
|
return [(nearestPoint[0] - rectangle.x) / rectangle.width, (nearestPoint[1] - rectangle.y) / rectangle.height];
|
|
143
234
|
};
|
|
144
235
|
export const getHitConnectorPoint = (movingPoint, hitElement, rectangle) => {
|
|
145
|
-
const
|
|
236
|
+
const shape = getShape(hitElement);
|
|
237
|
+
const connector = getEngine(shape).getConnectorPoints(rectangle);
|
|
146
238
|
const points = getPointsByCenterPoint(movingPoint, 5, 5);
|
|
147
239
|
const pointRectangle = getRectangleByPoints(points);
|
|
148
240
|
return connector.find(point => {
|
|
@@ -166,4 +258,62 @@ export const getBoardLines = (board) => {
|
|
|
166
258
|
recursion: (element) => PlaitDrawElement.isDrawElement(element)
|
|
167
259
|
});
|
|
168
260
|
};
|
|
169
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCwrQkFBK0IsRUFFL0IsT0FBTyxFQUNQLGNBQWMsRUFDZCxlQUFlLEVBQ2YsWUFBWSxFQUVaLGNBQWMsRUFDZCxVQUFVLEVBQ1YsVUFBVSxFQUNWLG1CQUFtQixFQUN0QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SSxPQUFPLEVBQWMsY0FBYyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBaUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQzdCLEtBQWdCLEVBQ2hCLE1BQXNCLEVBQ3RCLE1BQWtCLEVBQ2xCLE1BQWtCLEVBQ2xCLE9BQXdELEVBQy9DLEVBQUU7SUFDWCxPQUFPO1FBQ0gsRUFBRSxFQUFFLFNBQVMsRUFBRTtRQUNmLElBQUksRUFBRSxNQUFNO1FBQ1osS0FBSztRQUNMLE1BQU07UUFDTixLQUFLLEVBQUUsRUFBRTtRQUNULE1BQU07UUFDTixPQUFPLEVBQUUsQ0FBQztRQUNWLE1BQU07UUFDTixHQUFHLE9BQU87S0FDYixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDbkUsT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBa0IsRUFBRSxFQUFFO0lBQ3ZFLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQWtCLEVBQUUsRUFBRTtJQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM3QixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztRQUMvRSxJQUFJLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQy9FLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDM0IsZUFBZSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1NBQ3JGO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUMzQixlQUFlLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDckY7UUFDRCxNQUFNLE1BQU0sR0FBWSxTQUFTLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBQ0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLFVBQW1CLEVBQUUsS0FBWSxFQUFFLFdBQW1CLEVBQUUsU0FBaUIsQ0FBQyxFQUFFLEVBQUU7SUFDeEcsTUFBTSxRQUFRLEdBQUcsK0JBQStCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sUUFBUSxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQWtCLEVBQUUsS0FBWSxFQUFFLEVBQUU7SUFDdkYsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzFCLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUc7WUFDZCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFNLEdBQUcsQ0FBQztZQUM5QixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFPLEdBQUcsQ0FBQztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQU07WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFPO1NBQ3ZCLENBQUM7UUFDRixPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQWtCLEVBQUUsS0FBWSxFQUFFLEVBQUU7SUFDakYsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBa0IsRUFBRSxFQUFFO0lBQzlELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDckUsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDeEIsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLE1BQU0sRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6QyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNuRixLQUFLLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFRixTQUFTLFFBQVEsQ0FBQyxLQUFpQixFQUFFLE9BQWtCLEVBQUUsRUFBVTtJQUMvRCxNQUFNLElBQUksR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLElBQUksU0FBUyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLFNBQVMsR0FBRyxlQUFlLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRTtRQUN2QyxJQUFJLEVBQUUsT0FBTztLQUNoQixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRS9CLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUMxQixNQUFNLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDbkMsSUFBSSxFQUFFLE9BQU87U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztJQUNILFNBQVM7SUFDVCxNQUFNLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDcEUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUN4QixNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDaEcsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFnQixLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRixPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDNUg7SUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDcEUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUN4QixNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDaEcsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFnQixLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRixPQUFPLFlBQVk7WUFDZixDQUFDLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVyxFQUFFLGdCQUFnQixDQUFDO1lBQ2hGLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ25EO0lBQ0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsUUFBdUIsRUFBRSxVQUFpQixFQUFFLE1BQWMsRUFBUyxFQUFFO0lBQ3BHLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDOUYsT0FBTztRQUNILFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsR0FBRyxNQUFNO1FBQzFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsR0FBRyxNQUFNO0tBQzlFLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsS0FBWSxFQUFFLFVBQXlCLEVBQVMsRUFBRTtJQUM1RyxJQUFJLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsU0FBUyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDcEUsSUFBSSxZQUFZLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUMzRSxNQUFNLFlBQVksR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9FLFlBQVksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQzFELE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25ILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsV0FBa0IsRUFBRSxVQUF5QixFQUFFLFNBQTBCLEVBQUUsRUFBRTtJQUM5RyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsTUFBTSxjQUFjLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzFCLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEtBQWEsRUFBbUIsRUFBRTtJQUMxRyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3RCxPQUFPO1FBQ0gsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBTSxHQUFHLENBQUM7UUFDN0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTyxHQUFHLENBQUM7UUFDOUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFNO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTztLQUN2QixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQy9DLE9BQU8sWUFBWSxDQUFDLEtBQUssRUFBRTtRQUN2QixLQUFLLEVBQUUsQ0FBQyxPQUFxQixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2xFLFNBQVMsRUFBRSxDQUFDLE9BQXFCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7S0FDaEYsQ0FBZ0IsQ0FBQztBQUN0QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBvaW50LFxuICAgIGlkQ3JlYXRvcixcbiAgICBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFNlZ21lbnRzLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgY3JlYXRlRyxcbiAgICBnZXRFbGVtZW50QnlJZCxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgZmluZEVsZW1lbnRzLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBkcmF3TGluZWFyUGF0aCxcbiAgICBjcmVhdGVNYXNrLFxuICAgIGNyZWF0ZVJlY3QsXG4gICAgQUNUSVZFX1NUUk9LRV9XSURUSFxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXRQb2ludHMsIERpcmVjdGlvbiwgZ2V0UmVjdGFuZ2xlQnlQb2ludHMsIGdldERpcmVjdGlvbkJ5UG9pbnQsIGdldFBvaW50T25Qb2x5bGluZSwgZ2V0RGlyZWN0aW9uRmFjdG9yIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBMaW5lSGFuZGxlLCBMaW5lTWFya2VyVHlwZSwgTGluZVNoYXBlLCBQbGFpdERyYXdFbGVtZW50LCBQbGFpdEdlb21ldHJ5LCBQbGFpdExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldFBvaW50c0J5Q2VudGVyUG9pbnQsIGdldE5lYXJlc3RQb2ludCB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0TGluZURhc2hCeUVsZW1lbnQsIGdldFN0cm9rZUNvbG9yQnlFbGVtZW50LCBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCB9IGZyb20gJy4vc3R5bGUvc3Ryb2tlJztcbmltcG9ydCB7IGdldEVuZ2luZSB9IGZyb20gJy4vZW5naW5lJztcbmltcG9ydCB7IGRyYXdMaW5lQXJyb3cgfSBmcm9tICcuL2xpbmUtYXJyb3cnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTGluZUVsZW1lbnQgPSAoXG4gICAgc2hhcGU6IExpbmVTaGFwZSxcbiAgICBwb2ludHM6IFtQb2ludCwgUG9pbnRdLFxuICAgIHNvdXJjZTogTGluZUhhbmRsZSxcbiAgICB0YXJnZXQ6IExpbmVIYW5kbGUsXG4gICAgb3B0aW9ucz86IFBpY2s8UGxhaXRMaW5lLCAnc3Ryb2tlQ29sb3InIHwgJ3N0cm9rZVdpZHRoJz5cbik6IFBsYWl0TGluZSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGlkQ3JlYXRvcigpLFxuICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRleHRzOiBbXSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICBwb2ludHMsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldExpbmVQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIHJldHVybiBlbGVtZW50LnNoYXBlID09PSBMaW5lU2hhcGUuZWxib3cgPyBnZXRFbGJvd1BvaW50cyhib2FyZCwgZWxlbWVudCkgOiBnZXRTdHJhaWdodFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3RyYWlnaHRQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIHJldHVybiBbZ2V0U291cmNlUG9pbnQoYm9hcmQsIGVsZW1lbnQpLCBnZXRUYXJnZXRQb2ludChib2FyZCwgZWxlbWVudCldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsYm93UG9pbnRzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUpID0+IHtcbiAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldFNvdXJjZVBvaW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0UG9pbnQoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBsZXQgc291cmNlRGlyZWN0aW9uID0gc291cmNlWzBdIDwgdGFyZ2V0WzBdID8gRGlyZWN0aW9uLnJpZ2h0IDogRGlyZWN0aW9uLmxlZnQ7XG4gICAgICAgIGxldCB0YXJnZXREaXJlY3Rpb24gPSBzb3VyY2VbMF0gPCB0YXJnZXRbMF0gPyBEaXJlY3Rpb24ubGVmdCA6IERpcmVjdGlvbi5yaWdodDtcbiAgICAgICAgaWYgKGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHNvdXJjZURpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5UG9pbnQoZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiwgc291cmNlRGlyZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGFyZ2V0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uQnlQb2ludChlbGVtZW50LnRhcmdldC5jb25uZWN0aW9uLCB0YXJnZXREaXJlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvaW50czogUG9pbnRbXSA9IGdldFBvaW50cyhzb3VyY2UsIHNvdXJjZURpcmVjdGlvbiwgdGFyZ2V0LCB0YXJnZXREaXJlY3Rpb24sIDMwKTtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQucG9pbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSGl0UG9seUxpbmUgPSAocGF0aFBvaW50czogUG9pbnRbXSwgcG9pbnQ6IFBvaW50LCBzdHJva2VXaWR0aDogbnVtYmVyLCBleHBhbmQ6IG51bWJlciA9IDApID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudHMocGF0aFBvaW50cywgcG9pbnQpO1xuICAgIHJldHVybiBkaXN0YW5jZSA8PSBzdHJva2VXaWR0aCArIGV4cGFuZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRMaW5lVGV4dEluZGV4ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHRleHRzID0gZWxlbWVudC50ZXh0cztcbiAgICBpZiAoIXRleHRzLmxlbmd0aCkgcmV0dXJuIC0xO1xuXG4gICAgY29uc3QgcG9pbnRzID0gZ2V0RWxib3dQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIHJldHVybiB0ZXh0cy5maW5kSW5kZXgodGV4dCA9PiB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IGdldFBvaW50T25Qb2x5bGluZShwb2ludHMsIHRleHQucG9zaXRpb24pO1xuICAgICAgICBjb25zdCByZWN0YW5nbGUgPSB7XG4gICAgICAgICAgICB4OiBjZW50ZXJbMF0gLSB0ZXh0LndpZHRoISAvIDIsXG4gICAgICAgICAgICB5OiBjZW50ZXJbMV0gLSB0ZXh0LmhlaWdodCEgLyAyLFxuICAgICAgICAgICAgd2lkdGg6IHRleHQud2lkdGghLFxuICAgICAgICAgICAgaGVpZ2h0OiB0ZXh0LmhlaWdodCFcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc0hpdChyZWN0YW5nbGUsIFJlY3RhbmdsZUNsaWVudC50b1JlY3RhbmdsZUNsaWVudChbcG9pbnQsIHBvaW50XSkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSGl0TGluZVRleHQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgcmV0dXJuIGdldEhpdExpbmVUZXh0SW5kZXgoYm9hcmQsIGVsZW1lbnQsIHBvaW50KSAhPT0gLTE7XG59O1xuXG5leHBvcnQgY29uc3QgZHJhd0xpbmUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSBnZXRTdHJva2VDb2xvckJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VMaW5lRGFzaCA9IGdldExpbmVEYXNoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHN0cm9rZTogc3Ryb2tlQ29sb3IsIHN0cm9rZVdpZHRoLCBzdHJva2VMaW5lRGFzaCB9O1xuICAgIGNvbnN0IGxpbmVHID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldExpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGxpbmUgPSBkcmF3TGluZWFyUGF0aChwb2ludHMsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGlkID0gaWRDcmVhdG9yKCk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoJ21hc2snLCBgdXJsKCMke2lkfSlgKTtcbiAgICBsaW5lRy5hcHBlbmRDaGlsZChsaW5lKTtcbiAgICBjb25zdCB7IG1hc2ssIG1hc2tUYXJnZXRGaWxsUmVjdCB9ID0gZHJhd01hc2soYm9hcmQsIGVsZW1lbnQsIGlkKTtcbiAgICBsaW5lRy5hcHBlbmRDaGlsZChtYXNrKTtcbiAgICBsaW5lLmFwcGVuZENoaWxkKG1hc2tUYXJnZXRGaWxsUmVjdCk7XG4gICAgY29uc3QgYXJyb3cgPSBkcmF3TGluZUFycm93KGVsZW1lbnQsIHBvaW50cywgeyBzdHJva2U6IHN0cm9rZUNvbG9yLCBzdHJva2VXaWR0aCB9KTtcbiAgICBhcnJvdyAmJiBsaW5lRy5hcHBlbmRDaGlsZChhcnJvdyk7XG4gICAgcmV0dXJuIGxpbmVHO1xufTtcblxuZnVuY3Rpb24gZHJhd01hc2soYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG1hc2sgPSBjcmVhdGVNYXNrKCk7XG4gICAgbWFzay5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldExpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGxldCByZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeVBvaW50cyhwb2ludHMpO1xuICAgIHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRPdXRsaW5lUmVjdGFuZ2xlKHJlY3RhbmdsZSwgLTMwKTtcbiAgICBjb25zdCBtYXNrRmlsbFJlY3QgPSBjcmVhdGVSZWN0KHJlY3RhbmdsZSwge1xuICAgICAgICBmaWxsOiAnd2hpdGUnXG4gICAgfSk7XG4gICAgbWFzay5hcHBlbmRDaGlsZChtYXNrRmlsbFJlY3QpO1xuXG4gICAgY29uc3QgdGV4dHMgPSBlbGVtZW50LnRleHRzO1xuICAgIHRleHRzLmZvckVhY2goKHRleHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHRSZWN0YW5nbGUgPSBnZXRMaW5lVGV4dFJlY3RhbmdsZShib2FyZCwgZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICBjb25zdCByZWN0ID0gY3JlYXRlUmVjdCh0ZXh0UmVjdGFuZ2xlLCB7XG4gICAgICAgICAgICBmaWxsOiAnYmxhY2snXG4gICAgICAgIH0pO1xuICAgICAgICBtYXNrLmFwcGVuZENoaWxkKHJlY3QpO1xuICAgIH0pO1xuICAgIC8v5pKR5byAIGxpbmVcbiAgICBjb25zdCBtYXNrVGFyZ2V0RmlsbFJlY3QgPSBjcmVhdGVSZWN0KHJlY3RhbmdsZSk7XG4gICAgbWFza1RhcmdldEZpbGxSZWN0LnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsICcwJyk7XG4gICAgcmV0dXJuIHsgbWFzaywgbWFza1RhcmdldEZpbGxSZWN0IH07XG59XG5cbmV4cG9ydCBjb25zdCBnZXRTb3VyY2VQb2ludCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQuc291cmNlLmJvdW5kSWQpIHtcbiAgICAgICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbk9mZnNldCA9IFBsYWl0TGluZS5pc1NvdXJjZU1hcmsoZWxlbWVudCwgTGluZU1hcmtlclR5cGUubm9uZSkgPyAwIDogc3Ryb2tlV2lkdGg7XG4gICAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEVsZW1lbnRCeUlkPFBsYWl0R2VvbWV0cnk+KGJvYXJkLCBlbGVtZW50LnNvdXJjZS5ib3VuZElkKTtcbiAgICAgICAgcmV0dXJuIGJvdW5kRWxlbWVudCA/IGdldENvbm5lY3Rpb25Qb2ludChib3VuZEVsZW1lbnQsIGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24hLCBjb25uZWN0aW9uT2Zmc2V0KSA6IGVsZW1lbnQucG9pbnRzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wb2ludHNbMF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFyZ2V0UG9pbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGlmIChlbGVtZW50LnRhcmdldC5ib3VuZElkKSB7XG4gICAgICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25PZmZzZXQgPSBQbGFpdExpbmUuaXNUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUpID8gMCA6IHN0cm9rZVdpZHRoO1xuICAgICAgICBjb25zdCBib3VuZEVsZW1lbnQgPSBnZXRFbGVtZW50QnlJZDxQbGFpdEdlb21ldHJ5Pihib2FyZCwgZWxlbWVudC50YXJnZXQuYm91bmRJZCk7XG4gICAgICAgIHJldHVybiBib3VuZEVsZW1lbnRcbiAgICAgICAgICAgID8gZ2V0Q29ubmVjdGlvblBvaW50KGJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEsIGNvbm5lY3Rpb25PZmZzZXQpXG4gICAgICAgICAgICA6IGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvblBvaW50ID0gKGdlb21ldHJ5OiBQbGFpdEdlb21ldHJ5LCBjb25uZWN0aW9uOiBQb2ludCwgb2Zmc2V0OiBudW1iZXIpOiBQb2ludCA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZ2VvbWV0cnkucG9pbnRzKTtcbiAgICBjb25zdCBkaXJlY3Rpb25GYWN0b3IgPSBnZXREaXJlY3Rpb25GYWN0b3IoZ2V0RGlyZWN0aW9uQnlQb2ludChjb25uZWN0aW9uLCBEaXJlY3Rpb24uYm90dG9tKSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggKiBjb25uZWN0aW9uWzBdICsgZGlyZWN0aW9uRmFjdG9yLnggKiBvZmZzZXQsXG4gICAgICAgIHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCAqIGNvbm5lY3Rpb25bMV0gKyBkaXJlY3Rpb25GYWN0b3IueSAqIG9mZnNldFxuICAgIF07XG59O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtUG9pbnRUb0Nvbm5lY3Rpb24gPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50OiBQb2ludCwgaGl0RWxlbWVudDogUGxhaXRHZW9tZXRyeSk6IFBvaW50ID0+IHtcbiAgICBsZXQgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoaGl0RWxlbWVudC5wb2ludHMpO1xuICAgIHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKHJlY3RhbmdsZSwgQUNUSVZFX1NUUk9LRV9XSURUSCk7XG4gICAgbGV0IG5lYXJlc3RQb2ludCA9IGdldE5lYXJlc3RQb2ludChoaXRFbGVtZW50LCBwb2ludCwgQUNUSVZFX1NUUk9LRV9XSURUSCk7XG4gICAgY29uc3QgaGl0Q29ubmVjdG9yID0gZ2V0SGl0Q29ubmVjdG9yUG9pbnQobmVhcmVzdFBvaW50LCBoaXRFbGVtZW50LCByZWN0YW5nbGUpO1xuICAgIG5lYXJlc3RQb2ludCA9IGhpdENvbm5lY3RvciA/IGhpdENvbm5lY3RvciA6IG5lYXJlc3RQb2ludDtcbiAgICByZXR1cm4gWyhuZWFyZXN0UG9pbnRbMF0gLSByZWN0YW5nbGUueCkgLyByZWN0YW5nbGUud2lkdGgsIChuZWFyZXN0UG9pbnRbMV0gLSByZWN0YW5nbGUueSkgLyByZWN0YW5nbGUuaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRDb25uZWN0b3JQb2ludCA9IChtb3ZpbmdQb2ludDogUG9pbnQsIGhpdEVsZW1lbnQ6IFBsYWl0R2VvbWV0cnksIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSA9PiB7XG4gICAgY29uc3QgY29ubmVjdG9yID0gZ2V0RW5naW5lKGhpdEVsZW1lbnQuc2hhcGUpLmdldENvbm5lY3RvclBvaW50cyhyZWN0YW5nbGUpO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldFBvaW50c0J5Q2VudGVyUG9pbnQobW92aW5nUG9pbnQsIDUsIDUpO1xuICAgIGNvbnN0IHBvaW50UmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMocG9pbnRzKTtcbiAgICByZXR1cm4gY29ubmVjdG9yLmZpbmQocG9pbnQgPT4ge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHBvaW50UmVjdGFuZ2xlLCBSZWN0YW5nbGVDbGllbnQudG9SZWN0YW5nbGVDbGllbnQoW3BvaW50LCBwb2ludF0pKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMaW5lVGV4dFJlY3RhbmdsZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBpbmRleDogbnVtYmVyKTogUmVjdGFuZ2xlQ2xpZW50ID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gZWxlbWVudC50ZXh0c1tpbmRleF07XG4gICAgY29uc3QgZWxib3dQb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBwb2ludCA9IGdldFBvaW50T25Qb2x5bGluZShlbGJvd1BvaW50cywgdGV4dC5wb3NpdGlvbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcG9pbnRbMF0gLSB0ZXh0LndpZHRoISAvIDIsXG4gICAgICAgIHk6IHBvaW50WzFdIC0gdGV4dC5oZWlnaHQhIC8gMixcbiAgICAgICAgd2lkdGg6IHRleHQud2lkdGghLFxuICAgICAgICBoZWlnaHQ6IHRleHQuaGVpZ2h0IVxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm9hcmRMaW5lcyA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIHJldHVybiBmaW5kRWxlbWVudHMoYm9hcmQsIHtcbiAgICAgICAgbWF0Y2g6IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IFBsYWl0RHJhd0VsZW1lbnQuaXNMaW5lKGVsZW1lbnQpLFxuICAgICAgICByZWN1cnNpb246IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IFBsYWl0RHJhd0VsZW1lbnQuaXNEcmF3RWxlbWVudChlbGVtZW50KVxuICAgIH0pIGFzIFBsYWl0TGluZVtdO1xufTtcbiJdfQ==
|
|
261
|
+
export const removeDuplicatePoints = (points) => {
|
|
262
|
+
const newArray = [];
|
|
263
|
+
points.forEach(point => {
|
|
264
|
+
const index = newArray.findIndex(otherPoint => {
|
|
265
|
+
return point[0] === otherPoint[0] && point[1] === otherPoint[1];
|
|
266
|
+
});
|
|
267
|
+
if (index === -1)
|
|
268
|
+
newArray.push(point);
|
|
269
|
+
});
|
|
270
|
+
return newArray;
|
|
271
|
+
};
|
|
272
|
+
export const getExtendPoint = (source, target, extendDistance) => {
|
|
273
|
+
const distance = distanceBetweenPointAndPoint(...source, ...target);
|
|
274
|
+
const sin = (target[1] - source[1]) / distance;
|
|
275
|
+
const cos = (target[0] - source[0]) / distance;
|
|
276
|
+
return [source[0] + extendDistance * cos, source[1] + extendDistance * sin];
|
|
277
|
+
};
|
|
278
|
+
// quadratic Bezier to cubic Bezier
|
|
279
|
+
export const Q2C = (points) => {
|
|
280
|
+
const result = [];
|
|
281
|
+
const numSegments = points.length / 3;
|
|
282
|
+
for (let i = 0; i < numSegments; i++) {
|
|
283
|
+
const start = points[i];
|
|
284
|
+
const qControl = points[i + 1];
|
|
285
|
+
const end = points[i + 2];
|
|
286
|
+
const startDistance = distanceBetweenPointAndPoint(...start, ...qControl);
|
|
287
|
+
const endDistance = distanceBetweenPointAndPoint(...end, ...qControl);
|
|
288
|
+
const cControl1 = getExtendPoint(start, qControl, (startDistance * 2) / 3);
|
|
289
|
+
const cControl2 = getExtendPoint(end, qControl, (endDistance * 2) / 3);
|
|
290
|
+
result.push(start, cControl1, cControl2, end);
|
|
291
|
+
}
|
|
292
|
+
return result;
|
|
293
|
+
};
|
|
294
|
+
export const getVectorByConnection = (boundElement, connection) => {
|
|
295
|
+
const rectangle = getRectangleByPoints(boundElement.points);
|
|
296
|
+
const shape = getShape(boundElement);
|
|
297
|
+
const engine = getEngine(shape);
|
|
298
|
+
let vector = [0, 0];
|
|
299
|
+
const direction = getDirectionByPointOfRectangle(connection);
|
|
300
|
+
if (direction) {
|
|
301
|
+
const factor = getDirectionFactor(direction);
|
|
302
|
+
return [factor.x, factor.y];
|
|
303
|
+
}
|
|
304
|
+
if (engine.getEdgeByConnectionPoint) {
|
|
305
|
+
const edge = engine.getEdgeByConnectionPoint(rectangle, connection);
|
|
306
|
+
if (edge) {
|
|
307
|
+
const lineVector = [edge[1][0] - edge[0][0], edge[1][1] - edge[0][1]];
|
|
308
|
+
return rotateVectorAnti90(lineVector);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (engine.getTangentVectorByConnectionPoint) {
|
|
312
|
+
const lineVector = engine.getTangentVectorByConnectionPoint(rectangle, connection);
|
|
313
|
+
if (lineVector) {
|
|
314
|
+
return rotateVectorAnti90(lineVector);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return vector;
|
|
318
|
+
};
|
|
319
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCwrQkFBK0IsRUFDL0IsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2QsZUFBZSxFQUNmLFlBQVksRUFFWixjQUFjLEVBQ2QsVUFBVSxFQUNWLFVBQVUsRUFDVixtQkFBbUIsRUFJbkIsNEJBQTRCLEVBQy9CLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDSCxTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsOEJBQThCLEVBQzlCLGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUgsYUFBYSxFQUViLGNBQWMsRUFDZCxTQUFTLEVBQ1QsZ0JBQWdCLEVBRWhCLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQzdCLEtBQWdCLEVBQ2hCLE1BQXNCLEVBQ3RCLE1BQWtCLEVBQ2xCLE1BQWtCLEVBQ2xCLE9BQXdELEVB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LENBQUMsQ0FBQztJQUM1QixNQUFNLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3RCxJQUFJLFNBQVMsRUFBRTtRQUNYLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMvQjtJQUNELElBQUksTUFBTSxDQUFDLHdCQUF3QixFQUFFO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEUsSUFBSSxJQUFJLEVBQUU7WUFDTixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBVyxDQUFDO1lBQ2hGLE9BQU8sa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDekM7S0FDSjtJQUNELElBQUksTUFBTSxDQUFDLGlDQUFpQyxFQUFFO1FBQzFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkYsSUFBSSxVQUFVLEVBQUU7WUFDWixPQUFPLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3pDO0tBQ0o7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBvaW50LFxuICAgIGlkQ3JlYXRvcixcbiAgICBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFNlZ21lbnRzLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgY3JlYXRlRyxcbiAgICBnZXRFbGVtZW50QnlJZCxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgZmluZEVsZW1lbnRzLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBkcmF3TGluZWFyUGF0aCxcbiAgICBjcmVhdGVNYXNrLFxuICAgIGNyZWF0ZVJlY3QsXG4gICAgQUNUSVZFX1NUUk9LRV9XSURUSCxcbiAgICBQb2ludE9mUmVjdGFuZ2xlLFxuICAgIERpcmVjdGlvbixcbiAgICBWZWN0b3IsXG4gICAgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludFxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQge1xuICAgIGdldFBvaW50cyxcbiAgICBnZXRSZWN0YW5nbGVCeVBvaW50cyxcbiAgICBnZXRQb2ludE9uUG9seWxpbmUsXG4gICAgZ2V0RGlyZWN0aW9uRmFjdG9yLFxuICAgIHJvdGF0ZVZlY3RvckFudGk5MCxcbiAgICBnZXREaXJlY3Rpb25CeVZlY3RvcixcbiAgICBnZXRPcHBvc2l0ZURpcmVjdGlvbixcbiAgICBnZXREaXJlY3Rpb25CeVBvaW50T2ZSZWN0YW5nbGUsXG4gICAgZ2V0UG9pbnRCeVZlY3RvclxufSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7XG4gICAgTGluZUhhbmRsZSxcbiAgICBMaW5lSGFuZGxlS2V5LFxuICAgIExpbmVIYW5kbGVSZWYsXG4gICAgTGluZU1hcmtlclR5cGUsXG4gICAgTGluZVNoYXBlLFxuICAgIFBsYWl0RHJhd0VsZW1lbnQsXG4gICAgUGxhaXRHZW9tZXRyeSxcbiAgICBQbGFpdExpbmVcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRQb2ludHNCeUNlbnRlclBvaW50LCBnZXROZWFyZXN0UG9pbnQgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7IGdldExpbmVEYXNoQnlFbGVtZW50LCBnZXRTdHJva2VDb2xvckJ5RWxlbWVudCwgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQgfSBmcm9tICcuL3N0eWxlL3N0cm9rZSc7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuLi9lbmdpbmVzJztcbmltcG9ydCB7IGRyYXdMaW5lQXJyb3cgfSBmcm9tICcuL2xpbmUtYXJyb3cnO1xuaW1wb3J0IHsgcG9pbnRzT25CZXppZXJDdXJ2ZXMgfSBmcm9tICdwb2ludHMtb24tY3VydmUnO1xuaW1wb3J0IHsgT3AgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcbmltcG9ydCB7IGdldFNoYXBlIH0gZnJvbSAnLi9zaGFwZSc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMaW5lRWxlbWVudCA9IChcbiAgICBzaGFwZTogTGluZVNoYXBlLFxuICAgIHBvaW50czogW1BvaW50LCBQb2ludF0sXG4gICAgc291cmNlOiBMaW5lSGFuZGxlLFxuICAgIHRhcmdldDogTGluZUhhbmRsZSxcbiAgICBvcHRpb25zPzogUGljazxQbGFpdExpbmUsICdzdHJva2VDb2xvcicgfCAnc3Ryb2tlV2lkdGgnPlxuKTogUGxhaXRMaW5lID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogaWRDcmVhdG9yKCksXG4gICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdGV4dHM6IFtdLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGluZVBvaW50cyA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgc3dpdGNoIChlbGVtZW50LnNoYXBlKSB7XG4gICAgICAgIGNhc2UgTGluZVNoYXBlLmVsYm93OiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0RWxib3dQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZVNoYXBlLmN1cnZlOiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q3VydmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBQbGFpdExpbmUuZ2V0UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMaW5lSGFuZGxlUmVmUGFpciA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzb3VyY2VCb3VuZEVsZW1lbnQgPSBlbGVtZW50LnNvdXJjZS5ib3VuZElkID8gZ2V0RWxlbWVudEJ5SWQ8UGxhaXRHZW9tZXRyeT4oYm9hcmQsIGVsZW1lbnQuc291cmNlLmJvdW5kSWQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRhcmdldEJvdW5kRWxlbWVudCA9IGVsZW1lbnQudGFyZ2V0LmJvdW5kSWQgPyBnZXRFbGVtZW50QnlJZDxQbGFpdEdlb21ldHJ5Pihib2FyZCwgZWxlbWVudC50YXJnZXQuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHNvdXJjZVBvaW50ID0gc291cmNlQm91bmRFbGVtZW50ID8gZ2V0Q29ubmVjdGlvblBvaW50KHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEpIDogZWxlbWVudC5wb2ludHNbMF07XG4gICAgbGV0IHRhcmdldFBvaW50ID0gdGFyZ2V0Qm91bmRFbGVtZW50XG4gICAgICAgID8gZ2V0Q29ubmVjdGlvblBvaW50KHRhcmdldEJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEpXG4gICAgICAgIDogZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgbGV0IHNvdXJjZURpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5VmVjdG9yKFt0YXJnZXRQb2ludFswXSAtIHNvdXJjZVBvaW50WzBdLCB0YXJnZXRQb2ludFsxXSAtIHNvdXJjZVBvaW50WzFdXSkhO1xuICAgIGxldCB0YXJnZXREaXJlY3Rpb24gPSBnZXRPcHBvc2l0ZURpcmVjdGlvbihzb3VyY2VEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHNvdXJjZUZhY3RvciA9IGdldERpcmVjdGlvbkZhY3Rvcihzb3VyY2VEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHRhcmdldEZhY3RvciA9IGdldERpcmVjdGlvbkZhY3Rvcih0YXJnZXREaXJlY3Rpb24pO1xuICAgIGNvbnN0IHNvdXJjZUhhbmRsZVJlZjogTGluZUhhbmRsZVJlZiA9IHtcbiAgICAgICAga2V5OiBMaW5lSGFuZGxlS2V5LnNvdXJjZSxcbiAgICAgICAgcG9pbnQ6IHNvdXJjZVBvaW50LFxuICAgICAgICBkaXJlY3Rpb246IHNvdXJjZURpcmVjdGlvbixcbiAgICAgICAgdmVjdG9yOiBbc291cmNlRmFjdG9yLngsIHNvdXJjZUZhY3Rvci55XVxuICAgIH07XG4gICAgY29uc3QgdGFyZ2V0SGFuZGxlUmVmOiBMaW5lSGFuZGxlUmVmID0ge1xuICAgICAgICBrZXk6IExpbmVIYW5kbGVLZXkudGFyZ2V0LFxuICAgICAgICBwb2ludDogdGFyZ2V0UG9pbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGFyZ2V0RGlyZWN0aW9uLFxuICAgICAgICB2ZWN0b3I6IFt0YXJnZXRGYWN0b3IueCwgdGFyZ2V0RmFjdG9yLnldXG4gICAgfTtcbiAgICBpZiAoc291cmNlQm91bmRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25PZmZzZXQgPSBQbGFpdExpbmUuaXNTb3VyY2VNYXJrT3JUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUsIExpbmVIYW5kbGVLZXkuc291cmNlKSA/IDAgOiBzdHJva2VXaWR0aDtcbiAgICAgICAgY29uc3Qgc291cmNlVmVjdG9yID0gZ2V0VmVjdG9yQnlDb25uZWN0aW9uKHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEpO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3Rvcihzb3VyY2VWZWN0b3IpO1xuICAgICAgICBzb3VyY2VEaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyBkaXJlY3Rpb24gOiBzb3VyY2VEaXJlY3Rpb247XG4gICAgICAgIHNvdXJjZVBvaW50ID0gZ2V0Q29ubmVjdGlvblBvaW50KHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEsIHNvdXJjZURpcmVjdGlvbiwgY29ubmVjdGlvbk9mZnNldCk7XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5ib3VuZEVsZW1lbnQgPSBzb3VyY2VCb3VuZEVsZW1lbnQ7XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5kaXJlY3Rpb24gPSBzb3VyY2VEaXJlY3Rpb247XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5wb2ludCA9IHNvdXJjZVBvaW50O1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYudmVjdG9yID0gc291cmNlVmVjdG9yO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0Qm91bmRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25PZmZzZXQgPSBQbGFpdExpbmUuaXNTb3VyY2VNYXJrT3JUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUsIExpbmVIYW5kbGVLZXkudGFyZ2V0KSA/IDAgOiBzdHJva2VXaWR0aDtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmVjdG9yID0gZ2V0VmVjdG9yQnlDb25uZWN0aW9uKHRhcmdldEJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEpO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3Rvcih0YXJnZXRWZWN0b3IpO1xuICAgICAgICB0YXJnZXREaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyBkaXJlY3Rpb24gOiB0YXJnZXREaXJlY3Rpb247XG4gICAgICAgIHRhcmdldFBvaW50ID0gZ2V0Q29ubmVjdGlvblBvaW50KHRhcmdldEJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEsIHRhcmdldERpcmVjdGlvbiwgY29ubmVjdGlvbk9mZnNldCk7XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi5ib3VuZEVsZW1lbnQgPSB0YXJnZXRCb3VuZEVsZW1lbnQ7XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi5kaXJlY3Rpb24gPSB0YXJnZXREaXJlY3Rpb247XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi5wb2ludCA9IHRhcmdldFBvaW50O1xuICAgICAgICB0YXJnZXRIYW5kbGVSZWYudmVjdG9yID0gdGFyZ2V0VmVjdG9yO1xuICAgIH1cbiAgICByZXR1cm4geyBzb3VyY2U6IHNvdXJjZUhhbmRsZVJlZiwgdGFyZ2V0OiB0YXJnZXRIYW5kbGVSZWYgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGJvd1BvaW50cyA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBoYW5kbGVSZWZQYWlyID0gZ2V0TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBlbGVtZW50LnNvdXJjZS5ib3VuZElkIHx8IGVsZW1lbnQudGFyZ2V0LmJvdW5kSWQgPyAzMCA6IDA7XG4gICAgICAgIGxldCBwb2ludHM6IFBvaW50W10gPSBnZXRQb2ludHMoXG4gICAgICAgICAgICBoYW5kbGVSZWZQYWlyLnNvdXJjZS5wb2ludCxcbiAgICAgICAgICAgIGhhbmRsZVJlZlBhaXIuc291cmNlLmRpcmVjdGlvbixcbiAgICAgICAgICAgIGhhbmRsZVJlZlBhaXIudGFyZ2V0LnBvaW50LFxuICAgICAgICAgICAgaGFuZGxlUmVmUGFpci50YXJnZXQuZGlyZWN0aW9uLFxuICAgICAgICAgICAgb2Zmc2V0XG4gICAgICAgICk7XG4gICAgICAgIHBvaW50cyA9IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyhwb2ludHMpO1xuICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wb2ludHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VydmVQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlUmVmUGFpciA9IGdldExpbmVIYW5kbGVSZWZQYWlyKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgY29uc3QgeyBzb3VyY2UsIHRhcmdldCB9ID0gaGFuZGxlUmVmUGFpcjtcbiAgICAgICAgY29uc3Qgc291cmNlQm91bmRFbGVtZW50ID0gaGFuZGxlUmVmUGFpci5zb3VyY2UuYm91bmRFbGVtZW50O1xuICAgICAgICBjb25zdCB0YXJnZXRCb3VuZEVsZW1lbnQgPSBoYW5kbGVSZWZQYWlyLnRhcmdldC5ib3VuZEVsZW1lbnQ7XG4gICAgICAgIGxldCBjdXJ2ZVBvaW50czogUG9pbnRbXSA9IFtzb3VyY2UucG9pbnRdO1xuICAgICAgICBjb25zdCBzdW1EaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uc291cmNlLnBvaW50LCAuLi50YXJnZXQucG9pbnQpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAxMiArIHN1bURpc3RhbmNlIC8gMztcbiAgICAgICAgaWYgKHNvdXJjZUJvdW5kRWxlbWVudCkge1xuICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaChnZXRQb2ludEJ5VmVjdG9yKHNvdXJjZS5wb2ludCwgc291cmNlLnZlY3Rvciwgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldEJvdW5kRWxlbWVudCkge1xuICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaChnZXRQb2ludEJ5VmVjdG9yKHRhcmdldC5wb2ludCwgdGFyZ2V0LnZlY3Rvciwgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNTaW5nbGVCb3VuZCA9IChzb3VyY2VCb3VuZEVsZW1lbnQgJiYgIXRhcmdldEJvdW5kRWxlbWVudCkgfHwgKCFzb3VyY2VCb3VuZEVsZW1lbnQgJiYgdGFyZ2V0Qm91bmRFbGVtZW50KTtcbiAgICAgICAgaWYgKGlzU2luZ2xlQm91bmQpIHtcbiAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2godGFyZ2V0LnBvaW50KTtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IFEyQyhjdXJ2ZVBvaW50cyk7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRzT25CZXppZXJDdXJ2ZXMocG9pbnRzKSBhcyBQb2ludFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc291cmNlQm91bmRFbGVtZW50ICYmICF0YXJnZXRCb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2goZ2V0UG9pbnRCeVZlY3Rvcihzb3VyY2UucG9pbnQsIHNvdXJjZS52ZWN0b3IsIG9mZnNldCkpO1xuICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaChnZXRQb2ludEJ5VmVjdG9yKHRhcmdldC5wb2ludCwgdGFyZ2V0LnZlY3Rvciwgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VydmVQb2ludHMucHVzaCh0YXJnZXQucG9pbnQpO1xuICAgICAgICByZXR1cm4gcG9pbnRzT25CZXppZXJDdXJ2ZXMoY3VydmVQb2ludHMpIGFzIFBvaW50W107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9UT0RPIOebtOaOpeiOt+WPlui0neWhnuWwlOabsue6v+S4iumrmOWvhuW6pueCuVxuICAgICAgICBjb25zdCBwb2ludHMgPSBQbGFpdExpbmUuZ2V0UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZHJhdyA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLmdlbmVyYXRvci5jdXJ2ZShwb2ludHMpO1xuICAgICAgICBsZXQgYmV6aWVyUG9pbnRzID0gdHJhbnNmb3JtT3BzVG9Qb2ludHMoZHJhdy5zZXRzWzBdLm9wcykgYXMgUG9pbnRbXTtcbiAgICAgICAgYmV6aWVyUG9pbnRzID0gcmVtb3ZlRHVwbGljYXRlUG9pbnRzKGJlemllclBvaW50cyk7XG4gICAgICAgIHJldHVybiBwb2ludHNPbkJlemllckN1cnZlcyhiZXppZXJQb2ludHMpIGFzIFBvaW50W107XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybU9wc1RvUG9pbnRzID0gKG9wczogT3BbXSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGl0ZW0gb2Ygb3BzKSB7XG4gICAgICAgIGlmIChpdGVtLm9wID09PSAnbW92ZScpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtpdGVtLmRhdGFbMF0sIGl0ZW0uZGF0YVsxXV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2l0ZW0uZGF0YVswXSwgaXRlbS5kYXRhWzFdXSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChbaXRlbS5kYXRhWzJdLCBpdGVtLmRhdGFbM11dKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtpdGVtLmRhdGFbNF0sIGl0ZW0uZGF0YVs1XV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIaXRQb2x5TGluZSA9IChwYXRoUG9pbnRzOiBQb2ludFtdLCBwb2ludDogUG9pbnQsIHN0cm9rZVdpZHRoOiBudW1iZXIsIGV4cGFuZDogbnVtYmVyID0gMCkgPT4ge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRTZWdtZW50cyhwYXRoUG9pbnRzLCBwb2ludCk7XG4gICAgcmV0dXJuIGRpc3RhbmNlIDw9IHN0cm9rZVdpZHRoICsgZXhwYW5kO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpdExpbmVUZXh0SW5kZXggPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgdGV4dHMgPSBlbGVtZW50LnRleHRzO1xuICAgIGlmICghdGV4dHMubGVuZ3RoKSByZXR1cm4gLTE7XG5cbiAgICBjb25zdCBwb2ludHMgPSBnZXRFbGJvd1BvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIHRleHRzLmZpbmRJbmRleCh0ZXh0ID0+IHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gZ2V0UG9pbnRPblBvbHlsaW5lKHBvaW50cywgdGV4dC5wb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IHtcbiAgICAgICAgICAgIHg6IGNlbnRlclswXSAtIHRleHQud2lkdGghIC8gMixcbiAgICAgICAgICAgIHk6IGNlbnRlclsxXSAtIHRleHQuaGVpZ2h0ISAvIDIsXG4gICAgICAgICAgICB3aWR0aDogdGV4dC53aWR0aCEsXG4gICAgICAgICAgICBoZWlnaHQ6IHRleHQuaGVpZ2h0IVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHJlY3RhbmdsZSwgUmVjdGFuZ2xlQ2xpZW50LnRvUmVjdGFuZ2xlQ2xpZW50KFtwb2ludCwgcG9pbnRdKSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIaXRMaW5lVGV4dCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICByZXR1cm4gZ2V0SGl0TGluZVRleHRJbmRleChib2FyZCwgZWxlbWVudCwgcG9pbnQpICE9PSAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBkcmF3TGluZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VDb2xvciA9IGdldFN0cm9rZUNvbG9yQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IHN0cm9rZUxpbmVEYXNoID0gZ2V0TGluZURhc2hCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgc3Ryb2tlOiBzdHJva2VDb2xvciwgc3Ryb2tlV2lkdGgsIHN0cm9rZUxpbmVEYXNoIH07XG4gICAgY29uc3QgbGluZUcgPSBjcmVhdGVHKCk7XG4gICAgbGV0IHBvaW50cyA9IGdldExpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGxldCBsaW5lO1xuICAgIGlmIChlbGVtZW50LnNoYXBlID09PSBMaW5lU2hhcGUuY3VydmUpIHtcbiAgICAgICAgLy9UT0RPIGVsZW1lbnQucG9pbnRzIOW6lOS4uuabsue6v+aLkOeCuVxuICAgICAgICBsaW5lID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCkuY3VydmUocG9pbnRzLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lID0gZHJhd0xpbmVhclBhdGgocG9pbnRzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBpZENyZWF0b3IoKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZSgnbWFzaycsIGB1cmwoIyR7aWR9KWApO1xuICAgIGxpbmVHLmFwcGVuZENoaWxkKGxpbmUpO1xuICAgIGNvbnN0IHsgbWFzaywgbWFza1RhcmdldEZpbGxSZWN0IH0gPSBkcmF3TWFzayhib2FyZCwgZWxlbWVudCwgaWQpO1xuICAgIGxpbmVHLmFwcGVuZENoaWxkKG1hc2spO1xuICAgIGxpbmUuYXBwZW5kQ2hpbGQobWFza1RhcmdldEZpbGxSZWN0KTtcbiAgICBjb25zdCBhcnJvdyA9IGRyYXdMaW5lQXJyb3coZWxlbWVudCwgcG9pbnRzLCB7IHN0cm9rZTogc3Ryb2tlQ29sb3IsIHN0cm9rZVdpZHRoIH0pO1xuICAgIGFycm93ICYmIGxpbmVHLmFwcGVuZENoaWxkKGFycm93KTtcbiAgICByZXR1cm4gbGluZUc7XG59O1xuXG5mdW5jdGlvbiBkcmF3TWFzayhib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbWFzayA9IGNyZWF0ZU1hc2soKTtcbiAgICBtYXNrLnNldEF0dHJpYnV0ZSgnaWQnLCBpZCk7XG4gICAgY29uc3QgcG9pbnRzID0gZ2V0TGluZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgbGV0IHJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5UG9pbnRzKHBvaW50cyk7XG4gICAgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldE91dGxpbmVSZWN0YW5nbGUocmVjdGFuZ2xlLCAtMzApO1xuICAgIGNvbnN0IG1hc2tGaWxsUmVjdCA9IGNyZWF0ZVJlY3QocmVjdGFuZ2xlLCB7XG4gICAgICAgIGZpbGw6ICd3aGl0ZSdcbiAgICB9KTtcbiAgICBtYXNrLmFwcGVuZENoaWxkKG1hc2tGaWxsUmVjdCk7XG5cbiAgICBjb25zdCB0ZXh0cyA9IGVsZW1lbnQudGV4dHM7XG4gICAgdGV4dHMuZm9yRWFjaCgodGV4dCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdGV4dFJlY3RhbmdsZSA9IGdldExpbmVUZXh0UmVjdGFuZ2xlKGJvYXJkLCBlbGVtZW50LCBpbmRleCk7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBjcmVhdGVSZWN0KHRleHRSZWN0YW5nbGUsIHtcbiAgICAgICAgICAgIGZpbGw6ICdibGFjaydcbiAgICAgICAgfSk7XG4gICAgICAgIG1hc2suYXBwZW5kQ2hpbGQocmVjdCk7XG4gICAgfSk7XG4gICAgLy/mkpHlvIAgbGluZVxuICAgIGNvbnN0IG1hc2tUYXJnZXRGaWxsUmVjdCA9IGNyZWF0ZVJlY3QocmVjdGFuZ2xlKTtcbiAgICBtYXNrVGFyZ2V0RmlsbFJlY3Quc2V0QXR0cmlidXRlKCdvcGFjaXR5JywgJzAnKTtcbiAgICByZXR1cm4geyBtYXNrLCBtYXNrVGFyZ2V0RmlsbFJlY3QgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldENvbm5lY3Rpb25Qb2ludCA9IChnZW9tZXRyeTogUGxhaXRHZW9tZXRyeSwgY29ubmVjdGlvbjogUG9pbnQsIGRpcmVjdGlvbj86IERpcmVjdGlvbiwgZGVsdGE/OiBudW1iZXIpOiBQb2ludCA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZ2VvbWV0cnkucG9pbnRzKTtcbiAgICBpZiAoZGlyZWN0aW9uICYmIGRlbHRhKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihkaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBwb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIFtwb2ludFswXSArIGRpcmVjdGlvbkZhY3Rvci54ICogZGVsdGEsIHBvaW50WzFdICsgZGlyZWN0aW9uRmFjdG9yLnkgKiBkZWx0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtUG9pbnRUb0Nvbm5lY3Rpb24gPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50OiBQb2ludCwgaGl0RWxlbWVudDogUGxhaXRHZW9tZXRyeSk6IFBvaW50ID0+IHtcbiAgICBsZXQgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoaGl0RWxlbWVudC5wb2ludHMpO1xuICAgIHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKHJlY3RhbmdsZSwgQUNUSVZFX1NUUk9LRV9XSURUSCk7XG4gICAgbGV0IG5lYXJlc3RQb2ludCA9IGdldE5lYXJlc3RQb2ludChoaXRFbGVtZW50LCBwb2ludCwgQUNUSVZFX1NUUk9LRV9XSURUSCk7XG4gICAgY29uc3QgaGl0Q29ubmVjdG9yID0gZ2V0SGl0Q29ubmVjdG9yUG9pbnQobmVhcmVzdFBvaW50LCBoaXRFbGVtZW50LCByZWN0YW5nbGUpO1xuICAgIG5lYXJlc3RQb2ludCA9IGhpdENvbm5lY3RvciA/IGhpdENvbm5lY3RvciA6IG5lYXJlc3RQb2ludDtcbiAgICByZXR1cm4gWyhuZWFyZXN0UG9pbnRbMF0gLSByZWN0YW5nbGUueCkgLyByZWN0YW5nbGUud2lkdGgsIChuZWFyZXN0UG9pbnRbMV0gLSByZWN0YW5nbGUueSkgLyByZWN0YW5nbGUuaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRDb25uZWN0b3JQb2ludCA9IChtb3ZpbmdQb2ludDogUG9pbnQsIGhpdEVsZW1lbnQ6IFBsYWl0R2VvbWV0cnksIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSA9PiB7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZShoaXRFbGVtZW50KTtcbiAgICBjb25zdCBjb25uZWN0b3IgPSBnZXRFbmdpbmUoc2hhcGUpLmdldENvbm5lY3RvclBvaW50cyhyZWN0YW5nbGUpO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldFBvaW50c0J5Q2VudGVyUG9pbnQobW92aW5nUG9pbnQsIDUsIDUpO1xuICAgIGNvbnN0IHBvaW50UmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMocG9pbnRzKTtcbiAgICByZXR1cm4gY29ubmVjdG9yLmZpbmQocG9pbnQgPT4ge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHBvaW50UmVjdGFuZ2xlLCBSZWN0YW5nbGVDbGllbnQudG9SZWN0YW5nbGVDbGllbnQoW3BvaW50LCBwb2ludF0pKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMaW5lVGV4dFJlY3RhbmdsZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBpbmRleDogbnVtYmVyKTogUmVjdGFuZ2xlQ2xpZW50ID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gZWxlbWVudC50ZXh0c1tpbmRleF07XG4gICAgY29uc3QgZWxib3dQb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBwb2ludCA9IGdldFBvaW50T25Qb2x5bGluZShlbGJvd1BvaW50cywgdGV4dC5wb3NpdGlvbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcG9pbnRbMF0gLSB0ZXh0LndpZHRoISAvIDIsXG4gICAgICAgIHk6IHBvaW50WzFdIC0gdGV4dC5oZWlnaHQhIC8gMixcbiAgICAgICAgd2lkdGg6IHRleHQud2lkdGghLFxuICAgICAgICBoZWlnaHQ6IHRleHQuaGVpZ2h0IVxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm9hcmRMaW5lcyA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIHJldHVybiBmaW5kRWxlbWVudHMoYm9hcmQsIHtcbiAgICAgICAgbWF0Y2g6IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IFBsYWl0RHJhd0VsZW1lbnQuaXNMaW5lKGVsZW1lbnQpLFxuICAgICAgICByZWN1cnNpb246IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IFBsYWl0RHJhd0VsZW1lbnQuaXNEcmF3RWxlbWVudChlbGVtZW50KVxuICAgIH0pIGFzIFBsYWl0TGluZVtdO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCBuZXdBcnJheTogUG9pbnRbXSA9IFtdO1xuICAgIHBvaW50cy5mb3JFYWNoKHBvaW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBuZXdBcnJheS5maW5kSW5kZXgob3RoZXJQb2ludCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRbMF0gPT09IG90aGVyUG9pbnRbMF0gJiYgcG9pbnRbMV0gPT09IG90aGVyUG9pbnRbMV07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSBuZXdBcnJheS5wdXNoKHBvaW50KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3QXJyYXk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXh0ZW5kUG9pbnQgPSAoc291cmNlOiBQb2ludCwgdGFyZ2V0OiBQb2ludCwgZXh0ZW5kRGlzdGFuY2U6IG51bWJlcik6IFBvaW50ID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uc291cmNlLCAuLi50YXJnZXQpO1xuICAgIGNvbnN0IHNpbiA9ICh0YXJnZXRbMV0gLSBzb3VyY2VbMV0pIC8gZGlzdGFuY2U7XG4gICAgY29uc3QgY29zID0gKHRhcmdldFswXSAtIHNvdXJjZVswXSkgLyBkaXN0YW5jZTtcbiAgICByZXR1cm4gW3NvdXJjZVswXSArIGV4dGVuZERpc3RhbmNlICogY29zLCBzb3VyY2VbMV0gKyBleHRlbmREaXN0YW5jZSAqIHNpbl07XG59O1xuXG4vLyBxdWFkcmF0aWMgQmV6aWVyIHRvIGN1YmljIEJlemllclxuZXhwb3J0IGNvbnN0IFEyQyA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBudW1TZWdtZW50cyA9IHBvaW50cy5sZW5ndGggLyAzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2VnbWVudHM7IGkrKykge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBvaW50c1tpXTtcbiAgICAgICAgY29uc3QgcUNvbnRyb2wgPSBwb2ludHNbaSArIDFdO1xuICAgICAgICBjb25zdCBlbmQgPSBwb2ludHNbaSArIDJdO1xuICAgICAgICBjb25zdCBzdGFydERpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5zdGFydCwgLi4ucUNvbnRyb2wpO1xuICAgICAgICBjb25zdCBlbmREaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uZW5kLCAuLi5xQ29udHJvbCk7XG4gICAgICAgIGNvbnN0IGNDb250cm9sMSA9IGdldEV4dGVuZFBvaW50KHN0YXJ0LCBxQ29udHJvbCwgKHN0YXJ0RGlzdGFuY2UgKiAyKSAvIDMpO1xuICAgICAgICBjb25zdCBjQ29udHJvbDIgPSBnZXRFeHRlbmRQb2ludChlbmQsIHFDb250cm9sLCAoZW5kRGlzdGFuY2UgKiAyKSAvIDMpO1xuICAgICAgICByZXN1bHQucHVzaChzdGFydCwgY0NvbnRyb2wxLCBjQ29udHJvbDIsIGVuZCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmVjdG9yQnlDb25uZWN0aW9uID0gKGJvdW5kRWxlbWVudDogUGxhaXRHZW9tZXRyeSwgY29ubmVjdGlvbjogUG9pbnRPZlJlY3RhbmdsZSk6IFZlY3RvciA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoYm91bmRFbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZShib3VuZEVsZW1lbnQpO1xuICAgIGNvbnN0IGVuZ2luZSA9IGdldEVuZ2luZShzaGFwZSk7XG4gICAgbGV0IHZlY3RvcjogVmVjdG9yID0gWzAsIDBdO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5UG9pbnRPZlJlY3RhbmdsZShjb25uZWN0aW9uKTtcbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihkaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4gW2ZhY3Rvci54LCBmYWN0b3IueV07XG4gICAgfVxuICAgIGlmIChlbmdpbmUuZ2V0RWRnZUJ5Q29ubmVjdGlvblBvaW50KSB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBlbmdpbmUuZ2V0RWRnZUJ5Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZSwgY29ubmVjdGlvbik7XG4gICAgICAgIGlmIChlZGdlKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lVmVjdG9yID0gW2VkZ2VbMV1bMF0gLSBlZGdlWzBdWzBdLCBlZGdlWzFdWzFdIC0gZWRnZVswXVsxXV0gYXMgVmVjdG9yO1xuICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVZlY3RvckFudGk5MChsaW5lVmVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5naW5lLmdldFRhbmdlbnRWZWN0b3JCeUNvbm5lY3Rpb25Qb2ludCkge1xuICAgICAgICBjb25zdCBsaW5lVmVjdG9yID0gZW5naW5lLmdldFRhbmdlbnRWZWN0b3JCeUNvbm5lY3Rpb25Qb2ludChyZWN0YW5nbGUsIGNvbm5lY3Rpb24pO1xuICAgICAgICBpZiAobGluZVZlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVZlY3RvckFudGk5MChsaW5lVmVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yO1xufTtcbiJdfQ==
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { RectangleClient, depthFirstRecursion, getIsRecursionFunc } from '@plait/core';
|
|
2
2
|
import { PlaitDrawElement } from '../../interfaces';
|
|
3
3
|
import { RESIZE_HANDLE_DIAMETER, getRectangleByPoints, getRectangleResizeHandleRefs } from '@plait/common';
|
|
4
|
-
import { getEngine } from '
|
|
4
|
+
import { getEngine } from '../../engines';
|
|
5
|
+
import { getShape } from '../shape';
|
|
5
6
|
export const getHitGeometryResizeHandleRef = (board, element, point) => {
|
|
6
7
|
const rectangle = getRectangleByPoints(element.points);
|
|
7
8
|
const resizeHandleRefs = getRectangleResizeHandleRefs(rectangle, RESIZE_HANDLE_DIAMETER);
|
|
@@ -13,10 +14,10 @@ export const getHitGeometryResizeHandleRef = (board, element, point) => {
|
|
|
13
14
|
export const getHitOutlineGeometry = (board, point, offset = 0) => {
|
|
14
15
|
let geometry = null;
|
|
15
16
|
depthFirstRecursion(board, node => {
|
|
16
|
-
if (PlaitDrawElement.isGeometry(node)) {
|
|
17
|
-
const shape = node.shape;
|
|
17
|
+
if (PlaitDrawElement.isGeometry(node) || PlaitDrawElement.isImage(node)) {
|
|
18
18
|
let client = getRectangleByPoints(node.points);
|
|
19
19
|
client = RectangleClient.getOutlineRectangle(client, offset);
|
|
20
|
+
const shape = getShape(node);
|
|
20
21
|
const isHit = getEngine(shape).isHit(client, point);
|
|
21
22
|
if (isHit) {
|
|
22
23
|
geometry = node;
|
|
@@ -25,4 +26,4 @@ export const getHitOutlineGeometry = (board, point, offset = 0) => {
|
|
|
25
26
|
}, getIsRecursionFunc(board), true);
|
|
26
27
|
return geometry;
|
|
27
28
|
};
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9wb3NpdGlvbi9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQStCLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWlCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVwQyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBbUMsRUFBRSxLQUFZLEVBQUUsRUFBRTtJQUNsSCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN6RixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBaUIsRUFBRSxLQUFZLEVBQUUsU0FBaUIsQ0FBQyxFQUF3QixFQUFFO0lBQy9HLElBQUksUUFBUSxHQUFzQyxJQUFJLENBQUM7SUFDdkQsbUJBQW1CLENBQ2YsS0FBSyxFQUNMLElBQUksQ0FBQyxFQUFFO1FBQ0gsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JFLElBQUksTUFBTSxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1AsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNuQjtTQUNKO0lBQ0wsQ0FBQyxFQUNELGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUN6QixJQUFJLENBQ1AsQ0FBQztJQUNGLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuY2VzdG9yLCBQbGFpdEJvYXJkLCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50LCBkZXB0aEZpcnN0UmVjdXJzaW9uLCBnZXRJc1JlY3Vyc2lvbkZ1bmMgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBQbGFpdERyYXdFbGVtZW50LCBQbGFpdEdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSRVNJWkVfSEFORExFX0RJQU1FVEVSLCBnZXRSZWN0YW5nbGVCeVBvaW50cywgZ2V0UmVjdGFuZ2xlUmVzaXplSGFuZGxlUmVmcyB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0RW5naW5lIH0gZnJvbSAnLi4vLi4vZW5naW5lcyc7XG5pbXBvcnQgeyBQbGFpdEltYWdlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9pbWFnZSc7XG5pbXBvcnQgeyBnZXRTaGFwZSB9IGZyb20gJy4uL3NoYXBlJztcblxuZXhwb3J0IGNvbnN0IGdldEhpdEdlb21ldHJ5UmVzaXplSGFuZGxlUmVmID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEdlb21ldHJ5IHwgUGxhaXRJbWFnZSwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZWxlbWVudC5wb2ludHMpO1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZVJlZnMgPSBnZXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWZzKHJlY3RhbmdsZSwgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUik7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzaXplSGFuZGxlUmVmcy5maW5kKHJlc2l6ZUhhbmRsZVJlZiA9PiB7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQoUmVjdGFuZ2xlQ2xpZW50LnRvUmVjdGFuZ2xlQ2xpZW50KFtwb2ludCwgcG9pbnRdKSwgcmVzaXplSGFuZGxlUmVmLnJlY3RhbmdsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRPdXRsaW5lR2VvbWV0cnkgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50OiBQb2ludCwgb2Zmc2V0OiBudW1iZXIgPSAwKTogUGxhaXRHZW9tZXRyeSB8IG51bGwgPT4ge1xuICAgIGxldCBnZW9tZXRyeTogUGxhaXRHZW9tZXRyeSB8IFBsYWl0SW1hZ2UgfCBudWxsID0gbnVsbDtcbiAgICBkZXB0aEZpcnN0UmVjdXJzaW9uPEFuY2VzdG9yPihcbiAgICAgICAgYm9hcmQsXG4gICAgICAgIG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNHZW9tZXRyeShub2RlKSB8fCBQbGFpdERyYXdFbGVtZW50LmlzSW1hZ2Uobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xpZW50ID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMobm9kZS5wb2ludHMpO1xuICAgICAgICAgICAgICAgIGNsaWVudCA9IFJlY3RhbmdsZUNsaWVudC5nZXRPdXRsaW5lUmVjdGFuZ2xlKGNsaWVudCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFwZSA9IGdldFNoYXBlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSGl0ID0gZ2V0RW5naW5lKHNoYXBlKS5pc0hpdChjbGllbnQsIHBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNIaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SXNSZWN1cnNpb25GdW5jKGJvYXJkKSxcbiAgICAgICAgdHJ1ZVxuICAgICk7XG4gICAgcmV0dXJuIGdlb21ldHJ5O1xufTtcbiJdfQ==
|
|
@@ -1,34 +1,44 @@
|
|
|
1
1
|
import { RectangleClient } from '@plait/core';
|
|
2
|
+
import { PlaitLine } from '../../interfaces';
|
|
2
3
|
import { RESIZE_HANDLE_DIAMETER } from '@plait/common';
|
|
3
|
-
import {
|
|
4
|
+
import { getMiddlePoints } from '../../generators/line-active.generator';
|
|
4
5
|
export var LineResizeHandle;
|
|
5
6
|
(function (LineResizeHandle) {
|
|
6
7
|
LineResizeHandle["source"] = "source";
|
|
7
8
|
LineResizeHandle["target"] = "target";
|
|
9
|
+
LineResizeHandle["addHandle"] = "addHandle";
|
|
8
10
|
})(LineResizeHandle || (LineResizeHandle = {}));
|
|
9
11
|
export const getHitLineResizeHandleRef = (board, element, point) => {
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
y: targetPoint[1] - RESIZE_HANDLE_DIAMETER / 2,
|
|
21
|
-
width: RESIZE_HANDLE_DIAMETER,
|
|
22
|
-
height: RESIZE_HANDLE_DIAMETER
|
|
23
|
-
};
|
|
24
|
-
const isHitSourceRectangle = RectangleClient.isHit(RectangleClient.toRectangleClient([point, point]), sourceRectangle);
|
|
25
|
-
const isHitTargetRectangle = RectangleClient.isHit(RectangleClient.toRectangleClient([point, point]), targetRectangle);
|
|
26
|
-
if (isHitSourceRectangle) {
|
|
27
|
-
return { rectangle: sourceRectangle, handle: LineResizeHandle.source };
|
|
12
|
+
const points = PlaitLine.getPoints(board, element);
|
|
13
|
+
const index = getHitPointIndex(points, point);
|
|
14
|
+
if (index !== -1) {
|
|
15
|
+
if (index === 0) {
|
|
16
|
+
return { handle: LineResizeHandle.source, index };
|
|
17
|
+
}
|
|
18
|
+
if (index === points.length - 1) {
|
|
19
|
+
return { handle: LineResizeHandle.target, index };
|
|
20
|
+
}
|
|
21
|
+
return { index };
|
|
28
22
|
}
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
const middlePoints = getMiddlePoints(board, element);
|
|
24
|
+
const middleIndex = getHitPointIndex(middlePoints, point);
|
|
25
|
+
if (middleIndex !== -1) {
|
|
26
|
+
return { handle: LineResizeHandle.addHandle, index: middleIndex };
|
|
31
27
|
}
|
|
32
28
|
return undefined;
|
|
33
29
|
};
|
|
34
|
-
|
|
30
|
+
function getHitPointIndex(points, movingPoint) {
|
|
31
|
+
const rectangles = points.map(point => {
|
|
32
|
+
return {
|
|
33
|
+
x: point[0] - RESIZE_HANDLE_DIAMETER / 2,
|
|
34
|
+
y: point[1] - RESIZE_HANDLE_DIAMETER / 2,
|
|
35
|
+
width: RESIZE_HANDLE_DIAMETER,
|
|
36
|
+
height: RESIZE_HANDLE_DIAMETER
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
const rectangle = rectangles.find(rectangle => {
|
|
40
|
+
return RectangleClient.isHit(RectangleClient.toRectangleClient([movingPoint, movingPoint]), rectangle);
|
|
41
|
+
});
|
|
42
|
+
return rectangle ? rectangles.indexOf(rectangle) : -1;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL3Bvc2l0aW9uL2xpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFekUsTUFBTSxDQUFOLElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUN4QixxQ0FBbUIsQ0FBQTtJQUNuQixxQ0FBbUIsQ0FBQTtJQUNuQiwyQ0FBeUIsQ0FBQTtBQUM3QixDQUFDLEVBSlcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUkzQjtBQUVELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEtBQVksRUFBRSxFQUFFO0lBQzdGLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNkLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNiLE9BQU8sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDckQ7UUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7S0FDcEI7SUFFRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxRCxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNwQixPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUM7S0FDckU7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixTQUFTLGdCQUFnQixDQUFDLE1BQWUsRUFBRSxXQUFrQjtJQUN6RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2xDLE9BQU87WUFDSCxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLHNCQUFzQixHQUFHLENBQUM7WUFDeEMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsR0FBRyxDQUFDO1lBQ3hDLEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsTUFBTSxFQUFFLHNCQUFzQjtTQUNqQyxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzFDLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFBsYWl0TGluZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0TWlkZGxlUG9pbnRzIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdG9ycy9saW5lLWFjdGl2ZS5nZW5lcmF0b3InO1xuXG5leHBvcnQgZW51bSBMaW5lUmVzaXplSGFuZGxlIHtcbiAgICAnc291cmNlJyA9ICdzb3VyY2UnLFxuICAgICd0YXJnZXQnID0gJ3RhcmdldCcsXG4gICAgJ2FkZEhhbmRsZScgPSAnYWRkSGFuZGxlJ1xufVxuXG5leHBvcnQgY29uc3QgZ2V0SGl0TGluZVJlc2l6ZUhhbmRsZVJlZiA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBwb2ludHMgPSBQbGFpdExpbmUuZ2V0UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBpbmRleCA9IGdldEhpdFBvaW50SW5kZXgocG9pbnRzLCBwb2ludCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZTogTGluZVJlc2l6ZUhhbmRsZS5zb3VyY2UsIGluZGV4IH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID09PSBwb2ludHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlOiBMaW5lUmVzaXplSGFuZGxlLnRhcmdldCwgaW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBpbmRleCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1pZGRsZVBvaW50cyA9IGdldE1pZGRsZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgbWlkZGxlSW5kZXggPSBnZXRIaXRQb2ludEluZGV4KG1pZGRsZVBvaW50cywgcG9pbnQpO1xuICAgIGlmIChtaWRkbGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgaGFuZGxlOiBMaW5lUmVzaXplSGFuZGxlLmFkZEhhbmRsZSwgaW5kZXg6IG1pZGRsZUluZGV4IH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5mdW5jdGlvbiBnZXRIaXRQb2ludEluZGV4KHBvaW50czogUG9pbnRbXSwgbW92aW5nUG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3QgcmVjdGFuZ2xlcyA9IHBvaW50cy5tYXAocG9pbnQgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG9pbnRbMF0gLSBSRVNJWkVfSEFORExFX0RJQU1FVEVSIC8gMixcbiAgICAgICAgICAgIHk6IHBvaW50WzFdIC0gUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiAvIDIsXG4gICAgICAgICAgICB3aWR0aDogUkVTSVpFX0hBTkRMRV9ESUFNRVRFUixcbiAgICAgICAgICAgIGhlaWdodDogUkVTSVpFX0hBTkRMRV9ESUFNRVRFUlxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IHJlY3RhbmdsZXMuZmluZChyZWN0YW5nbGUgPT4ge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC50b1JlY3RhbmdsZUNsaWVudChbbW92aW5nUG9pbnQsIG1vdmluZ1BvaW50XSksIHJlY3RhbmdsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY3RhbmdsZSA/IHJlY3RhbmdsZXMuaW5kZXhPZihyZWN0YW5nbGUpIDogLTE7XG59XG4iXX0=
|
|
@@ -12,4 +12,8 @@ export const getSelectedLineElements = (board) => {
|
|
|
12
12
|
const selectedElements = getSelectedElements(board).filter(value => PlaitDrawElement.isLine(value));
|
|
13
13
|
return selectedElements;
|
|
14
14
|
};
|
|
15
|
-
|
|
15
|
+
export const getSelectedImageElements = (board) => {
|
|
16
|
+
const selectedElements = getSelectedElements(board).filter(value => PlaitDrawElement.isImage(value));
|
|
17
|
+
return selectedElements;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9zZWxlY3RlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUczRSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUN6RCxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBdUIsQ0FBQztJQUNqSSxPQUFPLGdCQUFnQixDQUFDO0FBQzVCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQzdELE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFvQixDQUFDO0lBQzNILE9BQU8sZ0JBQWdCLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDekQsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQWdCLENBQUM7SUFDbkgsT0FBTyxnQkFBZ0IsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUMxRCxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBaUIsQ0FBQztJQUNySCxPQUFPLGdCQUFnQixDQUFDO0FBQzVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBQbGFpdERyYXdFbGVtZW50LCBQbGFpdEdlb21ldHJ5LCBQbGFpdExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBsYWl0SW1hZ2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ltYWdlJztcblxuZXhwb3J0IGNvbnN0IGdldFNlbGVjdGVkRHJhd0VsZW1lbnRzID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpLmZpbHRlcih2YWx1ZSA9PiBQbGFpdERyYXdFbGVtZW50LmlzRHJhd0VsZW1lbnQodmFsdWUpKSBhcyBQbGFpdERyYXdFbGVtZW50W107XG4gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0ZWRHZW9tZXRyeUVsZW1lbnRzID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpLmZpbHRlcih2YWx1ZSA9PiBQbGFpdERyYXdFbGVtZW50LmlzR2VvbWV0cnkodmFsdWUpKSBhcyBQbGFpdEdlb21ldHJ5W107XG4gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0ZWRMaW5lRWxlbWVudHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCkuZmlsdGVyKHZhbHVlID0+IFBsYWl0RHJhd0VsZW1lbnQuaXNMaW5lKHZhbHVlKSkgYXMgUGxhaXRMaW5lW107XG4gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0ZWRJbWFnZUVsZW1lbnRzID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpLmZpbHRlcih2YWx1ZSA9PiBQbGFpdERyYXdFbGVtZW50LmlzSW1hZ2UodmFsdWUpKSBhcyBQbGFpdEltYWdlW107XG4gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHM7XG59O1xuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GeometryShape, PlaitDrawElement } from '../interfaces';
|
|
2
|
+
export const getShape = (value) => {
|
|
3
|
+
if (PlaitDrawElement.isImage(value)) {
|
|
4
|
+
return GeometryShape.rectangle;
|
|
5
|
+
}
|
|
6
|
+
return value.shape;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9zaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUMxQyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNqQyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUM7S0FDbEM7SUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDdkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VvbWV0cnlTaGFwZSwgUGxhaXREcmF3RWxlbWVudCwgUGxhaXRTaGFwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hhcGUgPSAodmFsdWU6IFBsYWl0U2hhcGUpID0+IHtcbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0ltYWdlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gR2VvbWV0cnlTaGFwZS5yZWN0YW5nbGU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5zaGFwZTtcbn07XG4iXX0=
|