ngx-vflow 0.13.0-0 → 0.13.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.
Files changed (26) hide show
  1. package/esm2022/lib/vflow/components/node/node.component.mjs +3 -3
  2. package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +13 -4
  3. package/esm2022/lib/vflow/directives/root-pointer.directive.mjs +1 -1
  4. package/esm2022/lib/vflow/directives/selectable.directive.mjs +5 -2
  5. package/esm2022/lib/vflow/public-components/resizable/resizable.component.mjs +124 -180
  6. package/esm2022/lib/vflow/services/draggable.service.mjs +40 -19
  7. package/esm2022/lib/vflow/services/keyboard.service.mjs +45 -0
  8. package/esm2022/lib/vflow/services/node-changes.service.mjs +6 -7
  9. package/esm2022/lib/vflow/services/selection.service.mjs +12 -5
  10. package/esm2022/lib/vflow/types/keyboard-action.type.mjs +2 -0
  11. package/esm2022/lib/vflow/utils/get-os.mjs +24 -0
  12. package/esm2022/public-api.mjs +2 -1
  13. package/fesm2022/ngx-vflow.mjs +257 -214
  14. package/fesm2022/ngx-vflow.mjs.map +1 -1
  15. package/lib/vflow/components/vflow/vflow.component.d.ts +4 -1
  16. package/lib/vflow/directives/root-pointer.directive.d.ts +10 -16
  17. package/lib/vflow/directives/space-point-context.directive.d.ts +1 -15
  18. package/lib/vflow/models/edge.model.d.ts +17 -1
  19. package/lib/vflow/public-components/resizable/resizable.component.d.ts +6 -11
  20. package/lib/vflow/services/draggable.service.d.ts +2 -0
  21. package/lib/vflow/services/keyboard.service.d.ts +11 -0
  22. package/lib/vflow/services/selection.service.d.ts +1 -0
  23. package/lib/vflow/types/keyboard-action.type.d.ts +2 -0
  24. package/lib/vflow/utils/get-os.d.ts +1 -0
  25. package/package.json +1 -1
  26. package/public-api.d.ts +1 -0
@@ -8,6 +8,7 @@ import { round } from '../../utils/round';
8
8
  import { Microtask } from '../../decorators/microtask.decorator';
9
9
  import { getNodesBounds } from '../../utils/nodes';
10
10
  import { NodeAccessorService } from '../../services/node-accessor.service';
11
+ import { SpacePointContextDirective } from '../../directives/space-point-context.directive';
11
12
  import * as i0 from "@angular/core";
12
13
  import * as i1 from "../../directives/pointer.directive";
13
14
  export class ResizableComponent {
@@ -15,6 +16,7 @@ export class ResizableComponent {
15
16
  this.nodeAccessor = inject(NodeAccessorService);
16
17
  this.rootPointer = inject(RootPointerDirective);
17
18
  this.viewportService = inject(ViewportService);
19
+ this.spacePointContext = inject(SpacePointContextDirective);
18
20
  this.hostRef = inject(ElementRef);
19
21
  this.resizerColor = '#2e414c';
20
22
  this.gap = 1.5;
@@ -26,7 +28,7 @@ export class ResizableComponent {
26
28
  this.minHeight = 0;
27
29
  // TODO: allow reszie beside the flow
28
30
  this.resizeOnGlobalMouseMove = this.rootPointer.pointerMovement$
29
- .pipe(filter(() => this.resizeSide !== null), tap((event) => this.resize(event)), takeUntilDestroyed())
31
+ .pipe(filter(() => this.resizeSide !== null), filter((event) => event.movementX !== 0 || event.movementY !== 0), tap((event) => this.resize(event)), takeUntilDestroyed())
30
32
  .subscribe();
31
33
  this.endResizeOnGlobalMouseUp = this.rootPointer.documentPointerEnd$
32
34
  .pipe(tap(() => this.endResize()), takeUntilDestroyed())
@@ -55,193 +57,55 @@ export class ResizableComponent {
55
57
  this.resizeSide = side;
56
58
  this.model.resizing.set(true);
57
59
  }
58
- resize({ movementX, movementY }) {
59
- const offsetX = round(movementX / this.zoom());
60
- const offsetY = round(movementY / this.zoom());
61
- switch (this.resizeSide) {
62
- case 'left':
63
- let x = this.model.point().x + offsetX;
64
- x = Math.max(x, this.getMinX());
65
- x = Math.min(x, this.getMaxX());
66
- // TODO this fixes increasing width when current node hits the parent
67
- if (x === this.getMinX() || x === this.getMaxX()) {
68
- return;
69
- }
70
- this.model.setPoint({ x, y: this.model.point().y }, false);
71
- this.model.size.update(({ height, width }) => {
72
- width -= offsetX;
73
- width = Math.max(width, this.minWidth);
74
- width = Math.min(width, this.getMaxWidth());
75
- return { height, width: width };
76
- });
77
- return;
78
- case 'right':
79
- this.model.size.update(({ height, width }) => {
80
- width += offsetX;
81
- width = Math.max(width, this.minWidth);
82
- width = Math.min(width, this.getMaxWidth());
83
- const bounds = getNodesBounds(this.model.children());
84
- width = Math.max(width, bounds.x + bounds.width);
85
- return { height, width };
86
- });
87
- return;
88
- case 'top':
89
- let y = this.model.point().y + offsetY;
90
- y = Math.max(y, this.getMinY());
91
- y = Math.min(y, this.getMaxY());
92
- if (y === this.getMinY() || y === this.getMaxY()) {
93
- return;
94
- }
95
- this.model.setPoint({ x: this.model.point().x, y }, false);
96
- this.model.size.update(({ height, width }) => {
97
- height -= offsetY;
98
- height = Math.max(height, this.minHeight);
99
- height = Math.min(height, this.getMaxHeight());
100
- return { width, height };
101
- });
102
- return;
103
- case 'bottom':
104
- this.model.size.update(({ height, width }) => {
105
- height += offsetY;
106
- height = Math.max(height, this.minHeight);
107
- height = Math.min(height, this.getMaxHeight());
108
- const bounds = getNodesBounds(this.model.children());
109
- height = Math.max(height, bounds.y + bounds.height);
110
- return { width, height };
111
- });
112
- return;
113
- case 'top-left': {
114
- let x = this.model.point().x + offsetX;
115
- x = Math.max(x, this.getMinX());
116
- x = Math.min(x, this.getMaxX());
117
- let y = this.model.point().y + offsetY;
118
- y = Math.max(y, this.getMinY());
119
- y = Math.min(y, this.getMaxY());
120
- if (x === this.getMinX() || y === this.getMinY() ||
121
- x === this.getMaxX() || y === this.getMaxY()) {
122
- return;
123
- }
124
- this.model.setPoint({ x, y }, false);
125
- this.model.size.update(({ height, width }) => {
126
- width -= offsetX;
127
- width = Math.max(width, this.minWidth);
128
- width = Math.min(width, this.getMaxWidth());
129
- height -= offsetY;
130
- height = Math.max(height, this.minHeight);
131
- height = Math.min(height, this.getMaxHeight());
132
- return { height, width };
133
- });
134
- return;
135
- }
136
- case 'top-right': {
137
- let y = this.model.point().y + offsetY;
138
- y = Math.max(y, this.getMinY());
139
- y = Math.min(y, this.getMaxY());
140
- if (y === this.getMinX() || y === this.getMaxY()) {
141
- return;
142
- }
143
- this.model.setPoint({ x: this.model.point().x, y }, false);
144
- this.model.size.update(({ height, width }) => {
145
- const bounds = getNodesBounds(this.model.children());
146
- width += offsetX;
147
- width = Math.max(width, this.minWidth);
148
- width = Math.min(width, this.getMaxWidth());
149
- width = Math.max(width, bounds.x + bounds.width);
150
- height -= offsetY;
151
- height = Math.max(height, this.minHeight);
152
- height = Math.min(height, this.getMaxHeight());
153
- return { height, width };
154
- });
155
- return;
156
- }
157
- case 'bottom-left': {
158
- let x = this.model.point().x + offsetX;
159
- x = Math.max(x, this.getMinX());
160
- x = Math.min(x, this.getMaxX());
161
- if (x === this.getMinX() || x === this.getMaxX()) {
162
- return;
163
- }
164
- this.model.setPoint({ x, y: this.model.point().y }, false);
165
- this.model.size.update(({ height, width }) => {
166
- width -= offsetX;
167
- width = Math.max(width, this.minWidth);
168
- width = Math.min(width, this.getMaxWidth());
169
- height += offsetY;
170
- height = Math.max(height, this.minHeight);
171
- height = Math.min(height, this.getMaxHeight());
172
- const bounds = getNodesBounds(this.model.children());
173
- height = Math.max(height, bounds.y + bounds.height);
174
- return { height, width };
175
- });
176
- return;
177
- }
178
- case 'bottom-right': {
179
- this.model.size.update(({ height, width }) => {
180
- const bounds = getNodesBounds(this.model.children());
181
- width += offsetX;
182
- width = Math.max(width, this.minWidth);
183
- width = Math.min(width, this.getMaxWidth());
184
- width = Math.max(width, bounds.x + bounds.width);
185
- height += offsetY;
186
- height = Math.max(height, this.minHeight);
187
- height = Math.min(height, this.getMaxHeight());
188
- height = Math.max(height, bounds.y + bounds.height);
189
- return { height, width };
190
- });
191
- }
192
- }
60
+ resize(event) {
61
+ if (!this.resizeSide)
62
+ return;
63
+ if (this.isResizeConstrained(event))
64
+ return;
65
+ const offset = calcOffset(event.movementX, event.movementY, this.zoom());
66
+ const { x, y, width, height } = constrainRect(applyResize(this.resizeSide, this.model, offset), this.model, this.resizeSide, this.minWidth, this.minHeight);
67
+ this.model.setPoint({ x, y }, false);
68
+ this.model.size.set({ width, height });
193
69
  }
194
70
  endResize() {
195
71
  this.resizeSide = null;
196
72
  this.model.resizing.set(false);
197
73
  }
198
- getMaxWidth() {
199
- const parent = this.model.parent();
200
- if (parent) {
201
- return parent.size().width - this.model.point().x;
202
- }
203
- return Infinity;
204
- }
205
- getMaxHeight() {
206
- const parent = this.model.parent();
207
- if (parent) {
208
- return parent.size().height - this.model.point().y;
209
- }
210
- return Infinity;
211
- }
212
- getMinX() {
213
- const parent = this.model.parent();
214
- if (parent) {
215
- return 0;
74
+ isResizeConstrained({ x, y, movementX, movementY }) {
75
+ const flowPoint = this.spacePointContext.documentPointToFlowPoint({ x, y });
76
+ if (this.resizeSide?.includes('right')) {
77
+ if (movementX > 0 && flowPoint.x < (this.model.point().x + this.model.size().width)) {
78
+ return true;
79
+ }
80
+ if (movementX < 0 && flowPoint.x > this.model.point().x + this.model.size().width) {
81
+ return true;
82
+ }
216
83
  }
217
- return -Infinity;
218
- }
219
- getMinY() {
220
- const parent = this.model.parent();
221
- if (parent) {
222
- return 0;
84
+ if (this.resizeSide?.includes('left')) {
85
+ if (movementX < 0 && flowPoint.x > this.model.point().x) {
86
+ return true;
87
+ }
88
+ if (movementX > 0 && flowPoint.x < this.model.point().x) {
89
+ return true;
90
+ }
223
91
  }
224
- return -Infinity;
225
- }
226
- getMaxX() {
227
- const x = this.model.point().x;
228
- const width = this.model.size().width;
229
- const children = this.model.children();
230
- if (children) {
231
- const bounds = getNodesBounds(children);
232
- return x + (bounds.x + bounds.width) >= x + width ? x : (width - this.minWidth) + x;
92
+ if (this.resizeSide?.includes('bottom')) {
93
+ if (movementY > 0 && flowPoint.y < (this.model.point().y + this.model.size().height)) {
94
+ return true;
95
+ }
96
+ if (movementY < 0 && flowPoint.y > this.model.point().y + this.model.size().height) {
97
+ return true;
98
+ }
233
99
  }
234
- return (width - this.minWidth) + x;
235
- }
236
- getMaxY() {
237
- const y = this.model.point().y;
238
- const height = this.model.size().height;
239
- const children = this.model.children();
240
- if (children) {
241
- const bounds = getNodesBounds(children);
242
- return y + (bounds.y + bounds.height) >= y + height ? y : (height - this.minHeight) + y;
100
+ if (this.resizeSide?.includes('top')) {
101
+ if (movementY < 0 && flowPoint.y > this.model.point().y) {
102
+ return true;
103
+ }
104
+ if (movementY > 0 && flowPoint.y < this.model.point().y) {
105
+ return true;
106
+ }
243
107
  }
244
- return (height - this.minHeight) + y;
108
+ return false;
245
109
  }
246
110
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResizableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
247
111
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResizableComponent, selector: "[resizable]", inputs: { resizable: "resizable", resizerColor: "resizerColor", gap: "gap" }, viewQueries: [{ propertyName: "resizer", first: true, predicate: ["resizer"], descendants: true, static: true }], ngImport: i0, template: "<ng-template #resizer>\n <svg:g>\n <!-- top line -->\n <svg:line\n class=\"top\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"-gap\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"-gap\"\n [attr.stroke]=\"resizerColor\"\n stroke-width=\"2\"\n (pointerStart)=\"startResize('top', $event)\"\n />\n <!-- Left line -->\n <svg:line\n class=\"left\"\n [attr.x1]=\"-gap\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"-gap\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor\"\n stroke-width=\"2\"\n (pointerStart)=\"startResize('left', $event)\"\n />\n <!-- Bottom line -->\n <svg:line\n class=\"bottom\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"model.size().height + gap\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"model.size().height + gap\"\n [attr.stroke]=\"resizerColor\"\n stroke-width=\"2\"\n (pointerStart)=\"startResize('bottom', $event)\"\n />\n <!-- Right line -->\n <svg:line\n class=\"right\"\n [attr.x1]=\"model.size().width + gap\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"model.size().width + gap\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor\"\n stroke-width=\"2\"\n (pointerStart)=\"startResize('right', $event)\"\n />\n\n <!-- Top Left -->\n <svg:rect\n class=\"top-left\"\n [attr.x]=\"-(handleSize / 2) - gap\"\n [attr.y]=\"-(handleSize / 2) - gap\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor\"\n (pointerStart)=\"startResize('top-left', $event)\"\n />\n\n <!-- Top right -->\n <svg:rect\n class=\"top-right\"\n [attr.x]=\"model.size().width - (handleSize / 2) + gap\"\n [attr.y]=\"-(handleSize / 2) - gap\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor\"\n (pointerStart)=\"startResize('top-right', $event)\"\n />\n\n <!-- Bottom left -->\n <svg:rect\n class=\"bottom-left\"\n [attr.x]=\"-(handleSize / 2) - gap\"\n [attr.y]=\"model.size().height - (handleSize / 2) + gap\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor\"\n (pointerStart)=\"startResize('bottom-left', $event)\"\n />\n\n <!-- Bottom right -->\n <svg:rect\n class=\"bottom-right\"\n [attr.x]=\"model.size().width - (handleSize / 2) + gap\"\n [attr.y]=\"model.size().height - (handleSize / 2) + gap\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor\"\n (pointerStart)=\"startResize('bottom-right', $event)\"\n />\n </svg:g>\n</ng-template>\n\n<ng-content />\n", styles: [".top{cursor:n-resize}.left{cursor:w-resize}.right{cursor:e-resize}.bottom{cursor:s-resize}.top-left{cursor:nw-resize}.top-right{cursor:ne-resize}.bottom-left{cursor:sw-resize}.bottom-right{cursor:se-resize}\n"], dependencies: [{ kind: "directive", type: i1.PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }] }); }
@@ -262,4 +126,84 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
262
126
  type: ViewChild,
263
127
  args: ['resizer', { static: true }]
264
128
  }], ngAfterViewInit: [] } });
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXVCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7OztBQVMzRSxNQUFNLE9BQU8sa0JBQWtCO0lBTC9CO1FBTVUsaUJBQVksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMxQyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQzFDLG9CQUFl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O3lEQUlUOzRGQTlEVSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsYUFBYTs4QkFXWixTQUFTO3NCQURuQixLQUFLO2dCQVVDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsR0FBRztzQkFEVCxLQUFLO2dCQUlFLE9BQU87c0JBRGQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQXNDL0IsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgY29tcHV0ZWQsIEVsZW1lbnRSZWYsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm9vdFBvaW50ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3Jvb3QtcG9pbnRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFZpZXdwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tICcuLi8uLi91dGlscy9yb3VuZCc7XG5pbXBvcnQgeyBNaWNyb3Rhc2sgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL21pY3JvdGFzay5kZWNvcmF0b3InO1xuaW1wb3J0IHsgZ2V0Tm9kZXNCb3VuZHMgfSBmcm9tICcuLi8uLi91dGlscy9ub2Rlcyc7XG5pbXBvcnQgeyBOb2RlQWNjZXNzb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1hY2Nlc3Nvci5zZXJ2aWNlJztcblxudHlwZSBTaWRlID0gJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICd0b3AtbGVmdCcgfCAnYm90dG9tLXJpZ2h0JyB8ICdib3R0b20tbGVmdCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1tyZXNpemFibGVdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc2l6YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc2l6YWJsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJlc2l6YWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgbm9kZUFjY2Vzc29yID0gaW5qZWN0KE5vZGVBY2Nlc3NvclNlcnZpY2UpXG4gIHByaXZhdGUgcm9vdFBvaW50ZXIgPSBpbmplY3QoUm9vdFBvaW50ZXJEaXJlY3RpdmUpXG4gIHByaXZhdGUgdmlld3BvcnRTZXJ2aWNlID0gaW5qZWN0KFZpZXdwb3J0U2VydmljZSlcbiAgcHJpdmF0ZSBob3N0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8RWxlbWVudD4+KEVsZW1lbnRSZWYpXG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCByZXNpemFibGUodmFsdWU6IGJvb2xlYW4gfCAnJykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5tb2RlbC5yZXNpemFibGUuc2V0KHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGVsLnJlc2l6YWJsZS5zZXQodHJ1ZSlcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgcmVzaXplckNvbG9yID0gJyMyZTQxNGMnXG5cbiAgQElucHV0KClcbiAgcHVibGljIGdhcCA9IDEuNTtcblxuICBAVmlld0NoaWxkKCdyZXNpemVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSByZXNpemVyITogVGVtcGxhdGVSZWY8dW5rbm93bj5cblxuICBwcm90ZWN0ZWQgZ2V0IG1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVBY2Nlc3Nvci5tb2RlbCgpIVxuICB9XG5cbiAgcHJvdGVjdGVkIGxpbmVHYXAgPSAzXG4gIHByb3RlY3RlZCBoYW5kbGVTaXplID0gNlxuXG4gIHByaXZhdGUgcmVzaXplU2lkZTogU2lkZSB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSB6b29tID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnpvb20gPz8gMClcblxuICBwcml2YXRlIG1pbldpZHRoID0gMFxuICBwcml2YXRlIG1pbkhlaWdodCA9IDBcblxuICAvLyBUT0RPOiBhbGxvdyByZXN6aWUgYmVzaWRlIHRoZSBmbG93XG4gIHByb3RlY3RlZCByZXNpemVPbkdsb2JhbE1vdXNlTW92ZSA9IHRoaXMucm9vdFBvaW50ZXIucG9pbnRlck1vdmVtZW50JFxuICAgIC5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+IHRoaXMucmVzaXplU2lkZSAhPT0gbnVsbCksXG4gICAgICB0YXAoKGV2ZW50KSA9PiB0aGlzLnJlc2l6ZShldmVudCkpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKClcbiAgICApXG4gICAgLnN1YnNjcmliZSgpXG5cbiAgcHJvdGVjdGVkIGVuZFJlc2l6ZU9uR2xvYmFsTW91c2VVcCA9IHRoaXMucm9vdFBvaW50ZXIuZG9jdW1lbnRQb2ludGVyRW5kJFxuICAgIC5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuZW5kUmVzaXplKCkpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKClcbiAgICApXG4gICAgLnN1YnNjcmliZSgpXG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwucmVzaXplclRlbXBsYXRlLnNldCh0aGlzLnJlc2l6ZXIpXG4gIH1cblxuICBATWljcm90YXNrXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5taW5XaWR0aCA9ICtnZXRDb21wdXRlZFN0eWxlKHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50KS5taW5XaWR0aC5yZXBsYWNlKCdweCcsICcnKSB8fCAwXG4gICAgdGhpcy5taW5IZWlnaHQgPSArZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCkubWluSGVpZ2h0LnJlcGxhY2UoJ3B4JywgJycpIHx8IDBcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydFJlc2l6ZShzaWRlOiBTaWRlLCBldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgdGhpcy5yZXNpemVTaWRlID0gc2lkZVxuICAgIHRoaXMubW9kZWwucmVzaXppbmcuc2V0KHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2l6ZSh7IG1vdmVtZW50WCwgbW92ZW1lbnRZIH06IHsgbW92ZW1lbnRYOiBudW1iZXIsIG1vdmVtZW50WTogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBvZmZzZXRYID0gcm91bmQobW92ZW1lbnRYIC8gdGhpcy56b29tKCkpXG4gICAgY29uc3Qgb2Zmc2V0WSA9IHJvdW5kKG1vdmVtZW50WSAvIHRoaXMuem9vbSgpKVxuXG4gICAgc3dpdGNoICh0aGlzLnJlc2l6ZVNpZGUpIHtcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICBsZXQgeCA9IHRoaXMubW9kZWwucG9pbnQoKS54ICsgb2Zmc2V0WFxuICAgICAgICB4ID0gTWF0aC5tYXgoeCwgdGhpcy5nZXRNaW5YKCkpXG4gICAgICAgIHggPSBNYXRoLm1pbih4LCB0aGlzLmdldE1heFgoKSlcblxuICAgICAgICAvLyBUT0RPIHRoaXMgZml4ZXMgaW5jcmVhc2luZyB3aWR0aCB3aGVuIGN1cnJlbnQgbm9kZSBoaXRzIHRoZSBwYXJlbnRcbiAgICAgICAgaWYgKHggPT09IHRoaXMuZ2V0TWluWCgpIHx8IHggPT09IHRoaXMuZ2V0TWF4WCgpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGVsLnNldFBvaW50KHsgeCwgeTogdGhpcy5tb2RlbC5wb2ludCgpLnkgfSwgZmFsc2UpXG5cbiAgICAgICAgdGhpcy5tb2RlbC5zaXplLnVwZGF0ZSgoeyBoZWlnaHQsIHdpZHRoIH0pID0+IHtcbiAgICAgICAgICB3aWR0aCAtPSBvZmZzZXRYXG4gICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgdGhpcy5taW5XaWR0aClcbiAgICAgICAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoLCB0aGlzLmdldE1heFdpZHRoKCkpXG5cbiAgICAgICAgICByZXR1cm4geyBoZWlnaHQsIHdpZHRoOiB3aWR0aCB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHRoaXMubW9kZWwuc2l6ZS51cGRhdGUoKHsgaGVpZ2h0LCB3aWR0aCB9KSA9PiB7XG4gICAgICAgICAgd2lkdGggKz0gb2Zmc2V0WFxuICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIHRoaXMubWluV2lkdGgpXG4gICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgdGhpcy5nZXRNYXhXaWR0aCgpKVxuXG4gICAgICAgICAgY29uc3QgYm91bmRzID0gZ2V0Tm9kZXNCb3VuZHModGhpcy5tb2RlbC5jaGlsZHJlbigpKVxuICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoKVxuXG4gICAgICAgICAgcmV0dXJuIHsgaGVpZ2h0LCB3aWR0aCB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICBsZXQgeSA9IHRoaXMubW9kZWwucG9pbnQoKS55ICsgb2Zmc2V0WVxuICAgICAgICB5ID0gTWF0aC5tYXgoeSwgdGhpcy5nZXRNaW5ZKCkpXG4gICAgICAgIHkgPSBNYXRoLm1pbih5LCB0aGlzLmdldE1heFkoKSlcblxuICAgICAgICBpZiAoeSA9PT0gdGhpcy5nZXRNaW5ZKCkgfHwgeSA9PT0gdGhpcy5nZXRNYXhZKCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kZWwuc2V0UG9pbnQoeyB4OiB0aGlzLm1vZGVsLnBvaW50KCkueCwgeSB9LCBmYWxzZSlcblxuICAgICAgICB0aGlzLm1vZGVsLnNpemUudXBkYXRlKCh7IGhlaWdodCwgd2lkdGggfSkgPT4ge1xuICAgICAgICAgIGhlaWdodCAtPSBvZmZzZXRZXG4gICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCB0aGlzLm1pbkhlaWdodClcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHRoaXMuZ2V0TWF4SGVpZ2h0KCkpXG5cbiAgICAgICAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHRoaXMubW9kZWwuc2l6ZS51cGRhdGUoKHsgaGVpZ2h0LCB3aWR0aCB9KSA9PiB7XG4gICAgICAgICAgaGVpZ2h0ICs9IG9mZnNldFlcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHRoaXMubWluSGVpZ2h0KVxuICAgICAgICAgIGhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgdGhpcy5nZXRNYXhIZWlnaHQoKSlcblxuICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGdldE5vZGVzQm91bmRzKHRoaXMubW9kZWwuY2hpbGRyZW4oKSlcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodClcblxuICAgICAgICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVyblxuXG4gICAgICBjYXNlICd0b3AtbGVmdCc6IHtcbiAgICAgICAgbGV0IHggPSB0aGlzLm1vZGVsLnBvaW50KCkueCArIG9mZnNldFhcbiAgICAgICAgeCA9IE1hdGgubWF4KHgsIHRoaXMuZ2V0TWluWCgpKVxuICAgICAgICB4ID0gTWF0aC5taW4oeCwgdGhpcy5nZXRNYXhYKCkpXG5cbiAgICAgICAgbGV0IHkgPSB0aGlzLm1vZGVsLnBvaW50KCkueSArIG9mZnNldFlcbiAgICAgICAgeSA9IE1hdGgubWF4KHksIHRoaXMuZ2V0TWluWSgpKVxuICAgICAgICB5ID0gTWF0aC5taW4oeSwgdGhpcy5nZXRNYXhZKCkpXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHggPT09IHRoaXMuZ2V0TWluWCgpIHx8IHkgPT09IHRoaXMuZ2V0TWluWSgpIHx8XG4gICAgICAgICAgeCA9PT0gdGhpcy5nZXRNYXhYKCkgfHwgeSA9PT0gdGhpcy5nZXRNYXhZKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGVsLnNldFBvaW50KHsgeCwgeSB9LCBmYWxzZSlcblxuICAgICAgICB0aGlzLm1vZGVsLnNpemUudXBkYXRlKCh7IGhlaWdodCwgd2lkdGggfSkgPT4ge1xuICAgICAgICAgIHdpZHRoIC09IG9mZnNldFhcbiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCB0aGlzLm1pbldpZHRoKVxuICAgICAgICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIHRoaXMuZ2V0TWF4V2lkdGgoKSlcblxuICAgICAgICAgIGhlaWdodCAtPSBvZmZzZXRZXG4gICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCB0aGlzLm1pbkhlaWdodClcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHRoaXMuZ2V0TWF4SGVpZ2h0KCkpXG5cbiAgICAgICAgICByZXR1cm4geyBoZWlnaHQsIHdpZHRoIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY2FzZSAndG9wLXJpZ2h0Jzoge1xuICAgICAgICBsZXQgeSA9IHRoaXMubW9kZWwucG9pbnQoKS55ICsgb2Zmc2V0WVxuICAgICAgICB5ID0gTWF0aC5tYXgoeSwgdGhpcy5nZXRNaW5ZKCkpXG4gICAgICAgIHkgPSBNYXRoLm1pbih5LCB0aGlzLmdldE1heFkoKSlcblxuICAgICAgICBpZiAoeSA9PT0gdGhpcy5nZXRNaW5YKCkgfHwgeSA9PT0gdGhpcy5nZXRNYXhZKCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kZWwuc2V0UG9pbnQoeyB4OiB0aGlzLm1vZGVsLnBvaW50KCkueCwgeSB9LCBmYWxzZSlcblxuICAgICAgICB0aGlzLm1vZGVsLnNpemUudXBkYXRlKCh7IGhlaWdodCwgd2lkdGggfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGdldE5vZGVzQm91bmRzKHRoaXMubW9kZWwuY2hpbGRyZW4oKSlcblxuICAgICAgICAgIHdpZHRoICs9IG9mZnNldFhcbiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCB0aGlzLm1pbldpZHRoKVxuICAgICAgICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIHRoaXMuZ2V0TWF4V2lkdGgoKSlcbiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBib3VuZHMueCArIGJvdW5kcy53aWR0aClcblxuXG4gICAgICAgICAgaGVpZ2h0IC09IG9mZnNldFlcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHRoaXMubWluSGVpZ2h0KVxuICAgICAgICAgIGhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgdGhpcy5nZXRNYXhIZWlnaHQoKSlcblxuICAgICAgICAgIHJldHVybiB7IGhlaWdodCwgd2lkdGggfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjYXNlICdib3R0b20tbGVmdCc6IHtcbiAgICAgICAgbGV0IHggPSB0aGlzLm1vZGVsLnBvaW50KCkueCArIG9mZnNldFhcbiAgICAgICAgeCA9IE1hdGgubWF4KHgsIHRoaXMuZ2V0TWluWCgpKVxuICAgICAgICB4ID0gTWF0aC5taW4oeCwgdGhpcy5nZXRNYXhYKCkpXG5cbiAgICAgICAgaWYgKHggPT09IHRoaXMuZ2V0TWluWCgpIHx8IHggPT09IHRoaXMuZ2V0TWF4WCgpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGVsLnNldFBvaW50KHsgeCwgeTogdGhpcy5tb2RlbC5wb2ludCgpLnkgfSwgZmFsc2UpXG5cbiAgICAgICAgdGhpcy5tb2RlbC5zaXplLnVwZGF0ZSgoeyBoZWlnaHQsIHdpZHRoIH0pID0+IHtcbiAgICAgICAgICB3aWR0aCAtPSBvZmZzZXRYXG4gICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgdGhpcy5taW5XaWR0aClcbiAgICAgICAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoLCB0aGlzLmdldE1heFdpZHRoKCkpXG5cbiAgICAgICAgICBoZWlnaHQgKz0gb2Zmc2V0WVxuICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgdGhpcy5taW5IZWlnaHQpXG4gICAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCB0aGlzLmdldE1heEhlaWdodCgpKVxuXG4gICAgICAgICAgY29uc3QgYm91bmRzID0gZ2V0Tm9kZXNCb3VuZHModGhpcy5tb2RlbC5jaGlsZHJlbigpKVxuICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KVxuXG4gICAgICAgICAgcmV0dXJuIHsgaGVpZ2h0LCB3aWR0aCB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6IHtcbiAgICAgICAgdGhpcy5tb2RlbC5zaXplLnVwZGF0ZSgoeyBoZWlnaHQsIHdpZHRoIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBnZXROb2Rlc0JvdW5kcyh0aGlzLm1vZGVsLmNoaWxkcmVuKCkpXG5cbiAgICAgICAgICB3aWR0aCArPSBvZmZzZXRYXG4gICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgdGhpcy5taW5XaWR0aClcbiAgICAgICAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoLCB0aGlzLmdldE1heFdpZHRoKCkpXG4gICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYm91bmRzLnggKyBib3VuZHMud2lkdGgpXG5cblxuICAgICAgICAgIGhlaWdodCArPSBvZmZzZXRZXG4gICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCB0aGlzLm1pbkhlaWdodClcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHRoaXMuZ2V0TWF4SGVpZ2h0KCkpXG4gICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpXG5cbiAgICAgICAgICByZXR1cm4geyBoZWlnaHQsIHdpZHRoIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5kUmVzaXplKCkge1xuICAgIHRoaXMucmVzaXplU2lkZSA9IG51bGxcbiAgICB0aGlzLm1vZGVsLnJlc2l6aW5nLnNldChmYWxzZSlcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWF4V2lkdGgoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5tb2RlbC5wYXJlbnQoKVxuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcmV0dXJuIHBhcmVudC5zaXplKCkud2lkdGggLSB0aGlzLm1vZGVsLnBvaW50KCkueFxuICAgIH1cblxuICAgIHJldHVybiBJbmZpbml0eVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXhIZWlnaHQoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5tb2RlbC5wYXJlbnQoKVxuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcmV0dXJuIHBhcmVudC5zaXplKCkuaGVpZ2h0IC0gdGhpcy5tb2RlbC5wb2ludCgpLnlcbiAgICB9XG5cbiAgICByZXR1cm4gSW5maW5pdHlcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWluWCgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLm1vZGVsLnBhcmVudCgpXG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiAtSW5maW5pdHlcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWluWSgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLm1vZGVsLnBhcmVudCgpXG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiAtSW5maW5pdHlcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWF4WCgpIHtcbiAgICBjb25zdCB4ID0gdGhpcy5tb2RlbC5wb2ludCgpLnhcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMubW9kZWwuc2l6ZSgpLndpZHRoXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLm1vZGVsLmNoaWxkcmVuKClcblxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY29uc3QgYm91bmRzID0gZ2V0Tm9kZXNCb3VuZHMoY2hpbGRyZW4pXG5cbiAgICAgIHJldHVybiB4ICsgKGJvdW5kcy54ICsgYm91bmRzLndpZHRoKSA+PSB4ICsgd2lkdGggPyB4IDogKHdpZHRoIC0gdGhpcy5taW5XaWR0aCkgKyB4XG4gICAgfVxuXG4gICAgcmV0dXJuICh3aWR0aCAtIHRoaXMubWluV2lkdGgpICsgeFxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXhZKCkge1xuICAgIGNvbnN0IHkgPSB0aGlzLm1vZGVsLnBvaW50KCkueVxuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMubW9kZWwuc2l6ZSgpLmhlaWdodFxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5tb2RlbC5jaGlsZHJlbigpXG5cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGJvdW5kcyA9IGdldE5vZGVzQm91bmRzKGNoaWxkcmVuKVxuXG4gICAgICByZXR1cm4geSArIChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpID49IHkgKyBoZWlnaHQgPyB5IDogKGhlaWdodCAtIHRoaXMubWluSGVpZ2h0KSArIHlcbiAgICB9XG5cbiAgICByZXR1cm4gKGhlaWdodCAtIHRoaXMubWluSGVpZ2h0KSArIHlcbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNyZXNpemVyPlxuICA8c3ZnOmc+XG4gICAgPCEtLSB0b3AgbGluZSAtLT5cbiAgICA8c3ZnOmxpbmVcbiAgICAgIGNsYXNzPVwidG9wXCJcbiAgICAgIFthdHRyLngxXT1cImxpbmVHYXBcIlxuICAgICAgW2F0dHIueTFdPVwiLWdhcFwiXG4gICAgICBbYXR0ci54Ml09XCJtb2RlbC5zaXplKCkud2lkdGggLSBsaW5lR2FwXCJcbiAgICAgIFthdHRyLnkyXT1cIi1nYXBcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cInJlc2l6ZXJDb2xvclwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ3RvcCcsICRldmVudClcIlxuICAgIC8+XG4gICAgPCEtLSBMZWZ0IGxpbmUgLS0+XG4gICAgPHN2ZzpsaW5lXG4gICAgICBjbGFzcz1cImxlZnRcIlxuICAgICAgW2F0dHIueDFdPVwiLWdhcFwiXG4gICAgICBbYXR0ci55MV09XCJsaW5lR2FwXCJcbiAgICAgIFthdHRyLngyXT1cIi1nYXBcIlxuICAgICAgW2F0dHIueTJdPVwibW9kZWwuc2l6ZSgpLmhlaWdodCAtIGxpbmVHYXBcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cInJlc2l6ZXJDb2xvclwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ2xlZnQnLCAkZXZlbnQpXCJcbiAgICAvPlxuICAgIDwhLS0gQm90dG9tIGxpbmUgLS0+XG4gICAgPHN2ZzpsaW5lXG4gICAgICBjbGFzcz1cImJvdHRvbVwiXG4gICAgICBbYXR0ci54MV09XCJsaW5lR2FwXCJcbiAgICAgIFthdHRyLnkxXT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgKyBnYXBcIlxuICAgICAgW2F0dHIueDJdPVwibW9kZWwuc2l6ZSgpLndpZHRoIC0gbGluZUdhcFwiXG4gICAgICBbYXR0ci55Ml09XCJtb2RlbC5zaXplKCkuaGVpZ2h0ICsgZ2FwXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJyZXNpemVyQ29sb3JcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdib3R0b20nLCAkZXZlbnQpXCJcbiAgICAvPlxuICAgIDwhLS0gUmlnaHQgbGluZSAtLT5cbiAgICA8c3ZnOmxpbmVcbiAgICAgIGNsYXNzPVwicmlnaHRcIlxuICAgICAgW2F0dHIueDFdPVwibW9kZWwuc2l6ZSgpLndpZHRoICsgZ2FwXCJcbiAgICAgIFthdHRyLnkxXT1cImxpbmVHYXBcIlxuICAgICAgW2F0dHIueDJdPVwibW9kZWwuc2l6ZSgpLndpZHRoICsgZ2FwXCJcbiAgICAgIFthdHRyLnkyXT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgLSBsaW5lR2FwXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJyZXNpemVyQ29sb3JcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdyaWdodCcsICRldmVudClcIlxuICAgIC8+XG5cbiAgICA8IS0tIFRvcCBMZWZ0IC0tPlxuICAgIDxzdmc6cmVjdFxuICAgICAgY2xhc3M9XCJ0b3AtbGVmdFwiXG4gICAgICBbYXR0ci54XT1cIi0oaGFuZGxlU2l6ZSAvIDIpIC0gZ2FwXCJcbiAgICAgIFthdHRyLnldPVwiLShoYW5kbGVTaXplIC8gMikgLSBnYXBcIlxuICAgICAgW2F0dHIud2lkdGhdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5maWxsXT1cInJlc2l6ZXJDb2xvclwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCd0b3AtbGVmdCcsICRldmVudClcIlxuICAgIC8+XG5cbiAgICA8IS0tIFRvcCByaWdodCAtLT5cbiAgICA8c3ZnOnJlY3RcbiAgICAgIGNsYXNzPVwidG9wLXJpZ2h0XCJcbiAgICAgIFthdHRyLnhdPVwibW9kZWwuc2l6ZSgpLndpZHRoIC0gKGhhbmRsZVNpemUgLyAyKSArIGdhcFwiXG4gICAgICBbYXR0ci55XT1cIi0oaGFuZGxlU2l6ZSAvIDIpIC0gZ2FwXCJcbiAgICAgIFthdHRyLndpZHRoXT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuZmlsbF09XCJyZXNpemVyQ29sb3JcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgndG9wLXJpZ2h0JywgJGV2ZW50KVwiXG4gICAgLz5cblxuICAgIDwhLS0gQm90dG9tIGxlZnQgLS0+XG4gICAgPHN2ZzpyZWN0XG4gICAgICBjbGFzcz1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIFthdHRyLnhdPVwiLShoYW5kbGVTaXplIC8gMikgLSBnYXBcIlxuICAgICAgW2F0dHIueV09XCJtb2RlbC5zaXplKCkuaGVpZ2h0IC0gKGhhbmRsZVNpemUgLyAyKSArIGdhcFwiXG4gICAgICBbYXR0ci53aWR0aF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmZpbGxdPVwicmVzaXplckNvbG9yXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ2JvdHRvbS1sZWZ0JywgJGV2ZW50KVwiXG4gICAgLz5cblxuICAgIDwhLS0gQm90dG9tIHJpZ2h0IC0tPlxuICAgIDxzdmc6cmVjdFxuICAgICAgY2xhc3M9XCJib3R0b20tcmlnaHRcIlxuICAgICAgW2F0dHIueF09XCJtb2RlbC5zaXplKCkud2lkdGggLSAoaGFuZGxlU2l6ZSAvIDIpICsgZ2FwXCJcbiAgICAgIFthdHRyLnldPVwibW9kZWwuc2l6ZSgpLmhlaWdodCAtIChoYW5kbGVTaXplIC8gMikgKyBnYXBcIlxuICAgICAgW2F0dHIud2lkdGhdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5maWxsXT1cInJlc2l6ZXJDb2xvclwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdib3R0b20tcmlnaHQnLCAkZXZlbnQpXCJcbiAgICAvPlxuICA8L3N2ZzpnPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRlbnQgLz5cbiJdfQ==
129
+ function calcOffset(movementX, movementY, zoom) {
130
+ return {
131
+ offsetX: round(movementX / zoom),
132
+ offsetY: round(movementY / zoom)
133
+ };
134
+ }
135
+ function applyResize(side, model, offset) {
136
+ const { offsetX, offsetY } = offset;
137
+ const { x, y } = model.point();
138
+ const { width, height } = model.size();
139
+ // Handle each case of resizing (top, bottom, left, right, corners)
140
+ switch (side) {
141
+ case 'left':
142
+ return { x: x + offsetX, y, width: width - offsetX, height };
143
+ case 'right':
144
+ return { x, y, width: width + offsetX, height };
145
+ case 'top':
146
+ return { x, y: y + offsetY, width, height: height - offsetY };
147
+ case 'bottom':
148
+ return { x, y, width, height: height + offsetY };
149
+ case 'top-left':
150
+ return { x: x + offsetX, y: y + offsetY, width: width - offsetX, height: height - offsetY };
151
+ case 'top-right':
152
+ return { x, y: y + offsetY, width: width + offsetX, height: height - offsetY };
153
+ case 'bottom-left':
154
+ return { x: x + offsetX, y, width: width - offsetX, height: height + offsetY };
155
+ case 'bottom-right':
156
+ return { x, y, width: width + offsetX, height: height + offsetY };
157
+ }
158
+ }
159
+ function constrainRect(rect, model, side, minWidth, minHeight) {
160
+ let { x, y, width, height } = rect;
161
+ // 1. Prevent negative dimensions
162
+ width = Math.max(width, 0);
163
+ height = Math.max(height, 0);
164
+ // 2. Apply minimum size constraints
165
+ width = Math.max(minWidth, width);
166
+ height = Math.max(minHeight, height);
167
+ // Apply left/top constraints based on minimum size
168
+ x = Math.min(x, model.point().x + model.size().width - minWidth);
169
+ y = Math.min(y, model.point().y + model.size().height - minHeight);
170
+ const parent = model.parent();
171
+ // 3. Apply maximum size constraints based on parent size (if exists)
172
+ if (parent) {
173
+ x = Math.max(x, 0); // Left boundary of the parent
174
+ y = Math.max(y, 0); // Top boundary of the parent
175
+ if (x === 0) {
176
+ width = model.point().x + model.size().width;
177
+ }
178
+ if (y === 0) {
179
+ height = model.point().y + model.size().height;
180
+ }
181
+ width = Math.min(width, parent.size().width - model.point().x);
182
+ height = Math.min(height, parent.size().height - model.point().y);
183
+ }
184
+ const bounds = getNodesBounds(model.children());
185
+ // 4. Apply child node constraints (if children exist)
186
+ if (bounds) {
187
+ if (side.includes('left')) {
188
+ x = Math.min(x, (model.point().x + model.size().width) - (bounds.x + bounds.width));
189
+ width = Math.max(width, bounds.x + bounds.width);
190
+ }
191
+ if (side.includes('right')) {
192
+ width = Math.max(width, bounds.x + bounds.width);
193
+ }
194
+ if (side.includes('bottom')) {
195
+ height = Math.max(height, bounds.y + bounds.height);
196
+ }
197
+ if (side.includes('top')) {
198
+ y = Math.min(y, (model.point().y + model.size().height) - (bounds.y + bounds.height));
199
+ height = Math.max(height, bounds.y + bounds.height);
200
+ }
201
+ }
202
+ return {
203
+ x,
204
+ y,
205
+ width,
206
+ height
207
+ };
208
+ }
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXVCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFJM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7OztBQVM1RixNQUFNLE9BQU8sa0JBQWtCO0lBTC9CO1FBTVUsaUJBQVksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMxQyxnQkFB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TUFBTSxDQUFDLENBQUMsQ0FBQTtZQUNyRixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDcEQ7S0FDRjtJQUVELE9BQU87UUFDTCxDQUFDO1FBQ0QsQ0FBQztRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIGNvbXB1dGVkLCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvb3RQb2ludGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9yb290LXBvaW50ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IGZpbHRlciwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBWaWV3cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvcm91bmQnO1xuaW1wb3J0IHsgTWljcm90YXNrIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9taWNyb3Rhc2suZGVjb3JhdG9yJztcbmltcG9ydCB7IGdldE5vZGVzQm91bmRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvbm9kZXMnO1xuaW1wb3J0IHsgTm9kZUFjY2Vzc29yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBSZWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZWN0JztcbmltcG9ydCB7IFBvaW50ZXJFdmVudCB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcm9vdC1wb2ludGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc3BhY2UtcG9pbnQtY29udGV4dC5kaXJlY3RpdmUnO1xuXG50eXBlIFNpZGUgPSAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICd0b3AtcmlnaHQnIHwgJ3RvcC1sZWZ0JyB8ICdib3R0b20tcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW3Jlc2l6YWJsZV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzaXphYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVzaXphYmxlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUmVzaXphYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSBub2RlQWNjZXNzb3IgPSBpbmplY3QoTm9kZUFjY2Vzc29yU2VydmljZSlcbiAgcHJpdmF0ZSByb290UG9pbnRlciA9IGluamVjdChSb290UG9pbnRlckRpcmVjdGl2ZSlcbiAgcHJpdmF0ZSB2aWV3cG9ydFNlcnZpY2UgPSBpbmplY3QoVmlld3BvcnRTZXJ2aWNlKVxuICBwcml2YXRlIHNwYWNlUG9pbnRDb250ZXh0ID0gaW5qZWN0KFNwYWNlUG9pbnRDb250ZXh0RGlyZWN0aXZlKVxuICBwcml2YXRlIGhvc3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxFbGVtZW50Pj4oRWxlbWVudFJlZilcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHJlc2l6YWJsZSh2YWx1ZTogYm9vbGVhbiB8ICcnKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLm1vZGVsLnJlc2l6YWJsZS5zZXQodmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9kZWwucmVzaXphYmxlLnNldCh0cnVlKVxuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZXNpemVyQ29sb3IgPSAnIzJlNDE0YydcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2FwID0gMS41O1xuXG4gIEBWaWV3Q2hpbGQoJ3Jlc2l6ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIHJlc2l6ZXIhOiBUZW1wbGF0ZVJlZjx1bmtub3duPlxuXG4gIHByb3RlY3RlZCBnZXQgbW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZUFjY2Vzc29yLm1vZGVsKCkhXG4gIH1cblxuICBwcm90ZWN0ZWQgbGluZUdhcCA9IDNcbiAgcHJvdGVjdGVkIGhhbmRsZVNpemUgPSA2XG5cbiAgcHJpdmF0ZSByZXNpemVTaWRlOiBTaWRlIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIHpvb20gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0KCkuem9vbSA/PyAwKVxuXG4gIHByaXZhdGUgbWluV2lkdGggPSAwXG4gIHByaXZhdGUgbWluSGVpZ2h0ID0gMFxuXG4gIC8vIFRPRE86IGFsbG93IHJlc3ppZSBiZXNpZGUgdGhlIGZsb3dcbiAgcHJvdGVjdGVkIHJlc2l6ZU9uR2xvYmFsTW91c2VNb3ZlID0gdGhpcy5yb290UG9pbnRlci5wb2ludGVyTW92ZW1lbnQkXG4gICAgLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5yZXNpemVTaWRlICE9PSBudWxsKSxcbiAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50Lm1vdmVtZW50WCAhPT0gMCB8fCBldmVudC5tb3ZlbWVudFkgIT09IDApLFxuICAgICAgdGFwKChldmVudCkgPT4gdGhpcy5yZXNpemUoZXZlbnQpKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKVxuXG4gIHByb3RlY3RlZCBlbmRSZXNpemVPbkdsb2JhbE1vdXNlVXAgPSB0aGlzLnJvb3RQb2ludGVyLmRvY3VtZW50UG9pbnRlckVuZCRcbiAgICAucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmVuZFJlc2l6ZSgpKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsLnJlc2l6ZXJUZW1wbGF0ZS5zZXQodGhpcy5yZXNpemVyKVxuICB9XG5cbiAgQE1pY3JvdGFza1xuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMubWluV2lkdGggPSArZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCkubWluV2lkdGgucmVwbGFjZSgncHgnLCAnJykgfHwgMFxuICAgIHRoaXMubWluSGVpZ2h0ID0gK2dldENvbXB1dGVkU3R5bGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpLm1pbkhlaWdodC5yZXBsYWNlKCdweCcsICcnKSB8fCAwXG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRSZXNpemUoc2lkZTogU2lkZSwgZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB0aGlzLnJlc2l6ZVNpZGUgPSBzaWRlXG4gICAgdGhpcy5tb2RlbC5yZXNpemluZy5zZXQodHJ1ZSlcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNpemUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemVTaWRlKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNSZXNpemVDb25zdHJhaW5lZChldmVudCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9mZnNldCA9IGNhbGNPZmZzZXQoZXZlbnQubW92ZW1lbnRYLCBldmVudC5tb3ZlbWVudFksIHRoaXMuem9vbSgpKVxuICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gY29uc3RyYWluUmVjdChcbiAgICAgIGFwcGx5UmVzaXplKHRoaXMucmVzaXplU2lkZSwgdGhpcy5tb2RlbCwgb2Zmc2V0KSxcbiAgICAgIHRoaXMubW9kZWwsXG4gICAgICB0aGlzLnJlc2l6ZVNpZGUsXG4gICAgICB0aGlzLm1pbldpZHRoLFxuICAgICAgdGhpcy5taW5IZWlnaHRcbiAgICApXG5cbiAgICB0aGlzLm1vZGVsLnNldFBvaW50KHsgeCwgeSB9LCBmYWxzZSlcbiAgICB0aGlzLm1vZGVsLnNpemUuc2V0KHsgd2lkdGgsIGhlaWdodCB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIGVuZFJlc2l6ZSgpIHtcbiAgICB0aGlzLnJlc2l6ZVNpZGUgPSBudWxsXG4gICAgdGhpcy5tb2RlbC5yZXNpemluZy5zZXQoZmFsc2UpXG4gIH1cblxuICBwcml2YXRlIGlzUmVzaXplQ29uc3RyYWluZWQoeyB4LCB5LCBtb3ZlbWVudFgsIG1vdmVtZW50WSB9OiBQb2ludGVyRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBmbG93UG9pbnQgPSB0aGlzLnNwYWNlUG9pbnRDb250ZXh0LmRvY3VtZW50UG9pbnRUb0Zsb3dQb2ludCh7IHgsIHkgfSlcblxuICAgIGlmICh0aGlzLnJlc2l6ZVNpZGU/LmluY2x1ZGVzKCdyaWdodCcpKSB7XG4gICAgICBpZiAobW92ZW1lbnRYID4gMCAmJiBmbG93UG9pbnQueCA8ICh0aGlzLm1vZGVsLnBvaW50KCkueCArIHRoaXMubW9kZWwuc2l6ZSgpLndpZHRoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAobW92ZW1lbnRYIDwgMCAmJiBmbG93UG9pbnQueCA+IHRoaXMubW9kZWwucG9pbnQoKS54ICsgdGhpcy5tb2RlbC5zaXplKCkud2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemVTaWRlPy5pbmNsdWRlcygnbGVmdCcpKSB7XG4gICAgICBpZiAobW92ZW1lbnRYIDwgMCAmJiBmbG93UG9pbnQueCA+IHRoaXMubW9kZWwucG9pbnQoKS54KSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChtb3ZlbWVudFggPiAwICYmIGZsb3dQb2ludC54IDwgdGhpcy5tb2RlbC5wb2ludCgpLngpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemVTaWRlPy5pbmNsdWRlcygnYm90dG9tJykpIHtcbiAgICAgIGlmIChtb3ZlbWVudFkgPiAwICYmIGZsb3dQb2ludC55IDwgKHRoaXMubW9kZWwucG9pbnQoKS55ICsgdGhpcy5tb2RlbC5zaXplKCkuaGVpZ2h0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAobW92ZW1lbnRZIDwgMCAmJiBmbG93UG9pbnQueSA+IHRoaXMubW9kZWwucG9pbnQoKS55ICsgdGhpcy5tb2RlbC5zaXplKCkuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzaXplU2lkZT8uaW5jbHVkZXMoJ3RvcCcpKSB7XG4gICAgICBpZiAobW92ZW1lbnRZIDwgMCAmJiBmbG93UG9pbnQueSA+IHRoaXMubW9kZWwucG9pbnQoKS55KSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChtb3ZlbWVudFkgPiAwICYmIGZsb3dQb2ludC55IDwgdGhpcy5tb2RlbC5wb2ludCgpLnkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjT2Zmc2V0KG1vdmVtZW50WDogbnVtYmVyLCBtb3ZlbWVudFk6IG51bWJlciwgem9vbTogbnVtYmVyKSB7XG4gIHJldHVybiB7XG4gICAgb2Zmc2V0WDogcm91bmQobW92ZW1lbnRYIC8gem9vbSksXG4gICAgb2Zmc2V0WTogcm91bmQobW92ZW1lbnRZIC8gem9vbSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXBwbHlSZXNpemUoXG4gIHNpZGU6IFNpZGUsXG4gIG1vZGVsOiBOb2RlTW9kZWwsXG4gIG9mZnNldDogeyBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlciB9XG4pOiBSZWN0IHtcbiAgY29uc3QgeyBvZmZzZXRYLCBvZmZzZXRZIH0gPSBvZmZzZXRcbiAgY29uc3QgeyB4LCB5IH0gPSBtb2RlbC5wb2ludCgpXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gbW9kZWwuc2l6ZSgpXG5cbiAgLy8gSGFuZGxlIGVhY2ggY2FzZSBvZiByZXNpemluZyAodG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCBjb3JuZXJzKVxuICBzd2l0Y2ggKHNpZGUpIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiB7IHg6IHggKyBvZmZzZXRYLCB5LCB3aWR0aDogd2lkdGggLSBvZmZzZXRYLCBoZWlnaHQgfVxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiB7IHgsIHksIHdpZHRoOiB3aWR0aCArIG9mZnNldFgsIGhlaWdodCB9XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHJldHVybiB7IHgsIHk6IHkgKyBvZmZzZXRZLCB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgLSBvZmZzZXRZIH1cbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgcmV0dXJuIHsgeCwgeSwgd2lkdGgsIGhlaWdodDogaGVpZ2h0ICsgb2Zmc2V0WSB9XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgcmV0dXJuIHsgeDogeCArIG9mZnNldFgsIHk6IHkgKyBvZmZzZXRZLCB3aWR0aDogd2lkdGggLSBvZmZzZXRYLCBoZWlnaHQ6IGhlaWdodCAtIG9mZnNldFkgfVxuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICByZXR1cm4geyB4LCB5OiB5ICsgb2Zmc2V0WSwgd2lkdGg6IHdpZHRoICsgb2Zmc2V0WCwgaGVpZ2h0OiBoZWlnaHQgLSBvZmZzZXRZIH1cbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICByZXR1cm4geyB4OiB4ICsgb2Zmc2V0WCwgeSwgd2lkdGg6IHdpZHRoIC0gb2Zmc2V0WCwgaGVpZ2h0OiBoZWlnaHQgKyBvZmZzZXRZIH1cbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgcmV0dXJuIHsgeCwgeSwgd2lkdGg6IHdpZHRoICsgb2Zmc2V0WCwgaGVpZ2h0OiBoZWlnaHQgKyBvZmZzZXRZIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJhaW5SZWN0KFxuICByZWN0OiBSZWN0LFxuICBtb2RlbDogTm9kZU1vZGVsLFxuICBzaWRlOiBTaWRlLFxuICBtaW5XaWR0aDogbnVtYmVyLFxuICBtaW5IZWlnaHQ6IG51bWJlclxuKSB7XG4gIGxldCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHJlY3RcblxuICAvLyAxLiBQcmV2ZW50IG5lZ2F0aXZlIGRpbWVuc2lvbnNcbiAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgMClcbiAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCAwKVxuXG4gIC8vIDIuIEFwcGx5IG1pbmltdW0gc2l6ZSBjb25zdHJhaW50c1xuICB3aWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCB3aWR0aClcbiAgaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBoZWlnaHQpXG5cbiAgLy8gQXBwbHkgbGVmdC90b3AgY29uc3RyYWludHMgYmFzZWQgb24gbWluaW11bSBzaXplXG4gIHggPSBNYXRoLm1pbih4LCBtb2RlbC5wb2ludCgpLnggKyBtb2RlbC5zaXplKCkud2lkdGggLSBtaW5XaWR0aClcbiAgeSA9IE1hdGgubWluKHksIG1vZGVsLnBvaW50KCkueSArIG1vZGVsLnNpemUoKS5oZWlnaHQgLSBtaW5IZWlnaHQpXG5cbiAgY29uc3QgcGFyZW50ID0gbW9kZWwucGFyZW50KClcbiAgLy8gMy4gQXBwbHkgbWF4aW11bSBzaXplIGNvbnN0cmFpbnRzIGJhc2VkIG9uIHBhcmVudCBzaXplIChpZiBleGlzdHMpXG4gIGlmIChwYXJlbnQpIHtcbiAgICB4ID0gTWF0aC5tYXgoeCwgMCk7IC8vIExlZnQgYm91bmRhcnkgb2YgdGhlIHBhcmVudFxuICAgIHkgPSBNYXRoLm1heCh5LCAwKTsgLy8gVG9wIGJvdW5kYXJ5IG9mIHRoZSBwYXJlbnRcblxuICAgIGlmICh4ID09PSAwKSB7XG4gICAgICB3aWR0aCA9IG1vZGVsLnBvaW50KCkueCArIG1vZGVsLnNpemUoKS53aWR0aFxuICAgIH1cblxuICAgIGlmICh5ID09PSAwKSB7XG4gICAgICBoZWlnaHQgPSBtb2RlbC5wb2ludCgpLnkgKyBtb2RlbC5zaXplKCkuaGVpZ2h0XG4gICAgfVxuXG4gICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgcGFyZW50LnNpemUoKS53aWR0aCAtIG1vZGVsLnBvaW50KCkueClcbiAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHBhcmVudC5zaXplKCkuaGVpZ2h0IC0gbW9kZWwucG9pbnQoKS55KVxuICB9XG5cbiAgY29uc3QgYm91bmRzID0gZ2V0Tm9kZXNCb3VuZHMobW9kZWwuY2hpbGRyZW4oKSlcbiAgLy8gNC4gQXBwbHkgY2hpbGQgbm9kZSBjb25zdHJhaW50cyAoaWYgY2hpbGRyZW4gZXhpc3QpXG4gIGlmIChib3VuZHMpIHtcbiAgICBpZiAoc2lkZS5pbmNsdWRlcygnbGVmdCcpKSB7XG4gICAgICB4ID0gTWF0aC5taW4oeCwgKG1vZGVsLnBvaW50KCkueCArIG1vZGVsLnNpemUoKS53aWR0aCkgLSAoYm91bmRzLnggKyBib3VuZHMud2lkdGgpKVxuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYm91bmRzLnggKyBib3VuZHMud2lkdGgpXG4gICAgfVxuXG4gICAgaWYgKHNpZGUuaW5jbHVkZXMoJ3JpZ2h0JykpIHtcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoKVxuICAgIH1cblxuICAgIGlmIChzaWRlLmluY2x1ZGVzKCdib3R0b20nKSkge1xuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpXG4gICAgfVxuXG4gICAgaWYgKHNpZGUuaW5jbHVkZXMoJ3RvcCcpKSB7XG4gICAgICB5ID0gTWF0aC5taW4oeSwgKG1vZGVsLnBvaW50KCkueSArIG1vZGVsLnNpemUoKS5oZWlnaHQpIC0gKGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCkpXG4gICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodClcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfTtcbn1cbiIsIjxuZy10ZW1wbGF0ZSAjcmVzaXplcj5cbiAgPHN2ZzpnPlxuICAgIDwhLS0gdG9wIGxpbmUgLS0+XG4gICAgPHN2ZzpsaW5lXG4gICAgICBjbGFzcz1cInRvcFwiXG4gICAgICBbYXR0ci54MV09XCJsaW5lR2FwXCJcbiAgICAgIFthdHRyLnkxXT1cIi1nYXBcIlxuICAgICAgW2F0dHIueDJdPVwibW9kZWwuc2l6ZSgpLndpZHRoIC0gbGluZUdhcFwiXG4gICAgICBbYXR0ci55Ml09XCItZ2FwXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJyZXNpemVyQ29sb3JcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCd0b3AnLCAkZXZlbnQpXCJcbiAgICAvPlxuICAgIDwhLS0gTGVmdCBsaW5lIC0tPlxuICAgIDxzdmc6bGluZVxuICAgICAgY2xhc3M9XCJsZWZ0XCJcbiAgICAgIFthdHRyLngxXT1cIi1nYXBcIlxuICAgICAgW2F0dHIueTFdPVwibGluZUdhcFwiXG4gICAgICBbYXR0ci54Ml09XCItZ2FwXCJcbiAgICAgIFthdHRyLnkyXT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgLSBsaW5lR2FwXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJyZXNpemVyQ29sb3JcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdsZWZ0JywgJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8IS0tIEJvdHRvbSBsaW5lIC0tPlxuICAgIDxzdmc6bGluZVxuICAgICAgY2xhc3M9XCJib3R0b21cIlxuICAgICAgW2F0dHIueDFdPVwibGluZUdhcFwiXG4gICAgICBbYXR0ci55MV09XCJtb2RlbC5zaXplKCkuaGVpZ2h0ICsgZ2FwXCJcbiAgICAgIFthdHRyLngyXT1cIm1vZGVsLnNpemUoKS53aWR0aCAtIGxpbmVHYXBcIlxuICAgICAgW2F0dHIueTJdPVwibW9kZWwuc2l6ZSgpLmhlaWdodCArIGdhcFwiXG4gICAgICBbYXR0ci5zdHJva2VdPVwicmVzaXplckNvbG9yXCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgnYm90dG9tJywgJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8IS0tIFJpZ2h0IGxpbmUgLS0+XG4gICAgPHN2ZzpsaW5lXG4gICAgICBjbGFzcz1cInJpZ2h0XCJcbiAgICAgIFthdHRyLngxXT1cIm1vZGVsLnNpemUoKS53aWR0aCArIGdhcFwiXG4gICAgICBbYXR0ci55MV09XCJsaW5lR2FwXCJcbiAgICAgIFthdHRyLngyXT1cIm1vZGVsLnNpemUoKS53aWR0aCArIGdhcFwiXG4gICAgICBbYXR0ci55Ml09XCJtb2RlbC5zaXplKCkuaGVpZ2h0IC0gbGluZUdhcFwiXG4gICAgICBbYXR0ci5zdHJva2VdPVwicmVzaXplckNvbG9yXCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgncmlnaHQnLCAkZXZlbnQpXCJcbiAgICAvPlxuXG4gICAgPCEtLSBUb3AgTGVmdCAtLT5cbiAgICA8c3ZnOnJlY3RcbiAgICAgIGNsYXNzPVwidG9wLWxlZnRcIlxuICAgICAgW2F0dHIueF09XCItKGhhbmRsZVNpemUgLyAyKSAtIGdhcFwiXG4gICAgICBbYXR0ci55XT1cIi0oaGFuZGxlU2l6ZSAvIDIpIC0gZ2FwXCJcbiAgICAgIFthdHRyLndpZHRoXT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuZmlsbF09XCJyZXNpemVyQ29sb3JcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgndG9wLWxlZnQnLCAkZXZlbnQpXCJcbiAgICAvPlxuXG4gICAgPCEtLSBUb3AgcmlnaHQgLS0+XG4gICAgPHN2ZzpyZWN0XG4gICAgICBjbGFzcz1cInRvcC1yaWdodFwiXG4gICAgICBbYXR0ci54XT1cIm1vZGVsLnNpemUoKS53aWR0aCAtIChoYW5kbGVTaXplIC8gMikgKyBnYXBcIlxuICAgICAgW2F0dHIueV09XCItKGhhbmRsZVNpemUgLyAyKSAtIGdhcFwiXG4gICAgICBbYXR0ci53aWR0aF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmZpbGxdPVwicmVzaXplckNvbG9yXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ3RvcC1yaWdodCcsICRldmVudClcIlxuICAgIC8+XG5cbiAgICA8IS0tIEJvdHRvbSBsZWZ0IC0tPlxuICAgIDxzdmc6cmVjdFxuICAgICAgY2xhc3M9XCJib3R0b20tbGVmdFwiXG4gICAgICBbYXR0ci54XT1cIi0oaGFuZGxlU2l6ZSAvIDIpIC0gZ2FwXCJcbiAgICAgIFthdHRyLnldPVwibW9kZWwuc2l6ZSgpLmhlaWdodCAtIChoYW5kbGVTaXplIC8gMikgKyBnYXBcIlxuICAgICAgW2F0dHIud2lkdGhdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5maWxsXT1cInJlc2l6ZXJDb2xvclwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdib3R0b20tbGVmdCcsICRldmVudClcIlxuICAgIC8+XG5cbiAgICA8IS0tIEJvdHRvbSByaWdodCAtLT5cbiAgICA8c3ZnOnJlY3RcbiAgICAgIGNsYXNzPVwiYm90dG9tLXJpZ2h0XCJcbiAgICAgIFthdHRyLnhdPVwibW9kZWwuc2l6ZSgpLndpZHRoIC0gKGhhbmRsZVNpemUgLyAyKSArIGdhcFwiXG4gICAgICBbYXR0ci55XT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgLSAoaGFuZGxlU2l6ZSAvIDIpICsgZ2FwXCJcbiAgICAgIFthdHRyLndpZHRoXT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuZmlsbF09XCJyZXNpemVyQ29sb3JcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgnYm90dG9tLXJpZ2h0JywgJGV2ZW50KVwiXG4gICAgLz5cbiAgPC9zdmc6Zz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250ZW50IC8+XG4iXX0=
@@ -1,9 +1,13 @@
1
- import { Injectable } from '@angular/core';
1
+ import { Injectable, inject } from '@angular/core';
2
2
  import { select } from 'd3-selection';
3
3
  import { drag } from 'd3-drag';
4
4
  import { round } from '../utils/round';
5
+ import { FlowEntitiesService } from './flow-entities.service';
5
6
  import * as i0 from "@angular/core";
6
7
  export class DraggableService {
8
+ constructor() {
9
+ this.entitiesService = inject(FlowEntitiesService);
10
+ }
7
11
  /**
8
12
  * Enable draggable behavior for element.
9
13
  *
@@ -39,27 +43,24 @@ export class DraggableService {
39
43
  * @returns
40
44
  */
41
45
  getDragBehavior(model) {
42
- let deltaX;
43
- let deltaY;
46
+ let dragNodes = [];
47
+ let initialPositions = [];
44
48
  return drag()
45
49
  .on('start', (event) => {
46
- deltaX = model.point().x - event.x;
47
- deltaY = model.point().y - event.y;
50
+ dragNodes = this.getDragNodes(model);
51
+ initialPositions = dragNodes.map(node => ({
52
+ x: node.point().x - event.x,
53
+ y: node.point().y - event.y
54
+ }));
48
55
  })
49
56
  .on('drag', (event) => {
50
- let point = {
51
- x: round(event.x + deltaX),
52
- y: round(event.y + deltaY)
53
- };
54
- const parent = model.parent();
55
- // keep node in bounds of parent
56
- if (parent) {
57
- point.x = Math.min(parent.size().width - model.size().width, point.x);
58
- point.x = Math.max(0, point.x);
59
- point.y = Math.min(parent.size().height - model.size().height, point.y);
60
- point.y = Math.max(0, point.y);
61
- }
62
- model.setPoint(point, true);
57
+ dragNodes.forEach((model, index) => {
58
+ let point = {
59
+ x: round(event.x + initialPositions[index].x),
60
+ y: round(event.y + initialPositions[index].y)
61
+ };
62
+ moveNode(model, point);
63
+ });
63
64
  });
64
65
  }
65
66
  /**
@@ -72,10 +73,30 @@ export class DraggableService {
72
73
  event.sourceEvent.stopPropagation();
73
74
  });
74
75
  }
76
+ getDragNodes(model) {
77
+ return model.selected()
78
+ ? this.entitiesService
79
+ .nodes()
80
+ // selected draggable nodes (with current node)
81
+ .filter(node => node.selected() && node.draggable())
82
+ // we only can move current node if it's not selected
83
+ : [model];
84
+ }
75
85
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DraggableService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
76
86
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DraggableService }); }
77
87
  }
78
88
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DraggableService, decorators: [{
79
89
  type: Injectable
80
90
  }] });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvc2VydmljZXMvZHJhZ2dhYmxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQWUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLdkMsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxPQUFnQixFQUFFLEtBQWdCO1FBQzlDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVqQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxPQUFPLENBQUMsT0FBZ0I7UUFDN0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRWpDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sQ0FBQyxPQUFnQjtRQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQUMsS0FBZ0I7UUFDdEMsSUFBSSxNQUFjLENBQUE7UUFDbEIsSUFBSSxNQUFjLENBQUE7UUFFbEIsT0FBTyxJQUFJLEVBQUU7YUFDVixFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBZ0IsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDbEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUNwQyxDQUFDLENBQUM7YUFFRCxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBZ0IsRUFBRSxFQUFFO1lBQy9CLElBQUksS0FBSyxHQUFHO2dCQUNWLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQzFCLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7YUFDM0IsQ0FBQTtZQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQTtZQUM3QixnQ0FBZ0M7WUFDaEMsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ3JFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUU5QixLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDdkUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDL0I7WUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM3QixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUI7UUFDM0IsT0FBTyxJQUFJLEVBQUU7YUFDVixFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBZ0IsRUFBRSxFQUFFO1lBQzlCLEtBQUssQ0FBQyxXQUFxQixDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQ2hELENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzsrR0EvRVUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCB7IEQzRHJhZ0V2ZW50LCBkcmFnIH0gZnJvbSAnZDMtZHJhZyc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4uL3V0aWxzL3JvdW5kJztcblxudHlwZSBEcmFnRXZlbnQgPSBEM0RyYWdFdmVudDxFbGVtZW50LCB1bmtub3duLCB1bmtub3duPlxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHJhZ2dhYmxlU2VydmljZSB7XG4gIC8qKlxuICAgKiBFbmFibGUgZHJhZ2dhYmxlIGJlaGF2aW9yIGZvciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0YXJnZXQgZWxlbWVudCBmb3IgdG9nZ2xpbmcgZHJhZ2dhYmxlXG4gICAqIEBwYXJhbSBtb2RlbCBtb2RlbCB3aXRoIGRhdGEgZm9yIHRoaXMgZWxlbWVudFxuICAgKi9cbiAgcHVibGljIGVuYWJsZShlbGVtZW50OiBFbGVtZW50LCBtb2RlbDogTm9kZU1vZGVsKSB7XG4gICAgY29uc3QgZDNFbGVtZW50ID0gc2VsZWN0KGVsZW1lbnQpXG5cbiAgICBkM0VsZW1lbnQuY2FsbCh0aGlzLmdldERyYWdCZWhhdmlvcihtb2RlbCkpXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBkcmFnZ2FibGUgYmVoYXZpb3IgZm9yIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRhcmdldCBlbGVtZW50IGZvciB0b2dnbGluZyBkcmFnZ2FibGVcbiAgICogQHBhcmFtIG1vZGVsIG1vZGVsIHdpdGggZGF0YSBmb3IgdGhpcyBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgZGlzYWJsZShlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgY29uc3QgZDNFbGVtZW50ID0gc2VsZWN0KGVsZW1lbnQpXG5cbiAgICBkM0VsZW1lbnQuY2FsbCh0aGlzLmdldElnbm9yZURyYWdCZWhhdmlvcigpKVxuICB9XG5cbiAgLyoqXG4gICAqIFRPRE86IG5vdCBzaHVyZSBpZiB0aGlzIHdvcmssIG5lZWQgdG8gY2hlY2tcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICBzZWxlY3QoZWxlbWVudCkub24oJy5kcmFnJywgbnVsbClcbiAgfVxuXG4gIC8qKlxuICAgKiBOb2RlIGRyYWcgYmVoYXZpb3IuIFVwZGF0ZWQgbm9kZSdzIGNvb3JkaW5hdGUgYWNjb3JkaW5nIHRvIGRyYWdnaW5nXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXREcmFnQmVoYXZpb3IobW9kZWw6IE5vZGVNb2RlbCkge1xuICAgIGxldCBkZWx0YVg6IG51bWJlclxuICAgIGxldCBkZWx0YVk6IG51bWJlclxuXG4gICAgcmV0dXJuIGRyYWcoKVxuICAgICAgLm9uKCdzdGFydCcsIChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGRlbHRhWCA9IG1vZGVsLnBvaW50KCkueCAtIGV2ZW50LnhcbiAgICAgICAgZGVsdGFZID0gbW9kZWwucG9pbnQoKS55IC0gZXZlbnQueVxuICAgICAgfSlcblxuICAgICAgLm9uKCdkcmFnJywgKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgbGV0IHBvaW50ID0ge1xuICAgICAgICAgIHg6IHJvdW5kKGV2ZW50LnggKyBkZWx0YVgpLFxuICAgICAgICAgIHk6IHJvdW5kKGV2ZW50LnkgKyBkZWx0YVkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBtb2RlbC5wYXJlbnQoKVxuICAgICAgICAvLyBrZWVwIG5vZGUgaW4gYm91bmRzIG9mIHBhcmVudFxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgcG9pbnQueCA9IE1hdGgubWluKHBhcmVudC5zaXplKCkud2lkdGggLSBtb2RlbC5zaXplKCkud2lkdGgsIHBvaW50LngpXG4gICAgICAgICAgcG9pbnQueCA9IE1hdGgubWF4KDAsIHBvaW50LngpXG5cbiAgICAgICAgICBwb2ludC55ID0gTWF0aC5taW4ocGFyZW50LnNpemUoKS5oZWlnaHQgLSBtb2RlbC5zaXplKCkuaGVpZ2h0LCBwb2ludC55KVxuICAgICAgICAgIHBvaW50LnkgPSBNYXRoLm1heCgwLCBwb2ludC55KVxuICAgICAgICB9XG5cbiAgICAgICAgbW9kZWwuc2V0UG9pbnQocG9pbnQsIHRydWUpXG4gICAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgaWdub3JpbmcgZHJhZyBiZWhhdmlvci4gSXQncyByZXNwb25zaWJsZSBmb3Igbm90IG1vdmluZyB0aGUgbWFwIHdoZW4gdXNlciB0cmllcyB0byBkcmFnIG5vZGVcbiAgICogd2l0aCBkaXNhYmxlZCBkcmFnIGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIGdldElnbm9yZURyYWdCZWhhdmlvcigpIHtcbiAgICByZXR1cm4gZHJhZygpXG4gICAgICAub24oJ2RyYWcnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICAoZXZlbnQuc291cmNlRXZlbnQgYXMgRXZlbnQpLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICB9KVxuICB9XG59XG4iXX0=
91
+ function moveNode(model, point) {
92
+ const parent = model.parent();
93
+ // keep node in bounds of parent
94
+ if (parent) {
95
+ point.x = Math.min(parent.size().width - model.size().width, point.x);
96
+ point.x = Math.max(0, point.x);
97
+ point.y = Math.min(parent.size().height - model.size().height, point.y);
98
+ point.y = Math.max(0, point.y);
99
+ }
100
+ model.setPoint(point, true);
101
+ }
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvc2VydmljZXMvZHJhZ2dhYmxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQWUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFNOUQsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUVVLG9CQUFlLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0F1RnZEO0lBckZDOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLE9BQWdCLEVBQUUsS0FBZ0I7UUFDOUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRWpDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FBQyxPQUFnQjtRQUM3QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFakMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFBO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksT0FBTyxDQUFDLE9BQWdCO1FBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFB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LENBQUMsQ0FBQyxDQUFBO1FBQ3ZFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQy9CO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgRDNEcmFnRXZlbnQsIGRyYWcgfSBmcm9tICdkMy1kcmFnJztcbmltcG9ydCB7IE5vZGVNb2RlbCB9IGZyb20gJy4uL21vZGVscy9ub2RlLm1vZGVsJztcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSAnLi4vdXRpbHMvcm91bmQnO1xuaW1wb3J0IHsgRmxvd0VudGl0aWVzU2VydmljZSB9IGZyb20gJy4vZmxvdy1lbnRpdGllcy5zZXJ2aWNlJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wb2ludC5pbnRlcmZhY2UnO1xuXG50eXBlIERyYWdFdmVudCA9IEQzRHJhZ0V2ZW50PEVsZW1lbnQsIHVua25vd24sIHVua25vd24+XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEcmFnZ2FibGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBlbnRpdGllc1NlcnZpY2UgPSBpbmplY3QoRmxvd0VudGl0aWVzU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBkcmFnZ2FibGUgYmVoYXZpb3IgZm9yIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRhcmdldCBlbGVtZW50IGZvciB0b2dnbGluZyBkcmFnZ2FibGVcbiAgICogQHBhcmFtIG1vZGVsIG1vZGVsIHdpdGggZGF0YSBmb3IgdGhpcyBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgZW5hYmxlKGVsZW1lbnQ6IEVsZW1lbnQsIG1vZGVsOiBOb2RlTW9kZWwpIHtcbiAgICBjb25zdCBkM0VsZW1lbnQgPSBzZWxlY3QoZWxlbWVudClcblxuICAgIGQzRWxlbWVudC5jYWxsKHRoaXMuZ2V0RHJhZ0JlaGF2aW9yKG1vZGVsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGRyYWdnYWJsZSBiZWhhdmlvciBmb3IgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGFyZ2V0IGVsZW1lbnQgZm9yIHRvZ2dsaW5nIGRyYWdnYWJsZVxuICAgKiBAcGFyYW0gbW9kZWwgbW9kZWwgd2l0aCBkYXRhIGZvciB0aGlzIGVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBkaXNhYmxlKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBkM0VsZW1lbnQgPSBzZWxlY3QoZWxlbWVudClcblxuICAgIGQzRWxlbWVudC5jYWxsKHRoaXMuZ2V0SWdub3JlRHJhZ0JlaGF2aW9yKCkpXG4gIH1cblxuICAvKipcbiAgICogVE9ETzogbm90IHNodXJlIGlmIHRoaXMgd29yaywgbmVlZCB0byBjaGVja1xuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudFxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koZWxlbWVudDogRWxlbWVudCkge1xuICAgIHNlbGVjdChlbGVtZW50KS5vbignLmRyYWcnLCBudWxsKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vZGUgZHJhZyBiZWhhdmlvci4gVXBkYXRlZCBub2RlJ3MgY29vcmRpbmF0ZSBhY2NvcmRpbmcgdG8gZHJhZ2dpbmdcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGdldERyYWdCZWhhdmlvcihtb2RlbDogTm9kZU1vZGVsKSB7XG4gICAgbGV0IGRyYWdOb2RlczogTm9kZU1vZGVsW10gPSBbXVxuICAgIGxldCBpbml0aWFsUG9zaXRpb25zOiBQb2ludFtdID0gW11cblxuICAgIHJldHVybiBkcmFnKClcbiAgICAgIC5vbignc3RhcnQnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICBkcmFnTm9kZXMgPSB0aGlzLmdldERyYWdOb2Rlcyhtb2RlbClcblxuICAgICAgICBpbml0aWFsUG9zaXRpb25zID0gZHJhZ05vZGVzLm1hcChub2RlID0+ICh7XG4gICAgICAgICAgeDogbm9kZS5wb2ludCgpLnggLSBldmVudC54LFxuICAgICAgICAgIHk6IG5vZGUucG9pbnQoKS55IC0gZXZlbnQueVxuICAgICAgICB9KSlcbiAgICAgIH0pXG5cbiAgICAgIC5vbignZHJhZycsIChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGRyYWdOb2Rlcy5mb3JFYWNoKChtb2RlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBsZXQgcG9pbnQgPSB7XG4gICAgICAgICAgICB4OiByb3VuZChldmVudC54ICsgaW5pdGlhbFBvc2l0aW9uc1tpbmRleF0ueCksXG4gICAgICAgICAgICB5OiByb3VuZChldmVudC55ICsgaW5pdGlhbFBvc2l0aW9uc1tpbmRleF0ueSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtb3ZlTm9kZShtb2RlbCwgcG9pbnQpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgaWdub3JpbmcgZHJhZyBiZWhhdmlvci4gSXQncyByZXNwb25zaWJsZSBmb3Igbm90IG1vdmluZyB0aGUgbWFwIHdoZW4gdXNlciB0cmllcyB0byBkcmFnIG5vZGVcbiAgICogd2l0aCBkaXNhYmxlZCBkcmFnIGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIGdldElnbm9yZURyYWdCZWhhdmlvcigpIHtcbiAgICByZXR1cm4gZHJhZygpXG4gICAgICAub24oJ2RyYWcnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICAoZXZlbnQuc291cmNlRXZlbnQgYXMgRXZlbnQpLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREcmFnTm9kZXMobW9kZWw6IE5vZGVNb2RlbCkge1xuICAgIHJldHVybiBtb2RlbC5zZWxlY3RlZCgpXG4gICAgICA/IHRoaXMuZW50aXRpZXNTZXJ2aWNlXG4gICAgICAgIC5ub2RlcygpXG4gICAgICAgIC8vIHNlbGVjdGVkIGRyYWdnYWJsZSBub2RlcyAod2l0aCBjdXJyZW50IG5vZGUpXG4gICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnNlbGVjdGVkKCkgJiYgbm9kZS5kcmFnZ2FibGUoKSlcbiAgICAgIC8vIHdlIG9ubHkgY2FuIG1vdmUgY3VycmVudCBub2RlIGlmIGl0J3Mgbm90IHNlbGVjdGVkXG4gICAgICA6IFttb2RlbF1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlTm9kZShtb2RlbDogTm9kZU1vZGVsLCBwb2ludDogUG9pbnQpIHtcbiAgY29uc3QgcGFyZW50ID0gbW9kZWwucGFyZW50KClcbiAgLy8ga2VlcCBub2RlIGluIGJvdW5kcyBvZiBwYXJlbnRcbiAgaWYgKHBhcmVudCkge1xuICAgIHBvaW50LnggPSBNYXRoLm1pbihwYXJlbnQuc2l6ZSgpLndpZHRoIC0gbW9kZWwuc2l6ZSgpLndpZHRoLCBwb2ludC54KVxuICAgIHBvaW50LnggPSBNYXRoLm1heCgwLCBwb2ludC54KVxuXG4gICAgcG9pbnQueSA9IE1hdGgubWluKHBhcmVudC5zaXplKCkuaGVpZ2h0IC0gbW9kZWwuc2l6ZSgpLmhlaWdodCwgcG9pbnQueSlcbiAgICBwb2ludC55ID0gTWF0aC5tYXgoMCwgcG9pbnQueSlcbiAgfVxuXG4gIG1vZGVsLnNldFBvaW50KHBvaW50LCB0cnVlKVxufVxuIl19