@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,227 +0,0 @@
|
|
|
1
|
-
import { SCROLL_BAR_WIDTH } from '../constants';
|
|
2
|
-
import { MAX_ZOOM, MIN_ZOOM } from '../constants/zoom';
|
|
3
|
-
import { PlaitBoard, Point } from '../interfaces';
|
|
4
|
-
import { BoardTransforms } from '../transforms/board';
|
|
5
|
-
import { getRectangleByElements } from './element';
|
|
6
|
-
import { approximately } from './math';
|
|
7
|
-
import { getViewBox, toHostPointFromViewBoxPoint, toViewBoxPoint } from './to-point';
|
|
8
|
-
import { BOARD_TO_VIEWPORT_ORIGINATION } from './weak-maps';
|
|
9
|
-
export const VIEWPORT_PADDING_RATIO = 0.75;
|
|
10
|
-
const IS_FROM_SCROLLING = new WeakMap();
|
|
11
|
-
const IS_FROM_VIEWPORT_CHANGE = new WeakMap();
|
|
12
|
-
export function getViewportContainerRect(board) {
|
|
13
|
-
const { hideScrollbar } = board.options;
|
|
14
|
-
const scrollBarWidth = hideScrollbar ? SCROLL_BAR_WIDTH : 0;
|
|
15
|
-
const viewportRect = PlaitBoard.getBoardContainer(board).getBoundingClientRect();
|
|
16
|
-
return {
|
|
17
|
-
width: viewportRect.width + scrollBarWidth,
|
|
18
|
-
height: viewportRect.height + scrollBarWidth
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
export function getElementHostBBox(board, zoom) {
|
|
22
|
-
const childrenRect = getRectangleByElements(board, board.children, true);
|
|
23
|
-
let left;
|
|
24
|
-
let right;
|
|
25
|
-
let top;
|
|
26
|
-
let bottom;
|
|
27
|
-
left = childrenRect.x;
|
|
28
|
-
right = childrenRect.x + childrenRect.width;
|
|
29
|
-
top = childrenRect.y;
|
|
30
|
-
bottom = childrenRect.y + childrenRect.height;
|
|
31
|
-
return {
|
|
32
|
-
left,
|
|
33
|
-
right,
|
|
34
|
-
top,
|
|
35
|
-
bottom
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Normalize the scaling ratio, or return the corrected scaling ratio if the limit is exceeded
|
|
40
|
-
*/
|
|
41
|
-
export function clampZoomLevel(zoom, minZoom = MIN_ZOOM, maxZoom = MAX_ZOOM) {
|
|
42
|
-
return zoom < minZoom ? minZoom : zoom > maxZoom ? maxZoom : zoom;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Prepares element bounding box with minimum size constraints
|
|
46
|
-
*/
|
|
47
|
-
export function prepareElementBBox(board, zoom) {
|
|
48
|
-
const boardContainerRectangle = PlaitBoard.getBoardContainer(board).getBoundingClientRect();
|
|
49
|
-
const elementHostBBox = getElementHostBBox(board, zoom);
|
|
50
|
-
const containerWidth = boardContainerRectangle.width;
|
|
51
|
-
const containerHeight = boardContainerRectangle.height;
|
|
52
|
-
// Calculate bounding box dimensions
|
|
53
|
-
let width = elementHostBBox.right - elementHostBBox.left;
|
|
54
|
-
let height = elementHostBBox.bottom - elementHostBBox.top;
|
|
55
|
-
// If elementHostBBox dimensions are smaller than container dimensions,
|
|
56
|
-
// use half of container dimensions as minimum size
|
|
57
|
-
const minWidth = containerWidth / 2;
|
|
58
|
-
const minHeight = containerHeight / 2;
|
|
59
|
-
if (width < minWidth / zoom) {
|
|
60
|
-
// Center the content horizontally if applying minimum width
|
|
61
|
-
const center = elementHostBBox.left + width / 2;
|
|
62
|
-
elementHostBBox.left = center - minWidth / 2 / zoom;
|
|
63
|
-
elementHostBBox.right = center + minWidth / 2 / zoom;
|
|
64
|
-
width = minWidth / zoom;
|
|
65
|
-
}
|
|
66
|
-
if (height < minHeight / zoom) {
|
|
67
|
-
// Center the content vertically if applying minimum height
|
|
68
|
-
const center = elementHostBBox.top + height / 2;
|
|
69
|
-
elementHostBBox.top = center - minHeight / 2 / zoom;
|
|
70
|
-
elementHostBBox.bottom = center + minHeight / 2 / zoom;
|
|
71
|
-
height = minHeight / zoom;
|
|
72
|
-
}
|
|
73
|
-
return {
|
|
74
|
-
elementHostBBox,
|
|
75
|
-
containerWidth,
|
|
76
|
-
containerHeight,
|
|
77
|
-
width,
|
|
78
|
-
height
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Calculates viewBox based on element bounding box with padding
|
|
83
|
-
*/
|
|
84
|
-
export function calculateViewBox(elementHostBBox, containerWidth, containerHeight, width, height, zoom, paddingRatio = VIEWPORT_PADDING_RATIO) {
|
|
85
|
-
const horizontalPaddingInViewBox = (containerWidth * paddingRatio) / zoom;
|
|
86
|
-
const verticalPaddingInViewBox = (containerHeight * paddingRatio) / zoom;
|
|
87
|
-
return [
|
|
88
|
-
elementHostBBox.left - horizontalPaddingInViewBox,
|
|
89
|
-
elementHostBBox.top - verticalPaddingInViewBox,
|
|
90
|
-
width + horizontalPaddingInViewBox * 2,
|
|
91
|
-
height + verticalPaddingInViewBox * 2
|
|
92
|
-
];
|
|
93
|
-
}
|
|
94
|
-
export function calcNewViewBox(board, zoom) {
|
|
95
|
-
const { elementHostBBox, containerWidth, containerHeight, width, height } = prepareElementBBox(board, zoom);
|
|
96
|
-
return calculateViewBox(elementHostBBox, containerWidth, containerHeight, width, height, zoom);
|
|
97
|
-
}
|
|
98
|
-
export function getViewBoxCenterPoint(board) {
|
|
99
|
-
const childrenRectangle = getRectangleByElements(board, board.children, true);
|
|
100
|
-
return [childrenRectangle.x + childrenRectangle.width / 2, childrenRectangle.y + childrenRectangle.height / 2];
|
|
101
|
-
}
|
|
102
|
-
export function setSVGViewBox(board, viewBox) {
|
|
103
|
-
const zoom = board.viewport.zoom;
|
|
104
|
-
const hostElement = PlaitBoard.getHost(board);
|
|
105
|
-
hostElement.style.display = 'block';
|
|
106
|
-
hostElement.style.width = `${viewBox[2] * zoom}px`;
|
|
107
|
-
hostElement.style.height = `${viewBox[3] * zoom}px`;
|
|
108
|
-
if (viewBox && viewBox[2] > 0 && viewBox[3] > 0) {
|
|
109
|
-
hostElement.setAttribute('viewBox', viewBox.join(' '));
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
export function updateViewportOffset(board) {
|
|
113
|
-
const origination = getViewportOrigination(board);
|
|
114
|
-
if (!origination) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
const [scrollLeft, scrollTop] = toHostPointFromViewBoxPoint(board, origination);
|
|
118
|
-
updateViewportContainerScroll(board, scrollLeft, scrollTop);
|
|
119
|
-
}
|
|
120
|
-
export function updateViewportContainerScroll(board, left, top, isFromViewportChange = true) {
|
|
121
|
-
const viewportContainer = PlaitBoard.getViewportContainer(board);
|
|
122
|
-
const previousScrollLeft = viewportContainer.scrollLeft;
|
|
123
|
-
const previousScrollTop = viewportContainer.scrollTop;
|
|
124
|
-
// scrollTop assign 11.8 will get 11.5 in chrome
|
|
125
|
-
// scrollTop assign 11.8 will get 11 in firefox, safari
|
|
126
|
-
// scrollTop assign 11.4 will get 11 in chrome, firefox, safari
|
|
127
|
-
// use approximately method to determine the new value is valid updating to avoid debouncing
|
|
128
|
-
if (!approximately(viewportContainer.scrollLeft, left, 1) || !approximately(viewportContainer.scrollTop, top, 1)) {
|
|
129
|
-
viewportContainer.scrollLeft = left;
|
|
130
|
-
viewportContainer.scrollTop = top;
|
|
131
|
-
const offsetWidth = viewportContainer.offsetWidth;
|
|
132
|
-
const offsetHeight = viewportContainer.offsetHeight;
|
|
133
|
-
if (previousScrollLeft === viewportContainer.scrollLeft && previousScrollTop === viewportContainer.scrollTop) {
|
|
134
|
-
// The scroll event cannot be triggered, so the origination is modified directly based on the scroll distance.
|
|
135
|
-
updateViewportByScrolling(board, previousScrollLeft, previousScrollTop);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
const isValidLeftOrTop = left > 0 &&
|
|
139
|
-
top > 0 &&
|
|
140
|
-
left < viewportContainer.scrollWidth - offsetWidth &&
|
|
141
|
-
top < viewportContainer.scrollHeight - offsetHeight;
|
|
142
|
-
if (isFromViewportChange && isValidLeftOrTop) {
|
|
143
|
-
setIsFromViewportChange(board, true);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
export function updateViewportByScrolling(board, scrollLeft, scrollTop) {
|
|
149
|
-
const origination = toViewBoxPoint(board, [scrollLeft, scrollTop]);
|
|
150
|
-
if (Point.isEquals(origination, getViewportOrigination(board))) {
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
BoardTransforms.updateViewport(board, origination);
|
|
154
|
-
setIsFromScrolling(board, true);
|
|
155
|
-
}
|
|
156
|
-
export function initializeViewportContainer(board) {
|
|
157
|
-
const { width, height } = getViewportContainerRect(board);
|
|
158
|
-
const viewportContainer = PlaitBoard.getViewportContainer(board);
|
|
159
|
-
viewportContainer.style.width = `${width}px`;
|
|
160
|
-
viewportContainer.style.height = `${height}px`;
|
|
161
|
-
}
|
|
162
|
-
export function initializeViewBox(board) {
|
|
163
|
-
const zoom = board.viewport.zoom;
|
|
164
|
-
const viewBox = calcNewViewBox(board, zoom);
|
|
165
|
-
setSVGViewBox(board, viewBox);
|
|
166
|
-
}
|
|
167
|
-
export function updateViewBox(board) {
|
|
168
|
-
const zoom = board.viewport.zoom;
|
|
169
|
-
const { elementHostBBox, containerWidth, containerHeight, width, height } = prepareElementBBox(board, zoom);
|
|
170
|
-
// Use 0.5 ratio to check if contents are within current viewBox
|
|
171
|
-
const checkViewBox = calculateViewBox(elementHostBBox, containerWidth, containerHeight, width, height, zoom, 0.5 // Use smaller padding ratio for checking
|
|
172
|
-
);
|
|
173
|
-
// Get current viewBox
|
|
174
|
-
const currentViewBox = getViewBox(board);
|
|
175
|
-
// Only update if new viewBox is NOT contained within current viewBox
|
|
176
|
-
if (checkViewBox[0] < currentViewBox.x ||
|
|
177
|
-
checkViewBox[1] < currentViewBox.y ||
|
|
178
|
-
checkViewBox[0] + checkViewBox[2] > currentViewBox.x + currentViewBox.width ||
|
|
179
|
-
checkViewBox[1] + checkViewBox[3] > currentViewBox.y + currentViewBox.height) {
|
|
180
|
-
// Update with larger padding ratio
|
|
181
|
-
const newViewBox = calculateViewBox(elementHostBBox, containerWidth, containerHeight, width, height, zoom, VIEWPORT_PADDING_RATIO);
|
|
182
|
-
setSVGViewBox(board, newViewBox);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
export function initializeViewportOffset(board) {
|
|
186
|
-
if (!board.viewport?.origination) {
|
|
187
|
-
const zoom = board.viewport.zoom;
|
|
188
|
-
const viewportContainerRect = PlaitBoard.getBoardContainer(board).getBoundingClientRect();
|
|
189
|
-
const viewBox = calcNewViewBox(board, zoom);
|
|
190
|
-
const centerX = viewBox[0] + viewBox[2] / 2;
|
|
191
|
-
const centerY = viewBox[1] + viewBox[3] / 2;
|
|
192
|
-
const origination = [centerX - viewportContainerRect.width / 2 / zoom, centerY - viewportContainerRect.height / 2 / zoom];
|
|
193
|
-
updateViewportOrigination(board, origination);
|
|
194
|
-
updateViewportOffset(board);
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
updateViewportOffset(board);
|
|
198
|
-
}
|
|
199
|
-
export const updateViewportOrigination = (board, origination) => {
|
|
200
|
-
BOARD_TO_VIEWPORT_ORIGINATION.set(board, origination);
|
|
201
|
-
};
|
|
202
|
-
export const clearViewportOrigination = (board) => {
|
|
203
|
-
BOARD_TO_VIEWPORT_ORIGINATION.delete(board);
|
|
204
|
-
};
|
|
205
|
-
export const getViewportOrigination = (board) => {
|
|
206
|
-
const origination = BOARD_TO_VIEWPORT_ORIGINATION.get(board);
|
|
207
|
-
if (origination) {
|
|
208
|
-
return origination;
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
return board.viewport.origination;
|
|
212
|
-
}
|
|
213
|
-
};
|
|
214
|
-
export const isFromScrolling = (board) => {
|
|
215
|
-
return !!IS_FROM_SCROLLING.get(board);
|
|
216
|
-
};
|
|
217
|
-
export const setIsFromScrolling = (board, state) => {
|
|
218
|
-
IS_FROM_SCROLLING.set(board, state);
|
|
219
|
-
};
|
|
220
|
-
export const isFromViewportChange = (board) => {
|
|
221
|
-
return !!IS_FROM_VIEWPORT_CHANGE.get(board);
|
|
222
|
-
};
|
|
223
|
-
export const setIsFromViewportChange = (board, state) => {
|
|
224
|
-
IS_FROM_VIEWPORT_CHANGE.set(board, state);
|
|
225
|
-
};
|
|
226
|
-
export function scrollToRectangle(board, client) { }
|
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy92aWV3cG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsMkJBQTJCLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFTM0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUU3RCxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRW5FLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFpQjtJQUN0RCxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUN4QyxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFFakYsT0FBTztRQUNILEtBQUss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QyxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBaUIsRUFBRSxNQUF1QixJQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTQ1JPTExfQkFSX1dJRFRIIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1BWF9aT09NLCBNSU5fWk9PTSB9IGZyb20gJy4uL2NvbnN0YW50cy96b29tJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBSZWN0YW5nbGVDbGllbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEJvYXJkVHJhbnNmb3JtcyB9IGZyb20gJy4uL3RyYW5zZm9ybXMvYm9hcmQnO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyB9IGZyb20gJy4vZWxlbWVudCc7XG5pbXBvcnQgeyBhcHByb3hpbWF0ZWx5IH0gZnJvbSAnLi9tYXRoJztcbmltcG9ydCB7IGdldFZpZXdCb3gsIHRvSG9zdFBvaW50RnJvbVZpZXdCb3hQb2ludCwgdG9WaWV3Qm94UG9pbnQgfSBmcm9tICcuL3RvLXBvaW50JztcbmltcG9ydCB7IEJPQVJEX1RPX1ZJRVdQT1JUX09SSUdJTkFUSU9OIH0gZnJvbSAnLi93ZWFrLW1hcHMnO1xuXG5leHBvcnQgY29uc3QgVklFV1BPUlRfUEFERElOR19SQVRJTyA9IDAuNzU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEhvc3RCQm94IHtcbiAgICBsZWZ0OiBudW1iZXI7XG4gICAgcmlnaHQ6IG51bWJlcjtcbiAgICB0b3A6IG51bWJlcjtcbiAgICBib3R0b206IG51bWJlcjtcbn1cblxuY29uc3QgSVNfRlJPTV9TQ1JPTExJTkcgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBib29sZWFuPigpO1xuXG5jb25zdCBJU19GUk9NX1ZJRVdQT1JUX0NIQU5HRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydENvbnRhaW5lclJlY3QoYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBjb25zdCB7IGhpZGVTY3JvbGxiYXIgfSA9IGJvYXJkLm9wdGlvbnM7XG4gICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBoaWRlU2Nyb2xsYmFyID8gU0NST0xMX0JBUl9XSURUSCA6IDA7XG4gICAgY29uc3Qgdmlld3BvcnRSZWN0ID0gUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogdmlld3BvcnRSZWN0LndpZHRoICsgc2Nyb2xsQmFyV2lkdGgsXG4gICAgICAgIGhlaWdodDogdmlld3BvcnRSZWN0LmhlaWdodCArIHNjcm9sbEJhcldpZHRoXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRIb3N0QkJveChib2FyZDogUGxhaXRCb2FyZCwgem9vbTogbnVtYmVyKTogRWxlbWVudEhvc3RCQm94IHtcbiAgICBjb25zdCBjaGlsZHJlblJlY3QgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBib2FyZC5jaGlsZHJlbiwgdHJ1ZSk7XG4gICAgbGV0IGxlZnQ6IG51bWJlcjtcbiAgICBsZXQgcmlnaHQ6IG51bWJlcjtcbiAgICBsZXQgdG9wOiBudW1iZXI7XG4gICAgbGV0IGJvdHRvbTogbnVtYmVyO1xuICAgIGxlZnQgPSBjaGlsZHJlblJlY3QueDtcbiAgICByaWdodCA9IGNoaWxkcmVuUmVjdC54ICsgY2hpbGRyZW5SZWN0LndpZHRoO1xuICAgIHRvcCA9IGNoaWxkcmVuUmVjdC55O1xuICAgIGJvdHRvbSA9IGNoaWxkcmVuUmVjdC55ICsgY2hpbGRyZW5SZWN0LmhlaWdodDtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0LFxuICAgICAgICByaWdodCxcbiAgICAgICAgdG9wLFxuICAgICAgICBib3R0b21cbiAgICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgc2NhbGluZyByYXRpbywgb3IgcmV0dXJuIHRoZSBjb3JyZWN0ZWQgc2NhbGluZyByYXRpbyBpZiB0aGUgbGltaXQgaXMgZXhjZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wWm9vbUxldmVsKHpvb206IG51bWJlciwgbWluWm9vbSA9IE1JTl9aT09NLCBtYXhab29tID0gTUFYX1pPT00pIHtcbiAgICByZXR1cm4gem9vbSA8IG1pblpvb20gPyBtaW5ab29tIDogem9vbSA+IG1heFpvb20gPyBtYXhab29tIDogem9vbTtcbn1cblxuLyoqXG4gKiBQcmVwYXJlcyBlbGVtZW50IGJvdW5kaW5nIGJveCB3aXRoIG1pbmltdW0gc2l6ZSBjb25zdHJhaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUVsZW1lbnRCQm94KGJvYXJkOiBQbGFpdEJvYXJkLCB6b29tOiBudW1iZXIpOiB7XG4gICAgZWxlbWVudEhvc3RCQm94OiBFbGVtZW50SG9zdEJCb3g7XG4gICAgY29udGFpbmVyV2lkdGg6IG51bWJlcjtcbiAgICBjb250YWluZXJIZWlnaHQ6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufSB7XG4gICAgY29uc3QgYm9hcmRDb250YWluZXJSZWN0YW5nbGUgPSBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50SG9zdEJCb3g6IEVsZW1lbnRIb3N0QkJveCA9IGdldEVsZW1lbnRIb3N0QkJveChib2FyZCwgem9vbSk7XG4gICAgXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBib2FyZENvbnRhaW5lclJlY3RhbmdsZS53aWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBib2FyZENvbnRhaW5lclJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIGJvdW5kaW5nIGJveCBkaW1lbnNpb25zXG4gICAgbGV0IHdpZHRoID0gZWxlbWVudEhvc3RCQm94LnJpZ2h0IC0gZWxlbWVudEhvc3RCQm94LmxlZnQ7XG4gICAgbGV0IGhlaWdodCA9IGVsZW1lbnRIb3N0QkJveC5ib3R0b20gLSBlbGVtZW50SG9zdEJCb3gudG9wO1xuICAgIFxuICAgIC8vIElmIGVsZW1lbnRIb3N0QkJveCBkaW1lbnNpb25zIGFyZSBzbWFsbGVyIHRoYW4gY29udGFpbmVyIGRpbWVuc2lvbnMsXG4gICAgLy8gdXNlIGhhbGYgb2YgY29udGFpbmVyIGRpbWVuc2lvbnMgYXMgbWluaW11bSBzaXplXG4gICAgY29uc3QgbWluV2lkdGggPSBjb250YWluZXJXaWR0aCAvIDI7XG4gICAgY29uc3QgbWluSGVpZ2h0ID0gY29udGFpbmVySGVpZ2h0IC8gMjtcbiAgICBcbiAgICBpZiAod2lkdGggPCBtaW5XaWR0aCAvIHpvb20pIHtcbiAgICAgICAgLy8gQ2VudGVyIHRoZSBjb250ZW50IGhvcml6b250YWxseSBpZiBhcHBseWluZyBtaW5pbXVtIHdpZHRoXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IGVsZW1lbnRIb3N0QkJveC5sZWZ0ICsgd2lkdGggLyAyO1xuICAgICAgICBlbGVtZW50SG9zdEJCb3gubGVmdCA9IGNlbnRlciAtIG1pbldpZHRoIC8gMiAvIHpvb207XG4gICAgICAgIGVsZW1lbnRIb3N0QkJveC5yaWdodCA9IGNlbnRlciArIG1pbldpZHRoIC8gMiAvIHpvb207XG4gICAgICAgIHdpZHRoID0gbWluV2lkdGggLyB6b29tO1xuICAgIH1cbiAgICBcbiAgICBpZiAoaGVpZ2h0IDwgbWluSGVpZ2h0IC8gem9vbSkge1xuICAgICAgICAvLyBDZW50ZXIgdGhlIGNvbnRlbnQgdmVydGljYWxseSBpZiBhcHBseWluZyBtaW5pbXVtIGhlaWdodFxuICAgICAgICBjb25zdCBjZW50ZXIgPSBlbGVtZW50SG9zdEJCb3gudG9wICsgaGVpZ2h0IC8gMjtcbiAgICAgICAgZWxlbWVudEhvc3RCQm94LnRvcCA9IGNlbnRlciAtIG1pbkhlaWdodCAvIDIgLyB6b29tO1xuICAgICAgICBlbGVtZW50SG9zdEJCb3guYm90dG9tID0gY2VudGVyICsgbWluSGVpZ2h0IC8gMiAvIHpvb207XG4gICAgICAgIGhlaWdodCA9IG1pbkhlaWdodCAvIHpvb207XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRIb3N0QkJveCxcbiAgICAgICAgY29udGFpbmVyV2lkdGgsXG4gICAgICAgIGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB2aWV3Qm94IGJhc2VkIG9uIGVsZW1lbnQgYm91bmRpbmcgYm94IHdpdGggcGFkZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlVmlld0JveChcbiAgICBlbGVtZW50SG9zdEJCb3g6IEVsZW1lbnRIb3N0QkJveCxcbiAgICBjb250YWluZXJXaWR0aDogbnVtYmVyLFxuICAgIGNvbnRhaW5lckhlaWdodDogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgem9vbTogbnVtYmVyLFxuICAgIHBhZGRpbmdSYXRpbzogbnVtYmVyID0gVklFV1BPUlRfUEFERElOR19SQVRJT1xuKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGhvcml6b250YWxQYWRkaW5nSW5WaWV3Qm94ID0gKGNvbnRhaW5lcldpZHRoICogcGFkZGluZ1JhdGlvKSAvIHpvb207XG4gICAgY29uc3QgdmVydGljYWxQYWRkaW5nSW5WaWV3Qm94ID0gKGNvbnRhaW5lckhlaWdodCAqIHBhZGRpbmdSYXRpbykgLyB6b29tO1xuICAgIFxuICAgIHJldHVybiBbXG4gICAgICAgIGVsZW1lbnRIb3N0QkJveC5sZWZ0IC0gaG9yaXpvbnRhbFBhZGRpbmdJblZpZXdCb3gsXG4gICAgICAgIGVsZW1lbnRIb3N0QkJveC50b3AgLSB2ZXJ0aWNhbFBhZGRpbmdJblZpZXdCb3gsXG4gICAgICAgIHdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmdJblZpZXdCb3ggKiAyLFxuICAgICAgICBoZWlnaHQgKyB2ZXJ0aWNhbFBhZGRpbmdJblZpZXdCb3ggKiAyXG4gICAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNOZXdWaWV3Qm94KGJvYXJkOiBQbGFpdEJvYXJkLCB6b29tOiBudW1iZXIpIHtcbiAgICBjb25zdCB7IGVsZW1lbnRIb3N0QkJveCwgY29udGFpbmVyV2lkdGgsIGNvbnRhaW5lckhlaWdodCwgd2lkdGgsIGhlaWdodCB9ID0gcHJlcGFyZUVsZW1lbnRCQm94KGJvYXJkLCB6b29tKTtcbiAgICBcbiAgICByZXR1cm4gY2FsY3VsYXRlVmlld0JveChcbiAgICAgICAgZWxlbWVudEhvc3RCQm94LFxuICAgICAgICBjb250YWluZXJXaWR0aCxcbiAgICAgICAgY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB6b29tXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdCb3hDZW50ZXJQb2ludChib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGNvbnN0IGNoaWxkcmVuUmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyhib2FyZCwgYm9hcmQuY2hpbGRyZW4sIHRydWUpO1xuICAgIHJldHVybiBbY2hpbGRyZW5SZWN0YW5nbGUueCArIGNoaWxkcmVuUmVjdGFuZ2xlLndpZHRoIC8gMiwgY2hpbGRyZW5SZWN0YW5nbGUueSArIGNoaWxkcmVuUmVjdGFuZ2xlLmhlaWdodCAvIDJdIGFzIFBvaW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U1ZHVmlld0JveChib2FyZDogUGxhaXRCb2FyZCwgdmlld0JveDogbnVtYmVyW10pIHtcbiAgICBjb25zdCB6b29tID0gYm9hcmQudmlld3BvcnQuem9vbTtcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IFBsYWl0Qm9hcmQuZ2V0SG9zdChib2FyZCk7XG4gICAgaG9zdEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaG9zdEVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt2aWV3Qm94WzJdICogem9vbX1weGA7XG4gICAgaG9zdEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld0JveFszXSAqIHpvb219cHhgO1xuXG4gICAgaWYgKHZpZXdCb3ggJiYgdmlld0JveFsyXSA+IDAgJiYgdmlld0JveFszXSA+IDApIHtcbiAgICAgICAgaG9zdEVsZW1lbnQuc2V0QXR0cmlidXRlKCd2aWV3Qm94Jywgdmlld0JveC5qb2luKCcgJykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpZXdwb3J0T2Zmc2V0KGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3Qgb3JpZ2luYXRpb24gPSBnZXRWaWV3cG9ydE9yaWdpbmF0aW9uKGJvYXJkKTtcbiAgICBpZiAoIW9yaWdpbmF0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3Njcm9sbExlZnQsIHNjcm9sbFRvcF0gPSB0b0hvc3RQb2ludEZyb21WaWV3Qm94UG9pbnQoYm9hcmQsIG9yaWdpbmF0aW9uKTtcbiAgICB1cGRhdGVWaWV3cG9ydENvbnRhaW5lclNjcm9sbChib2FyZCwgc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpZXdwb3J0Q29udGFpbmVyU2Nyb2xsKGJvYXJkOiBQbGFpdEJvYXJkLCBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCBpc0Zyb21WaWV3cG9ydENoYW5nZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCB2aWV3cG9ydENvbnRhaW5lciA9IFBsYWl0Qm9hcmQuZ2V0Vmlld3BvcnRDb250YWluZXIoYm9hcmQpO1xuICAgIGNvbnN0IHByZXZpb3VzU2Nyb2xsTGVmdCA9IHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgcHJldmlvdXNTY3JvbGxUb3AgPSB2aWV3cG9ydENvbnRhaW5lci5zY3JvbGxUb3A7XG4gICAgLy8gc2Nyb2xsVG9wIGFzc2lnbiAxMS44IHdpbGwgZ2V0IDExLjUgaW4gY2hyb21lXG4gICAgLy8gc2Nyb2xsVG9wIGFzc2lnbiAxMS44IHdpbGwgZ2V0IDExIGluIGZpcmVmb3gsIHNhZmFyaVxuICAgIC8vIHNjcm9sbFRvcCBhc3NpZ24gMTEuNCB3aWxsIGdldCAxMSBpbiBjaHJvbWUsIGZpcmVmb3gsIHNhZmFyaVxuICAgIC8vIHVzZSBhcHByb3hpbWF0ZWx5IG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIG5ldyB2YWx1ZSBpcyB2YWxpZCB1cGRhdGluZyB0byBhdm9pZCBkZWJvdW5jaW5nXG4gICAgaWYgKCFhcHByb3hpbWF0ZWx5KHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbExlZnQsIGxlZnQsIDEpIHx8ICFhcHByb3hpbWF0ZWx5KHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbFRvcCwgdG9wLCAxKSkge1xuICAgICAgICB2aWV3cG9ydENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgdmlld3BvcnRDb250YWluZXIuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IHZpZXdwb3J0Q29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSB2aWV3cG9ydENvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGlmIChwcmV2aW91c1Njcm9sbExlZnQgPT09IHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbExlZnQgJiYgcHJldmlvdXNTY3JvbGxUb3AgPT09IHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbFRvcCkge1xuICAgICAgICAgICAgLy8gVGhlIHNjcm9sbCBldmVudCBjYW5ub3QgYmUgdHJpZ2dlcmVkLCBzbyB0aGUgb3JpZ2luYXRpb24gaXMgbW9kaWZpZWQgZGlyZWN0bHkgYmFzZWQgb24gdGhlIHNjcm9sbCBkaXN0YW5jZS5cbiAgICAgICAgICAgIHVwZGF0ZVZpZXdwb3J0QnlTY3JvbGxpbmcoYm9hcmQsIHByZXZpb3VzU2Nyb2xsTGVmdCwgcHJldmlvdXNTY3JvbGxUb3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZExlZnRPclRvcCA9XG4gICAgICAgICAgICAgICAgbGVmdCA+IDAgJiZcbiAgICAgICAgICAgICAgICB0b3AgPiAwICYmXG4gICAgICAgICAgICAgICAgbGVmdCA8IHZpZXdwb3J0Q29udGFpbmVyLnNjcm9sbFdpZHRoIC0gb2Zmc2V0V2lkdGggJiZcbiAgICAgICAgICAgICAgICB0b3AgPCB2aWV3cG9ydENvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBvZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoaXNGcm9tVmlld3BvcnRDaGFuZ2UgJiYgaXNWYWxpZExlZnRPclRvcCkge1xuICAgICAgICAgICAgICAgIHNldElzRnJvbVZpZXdwb3J0Q2hhbmdlKGJvYXJkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpZXdwb3J0QnlTY3JvbGxpbmcoYm9hcmQ6IFBsYWl0Qm9hcmQsIHNjcm9sbExlZnQ6IG51bWJlciwgc2Nyb2xsVG9wOiBudW1iZXIpIHtcbiAgICBjb25zdCBvcmlnaW5hdGlvbiA9IHRvVmlld0JveFBvaW50KGJvYXJkLCBbc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wXSk7XG4gICAgaWYgKFBvaW50LmlzRXF1YWxzKG9yaWdpbmF0aW9uLCBnZXRWaWV3cG9ydE9yaWdpbmF0aW9uKGJvYXJkKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBCb2FyZFRyYW5zZm9ybXMudXBkYXRlVmlld3BvcnQoYm9hcmQsIG9yaWdpbmF0aW9uKTtcbiAgICBzZXRJc0Zyb21TY3JvbGxpbmcoYm9hcmQsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVZpZXdwb3J0Q29udGFpbmVyKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRWaWV3cG9ydENvbnRhaW5lclJlY3QoYm9hcmQpO1xuICAgIGNvbnN0IHZpZXdwb3J0Q29udGFpbmVyID0gUGxhaXRCb2FyZC5nZXRWaWV3cG9ydENvbnRhaW5lcihib2FyZCk7XG4gICAgdmlld3BvcnRDb250YWluZXIuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgdmlld3BvcnRDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVWaWV3Qm94KGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgY29uc3Qgem9vbSA9IGJvYXJkLnZpZXdwb3J0Lnpvb207XG4gICAgY29uc3Qgdmlld0JveCA9IGNhbGNOZXdWaWV3Qm94KGJvYXJkLCB6b29tKTtcbiAgICBzZXRTVkdWaWV3Qm94KGJvYXJkLCB2aWV3Qm94KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpZXdCb3goYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICBjb25zdCB6b29tID0gYm9hcmQudmlld3BvcnQuem9vbTtcbiAgICBjb25zdCB7IGVsZW1lbnRIb3N0QkJveCwgY29udGFpbmVyV2lkdGgsIGNvbnRhaW5lckhlaWdodCwgd2lkdGgsIGhlaWdodCB9ID0gcHJlcGFyZUVsZW1lbnRCQm94KGJvYXJkLCB6b29tKTtcbiAgICBcbiAgICAvLyBVc2UgMC41IHJhdGlvIHRvIGNoZWNrIGlmIGNvbnRlbnRzIGFyZSB3aXRoaW4gY3VycmVudCB2aWV3Qm94XG4gICAgY29uc3QgY2hlY2tWaWV3Qm94ID0gY2FsY3VsYXRlVmlld0JveChcbiAgICAgICAgZWxlbWVudEhvc3RCQm94LFxuICAgICAgICBjb250YWluZXJXaWR0aCxcbiAgICAgICAgY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB6b29tLFxuICAgICAgICAwLjUgLy8gVXNlIHNtYWxsZXIgcGFkZGluZyByYXRpbyBmb3IgY2hlY2tpbmdcbiAgICApO1xuICAgIFxuICAgIC8vIEdldCBjdXJyZW50IHZpZXdCb3hcbiAgICBjb25zdCBjdXJyZW50Vmlld0JveCA9IGdldFZpZXdCb3goYm9hcmQpO1xuICAgIFxuICAgIC8vIE9ubHkgdXBkYXRlIGlmIG5ldyB2aWV3Qm94IGlzIE5PVCBjb250YWluZWQgd2l0aGluIGN1cnJlbnQgdmlld0JveFxuICAgIGlmIChcbiAgICAgICAgY2hlY2tWaWV3Qm94WzBdIDwgY3VycmVudFZpZXdCb3gueCB8fFxuICAgICAgICBjaGVja1ZpZXdCb3hbMV0gPCBjdXJyZW50Vmlld0JveC55IHx8XG4gICAgICAgIGNoZWNrVmlld0JveFswXSArIGNoZWNrVmlld0JveFsyXSA+IGN1cnJlbnRWaWV3Qm94LnggKyBjdXJyZW50Vmlld0JveC53aWR0aCB8fFxuICAgICAgICBjaGVja1ZpZXdCb3hbMV0gKyBjaGVja1ZpZXdCb3hbM10gPiBjdXJyZW50Vmlld0JveC55ICsgY3VycmVudFZpZXdCb3guaGVpZ2h0XG4gICAgKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB3aXRoIGxhcmdlciBwYWRkaW5nIHJhdGlvXG4gICAgICAgIGNvbnN0IG5ld1ZpZXdCb3ggPSBjYWxjdWxhdGVWaWV3Qm94KFxuICAgICAgICAgICAgZWxlbWVudEhvc3RCQm94LFxuICAgICAgICAgICAgY29udGFpbmVyV2lkdGgsXG4gICAgICAgICAgICBjb250YWluZXJIZWlnaHQsXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICBWSUVXUE9SVF9QQURESU5HX1JBVElPXG4gICAgICAgICk7XG4gICAgICAgIHNldFNWR1ZpZXdCb3goYm9hcmQsIG5ld1ZpZXdCb3gpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVWaWV3cG9ydE9mZnNldChib2FyZDogUGxhaXRCb2FyZCkge1xuICAgIGlmICghYm9hcmQudmlld3BvcnQ/Lm9yaWdpbmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHpvb20gPSBib2FyZC52aWV3cG9ydC56b29tO1xuICAgICAgICBjb25zdCB2aWV3cG9ydENvbnRhaW5lclJlY3QgPSBQbGFpdEJvYXJkLmdldEJvYXJkQ29udGFpbmVyKGJvYXJkKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3Qgdmlld0JveCA9IGNhbGNOZXdWaWV3Qm94KGJvYXJkLCB6b29tKTtcbiAgICAgICAgY29uc3QgY2VudGVyWCA9IHZpZXdCb3hbMF0gKyB2aWV3Qm94WzJdIC8gMjtcbiAgICAgICAgY29uc3QgY2VudGVyWSA9IHZpZXdCb3hbMV0gKyB2aWV3Qm94WzNdIC8gMjtcbiAgICAgICAgY29uc3Qgb3JpZ2luYXRpb24gPSBbY2VudGVyWCAtIHZpZXdwb3J0Q29udGFpbmVyUmVjdC53aWR0aCAvIDIgLyB6b29tLCBjZW50ZXJZIC0gdmlld3BvcnRDb250YWluZXJSZWN0LmhlaWdodCAvIDIgLyB6b29tXSBhcyBQb2ludDtcbiAgICAgICAgdXBkYXRlVmlld3BvcnRPcmlnaW5hdGlvbihib2FyZCwgb3JpZ2luYXRpb24pO1xuICAgICAgICB1cGRhdGVWaWV3cG9ydE9mZnNldChib2FyZCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRlVmlld3BvcnRPZmZzZXQoYm9hcmQpO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlVmlld3BvcnRPcmlnaW5hdGlvbiA9IChib2FyZDogUGxhaXRCb2FyZCwgb3JpZ2luYXRpb246IFBvaW50KSA9PiB7XG4gICAgQk9BUkRfVE9fVklFV1BPUlRfT1JJR0lOQVRJT04uc2V0KGJvYXJkLCBvcmlnaW5hdGlvbik7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYXJWaWV3cG9ydE9yaWdpbmF0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgQk9BUkRfVE9fVklFV1BPUlRfT1JJR0lOQVRJT04uZGVsZXRlKGJvYXJkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWaWV3cG9ydE9yaWdpbmF0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYXRpb24gPSBCT0FSRF9UT19WSUVXUE9SVF9PUklHSU5BVElPTi5nZXQoYm9hcmQpO1xuICAgIGlmIChvcmlnaW5hdGlvbikge1xuICAgICAgICByZXR1cm4gb3JpZ2luYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGJvYXJkLnZpZXdwb3J0Lm9yaWdpbmF0aW9uO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc0Zyb21TY3JvbGxpbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICByZXR1cm4gISFJU19GUk9NX1NDUk9MTElORy5nZXQoYm9hcmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldElzRnJvbVNjcm9sbGluZyA9IChib2FyZDogUGxhaXRCb2FyZCwgc3RhdGU6IGJvb2xlYW4pID0+IHtcbiAgICBJU19GUk9NX1NDUk9MTElORy5zZXQoYm9hcmQsIHN0YXRlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Zyb21WaWV3cG9ydENoYW5nZSA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIHJldHVybiAhIUlTX0ZST01fVklFV1BPUlRfQ0hBTkdFLmdldChib2FyZCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0SXNGcm9tVmlld3BvcnRDaGFuZ2UgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHN0YXRlOiBib29sZWFuKSA9PiB7XG4gICAgSVNfRlJPTV9WSUVXUE9SVF9DSEFOR0Uuc2V0KGJvYXJkLCBzdGF0ZSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG9SZWN0YW5nbGUoYm9hcmQ6IFBsYWl0Qm9hcmQsIGNsaWVudDogUmVjdGFuZ2xlQ2xpZW50KSB7fVxuIl19
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
// record richtext type status
|
|
2
|
-
export const IS_BOARD_CACHE = new WeakMap();
|
|
3
|
-
export const FLUSHING = new WeakMap();
|
|
4
|
-
export const NODE_TO_INDEX = new WeakMap();
|
|
5
|
-
export const NODE_TO_PARENT = new WeakMap();
|
|
6
|
-
export const KEY_TO_ELEMENT_MAP = new WeakMap();
|
|
7
|
-
export const NODE_TO_G = new WeakMap();
|
|
8
|
-
export const NODE_TO_CONTAINER_G = new WeakMap();
|
|
9
|
-
export const IS_TEXT_EDITABLE = new WeakMap();
|
|
10
|
-
export const BOARD_TO_ON_CHANGE = new WeakMap();
|
|
11
|
-
export const BOARD_TO_AFTER_CHANGE = new WeakMap();
|
|
12
|
-
export const BOARD_TO_ROUGH_SVG = new WeakMap();
|
|
13
|
-
export const BOARD_TO_HOST = new WeakMap();
|
|
14
|
-
export const BOARD_TO_CONTEXT = new WeakMap();
|
|
15
|
-
export const IS_BOARD_ALIVE = new WeakMap();
|
|
16
|
-
export const BOARD_TO_ELEMENT_HOST = new WeakMap();
|
|
17
|
-
export const BOARD_TO_SELECTED_ELEMENT = new WeakMap();
|
|
18
|
-
export const BOARD_TO_MOVING_POINT_IN_BOARD = new WeakMap();
|
|
19
|
-
export const BOARD_TO_MOVING_POINT = new WeakMap();
|
|
20
|
-
export const BOARD_TO_VIEWPORT_ORIGINATION = new WeakMap();
|
|
21
|
-
export const BOARD_TO_IS_SELECTION_MOVING = new WeakMap();
|
|
22
|
-
// save no standard selected elements
|
|
23
|
-
export const BOARD_TO_TEMPORARY_ELEMENTS = new WeakMap();
|
|
24
|
-
export const BOARD_TO_MOVING_ELEMENT = new WeakMap();
|
|
25
|
-
export const PATH_REFS = new WeakMap();
|
|
26
|
-
export const ELEMENT_TO_REF = new WeakMap();
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vhay1tYXBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvd2Vhay1tYXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLDhCQUE4QjtBQUM5QixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQW1CLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQXlDLENBQUM7QUFFdkYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRXpFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUF3QixDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBNkIsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBaUMsQ0FBQztBQUU3RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBVzdDLENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBOEIsQ0FBQztBQUVuRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUUvRSxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxPQUFPLEVBQTRELENBQUM7QUFFbkgsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBQThCLENBQUM7QUFFakYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFzQyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRTFFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBMkMsSUFBSSxPQUFPLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSAncm91Z2hqcy9iaW4vc3ZnJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ib2FyZCc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcG9pbnQnO1xuaW1wb3J0IHsgQW5jZXN0b3IsIFBsYWl0Tm9kZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQgeyBQYXRoUmVmIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wYXRoLXJlZic7XG5pbXBvcnQgeyBQbGFpdEVsZW1lbnRSZWYgfSBmcm9tICcuLi9jb3JlL2VsZW1lbnQvZWxlbWVudC1yZWYnO1xuaW1wb3J0IHsgUGxhaXRCb2FyZENvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0JztcblxuLy8gcmVjb3JkIHJpY2h0ZXh0IHR5cGUgc3RhdHVzXG5leHBvcnQgY29uc3QgSVNfQk9BUkRfQ0FDSEUgPSBuZXcgV2Vha01hcDxPYmplY3QsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBGTFVTSElORyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBOT0RFX1RPX0lOREVYID0gbmV3IFdlYWtNYXA8UGxhaXROb2RlLCBudW1iZXI+KCk7XG5cbmV4cG9ydCBjb25zdCBOT0RFX1RPX1BBUkVOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Tm9kZSwgQW5jZXN0b3I+KCk7XG5cbmV4cG9ydCBjb25zdCBLRVlfVE9fRUxFTUVOVF9NQVAgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBNYXA8U3RyaW5nLCBQbGFpdEVsZW1lbnQ+PigpO1xuXG5leHBvcnQgY29uc3QgTk9ERV9UT19HID0gbmV3IFdlYWtNYXA8UGxhaXROb2RlLCBTVkdHRWxlbWVudD4oKTtcblxuZXhwb3J0IGNvbnN0IE5PREVfVE9fQ09OVEFJTkVSX0cgPSBuZXcgV2Vha01hcDxQbGFpdE5vZGUsIFNWR0dFbGVtZW50PigpO1xuXG5leHBvcnQgY29uc3QgSVNfVEVYVF9FRElUQUJMRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19PTl9DSEFOR0UgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCAoKSA9PiB2b2lkPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fQUZURVJfQ0hBTkdFID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgKCkgPT4gdm9pZD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX1JPVUdIX1NWRyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFJvdWdoU1ZHPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fSE9TVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFNWR1NWR0VsZW1lbnQ+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19DT05URVhUID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUGxhaXRCb2FyZENvbnRleHQ+KCk7XG5cbmV4cG9ydCBjb25zdCBJU19CT0FSRF9BTElWRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19FTEVNRU5UX0hPU1QgPSBuZXcgV2Vha01hcDxcbiAgICBQbGFpdEJvYXJkLFxuICAgIHtcbiAgICAgICAgbG93ZXJIb3N0OiBTVkdHRWxlbWVudDtcbiAgICAgICAgaG9zdDogU1ZHR0VsZW1lbnQ7XG4gICAgICAgIHVwcGVySG9zdDogU1ZHR0VsZW1lbnQ7XG4gICAgICAgIHRvcEhvc3Q6IFNWR0dFbGVtZW50O1xuICAgICAgICBhY3RpdmVIb3N0OiBTVkdHRWxlbWVudDtcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgdmlld3BvcnRDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIH1cbj4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX1NFTEVDVEVEX0VMRU1FTlQgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnRbXT4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX01PVklOR19QT0lOVF9JTl9CT0FSRCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBvaW50PigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fTU9WSU5HX1BPSU5UID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUG9pbnQ+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19WSUVXUE9SVF9PUklHSU5BVElPTiA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBvaW50PigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fSVNfU0VMRUNUSU9OX01PVklORyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbi8vIHNhdmUgbm8gc3RhbmRhcmQgc2VsZWN0ZWQgZWxlbWVudHNcbmV4cG9ydCBjb25zdCBCT0FSRF9UT19URU1QT1JBUllfRUxFTUVOVFMgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCB7IGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXTsgdGltZW91dElkOiBhbnkgfT4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX01PVklOR19FTEVNRU5UID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50W10+KCk7XG5cbmV4cG9ydCBjb25zdCBQQVRIX1JFRlM6IFdlYWtNYXA8UGxhaXRCb2FyZCwgU2V0PFBhdGhSZWY+PiA9IG5ldyBXZWFrTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBFTEVNRU5UX1RPX1JFRjogV2Vha01hcDxQbGFpdEVsZW1lbnQsIFBsYWl0RWxlbWVudFJlZj4gPSBuZXcgV2Vha01hcCgpO1xuIl19
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { PlaitGroupElement } from '../interfaces';
|
|
2
|
-
import { getElementsIndices } from './common';
|
|
3
|
-
import { getEditingGroup, getElementsInGroup, getGroupByElement, getHighestGroup, isSelectedAllElementsInGroup } from './group';
|
|
4
|
-
import { findIndex, findLastIndex } from './helper';
|
|
5
|
-
import { sortElements } from './position';
|
|
6
|
-
import { getSelectedElements } from './selected-element';
|
|
7
|
-
export const getOneMoveOptions = (board, direction) => {
|
|
8
|
-
const indicesToMove = getElementsIndices(board, getSelectedElements(board));
|
|
9
|
-
let groupedIndices = toContiguousGroups(board, indicesToMove);
|
|
10
|
-
if (direction === 'up') {
|
|
11
|
-
groupedIndices = groupedIndices.reverse();
|
|
12
|
-
}
|
|
13
|
-
let moveContents = [];
|
|
14
|
-
groupedIndices.forEach((indices, i) => {
|
|
15
|
-
const leadingIndex = indices[0];
|
|
16
|
-
const trailingIndex = indices[indices.length - 1];
|
|
17
|
-
const boundaryIndex = direction === 'down' ? leadingIndex : trailingIndex;
|
|
18
|
-
const targetIndex = getTargetIndex(board, boundaryIndex, direction);
|
|
19
|
-
if (targetIndex === -1 || boundaryIndex === targetIndex) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
if (direction === 'down') {
|
|
23
|
-
indices = indices.reverse();
|
|
24
|
-
}
|
|
25
|
-
moveContents.push(...indices.map(path => {
|
|
26
|
-
return {
|
|
27
|
-
element: board.children[path],
|
|
28
|
-
newPath: [targetIndex]
|
|
29
|
-
};
|
|
30
|
-
}));
|
|
31
|
-
});
|
|
32
|
-
return moveContents;
|
|
33
|
-
};
|
|
34
|
-
export const getAllMoveOptions = (board, direction) => {
|
|
35
|
-
const indicesToMove = getElementsIndices(board, getSelectedElements(board));
|
|
36
|
-
let groupedIndices = toContiguousGroups(board, indicesToMove);
|
|
37
|
-
let moveContents = [];
|
|
38
|
-
if (direction === 'down') {
|
|
39
|
-
groupedIndices = groupedIndices.reverse();
|
|
40
|
-
}
|
|
41
|
-
groupedIndices.forEach(indices => {
|
|
42
|
-
const leadingIndex = indices[0];
|
|
43
|
-
const trailingIndex = indices[indices.length - 1];
|
|
44
|
-
const boundaryIndex = direction === 'down' ? leadingIndex : trailingIndex;
|
|
45
|
-
const sourceElement = board.children[boundaryIndex];
|
|
46
|
-
const editingGroup = getEditingGroup(board, sourceElement);
|
|
47
|
-
let targetIndex = direction === 'down' ? 0 : board.children.length - 1;
|
|
48
|
-
if (editingGroup) {
|
|
49
|
-
const elementsInGroup = sortElements(board, getElementsInGroup(board, editingGroup, true, true));
|
|
50
|
-
targetIndex =
|
|
51
|
-
direction === 'down'
|
|
52
|
-
? board.children.indexOf(elementsInGroup[0])
|
|
53
|
-
: board.children.indexOf(elementsInGroup[elementsInGroup.length - 1]);
|
|
54
|
-
}
|
|
55
|
-
if (direction === 'down') {
|
|
56
|
-
indices = indices.reverse();
|
|
57
|
-
}
|
|
58
|
-
moveContents.push(...indices.map(path => {
|
|
59
|
-
return {
|
|
60
|
-
element: board.children[path],
|
|
61
|
-
newPath: [targetIndex]
|
|
62
|
-
};
|
|
63
|
-
}));
|
|
64
|
-
});
|
|
65
|
-
return moveContents;
|
|
66
|
-
};
|
|
67
|
-
export const canSetZIndex = (board) => {
|
|
68
|
-
const selectedElements = getSelectedElements(board).filter(item => board.canSetZIndex(item));
|
|
69
|
-
return selectedElements.length > 0;
|
|
70
|
-
};
|
|
71
|
-
const toContiguousGroups = (board, array) => {
|
|
72
|
-
let cursor = 0;
|
|
73
|
-
return array.reduce((acc, value, index) => {
|
|
74
|
-
if (index > 0) {
|
|
75
|
-
const currentElement = board.children[value];
|
|
76
|
-
const previousElement = board.children[array[index - 1]];
|
|
77
|
-
const isContiguous = value - 1 === array[index - 1]
|
|
78
|
-
? true
|
|
79
|
-
: board.children.every((item, childIndex) => {
|
|
80
|
-
if (childIndex > array[index - 1] && childIndex <= value - 1) {
|
|
81
|
-
return PlaitGroupElement.isGroup(item);
|
|
82
|
-
}
|
|
83
|
-
return true;
|
|
84
|
-
});
|
|
85
|
-
let isPartialSelectGroupElement = false;
|
|
86
|
-
if (previousElement?.groupId || (currentElement?.groupId && previousElement?.groupId !== currentElement?.groupId)) {
|
|
87
|
-
let isPartialSelectPreviousGroup = false;
|
|
88
|
-
let isPartialSelectCurrentElement = false;
|
|
89
|
-
if (previousElement.groupId) {
|
|
90
|
-
const highestGroup = getHighestGroup(board, previousElement);
|
|
91
|
-
isPartialSelectPreviousGroup = !isSelectedAllElementsInGroup(board, highestGroup);
|
|
92
|
-
}
|
|
93
|
-
if (currentElement.groupId) {
|
|
94
|
-
const highestGroup = getHighestGroup(board, currentElement);
|
|
95
|
-
isPartialSelectCurrentElement = !isSelectedAllElementsInGroup(board, highestGroup);
|
|
96
|
-
}
|
|
97
|
-
isPartialSelectGroupElement = isPartialSelectPreviousGroup || isPartialSelectCurrentElement;
|
|
98
|
-
}
|
|
99
|
-
if (!isContiguous || isPartialSelectGroupElement) {
|
|
100
|
-
cursor = ++cursor;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
(acc[cursor] || (acc[cursor] = [])).push(value);
|
|
104
|
-
return acc;
|
|
105
|
-
}, []);
|
|
106
|
-
};
|
|
107
|
-
/**
|
|
108
|
-
* Returns next candidate index that's available to be moved to. Currently that
|
|
109
|
-
* is a non-deleted element, and not inside a group (unless we're editing it).
|
|
110
|
-
*/
|
|
111
|
-
const getTargetIndex = (board, boundaryIndex, direction) => {
|
|
112
|
-
if ((boundaryIndex === 0 && direction === 'down') || (boundaryIndex === board.children.length - 1 && direction === 'up')) {
|
|
113
|
-
return -1;
|
|
114
|
-
}
|
|
115
|
-
const indexFilter = (element) => {
|
|
116
|
-
if (element.isDeleted || PlaitGroupElement.isGroup(element)) {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
return true;
|
|
120
|
-
};
|
|
121
|
-
const candidateIndex = direction === 'down'
|
|
122
|
-
? findLastIndex(board.children, el => indexFilter(el), Math.max(0, boundaryIndex - 1))
|
|
123
|
-
: findIndex(board.children, el => indexFilter(el), boundaryIndex + 1);
|
|
124
|
-
const nextElement = board.children[candidateIndex];
|
|
125
|
-
if (!nextElement) {
|
|
126
|
-
return -1;
|
|
127
|
-
}
|
|
128
|
-
const elements = [...board.children];
|
|
129
|
-
const sourceElement = elements[boundaryIndex];
|
|
130
|
-
const editingGroup = getEditingGroup(board, sourceElement);
|
|
131
|
-
const nextElementGroups = (getGroupByElement(board, nextElement, true) || []);
|
|
132
|
-
// candidate element is a sibling in current editing group → return
|
|
133
|
-
if (editingGroup && sourceElement?.groupId !== nextElement?.groupId) {
|
|
134
|
-
// candidate element is outside current editing group → prevent
|
|
135
|
-
if (!nextElementGroups.find(item => item.id === editingGroup.id)) {
|
|
136
|
-
return -1;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
if (!nextElement.groupId) {
|
|
140
|
-
return candidateIndex;
|
|
141
|
-
}
|
|
142
|
-
let siblingGroup;
|
|
143
|
-
if (editingGroup) {
|
|
144
|
-
siblingGroup = nextElementGroups[nextElementGroups.indexOf(editingGroup) - 1];
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
siblingGroup = nextElementGroups[nextElementGroups.length - 1];
|
|
148
|
-
}
|
|
149
|
-
if (siblingGroup) {
|
|
150
|
-
let elementsInSiblingGroup = getElementsInGroup(board, siblingGroup, true, false);
|
|
151
|
-
if (elementsInSiblingGroup.length) {
|
|
152
|
-
elementsInSiblingGroup.sort((a, b) => {
|
|
153
|
-
const indexA = board.children.findIndex(child => child.id === a.id);
|
|
154
|
-
const indexB = board.children.findIndex(child => child.id === b.id);
|
|
155
|
-
return indexA - indexB;
|
|
156
|
-
});
|
|
157
|
-
// assumes getElementsInGroup() returned elements are sorted
|
|
158
|
-
// by zIndex (ascending)
|
|
159
|
-
return direction === 'down'
|
|
160
|
-
? elements.indexOf(elementsInSiblingGroup[0])
|
|
161
|
-
: elements.indexOf(elementsInSiblingGroup[elementsInSiblingGroup.length - 1]);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return candidateIndex;
|
|
165
|
-
};
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiei1pbmRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL3otaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixpQkFBaUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQWtCLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQXdCLEVBQW9CLEVBQUU7SUFDL0YsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBSSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlELElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3JCLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksWUFBWSxHQUFxQixFQUFFLENBQUM7SUFDeEMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8s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SixZQUFZLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2YsSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRixJQUFJLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsNERBQTREO1lBQzVELHdCQUF3QjtZQUN4QixPQUFPLFNBQVMsS0FBSyxNQUFNO2dCQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQsIFBsYWl0R3JvdXBFbGVtZW50LCBQbGFpdEdyb3VwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNb3ZlTm9kZU9wdGlvbiwgZ2V0RWxlbWVudHNJbmRpY2VzIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgZ2V0RWRpdGluZ0dyb3VwLCBnZXRFbGVtZW50c0luR3JvdXAsIGdldEdyb3VwQnlFbGVtZW50LCBnZXRIaWdoZXN0R3JvdXAsIGlzU2VsZWN0ZWRBbGxFbGVtZW50c0luR3JvdXAgfSBmcm9tICcuL2dyb3VwJztcbmltcG9ydCB7IGZpbmRJbmRleCwgZmluZExhc3RJbmRleCB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCB7IHNvcnRFbGVtZW50cyB9IGZyb20gJy4vcG9zaXRpb24nO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gJy4vc2VsZWN0ZWQtZWxlbWVudCc7XG5cbmV4cG9ydCBjb25zdCBnZXRPbmVNb3ZlT3B0aW9ucyA9IChib2FyZDogUGxhaXRCb2FyZCwgZGlyZWN0aW9uOiAnZG93bicgfCAndXAnKTogTW92ZU5vZGVPcHRpb25bXSA9PiB7XG4gICAgY29uc3QgaW5kaWNlc1RvTW92ZSA9IGdldEVsZW1lbnRzSW5kaWNlcyhib2FyZCwgZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCkpO1xuICAgIGxldCBncm91cGVkSW5kaWNlcyA9IHRvQ29udGlndW91c0dyb3Vwcyhib2FyZCwgaW5kaWNlc1RvTW92ZSk7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgICBncm91cGVkSW5kaWNlcyA9IGdyb3VwZWRJbmRpY2VzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgbGV0IG1vdmVDb250ZW50czogTW92ZU5vZGVPcHRpb25bXSA9IFtdO1xuICAgIGdyb3VwZWRJbmRpY2VzLmZvckVhY2goKGluZGljZXMsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGVhZGluZ0luZGV4ID0gaW5kaWNlc1swXTtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdJbmRleCA9IGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgYm91bmRhcnlJbmRleCA9IGRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gbGVhZGluZ0luZGV4IDogdHJhaWxpbmdJbmRleDtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBnZXRUYXJnZXRJbmRleChib2FyZCwgYm91bmRhcnlJbmRleCwgZGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSB8fCBib3VuZGFyeUluZGV4ID09PSB0YXJnZXRJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICAgICAgaW5kaWNlcyA9IGluZGljZXMucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIG1vdmVDb250ZW50cy5wdXNoKFxuICAgICAgICAgICAgLi4uaW5kaWNlcy5tYXAocGF0aCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogYm9hcmQuY2hpbGRyZW5bcGF0aF0sXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhdGg6IFt0YXJnZXRJbmRleF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtb3ZlQ29udGVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWxsTW92ZU9wdGlvbnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGRpcmVjdGlvbjogJ2Rvd24nIHwgJ3VwJyk6IE1vdmVOb2RlT3B0aW9uW10gPT4ge1xuICAgIGNvbnN0IGluZGljZXNUb01vdmUgPSBnZXRFbGVtZW50c0luZGljZXMoYm9hcmQsIGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpKTtcbiAgICBsZXQgZ3JvdXBlZEluZGljZXMgPSB0b0NvbnRpZ3VvdXNHcm91cHMoYm9hcmQsIGluZGljZXNUb01vdmUpO1xuICAgIGxldCBtb3ZlQ29udGVudHM6IE1vdmVOb2RlT3B0aW9uW10gPSBbXTtcbiAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgZ3JvdXBlZEluZGljZXMgPSBncm91cGVkSW5kaWNlcy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGdyb3VwZWRJbmRpY2VzLmZvckVhY2goaW5kaWNlcyA9PiB7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdJbmRleCA9IGluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGJvdW5kYXJ5SW5kZXggPSBkaXJlY3Rpb24gPT09ICdkb3duJyA/IGxlYWRpbmdJbmRleCA6IHRyYWlsaW5nSW5kZXg7XG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnQgPSBib2FyZC5jaGlsZHJlbltib3VuZGFyeUluZGV4XTtcbiAgICAgICAgY29uc3QgZWRpdGluZ0dyb3VwID0gZ2V0RWRpdGluZ0dyb3VwKGJvYXJkLCBzb3VyY2VFbGVtZW50KTtcbiAgICAgICAgbGV0IHRhcmdldEluZGV4ID0gZGlyZWN0aW9uID09PSAnZG93bicgPyAwIDogYm9hcmQuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGVkaXRpbmdHcm91cCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNJbkdyb3VwID0gc29ydEVsZW1lbnRzKGJvYXJkLCBnZXRFbGVtZW50c0luR3JvdXAoYm9hcmQsIGVkaXRpbmdHcm91cCwgdHJ1ZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPVxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ2Rvd24nXG4gICAgICAgICAgICAgICAgICAgID8gYm9hcmQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50c0luR3JvdXBbMF0pXG4gICAgICAgICAgICAgICAgICAgIDogYm9hcmQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50c0luR3JvdXBbZWxlbWVudHNJbkdyb3VwLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBpbmRpY2VzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlQ29udGVudHMucHVzaChcbiAgICAgICAgICAgIC4uLmluZGljZXMubWFwKHBhdGggPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGJvYXJkLmNoaWxkcmVuW3BhdGhdLFxuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoOiBbdGFyZ2V0SW5kZXhdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW92ZUNvbnRlbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhblNldFpJbmRleCA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKS5maWx0ZXIoaXRlbSA9PiBib2FyZC5jYW5TZXRaSW5kZXgoaXRlbSkpO1xuICAgIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDA7XG59O1xuXG5jb25zdCB0b0NvbnRpZ3VvdXNHcm91cHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGFycmF5OiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBjdXJzb3IgPSAwO1xuICAgIHJldHVybiBhcnJheS5yZWR1Y2UoKGFjYywgdmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bdmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bYXJyYXlbaW5kZXggLSAxXV07XG4gICAgICAgICAgICBjb25zdCBpc0NvbnRpZ3VvdXMgPVxuICAgICAgICAgICAgICAgIHZhbHVlIC0gMSA9PT0gYXJyYXlbaW5kZXggLSAxXVxuICAgICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgICAgOiBib2FyZC5jaGlsZHJlbi5ldmVyeSgoaXRlbSwgY2hpbGRJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IGFycmF5W2luZGV4IC0gMV0gJiYgY2hpbGRJbmRleCA8PSB2YWx1ZSAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQbGFpdEdyb3VwRWxlbWVudC5pc0dyb3VwKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGlzUGFydGlhbFNlbGVjdEdyb3VwRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudD8uZ3JvdXBJZCB8fCAoY3VycmVudEVsZW1lbnQ/Lmdyb3VwSWQgJiYgcHJldmlvdXNFbGVtZW50Py5ncm91cElkICE9PSBjdXJyZW50RWxlbWVudD8uZ3JvdXBJZCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaXNQYXJ0aWFsU2VsZWN0UHJldmlvdXNHcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQuZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdoZXN0R3JvdXAgPSBnZXRIaWdoZXN0R3JvdXAoYm9hcmQsIHByZXZpb3VzRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlzUGFydGlhbFNlbGVjdFByZXZpb3VzR3JvdXAgPSAhaXNTZWxlY3RlZEFsbEVsZW1lbnRzSW5Hcm91cChib2FyZCwgaGlnaGVzdEdyb3VwISk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5ncm91cElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RHcm91cCA9IGdldEhpZ2hlc3RHcm91cChib2FyZCwgY3VycmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudCA9ICFpc1NlbGVjdGVkQWxsRWxlbWVudHNJbkdyb3VwKGJvYXJkLCBoaWdoZXN0R3JvdXAhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNQYXJ0aWFsU2VsZWN0R3JvdXBFbGVtZW50ID0gaXNQYXJ0aWFsU2VsZWN0UHJldmlvdXNHcm91cCB8fCBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb250aWd1b3VzIHx8IGlzUGFydGlhbFNlbGVjdEdyb3VwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGN1cnNvciA9ICsrY3Vyc29yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIChhY2NbY3Vyc29yXSB8fCAoYWNjW2N1cnNvcl0gPSBbXSkpLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdIGFzIG51bWJlcltdW10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIG5leHQgY2FuZGlkYXRlIGluZGV4IHRoYXQncyBhdmFpbGFibGUgdG8gYmUgbW92ZWQgdG8uIEN1cnJlbnRseSB0aGF0XG4gKiAgaXMgYSBub24tZGVsZXRlZCBlbGVtZW50LCBhbmQgbm90IGluc2lkZSBhIGdyb3VwICh1bmxlc3Mgd2UncmUgZWRpdGluZyBpdCkuXG4gKi9cbmNvbnN0IGdldFRhcmdldEluZGV4ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBib3VuZGFyeUluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ2Rvd24nIHwgJ3VwJykgPT4ge1xuICAgIGlmICgoYm91bmRhcnlJbmRleCA9PT0gMCAmJiBkaXJlY3Rpb24gPT09ICdkb3duJykgfHwgKGJvdW5kYXJ5SW5kZXggPT09IGJvYXJkLmNoaWxkcmVuLmxlbmd0aCAtIDEgJiYgZGlyZWN0aW9uID09PSAndXAnKSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4RmlsdGVyID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5pc0RlbGV0ZWQgfHwgUGxhaXRHcm91cEVsZW1lbnQuaXNHcm91cChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgY29uc3QgY2FuZGlkYXRlSW5kZXggPVxuICAgICAgICBkaXJlY3Rpb24gPT09ICdkb3duJ1xuICAgICAgICAgICAgPyBmaW5kTGFzdEluZGV4KGJvYXJkLmNoaWxkcmVuLCBlbCA9PiBpbmRleEZpbHRlcihlbCksIE1hdGgubWF4KDAsIGJvdW5kYXJ5SW5kZXggLSAxKSlcbiAgICAgICAgICAgIDogZmluZEluZGV4KGJvYXJkLmNoaWxkcmVuLCBlbCA9PiBpbmRleEZpbHRlcihlbCksIGJvdW5kYXJ5SW5kZXggKyAxKTtcblxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bY2FuZGlkYXRlSW5kZXhdO1xuICAgIGlmICghbmV4dEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmJvYXJkLmNoaWxkcmVuXTtcbiAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gZWxlbWVudHNbYm91bmRhcnlJbmRleF07XG4gICAgY29uc3QgZWRpdGluZ0dyb3VwID0gZ2V0RWRpdGluZ0dyb3VwKGJvYXJkLCBzb3VyY2VFbGVtZW50KTtcbiAgICBjb25zdCBuZXh0RWxlbWVudEdyb3VwcyA9IChnZXRHcm91cEJ5RWxlbWVudChib2FyZCwgbmV4dEVsZW1lbnQsIHRydWUpIHx8IFtdKSBhcyBQbGFpdEdyb3VwW107XG4gICAgLy8gY2FuZGlkYXRlIGVsZW1lbnQgaXMgYSBzaWJsaW5nIGluIGN1cnJlbnQgZWRpdGluZyBncm91cCDihpIgcmV0dXJuXG4gICAgaWYgKGVkaXRpbmdHcm91cCAmJiBzb3VyY2VFbGVtZW50Py5ncm91cElkICE9PSBuZXh0RWxlbWVudD8uZ3JvdXBJZCkge1xuICAgICAgICAvLyBjYW5kaWRhdGUgZWxlbWVudCBpcyBvdXRzaWRlIGN1cnJlbnQgZWRpdGluZyBncm91cCDihpIgcHJldmVudFxuICAgICAgICBpZiAoIShuZXh0RWxlbWVudEdyb3VwcyBhcyBQbGFpdEdyb3VwW10pLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBlZGl0aW5nR3JvdXAuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5leHRFbGVtZW50Lmdyb3VwSWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZUluZGV4O1xuICAgIH1cblxuICAgIGxldCBzaWJsaW5nR3JvdXA6IFBsYWl0R3JvdXA7XG4gICAgaWYgKGVkaXRpbmdHcm91cCkge1xuICAgICAgICBzaWJsaW5nR3JvdXAgPSBuZXh0RWxlbWVudEdyb3Vwc1tuZXh0RWxlbWVudEdyb3Vwcy5pbmRleE9mKGVkaXRpbmdHcm91cCkgLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzaWJsaW5nR3JvdXAgPSBuZXh0RWxlbWVudEdyb3Vwc1tuZXh0RWxlbWVudEdyb3Vwcy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgaWYgKHNpYmxpbmdHcm91cCkge1xuICAgICAgICBsZXQgZWxlbWVudHNJblNpYmxpbmdHcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cChib2FyZCwgc2libGluZ0dyb3VwLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIGlmIChlbGVtZW50c0luU2libGluZ0dyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudHNJblNpYmxpbmdHcm91cC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXhBID0gYm9hcmQuY2hpbGRyZW4uZmluZEluZGV4KGNoaWxkID0+IGNoaWxkLmlkID09PSBhLmlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleEIgPSBib2FyZC5jaGlsZHJlbi5maW5kSW5kZXgoY2hpbGQgPT4gY2hpbGQuaWQgPT09IGIuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGFzc3VtZXMgZ2V0RWxlbWVudHNJbkdyb3VwKCkgcmV0dXJuZWQgZWxlbWVudHMgYXJlIHNvcnRlZFxuICAgICAgICAgICAgLy8gYnkgekluZGV4IChhc2NlbmRpbmcpXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnZG93bidcbiAgICAgICAgICAgICAgICA/IGVsZW1lbnRzLmluZGV4T2YoZWxlbWVudHNJblNpYmxpbmdHcm91cFswXSlcbiAgICAgICAgICAgICAgICA6IGVsZW1lbnRzLmluZGV4T2YoZWxlbWVudHNJblNpYmxpbmdHcm91cFtlbGVtZW50c0luU2libGluZ0dyb3VwLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjYW5kaWRhdGVJbmRleDtcbn07XG4iXX0=
|