@plait/core 0.77.3 → 0.78.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/fesm2022/plait-core.mjs.map +1 -1
- package/package.json +1 -3
- package/esm2022/constants/cursor.mjs +0 -13
- package/esm2022/constants/index.mjs +0 -20
- package/esm2022/constants/keycodes.mjs +0 -127
- package/esm2022/constants/selection.mjs +0 -6
- package/esm2022/constants/zoom.mjs +0 -4
- package/esm2022/context.mjs +0 -23
- package/esm2022/core/element/context-change.mjs +0 -13
- package/esm2022/core/element/context.mjs +0 -2
- package/esm2022/core/element/element-flavour.mjs +0 -140
- package/esm2022/core/element/element-ref.mjs +0 -2
- package/esm2022/core/list-render.mjs +0 -217
- package/esm2022/differs/default_iterable_differ.mjs +0 -614
- package/esm2022/differs/iterable_differs.mjs +0 -9
- package/esm2022/interfaces/board.mjs +0 -108
- package/esm2022/interfaces/custom-types.mjs +0 -5
- package/esm2022/interfaces/direction.mjs +0 -8
- package/esm2022/interfaces/element.mjs +0 -43
- package/esm2022/interfaces/group.mjs +0 -6
- package/esm2022/interfaces/history.mjs +0 -5
- package/esm2022/interfaces/index.mjs +0 -19
- package/esm2022/interfaces/node.mjs +0 -57
- package/esm2022/interfaces/operation.mjs +0 -96
- package/esm2022/interfaces/path-ref.mjs +0 -15
- package/esm2022/interfaces/path.mjs +0 -183
- package/esm2022/interfaces/plugin.mjs +0 -6
- package/esm2022/interfaces/point.mjs +0 -27
- package/esm2022/interfaces/pointer.mjs +0 -6
- package/esm2022/interfaces/rectangle-client.mjs +0 -171
- package/esm2022/interfaces/selection.mjs +0 -13
- package/esm2022/interfaces/svg-arc-command.mjs +0 -2
- package/esm2022/interfaces/theme.mjs +0 -49
- package/esm2022/interfaces/viewport.mjs +0 -7
- package/esm2022/plait-core.mjs +0 -5
- package/esm2022/plugins/create-board.mjs +0 -122
- package/esm2022/plugins/index.mjs +0 -11
- package/esm2022/plugins/with-board.mjs +0 -20
- package/esm2022/plugins/with-hand.mjs +0 -113
- package/esm2022/plugins/with-history.mjs +0 -91
- package/esm2022/plugins/with-hotkey.mjs +0 -96
- package/esm2022/plugins/with-i18n.mjs +0 -13
- package/esm2022/plugins/with-moving.mjs +0 -282
- package/esm2022/plugins/with-options.mjs +0 -13
- package/esm2022/plugins/with-related-fragment.mjs +0 -23
- package/esm2022/plugins/with-selection.mjs +0 -230
- package/esm2022/public-api.mjs +0 -16
- package/esm2022/testing/core/create-board.mjs +0 -15
- package/esm2022/testing/core/fake-weak-map.mjs +0 -18
- package/esm2022/testing/core/index.mjs +0 -3
- package/esm2022/testing/fake-events/event-objects.mjs +0 -131
- package/esm2022/testing/fake-events/index.mjs +0 -2
- package/esm2022/testing/index.mjs +0 -3
- package/esm2022/testing/test-element.mjs +0 -9
- package/esm2022/transforms/board.mjs +0 -137
- package/esm2022/transforms/element.mjs +0 -22
- package/esm2022/transforms/general.mjs +0 -146
- package/esm2022/transforms/group.mjs +0 -64
- package/esm2022/transforms/index.mjs +0 -17
- package/esm2022/transforms/node.mjs +0 -37
- package/esm2022/transforms/selection.mjs +0 -26
- package/esm2022/transforms/theme.mjs +0 -8
- package/esm2022/transforms/viewport.mjs +0 -8
- package/esm2022/transforms/z-index.mjs +0 -20
- package/esm2022/utils/angle.mjs +0 -164
- package/esm2022/utils/board.mjs +0 -18
- package/esm2022/utils/clipboard/clipboard.mjs +0 -40
- package/esm2022/utils/clipboard/common.mjs +0 -82
- package/esm2022/utils/clipboard/data-transfer.mjs +0 -33
- package/esm2022/utils/clipboard/index.mjs +0 -3
- package/esm2022/utils/clipboard/navigator-clipboard.mjs +0 -71
- package/esm2022/utils/clipboard/types.mjs +0 -13
- package/esm2022/utils/common.mjs +0 -79
- package/esm2022/utils/debug.mjs +0 -91
- package/esm2022/utils/dnd.mjs +0 -8
- package/esm2022/utils/dom/common.mjs +0 -75
- package/esm2022/utils/dom/environment.mjs +0 -2
- package/esm2022/utils/dom/foreign.mjs +0 -26
- package/esm2022/utils/dom/index.mjs +0 -4
- package/esm2022/utils/drawing/arrow.mjs +0 -23
- package/esm2022/utils/drawing/circle.mjs +0 -4
- package/esm2022/utils/drawing/line.mjs +0 -47
- package/esm2022/utils/drawing/rectangle.mjs +0 -36
- package/esm2022/utils/element.mjs +0 -90
- package/esm2022/utils/environment.mjs +0 -14
- package/esm2022/utils/fragment.mjs +0 -27
- package/esm2022/utils/group.mjs +0 -239
- package/esm2022/utils/helper.mjs +0 -68
- package/esm2022/utils/history.mjs +0 -96
- package/esm2022/utils/hotkeys.mjs +0 -109
- package/esm2022/utils/id-creator.mjs +0 -11
- package/esm2022/utils/index.mjs +0 -35
- package/esm2022/utils/iterable.mjs +0 -32
- package/esm2022/utils/math.mjs +0 -480
- package/esm2022/utils/mobile.mjs +0 -6
- package/esm2022/utils/moving-element.mjs +0 -17
- package/esm2022/utils/pointer.mjs +0 -13
- package/esm2022/utils/position.mjs +0 -9
- package/esm2022/utils/selected-element.mjs +0 -145
- package/esm2022/utils/selection.mjs +0 -151
- package/esm2022/utils/snap/snap-moving.mjs +0 -199
- package/esm2022/utils/snap/snap.mjs +0 -211
- package/esm2022/utils/to-image.mjs +0 -204
- package/esm2022/utils/to-point.mjs +0 -74
- package/esm2022/utils/tree.mjs +0 -22
- package/esm2022/utils/viewport.mjs +0 -227
- package/esm2022/utils/weak-maps.mjs +0 -27
- package/esm2022/utils/z-index.mjs +0 -166
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard } from '../interfaces/board';
|
|
2
|
-
import { isInPlaitBoard } from '../utils/board';
|
|
3
|
-
import { createG, isMainPointer } from '../utils/dom/common';
|
|
4
|
-
import { Transforms } from '../transforms';
|
|
5
|
-
import { PlaitElement } from '../interfaces/element';
|
|
6
|
-
import { getHitElementByPoint, getSelectedElements } from '../utils/selected-element';
|
|
7
|
-
import { PlaitNode } from '../interfaces/node';
|
|
8
|
-
import { throttleRAF } from '../utils/common';
|
|
9
|
-
import { cacheMovingElements, getMovingElements, isMovingElements, removeMovingElements } from '../utils/moving-element';
|
|
10
|
-
import { MERGING } from '../interfaces/history';
|
|
11
|
-
import { getRectangleByElements, distanceBetweenPointAndPoint, toHostPoint, toViewBoxPoint, hotkeys, getElementsInGroupByElement, getRectangleByAngle, getSelectionAngle, duplicateElements, drawRectangle, depthFirstRecursion, getAngleByElement, setAngleForG, NODE_TO_INDEX } from '../utils';
|
|
12
|
-
import { getSnapMovingRef } from '../utils/snap/snap-moving';
|
|
13
|
-
import { PlaitGroupElement, PlaitPointerType, RectangleClient, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR } from '../interfaces';
|
|
14
|
-
import { ACTIVE_MOVING_CLASS_NAME, PRESS_AND_MOVE_BUFFER } from '../constants';
|
|
15
|
-
import { addSelectionWithTemporaryElements } from '../transforms/selection';
|
|
16
|
-
import { isKeyHotkey } from 'is-hotkey';
|
|
17
|
-
export function withMoving(board) {
|
|
18
|
-
const { pointerDown, pointerMove, globalPointerUp, globalPointerMove, globalKeyDown, keyUp } = board;
|
|
19
|
-
let offsetX = 0;
|
|
20
|
-
let offsetY = 0;
|
|
21
|
-
let isPreventDefault = false;
|
|
22
|
-
let startPoint;
|
|
23
|
-
let activeElements = [];
|
|
24
|
-
let snapG = null;
|
|
25
|
-
let activeElementsRectangle = null;
|
|
26
|
-
let selectedTargetElements = null;
|
|
27
|
-
let hitTargetElement = undefined;
|
|
28
|
-
let isHitSelectedTarget = undefined;
|
|
29
|
-
let pendingNodesG = null;
|
|
30
|
-
board.globalKeyDown = (event) => {
|
|
31
|
-
if (!PlaitBoard.isReadonly(board)) {
|
|
32
|
-
if (isKeyHotkey('option', event)) {
|
|
33
|
-
event.preventDefault();
|
|
34
|
-
if (startPoint && activeElements.length && !PlaitBoard.hasBeenTextEditing(board)) {
|
|
35
|
-
pendingNodesG = drawPendingNodesG(board, activeElements, offsetX, offsetY);
|
|
36
|
-
pendingNodesG && PlaitBoard.getElementTopHost(board).append(pendingNodesG);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
globalKeyDown(event);
|
|
41
|
-
};
|
|
42
|
-
board.keyUp = (event) => {
|
|
43
|
-
if (!PlaitBoard.isReadonly(board)) {
|
|
44
|
-
if (pendingNodesG && startPoint && activeElements.length && !PlaitBoard.hasBeenTextEditing(board)) {
|
|
45
|
-
event.preventDefault();
|
|
46
|
-
const currentElements = updatePoints(board, activeElements, offsetX, offsetY);
|
|
47
|
-
PlaitBoard.getBoardContainer(board).classList.add('element-moving');
|
|
48
|
-
cacheMovingElements(board, currentElements);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
pendingNodesG?.remove();
|
|
52
|
-
keyUp(event);
|
|
53
|
-
};
|
|
54
|
-
board.pointerDown = (event) => {
|
|
55
|
-
if (PlaitBoard.isReadonly(board) || !PlaitBoard.isPointer(board, PlaitPointerType.selection) || !isMainPointer(event)) {
|
|
56
|
-
pointerDown(event);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
|
|
60
|
-
hitTargetElement = getHitElementByPoint(board, point, el => board.isMovable(el));
|
|
61
|
-
selectedTargetElements = getSelectedTargetElements(board);
|
|
62
|
-
isHitSelectedTarget = hitTargetElement && selectedTargetElements.includes(hitTargetElement);
|
|
63
|
-
if (hitTargetElement && isHitSelectedTarget) {
|
|
64
|
-
startPoint = point;
|
|
65
|
-
activeElements = selectedTargetElements;
|
|
66
|
-
activeElementsRectangle = getRectangleByElements(board, activeElements, true);
|
|
67
|
-
}
|
|
68
|
-
else if (hitTargetElement) {
|
|
69
|
-
startPoint = point;
|
|
70
|
-
const relatedElements = board.getRelatedFragment([], [hitTargetElement]);
|
|
71
|
-
activeElements = [...getElementsInGroupByElement(board, hitTargetElement), ...relatedElements];
|
|
72
|
-
activeElementsRectangle = getRectangleByElements(board, activeElements, true);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
// 只有判定用户未击中元素之后才可以验证用户是否击中了已选元素所在的空白区域
|
|
76
|
-
// Only after it is determined that the user has not hit the element can it be verified whether the user hit the blank area where the selected element is located.
|
|
77
|
-
const targetRectangle = selectedTargetElements.length > 0 && getRectangleByElements(board, selectedTargetElements, false);
|
|
78
|
-
const isHitInTargetRectangle = targetRectangle && RectangleClient.isPointInRectangle(targetRectangle, point);
|
|
79
|
-
if (isHitInTargetRectangle) {
|
|
80
|
-
startPoint = point;
|
|
81
|
-
activeElements = selectedTargetElements;
|
|
82
|
-
activeElementsRectangle = targetRectangle;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
pointerDown(event);
|
|
86
|
-
};
|
|
87
|
-
board.pointerMove = (event) => {
|
|
88
|
-
if (startPoint && activeElements.length && !PlaitBoard.hasBeenTextEditing(board)) {
|
|
89
|
-
if (!isPreventDefault) {
|
|
90
|
-
isPreventDefault = true;
|
|
91
|
-
}
|
|
92
|
-
snapG?.remove();
|
|
93
|
-
pendingNodesG?.remove();
|
|
94
|
-
const endPoint = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
|
|
95
|
-
offsetX = endPoint[0] - startPoint[0];
|
|
96
|
-
offsetY = endPoint[1] - startPoint[1];
|
|
97
|
-
const distance = distanceBetweenPointAndPoint(...endPoint, ...startPoint);
|
|
98
|
-
if (distance > PRESS_AND_MOVE_BUFFER || getMovingElements(board).length > 0) {
|
|
99
|
-
if (hitTargetElement && !isHitSelectedTarget && selectedTargetElements && selectedTargetElements.length > 0) {
|
|
100
|
-
addSelectionWithTemporaryElements(board, []);
|
|
101
|
-
hitTargetElement = undefined;
|
|
102
|
-
selectedTargetElements = null;
|
|
103
|
-
isHitSelectedTarget = undefined;
|
|
104
|
-
}
|
|
105
|
-
throttleRAF(board, 'with-moving', () => {
|
|
106
|
-
if (!activeElementsRectangle) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
const newRectangle = {
|
|
110
|
-
...activeElementsRectangle,
|
|
111
|
-
x: activeElementsRectangle.x + offsetX,
|
|
112
|
-
y: activeElementsRectangle.y + offsetY
|
|
113
|
-
};
|
|
114
|
-
const activeRectangle = getRectangleByAngle(newRectangle, getSelectionAngle(activeElements));
|
|
115
|
-
const ref = getSnapMovingRef(board, activeRectangle, activeElements);
|
|
116
|
-
offsetX += ref.deltaX;
|
|
117
|
-
offsetY += ref.deltaY;
|
|
118
|
-
snapG = ref.snapG;
|
|
119
|
-
snapG.classList.add(ACTIVE_MOVING_CLASS_NAME);
|
|
120
|
-
PlaitBoard.getElementTopHost(board).append(snapG);
|
|
121
|
-
if (event.altKey) {
|
|
122
|
-
pendingNodesG = drawPendingNodesG(board, activeElements, offsetX, offsetY);
|
|
123
|
-
pendingNodesG && PlaitBoard.getElementTopHost(board).append(pendingNodesG);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
const currentElements = updatePoints(board, activeElements, offsetX, offsetY);
|
|
127
|
-
PlaitBoard.getBoardContainer(board).classList.add('element-moving');
|
|
128
|
-
cacheMovingElements(board, currentElements);
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
if (isPreventDefault) {
|
|
134
|
-
// Prevent canvas scrolling behavior from being triggered during move
|
|
135
|
-
event.preventDefault();
|
|
136
|
-
}
|
|
137
|
-
pointerMove(event);
|
|
138
|
-
};
|
|
139
|
-
board.globalPointerMove = (event) => {
|
|
140
|
-
if (startPoint) {
|
|
141
|
-
const inPlaitBoardElement = isInPlaitBoard(board, event.x, event.y);
|
|
142
|
-
if (!inPlaitBoardElement) {
|
|
143
|
-
cancelMove(board);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
globalPointerMove(event);
|
|
147
|
-
};
|
|
148
|
-
board.globalPointerUp = event => {
|
|
149
|
-
if (event.altKey && activeElements.length) {
|
|
150
|
-
const validElements = getValidElements(board, activeElements);
|
|
151
|
-
const rectangle = getRectangleByElements(board, validElements, false);
|
|
152
|
-
duplicateElements(board, validElements, [rectangle.x + offsetX, rectangle.y + offsetY]);
|
|
153
|
-
}
|
|
154
|
-
isPreventDefault = false;
|
|
155
|
-
hitTargetElement = undefined;
|
|
156
|
-
selectedTargetElements = null;
|
|
157
|
-
isHitSelectedTarget = undefined;
|
|
158
|
-
if (startPoint) {
|
|
159
|
-
cancelMove(board);
|
|
160
|
-
}
|
|
161
|
-
globalPointerUp(event);
|
|
162
|
-
};
|
|
163
|
-
function cancelMove(board) {
|
|
164
|
-
snapG?.remove();
|
|
165
|
-
pendingNodesG?.remove();
|
|
166
|
-
startPoint = null;
|
|
167
|
-
activeElementsRectangle = null;
|
|
168
|
-
offsetX = 0;
|
|
169
|
-
offsetY = 0;
|
|
170
|
-
activeElements = [];
|
|
171
|
-
if (isMovingElements(board)) {
|
|
172
|
-
removeMovingElements(board);
|
|
173
|
-
}
|
|
174
|
-
MERGING.set(board, false);
|
|
175
|
-
PlaitBoard.getBoardContainer(board).classList.remove('element-moving');
|
|
176
|
-
}
|
|
177
|
-
return withArrowMoving(board);
|
|
178
|
-
}
|
|
179
|
-
export function withArrowMoving(board) {
|
|
180
|
-
const { keyDown, keyUp } = board;
|
|
181
|
-
board.keyDown = (event) => {
|
|
182
|
-
const selectedElements = getSelectedElements(board);
|
|
183
|
-
if (!PlaitBoard.isReadonly(board) && selectedElements.length > 0 && (hotkeys.isArrow(event) || hotkeys.isExtendArrow(event))) {
|
|
184
|
-
event.preventDefault();
|
|
185
|
-
const isShift = event.shiftKey ? true : false;
|
|
186
|
-
const offset = [0, 0];
|
|
187
|
-
const buffer = isShift ? 10 : 1;
|
|
188
|
-
switch (true) {
|
|
189
|
-
case hotkeys.isMoveUp(event) || hotkeys.isExtendUp(event): {
|
|
190
|
-
offset[1] = -buffer;
|
|
191
|
-
break;
|
|
192
|
-
}
|
|
193
|
-
case hotkeys.isMoveDown(event) || hotkeys.isExtendDown(event): {
|
|
194
|
-
offset[1] = buffer;
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
case hotkeys.isMoveBackward(event) || hotkeys.isExtendBackward(event): {
|
|
198
|
-
offset[0] = -buffer;
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
case hotkeys.isMoveForward(event) || hotkeys.isExtendForward(event): {
|
|
202
|
-
offset[0] = buffer;
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
const targetElements = getSelectedTargetElements(board);
|
|
207
|
-
throttleRAF(board, 'with-arrow-moving', () => {
|
|
208
|
-
updatePoints(board, targetElements, offset[0], offset[1]);
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
keyDown(event);
|
|
212
|
-
};
|
|
213
|
-
board.keyUp = (event) => {
|
|
214
|
-
MERGING.set(board, false);
|
|
215
|
-
keyUp(event);
|
|
216
|
-
};
|
|
217
|
-
return board;
|
|
218
|
-
}
|
|
219
|
-
export function getSelectedTargetElements(board) {
|
|
220
|
-
const selectedElements = getSelectedElements(board);
|
|
221
|
-
const movableElements = board.children.filter(item => board.isMovable(item));
|
|
222
|
-
const targetElements = selectedElements.filter(element => {
|
|
223
|
-
return movableElements.includes(element);
|
|
224
|
-
});
|
|
225
|
-
const relatedElements = board.getRelatedFragment([]);
|
|
226
|
-
targetElements.push(...relatedElements);
|
|
227
|
-
return targetElements;
|
|
228
|
-
}
|
|
229
|
-
export function getValidElements(board, activeElements) {
|
|
230
|
-
const validElements = [...activeElements].filter(element => !PlaitGroupElement.isGroup(element) && PlaitElement.isRootElement(element));
|
|
231
|
-
return validElements;
|
|
232
|
-
}
|
|
233
|
-
export function updatePoints(board, activeElements, offsetX, offsetY) {
|
|
234
|
-
const validElements = getValidElements(board, activeElements);
|
|
235
|
-
const currentElements = validElements.map(element => {
|
|
236
|
-
const points = element.points || [];
|
|
237
|
-
const newPoints = points.map(p => [p[0] + offsetX, p[1] + offsetY]);
|
|
238
|
-
const index = NODE_TO_INDEX.get(element);
|
|
239
|
-
Transforms.setNode(board, {
|
|
240
|
-
points: newPoints
|
|
241
|
-
}, [index]);
|
|
242
|
-
MERGING.set(board, true);
|
|
243
|
-
return PlaitNode.get(board, [index]);
|
|
244
|
-
});
|
|
245
|
-
return currentElements;
|
|
246
|
-
}
|
|
247
|
-
export function drawPendingNodesG(board, activeElements, offsetX, offsetY) {
|
|
248
|
-
let pendingNodesG = null;
|
|
249
|
-
const elements = [];
|
|
250
|
-
const validElements = getValidElements(board, activeElements);
|
|
251
|
-
validElements.forEach(element => {
|
|
252
|
-
depthFirstRecursion(element, node => {
|
|
253
|
-
elements.push(node);
|
|
254
|
-
}, () => true);
|
|
255
|
-
});
|
|
256
|
-
elements.forEach(item => {
|
|
257
|
-
let rectangle = board.getRectangle(item);
|
|
258
|
-
if (rectangle) {
|
|
259
|
-
rectangle = {
|
|
260
|
-
x: rectangle.x + offsetX,
|
|
261
|
-
y: rectangle.y + offsetY,
|
|
262
|
-
width: rectangle.width,
|
|
263
|
-
height: rectangle.height
|
|
264
|
-
};
|
|
265
|
-
const movingG = drawRectangle(board, rectangle, {
|
|
266
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
267
|
-
strokeWidth: 1,
|
|
268
|
-
fill: SELECTION_FILL_COLOR,
|
|
269
|
-
fillStyle: 'solid'
|
|
270
|
-
});
|
|
271
|
-
if (!pendingNodesG) {
|
|
272
|
-
pendingNodesG = createG();
|
|
273
|
-
pendingNodesG.classList.add(ACTIVE_MOVING_CLASS_NAME);
|
|
274
|
-
}
|
|
275
|
-
const angle = getAngleByElement(item);
|
|
276
|
-
angle && setAngleForG(movingG, RectangleClient.getCenterPoint(rectangle), angle);
|
|
277
|
-
pendingNodesG.append(movingG);
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
return pendingNodesG;
|
|
281
|
-
}
|
|
282
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1tb3ZpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9wbHVnaW5zL3dpdGgtbW92aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRCxPQUFPLEVBQ0gsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUM1QixXQUFXLEVBQ1gsY0FBYyxFQUNkLE9BQU8sRUFDUCwyQkFBMkIsRUFDM0IsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLGFBQWEsRUFDaEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFF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LENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxhQUFhLENBQUM7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2JvYXJkJztcbmltcG9ydCB7IGlzSW5QbGFpdEJvYXJkIH0gZnJvbSAnLi4vdXRpbHMvYm9hcmQnO1xuaW1wb3J0IHsgY3JlYXRlRywgaXNNYWluUG9pbnRlciB9IGZyb20gJy4uL3V0aWxzL2RvbS9jb21tb24nO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BvaW50JztcbmltcG9ydCB7IFRyYW5zZm9ybXMgfSBmcm9tICcuLi90cmFuc2Zvcm1zJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBnZXRIaXRFbGVtZW50QnlQb2ludCwgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGVkLWVsZW1lbnQnO1xuaW1wb3J0IHsgUGxhaXROb2RlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ub2RlJztcbmltcG9ydCB7IHRocm90dGxlUkFGIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJztcbmltcG9ydCB7IGNhY2hlTW92aW5nRWxlbWVudHMsIGdldE1vdmluZ0VsZW1lbnRzLCBpc01vdmluZ0VsZW1lbnRzLCByZW1vdmVNb3ZpbmdFbGVtZW50cyB9IGZyb20gJy4uL3V0aWxzL21vdmluZy1lbGVtZW50JztcbmltcG9ydCB7IE1FUkdJTkcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2hpc3RvcnknO1xuaW1wb3J0IHtcbiAgICBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzLFxuICAgIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQsXG4gICAgdG9Ib3N0UG9pbnQsXG4gICAgdG9WaWV3Qm94UG9pbnQsXG4gICAgaG90a2V5cyxcbiAgICBnZXRFbGVtZW50c0luR3JvdXBCeUVsZW1lbnQsXG4gICAgZ2V0UmVjdGFuZ2xlQnlBbmdsZSxcbiAgICBnZXRTZWxlY3Rpb25BbmdsZSxcbiAgICBkdXBsaWNhdGVFbGVtZW50cyxcbiAgICBkcmF3UmVjdGFuZ2xlLFxuICAgIGRlcHRoRmlyc3RSZWN1cnNpb24sXG4gICAgZ2V0QW5nbGVCeUVsZW1lbnQsXG4gICAgc2V0QW5nbGVGb3JHLFxuICAgIE5PREVfVE9fSU5ERVhcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0U25hcE1vdmluZ1JlZiB9IGZyb20gJy4uL3V0aWxzL3NuYXAvc25hcC1tb3ZpbmcnO1xuaW1wb3J0IHsgUGxhaXRHcm91cEVsZW1lbnQsIFBsYWl0UG9pbnRlclR5cGUsIFJlY3RhbmdsZUNsaWVudCwgU0VMRUNUSU9OX0JPUkRFUl9DT0xPUiwgU0VMRUNUSU9OX0ZJTExfQ09MT1IgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFDVElWRV9NT1ZJTkdfQ0xBU1NfTkFNRSwgUFJFU1NfQU5EX01PVkVfQlVGRkVSIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGFkZFNlbGVjdGlvbldpdGhUZW1wb3JhcnlFbGVtZW50cyB9IGZyb20gJy4uL3RyYW5zZm9ybXMvc2VsZWN0aW9uJztcbmltcG9ydCB7IGlzS2V5SG90a2V5IH0gZnJvbSAnaXMtaG90a2V5JztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhNb3ZpbmcoYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBjb25zdCB7IHBvaW50ZXJEb3duLCBwb2ludGVyTW92ZSwgZ2xvYmFsUG9pbnRlclVwLCBnbG9iYWxQb2ludGVyTW92ZSwgZ2xvYmFsS2V5RG93biwga2V5VXAgfSA9IGJvYXJkO1xuXG4gICAgbGV0IG9mZnNldFggPSAwO1xuICAgIGxldCBvZmZzZXRZID0gMDtcbiAgICBsZXQgaXNQcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuICAgIGxldCBzdGFydFBvaW50OiBQb2ludCB8IG51bGw7XG4gICAgbGV0IGFjdGl2ZUVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSA9IFtdO1xuICAgIGxldCBzbmFwRzogU1ZHR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgYWN0aXZlRWxlbWVudHNSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzZWxlY3RlZFRhcmdldEVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoaXRUYXJnZXRFbGVtZW50OiBQbGFpdEVsZW1lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGlzSGl0U2VsZWN0ZWRUYXJnZXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHBlbmRpbmdOb2Rlc0c6IFNWR0dFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICBib2FyZC5nbG9iYWxLZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghUGxhaXRCb2FyZC5pc1JlYWRvbmx5KGJvYXJkKSkge1xuICAgICAgICAgICAgaWYgKGlzS2V5SG90a2V5KCdvcHRpb24nLCBldmVudCkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydFBvaW50ICYmIGFjdGl2ZUVsZW1lbnRzLmxlbmd0aCAmJiAhUGxhaXRCb2FyZC5oYXNCZWVuVGV4dEVkaXRpbmcoYm9hcmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdOb2Rlc0cgPSBkcmF3UGVuZGluZ05vZGVzRyhib2FyZCwgYWN0aXZlRWxlbWVudHMsIG9mZnNldFgsIG9mZnNldFkpO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTm9kZXNHICYmIFBsYWl0Qm9hcmQuZ2V0RWxlbWVudFRvcEhvc3QoYm9hcmQpLmFwcGVuZChwZW5kaW5nTm9kZXNHKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2xvYmFsS2V5RG93bihldmVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmtleVVwID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghUGxhaXRCb2FyZC5pc1JlYWRvbmx5KGJvYXJkKSkge1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdOb2Rlc0cgJiYgc3RhcnRQb2ludCAmJiBhY3RpdmVFbGVtZW50cy5sZW5ndGggJiYgIVBsYWl0Qm9hcmQuaGFzQmVlblRleHRFZGl0aW5nKGJvYXJkKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnRzID0gdXBkYXRlUG9pbnRzKGJvYXJkLCBhY3RpdmVFbGVtZW50cywgb2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICAgICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LmFkZCgnZWxlbWVudC1tb3ZpbmcnKTtcbiAgICAgICAgICAgICAgICBjYWNoZU1vdmluZ0VsZW1lbnRzKGJvYXJkLCBjdXJyZW50RWxlbWVudHMgYXMgUGxhaXRFbGVtZW50W10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBlbmRpbmdOb2Rlc0c/LnJlbW92ZSgpO1xuICAgICAgICBrZXlVcChldmVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLnBvaW50ZXJEb3duID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKFBsYWl0Qm9hcmQuaXNSZWFkb25seShib2FyZCkgfHwgIVBsYWl0Qm9hcmQuaXNQb2ludGVyKGJvYXJkLCBQbGFpdFBvaW50ZXJUeXBlLnNlbGVjdGlvbikgfHwgIWlzTWFpblBvaW50ZXIoZXZlbnQpKSB7XG4gICAgICAgICAgICBwb2ludGVyRG93bihldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnQgPSB0b1ZpZXdCb3hQb2ludChib2FyZCwgdG9Ib3N0UG9pbnQoYm9hcmQsIGV2ZW50LngsIGV2ZW50LnkpKTtcbiAgICAgICAgaGl0VGFyZ2V0RWxlbWVudCA9IGdldEhpdEVsZW1lbnRCeVBvaW50KGJvYXJkLCBwb2ludCwgZWwgPT4gYm9hcmQuaXNNb3ZhYmxlKGVsKSk7XG4gICAgICAgIHNlbGVjdGVkVGFyZ2V0RWxlbWVudHMgPSBnZXRTZWxlY3RlZFRhcmdldEVsZW1lbnRzKGJvYXJkKTtcbiAgICAgICAgaXNIaXRTZWxlY3RlZFRhcmdldCA9IGhpdFRhcmdldEVsZW1lbnQgJiYgc2VsZWN0ZWRUYXJnZXRFbGVtZW50cy5pbmNsdWRlcyhoaXRUYXJnZXRFbGVtZW50KTtcbiAgICAgICAgaWYgKGhpdFRhcmdldEVsZW1lbnQgJiYgaXNIaXRTZWxlY3RlZFRhcmdldCkge1xuICAgICAgICAgICAgc3RhcnRQb2ludCA9IHBvaW50O1xuICAgICAgICAgICAgYWN0aXZlRWxlbWVudHMgPSBzZWxlY3RlZFRhcmdldEVsZW1lbnRzO1xuICAgICAgICAgICAgYWN0aXZlRWxlbWVudHNSZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBhY3RpdmVFbGVtZW50cywgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGl0VGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAgICAgc3RhcnRQb2ludCA9IHBvaW50O1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVsZW1lbnRzID0gYm9hcmQuZ2V0UmVsYXRlZEZyYWdtZW50KFtdLCBbaGl0VGFyZ2V0RWxlbWVudF0pO1xuICAgICAgICAgICAgYWN0aXZlRWxlbWVudHMgPSBbLi4uZ2V0RWxlbWVudHNJbkdyb3VwQnlFbGVtZW50KGJvYXJkLCBoaXRUYXJnZXRFbGVtZW50KSwgLi4ucmVsYXRlZEVsZW1lbnRzXTtcbiAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzUmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyhib2FyZCwgYWN0aXZlRWxlbWVudHMsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g5Y+q5pyJ5Yik5a6a55So5oi35pyq5Ye75Lit5YWD57Sg5LmL5ZCO5omN5Y+v5Lul6aqM6K+B55So5oi35piv5ZCm5Ye75Lit5LqG5bey6YCJ5YWD57Sg5omA5Zyo55qE56m655m95Yy65Z+fXG4gICAgICAgICAgICAvLyBPbmx5IGFmdGVyIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGUgdXNlciBoYXMgbm90IGhpdCB0aGUgZWxlbWVudCBjYW4gaXQgYmUgdmVyaWZpZWQgd2hldGhlciB0aGUgdXNlciBoaXQgdGhlIGJsYW5rIGFyZWEgd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaXMgbG9jYXRlZC5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFJlY3RhbmdsZSA9IHNlbGVjdGVkVGFyZ2V0RWxlbWVudHMubGVuZ3RoID4gMCAmJiBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBzZWxlY3RlZFRhcmdldEVsZW1lbnRzLCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBpc0hpdEluVGFyZ2V0UmVjdGFuZ2xlID0gdGFyZ2V0UmVjdGFuZ2xlICYmIFJlY3RhbmdsZUNsaWVudC5pc1BvaW50SW5SZWN0YW5nbGUodGFyZ2V0UmVjdGFuZ2xlLCBwb2ludCk7XG4gICAgICAgICAgICBpZiAoaXNIaXRJblRhcmdldFJlY3RhbmdsZSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQgPSBwb2ludDtcbiAgICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50cyA9IHNlbGVjdGVkVGFyZ2V0RWxlbWVudHM7XG4gICAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudHNSZWN0YW5nbGUgPSB0YXJnZXRSZWN0YW5nbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRlckRvd24oZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5wb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChzdGFydFBvaW50ICYmIGFjdGl2ZUVsZW1lbnRzLmxlbmd0aCAmJiAhUGxhaXRCb2FyZC5oYXNCZWVuVGV4dEVkaXRpbmcoYm9hcmQpKSB7XG4gICAgICAgICAgICBpZiAoIWlzUHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBpc1ByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNuYXBHPy5yZW1vdmUoKTtcbiAgICAgICAgICAgIHBlbmRpbmdOb2Rlc0c/LnJlbW92ZSgpO1xuICAgICAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0b1ZpZXdCb3hQb2ludChib2FyZCwgdG9Ib3N0UG9pbnQoYm9hcmQsIGV2ZW50LngsIGV2ZW50LnkpKTtcbiAgICAgICAgICAgIG9mZnNldFggPSBlbmRQb2ludFswXSAtIHN0YXJ0UG9pbnRbMF07XG4gICAgICAgICAgICBvZmZzZXRZID0gZW5kUG9pbnRbMV0gLSBzdGFydFBvaW50WzFdO1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLmVuZFBvaW50LCAuLi5zdGFydFBvaW50KTtcbiAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+IFBSRVNTX0FORF9NT1ZFX0JVRkZFUiB8fCBnZXRNb3ZpbmdFbGVtZW50cyhib2FyZCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChoaXRUYXJnZXRFbGVtZW50ICYmICFpc0hpdFNlbGVjdGVkVGFyZ2V0ICYmIHNlbGVjdGVkVGFyZ2V0RWxlbWVudHMgJiYgc2VsZWN0ZWRUYXJnZXRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlbGVjdGlvbldpdGhUZW1wb3JhcnlFbGVtZW50cyhib2FyZCwgW10pO1xuICAgICAgICAgICAgICAgICAgICBoaXRUYXJnZXRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRhcmdldEVsZW1lbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaXNIaXRTZWxlY3RlZFRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3R0bGVSQUYoYm9hcmQsICd3aXRoLW1vdmluZycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVFbGVtZW50c1JlY3RhbmdsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JlY3RhbmdsZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmFjdGl2ZUVsZW1lbnRzUmVjdGFuZ2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDogYWN0aXZlRWxlbWVudHNSZWN0YW5nbGUueCArIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBhY3RpdmVFbGVtZW50c1JlY3RhbmdsZS55ICsgb2Zmc2V0WVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVSZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeUFuZ2xlKG5ld1JlY3RhbmdsZSwgZ2V0U2VsZWN0aW9uQW5nbGUoYWN0aXZlRWxlbWVudHMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmID0gZ2V0U25hcE1vdmluZ1JlZihib2FyZCwgYWN0aXZlUmVjdGFuZ2xlLCBhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFggKz0gcmVmLmRlbHRhWDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WSArPSByZWYuZGVsdGFZO1xuICAgICAgICAgICAgICAgICAgICBzbmFwRyA9IHJlZi5zbmFwRztcbiAgICAgICAgICAgICAgICAgICAgc25hcEcuY2xhc3NMaXN0LmFkZChBQ1RJVkVfTU9WSU5HX0NMQVNTX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBQbGFpdEJvYXJkLmdldEVsZW1lbnRUb3BIb3N0KGJvYXJkKS5hcHBlbmQoc25hcEcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTm9kZXNHID0gZHJhd1BlbmRpbmdOb2Rlc0coYm9hcmQsIGFjdGl2ZUVsZW1lbnRzLCBvZmZzZXRYLCBvZmZzZXRZKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdOb2Rlc0cgJiYgUGxhaXRCb2FyZC5nZXRFbGVtZW50VG9wSG9zdChib2FyZCkuYXBwZW5kKHBlbmRpbmdOb2Rlc0cpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnRzID0gdXBkYXRlUG9pbnRzKGJvYXJkLCBhY3RpdmVFbGVtZW50cywgb2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5jbGFzc0xpc3QuYWRkKCdlbGVtZW50LW1vdmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVNb3ZpbmdFbGVtZW50cyhib2FyZCwgY3VycmVudEVsZW1lbnRzIGFzIFBsYWl0RWxlbWVudFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc1ByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAvLyBQcmV2ZW50IGNhbnZhcyBzY3JvbGxpbmcgYmVoYXZpb3IgZnJvbSBiZWluZyB0cmlnZ2VyZWQgZHVyaW5nIG1vdmVcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRlck1vdmUoZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5nbG9iYWxQb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChzdGFydFBvaW50KSB7XG4gICAgICAgICAgICBjb25zdCBpblBsYWl0Qm9hcmRFbGVtZW50ID0gaXNJblBsYWl0Qm9hcmQoYm9hcmQsIGV2ZW50LngsIGV2ZW50LnkpO1xuICAgICAgICAgICAgaWYgKCFpblBsYWl0Qm9hcmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsTW92ZShib2FyZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2xvYmFsUG9pbnRlck1vdmUoZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5nbG9iYWxQb2ludGVyVXAgPSBldmVudCA9PiB7XG4gICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgYWN0aXZlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZEVsZW1lbnRzID0gZ2V0VmFsaWRFbGVtZW50cyhib2FyZCwgYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyhib2FyZCwgdmFsaWRFbGVtZW50cywgZmFsc2UpO1xuICAgICAgICAgICAgZHVwbGljYXRlRWxlbWVudHMoYm9hcmQsIHZhbGlkRWxlbWVudHMsIFtyZWN0YW5nbGUueCArIG9mZnNldFgsIHJlY3RhbmdsZS55ICsgb2Zmc2V0WV0pO1xuICAgICAgICB9XG4gICAgICAgIGlzUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgaGl0VGFyZ2V0RWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgc2VsZWN0ZWRUYXJnZXRFbGVtZW50cyA9IG51bGw7XG4gICAgICAgIGlzSGl0U2VsZWN0ZWRUYXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdGFydFBvaW50KSB7XG4gICAgICAgICAgICBjYW5jZWxNb3ZlKGJvYXJkKTtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxQb2ludGVyVXAoZXZlbnQpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYW5jZWxNb3ZlKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgICAgIHNuYXBHPy5yZW1vdmUoKTtcbiAgICAgICAgcGVuZGluZ05vZGVzRz8ucmVtb3ZlKCk7XG4gICAgICAgIHN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICBhY3RpdmVFbGVtZW50c1JlY3RhbmdsZSA9IG51bGw7XG4gICAgICAgIG9mZnNldFggPSAwO1xuICAgICAgICBvZmZzZXRZID0gMDtcbiAgICAgICAgYWN0aXZlRWxlbWVudHMgPSBbXTtcbiAgICAgICAgaWYgKGlzTW92aW5nRWxlbWVudHMoYm9hcmQpKSB7XG4gICAgICAgICAgICByZW1vdmVNb3ZpbmdFbGVtZW50cyhib2FyZCk7XG4gICAgICAgIH1cbiAgICAgICAgTUVSR0lORy5zZXQoYm9hcmQsIGZhbHNlKTtcbiAgICAgICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LnJlbW92ZSgnZWxlbWVudC1tb3ZpbmcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aEFycm93TW92aW5nKGJvYXJkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhBcnJvd01vdmluZyhib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IHsga2V5RG93biwga2V5VXAgfSA9IGJvYXJkO1xuICAgIGJvYXJkLmtleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpO1xuICAgICAgICBpZiAoIVBsYWl0Qm9hcmQuaXNSZWFkb25seShib2FyZCkgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmIChob3RrZXlzLmlzQXJyb3coZXZlbnQpIHx8IGhvdGtleXMuaXNFeHRlbmRBcnJvdyhldmVudCkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNTaGlmdCA9IGV2ZW50LnNoaWZ0S2V5ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gWzAsIDBdO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gaXNTaGlmdCA/IDEwIDogMTtcbiAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgaG90a2V5cy5pc01vdmVVcChldmVudCkgfHwgaG90a2V5cy5pc0V4dGVuZFVwKGV2ZW50KToge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRbMV0gPSAtYnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBob3RrZXlzLmlzTW92ZURvd24oZXZlbnQpIHx8IGhvdGtleXMuaXNFeHRlbmREb3duKGV2ZW50KToge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRbMV0gPSBidWZmZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIGhvdGtleXMuaXNNb3ZlQmFja3dhcmQoZXZlbnQpIHx8IGhvdGtleXMuaXNFeHRlbmRCYWNrd2FyZChldmVudCk6IHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WzBdID0gLWJ1ZmZlcjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgaG90a2V5cy5pc01vdmVGb3J3YXJkKGV2ZW50KSB8fCBob3RrZXlzLmlzRXh0ZW5kRm9yd2FyZChldmVudCk6IHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WzBdID0gYnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50cyA9IGdldFNlbGVjdGVkVGFyZ2V0RWxlbWVudHMoYm9hcmQpO1xuICAgICAgICAgICAgdGhyb3R0bGVSQUYoYm9hcmQsICd3aXRoLWFycm93LW1vdmluZycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb2ludHMoYm9hcmQsIHRhcmdldEVsZW1lbnRzLCBvZmZzZXRbMF0sIG9mZnNldFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBrZXlEb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQua2V5VXAgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgTUVSR0lORy5zZXQoYm9hcmQsIGZhbHNlKTtcbiAgICAgICAga2V5VXAoZXZlbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIGJvYXJkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRUYXJnZXRFbGVtZW50cyhib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKTtcbiAgICBjb25zdCBtb3ZhYmxlRWxlbWVudHMgPSBib2FyZC5jaGlsZHJlbi5maWx0ZXIoaXRlbSA9PiBib2FyZC5pc01vdmFibGUoaXRlbSkpO1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gc2VsZWN0ZWRFbGVtZW50cy5maWx0ZXIoZWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiBtb3ZhYmxlRWxlbWVudHMuaW5jbHVkZXMoZWxlbWVudCk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVsYXRlZEVsZW1lbnRzID0gYm9hcmQuZ2V0UmVsYXRlZEZyYWdtZW50KFtdKTtcbiAgICB0YXJnZXRFbGVtZW50cy5wdXNoKC4uLnJlbGF0ZWRFbGVtZW50cyk7XG4gICAgcmV0dXJuIHRhcmdldEVsZW1lbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsaWRFbGVtZW50cyhib2FyZDogUGxhaXRCb2FyZCwgYWN0aXZlRWxlbWVudHM6IFBsYWl0RWxlbWVudFtdKSB7XG4gICAgY29uc3QgdmFsaWRFbGVtZW50cyA9IFsuLi5hY3RpdmVFbGVtZW50c10uZmlsdGVyKGVsZW1lbnQgPT4gIVBsYWl0R3JvdXBFbGVtZW50LmlzR3JvdXAoZWxlbWVudCkgJiYgUGxhaXRFbGVtZW50LmlzUm9vdEVsZW1lbnQoZWxlbWVudCkpO1xuICAgIHJldHVybiB2YWxpZEVsZW1lbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUG9pbnRzKGJvYXJkOiBQbGFpdEJvYXJkLCBhY3RpdmVFbGVtZW50czogUGxhaXRFbGVtZW50W10sIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsaWRFbGVtZW50cyA9IGdldFZhbGlkRWxlbWVudHMoYm9hcmQsIGFjdGl2ZUVsZW1lbnRzKTtcbiAgICBjb25zdCBjdXJyZW50RWxlbWVudHMgPSB2YWxpZEVsZW1lbnRzLm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZWxlbWVudC5wb2ludHMgfHwgW107XG4gICAgICAgIGNvbnN0IG5ld1BvaW50cyA9IHBvaW50cy5tYXAocCA9PiBbcFswXSArIG9mZnNldFgsIHBbMV0gKyBvZmZzZXRZXSkgYXMgUG9pbnRbXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOT0RFX1RPX0lOREVYLmdldChlbGVtZW50IGFzIFBsYWl0RWxlbWVudCkgYXMgbnVtYmVyO1xuICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUoXG4gICAgICAgICAgICBib2FyZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwb2ludHM6IG5ld1BvaW50c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtpbmRleF1cbiAgICAgICAgKTtcbiAgICAgICAgTUVSR0lORy5zZXQoYm9hcmQsIHRydWUpO1xuICAgICAgICByZXR1cm4gUGxhaXROb2RlLmdldChib2FyZCwgW2luZGV4XSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdQZW5kaW5nTm9kZXNHKGJvYXJkOiBQbGFpdEJvYXJkLCBhY3RpdmVFbGVtZW50czogUGxhaXRFbGVtZW50W10sIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSB7XG4gICAgbGV0IHBlbmRpbmdOb2Rlc0c6IFNWR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBlbGVtZW50czogUGxhaXRFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdCB2YWxpZEVsZW1lbnRzID0gZ2V0VmFsaWRFbGVtZW50cyhib2FyZCwgYWN0aXZlRWxlbWVudHMpO1xuICAgIHZhbGlkRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgZGVwdGhGaXJzdFJlY3Vyc2lvbihcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHRydWVcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBsZXQgcmVjdGFuZ2xlID0gYm9hcmQuZ2V0UmVjdGFuZ2xlKGl0ZW0pO1xuICAgICAgICBpZiAocmVjdGFuZ2xlKSB7XG4gICAgICAgICAgICByZWN0YW5nbGUgPSB7XG4gICAgICAgICAgICAgICAgeDogcmVjdGFuZ2xlLnggKyBvZmZzZXRYLFxuICAgICAgICAgICAgICAgIHk6IHJlY3RhbmdsZS55ICsgb2Zmc2V0WSxcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogcmVjdGFuZ2xlLmhlaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG1vdmluZ0cgPSBkcmF3UmVjdGFuZ2xlKGJvYXJkLCByZWN0YW5nbGUhLCB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICAgICAgICAgIGZpbGw6IFNFTEVDVElPTl9GSUxMX0NPTE9SLFxuICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmdOb2Rlc0cpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nTm9kZXNHID0gY3JlYXRlRygpO1xuICAgICAgICAgICAgICAgIHBlbmRpbmdOb2Rlc0cuY2xhc3NMaXN0LmFkZChBQ1RJVkVfTU9WSU5HX0NMQVNTX05BTUUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYW5nbGUgPSBnZXRBbmdsZUJ5RWxlbWVudChpdGVtKTtcbiAgICAgICAgICAgIGFuZ2xlICYmIHNldEFuZ2xlRm9yRyhtb3ZpbmdHLCBSZWN0YW5nbGVDbGllbnQuZ2V0Q2VudGVyUG9pbnQocmVjdGFuZ2xlKSwgYW5nbGUpO1xuICAgICAgICAgICAgcGVuZGluZ05vZGVzRy5hcHBlbmQobW92aW5nRyk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcGVuZGluZ05vZGVzRztcbn1cbiJdfQ==
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export const withOptions = (board) => {
|
|
2
|
-
const pluginOptions = new Map();
|
|
3
|
-
const newBoard = board;
|
|
4
|
-
newBoard.getPluginOptions = key => {
|
|
5
|
-
return pluginOptions.get(key);
|
|
6
|
-
};
|
|
7
|
-
newBoard.setPluginOptions = (key, options) => {
|
|
8
|
-
const oldOptions = newBoard.getPluginOptions(key) || {};
|
|
9
|
-
pluginOptions.set(key, { ...oldOptions, ...options });
|
|
10
|
-
};
|
|
11
|
-
return newBoard;
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvcGx1Z2lucy93aXRoLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsS0FBMEIsQ0FBQztJQUU1QyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLEVBQUU7UUFDOUIsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQztJQUVGLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN6QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hELGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxVQUFVLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQztJQUVGLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2JvYXJkJztcbmltcG9ydCB7IFdpdGhQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wbHVnaW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWl0T3B0aW9uc0JvYXJkIGV4dGVuZHMgUGxhaXRCb2FyZCB7XG4gICAgZ2V0UGx1Z2luT3B0aW9uczogPEsgPSBXaXRoUGx1Z2luT3B0aW9ucz4oa2V5OiBzdHJpbmcpID0+IEs7XG4gICAgc2V0UGx1Z2luT3B0aW9uczogPEsgPSBXaXRoUGx1Z2luT3B0aW9ucz4oa2V5OiBzdHJpbmcsIHZhbHVlOiBQYXJ0aWFsPEs+KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3Qgd2l0aE9wdGlvbnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCBwbHVnaW5PcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBjb25zdCBuZXdCb2FyZCA9IGJvYXJkIGFzIFBsYWl0T3B0aW9uc0JvYXJkO1xuXG4gICAgbmV3Qm9hcmQuZ2V0UGx1Z2luT3B0aW9ucyA9IGtleSA9PiB7XG4gICAgICAgIHJldHVybiBwbHVnaW5PcHRpb25zLmdldChrZXkpO1xuICAgIH07XG5cbiAgICBuZXdCb2FyZC5zZXRQbHVnaW5PcHRpb25zID0gKGtleSwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBvbGRPcHRpb25zID0gbmV3Qm9hcmQuZ2V0UGx1Z2luT3B0aW9ucyhrZXkpIHx8IHt9O1xuICAgICAgICBwbHVnaW5PcHRpb25zLnNldChrZXksIHsgLi4ub2xkT3B0aW9ucywgLi4ub3B0aW9ucyB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ld0JvYXJkO1xufTtcbiJdfQ==
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { WritableClipboardType, addOrCreateClipboardContext } from '../utils';
|
|
2
|
-
export function withRelatedFragment(board) {
|
|
3
|
-
const { buildFragment } = board;
|
|
4
|
-
board.buildFragment = (clipboardContext, rectangle, operationType, originData) => {
|
|
5
|
-
let relatedFragment = board.getRelatedFragment(originData || []);
|
|
6
|
-
if (relatedFragment) {
|
|
7
|
-
if (originData?.length) {
|
|
8
|
-
relatedFragment = relatedFragment.filter(item => !originData.map(element => element.id).includes(item.id));
|
|
9
|
-
}
|
|
10
|
-
if (relatedFragment.length) {
|
|
11
|
-
const addition = {
|
|
12
|
-
text: '',
|
|
13
|
-
type: WritableClipboardType.elements,
|
|
14
|
-
elements: relatedFragment
|
|
15
|
-
};
|
|
16
|
-
clipboardContext = addOrCreateClipboardContext(clipboardContext, addition);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return buildFragment(clipboardContext, rectangle, operationType, originData);
|
|
20
|
-
};
|
|
21
|
-
return board;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1yZWxhdGVkLWZyYWdtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvcGx1Z2lucy93aXRoLXJlbGF0ZWQtZnJhZ21lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUE0QixxQkFBcUIsRUFBa0MsMkJBQTJCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEksTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWlCO0lBQ2pELE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFaEMsS0FBSyxDQUFDLGFBQWEsR0FBRyxDQUNsQixnQkFBaUQsRUFDakQsU0FBaUMsRUFDakMsYUFBNkMsRUFDN0MsVUFBMkIsRUFDN0IsRUFBRTtRQUNBLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakUsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNsQixJQUFJLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDckIsZUFBZSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9HLENBQUM7WUFDRCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxRQUFRLEdBQTZCO29CQUN2QyxJQUFJLEVBQUUsRUFBRTtvQkFDUixJQUFJLEVBQUUscUJBQXFCLENBQUMsUUFBUTtvQkFDcEMsUUFBUSxFQUFFLGVBQWU7aUJBQzVCLENBQUM7Z0JBQ0YsZ0JBQWdCLEdBQUcsMkJBQTJCLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pGLENBQUMsQ0FBQztJQUVGLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQsIFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgV3JpdGFibGVDbGlwYm9hcmRDb250ZXh0LCBXcml0YWJsZUNsaXBib2FyZFR5cGUsIFdyaXRhYmxlQ2xpcGJvYXJkT3BlcmF0aW9uVHlwZSwgYWRkT3JDcmVhdGVDbGlwYm9hcmRDb250ZXh0IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlbGF0ZWRGcmFnbWVudChib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IHsgYnVpbGRGcmFnbWVudCB9ID0gYm9hcmQ7XG5cbiAgICBib2FyZC5idWlsZEZyYWdtZW50ID0gKFxuICAgICAgICBjbGlwYm9hcmRDb250ZXh0OiBXcml0YWJsZUNsaXBib2FyZENvbnRleHQgfCBudWxsLFxuICAgICAgICByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCB8IG51bGwsXG4gICAgICAgIG9wZXJhdGlvblR5cGU6IFdyaXRhYmxlQ2xpcGJvYXJkT3BlcmF0aW9uVHlwZSxcbiAgICAgICAgb3JpZ2luRGF0YT86IFBsYWl0RWxlbWVudFtdXG4gICAgKSA9PiB7XG4gICAgICAgIGxldCByZWxhdGVkRnJhZ21lbnQgPSBib2FyZC5nZXRSZWxhdGVkRnJhZ21lbnQob3JpZ2luRGF0YSB8fCBbXSk7XG4gICAgICAgIGlmIChyZWxhdGVkRnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGlmIChvcmlnaW5EYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZWxhdGVkRnJhZ21lbnQgPSByZWxhdGVkRnJhZ21lbnQuZmlsdGVyKGl0ZW0gPT4gIW9yaWdpbkRhdGEubWFwKGVsZW1lbnQgPT4gZWxlbWVudC5pZCkuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRGcmFnbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbjogV3JpdGFibGVDbGlwYm9hcmRDb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogV3JpdGFibGVDbGlwYm9hcmRUeXBlLmVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogcmVsYXRlZEZyYWdtZW50XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjbGlwYm9hcmRDb250ZXh0ID0gYWRkT3JDcmVhdGVDbGlwYm9hcmRDb250ZXh0KGNsaXBib2FyZENvbnRleHQsIGFkZGl0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRGcmFnbWVudChjbGlwYm9hcmRDb250ZXh0LCByZWN0YW5nbGUsIG9wZXJhdGlvblR5cGUsIG9yaWdpbkRhdGEpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYm9hcmQ7XG59XG4iXX0=
|