@plait/core 0.54.0 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/board/board.component.d.ts +6 -3
- package/constants/index.d.ts +2 -0
- package/core/element/context.d.ts +6 -2
- package/core/element/plugin-element.d.ts +13 -4
- package/core/list-render.d.ts +16 -0
- package/esm2022/board/board.component.mjs +24 -21
- package/esm2022/constants/index.mjs +3 -1
- package/esm2022/core/element/context.mjs +1 -1
- package/esm2022/core/element/plugin-element.mjs +79 -12
- package/esm2022/core/list-render.mjs +209 -0
- package/esm2022/interfaces/board.mjs +3 -3
- package/esm2022/interfaces/element.mjs +28 -2
- package/esm2022/interfaces/node.mjs +18 -1
- package/esm2022/interfaces/path.mjs +56 -57
- package/esm2022/plugins/create-board.mjs +10 -10
- package/esm2022/plugins/with-hotkey.mjs +32 -3
- package/esm2022/plugins/with-moving.mjs +12 -12
- package/esm2022/plugins/with-related-fragment.mjs +5 -5
- package/esm2022/public-api.mjs +1 -3
- package/esm2022/transforms/group.mjs +23 -6
- package/esm2022/transforms/index.mjs +6 -3
- package/esm2022/transforms/z-index.mjs +20 -0
- package/esm2022/utils/angle.mjs +17 -3
- package/esm2022/utils/clipboard/clipboard.mjs +5 -5
- package/esm2022/utils/clipboard/common.mjs +5 -5
- package/esm2022/utils/clipboard/types.mjs +1 -1
- package/esm2022/utils/common.mjs +27 -1
- package/esm2022/utils/fragment.mjs +20 -1
- package/esm2022/utils/group.mjs +27 -1
- package/esm2022/utils/helper.mjs +37 -1
- package/esm2022/utils/index.mjs +4 -1
- package/esm2022/utils/math.mjs +37 -1
- package/esm2022/utils/position.mjs +3 -3
- package/esm2022/utils/snap/snap-moving.mjs +199 -0
- package/esm2022/utils/snap/snap.mjs +208 -0
- package/esm2022/utils/to-image.mjs +2 -2
- package/esm2022/utils/weak-maps.mjs +3 -1
- package/esm2022/utils/z-index.mjs +166 -0
- package/fesm2022/plait-core.mjs +1655 -1080
- package/fesm2022/plait-core.mjs.map +1 -1
- package/interfaces/board.d.ts +5 -5
- package/interfaces/element.d.ts +5 -0
- package/interfaces/node.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +0 -2
- package/styles/styles.scss +9 -0
- package/transforms/group.d.ts +4 -0
- package/transforms/index.d.ts +3 -2
- package/transforms/z-index.d.ts +13 -0
- package/utils/angle.d.ts +2 -0
- package/utils/clipboard/common.d.ts +1 -1
- package/utils/clipboard/types.d.ts +1 -1
- package/utils/common.d.ts +8 -0
- package/utils/fragment.d.ts +3 -1
- package/utils/group.d.ts +3 -1
- package/utils/helper.d.ts +4 -1
- package/utils/index.d.ts +3 -0
- package/utils/math.d.ts +1 -0
- package/utils/position.d.ts +1 -1
- package/utils/snap/snap-moving.d.ts +5 -0
- package/utils/snap/snap.d.ts +31 -0
- package/utils/weak-maps.d.ts +2 -0
- package/utils/z-index.d.ts +5 -0
- package/core/children/children.component.d.ts +0 -17
- package/core/children/effect.d.ts +0 -2
- package/core/element/element.component.d.ts +0 -30
- package/esm2022/core/children/children.component.mjs +0 -60
- package/esm2022/core/children/effect.mjs +0 -2
- package/esm2022/core/element/element.component.mjs +0 -105
- package/esm2022/utils/moving-snap.mjs +0 -372
- package/utils/moving-snap.d.ts +0 -41
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { createG } from '../dom/common';
|
|
2
|
+
import { RectangleClient } from '../../interfaces';
|
|
3
|
+
import { drawPointSnapLines, drawSolidLines, getMinPointDelta, getSnapRectangles, getTripleAxis, SNAP_TOLERANCE } from './snap';
|
|
4
|
+
export function getSnapMovingRef(board, activeRectangle, activeElements) {
|
|
5
|
+
const snapRectangles = getSnapRectangles(board, activeElements);
|
|
6
|
+
const snapG = createG();
|
|
7
|
+
let snapDelta = getPointLineDelta(activeRectangle, snapRectangles);
|
|
8
|
+
const pointLinesG = drawMovingPointSnapLines(board, snapDelta, activeRectangle, snapRectangles);
|
|
9
|
+
snapG.append(pointLinesG);
|
|
10
|
+
const result = getGapSnapLinesAndDelta(board, snapDelta, activeRectangle, snapRectangles);
|
|
11
|
+
snapDelta = result.snapDelta;
|
|
12
|
+
snapG.append(result.snapG);
|
|
13
|
+
return { ...snapDelta, snapG };
|
|
14
|
+
}
|
|
15
|
+
function getPointLineDeltas(activeRectangle, snapRectangles, isHorizontal) {
|
|
16
|
+
const axis = getTripleAxis(activeRectangle, isHorizontal);
|
|
17
|
+
const deltaStart = getMinPointDelta(snapRectangles, axis[0], isHorizontal);
|
|
18
|
+
const deltaMiddle = getMinPointDelta(snapRectangles, axis[1], isHorizontal);
|
|
19
|
+
const deltaEnd = getMinPointDelta(snapRectangles, axis[2], isHorizontal);
|
|
20
|
+
return [deltaStart, deltaMiddle, deltaEnd];
|
|
21
|
+
}
|
|
22
|
+
function getPointLineDelta(activeRectangle, snapRectangles) {
|
|
23
|
+
let snapDelta = {
|
|
24
|
+
deltaX: 0,
|
|
25
|
+
deltaY: 0
|
|
26
|
+
};
|
|
27
|
+
function getDelta(isHorizontal) {
|
|
28
|
+
let delta = 0;
|
|
29
|
+
const deltas = getPointLineDeltas(activeRectangle, snapRectangles, isHorizontal);
|
|
30
|
+
for (let i = 0; i < deltas.length; i++) {
|
|
31
|
+
if (Math.abs(deltas[i]) < SNAP_TOLERANCE) {
|
|
32
|
+
delta = deltas[i];
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return delta;
|
|
37
|
+
}
|
|
38
|
+
snapDelta.deltaX = getDelta(true);
|
|
39
|
+
snapDelta.deltaY = getDelta(false);
|
|
40
|
+
return snapDelta;
|
|
41
|
+
}
|
|
42
|
+
function updateActiveRectangle(snapDelta, activeRectangle) {
|
|
43
|
+
const { deltaX, deltaY } = snapDelta;
|
|
44
|
+
const { x, y, width, height } = activeRectangle;
|
|
45
|
+
return {
|
|
46
|
+
x: x + deltaX,
|
|
47
|
+
y: y + deltaY,
|
|
48
|
+
width,
|
|
49
|
+
height
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function drawMovingPointSnapLines(board, snapDelta, activeRectangle, snapRectangles) {
|
|
53
|
+
const newActiveRectangle = updateActiveRectangle(snapDelta, activeRectangle);
|
|
54
|
+
return drawPointSnapLines(board, newActiveRectangle, snapRectangles, true, true, true);
|
|
55
|
+
}
|
|
56
|
+
function getGapSnapLinesAndDelta(board, snapDelta, activeRectangle, snapRectangles) {
|
|
57
|
+
let deltaX = snapDelta.deltaX;
|
|
58
|
+
let deltaY = snapDelta.deltaY;
|
|
59
|
+
const gapHorizontalResult = getGapLinesAndDelta(activeRectangle, snapRectangles, true);
|
|
60
|
+
const gapVerticalResult = getGapLinesAndDelta(activeRectangle, snapRectangles, false);
|
|
61
|
+
const gapSnapLines = [...gapHorizontalResult.lines, ...gapVerticalResult.lines];
|
|
62
|
+
if (gapHorizontalResult.delta) {
|
|
63
|
+
deltaX = gapHorizontalResult.delta;
|
|
64
|
+
}
|
|
65
|
+
if (gapVerticalResult.delta) {
|
|
66
|
+
deltaY = gapVerticalResult.delta;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
snapDelta: { deltaX, deltaY },
|
|
70
|
+
snapG: drawSolidLines(board, gapSnapLines)
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function getGapLinesAndDelta(activeRectangle, snapRectangles, isHorizontal) {
|
|
74
|
+
let lines = [];
|
|
75
|
+
let delta = 0;
|
|
76
|
+
let rectangles = [];
|
|
77
|
+
const axis = isHorizontal ? 'x' : 'y';
|
|
78
|
+
const side = isHorizontal ? 'width' : 'height';
|
|
79
|
+
const activeRectangleCenter = activeRectangle[axis] + activeRectangle[side] / 2;
|
|
80
|
+
snapRectangles.forEach(rec => {
|
|
81
|
+
const isCross = isHorizontal ? isHorizontalCross(rec, activeRectangle) : isVerticalCross(rec, activeRectangle);
|
|
82
|
+
if (isCross && !RectangleClient.isHit(rec, activeRectangle)) {
|
|
83
|
+
rectangles.push(rec);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
rectangles = [...rectangles, activeRectangle].sort((a, b) => a[axis] - b[axis]);
|
|
87
|
+
const refArray = [];
|
|
88
|
+
let gapDistance = 0;
|
|
89
|
+
let beforeIndex = undefined;
|
|
90
|
+
let afterIndex = undefined;
|
|
91
|
+
for (let i = 0; i < rectangles.length; i++) {
|
|
92
|
+
for (let j = i + 1; j < rectangles.length; j++) {
|
|
93
|
+
const before = rectangles[i];
|
|
94
|
+
const after = rectangles[j];
|
|
95
|
+
const distance = after[axis] - (before[axis] + before[side]);
|
|
96
|
+
let dif = Infinity;
|
|
97
|
+
if (refArray[i]?.after) {
|
|
98
|
+
refArray[i].after.push({ distance, index: j });
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
refArray[i] = { ...refArray[i], after: [{ distance, index: j }] };
|
|
102
|
+
}
|
|
103
|
+
if (refArray[j]?.before) {
|
|
104
|
+
refArray[j].before.push({ distance, index: i });
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
refArray[j] = { ...refArray[j], before: [{ distance, index: i }] };
|
|
108
|
+
}
|
|
109
|
+
//middle
|
|
110
|
+
let _center = (before[axis] + before[side] + after[axis]) / 2;
|
|
111
|
+
dif = Math.abs(_center - activeRectangleCenter);
|
|
112
|
+
if (dif < SNAP_TOLERANCE) {
|
|
113
|
+
gapDistance = (after[axis] - (before[axis] + before[side]) - activeRectangle[side]) / 2;
|
|
114
|
+
delta = _center - activeRectangleCenter;
|
|
115
|
+
beforeIndex = i;
|
|
116
|
+
afterIndex = j;
|
|
117
|
+
}
|
|
118
|
+
//after
|
|
119
|
+
const distanceRight = after[axis] - (before[axis] + before[side]);
|
|
120
|
+
_center = after[axis] + after[side] + distanceRight + activeRectangle[side] / 2;
|
|
121
|
+
dif = Math.abs(_center - activeRectangleCenter);
|
|
122
|
+
if (!gapDistance && dif < SNAP_TOLERANCE) {
|
|
123
|
+
gapDistance = distanceRight;
|
|
124
|
+
beforeIndex = j;
|
|
125
|
+
delta = _center - activeRectangleCenter;
|
|
126
|
+
}
|
|
127
|
+
//before
|
|
128
|
+
const distanceBefore = after[axis] - (before[axis] + before[side]);
|
|
129
|
+
_center = before[axis] - distanceBefore - activeRectangle[side] / 2;
|
|
130
|
+
dif = Math.abs(_center - activeRectangleCenter);
|
|
131
|
+
if (!gapDistance && dif < SNAP_TOLERANCE) {
|
|
132
|
+
gapDistance = distanceBefore;
|
|
133
|
+
afterIndex = i;
|
|
134
|
+
delta = _center - activeRectangleCenter;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const activeIndex = rectangles.indexOf(activeRectangle);
|
|
139
|
+
let beforeIndexes = [];
|
|
140
|
+
let afterIndexes = [];
|
|
141
|
+
if (beforeIndex !== undefined) {
|
|
142
|
+
beforeIndexes.push(beforeIndex);
|
|
143
|
+
findRectangle(gapDistance, refArray[beforeIndex], 'before', beforeIndexes);
|
|
144
|
+
}
|
|
145
|
+
if (afterIndex !== undefined) {
|
|
146
|
+
afterIndexes.push(afterIndex);
|
|
147
|
+
findRectangle(gapDistance, refArray[afterIndex], 'after', afterIndexes);
|
|
148
|
+
}
|
|
149
|
+
if (beforeIndexes.length || afterIndexes.length) {
|
|
150
|
+
const indexArr = [...beforeIndexes.reverse(), activeIndex, ...afterIndexes];
|
|
151
|
+
activeRectangle[axis] += delta;
|
|
152
|
+
for (let i = 1; i < indexArr.length; i++) {
|
|
153
|
+
lines.push(getLinePoints(rectangles[indexArr[i - 1]], rectangles[indexArr[i]]));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function findRectangle(distance, ref, direction, rectangleIndexes) {
|
|
157
|
+
const arr = ref[direction];
|
|
158
|
+
const index = refArray.indexOf(ref);
|
|
159
|
+
if ((index === 0 && direction === 'before') || (index === refArray.length - 1 && direction === 'after'))
|
|
160
|
+
return;
|
|
161
|
+
for (let i = 0; i < arr.length; i++) {
|
|
162
|
+
if (Math.abs(arr[i].distance - distance) < 0.1) {
|
|
163
|
+
rectangleIndexes.push(arr[i].index);
|
|
164
|
+
findRectangle(distance, refArray[arr[i].index], direction, rectangleIndexes);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function getLinePoints(beforeRectangle, afterRectangle) {
|
|
170
|
+
const oppositeAxis = axis === 'x' ? 'y' : 'x';
|
|
171
|
+
const oppositeSide = side === 'width' ? 'height' : 'width';
|
|
172
|
+
const snap = [
|
|
173
|
+
beforeRectangle[oppositeAxis],
|
|
174
|
+
beforeRectangle[oppositeAxis] + beforeRectangle[oppositeSide],
|
|
175
|
+
afterRectangle[oppositeAxis],
|
|
176
|
+
afterRectangle[oppositeAxis] + afterRectangle[oppositeSide]
|
|
177
|
+
];
|
|
178
|
+
const sortArr = snap.sort((a, b) => a - b);
|
|
179
|
+
const average = (sortArr[1] + sortArr[2]) / 2;
|
|
180
|
+
const offset = 3;
|
|
181
|
+
return isHorizontal
|
|
182
|
+
? [
|
|
183
|
+
[beforeRectangle.x + beforeRectangle.width + offset, average],
|
|
184
|
+
[afterRectangle.x - offset, average]
|
|
185
|
+
]
|
|
186
|
+
: [
|
|
187
|
+
[average, beforeRectangle.y + beforeRectangle.height + offset],
|
|
188
|
+
[average, afterRectangle.y - offset]
|
|
189
|
+
];
|
|
190
|
+
}
|
|
191
|
+
return { delta, lines };
|
|
192
|
+
}
|
|
193
|
+
function isHorizontalCross(rectangle, other) {
|
|
194
|
+
return !(rectangle.y + rectangle.height < other.y || rectangle.y > other.y + other.height);
|
|
195
|
+
}
|
|
196
|
+
function isVerticalCross(rectangle, other) {
|
|
197
|
+
return !(rectangle.x + rectangle.width < other.x || rectangle.x > other.x + other.width);
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC1tb3ZpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy9zbmFwL3NuYXAtbW92aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEMsT0FBTyxFQUFTLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsY0FBYyxFQUVkLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGNBQWMsRUFHakIsTUFBTSxRQUFRLENBQUM7QUFFaEIsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWlCLEVBQUUsZUFBZ0MsRUFBRSxjQUE4QjtJQUNoSCxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDaEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDeEIsSUFBSSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2hHLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDMUYsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDN0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsT0FBTyxFQUFFLEdBQUcsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFTLGtCQUFrQixD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QyxTQUEwQixFQUFFLEtBQXNCO0lBQ3pFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0YsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLFNBQTBCLEVBQUUsS0FBc0I7SUFDdkUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYm9hcmQnO1xuaW1wb3J0IHsgY3JlYXRlRyB9IGZyb20gJy4uL2RvbS9jb21tb24nO1xuaW1wb3J0IHsgUGxhaXRFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lbGVtZW50JztcbmltcG9ydCB7IFBvaW50LCBSZWN0YW5nbGVDbGllbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gICAgZHJhd1BvaW50U25hcExpbmVzLFxuICAgIGRyYXdTb2xpZExpbmVzLFxuICAgIEdhcFNuYXBSZWYsXG4gICAgZ2V0TWluUG9pbnREZWx0YSxcbiAgICBnZXRTbmFwUmVjdGFuZ2xlcyxcbiAgICBnZXRUcmlwbGVBeGlzLFxuICAgIFNOQVBfVE9MRVJBTkNFLFxuICAgIFNuYXBEZWx0YSxcbiAgICBTbmFwUmVmXG59IGZyb20gJy4vc25hcCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTbmFwTW92aW5nUmVmKGJvYXJkOiBQbGFpdEJvYXJkLCBhY3RpdmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgYWN0aXZlRWxlbWVudHM6IFBsYWl0RWxlbWVudFtdKTogU25hcFJlZiB7XG4gICAgY29uc3Qgc25hcFJlY3RhbmdsZXMgPSBnZXRTbmFwUmVjdGFuZ2xlcyhib2FyZCwgYWN0aXZlRWxlbWVudHMpO1xuICAgIGNvbnN0IHNuYXBHID0gY3JlYXRlRygpO1xuICAgIGxldCBzbmFwRGVsdGEgPSBnZXRQb2ludExpbmVEZWx0YShhY3RpdmVSZWN0YW5nbGUsIHNuYXBSZWN0YW5nbGVzKTtcbiAgICBjb25zdCBwb2ludExpbmVzRyA9IGRyYXdNb3ZpbmdQb2ludFNuYXBMaW5lcyhib2FyZCwgc25hcERlbHRhLCBhY3RpdmVSZWN0YW5nbGUsIHNuYXBSZWN0YW5nbGVzKTtcbiAgICBzbmFwRy5hcHBlbmQocG9pbnRMaW5lc0cpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdldEdhcFNuYXBMaW5lc0FuZERlbHRhKGJvYXJkLCBzbmFwRGVsdGEsIGFjdGl2ZVJlY3RhbmdsZSwgc25hcFJlY3RhbmdsZXMpO1xuICAgIHNuYXBEZWx0YSA9IHJlc3VsdC5zbmFwRGVsdGE7XG4gICAgc25hcEcuYXBwZW5kKHJlc3VsdC5zbmFwRyk7XG4gICAgcmV0dXJuIHsgLi4uc25hcERlbHRhLCBzbmFwRyB9O1xufVxuXG5mdW5jdGlvbiBnZXRQb2ludExpbmVEZWx0YXMoYWN0aXZlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHNuYXBSZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSwgaXNIb3Jpem9udGFsOiBib29sZWFuKSB7XG4gICAgY29uc3QgYXhpcyA9IGdldFRyaXBsZUF4aXMoYWN0aXZlUmVjdGFuZ2xlLCBpc0hvcml6b250YWwpO1xuICAgIGNvbnN0IGRlbHRhU3RhcnQgPSBnZXRNaW5Qb2ludERlbHRhKHNuYXBSZWN0YW5nbGVzLCBheGlzWzBdLCBpc0hvcml6b250YWwpO1xuICAgIGNvbnN0IGRlbHRhTWlkZGxlID0gZ2V0TWluUG9pbnREZWx0YShzbmFwUmVjdGFuZ2xlcywgYXhpc1sxXSwgaXNIb3Jpem9udGFsKTtcbiAgICBjb25zdCBkZWx0YUVuZCA9IGdldE1pblBvaW50RGVsdGEoc25hcFJlY3RhbmdsZXMsIGF4aXNbMl0sIGlzSG9yaXpvbnRhbCk7XG4gICAgcmV0dXJuIFtkZWx0YVN0YXJ0LCBkZWx0YU1pZGRsZSwgZGVsdGFFbmRdO1xufVxuXG5mdW5jdGlvbiBnZXRQb2ludExpbmVEZWx0YShhY3RpdmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgc25hcFJlY3RhbmdsZXM6IFJlY3RhbmdsZUNsaWVudFtdKSB7XG4gICAgbGV0IHNuYXBEZWx0YTogU25hcERlbHRhID0ge1xuICAgICAgICBkZWx0YVg6IDAsXG4gICAgICAgIGRlbHRhWTogMFxuICAgIH07XG4gICAgZnVuY3Rpb24gZ2V0RGVsdGEoaXNIb3Jpem9udGFsOiBib29sZWFuKSB7XG4gICAgICAgIGxldCBkZWx0YSA9IDA7XG4gICAgICAgIGNvbnN0IGRlbHRhcyA9IGdldFBvaW50TGluZURlbHRhcyhhY3RpdmVSZWN0YW5nbGUsIHNuYXBSZWN0YW5nbGVzLCBpc0hvcml6b250YWwpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRlbHRhc1tpXSkgPCBTTkFQX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgICAgIGRlbHRhID0gZGVsdGFzW2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWx0YTtcbiAgICB9XG4gICAgc25hcERlbHRhLmRlbHRhWCA9IGdldERlbHRhKHRydWUpO1xuICAgIHNuYXBEZWx0YS5kZWx0YVkgPSBnZXREZWx0YShmYWxzZSk7XG4gICAgcmV0dXJuIHNuYXBEZWx0YTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQWN0aXZlUmVjdGFuZ2xlKHNuYXBEZWx0YTogU25hcERlbHRhLCBhY3RpdmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVkgfSA9IHNuYXBEZWx0YTtcbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGFjdGl2ZVJlY3RhbmdsZTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4ICsgZGVsdGFYLFxuICAgICAgICB5OiB5ICsgZGVsdGFZLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZHJhd01vdmluZ1BvaW50U25hcExpbmVzKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIHNuYXBEZWx0YTogU25hcERlbHRhLFxuICAgIGFjdGl2ZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LFxuICAgIHNuYXBSZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXVxuKSB7XG4gICAgY29uc3QgbmV3QWN0aXZlUmVjdGFuZ2xlID0gdXBkYXRlQWN0aXZlUmVjdGFuZ2xlKHNuYXBEZWx0YSwgYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICByZXR1cm4gZHJhd1BvaW50U25hcExpbmVzKGJvYXJkLCBuZXdBY3RpdmVSZWN0YW5nbGUsIHNuYXBSZWN0YW5nbGVzLCB0cnVlLCB0cnVlLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2FwU25hcExpbmVzQW5kRGVsdGEoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgc25hcERlbHRhOiBTbmFwRGVsdGEsXG4gICAgYWN0aXZlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsXG4gICAgc25hcFJlY3RhbmdsZXM6IFJlY3RhbmdsZUNsaWVudFtdXG4pIHtcbiAgICBsZXQgZGVsdGFYID0gc25hcERlbHRhLmRlbHRhWDtcbiAgICBsZXQgZGVsdGFZID0gc25hcERlbHRhLmRlbHRhWTtcbiAgICBjb25zdCBnYXBIb3Jpem9udGFsUmVzdWx0ID0gZ2V0R2FwTGluZXNBbmREZWx0YShhY3RpdmVSZWN0YW5nbGUsIHNuYXBSZWN0YW5nbGVzLCB0cnVlKTtcbiAgICBjb25zdCBnYXBWZXJ0aWNhbFJlc3VsdCA9IGdldEdhcExpbmVzQW5kRGVsdGEoYWN0aXZlUmVjdGFuZ2xlLCBzbmFwUmVjdGFuZ2xlcywgZmFsc2UpO1xuICAgIGNvbnN0IGdhcFNuYXBMaW5lczogUG9pbnRbXVtdID0gWy4uLmdhcEhvcml6b250YWxSZXN1bHQubGluZXMsIC4uLmdhcFZlcnRpY2FsUmVzdWx0LmxpbmVzXTtcbiAgICBpZiAoZ2FwSG9yaXpvbnRhbFJlc3VsdC5kZWx0YSkge1xuICAgICAgICBkZWx0YVggPSBnYXBIb3Jpem9udGFsUmVzdWx0LmRlbHRhO1xuICAgIH1cbiAgICBpZiAoZ2FwVmVydGljYWxSZXN1bHQuZGVsdGEpIHtcbiAgICAgICAgZGVsdGFZID0gZ2FwVmVydGljYWxSZXN1bHQuZGVsdGE7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHNuYXBEZWx0YTogeyBkZWx0YVgsIGRlbHRhWSB9LFxuICAgICAgICBzbmFwRzogZHJhd1NvbGlkTGluZXMoYm9hcmQsIGdhcFNuYXBMaW5lcylcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRHYXBMaW5lc0FuZERlbHRhKGFjdGl2ZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBzbmFwUmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W10sIGlzSG9yaXpvbnRhbDogYm9vbGVhbikge1xuICAgIGxldCBsaW5lczogYW55W10gPSBbXTtcbiAgICBsZXQgZGVsdGEgPSAwO1xuICAgIGxldCByZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSA9IFtdO1xuICAgIGNvbnN0IGF4aXMgPSBpc0hvcml6b250YWwgPyAneCcgOiAneSc7XG4gICAgY29uc3Qgc2lkZSA9IGlzSG9yaXpvbnRhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZUNlbnRlciA9IGFjdGl2ZVJlY3RhbmdsZVtheGlzXSArIGFjdGl2ZVJlY3RhbmdsZVtzaWRlXSAvIDI7XG4gICAgc25hcFJlY3RhbmdsZXMuZm9yRWFjaChyZWMgPT4ge1xuICAgICAgICBjb25zdCBpc0Nyb3NzID0gaXNIb3Jpem9udGFsID8gaXNIb3Jpem9udGFsQ3Jvc3MocmVjLCBhY3RpdmVSZWN0YW5nbGUpIDogaXNWZXJ0aWNhbENyb3NzKHJlYywgYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgaWYgKGlzQ3Jvc3MgJiYgIVJlY3RhbmdsZUNsaWVudC5pc0hpdChyZWMsIGFjdGl2ZVJlY3RhbmdsZSkpIHtcbiAgICAgICAgICAgIHJlY3RhbmdsZXMucHVzaChyZWMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmVjdGFuZ2xlcyA9IFsuLi5yZWN0YW5nbGVzLCBhY3RpdmVSZWN0YW5nbGVdLnNvcnQoKGEsIGIpID0+IGFbYXhpc10gLSBiW2F4aXNdKTtcblxuICAgIGNvbnN0IHJlZkFycmF5OiBHYXBTbmFwUmVmW10gPSBbXTtcbiAgICBsZXQgZ2FwRGlzdGFuY2UgPSAwO1xuICAgIGxldCBiZWZvcmVJbmRleCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgYWZ0ZXJJbmRleCA9IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdGFuZ2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCByZWN0YW5nbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSByZWN0YW5nbGVzW2ldO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSByZWN0YW5nbGVzW2pdO1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhZnRlcltheGlzXSAtIChiZWZvcmVbYXhpc10gKyBiZWZvcmVbc2lkZV0pO1xuICAgICAgICAgICAgbGV0IGRpZiA9IEluZmluaXR5O1xuICAgICAgICAgICAgaWYgKHJlZkFycmF5W2ldPy5hZnRlcikge1xuICAgICAgICAgICAgICAgIHJlZkFycmF5W2ldLmFmdGVyLnB1c2goeyBkaXN0YW5jZSwgaW5kZXg6IGogfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZkFycmF5W2ldID0geyAuLi5yZWZBcnJheVtpXSwgYWZ0ZXI6IFt7IGRpc3RhbmNlLCBpbmRleDogaiB9XSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVmQXJyYXlbal0/LmJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHJlZkFycmF5W2pdLmJlZm9yZS5wdXNoKHsgZGlzdGFuY2UsIGluZGV4OiBpIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWZBcnJheVtqXSA9IHsgLi4ucmVmQXJyYXlbal0sIGJlZm9yZTogW3sgZGlzdGFuY2UsIGluZGV4OiBpIH1dIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbWlkZGxlXG4gICAgICAgICAgICBsZXQgX2NlbnRlciA9IChiZWZvcmVbYXhpc10gKyBiZWZvcmVbc2lkZV0gKyBhZnRlcltheGlzXSkgLyAyO1xuICAgICAgICAgICAgZGlmID0gTWF0aC5hYnMoX2NlbnRlciAtIGFjdGl2ZVJlY3RhbmdsZUNlbnRlcik7XG4gICAgICAgICAgICBpZiAoZGlmIDwgU05BUF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICBnYXBEaXN0YW5jZSA9IChhZnRlcltheGlzXSAtIChiZWZvcmVbYXhpc10gKyBiZWZvcmVbc2lkZV0pIC0gYWN0aXZlUmVjdGFuZ2xlW3NpZGVdKSAvIDI7XG4gICAgICAgICAgICAgICAgZGVsdGEgPSBfY2VudGVyIC0gYWN0aXZlUmVjdGFuZ2xlQ2VudGVyO1xuICAgICAgICAgICAgICAgIGJlZm9yZUluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBhZnRlckluZGV4ID0gajtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9hZnRlclxuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VSaWdodCA9IGFmdGVyW2F4aXNdIC0gKGJlZm9yZVtheGlzXSArIGJlZm9yZVtzaWRlXSk7XG4gICAgICAgICAgICBfY2VudGVyID0gYWZ0ZXJbYXhpc10gKyBhZnRlcltzaWRlXSArIGRpc3RhbmNlUmlnaHQgKyBhY3RpdmVSZWN0YW5nbGVbc2lkZV0gLyAyO1xuICAgICAgICAgICAgZGlmID0gTWF0aC5hYnMoX2NlbnRlciAtIGFjdGl2ZVJlY3RhbmdsZUNlbnRlcik7XG4gICAgICAgICAgICBpZiAoIWdhcERpc3RhbmNlICYmIGRpZiA8IFNOQVBfVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICAgICAgZ2FwRGlzdGFuY2UgPSBkaXN0YW5jZVJpZ2h0O1xuICAgICAgICAgICAgICAgIGJlZm9yZUluZGV4ID0gajtcbiAgICAgICAgICAgICAgICBkZWx0YSA9IF9jZW50ZXIgLSBhY3RpdmVSZWN0YW5nbGVDZW50ZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vYmVmb3JlXG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZUJlZm9yZSA9IGFmdGVyW2F4aXNdIC0gKGJlZm9yZVtheGlzXSArIGJlZm9yZVtzaWRlXSk7XG4gICAgICAgICAgICBfY2VudGVyID0gYmVmb3JlW2F4aXNdIC0gZGlzdGFuY2VCZWZvcmUgLSBhY3RpdmVSZWN0YW5nbGVbc2lkZV0gLyAyO1xuICAgICAgICAgICAgZGlmID0gTWF0aC5hYnMoX2NlbnRlciAtIGFjdGl2ZVJlY3RhbmdsZUNlbnRlcik7XG5cbiAgICAgICAgICAgIGlmICghZ2FwRGlzdGFuY2UgJiYgZGlmIDwgU05BUF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICBnYXBEaXN0YW5jZSA9IGRpc3RhbmNlQmVmb3JlO1xuICAgICAgICAgICAgICAgIGFmdGVySW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGRlbHRhID0gX2NlbnRlciAtIGFjdGl2ZVJlY3RhbmdsZUNlbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gcmVjdGFuZ2xlcy5pbmRleE9mKGFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgbGV0IGJlZm9yZUluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgbGV0IGFmdGVySW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBpZiAoYmVmb3JlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBiZWZvcmVJbmRleGVzLnB1c2goYmVmb3JlSW5kZXgpO1xuICAgICAgICBmaW5kUmVjdGFuZ2xlKGdhcERpc3RhbmNlLCByZWZBcnJheVtiZWZvcmVJbmRleF0sICdiZWZvcmUnLCBiZWZvcmVJbmRleGVzKTtcbiAgICB9XG5cbiAgICBpZiAoYWZ0ZXJJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFmdGVySW5kZXhlcy5wdXNoKGFmdGVySW5kZXgpO1xuICAgICAgICBmaW5kUmVjdGFuZ2xlKGdhcERpc3RhbmNlLCByZWZBcnJheVthZnRlckluZGV4XSwgJ2FmdGVyJywgYWZ0ZXJJbmRleGVzKTtcbiAgICB9XG5cbiAgICBpZiAoYmVmb3JlSW5kZXhlcy5sZW5ndGggfHwgYWZ0ZXJJbmRleGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBpbmRleEFyciA9IFsuLi5iZWZvcmVJbmRleGVzLnJldmVyc2UoKSwgYWN0aXZlSW5kZXgsIC4uLmFmdGVySW5kZXhlc107XG4gICAgICAgIGFjdGl2ZVJlY3RhbmdsZVtheGlzXSArPSBkZWx0YTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbmRleEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGluZXMucHVzaChnZXRMaW5lUG9pbnRzKHJlY3RhbmdsZXNbaW5kZXhBcnJbaSAtIDFdXSwgcmVjdGFuZ2xlc1tpbmRleEFycltpXV0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbmRSZWN0YW5nbGUoZGlzdGFuY2U6IG51bWJlciwgcmVmOiBHYXBTbmFwUmVmLCBkaXJlY3Rpb246IHN0cmluZywgcmVjdGFuZ2xlSW5kZXhlczogbnVtYmVyW10pIHtcbiAgICAgICAgY29uc3QgYXJyID0gcmVmW2RpcmVjdGlvbiBhcyBrZXlvZiBHYXBTbmFwUmVmXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSByZWZBcnJheS5pbmRleE9mKHJlZik7XG4gICAgICAgIGlmICgoaW5kZXggPT09IDAgJiYgZGlyZWN0aW9uID09PSAnYmVmb3JlJykgfHwgKGluZGV4ID09PSByZWZBcnJheS5sZW5ndGggLSAxICYmIGRpcmVjdGlvbiA9PT0gJ2FmdGVyJykpIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhhcnJbaV0uZGlzdGFuY2UgLSBkaXN0YW5jZSkgPCAwLjEpIHtcbiAgICAgICAgICAgICAgICByZWN0YW5nbGVJbmRleGVzLnB1c2goYXJyW2ldLmluZGV4KTtcbiAgICAgICAgICAgICAgICBmaW5kUmVjdGFuZ2xlKGRpc3RhbmNlLCByZWZBcnJheVthcnJbaV0uaW5kZXhdLCBkaXJlY3Rpb24sIHJlY3RhbmdsZUluZGV4ZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldExpbmVQb2ludHMoYmVmb3JlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIGFmdGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVBeGlzID0gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuICAgICAgICBjb25zdCBvcHBvc2l0ZVNpZGUgPSBzaWRlID09PSAnd2lkdGgnID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgICAgICBjb25zdCBzbmFwID0gW1xuICAgICAgICAgICAgYmVmb3JlUmVjdGFuZ2xlW29wcG9zaXRlQXhpc10sXG4gICAgICAgICAgICBiZWZvcmVSZWN0YW5nbGVbb3Bwb3NpdGVBeGlzXSArIGJlZm9yZVJlY3RhbmdsZVtvcHBvc2l0ZVNpZGVdLFxuICAgICAgICAgICAgYWZ0ZXJSZWN0YW5nbGVbb3Bwb3NpdGVBeGlzXSxcbiAgICAgICAgICAgIGFmdGVyUmVjdGFuZ2xlW29wcG9zaXRlQXhpc10gKyBhZnRlclJlY3RhbmdsZVtvcHBvc2l0ZVNpZGVdXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IHNvcnRBcnIgPSBzbmFwLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgY29uc3QgYXZlcmFnZSA9IChzb3J0QXJyWzFdICsgc29ydEFyclsyXSkgLyAyO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAzO1xuICAgICAgICByZXR1cm4gaXNIb3Jpem9udGFsXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgIFtiZWZvcmVSZWN0YW5nbGUueCArIGJlZm9yZVJlY3RhbmdsZS53aWR0aCArIG9mZnNldCwgYXZlcmFnZV0sXG4gICAgICAgICAgICAgICAgICBbYWZ0ZXJSZWN0YW5nbGUueCAtIG9mZnNldCwgYXZlcmFnZV1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICBbYXZlcmFnZSwgYmVmb3JlUmVjdGFuZ2xlLnkgKyBiZWZvcmVSZWN0YW5nbGUuaGVpZ2h0ICsgb2Zmc2V0XSxcbiAgICAgICAgICAgICAgICAgIFthdmVyYWdlLCBhZnRlclJlY3RhbmdsZS55IC0gb2Zmc2V0XVxuICAgICAgICAgICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4geyBkZWx0YSwgbGluZXMgfTtcbn1cblxuZnVuY3Rpb24gaXNIb3Jpem9udGFsQ3Jvc3MocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG90aGVyOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICByZXR1cm4gIShyZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgPCBvdGhlci55IHx8IHJlY3RhbmdsZS55ID4gb3RoZXIueSArIG90aGVyLmhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIGlzVmVydGljYWxDcm9zcyhyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgb3RoZXI6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgIHJldHVybiAhKHJlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIDwgb3RoZXIueCB8fCByZWN0YW5nbGUueCA+IG90aGVyLnggKyBvdGhlci53aWR0aCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { PlaitBoard, RectangleClient, SELECTION_BORDER_COLOR } from '../../interfaces';
|
|
2
|
+
import { getRectangleByAngle } from '../angle';
|
|
3
|
+
import { createG } from '../dom';
|
|
4
|
+
import { findElements } from '../element';
|
|
5
|
+
export const SNAP_TOLERANCE = 2;
|
|
6
|
+
const SNAP_SPACING = 24;
|
|
7
|
+
export function getSnapRectangles(board, activeElements) {
|
|
8
|
+
const elements = findElements(board, {
|
|
9
|
+
match: element => board.isAlign(element) && !activeElements.some(item => item.id === element.id),
|
|
10
|
+
recursion: () => true,
|
|
11
|
+
isReverse: false
|
|
12
|
+
});
|
|
13
|
+
return elements.map(item => getRectangleByAngle(board.getRectangle(item), item.angle) || board.getRectangle(item));
|
|
14
|
+
}
|
|
15
|
+
export function getBarPoint(point, isHorizontal) {
|
|
16
|
+
return isHorizontal
|
|
17
|
+
? [
|
|
18
|
+
[point[0], point[1] - 4],
|
|
19
|
+
[point[0], point[1] + 4]
|
|
20
|
+
]
|
|
21
|
+
: [
|
|
22
|
+
[point[0] - 4, point[1]],
|
|
23
|
+
[point[0] + 4, point[1]]
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
export function getMinPointDelta(pointRectangles, axis, isHorizontal) {
|
|
27
|
+
let delta = SNAP_TOLERANCE;
|
|
28
|
+
pointRectangles.forEach(item => {
|
|
29
|
+
const distance = getNearestDelta(axis, item, isHorizontal);
|
|
30
|
+
if (Math.abs(distance) < Math.abs(delta)) {
|
|
31
|
+
delta = distance;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return delta;
|
|
35
|
+
}
|
|
36
|
+
export const getNearestDelta = (axis, rectangle, isHorizontal) => {
|
|
37
|
+
const pointAxis = getTripleAxis(rectangle, isHorizontal);
|
|
38
|
+
const deltas = pointAxis.map(item => item - axis);
|
|
39
|
+
const absDeltas = deltas.map(item => Math.abs(item));
|
|
40
|
+
const index = absDeltas.indexOf(Math.min(...absDeltas));
|
|
41
|
+
return deltas[index];
|
|
42
|
+
};
|
|
43
|
+
export const getTripleAxis = (rectangle, isHorizontal) => {
|
|
44
|
+
const axis = isHorizontal ? 'x' : 'y';
|
|
45
|
+
const side = isHorizontal ? 'width' : 'height';
|
|
46
|
+
return [rectangle[axis], rectangle[axis] + rectangle[side] / 2, rectangle[axis] + rectangle[side]];
|
|
47
|
+
};
|
|
48
|
+
export function getNearestPointRectangle(snapRectangles, activeRectangle) {
|
|
49
|
+
let minDistance = Infinity;
|
|
50
|
+
let nearestRectangle = snapRectangles[0];
|
|
51
|
+
snapRectangles.forEach(item => {
|
|
52
|
+
const distance = Math.sqrt(Math.pow(activeRectangle.x - item.x, 2) + Math.pow(activeRectangle.y - item.y, 2));
|
|
53
|
+
if (distance < minDistance) {
|
|
54
|
+
minDistance = distance;
|
|
55
|
+
nearestRectangle = item;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return nearestRectangle;
|
|
59
|
+
}
|
|
60
|
+
export const isSnapPoint = (axis, rectangle, isHorizontal) => {
|
|
61
|
+
const pointAxis = getTripleAxis(rectangle, isHorizontal);
|
|
62
|
+
return pointAxis.includes(axis);
|
|
63
|
+
};
|
|
64
|
+
export function drawPointSnapLines(board, activeRectangle, snapRectangles, drawHorizontal = true, drawVertical = true, snapMiddle = false) {
|
|
65
|
+
let pointLinePoints = [];
|
|
66
|
+
const pointAxisX = getTripleAxis(activeRectangle, true);
|
|
67
|
+
const pointAxisY = getTripleAxis(activeRectangle, false);
|
|
68
|
+
const pointLineRefs = [
|
|
69
|
+
{
|
|
70
|
+
axis: pointAxisX[0],
|
|
71
|
+
isHorizontal: true,
|
|
72
|
+
pointRectangles: []
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
axis: pointAxisX[1],
|
|
76
|
+
isHorizontal: true,
|
|
77
|
+
pointRectangles: []
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
axis: pointAxisX[2],
|
|
81
|
+
isHorizontal: true,
|
|
82
|
+
pointRectangles: []
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
axis: pointAxisY[0],
|
|
86
|
+
isHorizontal: false,
|
|
87
|
+
pointRectangles: []
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
axis: pointAxisY[1],
|
|
91
|
+
isHorizontal: false,
|
|
92
|
+
pointRectangles: []
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
axis: pointAxisY[2],
|
|
96
|
+
isHorizontal: false,
|
|
97
|
+
pointRectangles: []
|
|
98
|
+
}
|
|
99
|
+
];
|
|
100
|
+
for (let index = 0; index < snapRectangles.length; index++) {
|
|
101
|
+
const element = snapRectangles[index];
|
|
102
|
+
if (isSnapPoint(pointLineRefs[0].axis, element, pointLineRefs[0].isHorizontal)) {
|
|
103
|
+
pointLineRefs[0].pointRectangles.push(element);
|
|
104
|
+
}
|
|
105
|
+
if (isSnapPoint(pointLineRefs[1].axis, element, pointLineRefs[1].isHorizontal)) {
|
|
106
|
+
pointLineRefs[1].pointRectangles.push(element);
|
|
107
|
+
}
|
|
108
|
+
if (isSnapPoint(pointLineRefs[2].axis, element, pointLineRefs[2].isHorizontal)) {
|
|
109
|
+
pointLineRefs[2].pointRectangles.push(element);
|
|
110
|
+
}
|
|
111
|
+
if (isSnapPoint(pointLineRefs[3].axis, element, pointLineRefs[3].isHorizontal)) {
|
|
112
|
+
pointLineRefs[3].pointRectangles.push(element);
|
|
113
|
+
}
|
|
114
|
+
if (isSnapPoint(pointLineRefs[4].axis, element, pointLineRefs[4].isHorizontal)) {
|
|
115
|
+
pointLineRefs[4].pointRectangles.push(element);
|
|
116
|
+
}
|
|
117
|
+
if (isSnapPoint(pointLineRefs[5].axis, element, pointLineRefs[5].isHorizontal)) {
|
|
118
|
+
pointLineRefs[5].pointRectangles.push(element);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const setResizePointSnapLine = (axis, pointRectangle, isHorizontal) => {
|
|
122
|
+
const boundingRectangle = RectangleClient.inflate(RectangleClient.getBoundingRectangle([activeRectangle, pointRectangle]), SNAP_SPACING);
|
|
123
|
+
if (isHorizontal) {
|
|
124
|
+
const pointStart = [axis, boundingRectangle.y];
|
|
125
|
+
const pointEnd = [axis, boundingRectangle.y + boundingRectangle.height];
|
|
126
|
+
pointLinePoints.push([pointStart, pointEnd]);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const pointStart = [boundingRectangle.x, axis];
|
|
130
|
+
const pointEnd = [boundingRectangle.x + boundingRectangle.width, axis];
|
|
131
|
+
pointLinePoints.push([pointStart, pointEnd]);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
if (drawHorizontal && pointLineRefs[0].pointRectangles.length) {
|
|
135
|
+
const leftRectangle = pointLineRefs[0].pointRectangles.length === 1
|
|
136
|
+
? pointLineRefs[0].pointRectangles[0]
|
|
137
|
+
: getNearestPointRectangle(pointLineRefs[0].pointRectangles, activeRectangle);
|
|
138
|
+
setResizePointSnapLine(pointLineRefs[0].axis, leftRectangle, pointLineRefs[0].isHorizontal);
|
|
139
|
+
}
|
|
140
|
+
if (drawHorizontal && snapMiddle && pointLineRefs[1].pointRectangles.length) {
|
|
141
|
+
const middleRectangle = pointLineRefs[1].pointRectangles.length === 1
|
|
142
|
+
? pointLineRefs[1].pointRectangles[0]
|
|
143
|
+
: getNearestPointRectangle(pointLineRefs[1].pointRectangles, activeRectangle);
|
|
144
|
+
setResizePointSnapLine(pointLineRefs[1].axis, middleRectangle, pointLineRefs[1].isHorizontal);
|
|
145
|
+
}
|
|
146
|
+
if (drawHorizontal && pointLineRefs[2].pointRectangles.length) {
|
|
147
|
+
const rightRectangle = pointLineRefs[2].pointRectangles.length === 1
|
|
148
|
+
? pointLineRefs[2].pointRectangles[0]
|
|
149
|
+
: getNearestPointRectangle(pointLineRefs[2].pointRectangles, activeRectangle);
|
|
150
|
+
setResizePointSnapLine(pointLineRefs[2].axis, rightRectangle, pointLineRefs[2].isHorizontal);
|
|
151
|
+
}
|
|
152
|
+
if (drawVertical && pointLineRefs[3].pointRectangles.length) {
|
|
153
|
+
const topRectangle = pointLineRefs[3].pointRectangles.length === 1
|
|
154
|
+
? pointLineRefs[3].pointRectangles[0]
|
|
155
|
+
: getNearestPointRectangle(pointLineRefs[3].pointRectangles, activeRectangle);
|
|
156
|
+
setResizePointSnapLine(pointLineRefs[3].axis, topRectangle, pointLineRefs[3].isHorizontal);
|
|
157
|
+
}
|
|
158
|
+
if (drawVertical && snapMiddle && pointLineRefs[4].pointRectangles.length) {
|
|
159
|
+
const middleRectangle = pointLineRefs[4].pointRectangles.length === 1
|
|
160
|
+
? pointLineRefs[4].pointRectangles[0]
|
|
161
|
+
: getNearestPointRectangle(pointLineRefs[4].pointRectangles, activeRectangle);
|
|
162
|
+
setResizePointSnapLine(pointLineRefs[4].axis, middleRectangle, pointLineRefs[4].isHorizontal);
|
|
163
|
+
}
|
|
164
|
+
if (drawVertical && pointLineRefs[5].pointRectangles.length) {
|
|
165
|
+
const rightRectangle = pointLineRefs[5].pointRectangles.length === 1
|
|
166
|
+
? pointLineRefs[5].pointRectangles[0]
|
|
167
|
+
: getNearestPointRectangle(pointLineRefs[5].pointRectangles, activeRectangle);
|
|
168
|
+
setResizePointSnapLine(pointLineRefs[5].axis, rightRectangle, pointLineRefs[5].isHorizontal);
|
|
169
|
+
}
|
|
170
|
+
return drawDashedLines(board, pointLinePoints);
|
|
171
|
+
}
|
|
172
|
+
export function drawDashedLines(board, lines) {
|
|
173
|
+
const g = createG();
|
|
174
|
+
lines.forEach(points => {
|
|
175
|
+
if (!points.length)
|
|
176
|
+
return;
|
|
177
|
+
const line = PlaitBoard.getRoughSVG(board).line(points[0][0], points[0][1], points[1][0], points[1][1], {
|
|
178
|
+
stroke: SELECTION_BORDER_COLOR,
|
|
179
|
+
strokeWidth: 1,
|
|
180
|
+
strokeLineDash: [4, 4]
|
|
181
|
+
});
|
|
182
|
+
g.appendChild(line);
|
|
183
|
+
});
|
|
184
|
+
return g;
|
|
185
|
+
}
|
|
186
|
+
export function drawSolidLines(board, lines) {
|
|
187
|
+
const g = createG();
|
|
188
|
+
lines.forEach(points => {
|
|
189
|
+
if (!points.length)
|
|
190
|
+
return;
|
|
191
|
+
let isHorizontal = points[0][1] === points[1][1];
|
|
192
|
+
const line = PlaitBoard.getRoughSVG(board).line(points[0][0], points[0][1], points[1][0], points[1][1], {
|
|
193
|
+
stroke: SELECTION_BORDER_COLOR,
|
|
194
|
+
strokeWidth: 1
|
|
195
|
+
});
|
|
196
|
+
g.appendChild(line);
|
|
197
|
+
points.forEach(point => {
|
|
198
|
+
const barPoint = getBarPoint(point, isHorizontal);
|
|
199
|
+
const bar = PlaitBoard.getRoughSVG(board).line(barPoint[0][0], barPoint[0][1], barPoint[1][0], barPoint[1][1], {
|
|
200
|
+
stroke: SELECTION_BORDER_COLOR,
|
|
201
|
+
strokeWidth: 1
|
|
202
|
+
});
|
|
203
|
+
g.appendChild(bar);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
return g;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL3NuYXAvc25hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUF1QixlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBd0IxQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBaUIsRUFBRSxjQUE4QjtJQUMvRSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFO1FBQ2pDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hHLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1FBQ3JCLFNBQVMsRUFBRSxLQUFLO0tBQ25CLENBQUMsQ0FBQztJQUNILE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFFLENBQUMsQ0FBQztBQUN6SCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFZLEVBQUUsWUFBcUI7SUFDM0QsT0FBTyxZQUFZO1FBQ2YsQ0FBQyxDQUFDO1lBQ0ksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO1FBQ0gsQ0FBQyxDQUFDO1lBQ0ksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCLENBQUM7QUFDWixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLGVBQWtDLEVBQUUsSUFBWSxFQUFFLFlBQXFCO0lBQ3BHLElBQUksS0FBSyxHQUFHLGNBQWMsQ0FBQztJQUMzQixlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzNCLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBWSxFQUFFLFNBQTBCLEVBQUUsWUFBcUIsRUFBRSxFQUFFO0lBQy9GLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNsRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBMEIsRUFBRSxZQUFxQixFQUFrQixFQUFFO0lBQy9GLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMvQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2RyxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsd0JBQXdCLENBQUMsY0FBaUMsRUFBRSxlQUFnQztJQUN4RyxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUM7SUFDM0IsSUFBSSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsSUFBSSxRQUFRLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDekIsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUN2QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxnQkFBZ0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBWSxFQUFFLFNBQTBCLEVBQUUsWUFBcUIsRUFBRSxFQUFFO0lBQzNGLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekQsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxrQkFBa0IsQ0FDOUIsS0FBaUIsRUFDakIsZUFBZ0MsRUFDaEMsY0FBaUMsRUFDakMsY0FBYyxHQUFHLElBQUksRUFDckIsWUFBWSxHQUFHLElBQUksRUFDbkIsVUFBVSxHQUFHLEtBQUs7SUFFbEIsSUFBSSxlQUFlLEdBQXFCLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsTUFBTSxhQUFhLEdBQXVCO1FBQ3RDO1lBQ0ksSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsWUFBWSxFQUFFLElBQUk7WUFDbEIsZUFBZSxFQUFFLEVBQUU7U0FDdEI7UUFDRDtZQUNJLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ25CLFlBQVksRUFBRSxJQUFJO1lBQ2xCLGVBQWUsRUFBRSxFQUFFO1NBQ3RCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNuQixZQUFZLEVBQUUsSUFBSTtZQUNsQixlQUFlLEVBQUUsRUFBRTtTQUN0QjtRQUNEO1lBQ0ksSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsZUFBZSxFQUFFLEVBQUU7U0FDdEI7UUFDRDtZQUNJLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ25CLFlBQVksRUFBRSxLQUFLO1lBQ25CLGVBQWUsRUFBRSxFQUFFO1NBQ3RCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNuQixZQUFZLEVBQUUsS0FBSztZQUNuQixlQUFlLEVBQUUsRUFBRTtTQUN0QjtLQUNKLENBQUM7SUFDRixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM3RSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0UsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzdFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM3RSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0UsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzdFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQVksRUFBRSxjQUErQixFQUFFLFlBQXFCLEVBQUUsRUFBRTtRQUNwRyxNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQzdDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUN2RSxZQUFZLENBQ2YsQ0FBQztRQUNGLElBQUksWUFBWSxFQUFFLENBQUM7WUFDZixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQVUsQ0FBQztZQUN4RCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFVLENBQUM7WUFDakYsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxVQUFVLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFVLENBQUM7WUFDeEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBVSxDQUFDO1lBQ2hGLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxjQUFjLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1RCxNQUFNLGFBQWEsR0FDZixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELElBQUksY0FBYyxJQUFJLFVBQVUsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFFLE1BQU0sZUFBZSxHQUNqQixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELElBQUksY0FBYyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUQsTUFBTSxjQUFjLEdBQ2hCLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDekMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RGLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQsSUFBSSxZQUFZLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FDZCxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQUksWUFBWSxJQUFJLFVBQVUsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hFLE1BQU0sZUFBZSxHQUNqQixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELElBQUksWUFBWSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUQsTUFBTSxjQUFjLEdBQ2hCLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDekMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RGLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWlCLEVBQUUsS0FBdUI7SUFDdEUsTUFBTSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzNCLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwRyxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QixDQUFDLENBQUM7UUFDSCxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFpQixFQUFFLEtBQWdCO0lBQzlELE1BQU0sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUMzQixJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwRyxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztRQUNILENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2xELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDM0csTUFBTSxFQUFFLHNCQUFzQjtnQkFDOUIsV0FBVyxFQUFFLENBQUM7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50LCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50LCBTRUxFQ1RJT05fQk9SREVSX0NPTE9SIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeUFuZ2xlIH0gZnJvbSAnLi4vYW5nbGUnO1xuaW1wb3J0IHsgY3JlYXRlRyB9IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQgeyBmaW5kRWxlbWVudHMgfSBmcm9tICcuLi9lbGVtZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBTbmFwRGVsdGEge1xuICAgIGRlbHRhWDogbnVtYmVyO1xuICAgIGRlbHRhWTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNuYXBSZWYgZXh0ZW5kcyBTbmFwRGVsdGEge1xuICAgIHNuYXBHOiBTVkdHRWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHYXBTbmFwUmVmIHtcbiAgICBiZWZvcmU6IHsgZGlzdGFuY2U6IG51bWJlcjsgaW5kZXg6IG51bWJlciB9W107XG4gICAgYWZ0ZXI6IHsgZGlzdGFuY2U6IG51bWJlcjsgaW5kZXg6IG51bWJlciB9W107XG59XG5cbnR5cGUgUG9pbnRTbmFwTGluZVJlZiA9IHtcbiAgICBheGlzOiBudW1iZXI7XG4gICAgaXNIb3Jpem9udGFsOiBib29sZWFuO1xuICAgIHBvaW50UmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W107XG59O1xuXG50eXBlIFRyaXBsZVNuYXBBeGlzID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgU05BUF9UT0xFUkFOQ0UgPSAyO1xuXG5jb25zdCBTTkFQX1NQQUNJTkcgPSAyNDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNuYXBSZWN0YW5nbGVzKGJvYXJkOiBQbGFpdEJvYXJkLCBhY3RpdmVFbGVtZW50czogUGxhaXRFbGVtZW50W10pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGZpbmRFbGVtZW50cyhib2FyZCwge1xuICAgICAgICBtYXRjaDogZWxlbWVudCA9PiBib2FyZC5pc0FsaWduKGVsZW1lbnQpICYmICFhY3RpdmVFbGVtZW50cy5zb21lKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZWxlbWVudC5pZCksXG4gICAgICAgIHJlY3Vyc2lvbjogKCkgPT4gdHJ1ZSxcbiAgICAgICAgaXNSZXZlcnNlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50cy5tYXAoaXRlbSA9PiBnZXRSZWN0YW5nbGVCeUFuZ2xlKGJvYXJkLmdldFJlY3RhbmdsZShpdGVtKSEsIGl0ZW0uYW5nbGUpIHx8IGJvYXJkLmdldFJlY3RhbmdsZShpdGVtKSEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFyUG9pbnQocG9pbnQ6IFBvaW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gaXNIb3Jpem9udGFsXG4gICAgICAgID8gW1xuICAgICAgICAgICAgICBbcG9pbnRbMF0sIHBvaW50WzFdIC0gNF0sXG4gICAgICAgICAgICAgIFtwb2ludFswXSwgcG9pbnRbMV0gKyA0XVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICAgIFtwb2ludFswXSAtIDQsIHBvaW50WzFdXSxcbiAgICAgICAgICAgICAgW3BvaW50WzBdICsgNCwgcG9pbnRbMV1dXG4gICAgICAgICAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pblBvaW50RGVsdGEocG9pbnRSZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSwgYXhpczogbnVtYmVyLCBpc0hvcml6b250YWw6IGJvb2xlYW4pIHtcbiAgICBsZXQgZGVsdGEgPSBTTkFQX1RPTEVSQU5DRTtcbiAgICBwb2ludFJlY3RhbmdsZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBnZXROZWFyZXN0RGVsdGEoYXhpcywgaXRlbSwgaXNIb3Jpem9udGFsKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA8IE1hdGguYWJzKGRlbHRhKSkge1xuICAgICAgICAgICAgZGVsdGEgPSBkaXN0YW5jZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWx0YTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3REZWx0YSA9IChheGlzOiBudW1iZXIsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCBwb2ludEF4aXMgPSBnZXRUcmlwbGVBeGlzKHJlY3RhbmdsZSwgaXNIb3Jpem9udGFsKTtcbiAgICBjb25zdCBkZWx0YXMgPSBwb2ludEF4aXMubWFwKGl0ZW0gPT4gaXRlbSAtIGF4aXMpO1xuICAgIGNvbnN0IGFic0RlbHRhcyA9IGRlbHRhcy5tYXAoaXRlbSA9PiBNYXRoLmFicyhpdGVtKSk7XG4gICAgY29uc3QgaW5kZXggPSBhYnNEZWx0YXMuaW5kZXhPZihNYXRoLm1pbiguLi5hYnNEZWx0YXMpKTtcbiAgICByZXR1cm4gZGVsdGFzW2luZGV4XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUcmlwbGVBeGlzID0gKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pOiBUcmlwbGVTbmFwQXhpcyA9PiB7XG4gICAgY29uc3QgYXhpcyA9IGlzSG9yaXpvbnRhbCA/ICd4JyA6ICd5JztcbiAgICBjb25zdCBzaWRlID0gaXNIb3Jpem9udGFsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHJldHVybiBbcmVjdGFuZ2xlW2F4aXNdLCByZWN0YW5nbGVbYXhpc10gKyByZWN0YW5nbGVbc2lkZV0gLyAyLCByZWN0YW5nbGVbYXhpc10gKyByZWN0YW5nbGVbc2lkZV1dO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5lYXJlc3RQb2ludFJlY3RhbmdsZShzbmFwUmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W10sIGFjdGl2ZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgbGV0IG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgbGV0IG5lYXJlc3RSZWN0YW5nbGUgPSBzbmFwUmVjdGFuZ2xlc1swXTtcblxuICAgIHNuYXBSZWN0YW5nbGVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KE1hdGgucG93KGFjdGl2ZVJlY3RhbmdsZS54IC0gaXRlbS54LCAyKSArIE1hdGgucG93KGFjdGl2ZVJlY3RhbmdsZS55IC0gaXRlbS55LCAyKSk7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgbmVhcmVzdFJlY3RhbmdsZSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbmVhcmVzdFJlY3RhbmdsZTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzU25hcFBvaW50ID0gKGF4aXM6IG51bWJlciwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIGlzSG9yaXpvbnRhbDogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IHBvaW50QXhpcyA9IGdldFRyaXBsZUF4aXMocmVjdGFuZ2xlLCBpc0hvcml6b250YWwpO1xuICAgIHJldHVybiBwb2ludEF4aXMuaW5jbHVkZXMoYXhpcyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZHJhd1BvaW50U25hcExpbmVzKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGFjdGl2ZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LFxuICAgIHNuYXBSZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSxcbiAgICBkcmF3SG9yaXpvbnRhbCA9IHRydWUsXG4gICAgZHJhd1ZlcnRpY2FsID0gdHJ1ZSxcbiAgICBzbmFwTWlkZGxlID0gZmFsc2Vcbikge1xuICAgIGxldCBwb2ludExpbmVQb2ludHM6IFtQb2ludCwgUG9pbnRdW10gPSBbXTtcbiAgICBjb25zdCBwb2ludEF4aXNYID0gZ2V0VHJpcGxlQXhpcyhhY3RpdmVSZWN0YW5nbGUsIHRydWUpO1xuICAgIGNvbnN0IHBvaW50QXhpc1kgPSBnZXRUcmlwbGVBeGlzKGFjdGl2ZVJlY3RhbmdsZSwgZmFsc2UpO1xuICAgIGNvbnN0IHBvaW50TGluZVJlZnM6IFBvaW50U25hcExpbmVSZWZbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgYXhpczogcG9pbnRBeGlzWFswXSxcbiAgICAgICAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZSxcbiAgICAgICAgICAgIHBvaW50UmVjdGFuZ2xlczogW11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgYXhpczogcG9pbnRBeGlzWFsxXSxcbiAgICAgICAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZSxcbiAgICAgICAgICAgIHBvaW50UmVjdGFuZ2xlczogW11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgYXhpczogcG9pbnRBeGlzWFsyXSxcbiAgICAgICAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZSxcbiAgICAgICAgICAgIHBvaW50UmVjdGFuZ2xlczogW11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgYXhpczogcG9pbnRBeGlzWVswXSxcbiAgICAgICAgICAgIGlzSG9yaXpvbnRhbDogZmFsc2UsXG4gICAgICAgICAgICBwb2ludFJlY3RhbmdsZXM6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGF4aXM6IHBvaW50QXhpc1lbMV0sXG4gICAgICAgICAgICBpc0hvcml6b250YWw6IGZhbHNlLFxuICAgICAgICAgICAgcG9pbnRSZWN0YW5nbGVzOiBbXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBheGlzOiBwb2ludEF4aXNZWzJdLFxuICAgICAgICAgICAgaXNIb3Jpem9udGFsOiBmYWxzZSxcbiAgICAgICAgICAgIHBvaW50UmVjdGFuZ2xlczogW11cbiAgICAgICAgfVxuICAgIF07XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNuYXBSZWN0YW5nbGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gc25hcFJlY3RhbmdsZXNbaW5kZXhdO1xuICAgICAgICBpZiAoaXNTbmFwUG9pbnQocG9pbnRMaW5lUmVmc1swXS5heGlzLCBlbGVtZW50LCBwb2ludExpbmVSZWZzWzBdLmlzSG9yaXpvbnRhbCkpIHtcbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbMF0ucG9pbnRSZWN0YW5nbGVzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU25hcFBvaW50KHBvaW50TGluZVJlZnNbMV0uYXhpcywgZWxlbWVudCwgcG9pbnRMaW5lUmVmc1sxXS5pc0hvcml6b250YWwpKSB7XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzFdLnBvaW50UmVjdGFuZ2xlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NuYXBQb2ludChwb2ludExpbmVSZWZzWzJdLmF4aXMsIGVsZW1lbnQsIHBvaW50TGluZVJlZnNbMl0uaXNIb3Jpem9udGFsKSkge1xuICAgICAgICAgICAgcG9pbnRMaW5lUmVmc1syXS5wb2ludFJlY3RhbmdsZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTbmFwUG9pbnQocG9pbnRMaW5lUmVmc1szXS5heGlzLCBlbGVtZW50LCBwb2ludExpbmVSZWZzWzNdLmlzSG9yaXpvbnRhbCkpIHtcbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbM10ucG9pbnRSZWN0YW5nbGVzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU25hcFBvaW50KHBvaW50TGluZVJlZnNbNF0uYXhpcywgZWxlbWVudCwgcG9pbnRMaW5lUmVmc1s0XS5pc0hvcml6b250YWwpKSB7XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzRdLnBvaW50UmVjdGFuZ2xlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NuYXBQb2ludChwb2ludExpbmVSZWZzWzVdLmF4aXMsIGVsZW1lbnQsIHBvaW50TGluZVJlZnNbNV0uaXNIb3Jpem9udGFsKSkge1xuICAgICAgICAgICAgcG9pbnRMaW5lUmVmc1s1XS5wb2ludFJlY3RhbmdsZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldFJlc2l6ZVBvaW50U25hcExpbmUgPSAoYXhpczogbnVtYmVyLCBwb2ludFJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgY29uc3QgYm91bmRpbmdSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZShcbiAgICAgICAgICAgIFJlY3RhbmdsZUNsaWVudC5nZXRCb3VuZGluZ1JlY3RhbmdsZShbYWN0aXZlUmVjdGFuZ2xlLCBwb2ludFJlY3RhbmdsZV0pLFxuICAgICAgICAgICAgU05BUF9TUEFDSU5HXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50U3RhcnQgPSBbYXhpcywgYm91bmRpbmdSZWN0YW5nbGUueV0gYXMgUG9pbnQ7XG4gICAgICAgICAgICBjb25zdCBwb2ludEVuZCA9IFtheGlzLCBib3VuZGluZ1JlY3RhbmdsZS55ICsgYm91bmRpbmdSZWN0YW5nbGUuaGVpZ2h0XSBhcyBQb2ludDtcbiAgICAgICAgICAgIHBvaW50TGluZVBvaW50cy5wdXNoKFtwb2ludFN0YXJ0LCBwb2ludEVuZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRTdGFydCA9IFtib3VuZGluZ1JlY3RhbmdsZS54LCBheGlzXSBhcyBQb2ludDtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50RW5kID0gW2JvdW5kaW5nUmVjdGFuZ2xlLnggKyBib3VuZGluZ1JlY3RhbmdsZS53aWR0aCwgYXhpc10gYXMgUG9pbnQ7XG4gICAgICAgICAgICBwb2ludExpbmVQb2ludHMucHVzaChbcG9pbnRTdGFydCwgcG9pbnRFbmRdKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGRyYXdIb3Jpem9udGFsICYmIHBvaW50TGluZVJlZnNbMF0ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBsZWZ0UmVjdGFuZ2xlID1cbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbMF0ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gcG9pbnRMaW5lUmVmc1swXS5wb2ludFJlY3RhbmdsZXNbMF1cbiAgICAgICAgICAgICAgICA6IGdldE5lYXJlc3RQb2ludFJlY3RhbmdsZShwb2ludExpbmVSZWZzWzBdLnBvaW50UmVjdGFuZ2xlcywgYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgc2V0UmVzaXplUG9pbnRTbmFwTGluZShwb2ludExpbmVSZWZzWzBdLmF4aXMsIGxlZnRSZWN0YW5nbGUsIHBvaW50TGluZVJlZnNbMF0uaXNIb3Jpem9udGFsKTtcbiAgICB9XG4gICAgaWYgKGRyYXdIb3Jpem9udGFsICYmIHNuYXBNaWRkbGUgJiYgcG9pbnRMaW5lUmVmc1sxXS5wb2ludFJlY3RhbmdsZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1pZGRsZVJlY3RhbmdsZSA9XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzFdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IHBvaW50TGluZVJlZnNbMV0ucG9pbnRSZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgOiBnZXROZWFyZXN0UG9pbnRSZWN0YW5nbGUocG9pbnRMaW5lUmVmc1sxXS5wb2ludFJlY3RhbmdsZXMsIGFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgIHNldFJlc2l6ZVBvaW50U25hcExpbmUocG9pbnRMaW5lUmVmc1sxXS5heGlzLCBtaWRkbGVSZWN0YW5nbGUsIHBvaW50TGluZVJlZnNbMV0uaXNIb3Jpem9udGFsKTtcbiAgICB9XG5cbiAgICBpZiAoZHJhd0hvcml6b250YWwgJiYgcG9pbnRMaW5lUmVmc1syXS5wb2ludFJlY3RhbmdsZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJpZ2h0UmVjdGFuZ2xlID1cbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbMl0ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gcG9pbnRMaW5lUmVmc1syXS5wb2ludFJlY3RhbmdsZXNbMF1cbiAgICAgICAgICAgICAgICA6IGdldE5lYXJlc3RQb2ludFJlY3RhbmdsZShwb2ludExpbmVSZWZzWzJdLnBvaW50UmVjdGFuZ2xlcywgYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgc2V0UmVzaXplUG9pbnRTbmFwTGluZShwb2ludExpbmVSZWZzWzJdLmF4aXMsIHJpZ2h0UmVjdGFuZ2xlLCBwb2ludExpbmVSZWZzWzJdLmlzSG9yaXpvbnRhbCk7XG4gICAgfVxuXG4gICAgaWYgKGRyYXdWZXJ0aWNhbCAmJiBwb2ludExpbmVSZWZzWzNdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG9wUmVjdGFuZ2xlID1cbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbM10ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gcG9pbnRMaW5lUmVmc1szXS5wb2ludFJlY3RhbmdsZXNbMF1cbiAgICAgICAgICAgICAgICA6IGdldE5lYXJlc3RQb2ludFJlY3RhbmdsZShwb2ludExpbmVSZWZzWzNdLnBvaW50UmVjdGFuZ2xlcywgYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgc2V0UmVzaXplUG9pbnRTbmFwTGluZShwb2ludExpbmVSZWZzWzNdLmF4aXMsIHRvcFJlY3RhbmdsZSwgcG9pbnRMaW5lUmVmc1szXS5pc0hvcml6b250YWwpO1xuICAgIH1cblxuICAgIGlmIChkcmF3VmVydGljYWwgJiYgc25hcE1pZGRsZSAmJiBwb2ludExpbmVSZWZzWzRdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlUmVjdGFuZ2xlID1cbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbNF0ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gcG9pbnRMaW5lUmVmc1s0XS5wb2ludFJlY3RhbmdsZXNbMF1cbiAgICAgICAgICAgICAgICA6IGdldE5lYXJlc3RQb2ludFJlY3RhbmdsZShwb2ludExpbmVSZWZzWzRdLnBvaW50UmVjdGFuZ2xlcywgYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgc2V0UmVzaXplUG9pbnRTbmFwTGluZShwb2ludExpbmVSZWZzWzRdLmF4aXMsIG1pZGRsZVJlY3RhbmdsZSwgcG9pbnRMaW5lUmVmc1s0XS5pc0hvcml6b250YWwpO1xuICAgIH1cblxuICAgIGlmIChkcmF3VmVydGljYWwgJiYgcG9pbnRMaW5lUmVmc1s1XS5wb2ludFJlY3RhbmdsZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJpZ2h0UmVjdGFuZ2xlID1cbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbNV0ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gcG9pbnRMaW5lUmVmc1s1XS5wb2ludFJlY3RhbmdsZXNbMF1cbiAgICAgICAgICAgICAgICA6IGdldE5lYXJlc3RQb2ludFJlY3RhbmdsZShwb2ludExpbmVSZWZzWzVdLnBvaW50UmVjdGFuZ2xlcywgYWN0aXZlUmVjdGFuZ2xlKTtcbiAgICAgICAgc2V0UmVzaXplUG9pbnRTbmFwTGluZShwb2ludExpbmVSZWZzWzVdLmF4aXMsIHJpZ2h0UmVjdGFuZ2xlLCBwb2ludExpbmVSZWZzWzVdLmlzSG9yaXpvbnRhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYXdEYXNoZWRMaW5lcyhib2FyZCwgcG9pbnRMaW5lUG9pbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdEYXNoZWRMaW5lcyhib2FyZDogUGxhaXRCb2FyZCwgbGluZXM6IFtQb2ludCwgUG9pbnRdW10pIHtcbiAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgIGxpbmVzLmZvckVhY2gocG9pbnRzID0+IHtcbiAgICAgICAgaWYgKCFwb2ludHMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5saW5lKHBvaW50c1swXVswXSwgcG9pbnRzWzBdWzFdLCBwb2ludHNbMV1bMF0sIHBvaW50c1sxXVsxXSwge1xuICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXG4gICAgICAgICAgICBzdHJva2VMaW5lRGFzaDogWzQsIDRdXG4gICAgICAgIH0pO1xuICAgICAgICBnLmFwcGVuZENoaWxkKGxpbmUpO1xuICAgIH0pO1xuICAgIHJldHVybiBnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd1NvbGlkTGluZXMoYm9hcmQ6IFBsYWl0Qm9hcmQsIGxpbmVzOiBQb2ludFtdW10pIHtcbiAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgIGxpbmVzLmZvckVhY2gocG9pbnRzID0+IHtcbiAgICAgICAgaWYgKCFwb2ludHMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBpc0hvcml6b250YWwgPSBwb2ludHNbMF1bMV0gPT09IHBvaW50c1sxXVsxXTtcbiAgICAgICAgY29uc3QgbGluZSA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLmxpbmUocG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0sIHBvaW50c1sxXVswXSwgcG9pbnRzWzFdWzFdLCB7XG4gICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMVxuICAgICAgICB9KTtcbiAgICAgICAgZy5hcHBlbmRDaGlsZChsaW5lKTtcblxuICAgICAgICBwb2ludHMuZm9yRWFjaChwb2ludCA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXJQb2ludCA9IGdldEJhclBvaW50KHBvaW50LCBpc0hvcml6b250YWwpO1xuICAgICAgICAgICAgY29uc3QgYmFyID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCkubGluZShiYXJQb2ludFswXVswXSwgYmFyUG9pbnRbMF1bMV0sIGJhclBvaW50WzFdWzBdLCBiYXJQb2ludFsxXVsxXSwge1xuICAgICAgICAgICAgICAgIHN0cm9rZTogU0VMRUNUSU9OX0JPUkRFUl9DT0xPUixcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBnLmFwcGVuZENoaWxkKGJhcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBnO1xufVxuIl19
|
|
@@ -136,7 +136,7 @@ async function cloneSvg(board, elements, rectangle, options) {
|
|
|
136
136
|
const { width, height, x, y } = rectangle;
|
|
137
137
|
const { padding = 4, inlineStyleClassNames } = options;
|
|
138
138
|
const sourceSvg = PlaitBoard.getHost(board);
|
|
139
|
-
const selectedGElements = elements.map(value => PlaitElement.
|
|
139
|
+
const selectedGElements = elements.map(value => PlaitElement.getElementG(value));
|
|
140
140
|
const cloneSvgElement = sourceSvg.cloneNode();
|
|
141
141
|
const newHostElement = PlaitBoard.getElementHost(board).cloneNode();
|
|
142
142
|
cloneSvgElement.style.width = `${width}px`;
|
|
@@ -196,4 +196,4 @@ export function downloadImage(url, name) {
|
|
|
196
196
|
a.click();
|
|
197
197
|
a.remove();
|
|
198
198
|
}
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8taW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy90by1pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqRSxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQztBQVloRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsSUFBVTtJQUM3QixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsU0FBUyxDQUFDLEdBQVc7SUFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUM5RCxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLFNBQVMsR0FBRyxhQUFhO0lBQzFFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsTUFB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RUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVcsRUFBRSxJQUFZO0lBQ25ELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50LCBSZWN0YW5nbGVDbGllbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGZpbmRFbGVtZW50cywgZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyB9IGZyb20gJy4vZWxlbWVudCc7XG5cbmNvbnN0IElNQUdFX0NPTlRBSU5FUiA9ICdwbGFpdC1pbWFnZS1jb250YWluZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvSW1hZ2VPcHRpb25zIHtcbiAgICBlbGVtZW50cz86IFBsYWl0RWxlbWVudFtdO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgcmF0aW8/OiBudW1iZXI7XG4gICAgcGFkZGluZz86IG51bWJlcjtcbiAgICBmaWxsU3R5bGU/OiBzdHJpbmc7XG4gICAgLy8gTGlzdCBvZiBjbGFzcyBuYW1lcy4gVGhlIGxpc3QgbXVzdCBiZSBpbiB0aGUgZm9ybSBjbGFzczEsY2xhc3MyLC4uLlxuICAgIGlubGluZVN0eWxlQ2xhc3NOYW1lcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJcyBlbGVtZW50IG5vZGVcbiAqIEBwYXJhbSBub2RlXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBpc0VsZW1lbnROb2RlKG5vZGU6IE5vZGUpOiBub2RlIGlzIEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7XG59XG5cbi8qKlxuICogbG9hZCBpbWFnZSByZXNvdXJjZXNcbiAqIEBwYXJhbSB1cmwgaW1hZ2UgdXJsXG4gKiBAcmV0dXJucyBpbWFnZSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGxvYWRJbWFnZShzcmM6IHN0cmluZyk6IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBpbWFnZScpKTtcbiAgICAgICAgaW1nLnNyYyA9IHNyYztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBjcmVhdGUgYW5kIHJldHVybiBjYW52YXMgYW5kIGNvbnRleHRcbiAqIEBwYXJhbSB3aWR0aCBjYW52YXMgd2lkdGhcbiAqIEBwYXJhbSBoZWlnaHQgY2FudmFzIGhlaWdodFxuICogQHBhcmFtIGZpbGxTdHlsZSBmaWxsIHN0eWxlXG4gKiBAcmV0dXJucyBjYW52YXMgYW5kIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBmaWxsU3R5bGUgPSAndHJhbnNwYXJlbnQnKSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuXG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gJyNmZmZmZmYnO1xuICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGU7XG4gICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FudmFzLFxuICAgICAgICBjdHhcbiAgICB9O1xufVxuXG4vKipcbiAqIGNvbnZlcnQgaW1hZ2UgdG8gYmFzZTY0XG4gKiBAcGFyYW0gdXJsIGltYWdlIHVybFxuICogQHJldHVybnMgaW1hZ2UgYmFzZTY0XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRJbWFnZVRvQmFzZTY0KHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGxvYWRJbWFnZSh1cmwpLnRoZW4oaW1nID0+IHtcbiAgICAgICAgY29uc3QgeyBjYW52YXMsIGN0eCB9ID0gY3JlYXRlQ2FudmFzKGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG4gICAgICAgIGN0eD8uZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBjbG9uZSBub2RlIHN0eWxlXG4gKiBAcGFyYW0gbmF0aXZlTm9kZSBzb3VyY2Ugbm9kZVxuICogQHBhcmFtIGNsb25lZE5vZGUgY2xvbmUgbm9kZVxuICovXG5mdW5jdGlvbiBjbG9uZUNTU1N0eWxlPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4obmF0aXZlTm9kZTogVCwgY2xvbmVkTm9kZTogVCkge1xuICAgIGNvbnN0IHRhcmdldFN0eWxlID0gY2xvbmVkTm9kZT8uc3R5bGU7XG4gICAgaWYgKCF0YXJnZXRTdHlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShuYXRpdmVOb2RlKTtcbiAgICBpZiAoc291cmNlU3R5bGUuY3NzVGV4dCkge1xuICAgICAgICB0YXJnZXRTdHlsZS5jc3NUZXh0ID0gc291cmNlU3R5bGUuY3NzVGV4dDtcbiAgICAgICAgdGFyZ2V0U3R5bGUudHJhbnNmb3JtT3JpZ2luID0gc291cmNlU3R5bGUudHJhbnNmb3JtT3JpZ2luO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIEFycmF5LmZyb20oc291cmNlU3R5bGUpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBzb3VyY2VTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICAgICAgICAgICAgdGFyZ2V0U3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHNvdXJjZVN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkobmFtZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogYmF0Y2ggY2xvbmUgdGFyZ2V0IHN0eWxlc1xuICogQHBhcmFtIHNvdXJjZU5vZGVcbiAqIEBwYXJhbSBjbG9uZU5vZGVcbiAqIEBwYXJhbSBpbmxpbmVTdHlsZUNsYXNzTmFtZXNcbiAqL1xuZnVuY3Rpb24gYmF0Y2hDbG9uZUNTU1N0eWxlKHNvdXJjZU5vZGU6IFNWR0dFbGVtZW50LCBjbG9uZU5vZGU6IFNWR0dFbGVtZW50LCBpbmxpbmVTdHlsZUNsYXNzTmFtZXM6IHN0cmluZykge1xuICAgIGlmIChpbmxpbmVTdHlsZUNsYXNzTmFtZXMpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGlubGluZVN0eWxlQ2xhc3NOYW1lcyArIGAsLiR7SU1BR0VfQ09OVEFJTkVSfWA7XG4gICAgICAgIGNvbnN0IHNvdXJjZU5vZGVzID0gQXJyYXkuZnJvbShzb3VyY2VOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NOYW1lcykpO1xuICAgICAgICBjb25zdCBjbG9uZU5vZGVzID0gQXJyYXkuZnJvbShjbG9uZU5vZGUucXVlcnlTZWxlY3RvckFsbChjbGFzc05hbWVzKSk7XG5cbiAgICAgICAgc291cmNlTm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxlbWVudHMgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbCgnKicpKS5maWx0ZXIoaXNFbGVtZW50Tm9kZSkgYXMgSFRNTEVsZW1lbnRbXTtcbiAgICAgICAgICAgIGNvbnN0IGNsb25lQ2hpbGRFbGVtZW50cyA9IEFycmF5LmZyb20oY2xvbmVOb2Rlc1tpbmRleF0ucXVlcnlTZWxlY3RvckFsbCgnKicpKS5maWx0ZXIoaXNFbGVtZW50Tm9kZSkgYXMgSFRNTEVsZW1lbnRbXTtcbiAgICAgICAgICAgIHNvdXJjZU5vZGVzLnB1c2goLi4uY2hpbGRFbGVtZW50cyk7XG4gICAgICAgICAgICBjbG9uZU5vZGVzLnB1c2goLi4uY2xvbmVDaGlsZEVsZW1lbnRzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcHJvY2Vzc2luZyBzdHlsZXNcbiAgICAgICAgc291cmNlTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY2xvbmVDU1NTdHlsZShub2RlIGFzIEhUTUxFbGVtZW50LCBjbG9uZU5vZGVzW2luZGV4XSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBjb252ZXJ0IGltYWdlcyBpbiB0YXJnZXQgbm9kZXMgaW4gYmF0Y2hlc1xuICogQHBhcmFtIHNvdXJjZU5vZGVcbiAqIEBwYXJhbSBjbG9uZU5vZGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYmF0Y2hDb252ZXJ0SW1hZ2Uoc291cmNlTm9kZTogU1ZHR0VsZW1lbnQsIGNsb25lTm9kZTogU1ZHR0VsZW1lbnQpIHtcbiAgICBjb25zdCBzb3VyY2VJbWFnZU5vZGVzID0gQXJyYXkuZnJvbShzb3VyY2VOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke0lNQUdFX0NPTlRBSU5FUn1gKSk7XG4gICAgY29uc3QgY2xvbmVJbWFnZU5vZGVzID0gQXJyYXkuZnJvbShjbG9uZU5vZGUucXVlcnlTZWxlY3RvckFsbChgLiR7SU1BR0VfQ09OVEFJTkVSfWApKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgc291cmNlSW1hZ2VOb2Rlcy5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmVJbWFnZU5vZGUgPSBjbG9uZUltYWdlTm9kZXNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgaW1hZ2VcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IChjbG9uZUltYWdlTm9kZSBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcignaW1nJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gaW1hZ2U/LmdldEF0dHJpYnV0ZSgnc3JjJyk7XG4gICAgICAgICAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnZlcnRJbWFnZVRvQmFzZTY0KHVybCkudGhlbihiYXNlNjRJbWFnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlPy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGJhc2U2NEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICk7XG59XG5cbi8qKlxuICogY2xvbmUgc3ZnIGVsZW1lbnRcbiAqIEBwYXJhbSBib2FyZCBib2FyZFxuICogQHBhcmFtIG9wdGlvbnMgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIGNsb25lIHN2ZyBlbGVtZW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNsb25lU3ZnKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50czogUGxhaXRFbGVtZW50W10sIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBvcHRpb25zOiBUb0ltYWdlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgeCwgeSB9ID0gcmVjdGFuZ2xlO1xuICAgIGNvbnN0IHsgcGFkZGluZyA9IDQsIGlubGluZVN0eWxlQ2xhc3NOYW1lcyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzb3VyY2VTdmcgPSBQbGFpdEJvYXJkLmdldEhvc3QoYm9hcmQpO1xuICAgIGNvbnN0IHNlbGVjdGVkR0VsZW1lbnRzID0gZWxlbWVudHMubWFwKHZhbHVlID0+IFBsYWl0RWxlbWVudC5nZXRDb21wb25lbnQodmFsdWUpLmcpO1xuICAgIGNvbnN0IGNsb25lU3ZnRWxlbWVudCA9IHNvdXJjZVN2Zy5jbG9uZU5vZGUoKSBhcyBTVkdFbGVtZW50O1xuICAgIGNvbnN0IG5ld0hvc3RFbGVtZW50ID0gUGxhaXRCb2FyZC5nZXRFbGVtZW50SG9zdChib2FyZCkuY2xvbmVOb2RlKCkgYXMgU1ZHR0VsZW1lbnQ7XG5cbiAgICBjbG9uZVN2Z0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgY2xvbmVTdmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgY2xvbmVTdmdFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcnO1xuICAgIGNsb25lU3ZnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYCR7d2lkdGh9YCk7XG4gICAgY2xvbmVTdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYCR7aGVpZ2h0fWApO1xuICAgIGNsb25lU3ZnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBbeCAtIHBhZGRpbmcsIHkgLSBwYWRkaW5nLCB3aWR0aCArIDIgKiBwYWRkaW5nLCBoZWlnaHQgKyAyICogcGFkZGluZ10uam9pbignLCcpKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBzZWxlY3RlZEdFbGVtZW50cy5tYXAoYXN5bmMgKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbG9uZUNoaWxkID0gY2hpbGQuY2xvbmVOb2RlKHRydWUpIGFzIFNWR0dFbGVtZW50O1xuICAgICAgICAgICAgYmF0Y2hDbG9uZUNTU1N0eWxlKGNoaWxkLCBjbG9uZUNoaWxkLCBpbmxpbmVTdHlsZUNsYXNzTmFtZXMgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgYXdhaXQgYmF0Y2hDb252ZXJ0SW1hZ2UoY2hpbGQsIGNsb25lQ2hpbGQpO1xuICAgICAgICAgICAgbmV3SG9zdEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xvbmVDaGlsZCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICBjbG9uZVN2Z0VsZW1lbnQuYXBwZW5kQ2hpbGQobmV3SG9zdEVsZW1lbnQpO1xuICAgIHJldHVybiBjbG9uZVN2Z0VsZW1lbnQ7XG59XG5cbi8qKlxuICogY3VycmVudCBib2FyZCB0cmFuc2ZlciBwaWN0dXJlc1xuICogQHBhcmFtIGJvYXJkIGJvYXJkXG4gKiBAcGFyYW0gb3B0aW9ucyBwYXJhbWV0ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgaW1hZ2VzIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGJhc2U2NFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9JbWFnZShib2FyZDogUGxhaXRCb2FyZCwgb3B0aW9uczogVG9JbWFnZU9wdGlvbnMpIHtcbiAgICBpZiAoIWJvYXJkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRzID0gb3B0aW9ucy5lbGVtZW50cyB8fCBmaW5kRWxlbWVudHMoYm9hcmQsIHsgbWF0Y2g6ICgpID0+IHRydWUsIHJlY3Vyc2lvbjogKCkgPT4gdHJ1ZSwgaXNSZXZlcnNlOiBmYWxzZSB9KTtcbiAgICBjb25zdCB0YXJnZXRSZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBlbGVtZW50cywgZmFsc2UpO1xuICAgIGNvbnN0IHsgcmF0aW8gPSAyLCBmaWxsU3R5bGUgPSAndHJhbnNwYXJlbnQnIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGFyZ2V0UmVjdGFuZ2xlO1xuICAgIGNvbnN0IHJhdGlvV2lkdGggPSB3aWR0aCAqIHJhdGlvO1xuICAgIGNvbnN0IHJhdGlvSGVpZ2h0ID0gaGVpZ2h0ICogcmF0aW87XG5cbiAgICBjb25zdCBjbG9uZVN2Z0VsZW1lbnQgPSBhd2FpdCBjbG9uZVN2Zyhib2FyZCwgZWxlbWVudHMsIHRhcmdldFJlY3RhbmdsZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgeyBjYW52YXMsIGN0eCB9ID0gY3JlYXRlQ2FudmFzKHJhdGlvV2lkdGgsIHJhdGlvSGVpZ2h0LCBmaWxsU3R5bGUpO1xuXG4gICAgY29uc3Qgc3ZnU3RyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhjbG9uZVN2Z0VsZW1lbnQpO1xuICAgIGNvbnN0IGltZ1NyYyA9IGBkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwke2VuY29kZVVSSUNvbXBvbmVudChzdmdTdHIpfWA7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBpbWcgPSBhd2FpdCBsb2FkSW1hZ2UoaW1nU3JjKTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIHJhdGlvV2lkdGgsIHJhdGlvSGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbnZlcnRpbmcgU1ZHIHRvIGltYWdlOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8qKlxuICogZG93bmxvYWQgdGhlIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcbiAqIEBwYXJhbSB1cmwgZG93bmxvYWQgdXJsXG4gKiBAcGFyYW0gbmFtZSBmaWxlIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkSW1hZ2UodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBuYW1lO1xuICAgIGEuY2xpY2soKTtcbiAgICBhLnJlbW92ZSgpO1xufVxuIl19
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8taW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy90by1pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqRSxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQztBQVloRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsSUFBVTtJQUM3QixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsU0FBUyxDQUFDLEdBQVc7SUFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUM5RCxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLFNBQVMsR0FBRyxhQUFhO0lBQzFFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsTUFB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RUFBRSxXQUFXLENBQUMsQ0FBQztRQUNsRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLElBQVk7SUFDbkQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQsIFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZmluZEVsZW1lbnRzLCBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzIH0gZnJvbSAnLi9lbGVtZW50JztcblxuY29uc3QgSU1BR0VfQ09OVEFJTkVSID0gJ3BsYWl0LWltYWdlLWNvbnRhaW5lcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9JbWFnZU9wdGlvbnMge1xuICAgIGVsZW1lbnRzPzogUGxhaXRFbGVtZW50W107XG4gICAgbmFtZT86IHN0cmluZztcbiAgICByYXRpbz86IG51bWJlcjtcbiAgICBwYWRkaW5nPzogbnVtYmVyO1xuICAgIGZpbGxTdHlsZT86IHN0cmluZztcbiAgICAvLyBMaXN0IG9mIGNsYXNzIG5hbWVzLiBUaGUgbGlzdCBtdXN0IGJlIGluIHRoZSBmb3JtIGNsYXNzMSxjbGFzczIsLi4uXG4gICAgaW5saW5lU3R5bGVDbGFzc05hbWVzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIElzIGVsZW1lbnQgbm9kZVxuICogQHBhcmFtIG5vZGVcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudE5vZGUobm9kZTogTm9kZSk6IG5vZGUgaXMgSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERTtcbn1cblxuLyoqXG4gKiBsb2FkIGltYWdlIHJlc291cmNlc1xuICogQHBhcmFtIHVybCBpbWFnZSB1cmxcbiAqIEByZXR1cm5zIGltYWdlIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbG9hZEltYWdlKHNyYzogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWcpO1xuICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGltYWdlJykpO1xuICAgICAgICBpbWcuc3JjID0gc3JjO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIGNyZWF0ZSBhbmQgcmV0dXJuIGNhbnZhcyBhbmQgY29udGV4dFxuICogQHBhcmFtIHdpZHRoIGNhbnZhcyB3aWR0aFxuICogQHBhcmFtIGhlaWdodCBjYW52YXMgaGVpZ2h0XG4gKiBAcGFyYW0gZmlsbFN0eWxlIGZpbGwgc3R5bGVcbiAqIEByZXR1cm5zIGNhbnZhcyBhbmQgY29udGV4dFxuICovXG5mdW5jdGlvbiBjcmVhdGVDYW52YXMod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGZpbGxTdHlsZSA9ICd0cmFuc3BhcmVudCcpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XG5cbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSAnI2ZmZmZmZic7XG4gICAgY3R4LmZpbGxTdHlsZSA9IGZpbGxTdHlsZTtcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjYW52YXMsXG4gICAgICAgIGN0eFxuICAgIH07XG59XG5cbi8qKlxuICogY29udmVydCBpbWFnZSB0byBiYXNlNjRcbiAqIEBwYXJhbSB1cmwgaW1hZ2UgdXJsXG4gKiBAcmV0dXJucyBpbWFnZSBiYXNlNjRcbiAqL1xuZnVuY3Rpb24gY29udmVydEltYWdlVG9CYXNlNjQodXJsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbG9hZEltYWdlKHVybCkudGhlbihpbWcgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbnZhcywgY3R4IH0gPSBjcmVhdGVDYW52YXMoaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcbiAgICAgICAgY3R4Py5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIGNsb25lIG5vZGUgc3R5bGVcbiAqIEBwYXJhbSBuYXRpdmVOb2RlIHNvdXJjZSBub2RlXG4gKiBAcGFyYW0gY2xvbmVkTm9kZSBjbG9uZSBub2RlXG4gKi9cbmZ1bmN0aW9uIGNsb25lQ1NTU3R5bGU8VCBleHRlbmRzIEhUTUxFbGVtZW50PihuYXRpdmVOb2RlOiBULCBjbG9uZWROb2RlOiBUKSB7XG4gICAgY29uc3QgdGFyZ2V0U3R5bGUgPSBjbG9uZWROb2RlPy5zdHlsZTtcbiAgICBpZiAoIXRhcmdldFN0eWxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5hdGl2ZU5vZGUpO1xuICAgIGlmIChzb3VyY2VTdHlsZS5jc3NUZXh0KSB7XG4gICAgICAgIHRhcmdldFN0eWxlLmNzc1RleHQgPSBzb3VyY2VTdHlsZS5jc3NUZXh0O1xuICAgICAgICB0YXJnZXRTdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSBzb3VyY2VTdHlsZS50cmFuc2Zvcm1PcmlnaW47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgQXJyYXkuZnJvbShzb3VyY2VTdHlsZSkuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG4gICAgICAgICAgICB0YXJnZXRTdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgc291cmNlU3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShuYW1lKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBiYXRjaCBjbG9uZSB0YXJnZXQgc3R5bGVzXG4gKiBAcGFyYW0gc291cmNlTm9kZVxuICogQHBhcmFtIGNsb25lTm9kZVxuICogQHBhcmFtIGlubGluZVN0eWxlQ2xhc3NOYW1lc1xuICovXG5mdW5jdGlvbiBiYXRjaENsb25lQ1NTU3R5bGUoc291cmNlTm9kZTogU1ZHR0VsZW1lbnQsIGNsb25lTm9kZTogU1ZHR0VsZW1lbnQsIGlubGluZVN0eWxlQ2xhc3NOYW1lczogc3RyaW5nKSB7XG4gICAgaWYgKGlubGluZVN0eWxlQ2xhc3NOYW1lcykge1xuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gaW5saW5lU3R5bGVDbGFzc05hbWVzICsgYCwuJHtJTUFHRV9DT05UQUlORVJ9YDtcbiAgICAgICAgY29uc3Qgc291cmNlTm9kZXMgPSBBcnJheS5mcm9tKHNvdXJjZU5vZGUucXVlcnlTZWxlY3RvckFsbChjbGFzc05hbWVzKSk7XG4gICAgICAgIGNvbnN0IGNsb25lTm9kZXMgPSBBcnJheS5mcm9tKGNsb25lTm9kZS5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzTmFtZXMpKTtcblxuICAgICAgICBzb3VyY2VOb2Rlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRFbGVtZW50cyA9IEFycmF5LmZyb20obm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpLmZpbHRlcihpc0VsZW1lbnROb2RlKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgICAgICAgICAgY29uc3QgY2xvbmVDaGlsZEVsZW1lbnRzID0gQXJyYXkuZnJvbShjbG9uZU5vZGVzW2luZGV4XS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpLmZpbHRlcihpc0VsZW1lbnROb2RlKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgICAgICAgICAgc291cmNlTm9kZXMucHVzaCguLi5jaGlsZEVsZW1lbnRzKTtcbiAgICAgICAgICAgIGNsb25lTm9kZXMucHVzaCguLi5jbG9uZUNoaWxkRWxlbWVudHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBwcm9jZXNzaW5nIHN0eWxlc1xuICAgICAgICBzb3VyY2VOb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjbG9uZUNTU1N0eWxlKG5vZGUgYXMgSFRNTEVsZW1lbnQsIGNsb25lTm9kZXNbaW5kZXhdIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIGNvbnZlcnQgaW1hZ2VzIGluIHRhcmdldCBub2RlcyBpbiBiYXRjaGVzXG4gKiBAcGFyYW0gc291cmNlTm9kZVxuICogQHBhcmFtIGNsb25lTm9kZVxuICovXG5hc3luYyBmdW5jdGlvbiBiYXRjaENvbnZlcnRJbWFnZShzb3VyY2VOb2RlOiBTVkdHRWxlbWVudCwgY2xvbmVOb2RlOiBTVkdHRWxlbWVudCkge1xuICAgIGNvbnN0IHNvdXJjZUltYWdlTm9kZXMgPSBBcnJheS5mcm9tKHNvdXJjZU5vZGUucXVlcnlTZWxlY3RvckFsbChgLiR7SU1BR0VfQ09OVEFJTkVSfWApKTtcbiAgICBjb25zdCBjbG9uZUltYWdlTm9kZXMgPSBBcnJheS5mcm9tKGNsb25lTm9kZS5xdWVyeVNlbGVjdG9yQWxsKGAuJHtJTUFHRV9DT05UQUlORVJ9YCkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBzb3VyY2VJbWFnZU5vZGVzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbG9uZUltYWdlTm9kZSA9IGNsb25lSW1hZ2VOb2Rlc1tpbmRleF07XG4gICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBpbWFnZVxuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gKGNsb25lSW1hZ2VOb2RlIGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBpbWFnZT8uZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udmVydEltYWdlVG9CYXNlNjQodXJsKS50aGVuKGJhc2U2NEltYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U/LnNldEF0dHJpYnV0ZSgnc3JjJywgYmFzZTY0SW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgKTtcbn1cblxuLyoqXG4gKiBjbG9uZSBzdmcgZWxlbWVudFxuICogQHBhcmFtIGJvYXJkIGJvYXJkXG4gKiBAcGFyYW0gb3B0aW9ucyBwYXJhbWV0ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgY2xvbmUgc3ZnIGVsZW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xvbmVTdmcoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG9wdGlvbnM6IFRvSW1hZ2VPcHRpb25zKSB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB4LCB5IH0gPSByZWN0YW5nbGU7XG4gICAgY29uc3QgeyBwYWRkaW5nID0gNCwgaW5saW5lU3R5bGVDbGFzc05hbWVzIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHNvdXJjZVN2ZyA9IFBsYWl0Qm9hcmQuZ2V0SG9zdChib2FyZCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRHRWxlbWVudHMgPSBlbGVtZW50cy5tYXAodmFsdWUgPT4gUGxhaXRFbGVtZW50LmdldEVsZW1lbnRHKHZhbHVlKSk7XG4gICAgY29uc3QgY2xvbmVTdmdFbGVtZW50ID0gc291cmNlU3ZnLmNsb25lTm9kZSgpIGFzIFNWR0VsZW1lbnQ7XG4gICAgY29uc3QgbmV3SG9zdEVsZW1lbnQgPSBQbGFpdEJvYXJkLmdldEVsZW1lbnRIb3N0KGJvYXJkKS5jbG9uZU5vZGUoKSBhcyBTVkdHRWxlbWVudDtcblxuICAgIGNsb25lU3ZnRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICBjbG9uZVN2Z0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICBjbG9uZVN2Z0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyc7XG4gICAgY2xvbmVTdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHt3aWR0aH1gKTtcbiAgICBjbG9uZVN2Z0VsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtoZWlnaHR9YCk7XG4gICAgY2xvbmVTdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgndmlld0JveCcsIFt4IC0gcGFkZGluZywgeSAtIHBhZGRpbmcsIHdpZHRoICsgMiAqIHBhZGRpbmcsIGhlaWdodCArIDIgKiBwYWRkaW5nXS5qb2luKCcsJykpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHNlbGVjdGVkR0VsZW1lbnRzLm1hcChhc3luYyAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsb25lQ2hpbGQgPSBjaGlsZC5jbG9uZU5vZGUodHJ1ZSkgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgICAgICAgICBiYXRjaENsb25lQ1NTU3R5bGUoY2hpbGQsIGNsb25lQ2hpbGQsIGlubGluZVN0eWxlQ2xhc3NOYW1lcyBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgICBhd2FpdCBiYXRjaENvbnZlcnRJbWFnZShjaGlsZCwgY2xvbmVDaGlsZCk7XG4gICAgICAgICAgICBuZXdIb3N0RWxlbWVudC5hcHBlbmRDaGlsZChjbG9uZUNoaWxkKTtcbiAgICAgICAgfSlcbiAgICApO1xuICAgIGNsb25lU3ZnRWxlbWVudC5hcHBlbmRDaGlsZChuZXdIb3N0RWxlbWVudCk7XG4gICAgcmV0dXJuIGNsb25lU3ZnRWxlbWVudDtcbn1cblxuLyoqXG4gKiBjdXJyZW50IGJvYXJkIHRyYW5zZmVyIHBpY3R1cmVzXG4gKiBAcGFyYW0gYm9hcmQgYm9hcmRcbiAqIEBwYXJhbSBvcHRpb25zIHBhcmFtZXRlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBpbWFnZXMgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgYmFzZTY0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b0ltYWdlKGJvYXJkOiBQbGFpdEJvYXJkLCBvcHRpb25zOiBUb0ltYWdlT3B0aW9ucykge1xuICAgIGlmICghYm9hcmQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzIHx8IGZpbmRFbGVtZW50cyhib2FyZCwgeyBtYXRjaDogKCkgPT4gdHJ1ZSwgcmVjdXJzaW9uOiAoKSA9PiB0cnVlLCBpc1JldmVyc2U6IGZhbHNlIH0pO1xuICAgIGNvbnN0IHRhcmdldFJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMoYm9hcmQsIGVsZW1lbnRzLCBmYWxzZSk7XG4gICAgY29uc3QgeyByYXRpbyA9IDIsIGZpbGxTdHlsZSA9ICd0cmFuc3BhcmVudCcgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0YXJnZXRSZWN0YW5nbGU7XG4gICAgY29uc3QgcmF0aW9XaWR0aCA9IHdpZHRoICogcmF0aW87XG4gICAgY29uc3QgcmF0aW9IZWlnaHQgPSBoZWlnaHQgKiByYXRpbztcblxuICAgIGNvbnN0IGNsb25lU3ZnRWxlbWVudCA9IGF3YWl0IGNsb25lU3ZnKGJvYXJkLCBlbGVtZW50cywgdGFyZ2V0UmVjdGFuZ2xlLCBvcHRpb25zKTtcbiAgICBjb25zdCB7IGNhbnZhcywgY3R4IH0gPSBjcmVhdGVDYW52YXMocmF0aW9XaWR0aCwgcmF0aW9IZWlnaHQsIGZpbGxTdHlsZSk7XG5cbiAgICBjb25zdCBzdmdTdHIgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGNsb25lU3ZnRWxlbWVudCk7XG4gICAgY29uc3QgaW1nU3JjID0gYGRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCR7ZW5jb2RlVVJJQ29tcG9uZW50KHN2Z1N0cil9YDtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IGxvYWRJbWFnZShpbWdTcmMpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgcmF0aW9XaWR0aCwgcmF0aW9IZWlnaHQpO1xuICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY29udmVydGluZyBTVkcgdG8gaW1hZ2U6JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBkb3dubG9hZCB0aGUgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZVxuICogQHBhcmFtIHVybCBkb3dubG9hZCB1cmxcbiAqIEBwYXJhbSBuYW1lIGZpbGUgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRJbWFnZSh1cmw6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IG5hbWU7XG4gICAgYS5jbGljaygpO1xuICAgIGEucmVtb3ZlKCk7XG59XG4iXX0=
|